aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/ISSUE_TEMPLATE/bug_report.yml2
-rw-r--r--builddefs/build_full_test.mk2
-rw-r--r--builddefs/build_keyboard.mk41
-rw-r--r--builddefs/common_features.mk24
-rw-r--r--builddefs/converters.mk7
-rw-r--r--builddefs/generic_features.mk2
-rw-r--r--data/constants/keycodes/extras/keycodes_belgian_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_bepo_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_brazilian_abnt2_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_canadian_multilingual_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_colemak_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_croatian_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_czech_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_danish_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_dvorak_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_dvorak_fr_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_dvorak_programmer_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_estonian_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_finnish_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_french_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_french_afnor_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_french_mac_iso_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_german_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_german_mac_iso_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_greek_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_hebrew_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_hungarian_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_icelandic_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_irish_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_italian_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_italian_mac_ansi_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_italian_mac_iso_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_japanese_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_korean_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_latvian_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_lithuanian_azerty_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_lithuanian_qwerty_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_neo2_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_nordic_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_norman_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_norwegian_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_plover_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_plover_dvorak_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_polish_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_portuguese_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_portuguese_mac_iso_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_romanian_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_russian_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_serbian_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_serbian_latin_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_slovak_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_slovenian_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_spanish_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_spanish_dvorak_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_spanish_latin_america_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_swedish_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_swedish_mac_ansi_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_swedish_mac_iso_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_swedish_pro_mac_ansi_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_swedish_pro_mac_iso_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_swiss_de_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_swiss_fr_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_turkish_f_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_turkish_q_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_uk_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_ukrainian_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_us_extended_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_us_international_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_us_international_linux_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_workman_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/extras/keycodes_workman_zxcvm_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/keycodes_0.0.1.hjson2
-rw-r--r--data/constants/keycodes/keycodes_0.0.1_joystick.hjson2
-rw-r--r--data/constants/keycodes/keycodes_0.0.1_magic.hjson2
-rw-r--r--data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson2
-rw-r--r--data/constants/keycodes/keycodes_0.0.1_sequencer.hjson2
-rw-r--r--data/constants/keycodes/keycodes_0.0.2_basic.hjson2
-rw-r--r--data/constants/keycodes/keycodes_0.0.2_magic.hjson2
-rw-r--r--data/constants/keycodes/keycodes_0.0.2_sequencer.hjson2
-rw-r--r--data/mappings/info_rules.hjson4
-rw-r--r--data/mappings/keyboard_aliases.hjson9
-rw-r--r--data/schemas/community_module.jsonschema1
-rw-r--r--data/schemas/keyboard.jsonschema2
-rw-r--r--docs/_sidebar.json1
-rw-r--r--docs/cli.md4
-rw-r--r--docs/cli_development.md6
-rw-r--r--docs/coding_conventions_python.md4
-rw-r--r--docs/configurator_diagram.drawio2
-rw-r--r--docs/configurator_diagram.svg2
-rw-r--r--docs/drivers/battery.md51
-rw-r--r--docs/faq_debug.md11
-rw-r--r--docs/features/community_modules.md5
-rw-r--r--docs/public/badge-community-dark.svg2
-rw-r--r--docs/public/badge-community-light.svg2
-rw-r--r--docs/unit_testing.md28
-rw-r--r--drivers/battery/battery.c31
-rw-r--r--drivers/battery/battery.h34
-rw-r--r--drivers/battery/battery_adc.c55
-rw-r--r--drivers/battery/battery_driver.h29
-rw-r--r--drivers/eeprom/eeprom_transient.h2
-rw-r--r--drivers/painter/gc9xxx/qp_gc9a01_opcodes.h2
-rw-r--r--drivers/painter/ili9xxx/qp_ili9486.c16
-rw-r--r--drivers/painter/ld7032/qp_ld7032.h2
-rw-r--r--drivers/painter/ld7032/qp_ld7032_opcodes.h2
-rw-r--r--drivers/usbpd.h2
-rw-r--r--keyboards/akb/vero/board.h (renamed from keyboards/nix_studio/lilith/config.h)7
-rw-r--r--keyboards/akb/vero/config.h23
-rw-r--r--keyboards/akko/5087/5087.c2
-rw-r--r--keyboards/bastardkb/charybdis/3x5/v1/elitec/keyboard.json4
-rw-r--r--keyboards/bastardkb/charybdis/3x5/v2/elitec/keyboard.json4
-rw-r--r--keyboards/bastardkb/charybdis/3x5/v2/splinky_2/keyboard.json4
-rw-r--r--keyboards/bastardkb/charybdis/3x5/v2/splinky_3/keyboard.json4
-rw-r--r--keyboards/bastardkb/charybdis/3x5/v2/stemcell/keyboard.json4
-rw-r--r--keyboards/bastardkb/charybdis/3x6/v1/elitec/keyboard.json4
-rw-r--r--keyboards/bastardkb/charybdis/3x6/v2/elitec/keyboard.json4
-rw-r--r--keyboards/bastardkb/charybdis/3x6/v2/splinky_2/keyboard.json4
-rw-r--r--keyboards/bastardkb/charybdis/3x6/v2/splinky_3/keyboard.json4
-rw-r--r--keyboards/bastardkb/charybdis/3x6/v2/stemcell/keyboard.json4
-rw-r--r--keyboards/bastardkb/charybdis/4x6/v1/elitec/keyboard.json4
-rw-r--r--keyboards/bastardkb/charybdis/4x6/v2/elitec/keyboard.json4
-rw-r--r--keyboards/bastardkb/charybdis/4x6/v2/splinky_2/keyboard.json4
-rw-r--r--keyboards/bastardkb/charybdis/4x6/v2/splinky_3/keyboard.json4
-rw-r--r--keyboards/bastardkb/charybdis/4x6/v2/stemcell/keyboard.json4
-rw-r--r--keyboards/bastardkb/dilemma/3x5_2/assembled/keyboard.json4
-rw-r--r--keyboards/bastardkb/dilemma/3x5_2/splinky/keyboard.json4
-rw-r--r--keyboards/bastardkb/dilemma/3x5_3/keyboard.json4
-rw-r--r--keyboards/bastardkb/dilemma/4x6_4/keyboard.json4
-rw-r--r--keyboards/bastardkb/scylla/v1/elitec/keyboard.json4
-rw-r--r--keyboards/bastardkb/scylla/v2/elitec/keyboard.json4
-rw-r--r--keyboards/bastardkb/scylla/v2/splinky_2/keyboard.json4
-rw-r--r--keyboards/bastardkb/scylla/v2/splinky_3/keyboard.json4
-rw-r--r--keyboards/bastardkb/scylla/v2/stemcell/keyboard.json4
-rw-r--r--keyboards/bastardkb/skeletyl/v1/elitec/keyboard.json4
-rw-r--r--keyboards/bastardkb/skeletyl/v2/elitec/keyboard.json4
-rw-r--r--keyboards/bastardkb/skeletyl/v2/splinky_2/keyboard.json4
-rw-r--r--keyboards/bastardkb/skeletyl/v2/splinky_3/keyboard.json4
-rw-r--r--keyboards/bastardkb/skeletyl/v2/stemcell/keyboard.json4
-rw-r--r--keyboards/bastardkb/tbkmini/v1/elitec/keyboard.json4
-rw-r--r--keyboards/bastardkb/tbkmini/v2/elitec/keyboard.json4
-rw-r--r--keyboards/bastardkb/tbkmini/v2/splinky_2/keyboard.json4
-rw-r--r--keyboards/bastardkb/tbkmini/v2/splinky_3/keyboard.json4
-rw-r--r--keyboards/bastardkb/tbkmini/v2/stemcell/keyboard.json4
-rw-r--r--keyboards/cannonkeys/lib/satisfaction75/satisfaction_core.c105
-rw-r--r--keyboards/cannonkeys/lib/satisfaction75/satisfaction_core.h11
-rw-r--r--keyboards/cannonkeys/lib/satisfaction75/satisfaction_encoder.c17
-rw-r--r--keyboards/cannonkeys/lib/satisfaction75/satisfaction_oled.c2
-rw-r--r--keyboards/cannonkeys/satisfaction75/config.h5
-rw-r--r--keyboards/cannonkeys/satisfaction75_hs/config.h5
-rw-r--r--keyboards/cipulot/common/ec_board.c4
-rw-r--r--keyboards/cipulot/common/eeprom_tools.h26
-rw-r--r--keyboards/cipulot/common/via_ec.c7
-rw-r--r--keyboards/cipulot/ec_980c/ec_980c.c4
-rw-r--r--keyboards/cipulot/ec_typek/ec_typek.c4
-rw-r--r--keyboards/contra/keymaps/default/keymap.c4
-rw-r--r--keyboards/deemen17/de60/r1/config.h (renamed from keyboards/deemen17/de60fs/config.h)0
-rw-r--r--keyboards/deemen17/de60/r1/keyboard.json (renamed from keyboards/deemen17/de60fs/keyboard.json)4
-rw-r--r--keyboards/deemen17/de60/r1/keymaps/default/keymap.c (renamed from keyboards/deemen17/de60fs/keymaps/default/keymap.c)0
-rw-r--r--keyboards/deemen17/de60/r1/readme.md (renamed from keyboards/deemen17/de60fs/readme.md)8
-rw-r--r--keyboards/deemen17/de60/readme.md17
-rw-r--r--keyboards/dm9records/plaid/keymaps/default/keymap.c4
-rw-r--r--keyboards/handwired/dactyl_cc/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_kinesis/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_lightcycle/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_manuform/4x5/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_manuform/4x6/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_manuform/5x6/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_manuform/5x7/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_manuform/6x6/promicro/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_manuform/6x7/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_maximus/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_minidox/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_promicro/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_rah/keyboard.json4
-rw-r--r--keyboards/handwired/dactyl_tracer/keyboard.json4
-rw-r--r--keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json329
-rw-r--r--keyboards/handwired/jankrp2040dactyl/keyboard.json4
-rw-r--r--keyboards/handwired/onekey/keymaps/battery/config.h6
-rw-r--r--keyboards/handwired/onekey/keymaps/battery/keymap.c28
-rw-r--r--keyboards/handwired/onekey/keymaps/battery/keymap.json7
-rw-r--r--keyboards/handwired/onekey/keymaps/battery/rules.mk1
-rw-r--r--keyboards/handwired/onekey/keymaps/via_ci/config.h4
-rw-r--r--keyboards/handwired/onekey/keymaps/via_ci/keymap.c30
-rw-r--r--keyboards/handwired/onekey/keymaps/via_ci/keymap.json7
-rw-r--r--keyboards/handwired/onekey/teensy_32/rules.mk1
-rw-r--r--keyboards/handwired/onekey/teensy_lc/rules.mk2
-rw-r--r--keyboards/handwired/ortho_brass/keymaps/default/keymap.c4
-rw-r--r--keyboards/handwired/skakunm_dactyl/keyboard.json4
-rw-r--r--keyboards/handwired/splittest/promicro/keyboard.json4
-rw-r--r--keyboards/handwired/splittest/teensy_2/keyboard.json4
-rw-r--r--keyboards/handwired/symmetric70_proto/promicro/info.json4
-rw-r--r--keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json4
-rw-r--r--keyboards/handwired/tractyl_manuform/5x6_right/arduinomicro/keyboard.json4
-rw-r--r--keyboards/handwired/tractyl_manuform/5x6_right/elite_c/keyboard.json4
-rw-r--r--keyboards/handwired/tractyl_manuform/5x6_right/teensy2pp/keyboard.json4
-rw-r--r--keyboards/helix/pico/info.json4
-rw-r--r--keyboards/helix/rev2/info.json4
-rw-r--r--keyboards/helix/rev2/rev2.c2
-rw-r--r--keyboards/helix/rev3_4rows/keyboard.json4
-rw-r--r--keyboards/helix/rev3_4rows/rev3_4rows.c2
-rw-r--r--keyboards/helix/rev3_5rows/keyboard.json4
-rw-r--r--keyboards/helix/rev3_5rows/rev3_5rows.c2
-rw-r--r--keyboards/horrortroll/nyx/rev1/lib/startup_swirl_anim.h3
-rw-r--r--keyboards/ibm/model_m_4th_gen/overnumpad_1xb/board.h8
-rw-r--r--keyboards/ibm/model_m_4th_gen/overnumpad_1xb/config.h2
-rw-r--r--keyboards/icebreaker/hotswap/keyboard.json240
-rw-r--r--keyboards/icebreaker/hotswap/keymaps/default/keymap.c43
-rw-r--r--keyboards/icebreaker/hotswap/keymaps/default/rules.mk1
-rw-r--r--keyboards/icebreaker/readme.md26
-rw-r--r--keyboards/inland/kb83/kb83.c2
-rw-r--r--keyboards/jian/keymaps/advanced/keymap.c4
-rw-r--r--keyboards/keychron/c1_pro_v2/board.h8
-rw-r--r--keyboards/keychron/c1_pro_v2/mcuconf.h3
-rw-r--r--keyboards/keychron/c2_pro_v2/board.h8
-rw-r--r--keyboards/keychron/c2_pro_v2/mcuconf.h3
-rw-r--r--keyboards/keychron/c3_pro/board.h8
-rw-r--r--keyboards/keychron/c3_pro/mcuconf.h3
-rw-r--r--keyboards/keycult/keycult1800/keyboard.json3
-rw-r--r--keyboards/keycult/keycult1800/keymaps/default/keymap.c4
-rw-r--r--keyboards/keyten/kt60hs_t/info.json14
-rw-r--r--keyboards/keyten/kt60hs_t/readme.md27
-rw-r--r--keyboards/keyten/kt60hs_t/v1/keyboard.json (renamed from keyboards/keyten/kt60hs_t/keyboard.json)82
-rw-r--r--keyboards/keyten/kt60hs_t/v1/readme.md29
-rw-r--r--keyboards/keyten/kt60hs_t/v2/keyboard.json282
-rw-r--r--keyboards/keyten/kt60hs_t/v2/readme.md29
-rw-r--r--keyboards/mechlovin/olly/octagon/keyboard.json751
-rw-r--r--keyboards/mechlovin/olly/octagon/keymaps/default/keymap.c6
-rw-r--r--keyboards/mechlovin/olly/octagon/matrix_diagram.md26
-rw-r--r--keyboards/monsgeek/m1/m1.c2
-rw-r--r--keyboards/monsgeek/m3/m3.c2
-rw-r--r--keyboards/neson_design/810e/board.h8
-rw-r--r--keyboards/neson_design/810e/config.h21
-rw-r--r--keyboards/nix_studio/lilith/board.h8
-rw-r--r--keyboards/omnikeyish/dynamic_macro.c1
-rw-r--r--keyboards/planck/keymaps/default/keymap.c4
-rw-r--r--keyboards/planck/rev7/keymaps/default/keymap.c4
-rw-r--r--keyboards/plywrks/ply8x/hotswap/config.h (renamed from keyboards/plywrks/ply8x/config.h)0
-rw-r--r--keyboards/plywrks/ply8x/hotswap/halconf.h (renamed from keyboards/plywrks/ply8x/halconf.h)0
-rw-r--r--keyboards/plywrks/ply8x/hotswap/keyboard.json560
-rw-r--r--keyboards/plywrks/ply8x/hotswap/keymaps/default/keymap.c32
-rw-r--r--keyboards/plywrks/ply8x/hotswap/mcuconf.h (renamed from keyboards/plywrks/ply8x/mcuconf.h)0
-rw-r--r--keyboards/plywrks/ply8x/solder/config.h10
-rw-r--r--keyboards/plywrks/ply8x/solder/halconf.h8
-rw-r--r--keyboards/plywrks/ply8x/solder/keyboard.json (renamed from keyboards/plywrks/ply8x/keyboard.json)494
-rw-r--r--keyboards/plywrks/ply8x/solder/keymaps/default/keymap.c (renamed from keyboards/plywrks/ply8x/keymaps/default/keymap.c)0
-rw-r--r--keyboards/plywrks/ply8x/solder/mcuconf.h9
-rw-r--r--keyboards/rocketboard_16/keycode_lookup.c1
-rw-r--r--keyboards/splitography/keymaps/default/keymap.c4
-rw-r--r--keyboards/splitography/keymaps/default_with_ctl_shft_alt_switched/keymap.c4
-rw-r--r--keyboards/splitography/keymaps/dvorak/keymap.c4
-rw-r--r--keyboards/system76/launch_1/launch_1.c3
-rw-r--r--keyboards/teleport/native/board.h8
-rw-r--r--keyboards/teleport/native/config.h3
-rw-r--r--keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/board.h8
-rw-r--r--keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/config.h2
-rw-r--r--keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/board.h8
-rw-r--r--keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/config.h2
-rw-r--r--keyboards/unicomp/pc122/overnumpad_1xb/board.h8
-rw-r--r--keyboards/unicomp/pc122/overnumpad_1xb/config.h2
-rw-r--r--keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/board.h8
-rw-r--r--keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/config.h2
-rw-r--r--keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/board.h8
-rw-r--r--keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/config.h2
-rw-r--r--keyboards/vitamins_included/rev2/rev2.c2
-rw-r--r--keyboards/werk_technica/one/board.h8
-rw-r--r--keyboards/werk_technica/one/config.h7
-rw-r--r--keyboards/wilba_tech/wt_main.c59
-rw-r--r--keyboards/wilba_tech/wt_mono_backlight.c2
-rw-r--r--keyboards/wilba_tech/wt_rgb_backlight.c2
-rw-r--r--keyboards/xelus/la_plus/rgb_matrix_kb.inc2
-rw-r--r--keyboards/xelus/rs108/board.h8
-rw-r--r--keyboards/xelus/rs108/config.h3
-rw-r--r--keyboards/xelus/rs60/rev2_0/board.h8
-rw-r--r--keyboards/xelus/rs60/rev2_0/config.h3
-rw-r--r--keyboards/xelus/valor_frl_tkl/rev2_0/board.h8
-rw-r--r--keyboards/xelus/valor_frl_tkl/rev2_0/config.h19
-rw-r--r--keyboards/xelus/valor_frl_tkl/rev2_1/board.h8
-rw-r--r--keyboards/zsa/moonlander/matrix.c2
-rw-r--r--layouts/community/75_ansi/layout.json2
-rw-r--r--layouts/community/ortho_1x4/layout.json2
-rw-r--r--layouts/community/ortho_4x12/layout.json2
-rw-r--r--layouts/default/60_ansi_arrow/layout.json2
-rw-r--r--layouts/default/ortho_5x5/readme.md2
-rw-r--r--lib/python/qmk/cli/__init__.py3
-rw-r--r--lib/python/qmk/cli/generate/keycodes_tests.py39
-rwxr-xr-xlib/python/qmk/cli/generate/rules_mk.py2
-rwxr-xr-xlib/python/qmk/json_encoders.py8
-rw-r--r--modules/qmk/hello_world/qmk_module.json1
-rw-r--r--modules/qmk/super_alt_tab/qmk_module.json1
-rw-r--r--platforms/avr/drivers/i2c_master.c2
-rw-r--r--platforms/chibios/boards/BONSAI_C4/configs/board.h2
-rw-r--r--platforms/chibios/boards/BONSAI_C4/configs/config.h2
-rw-r--r--platforms/chibios/boards/BONSAI_C4/configs/halconf.h2
-rw-r--r--platforms/chibios/boards/GENERIC_STM32_F405XG/board/board.mk2
-rw-r--r--platforms/chibios/boards/GENERIC_STM32_F407XE/board/board.mk2
-rw-r--r--platforms/chibios/boards/GENERIC_STM32_F407XE/configs/board.h2
-rw-r--r--platforms/chibios/boards/GENERIC_STM32_G474XE/configs/config.h2
-rw-r--r--platforms/chibios/boards/GENERIC_WB32_F3G71XX/configs/chconf.h2
-rw-r--r--platforms/chibios/boards/GENERIC_WB32_FQ95XX/configs/chconf.h2
-rw-r--r--platforms/chibios/boards/SIPEED_LONGAN_NANO/configs/chconf.h2
-rw-r--r--platforms/chibios/bootloaders/stm32duino.c2
-rw-r--r--platforms/chibios/converters/promicro_to_bonsai_c4/_pin_defs.h2
-rw-r--r--platforms/chibios/converters/promicro_to_bonsai_c4/post_converter.mk2
-rw-r--r--platforms/chibios/drivers/i2c_master.c2
-rw-r--r--platforms/chibios/drivers/usbpd_stm32g4.c2
-rw-r--r--platforms/chibios/platform.c2
-rw-r--r--platforms/test/platform.c2
-rw-r--r--quantum/action_util.c2
-rw-r--r--quantum/audio/audio.c12
-rw-r--r--quantum/audio/audio.h2
-rw-r--r--quantum/backlight/backlight.c31
-rw-r--r--quantum/backlight/backlight.h8
-rw-r--r--quantum/command.c6
-rw-r--r--quantum/dynamic_keymap.c203
-rw-r--r--quantum/dynamic_keymap.h9
-rw-r--r--quantum/eeconfig.c444
-rw-r--r--quantum/eeconfig.h156
-rw-r--r--quantum/haptic.c26
-rw-r--r--quantum/haptic.h2
-rw-r--r--quantum/keyboard.c16
-rw-r--r--quantum/keycode_config.h2
-rw-r--r--quantum/keycode_string.c564
-rw-r--r--quantum/keycode_string.h134
-rw-r--r--quantum/led_matrix/led_matrix.c4
-rw-r--r--quantum/led_matrix/led_matrix.h2
-rw-r--r--quantum/led_matrix/led_matrix_types.h2
-rw-r--r--quantum/logging/debug.h2
-rw-r--r--quantum/nvm/eeprom/nvm_dynamic_keymap.c193
-rw-r--r--quantum/nvm/eeprom/nvm_eeconfig.c292
-rw-r--r--quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h59
-rw-r--r--quantum/nvm/eeprom/nvm_eeprom_via_internal.h22
-rw-r--r--quantum/nvm/eeprom/nvm_via.c77
-rw-r--r--quantum/nvm/nvm_dynamic_keymap.h27
-rw-r--r--quantum/nvm/nvm_eeconfig.h105
-rw-r--r--quantum/nvm/nvm_via.h17
-rw-r--r--quantum/nvm/readme.md30
-rw-r--r--quantum/nvm/rules.mk31
-rw-r--r--quantum/os_detection.h3
-rw-r--r--quantum/process_keycode/process_autocorrect.c6
-rw-r--r--quantum/process_keycode/process_clicky.c6
-rw-r--r--quantum/process_keycode/process_magic.c4
-rw-r--r--quantum/process_keycode/process_steno.c7
-rw-r--r--quantum/quantum.h1
-rw-r--r--quantum/rgb_matrix/animations/rgb_matrix_effects.inc2
-rw-r--r--quantum/rgb_matrix/rgb_matrix.c4
-rw-r--r--quantum/rgb_matrix/rgb_matrix.h4
-rw-r--r--quantum/rgb_matrix/rgb_matrix_types.h2
-rw-r--r--quantum/rgblight/rgblight.c45
-rw-r--r--quantum/rgblight/rgblight.h5
-rw-r--r--quantum/split_common/split_util.h2
-rw-r--r--quantum/unicode/unicode.c4
-rw-r--r--quantum/unicode/unicode.h2
-rw-r--r--quantum/via.c60
-rw-r--r--quantum/via.h27
-rw-r--r--quantum/wear_leveling/tests/rules.mk2
-rw-r--r--readme.md4
-rw-r--r--requirements.txt2
-rw-r--r--tests/basic/test_keycode_util.cpp52
-rw-r--r--tests/basic/test_one_shot_keys.cpp2
-rw-r--r--tests/combo/combo_repress/test_combo.cpp2
-rw-r--r--tests/combo/test_combo.cpp1
-rw-r--r--tests/keycode_string/config.h (renamed from keyboards/xelus/valor_frl_tkl/rev2_1/config.h)4
-rw-r--r--tests/keycode_string/test.mk22
-rw-r--r--tests/keycode_string/test_keycode_string.cpp153
-rw-r--r--tests/no_tapping/no_action_tapping/test.mk2
-rw-r--r--tests/no_tapping/no_mod_tap_mods/test.mk2
-rw-r--r--tests/repeat_key/alt_repeat_key/test_alt_repeat_key.cpp2
-rw-r--r--tests/test_common/build.mk1
-rw-r--r--tests/test_common/keyboard_report_util.cpp8
-rw-r--r--tests/test_common/keycode_table.cpp767
-rw-r--r--tests/test_common/keycode_util.cpp130
-rw-r--r--tests/test_common/keycode_util.hpp6
-rw-r--r--tests/test_common/test_driver.hpp8
-rw-r--r--tests/test_common/test_fixture.cpp2
-rw-r--r--tests/test_common/test_keymap_key.hpp6
-rw-r--r--users/_example/_example.c2
-rw-r--r--users/_example/_example.h2
-rw-r--r--users/_example/readme.md2
-rw-r--r--users/_example/rules.mk2
-rw-r--r--users/readme.md2
-rwxr-xr-xutil/regen.sh1
-rw-r--r--util/usb_detach/usb_detach.c2
390 files changed, 6074 insertions, 2372 deletions
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index a5d185e1dd..3e32f4d994 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -38,4 +38,4 @@ body:
- type: textarea
attributes:
label: Additional Context
- description: Add any other relevant information about the problem here. \ No newline at end of file
+ description: Add any other relevant information about the problem here.
diff --git a/builddefs/build_full_test.mk b/builddefs/build_full_test.mk
index 5cae327c6c..82bb9387a6 100644
--- a/builddefs/build_full_test.mk
+++ b/builddefs/build_full_test.mk
@@ -25,8 +25,6 @@ $(TEST_OUTPUT)_SRC := \
tests/test_common/test_driver.cpp \
tests/test_common/keyboard_report_util.cpp \
tests/test_common/mouse_report_util.cpp \
- tests/test_common/keycode_util.cpp \
- tests/test_common/keycode_table.cpp \
tests/test_common/test_fixture.cpp \
tests/test_common/test_keymap_key.cpp \
tests/test_common/test_logger.cpp \
diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk
index c5fc9cd25d..fb07042bb7 100644
--- a/builddefs/build_keyboard.mk
+++ b/builddefs/build_keyboard.mk
@@ -97,21 +97,12 @@ endif
# Pull in rules.mk files from all our subfolders
-ifneq ("$(wildcard $(KEYBOARD_PATH_5)/rules.mk)","")
- include $(KEYBOARD_PATH_5)/rules.mk
-endif
-ifneq ("$(wildcard $(KEYBOARD_PATH_4)/rules.mk)","")
- include $(KEYBOARD_PATH_4)/rules.mk
-endif
-ifneq ("$(wildcard $(KEYBOARD_PATH_3)/rules.mk)","")
- include $(KEYBOARD_PATH_3)/rules.mk
-endif
-ifneq ("$(wildcard $(KEYBOARD_PATH_2)/rules.mk)","")
- include $(KEYBOARD_PATH_2)/rules.mk
-endif
-ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","")
- include $(KEYBOARD_PATH_1)/rules.mk
-endif
+-include $(KEYBOARD_PATH_5)/rules.mk
+-include $(KEYBOARD_PATH_4)/rules.mk
+-include $(KEYBOARD_PATH_3)/rules.mk
+-include $(KEYBOARD_PATH_2)/rules.mk
+-include $(KEYBOARD_PATH_1)/rules.mk
+
# Create dependencies on DD keyboard config - structure validated elsewhere
DD_CONFIG_FILES :=
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","")
@@ -487,21 +478,11 @@ ifneq ("$(CONVERTER)","")
endif
# Pull in post_rules.mk files from all our subfolders
-ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_rules.mk)","")
- include $(KEYBOARD_PATH_1)/post_rules.mk
-endif
-ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_rules.mk)","")
- include $(KEYBOARD_PATH_2)/post_rules.mk
-endif
-ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_rules.mk)","")
- include $(KEYBOARD_PATH_3)/post_rules.mk
-endif
-ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_rules.mk)","")
- include $(KEYBOARD_PATH_4)/post_rules.mk
-endif
-ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_rules.mk)","")
- include $(KEYBOARD_PATH_5)/post_rules.mk
-endif
+-include $(KEYBOARD_PATH_1)/post_rules.mk
+-include $(KEYBOARD_PATH_2)/post_rules.mk
+-include $(KEYBOARD_PATH_3)/post_rules.mk
+-include $(KEYBOARD_PATH_4)/post_rules.mk
+-include $(KEYBOARD_PATH_5)/post_rules.mk
define post_rules_mk_community_module_includer
ifneq ("$(wildcard $(1)/post_rules.mk)","")
diff --git a/builddefs/common_features.mk b/builddefs/common_features.mk
index c88ce36011..802e01de43 100644
--- a/builddefs/common_features.mk
+++ b/builddefs/common_features.mk
@@ -30,6 +30,8 @@ QUANTUM_SRC += \
$(QUANTUM_DIR)/logging/sendchar.c \
$(QUANTUM_DIR)/process_keycode/process_default_layer.c \
+include $(QUANTUM_DIR)/nvm/rules.mk
+
VPATH += $(QUANTUM_DIR)/logging
# Fall back to lib/printf if there is no platform provided print
ifeq ("$(wildcard $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk)","")
@@ -934,6 +936,28 @@ ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
endif
endif
+VALID_BATTERY_DRIVER_TYPES := adc custom vendor
+
+BATTERY_DRIVER ?= adc
+ifeq ($(strip $(BATTERY_DRIVER_REQUIRED)), yes)
+ ifeq ($(filter $(BATTERY_DRIVER),$(VALID_BATTERY_DRIVER_TYPES)),)
+ $(call CATASTROPHIC_ERROR,Invalid BATTERY_DRIVER,BATTERY_DRIVER="$(BATTERY_DRIVER)" is not a valid battery driver)
+ endif
+
+ OPT_DEFS += -DBATTERY_DRIVER
+ OPT_DEFS += -DBATTERY_$(strip $(shell echo $(BATTERY_DRIVER) | tr '[:lower:]' '[:upper:]'))
+
+ COMMON_VPATH += $(DRIVER_PATH)/battery
+
+ SRC += battery.c
+ SRC += battery_$(strip $(BATTERY_DRIVER)).c
+
+ # add extra deps
+ ifeq ($(strip $(BATTERY_DRIVER)), adc)
+ ANALOG_DRIVER_REQUIRED = yes
+ endif
+endif
+
VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi vendor
WS2812_DRIVER ?= bitbang
diff --git a/builddefs/converters.mk b/builddefs/converters.mk
index b1e5a1bed2..20ecea5cb9 100644
--- a/builddefs/converters.mk
+++ b/builddefs/converters.mk
@@ -1,10 +1,3 @@
-# Note for new boards -- CTPC and CONVERT_TO_PROTON_C are deprecated terms
-# and should not be replicated for new boards. These will be removed from
-# documentation as well as existing keymaps in due course.
-ifneq ($(findstring yes, $(CTPC)$(CONVERT_TO_PROTON_C)),)
-$(call CATASTROPHIC_ERROR,The `CONVERT_TO_PROTON_C` and `CTPC` options are now deprecated. `CONVERT_TO=proton_c` should be used instead.)
-endif
-
ifneq (,$(filter $(MCU),atmega32u4))
# TODO: opt in rather than assume everything uses a pro micro
PIN_COMPATIBLE ?= promicro
diff --git a/builddefs/generic_features.mk b/builddefs/generic_features.mk
index f14f440877..d39727f23b 100644
--- a/builddefs/generic_features.mk
+++ b/builddefs/generic_features.mk
@@ -34,6 +34,7 @@ GENERIC_FEATURES = \
DYNAMIC_TAPPING_TERM \
GRAVE_ESC \
HAPTIC \
+ KEYCODE_STRING \
KEY_LOCK \
KEY_OVERRIDE \
LAYER_LOCK \
@@ -60,6 +61,7 @@ define HANDLE_GENERIC_FEATURE
SRC += $$(wildcard $$(QUANTUM_DIR)/process_keycode/process_$2.c)
SRC += $$(wildcard $$(QUANTUM_DIR)/$2/$2.c)
SRC += $$(wildcard $$(QUANTUM_DIR)/$2.c)
+ SRC += $$(wildcard $$(QUANTUM_DIR)/nvm/$$(NVM_DRIVER_LOWER)/nvm_$2.c)
VPATH += $$(wildcard $$(QUANTUM_DIR)/$2/)
OPT_DEFS += -D$1_ENABLE
endef
diff --git a/data/constants/keycodes/extras/keycodes_belgian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_belgian_0.0.1.hjson
index d2b8c1d7d9..11b68d16a0 100644
--- a/data/constants/keycodes/extras/keycodes_belgian_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_belgian_0.0.1.hjson
@@ -372,4 +372,4 @@
"label": "~",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_bepo_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_bepo_0.0.1.hjson
index 713f3f2829..7a9dea9d13 100644
--- a/data/constants/keycodes/extras/keycodes_bepo_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_bepo_0.0.1.hjson
@@ -629,4 +629,4 @@
"label": "(narrow non-breaking space)",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_brazilian_abnt2_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_brazilian_abnt2_0.0.1.hjson
index 17006a64df..e28970ed33 100644
--- a/data/constants/keycodes/extras/keycodes_brazilian_abnt2_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_brazilian_abnt2_0.0.1.hjson
@@ -376,4 +376,4 @@
"label": "₢",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_canadian_multilingual_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_canadian_multilingual_0.0.1.hjson
index bfe5d5b54c..a663088e22 100644
--- a/data/constants/keycodes/extras/keycodes_canadian_multilingual_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_canadian_multilingual_0.0.1.hjson
@@ -638,4 +638,4 @@
"label": "÷",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_colemak_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_colemak_0.0.1.hjson
index 1dc091584b..0bf0f3b221 100644
--- a/data/constants/keycodes/extras/keycodes_colemak_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_colemak_0.0.1.hjson
@@ -299,4 +299,4 @@
"label": "?",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_croatian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_croatian_0.0.1.hjson
index 82632aa637..50464921fa 100644
--- a/data/constants/keycodes/extras/keycodes_croatian_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_croatian_0.0.1.hjson
@@ -400,4 +400,4 @@
"label": "§",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_czech_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_czech_0.0.1.hjson
index 9cfb88c489..8b1572bfcb 100644
--- a/data/constants/keycodes/extras/keycodes_czech_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_czech_0.0.1.hjson
@@ -432,4 +432,4 @@
"label": "*",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_danish_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_danish_0.0.1.hjson
index fffcd9f9ad..0e8f7a75c6 100644
--- a/data/constants/keycodes/extras/keycodes_danish_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_danish_0.0.1.hjson
@@ -356,4 +356,4 @@
"label": "µ",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_dvorak_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_dvorak_0.0.1.hjson
index 534f99c8e6..485d86aa21 100644
--- a/data/constants/keycodes/extras/keycodes_dvorak_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_dvorak_0.0.1.hjson
@@ -299,4 +299,4 @@
"label": ":",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_dvorak_fr_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_dvorak_fr_0.0.1.hjson
index 70c0b3c0aa..69ce14486e 100644
--- a/data/constants/keycodes/extras/keycodes_dvorak_fr_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_dvorak_fr_0.0.1.hjson
@@ -314,4 +314,4 @@
"label": "@",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_dvorak_programmer_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_dvorak_programmer_0.0.1.hjson
index 8a70dae7ef..6fa9868e4c 100644
--- a/data/constants/keycodes/extras/keycodes_dvorak_programmer_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_dvorak_programmer_0.0.1.hjson
@@ -299,4 +299,4 @@
"label": "\"",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_estonian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_estonian_0.0.1.hjson
index bbf7512581..276d3fe664 100644
--- a/data/constants/keycodes/extras/keycodes_estonian_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_estonian_0.0.1.hjson
@@ -364,4 +364,4 @@
"label": "ž",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson
index 9ff217cff2..9b4fa33053 100644
--- a/data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_eurkey_0.0.1.hjson
@@ -593,4 +593,4 @@
"label": "…",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_finnish_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_finnish_0.0.1.hjson
index b284192962..a4d3c99a6f 100644
--- a/data/constants/keycodes/extras/keycodes_finnish_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_finnish_0.0.1.hjson
@@ -356,4 +356,4 @@
"label": "µ",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_french_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_french_0.0.1.hjson
index 8ba7b35d2e..351dfe89d8 100644
--- a/data/constants/keycodes/extras/keycodes_french_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_french_0.0.1.hjson
@@ -364,4 +364,4 @@
"label": "¤",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_french_afnor_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_french_afnor_0.0.1.hjson
index 90981d085d..92646c4de8 100644
--- a/data/constants/keycodes/extras/keycodes_french_afnor_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_french_afnor_0.0.1.hjson
@@ -620,4 +620,4 @@
"label": "≠",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_french_mac_iso_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_french_mac_iso_0.0.1.hjson
index b698018d5b..bb924e9852 100644
--- a/data/constants/keycodes/extras/keycodes_french_mac_iso_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_french_mac_iso_0.0.1.hjson
@@ -673,4 +673,4 @@
"label": "±",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_german_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_german_0.0.1.hjson
index a1cfd44956..015438abb2 100644
--- a/data/constants/keycodes/extras/keycodes_german_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_german_0.0.1.hjson
@@ -356,4 +356,4 @@
"label": "µ",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_german_mac_iso_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_german_mac_iso_0.0.1.hjson
index 366ed5b9d1..fa3b8d67b5 100644
--- a/data/constants/keycodes/extras/keycodes_german_mac_iso_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_german_mac_iso_0.0.1.hjson
@@ -653,4 +653,4 @@
"label": "—",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_greek_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_greek_0.0.1.hjson
index 9c7f8796bf..b61a317b19 100644
--- a/data/constants/keycodes/extras/keycodes_greek_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_greek_0.0.1.hjson
@@ -388,4 +388,4 @@
"label": "©",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_hebrew_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_hebrew_0.0.1.hjson
index b519229f35..aaf0563623 100644
--- a/data/constants/keycodes/extras/keycodes_hebrew_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_hebrew_0.0.1.hjson
@@ -344,4 +344,4 @@
"label": "÷",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_hungarian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_hungarian_0.0.1.hjson
index d4fc908dc0..e7ae0d340c 100644
--- a/data/constants/keycodes/extras/keycodes_hungarian_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_hungarian_0.0.1.hjson
@@ -432,4 +432,4 @@
"label": "*",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_icelandic_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_icelandic_0.0.1.hjson
index f4d6025a77..59478a1018 100644
--- a/data/constants/keycodes/extras/keycodes_icelandic_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_icelandic_0.0.1.hjson
@@ -352,4 +352,4 @@
"label": "µ",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_irish_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_irish_0.0.1.hjson
index 94e553469e..99487a5b90 100644
--- a/data/constants/keycodes/extras/keycodes_irish_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_irish_0.0.1.hjson
@@ -352,4 +352,4 @@
"label": "´ (dead)",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_italian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_italian_0.0.1.hjson
index 951c564f62..8b859d6de8 100644
--- a/data/constants/keycodes/extras/keycodes_italian_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_italian_0.0.1.hjson
@@ -361,4 +361,4 @@
"label": "}",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_italian_mac_ansi_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_italian_mac_ansi_0.0.1.hjson
index 328755ca67..551f094974 100644
--- a/data/constants/keycodes/extras/keycodes_italian_mac_ansi_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_italian_mac_ansi_0.0.1.hjson
@@ -681,4 +681,4 @@
"label": "—",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_italian_mac_iso_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_italian_mac_iso_0.0.1.hjson
index 4beccd804a..aed90f203d 100644
--- a/data/constants/keycodes/extras/keycodes_italian_mac_iso_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_italian_mac_iso_0.0.1.hjson
@@ -685,4 +685,4 @@
"label": "—",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_japanese_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_japanese_0.0.1.hjson
index d95712abd9..779eef8a84 100644
--- a/data/constants/keycodes/extras/keycodes_japanese_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_japanese_0.0.1.hjson
@@ -327,4 +327,4 @@
"label": "_",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_korean_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_korean_0.0.1.hjson
index 5ee19c9e4e..8e04d8ed2a 100644
--- a/data/constants/keycodes/extras/keycodes_korean_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_korean_0.0.1.hjson
@@ -307,4 +307,4 @@
"label": "?",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_latvian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_latvian_0.0.1.hjson
index ab80f0fdd9..510a2c83a7 100644
--- a/data/constants/keycodes/extras/keycodes_latvian_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_latvian_0.0.1.hjson
@@ -437,4 +437,4 @@
"label": "¨ (dead)",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_lithuanian_azerty_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_lithuanian_azerty_0.0.1.hjson
index dfb527878e..f6140d7f93 100644
--- a/data/constants/keycodes/extras/keycodes_lithuanian_azerty_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_lithuanian_azerty_0.0.1.hjson
@@ -372,4 +372,4 @@
"label": "\\",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_lithuanian_qwerty_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_lithuanian_qwerty_0.0.1.hjson
index a4ea30d592..2ab6f83c94 100644
--- a/data/constants/keycodes/extras/keycodes_lithuanian_qwerty_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_lithuanian_qwerty_0.0.1.hjson
@@ -365,4 +365,4 @@
"label": "+",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_neo2_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_neo2_0.0.1.hjson
index 980bddbf7a..88ede311a6 100644
--- a/data/constants/keycodes/extras/keycodes_neo2_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_neo2_0.0.1.hjson
@@ -214,4 +214,4 @@
"label": "(layer 4)",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_nordic_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_nordic_0.0.1.hjson
index fb3d1bc84b..8536a004de 100644
--- a/data/constants/keycodes/extras/keycodes_nordic_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_nordic_0.0.1.hjson
@@ -113,4 +113,4 @@
"key": "NO_MU"
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_norman_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_norman_0.0.1.hjson
index 98ea7e6aab..45cd26ae1c 100644
--- a/data/constants/keycodes/extras/keycodes_norman_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_norman_0.0.1.hjson
@@ -299,4 +299,4 @@
"label": "?",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_norwegian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_norwegian_0.0.1.hjson
index 4e8cbb5d0e..0cc79c5631 100644
--- a/data/constants/keycodes/extras/keycodes_norwegian_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_norwegian_0.0.1.hjson
@@ -352,4 +352,4 @@
"label": "µ",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_plover_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_plover_0.0.1.hjson
index fb00ef0c62..78cfe9dd41 100644
--- a/data/constants/keycodes/extras/keycodes_plover_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_plover_0.0.1.hjson
@@ -83,4 +83,4 @@
"key": "PV_U"
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_plover_dvorak_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_plover_dvorak_0.0.1.hjson
index 9656dd9821..8e1fe29f8b 100644
--- a/data/constants/keycodes/extras/keycodes_plover_dvorak_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_plover_dvorak_0.0.1.hjson
@@ -70,4 +70,4 @@
"key": "PD_U"
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_polish_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_polish_0.0.1.hjson
index 609011b1f7..f09f2c9b64 100644
--- a/data/constants/keycodes/extras/keycodes_polish_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_polish_0.0.1.hjson
@@ -352,4 +352,4 @@
"label": "Ń",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_portuguese_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_portuguese_0.0.1.hjson
index c8e43065d2..ec773ddbb5 100644
--- a/data/constants/keycodes/extras/keycodes_portuguese_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_portuguese_0.0.1.hjson
@@ -352,4 +352,4 @@
"label": "€",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_portuguese_mac_iso_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_portuguese_mac_iso_0.0.1.hjson
index b1c9aaad98..503a3e92a6 100644
--- a/data/constants/keycodes/extras/keycodes_portuguese_mac_iso_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_portuguese_mac_iso_0.0.1.hjson
@@ -617,4 +617,4 @@
"label": "–",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_romanian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_romanian_0.0.1.hjson
index 42b1e89d3b..f388523146 100644
--- a/data/constants/keycodes/extras/keycodes_romanian_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_romanian_0.0.1.hjson
@@ -441,4 +441,4 @@
"label": "»",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_russian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_russian_0.0.1.hjson
index d83fc0f61f..41904be634 100644
--- a/data/constants/keycodes/extras/keycodes_russian_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_russian_0.0.1.hjson
@@ -288,4 +288,4 @@
"label": "₽",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_serbian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_serbian_0.0.1.hjson
index 98957930a0..3ddd7f15df 100644
--- a/data/constants/keycodes/extras/keycodes_serbian_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_serbian_0.0.1.hjson
@@ -304,4 +304,4 @@
"label": "€",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_serbian_latin_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_serbian_latin_0.0.1.hjson
index ca4746b646..eec0877aa7 100644
--- a/data/constants/keycodes/extras/keycodes_serbian_latin_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_serbian_latin_0.0.1.hjson
@@ -404,4 +404,4 @@
"label": "§",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_slovak_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_slovak_0.0.1.hjson
index 14eb4b783a..dbf39b5f49 100644
--- a/data/constants/keycodes/extras/keycodes_slovak_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_slovak_0.0.1.hjson
@@ -440,4 +440,4 @@
"label": "}",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_slovenian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_slovenian_0.0.1.hjson
index fd1a4eb4fc..d264d3d392 100644
--- a/data/constants/keycodes/extras/keycodes_slovenian_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_slovenian_0.0.1.hjson
@@ -400,4 +400,4 @@
"label": "§",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_spanish_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_spanish_0.0.1.hjson
index db3b068e97..9656e35674 100644
--- a/data/constants/keycodes/extras/keycodes_spanish_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_spanish_0.0.1.hjson
@@ -356,4 +356,4 @@
"label": "}",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_spanish_dvorak_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_spanish_dvorak_0.0.1.hjson
index 39119a6a91..fa0a93ff85 100644
--- a/data/constants/keycodes/extras/keycodes_spanish_dvorak_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_spanish_dvorak_0.0.1.hjson
@@ -356,4 +356,4 @@
"label": "}",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_spanish_latin_america_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_spanish_latin_america_0.0.1.hjson
index fb1de29e6e..51ad69a55a 100644
--- a/data/constants/keycodes/extras/keycodes_spanish_latin_america_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_spanish_latin_america_0.0.1.hjson
@@ -340,4 +340,4 @@
"label": "`",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_swedish_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_swedish_0.0.1.hjson
index 6db71ea241..f538a81bd9 100644
--- a/data/constants/keycodes/extras/keycodes_swedish_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_swedish_0.0.1.hjson
@@ -356,4 +356,4 @@
"label": "µ",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_swedish_mac_ansi_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_swedish_mac_ansi_0.0.1.hjson
index ab7c3ad8d1..59f0173e89 100644
--- a/data/constants/keycodes/extras/keycodes_swedish_mac_ansi_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_swedish_mac_ansi_0.0.1.hjson
@@ -639,4 +639,4 @@
"label": "—",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_swedish_mac_iso_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_swedish_mac_iso_0.0.1.hjson
index cafd815776..cf2c0d9fdf 100644
--- a/data/constants/keycodes/extras/keycodes_swedish_mac_iso_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_swedish_mac_iso_0.0.1.hjson
@@ -637,4 +637,4 @@
"label": "—",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_swedish_pro_mac_ansi_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_swedish_pro_mac_ansi_0.0.1.hjson
index c82c79c711..911cbc2be8 100644
--- a/data/constants/keycodes/extras/keycodes_swedish_pro_mac_ansi_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_swedish_pro_mac_ansi_0.0.1.hjson
@@ -639,4 +639,4 @@
"label": "—",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_swedish_pro_mac_iso_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_swedish_pro_mac_iso_0.0.1.hjson
index 4555739ccd..d8e532f792 100644
--- a/data/constants/keycodes/extras/keycodes_swedish_pro_mac_iso_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_swedish_pro_mac_iso_0.0.1.hjson
@@ -637,4 +637,4 @@
"label": "—",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_swiss_de_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_swiss_de_0.0.1.hjson
index ae260a5e56..e4a5f91158 100644
--- a/data/constants/keycodes/extras/keycodes_swiss_de_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_swiss_de_0.0.1.hjson
@@ -376,4 +376,4 @@
"label": "\\",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_swiss_fr_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_swiss_fr_0.0.1.hjson
index 83fb86e49c..e518658314 100644
--- a/data/constants/keycodes/extras/keycodes_swiss_fr_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_swiss_fr_0.0.1.hjson
@@ -376,4 +376,4 @@
"label": "\\",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_turkish_f_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_turkish_f_0.0.1.hjson
index 2689f10dbe..0f527e04d6 100644
--- a/data/constants/keycodes/extras/keycodes_turkish_f_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_turkish_f_0.0.1.hjson
@@ -477,4 +477,4 @@
"label": "º",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_turkish_q_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_turkish_q_0.0.1.hjson
index e00cee9ce3..e736bb52a2 100644
--- a/data/constants/keycodes/extras/keycodes_turkish_q_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_turkish_q_0.0.1.hjson
@@ -372,4 +372,4 @@
"label": "` (dead)",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_uk_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_uk_0.0.1.hjson
index 006bf5c59e..aa97e11fa9 100644
--- a/data/constants/keycodes/extras/keycodes_uk_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_uk_0.0.1.hjson
@@ -350,4 +350,4 @@
"label": "Á"
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_ukrainian_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_ukrainian_0.0.1.hjson
index 2e8629f58b..3596dc14e0 100644
--- a/data/constants/keycodes/extras/keycodes_ukrainian_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_ukrainian_0.0.1.hjson
@@ -292,4 +292,4 @@
"label": "ґ",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_us_extended_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_us_extended_0.0.1.hjson
index ecac6ca161..15b21dd526 100644
--- a/data/constants/keycodes/extras/keycodes_us_extended_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_us_extended_0.0.1.hjson
@@ -585,4 +585,4 @@
"label": "̉ (dead)",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_us_international_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_us_international_0.0.1.hjson
index 36a574a4ad..34328be8b8 100644
--- a/data/constants/keycodes/extras/keycodes_us_international_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_us_international_0.0.1.hjson
@@ -505,4 +505,4 @@
"label": "¢",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_us_international_linux_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_us_international_linux_0.0.1.hjson
index d6bdf2e02d..fcf848dd87 100644
--- a/data/constants/keycodes/extras/keycodes_us_international_linux_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_us_international_linux_0.0.1.hjson
@@ -573,4 +573,4 @@
"label": "̉ (dead)",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_workman_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_workman_0.0.1.hjson
index 27471a15e4..14220e560e 100644
--- a/data/constants/keycodes/extras/keycodes_workman_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_workman_0.0.1.hjson
@@ -299,4 +299,4 @@
"label": "?",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/extras/keycodes_workman_zxcvm_0.0.1.hjson b/data/constants/keycodes/extras/keycodes_workman_zxcvm_0.0.1.hjson
index 86f6a5bffb..f05ec1a3ea 100644
--- a/data/constants/keycodes/extras/keycodes_workman_zxcvm_0.0.1.hjson
+++ b/data/constants/keycodes/extras/keycodes_workman_zxcvm_0.0.1.hjson
@@ -299,4 +299,4 @@
"label": "?",
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/keycodes_0.0.1.hjson b/data/constants/keycodes/keycodes_0.0.1.hjson
index 7ba1ecf201..c40baf13dc 100644
--- a/data/constants/keycodes/keycodes_0.0.1.hjson
+++ b/data/constants/keycodes/keycodes_0.0.1.hjson
@@ -93,4 +93,4 @@
"key": "SAFE_RANGE"
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/keycodes_0.0.1_joystick.hjson b/data/constants/keycodes/keycodes_0.0.1_joystick.hjson
index 0bda7c29f3..b851d72eef 100644
--- a/data/constants/keycodes/keycodes_0.0.1_joystick.hjson
+++ b/data/constants/keycodes/keycodes_0.0.1_joystick.hjson
@@ -225,4 +225,4 @@
]
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/keycodes_0.0.1_magic.hjson b/data/constants/keycodes/keycodes_0.0.1_magic.hjson
index 7ee1f2bce9..0e3e8dc55f 100644
--- a/data/constants/keycodes/keycodes_0.0.1_magic.hjson
+++ b/data/constants/keycodes/keycodes_0.0.1_magic.hjson
@@ -246,4 +246,4 @@
]
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson b/data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson
index 645bcd6a39..7d031728a6 100644
--- a/data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson
+++ b/data/constants/keycodes/keycodes_0.0.1_programmable_button.hjson
@@ -225,4 +225,4 @@
]
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/keycodes_0.0.1_sequencer.hjson b/data/constants/keycodes/keycodes_0.0.1_sequencer.hjson
index 039d09b2fa..85844ae99c 100644
--- a/data/constants/keycodes/keycodes_0.0.1_sequencer.hjson
+++ b/data/constants/keycodes/keycodes_0.0.1_sequencer.hjson
@@ -37,4 +37,4 @@
"key": "SQ_SCLR"
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/keycodes_0.0.2_basic.hjson b/data/constants/keycodes/keycodes_0.0.2_basic.hjson
index 2b5df85d99..d9cefe7e93 100644
--- a/data/constants/keycodes/keycodes_0.0.2_basic.hjson
+++ b/data/constants/keycodes/keycodes_0.0.2_basic.hjson
@@ -17,4 +17,4 @@
]
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/keycodes_0.0.2_magic.hjson b/data/constants/keycodes/keycodes_0.0.2_magic.hjson
index 81758975e3..2fc8ba038d 100644
--- a/data/constants/keycodes/keycodes_0.0.2_magic.hjson
+++ b/data/constants/keycodes/keycodes_0.0.2_magic.hjson
@@ -248,4 +248,4 @@
]
}
}
-} \ No newline at end of file
+}
diff --git a/data/constants/keycodes/keycodes_0.0.2_sequencer.hjson b/data/constants/keycodes/keycodes_0.0.2_sequencer.hjson
index eedaed166c..445a2c9328 100644
--- a/data/constants/keycodes/keycodes_0.0.2_sequencer.hjson
+++ b/data/constants/keycodes/keycodes_0.0.2_sequencer.hjson
@@ -66,4 +66,4 @@
]
}
}
-} \ No newline at end of file
+}
diff --git a/data/mappings/info_rules.hjson b/data/mappings/info_rules.hjson
index 00685b5b5f..238957f170 100644
--- a/data/mappings/info_rules.hjson
+++ b/data/mappings/info_rules.hjson
@@ -53,8 +53,8 @@
"WS2812_DRIVER": {"info_key": "ws2812.driver"},
// Items we want flagged in lint
- "CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
- "CONVERT_TO_PROTON_C": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
"DEFAULT_FOLDER": {"info_key": "_deprecated.default_folder", "deprecated": true},
+ "CTPC": {"info_key": "_invalid.ctpc", "invalid": true, "replace_with": "CONVERT_TO=proton_c"},
+ "CONVERT_TO_PROTON_C": {"info_key": "_invalid.ctpc", "invalid": true, "replace_with": "CONVERT_TO=proton_c"},
"VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true}
}
diff --git a/data/mappings/keyboard_aliases.hjson b/data/mappings/keyboard_aliases.hjson
index b601a42761..0a640fd3e0 100644
--- a/data/mappings/keyboard_aliases.hjson
+++ b/data/mappings/keyboard_aliases.hjson
@@ -146,6 +146,9 @@
"daisy": {
"target": "ktec/daisy"
},
+ "deemen17/de60": {
+ "target": "deemen17/de60/r1"
+ },
"dp3000": {
"target": "dp3000/rev1"
},
@@ -347,6 +350,9 @@
"keycapsss/plaid_pad": {
"target": "keycapsss/plaid_pad/rev1"
},
+ "keyten/kt60hs_t": {
+ "target": "keyten/kt60hs_t/v1"
+ },
"kira75": {
"target": "kira/kira75"
},
@@ -581,6 +587,9 @@
"ploopyco/trackball": {
"target": "ploopyco/trackball/rev1_005"
},
+ "plywrks/ply8x": {
+ "target": "plywrks/ply8x/solder"
+ },
"polilla": {
"target": "polilla/rev1"
},
diff --git a/data/schemas/community_module.jsonschema b/data/schemas/community_module.jsonschema
index a3474476df..a237e210ce 100644
--- a/data/schemas/community_module.jsonschema
+++ b/data/schemas/community_module.jsonschema
@@ -7,6 +7,7 @@
"properties": {
"module_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
"maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"},
+ "license": {"type": "string"},
"url": {
"type": "string",
"format": "uri"
diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema
index 9b63f62d45..eee2915fcb 100644
--- a/data/schemas/keyboard.jsonschema
+++ b/data/schemas/keyboard.jsonschema
@@ -554,6 +554,7 @@
"items": {
"type": "object",
"additionalProperties": false,
+ "required": ["x", "y"],
"properties": {
"matrix": {
"type": "array",
@@ -640,6 +641,7 @@
"items": {
"type": "object",
"additionalProperties": false,
+ "required": ["x", "y"],
"properties": {
"matrix": {
"type": "array",
diff --git a/docs/_sidebar.json b/docs/_sidebar.json
index ae4d8fe4a9..f504f6f900 100644
--- a/docs/_sidebar.json
+++ b/docs/_sidebar.json
@@ -227,6 +227,7 @@
{ "text": "ADC Driver", "link": "/drivers/adc" },
{ "text": "APA102 Driver", "link": "/drivers/apa102" },
{ "text": "Audio Driver", "link": "/drivers/audio" },
+ { "text": "Battery Driver", "link": "/drivers/battery" },
{ "text": "EEPROM Driver", "link": "/drivers/eeprom" },
{ "text": "Flash Driver", "link": "/drivers/flash" },
{ "text": "I2C Driver", "link": "/drivers/i2c" },
diff --git a/docs/cli.md b/docs/cli.md
index 7d4c10cedd..36983d5e00 100644
--- a/docs/cli.md
+++ b/docs/cli.md
@@ -6,7 +6,7 @@ The QMK CLI (command line interface) makes building and working with QMK keyboar
### Requirements {#requirements}
-QMK requires Python 3.7 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI.
+QMK requires Python 3.9 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI.
### Install Using Homebrew (macOS, some Linux) {#install-using-homebrew}
@@ -20,7 +20,7 @@ qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build
### Install Using pip {#install-using-easy_install-or-pip}
-If your system is not listed above you can install QMK manually. First ensure that you have Python 3.7 (or later) installed and have installed pip. Then install QMK with this command:
+If your system is not listed above you can install QMK manually. First ensure that you have Python 3.9 (or later) installed and have installed pip. Then install QMK with this command:
```
python3 -m pip install qmk
diff --git a/docs/cli_development.md b/docs/cli_development.md
index 2e74220d4b..74ac53d327 100644
--- a/docs/cli_development.md
+++ b/docs/cli_development.md
@@ -44,7 +44,7 @@ def hello(cli):
First we import the `cli` object from `milc`. This is how we interact with the user and control the script's behavior. We use `@cli.argument()` to define a command line flag, `--name`. This also creates a configuration variable named `hello.name` (and the corresponding `user.name`) which the user can set so they don't have to specify the argument. The `cli.subcommand()` decorator designates this function as a subcommand. The name of the subcommand will be taken from the name of the function.
-Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.7/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator.
+Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.9/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator.
# User Interaction
@@ -56,13 +56,13 @@ There are two main methods for outputting text in a subcommand- `cli.log` and `c
You can use special tokens to colorize your text, to make it easier to understand the output of your program. See [Colorizing Text](#colorizing-text) below.
-Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.7/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example.
+Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.9/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example.
You should never use the format operator (`%`) directly, always pass values as arguments.
### Logging (`cli.log`)
-The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.7/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong.
+The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.9/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong.
The default log level is `INFO`. If the user runs `qmk -v <subcommand>` the default log level will be set to `DEBUG`.
diff --git a/docs/coding_conventions_python.md b/docs/coding_conventions_python.md
index 502ee9102e..b25466bf82 100644
--- a/docs/coding_conventions_python.md
+++ b/docs/coding_conventions_python.md
@@ -2,7 +2,7 @@
Most of our style follows PEP8 with some local modifications to make things less nit-picky.
-* We target Python 3.7 for compatibility with all supported platforms.
+* We target Python 3.9 for compatibility with all supported platforms.
* We indent using four (4) spaces (soft tabs)
* We encourage liberal use of comments
* Think of them as a story describing the feature
@@ -317,7 +317,7 @@ At the time of this writing our tests are not very comprehensive. Looking at the
## Integration Tests
-Integration tests can be found in `lib/python/qmk/tests/test_cli_commands.py`. This is where CLI commands are actually run and their overall behavior is verified. We use [`subprocess`](https://docs.python.org/3.7/library/subprocess.html#module-subprocess) to launch each CLI command and a combination of checking output and returncode to determine if the right thing happened.
+Integration tests can be found in `lib/python/qmk/tests/test_cli_commands.py`. This is where CLI commands are actually run and their overall behavior is verified. We use [`subprocess`](https://docs.python.org/3.9/library/subprocess.html#module-subprocess) to launch each CLI command and a combination of checking output and returncode to determine if the right thing happened.
## Unit Tests
diff --git a/docs/configurator_diagram.drawio b/docs/configurator_diagram.drawio
index 091a3a76b8..661f884def 100644
--- a/docs/configurator_diagram.drawio
+++ b/docs/configurator_diagram.drawio
@@ -1 +1 @@
-<mxfile host="Electron" modified="2021-08-09T19:46:29.036Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.6.13 Chrome/89.0.4389.128 Electron/12.0.7 Safari/537.36" etag="PQ2r34UrZa0TfW4Fw0EV" version="14.6.13" type="device"><diagram id="NEtccoSKIy4HskWlhJpu" name="Page-1">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</diagram></mxfile> \ No newline at end of file
+<mxfile host="Electron" modified="2021-08-09T19:46:29.036Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/14.6.13 Chrome/89.0.4389.128 Electron/12.0.7 Safari/537.36" etag="PQ2r34UrZa0TfW4Fw0EV" version="14.6.13" type="device"><diagram id="NEtccoSKIy4HskWlhJpu" name="Page-1">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</diagram></mxfile>
diff --git a/docs/configurator_diagram.svg b/docs/configurator_diagram.svg
index bcf0bf76d1..1e540d70a6 100644
--- a/docs/configurator_diagram.svg
+++ b/docs/configurator_diagram.svg
@@ -1,3 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1261px" height="991px" viewBox="-0.5 -0.5 1261 991" style="background-color: rgb(255, 255, 255);"><defs/><g><path d="M 885.2 40 L 1060 40" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><image x="804.7" y="-0.5" width="80" height="80" xlink:href="data:image/png;base64,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"/><path d="M 845.33 302.4 C 815.12 302.4 794 277.79 794 251.59 C 794 220.27 819.22 200 845.71 200 C 871.22 200 896.4 220.93 896.4 251.18 C 896.4 278.28 874.84 302.4 845.33 302.4 Z" fill="#0d2636" stroke="none" pointer-events="all"/><path d="M 834.25 291.19 C 834.25 293.4 832.57 294.32 830.06 293.46 C 814.91 288.15 800.34 271.75 800.34 251.27 C 800.34 223.57 824.03 206.1 844.57 206.1 C 871.22 206.1 890.18 227.94 890.18 251 C 890.18 270.03 877.94 287.54 859.59 293.69 C 857.52 294.24 856.23 293.13 856.23 291.31 L 856.23 277.98 C 856.23 275.4 855.18 272.65 853.24 270.74 C 860.69 269.89 865.21 268.02 868.67 264.46 C 872.07 261.08 873.6 256.13 873.88 250.01 C 874.07 245.15 872.77 240.41 869.25 236.8 C 870.48 233.82 870.69 229.86 868.83 224.97 C 865.14 224.69 860.94 226.9 856.64 229.56 C 849.08 227.59 841.52 227.33 833.96 229.67 C 830.58 227.47 827.51 225 821.65 224.97 C 820.1 229.29 819.86 233.23 821.19 236.72 C 817 241.37 816.52 245.93 816.6 250.47 C 817.06 259.25 820.27 263.68 823.83 266.33 C 826.79 268.52 830.94 269.9 837.27 270.83 C 835.57 272.51 834.62 274.51 834.46 276.86 C 830.74 278.56 825.42 279.41 821.78 274.25 C 820.15 271.66 817.93 268.73 813.72 268.74 C 813.03 268.72 812.35 268.98 812.25 269.28 C 812.15 269.61 812.54 270.3 813.01 270.57 C 816.7 272.92 817.29 274.23 818.8 277.44 C 820.2 281.19 822.62 282.63 825.24 283.64 C 827.92 284.59 832.25 284.32 834.25 283.64 Z" fill="#ffffff" stroke="none" pointer-events="all"/><path d="M 845.2 193.63 L 845.2 86.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 845.2 198.88 L 841.7 191.88 L 845.2 193.63 L 848.7 191.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 845.2 81.12 L 848.7 88.12 L 845.2 86.37 L 841.7 88.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="1060" y="10" width="200" height="60" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 40px; margin-left: 1061px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: white; white-space: normal; word-wrap: normal; ">Clients Supported:<br />Chrome, Firefox<br />Desktop Only</div></div></div></foreignObject><text x="1160" y="44" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Clients Supported:...</text></switch></g><rect x="1060" y="206.2" width="200" height="90" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 251px; margin-left: 1061px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><span>https://config.qmk.fm</span><br /><span>Single Page Site<br /></span>JavaScript/VUE<br />Source: qmk/qmk_configurator<br /><span>Host: Github Pages</span></div></div></div></foreignObject><text x="1160" y="255" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">https://config.qmk.fm...</text></switch></g><path d="M 896.4 251.2 L 1060 251.2" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 880 457.9 L 1060 457.9" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 833.22 495.8 C 828.16 495.8 821.72 491.64 821.72 483.75 L 821.72 475.34 L 813.15 475.34 C 811.65 475.34 810 474.49 810.03 471.92 L 810.03 455.36 C 810.03 453.81 810.93 452.17 812.91 452.12 L 821.72 452.12 L 821.72 431.37 C 821.72 425.69 826.62 420 833.69 420 L 856.49 420 C 858.53 420 861.18 421.45 863.72 423.93 L 876.39 436.67 C 879.49 440.04 880 441.77 880 443.93 L 880 484.09 C 880 490.1 875.34 495.8 867.72 495.8 Z" fill="#000000" stroke="none" pointer-events="all"/><path d="M 850.47 469.58 L 850.47 457.06 L 854.43 457.06 L 858.82 463.99 L 858.82 457.06 L 861.89 457.06 L 861.89 469.58 L 858.67 469.58 L 853.58 461.29 L 853.58 469.58 Z M 844.7 463.4 C 844.69 461.89 844.28 459.4 841.65 459.33 C 839.7 459.3 838.71 461.33 838.71 463.26 C 838.77 466.2 840.13 467.37 841.74 467.37 C 843.53 467.33 844.68 465.87 844.7 463.4 Z M 835.26 462.55 C 835.34 459.28 837.91 457.1 840.4 456.87 C 843.13 456.63 844.5 457.13 845.74 457.91 C 847.41 459.11 848.53 461.32 848.06 464.79 C 847.61 467.23 846.07 469.6 842.36 469.85 C 841 469.92 838.36 469.99 836.56 467.58 C 835.73 466.38 835.22 465.51 835.26 462.55 Z M 823.19 465.77 L 823.65 465.72 C 825.75 467.29 827.29 467.4 828.78 467.35 C 829.66 467.23 830.41 467.01 830.47 466.24 C 830.51 465.69 829.93 465.31 829.36 465.17 C 827.6 464.71 826.16 464.86 824.34 463.46 C 822.89 462.1 822.96 460.46 823.66 459.16 C 824.9 457.24 827.05 456.94 828.36 456.83 C 830.57 456.81 832.33 457.19 833.44 457.73 L 833.43 460.67 L 832.94 460.71 C 831.93 459.92 830.82 459.41 829.27 459.32 C 828.41 459.31 827.38 459.3 826.76 460 C 826.43 461.17 827.29 461.25 828.04 461.42 C 830.02 461.87 831.13 461.99 832.65 462.95 C 834.58 464.43 833.97 466.96 832.96 468.1 C 831.63 469.39 830.35 469.86 827.92 469.85 C 826.52 469.83 824.81 469.63 823.17 468.83 Z M 813.29 466.83 C 814.07 467.09 814.63 467.45 816.44 467.23 C 817.09 467.05 817.76 466.56 817.76 465.57 L 817.76 459.51 L 814.91 459.51 L 814.91 457.06 L 821.13 457.06 L 821.13 466.31 C 820.87 468.24 819.78 469.26 818.09 469.59 C 816.91 469.84 815.53 469.98 813.29 469.57 Z M 827.52 475.34 L 862.48 475.34 C 864.3 475.34 865.44 473.93 865.44 472.17 L 865.44 455.09 C 865.44 453.39 864.22 452.12 862.32 452.12 L 827.52 452.12 L 827.52 431.76 C 827.52 427.61 830.96 425.79 833.33 425.79 L 854.21 425.79 C 856.33 425.79 856.7 428.23 856.7 429.52 L 856.71 440.31 C 856.71 442.3 858.38 443.31 859.64 443.31 L 870.53 443.31 C 872.02 443.31 874.24 443.77 874.24 446.39 L 874.24 483.83 C 874.24 487.16 872.07 489.95 868.16 489.95 L 833.53 489.95 C 830.7 489.95 827.52 487.95 827.52 483.92 Z" fill="#ffffff" stroke="none" pointer-events="all"/><rect x="1060" y="412.9" width="200" height="90" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 458px; margin-left: 1061px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">https://keyboards.qmk.fm<br />Keyboard Metadata<br />Source: qmk/qmk_firmware<br />GH Action: Update API Data<br />Host: DigitalOcean Spaces</div></div></div></foreignObject><text x="1160" y="462" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">https://keyboards.qmk.fm...</text></switch></g><path d="M 845.04 420 L 845.14 308.77" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 845.15 303.52 L 848.64 310.52 L 845.14 308.77 L 841.64 310.51 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 905 630 L 1060 630" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 815 610 C 791 610 785 630 804.2 634 C 785 642.8 806.6 662 822.2 654 C 833 670 869 670 881 654 C 905 654 905 638 890 630 C 905 614 881 598 860 606 C 845 594 821 594 815 610 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 630px; margin-left: 786px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">QMK API</div></div></div></foreignObject><text x="845" y="634" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">QMK API</text></switch></g><rect x="1060" y="595" width="200" height="70" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 630px; margin-left: 1061px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">https://api.qmk.fm<br />RESTful API<br />Source: qmk/qmk_api<br />Host: Rancher on DO VM's</div></div></div></foreignObject><text x="1160" y="634" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">https://api.qmk.fm...</text></switch></g><path d="M 794 275.46 L 709.04 315.72 Q 700 320 700 330 L 700 570 Q 700 580 709.45 583.26 L 785.69 609.55" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 790.65 611.26 L 782.89 612.29 L 785.69 609.55 L 785.17 605.67 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 460 251.8 L 290 251.8" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 490 229 C 466 229 460 251.8 479.2 256.36 C 460 266.39 481.6 288.28 497.2 279.16 C 508 297.4 544 297.4 556 279.16 C 580 279.16 580 260.92 565 251.8 C 580 233.56 556 215.32 535 224.44 C 520 210.76 496 210.76 490 229 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 252px; margin-left: 461px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Digital Ocean<br />Spaces<br />(S3)</div></div></div></foreignObject><text x="520" y="255" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Digital Ocean...</text></switch></g><rect x="0" y="221.8" width="290" height="60" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 288px; height: 1px; padding-top: 252px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">https://qmk-api.nyc3.cdn.digitaloceanspaces.com<br />Space: qmk-api<br />Host: Digital Ocean</div></div></div></foreignObject><text x="145" y="255" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">https://qmk-api.nyc3.cdn.digitaloceanspaces.com...</text></switch></g><path d="M 580 251.8 L 787.63 251.31" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 792.88 251.3 L 785.89 254.81 L 787.63 251.31 L 785.87 247.81 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 875 790 L 1060 790" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 815 768 C 815 757.33 875 757.33 875 768 L 875 812 C 875 822.67 815 822.67 815 812 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 815 768 C 815 776 875 776 875 768 M 815 772 C 815 780 875 780 875 772 M 815 776 C 815 784 875 784 875 776" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 800px; margin-left: 816px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">RQ</div></div></div></foreignObject><text x="845" y="804" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">RQ</text></switch></g><rect x="1060" y="755" width="200" height="70" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 790px; margin-left: 1061px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Redis / RQ<br />Job Queue<br />Source: qmk/qmk_redis<br />Host: Rancher on DO VM's</div></div></div></foreignObject><text x="1160" y="794" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Redis / RQ...</text></switch></g><path d="M 845 670 L 845 753.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 845 758.88 L 841.5 751.88 L 845 753.63 L 848.5 751.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="785" y="910" width="120" height="80" rx="12" ry="12" fill="#ffffff" stroke="#000000" pointer-events="all"/><rect x="787" y="912" width="116" height="76" rx="11.4" ry="11.4" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 114px; height: 1px; padding-top: 950px; margin-left: 788px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">qmk_complier</div></div></div></foreignObject><text x="845" y="954" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">qmk_complier</text></switch></g><rect x="1060" y="915" width="200" height="70" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 950px; margin-left: 1061px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">QMK Compiler<br />Job Runners<br />Source: qmk/qmk_compiler<br />Host: Rancher on DO VM's</div></div></div></foreignObject><text x="1160" y="954" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">QMK Compiler...</text></switch></g><path d="M 845 820 L 845 903.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 845 908.88 L 841.5 901.88 L 845 903.63 L 848.5 901.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 779.03 925.64 L 529.38 833.46 Q 520 830 520 820 L 520 303.77" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 783.95 927.46 L 776.17 928.32 L 779.03 925.64 L 778.6 921.75 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 520 298.52 L 523.5 305.52 L 520 303.77 L 516.5 305.52 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 905 950 L 1060 950" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg> \ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1261px" height="991px" viewBox="-0.5 -0.5 1261 991" style="background-color: rgb(255, 255, 255);"><defs/><g><path d="M 885.2 40 L 1060 40" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><image x="804.7" y="-0.5" width="80" height="80" xlink:href="data:image/png;base64,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"/><path d="M 845.33 302.4 C 815.12 302.4 794 277.79 794 251.59 C 794 220.27 819.22 200 845.71 200 C 871.22 200 896.4 220.93 896.4 251.18 C 896.4 278.28 874.84 302.4 845.33 302.4 Z" fill="#0d2636" stroke="none" pointer-events="all"/><path d="M 834.25 291.19 C 834.25 293.4 832.57 294.32 830.06 293.46 C 814.91 288.15 800.34 271.75 800.34 251.27 C 800.34 223.57 824.03 206.1 844.57 206.1 C 871.22 206.1 890.18 227.94 890.18 251 C 890.18 270.03 877.94 287.54 859.59 293.69 C 857.52 294.24 856.23 293.13 856.23 291.31 L 856.23 277.98 C 856.23 275.4 855.18 272.65 853.24 270.74 C 860.69 269.89 865.21 268.02 868.67 264.46 C 872.07 261.08 873.6 256.13 873.88 250.01 C 874.07 245.15 872.77 240.41 869.25 236.8 C 870.48 233.82 870.69 229.86 868.83 224.97 C 865.14 224.69 860.94 226.9 856.64 229.56 C 849.08 227.59 841.52 227.33 833.96 229.67 C 830.58 227.47 827.51 225 821.65 224.97 C 820.1 229.29 819.86 233.23 821.19 236.72 C 817 241.37 816.52 245.93 816.6 250.47 C 817.06 259.25 820.27 263.68 823.83 266.33 C 826.79 268.52 830.94 269.9 837.27 270.83 C 835.57 272.51 834.62 274.51 834.46 276.86 C 830.74 278.56 825.42 279.41 821.78 274.25 C 820.15 271.66 817.93 268.73 813.72 268.74 C 813.03 268.72 812.35 268.98 812.25 269.28 C 812.15 269.61 812.54 270.3 813.01 270.57 C 816.7 272.92 817.29 274.23 818.8 277.44 C 820.2 281.19 822.62 282.63 825.24 283.64 C 827.92 284.59 832.25 284.32 834.25 283.64 Z" fill="#ffffff" stroke="none" pointer-events="all"/><path d="M 845.2 193.63 L 845.2 86.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 845.2 198.88 L 841.7 191.88 L 845.2 193.63 L 848.7 191.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 845.2 81.12 L 848.7 88.12 L 845.2 86.37 L 841.7 88.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="1060" y="10" width="200" height="60" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 40px; margin-left: 1061px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; background-color: white; white-space: normal; word-wrap: normal; ">Clients Supported:<br />Chrome, Firefox<br />Desktop Only</div></div></div></foreignObject><text x="1160" y="44" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Clients Supported:...</text></switch></g><rect x="1060" y="206.2" width="200" height="90" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 251px; margin-left: 1061px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><span>https://config.qmk.fm</span><br /><span>Single Page Site<br /></span>JavaScript/VUE<br />Source: qmk/qmk_configurator<br /><span>Host: Github Pages</span></div></div></div></foreignObject><text x="1160" y="255" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">https://config.qmk.fm...</text></switch></g><path d="M 896.4 251.2 L 1060 251.2" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 880 457.9 L 1060 457.9" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 833.22 495.8 C 828.16 495.8 821.72 491.64 821.72 483.75 L 821.72 475.34 L 813.15 475.34 C 811.65 475.34 810 474.49 810.03 471.92 L 810.03 455.36 C 810.03 453.81 810.93 452.17 812.91 452.12 L 821.72 452.12 L 821.72 431.37 C 821.72 425.69 826.62 420 833.69 420 L 856.49 420 C 858.53 420 861.18 421.45 863.72 423.93 L 876.39 436.67 C 879.49 440.04 880 441.77 880 443.93 L 880 484.09 C 880 490.1 875.34 495.8 867.72 495.8 Z" fill="#000000" stroke="none" pointer-events="all"/><path d="M 850.47 469.58 L 850.47 457.06 L 854.43 457.06 L 858.82 463.99 L 858.82 457.06 L 861.89 457.06 L 861.89 469.58 L 858.67 469.58 L 853.58 461.29 L 853.58 469.58 Z M 844.7 463.4 C 844.69 461.89 844.28 459.4 841.65 459.33 C 839.7 459.3 838.71 461.33 838.71 463.26 C 838.77 466.2 840.13 467.37 841.74 467.37 C 843.53 467.33 844.68 465.87 844.7 463.4 Z M 835.26 462.55 C 835.34 459.28 837.91 457.1 840.4 456.87 C 843.13 456.63 844.5 457.13 845.74 457.91 C 847.41 459.11 848.53 461.32 848.06 464.79 C 847.61 467.23 846.07 469.6 842.36 469.85 C 841 469.92 838.36 469.99 836.56 467.58 C 835.73 466.38 835.22 465.51 835.26 462.55 Z M 823.19 465.77 L 823.65 465.72 C 825.75 467.29 827.29 467.4 828.78 467.35 C 829.66 467.23 830.41 467.01 830.47 466.24 C 830.51 465.69 829.93 465.31 829.36 465.17 C 827.6 464.71 826.16 464.86 824.34 463.46 C 822.89 462.1 822.96 460.46 823.66 459.16 C 824.9 457.24 827.05 456.94 828.36 456.83 C 830.57 456.81 832.33 457.19 833.44 457.73 L 833.43 460.67 L 832.94 460.71 C 831.93 459.92 830.82 459.41 829.27 459.32 C 828.41 459.31 827.38 459.3 826.76 460 C 826.43 461.17 827.29 461.25 828.04 461.42 C 830.02 461.87 831.13 461.99 832.65 462.95 C 834.58 464.43 833.97 466.96 832.96 468.1 C 831.63 469.39 830.35 469.86 827.92 469.85 C 826.52 469.83 824.81 469.63 823.17 468.83 Z M 813.29 466.83 C 814.07 467.09 814.63 467.45 816.44 467.23 C 817.09 467.05 817.76 466.56 817.76 465.57 L 817.76 459.51 L 814.91 459.51 L 814.91 457.06 L 821.13 457.06 L 821.13 466.31 C 820.87 468.24 819.78 469.26 818.09 469.59 C 816.91 469.84 815.53 469.98 813.29 469.57 Z M 827.52 475.34 L 862.48 475.34 C 864.3 475.34 865.44 473.93 865.44 472.17 L 865.44 455.09 C 865.44 453.39 864.22 452.12 862.32 452.12 L 827.52 452.12 L 827.52 431.76 C 827.52 427.61 830.96 425.79 833.33 425.79 L 854.21 425.79 C 856.33 425.79 856.7 428.23 856.7 429.52 L 856.71 440.31 C 856.71 442.3 858.38 443.31 859.64 443.31 L 870.53 443.31 C 872.02 443.31 874.24 443.77 874.24 446.39 L 874.24 483.83 C 874.24 487.16 872.07 489.95 868.16 489.95 L 833.53 489.95 C 830.7 489.95 827.52 487.95 827.52 483.92 Z" fill="#ffffff" stroke="none" pointer-events="all"/><rect x="1060" y="412.9" width="200" height="90" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 458px; margin-left: 1061px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">https://keyboards.qmk.fm<br />Keyboard Metadata<br />Source: qmk/qmk_firmware<br />GH Action: Update API Data<br />Host: DigitalOcean Spaces</div></div></div></foreignObject><text x="1160" y="462" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">https://keyboards.qmk.fm...</text></switch></g><path d="M 845.04 420 L 845.14 308.77" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 845.15 303.52 L 848.64 310.52 L 845.14 308.77 L 841.64 310.51 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 905 630 L 1060 630" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 815 610 C 791 610 785 630 804.2 634 C 785 642.8 806.6 662 822.2 654 C 833 670 869 670 881 654 C 905 654 905 638 890 630 C 905 614 881 598 860 606 C 845 594 821 594 815 610 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 630px; margin-left: 786px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">QMK API</div></div></div></foreignObject><text x="845" y="634" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">QMK API</text></switch></g><rect x="1060" y="595" width="200" height="70" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 630px; margin-left: 1061px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">https://api.qmk.fm<br />RESTful API<br />Source: qmk/qmk_api<br />Host: Rancher on DO VM's</div></div></div></foreignObject><text x="1160" y="634" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">https://api.qmk.fm...</text></switch></g><path d="M 794 275.46 L 709.04 315.72 Q 700 320 700 330 L 700 570 Q 700 580 709.45 583.26 L 785.69 609.55" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 790.65 611.26 L 782.89 612.29 L 785.69 609.55 L 785.17 605.67 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 460 251.8 L 290 251.8" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 490 229 C 466 229 460 251.8 479.2 256.36 C 460 266.39 481.6 288.28 497.2 279.16 C 508 297.4 544 297.4 556 279.16 C 580 279.16 580 260.92 565 251.8 C 580 233.56 556 215.32 535 224.44 C 520 210.76 496 210.76 490 229 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 252px; margin-left: 461px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Digital Ocean<br />Spaces<br />(S3)</div></div></div></foreignObject><text x="520" y="255" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Digital Ocean...</text></switch></g><rect x="0" y="221.8" width="290" height="60" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 288px; height: 1px; padding-top: 252px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">https://qmk-api.nyc3.cdn.digitaloceanspaces.com<br />Space: qmk-api<br />Host: Digital Ocean</div></div></div></foreignObject><text x="145" y="255" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">https://qmk-api.nyc3.cdn.digitaloceanspaces.com...</text></switch></g><path d="M 580 251.8 L 787.63 251.31" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 792.88 251.3 L 785.89 254.81 L 787.63 251.31 L 785.87 247.81 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 875 790 L 1060 790" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/><path d="M 815 768 C 815 757.33 875 757.33 875 768 L 875 812 C 875 822.67 815 822.67 815 812 Z" fill="#ffffff" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 815 768 C 815 776 875 776 875 768 M 815 772 C 815 780 875 780 875 772 M 815 776 C 815 784 875 784 875 776" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 58px; height: 1px; padding-top: 800px; margin-left: 816px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">RQ</div></div></div></foreignObject><text x="845" y="804" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">RQ</text></switch></g><rect x="1060" y="755" width="200" height="70" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 790px; margin-left: 1061px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">Redis / RQ<br />Job Queue<br />Source: qmk/qmk_redis<br />Host: Rancher on DO VM's</div></div></div></foreignObject><text x="1160" y="794" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">Redis / RQ...</text></switch></g><path d="M 845 670 L 845 753.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 845 758.88 L 841.5 751.88 L 845 753.63 L 848.5 751.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><rect x="785" y="910" width="120" height="80" rx="12" ry="12" fill="#ffffff" stroke="#000000" pointer-events="all"/><rect x="787" y="912" width="116" height="76" rx="11.4" ry="11.4" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 114px; height: 1px; padding-top: 950px; margin-left: 788px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">qmk_complier</div></div></div></foreignObject><text x="845" y="954" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">qmk_complier</text></switch></g><rect x="1060" y="915" width="200" height="70" fill="#ffffff" stroke="#000000" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 198px; height: 1px; padding-top: 950px; margin-left: 1061px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">QMK Compiler<br />Job Runners<br />Source: qmk/qmk_compiler<br />Host: Rancher on DO VM's</div></div></div></foreignObject><text x="1160" y="954" fill="#000000" font-family="Helvetica" font-size="12px" text-anchor="middle">QMK Compiler...</text></switch></g><path d="M 845 820 L 845 903.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 845 908.88 L 841.5 901.88 L 845 903.63 L 848.5 901.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 779.03 925.64 L 529.38 833.46 Q 520 830 520 820 L 520 303.77" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 783.95 927.46 L 776.17 928.32 L 779.03 925.64 L 778.6 921.75 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 520 298.52 L 523.5 305.52 L 520 303.77 L 516.5 305.52 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all"/><path d="M 905 950 L 1060 950" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke"/></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Viewer does not support full SVG 1.1</text></a></switch></svg>
diff --git a/docs/drivers/battery.md b/docs/drivers/battery.md
new file mode 100644
index 0000000000..b1f75c1156
--- /dev/null
+++ b/docs/drivers/battery.md
@@ -0,0 +1,51 @@
+# Battery Driver
+
+This driver provides support for sampling battery level.
+
+## Usage
+
+To use this driver, add the following to your `rules.mk`:
+
+```make
+BATTERY_DRIVER_REQUIRED = yes
+```
+
+## Basic Configuration {#basic-configuration}
+
+Add the following to your `config.h`:
+
+|Define |Default |Description |
+|--------------------------|--------|--------------------------------------------------|
+|`BATTERY_SAMPLE_INTERVAL` |`30000` |The time between battery samples in milliseconds. |
+
+## Driver Configuration {#driver-configuration}
+
+Driver selection can be configured in `rules.mk` as `BATTERY_DRIVER`. Valid values are `adc` (default), `vendor`, or `custom`. See below for information on individual drivers.
+
+### ADC Driver {#adc-driver}
+
+This is the default battery driver. The default configuration assumes the battery is connected to a ADC capable pin through a voltage divider.
+
+```make
+BATTERY_DRIVER = adc
+```
+
+The following `#define`s apply only to the `adc` driver:
+
+|Define |Default |Description |
+|-----------------------------|--------------|--------------------------------------------------------------|
+|`BATTERY_PIN` |*Not defined* |The GPIO pin connected to the voltage divider. |
+|`BATTERY_REF_VOLTAGE_MV` |`3300` |The ADC reverence voltage, in millivolts. |
+|`BATTERY_VOLTAGE_DIVIDER_R1` |`100000` |The voltage divider resistance, in kOhm. Set to 0 to disable. |
+|`BATTERY_VOLTAGE_DIVIDER_R1` |`100000` |The voltage divider resistance, in kOhm. Set to 0 to disable. |
+|`BATTERY_ADC_RESOLUTION` |`10` |The ADC resolution configured for the ADC Driver. |
+
+## Functions
+
+### `uint8_t battery_get_percent(void)` {#api-battery-get-percent}
+
+Sample battery level.
+
+#### Return Value {#api-battery-get-percent-return}
+
+The battery percentage, in the range 0-100.
diff --git a/docs/faq_debug.md b/docs/faq_debug.md
index 35a4160e27..269049afb8 100644
--- a/docs/faq_debug.md
+++ b/docs/faq_debug.md
@@ -77,6 +77,17 @@ KL: kc: 172, col: 2, row: 0, pressed: 1, time: 16303, int: 0, count: 0
KL: kc: 172, col: 2, row: 0, pressed: 0, time: 16411, int: 0, count: 0
```
+### Which keycode is this keypress?
+
+Keycodes are logged in the example above as numerical codes, which may be difficult to interpret. For more readable logging, add `KEYCODE_STRING_ENABLE = yes` in your `rules.mk` and use `get_keycode_string(kc)`. For example:
+
+```c
+uprintf("kc: %s\n", get_keycode_string(keycode));
+```
+
+This logs the keycode as a human-readable string like "`LT(2,KC_D)`" rather than a numerical code like "`0x4207`." See the [Keycode String](unit_testing#keycode-string) section of the Unit Testing page for more information.
+
+
### How long did it take to scan for a keypress?
When testing performance issues, it can be useful to know the frequency at which the switch matrix is being scanned. To enable logging for this scenario, add the following code to your keymaps `config.h`
diff --git a/docs/features/community_modules.md b/docs/features/community_modules.md
index a28c5afaeb..52526c9fe8 100644
--- a/docs/features/community_modules.md
+++ b/docs/features/community_modules.md
@@ -72,6 +72,7 @@ A Community Module is denoted by a `qmk_module.json` file such as the following:
{
"module_name": "Hello World",
"maintainer": "QMK Maintainers",
+ "license": "GPL-2.0-or-later",
"features": {
"deferred_exec": true
},
@@ -86,6 +87,10 @@ A Community Module is denoted by a `qmk_module.json` file such as the following:
At minimum, the module must provide the `module_name` and `maintainer` fields.
+The `license` field is encouraged to indicate the terms for using and sharing the module. It is recommended to use a [SPDX license identifier](https://spdx.org/licenses/) like "`Apache-2.0`" or "`GPL-2.0-or-later`" if possible.
+
+The `url` field may specify a URL to more information about the module.
+
The use of `features` matches the definition normally provided within `keyboard.json` and `info.json`, allowing a module to signal to the build system that it has its own dependencies. In the example above, it enables the _deferred executor_ feature whenever the above module is used in a build.
The `keycodes` array allows a module to provide new keycodes (as well as corresponding aliases) to a keymap.
diff --git a/docs/public/badge-community-dark.svg b/docs/public/badge-community-dark.svg
index dba561dda1..5236cf1696 100644
--- a/docs/public/badge-community-dark.svg
+++ b/docs/public/badge-community-dark.svg
@@ -1 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 1260 371" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"><rect id="badge.-community.-dark" x="0" y="0.321" width="1260" height="370" style="fill:none;"/><clipPath id="_clip1"><rect x="0" y="0.321" width="1260" height="370"/></clipPath><g clip-path="url(#_clip1)"><path d="M1260,33.621c0,-18.379 -14.921,-33.3 -33.3,-33.3l-1193.4,0c-18.379,0 -33.3,14.921 -33.3,33.3l0,303.4c0,18.378 14.921,33.3 33.3,33.3l1193.4,0c18.379,0 33.3,-14.922 33.3,-33.3l0,-303.4Z" style="fill:#333;"/><path d="M118.018,302.021l-6.434,0c-1.775,0 -3.217,-1.441 -3.217,-3.217l0,-20.679l-4.548,0c-15.366,0 -27.841,-12.475 -27.841,-27.841l0,-4.548l-20.679,0c-1.776,0 -3.217,-1.442 -3.217,-3.217l0,-6.434c0,-1.775 1.441,-3.217 3.217,-3.217l20.679,0l0,-14.123l-20.679,0c-1.776,0 -3.217,-1.441 -3.217,-3.217l0,-6.434c0,-1.775 1.441,-3.217 3.217,-3.217l20.679,0l0,-14.123l-20.679,0c-1.776,0 -3.217,-1.441 -3.217,-3.216l0,-6.434c0,-1.776 1.441,-3.217 3.217,-3.217l20.679,0l0,-14.123l-20.679,0c-1.776,0 -3.217,-1.442 -3.217,-3.217l0,-6.434c0,-1.775 1.441,-3.217 3.217,-3.217l20.679,0l0,-14.123l-20.679,0c-1.776,0 -3.217,-1.441 -3.217,-3.217l0,-6.434c0,-1.775 1.441,-3.216 3.217,-3.217l20.679,0l0,-4.548c0,-15.366 12.475,-27.841 27.841,-27.841l4.548,0l0,-20.679c0,-1.776 1.442,-3.217 3.217,-3.217l6.434,0c1.776,0 3.217,1.441 3.217,3.217l0,20.679l14.123,0l0,-20.679c0,-1.776 1.441,-3.217 3.217,-3.217l6.434,0c1.775,0 3.217,1.441 3.217,3.217l0,20.679l14.123,0l0,-20.679c0,-1.776 1.441,-3.217 3.217,-3.217l6.433,0c1.776,0 3.217,1.441 3.217,3.217l0,20.679l14.123,0l0,-20.679c0,-1.776 1.442,-3.217 3.217,-3.217l6.434,0c1.776,0 3.217,1.441 3.217,3.217l0,20.679l14.123,0l0,-20.679c0,-1.776 1.441,-3.217 3.217,-3.217l6.434,0c1.775,0 3.217,1.441 3.217,3.217l0,20.679l4.548,0c15.366,0 27.841,12.475 27.841,27.841l0,4.548l20.679,0c1.776,0.001 3.217,1.442 3.217,3.217l0,6.434c0,1.775 -1.441,3.217 -3.217,3.217l-20.679,0l0,14.123l20.679,0c1.776,0.001 3.217,1.442 3.217,3.217l0,6.434c0,1.775 -1.441,3.216 -3.217,3.217l-20.679,0l0,14.123l20.679,0c1.776,0 3.217,1.442 3.217,3.217l0,6.434c0,1.775 -1.441,3.216 -3.217,3.216l-20.679,0l0,14.123l20.679,0c1.776,0.001 3.217,1.442 3.217,3.217l0,6.434c0,1.775 -1.441,3.217 -3.217,3.217l-20.679,0l0,14.123l20.679,0c1.776,0.001 3.217,1.442 3.217,3.217l0,6.434c0,1.775 -1.441,3.216 -3.217,3.217l-20.679,0l0,4.548c0,15.366 -12.475,27.841 -27.841,27.841l-4.548,0l0,20.679c0,1.776 -1.441,3.217 -3.217,3.217l-6.434,0c-1.776,0 -3.217,-1.441 -3.217,-3.217l0,-20.679l-14.123,0l0,20.679c0,1.776 -1.441,3.217 -3.217,3.217l-6.434,0c-1.775,0 -3.217,-1.441 -3.217,-3.217l0,-20.679l-14.123,0l0,20.679c0,1.776 -1.441,3.217 -3.217,3.217l-6.433,0c-1.776,0 -3.217,-1.441 -3.217,-3.217l0,-20.679l-14.123,0l0,20.679c0,1.776 -1.441,3.217 -3.217,3.217l-6.434,0c-1.775,0 -3.217,-1.441 -3.217,-3.217l0,-20.679l-14.123,0l0,20.679c0,1.776 -1.441,3.217 -3.217,3.217Zm103.74,-127.253c0,6.774 -1.062,12.845 -3.187,18.213c-2.124,5.368 -5.152,9.946 -9.085,13.735c-3.932,3.789 -8.697,6.717 -14.295,8.784c-5.597,2.067 -11.927,3.186 -18.988,3.359l0,20.581c0,0.459 -0.115,0.861 -0.345,1.206c-0.229,0.344 -0.631,0.617 -1.205,0.818c-0.574,0.201 -1.335,0.358 -2.282,0.473c-0.947,0.115 -2.139,0.173 -3.574,0.173c-1.435,0 -2.626,-0.058 -3.574,-0.173c-0.947,-0.115 -1.693,-0.272 -2.239,-0.473c-0.545,-0.201 -0.947,-0.474 -1.205,-0.818c-0.259,-0.345 -0.388,-0.747 -0.388,-1.206l0,-20.581c-7.176,-0.173 -13.577,-1.206 -19.203,-3.101c-5.627,-1.894 -10.392,-4.635 -14.295,-8.224c-3.904,-3.588 -6.89,-7.994 -8.956,-13.218c-2.067,-5.224 -3.101,-11.224 -3.101,-17.998l0,-44.005c0,-0.402 0.13,-0.775 0.388,-1.119c0.258,-0.345 0.66,-0.632 1.206,-0.861c0.545,-0.23 1.291,-0.402 2.239,-0.517c0.947,-0.115 2.138,-0.172 3.573,-0.172c1.436,0 2.627,0.057 3.574,0.172c0.947,0.115 1.708,0.287 2.282,0.517c0.574,0.229 0.976,0.516 1.206,0.861c0.229,0.344 0.344,0.717 0.344,1.119l0,42.713c0,4.765 0.632,9.057 1.895,12.874c1.263,3.818 3.157,7.062 5.683,9.731c2.526,2.67 5.727,4.737 9.602,6.201c3.875,1.463 8.396,2.253 13.563,2.368l0,-73.887c0,-0.402 0.129,-0.775 0.388,-1.119c0.258,-0.345 0.689,-0.632 1.291,-0.861c0.603,-0.23 1.378,-0.402 2.326,-0.517c0.947,-0.115 2.081,-0.172 3.401,-0.172c1.435,0 2.627,0.057 3.574,0.172c0.947,0.115 1.708,0.287 2.282,0.517c0.574,0.229 0.976,0.516 1.205,0.861c0.23,0.344 0.345,0.717 0.345,1.119l0,73.887c5.167,-0.058 9.673,-0.847 13.52,-2.368c3.846,-1.522 7.047,-3.617 9.602,-6.287c2.554,-2.669 4.478,-5.884 5.769,-9.645c1.292,-3.76 1.938,-7.937 1.938,-12.529l0,-43.058c0,-0.402 0.115,-0.775 0.344,-1.119c0.23,-0.345 0.632,-0.632 1.206,-0.861c0.574,-0.23 1.321,-0.402 2.239,-0.517c0.919,-0.115 2.124,-0.172 3.617,-0.172c1.378,0 2.54,0.057 3.488,0.172c0.947,0.115 1.693,0.287 2.239,0.517c0.545,0.229 0.947,0.516 1.205,0.861c0.258,0.344 0.388,0.717 0.388,1.119l0,42.455Z" style="fill:#fff;"/><path d="M426.392,189.328c0,1.077 -0.059,1.978 -0.176,2.704c-0.117,0.726 -0.293,1.288 -0.527,1.686c-0.234,0.398 -0.491,0.668 -0.772,0.808c-0.281,0.141 -0.563,0.211 -0.844,0.211c-0.936,0 -2.447,-0.386 -4.531,-1.159c-2.084,-0.773 -4.484,-1.897 -7.201,-3.372c-2.716,-1.476 -5.62,-3.267 -8.711,-5.375c-3.092,-2.107 -6.089,-4.566 -8.993,-7.376c-2.295,1.405 -5.199,2.622 -8.711,3.653c-3.513,1.03 -7.588,1.545 -12.224,1.545c-6.839,0 -12.752,-1.007 -17.74,-3.021c-4.988,-2.013 -9.109,-4.964 -12.364,-8.851c-3.255,-3.888 -5.679,-8.724 -7.272,-14.508c-1.592,-5.784 -2.388,-12.423 -2.388,-19.917c0,-7.213 0.866,-13.734 2.599,-19.566c1.733,-5.831 4.333,-10.795 7.798,-14.893c3.466,-4.098 7.799,-7.26 12.997,-9.485c5.199,-2.224 11.264,-3.337 18.196,-3.337c6.51,0 12.236,1.007 17.177,3.021c4.941,2.014 9.086,4.953 12.435,8.817c3.349,3.864 5.866,8.63 7.552,14.297c1.686,5.667 2.529,12.177 2.529,19.53c0,3.794 -0.222,7.424 -0.667,10.89c-0.445,3.466 -1.147,6.744 -2.108,9.835c-0.96,3.091 -2.166,5.948 -3.618,8.571c-1.452,2.623 -3.161,4.988 -5.128,7.096c3.419,2.81 6.416,5 8.992,6.569c2.576,1.569 4.707,2.751 6.393,3.547c1.687,0.797 2.998,1.37 3.935,1.722c0.936,0.351 1.639,0.749 2.107,1.194c0.469,0.445 0.796,1.077 0.984,1.897c0.187,0.819 0.281,1.908 0.281,3.267Zm-23.886,-53.745c0,-5.152 -0.457,-9.929 -1.37,-14.331c-0.914,-4.403 -2.436,-8.232 -4.567,-11.487c-2.131,-3.255 -4.976,-5.796 -8.536,-7.622c-3.559,-1.827 -7.962,-2.74 -13.207,-2.74c-5.246,0 -9.649,0.972 -13.208,2.915c-3.56,1.944 -6.452,4.567 -8.676,7.869c-2.225,3.302 -3.818,7.13 -4.778,11.486c-0.96,4.356 -1.44,8.969 -1.44,13.84c0,5.339 0.445,10.245 1.335,14.718c0.89,4.473 2.389,8.349 4.496,11.627c2.108,3.279 4.93,5.82 8.466,7.623c3.536,1.803 7.974,2.705 13.313,2.705c5.292,0 9.742,-0.984 13.348,-2.951c3.606,-1.967 6.51,-4.625 8.711,-7.974c2.202,-3.349 3.771,-7.236 4.707,-11.662c0.937,-4.426 1.406,-9.098 1.406,-14.016Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M534.723,179.492c0,0.375 -0.096,0.703 -0.289,0.984c-0.193,0.281 -0.531,0.503 -1.013,0.667c-0.483,0.164 -1.098,0.304 -1.846,0.421c-0.747,0.118 -1.724,0.176 -2.93,0.176c-1.109,0 -2.062,-0.058 -2.858,-0.176c-0.796,-0.117 -1.423,-0.257 -1.881,-0.421c-0.459,-0.164 -0.784,-0.386 -0.977,-0.667c-0.193,-0.281 -0.289,-0.609 -0.289,-0.984l0,-79.176l-0.141,0l-32.036,79.527c-0.14,0.328 -0.339,0.609 -0.597,0.843c-0.257,0.234 -0.632,0.434 -1.124,0.597c-0.492,0.164 -1.077,0.281 -1.756,0.352c-0.679,0.07 -1.487,0.105 -2.424,0.105c-0.984,0 -1.827,-0.047 -2.529,-0.14c-0.703,-0.094 -1.288,-0.223 -1.756,-0.387c-0.469,-0.164 -0.832,-0.363 -1.089,-0.597c-0.258,-0.234 -0.434,-0.492 -0.527,-0.773l-30.631,-79.527l-0.07,0l0,79.176c0,0.375 -0.097,0.703 -0.289,0.984c-0.193,0.281 -0.531,0.503 -1.014,0.667c-0.482,0.164 -1.109,0.304 -1.881,0.421c-0.772,0.118 -1.761,0.176 -2.967,0.176c-1.157,0 -2.122,-0.058 -2.894,-0.176c-0.772,-0.117 -1.387,-0.257 -1.845,-0.421c-0.459,-0.164 -0.772,-0.386 -0.941,-0.667c-0.169,-0.281 -0.253,-0.609 -0.253,-0.984l0,-83.602c0,-1.967 0.523,-3.372 1.569,-4.215c1.046,-0.843 2.212,-1.265 3.496,-1.265l7.419,0c1.522,0 2.853,0.141 3.995,0.422c1.142,0.281 2.14,0.726 2.996,1.335c0.856,0.608 1.569,1.381 2.14,2.318c0.571,0.937 1.07,2.037 1.499,3.302l25.994,65.828l0.351,0l27.047,-65.617c0.524,-1.405 1.095,-2.6 1.713,-3.583c0.619,-0.984 1.297,-1.768 2.035,-2.354c0.738,-0.585 1.558,-1.007 2.462,-1.264c0.904,-0.258 1.951,-0.387 3.141,-0.387l7.779,0c0.715,0 1.393,0.106 2.035,0.316c0.642,0.211 1.189,0.539 1.642,0.984c0.452,0.445 0.821,1.007 1.106,1.686c0.285,0.679 0.428,1.51 0.428,2.494l0,83.602Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M618.185,179.351c0,0.375 -0.082,0.715 -0.246,1.019c-0.164,0.305 -0.48,0.55 -0.949,0.738c-0.468,0.187 -1.1,0.339 -1.896,0.456c-0.797,0.118 -1.827,0.176 -3.092,0.176c-1.639,0 -2.974,-0.07 -4.004,-0.211c-1.031,-0.14 -1.803,-0.398 -2.318,-0.772c-0.516,-0.375 -0.937,-0.797 -1.265,-1.265l-33.441,-45.454l0,45.454c0,0.328 -0.094,0.644 -0.281,0.948c-0.187,0.305 -0.515,0.539 -0.983,0.703c-0.469,0.164 -1.089,0.304 -1.862,0.421c-0.773,0.118 -1.745,0.176 -2.916,0.176c-1.124,0 -2.084,-0.058 -2.88,-0.176c-0.796,-0.117 -1.429,-0.257 -1.897,-0.421c-0.468,-0.164 -0.796,-0.398 -0.983,-0.703c-0.188,-0.304 -0.282,-0.62 -0.282,-0.948l0,-87.255c0,-0.375 0.094,-0.703 0.282,-0.984c0.187,-0.281 0.515,-0.503 0.983,-0.667c0.468,-0.164 1.101,-0.305 1.897,-0.422c0.796,-0.117 1.756,-0.175 2.88,-0.175c1.171,0 2.143,0.058 2.916,0.175c0.773,0.117 1.393,0.258 1.862,0.422c0.468,0.164 0.796,0.386 0.983,0.667c0.187,0.281 0.281,0.609 0.281,0.984l0,40.396l32.176,-40.396c0.281,-0.422 0.609,-0.773 0.984,-1.054c0.375,-0.281 0.831,-0.504 1.37,-0.667c0.538,-0.164 1.194,-0.293 1.967,-0.387c0.773,-0.094 1.768,-0.14 2.986,-0.14c1.218,0 2.201,0.058 2.95,0.175c0.75,0.117 1.347,0.27 1.792,0.457c0.445,0.187 0.749,0.421 0.913,0.702c0.164,0.282 0.246,0.586 0.246,0.914c0,0.609 -0.152,1.218 -0.457,1.826c-0.304,0.609 -0.878,1.452 -1.721,2.53l-30.139,36.04l32.458,43.136c0.796,1.217 1.276,2.049 1.44,2.494c0.164,0.444 0.246,0.807 0.246,1.088Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M713.941,95.609c0,0.89 -0.047,1.663 -0.141,2.318c-0.094,0.656 -0.258,1.183 -0.492,1.581c-0.234,0.398 -0.503,0.691 -0.808,0.878c-0.304,0.188 -0.62,0.281 -0.948,0.281l-33.3,0l0,30.912l31.473,0c0.328,0 0.644,0.082 0.949,0.246c0.304,0.164 0.574,0.433 0.808,0.808c0.234,0.374 0.398,0.878 0.491,1.51c0.094,0.632 0.141,1.44 0.141,2.424c0,0.89 -0.047,1.651 -0.141,2.283c-0.093,0.632 -0.257,1.148 -0.491,1.546c-0.234,0.398 -0.504,0.702 -0.808,0.913c-0.305,0.211 -0.621,0.316 -0.949,0.316l-31.473,0l0,37.867c0,0.328 -0.094,0.644 -0.281,0.948c-0.188,0.305 -0.516,0.539 -0.984,0.703c-0.468,0.164 -1.077,0.304 -1.826,0.421c-0.75,0.118 -1.733,0.176 -2.951,0.176c-1.124,0 -2.084,-0.058 -2.881,-0.176c-0.796,-0.117 -1.428,-0.257 -1.896,-0.421c-0.469,-0.164 -0.797,-0.398 -0.984,-0.703c-0.187,-0.304 -0.281,-0.62 -0.281,-0.948l0,-84.164c0,-1.827 0.48,-3.103 1.44,-3.829c0.96,-0.726 1.979,-1.089 3.056,-1.089l40.888,0c0.328,0 0.644,0.094 0.948,0.281c0.305,0.188 0.574,0.492 0.808,0.914c0.234,0.421 0.398,0.971 0.492,1.65c0.094,0.68 0.141,1.464 0.141,2.354Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M742.534,179.562c0,0.375 -0.094,0.691 -0.281,0.949c-0.187,0.257 -0.492,0.48 -0.913,0.667c-0.422,0.187 -1.007,0.328 -1.757,0.422c-0.749,0.093 -1.709,0.14 -2.88,0.14c-1.124,0 -2.061,-0.047 -2.81,-0.14c-0.75,-0.094 -1.347,-0.235 -1.792,-0.422c-0.445,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.328 0.082,-0.632 0.246,-0.913c0.164,-0.281 0.468,-0.516 0.913,-0.703c0.445,-0.187 1.042,-0.328 1.792,-0.422c0.749,-0.093 1.686,-0.14 2.81,-0.14c1.171,0 2.131,0.047 2.88,0.14c0.75,0.094 1.335,0.235 1.757,0.422c0.421,0.187 0.726,0.422 0.913,0.703c0.187,0.281 0.281,0.585 0.281,0.913l0,63.228Zm1.335,-84.585c0,2.716 -0.515,4.566 -1.546,5.55c-1.03,0.983 -2.927,1.475 -5.69,1.475c-2.717,0 -4.579,-0.48 -5.586,-1.44c-1.007,-0.96 -1.51,-2.775 -1.51,-5.445c0,-2.716 0.515,-4.566 1.546,-5.55c1.03,-0.983 2.927,-1.475 5.69,-1.475c2.717,0 4.578,0.48 5.585,1.44c1.007,0.96 1.511,2.775 1.511,5.445Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M800.915,120.479c0,1.03 -0.024,1.897 -0.07,2.599c-0.047,0.703 -0.141,1.253 -0.281,1.651c-0.141,0.398 -0.317,0.703 -0.527,0.913c-0.211,0.211 -0.504,0.317 -0.879,0.317c-0.374,0 -0.831,-0.106 -1.37,-0.317c-0.538,-0.21 -1.147,-0.421 -1.826,-0.632c-0.679,-0.211 -1.44,-0.41 -2.283,-0.597c-0.843,-0.187 -1.757,-0.281 -2.74,-0.281c-1.171,0 -2.319,0.234 -3.443,0.703c-1.124,0.468 -2.306,1.241 -3.548,2.318c-1.241,1.077 -2.54,2.506 -3.899,4.285c-1.358,1.78 -2.857,3.958 -4.496,6.534l0,41.59c0,0.375 -0.094,0.691 -0.281,0.949c-0.187,0.257 -0.492,0.48 -0.913,0.667c-0.422,0.187 -1.007,0.328 -1.756,0.422c-0.75,0.093 -1.71,0.14 -2.881,0.14c-1.124,0 -2.061,-0.047 -2.81,-0.14c-0.749,-0.094 -1.347,-0.235 -1.792,-0.422c-0.444,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.375 0.071,-0.691 0.211,-0.949c0.141,-0.257 0.422,-0.491 0.843,-0.702c0.422,-0.211 0.96,-0.351 1.616,-0.422c0.656,-0.07 1.522,-0.105 2.599,-0.105c1.031,0 1.885,0.035 2.565,0.105c0.679,0.071 1.206,0.211 1.58,0.422c0.375,0.211 0.644,0.445 0.808,0.702c0.164,0.258 0.246,0.574 0.246,0.949l0,9.203c1.733,-2.529 3.361,-4.59 4.883,-6.182c1.522,-1.593 2.962,-2.846 4.32,-3.759c1.359,-0.913 2.705,-1.545 4.04,-1.897c1.335,-0.351 2.681,-0.527 4.04,-0.527c0.608,0 1.299,0.036 2.072,0.106c0.773,0.07 1.581,0.199 2.424,0.386c0.843,0.188 1.604,0.398 2.283,0.632c0.679,0.235 1.159,0.469 1.44,0.703c0.281,0.234 0.469,0.457 0.562,0.667c0.094,0.211 0.176,0.48 0.246,0.808c0.07,0.328 0.117,0.808 0.141,1.441c0.023,0.632 0.035,1.487 0.035,2.564Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M907.911,179.562c0,0.375 -0.093,0.691 -0.281,0.949c-0.187,0.257 -0.491,0.48 -0.913,0.667c-0.422,0.187 -1.007,0.328 -1.756,0.422c-0.75,0.093 -1.686,0.14 -2.811,0.14c-1.17,0 -2.131,-0.047 -2.88,-0.14c-0.749,-0.094 -1.346,-0.235 -1.791,-0.422c-0.445,-0.187 -0.761,-0.41 -0.949,-0.667c-0.187,-0.258 -0.281,-0.574 -0.281,-0.949l0,-38.429c0,-2.669 -0.234,-5.105 -0.702,-7.306c-0.469,-2.201 -1.218,-4.098 -2.248,-5.691c-1.031,-1.592 -2.342,-2.81 -3.935,-3.653c-1.592,-0.843 -3.466,-1.264 -5.62,-1.264c-2.67,0 -5.351,1.03 -8.044,3.091c-2.693,2.061 -5.655,5.082 -8.887,9.063l0,44.189c0,0.375 -0.094,0.691 -0.281,0.949c-0.188,0.257 -0.504,0.48 -0.949,0.667c-0.445,0.187 -1.042,0.328 -1.791,0.422c-0.749,0.093 -1.686,0.14 -2.81,0.14c-1.077,0 -2.002,-0.047 -2.775,-0.14c-0.773,-0.094 -1.382,-0.235 -1.827,-0.422c-0.445,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-38.429c0,-2.669 -0.258,-5.105 -0.773,-7.306c-0.515,-2.201 -1.288,-4.098 -2.318,-5.691c-1.031,-1.592 -2.33,-2.81 -3.899,-3.653c-1.569,-0.843 -3.431,-1.264 -5.585,-1.264c-2.67,0 -5.363,1.03 -8.08,3.091c-2.716,2.061 -5.667,5.082 -8.852,9.063l0,44.189c0,0.375 -0.093,0.691 -0.281,0.949c-0.187,0.257 -0.491,0.48 -0.913,0.667c-0.421,0.187 -1.007,0.328 -1.756,0.422c-0.75,0.093 -1.71,0.14 -2.881,0.14c-1.124,0 -2.06,-0.047 -2.81,-0.14c-0.749,-0.094 -1.346,-0.235 -1.791,-0.422c-0.445,-0.187 -0.75,-0.41 -0.914,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.375 0.071,-0.691 0.211,-0.949c0.141,-0.257 0.422,-0.491 0.843,-0.702c0.422,-0.211 0.96,-0.351 1.616,-0.422c0.656,-0.07 1.522,-0.105 2.6,-0.105c1.03,0 1.885,0.035 2.564,0.105c0.679,0.071 1.206,0.211 1.581,0.422c0.374,0.211 0.643,0.445 0.807,0.702c0.164,0.258 0.246,0.574 0.246,0.949l0,8.36c3.56,-3.981 7.014,-6.897 10.363,-8.747c3.349,-1.85 6.732,-2.775 10.151,-2.775c2.623,0 4.977,0.305 7.061,0.914c2.084,0.609 3.922,1.463 5.515,2.564c1.592,1.101 2.951,2.412 4.075,3.934c1.124,1.522 2.06,3.22 2.81,5.094c2.107,-2.295 4.11,-4.239 6.006,-5.831c1.897,-1.593 3.724,-2.881 5.48,-3.864c1.757,-0.984 3.466,-1.698 5.129,-2.143c1.662,-0.445 3.337,-0.668 5.023,-0.668c4.075,0 7.494,0.715 10.257,2.143c2.763,1.429 5,3.337 6.709,5.726c1.71,2.388 2.927,5.187 3.653,8.395c0.726,3.208 1.089,6.592 1.089,10.152l0,39.974Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1016.52,116.193c0,0.328 -0.047,0.726 -0.141,1.195c-0.094,0.468 -0.257,1.053 -0.492,1.756l-18.617,60.067c-0.14,0.515 -0.363,0.937 -0.667,1.265c-0.305,0.327 -0.726,0.585 -1.265,0.772c-0.538,0.188 -1.276,0.316 -2.213,0.387c-0.937,0.07 -2.107,0.105 -3.513,0.105c-1.451,0 -2.669,-0.047 -3.653,-0.14c-0.983,-0.094 -1.768,-0.235 -2.353,-0.422c-0.586,-0.187 -1.019,-0.445 -1.3,-0.773c-0.281,-0.328 -0.492,-0.726 -0.632,-1.194l-13.278,-45.876l-0.141,-0.632l-0.14,0.632l-12.295,45.876c-0.14,0.515 -0.363,0.937 -0.667,1.265c-0.304,0.327 -0.761,0.585 -1.37,0.772c-0.609,0.188 -1.393,0.316 -2.353,0.387c-0.961,0.07 -2.143,0.105 -3.548,0.105c-1.452,0 -2.635,-0.047 -3.548,-0.14c-0.913,-0.094 -1.663,-0.235 -2.248,-0.422c-0.586,-0.187 -1.019,-0.445 -1.3,-0.773c-0.281,-0.328 -0.492,-0.726 -0.632,-1.194l-18.477,-60.067c-0.234,-0.703 -0.398,-1.288 -0.492,-1.756c-0.093,-0.469 -0.14,-0.867 -0.14,-1.195c0,-0.421 0.093,-0.761 0.281,-1.018c0.187,-0.258 0.503,-0.469 0.948,-0.633c0.445,-0.164 1.042,-0.269 1.792,-0.316c0.749,-0.047 1.662,-0.07 2.74,-0.07c1.311,0 2.365,0.035 3.161,0.105c0.796,0.071 1.405,0.188 1.827,0.352c0.421,0.164 0.726,0.398 0.913,0.702c0.187,0.305 0.351,0.668 0.492,1.089l15.245,52.128l0.14,0.633l0.141,-0.633l13.98,-52.128c0.094,-0.421 0.246,-0.784 0.457,-1.089c0.211,-0.304 0.527,-0.538 0.948,-0.702c0.422,-0.164 0.996,-0.281 1.722,-0.352c0.726,-0.07 1.674,-0.105 2.845,-0.105c1.124,0 2.049,0.035 2.775,0.105c0.726,0.071 1.3,0.188 1.721,0.352c0.422,0.164 0.726,0.386 0.913,0.667c0.188,0.281 0.328,0.609 0.422,0.984l15.104,52.268l0.141,0.633l0.07,-0.633l15.035,-52.128c0.093,-0.421 0.245,-0.784 0.456,-1.089c0.211,-0.304 0.539,-0.538 0.984,-0.702c0.445,-0.164 1.054,-0.281 1.826,-0.352c0.773,-0.07 1.768,-0.105 2.986,-0.105c1.124,0 2.026,0.023 2.705,0.07c0.679,0.047 1.218,0.164 1.616,0.351c0.398,0.188 0.679,0.399 0.843,0.633c0.164,0.234 0.246,0.562 0.246,0.983Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1076.94,179.632c0,0.563 -0.187,0.984 -0.562,1.265c-0.375,0.281 -0.89,0.492 -1.546,0.632c-0.655,0.141 -1.616,0.211 -2.88,0.211c-1.218,0 -2.19,-0.07 -2.916,-0.211c-0.726,-0.14 -1.252,-0.351 -1.58,-0.632c-0.328,-0.281 -0.492,-0.702 -0.492,-1.265l0,-6.322c-2.763,2.95 -5.843,5.245 -9.238,6.885c-3.396,1.639 -6.991,2.458 -10.784,2.458c-3.326,0 -6.335,-0.433 -9.028,-1.299c-2.693,-0.867 -4.988,-2.12 -6.885,-3.759c-1.897,-1.639 -3.372,-3.653 -4.426,-6.042c-1.054,-2.388 -1.581,-5.105 -1.581,-8.149c0,-3.56 0.726,-6.651 2.178,-9.274c1.452,-2.622 3.536,-4.8 6.253,-6.533c2.716,-1.733 6.042,-3.033 9.976,-3.899c3.934,-0.867 8.36,-1.3 13.278,-1.3l8.711,0l0,-4.918c0,-2.435 -0.257,-4.59 -0.772,-6.463c-0.516,-1.874 -1.347,-3.431 -2.495,-4.672c-1.147,-1.241 -2.634,-2.178 -4.461,-2.81c-1.826,-0.632 -4.074,-0.949 -6.744,-0.949c-2.857,0 -5.421,0.34 -7.693,1.019c-2.271,0.679 -4.262,1.429 -5.971,2.248c-1.71,0.82 -3.138,1.569 -4.286,2.248c-1.147,0.679 -2.002,1.019 -2.564,1.019c-0.375,0 -0.703,-0.094 -0.984,-0.281c-0.281,-0.187 -0.527,-0.468 -0.737,-0.843c-0.211,-0.375 -0.363,-0.855 -0.457,-1.44c-0.094,-0.586 -0.14,-1.23 -0.14,-1.932c0,-1.171 0.081,-2.096 0.245,-2.775c0.164,-0.679 0.562,-1.323 1.195,-1.932c0.632,-0.609 1.721,-1.323 3.267,-2.143c1.545,-0.82 3.325,-1.569 5.339,-2.248c2.014,-0.679 4.215,-1.241 6.604,-1.686c2.388,-0.445 4.8,-0.668 7.236,-0.668c4.543,0 8.407,0.516 11.592,1.546c3.185,1.03 5.761,2.541 7.728,4.531c1.967,1.991 3.395,4.461 4.285,7.412c0.89,2.951 1.335,6.393 1.335,10.327l0,42.644Zm-11.522,-28.874l-9.905,0c-3.185,0 -5.949,0.269 -8.29,0.808c-2.342,0.539 -4.286,1.335 -5.832,2.389c-1.545,1.054 -2.681,2.318 -3.407,3.793c-0.726,1.476 -1.089,3.174 -1.089,5.094c0,3.278 1.042,5.889 3.127,7.833c2.084,1.944 4.999,2.916 8.746,2.916c3.044,0 5.866,-0.773 8.466,-2.319c2.599,-1.545 5.327,-3.91 8.184,-7.095l0,-13.419Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1135.18,120.479c0,1.03 -0.023,1.897 -0.07,2.599c-0.047,0.703 -0.14,1.253 -0.281,1.651c-0.14,0.398 -0.316,0.703 -0.527,0.913c-0.211,0.211 -0.503,0.317 -0.878,0.317c-0.375,0 -0.831,-0.106 -1.37,-0.317c-0.539,-0.21 -1.147,-0.421 -1.827,-0.632c-0.679,-0.211 -1.44,-0.41 -2.283,-0.597c-0.843,-0.187 -1.756,-0.281 -2.74,-0.281c-1.171,0 -2.318,0.234 -3.442,0.703c-1.124,0.468 -2.307,1.241 -3.548,2.318c-1.241,1.077 -2.541,2.506 -3.899,4.285c-1.358,1.78 -2.857,3.958 -4.496,6.534l0,41.59c0,0.375 -0.094,0.691 -0.281,0.949c-0.188,0.257 -0.492,0.48 -0.914,0.667c-0.421,0.187 -1.007,0.328 -1.756,0.422c-0.749,0.093 -1.709,0.14 -2.88,0.14c-1.124,0 -2.061,-0.047 -2.811,-0.14c-0.749,-0.094 -1.346,-0.235 -1.791,-0.422c-0.445,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.375 0.07,-0.691 0.211,-0.949c0.14,-0.257 0.421,-0.491 0.843,-0.702c0.421,-0.211 0.96,-0.351 1.615,-0.422c0.656,-0.07 1.523,-0.105 2.6,-0.105c1.03,0 1.885,0.035 2.564,0.105c0.679,0.071 1.206,0.211 1.581,0.422c0.375,0.211 0.644,0.445 0.808,0.702c0.164,0.258 0.246,0.574 0.246,0.949l0,9.203c1.733,-2.529 3.36,-4.59 4.882,-6.182c1.522,-1.593 2.963,-2.846 4.321,-3.759c1.358,-0.913 2.705,-1.545 4.039,-1.897c1.335,-0.351 2.682,-0.527 4.04,-0.527c0.609,0 1.3,0.036 2.073,0.106c0.772,0.07 1.58,0.199 2.423,0.386c0.843,0.188 1.604,0.398 2.284,0.632c0.679,0.235 1.159,0.469 1.44,0.703c0.281,0.234 0.468,0.457 0.562,0.667c0.093,0.211 0.175,0.48 0.246,0.808c0.07,0.328 0.117,0.808 0.14,1.441c0.024,0.632 0.035,1.487 0.035,2.564Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1200.45,145.208c0,1.827 -0.459,3.126 -1.376,3.899c-0.917,0.773 -1.964,1.159 -3.141,1.159l-41.64,0c0,3.513 0.353,6.675 1.059,9.485c0.706,2.81 1.882,5.222 3.53,7.236c1.647,2.014 3.789,3.559 6.424,4.637c2.636,1.077 5.86,1.615 9.672,1.615c3.012,0 5.694,-0.245 8.047,-0.737c2.354,-0.492 4.389,-1.042 6.107,-1.651c1.718,-0.609 3.13,-1.159 4.236,-1.651c1.106,-0.492 1.942,-0.738 2.507,-0.738c0.329,0 0.623,0.082 0.882,0.246c0.259,0.164 0.458,0.41 0.6,0.738c0.141,0.328 0.247,0.784 0.317,1.37c0.071,0.585 0.106,1.299 0.106,2.142c0,0.609 -0.023,1.136 -0.07,1.581c-0.047,0.445 -0.105,0.843 -0.175,1.194c-0.071,0.352 -0.188,0.668 -0.352,0.949c-0.164,0.281 -0.374,0.55 -0.632,0.808c-0.258,0.257 -1.019,0.679 -2.283,1.264c-1.265,0.586 -2.904,1.16 -4.918,1.722c-2.014,0.562 -4.344,1.065 -6.99,1.51c-2.647,0.445 -5.468,0.667 -8.466,0.667c-5.199,0 -9.753,-0.726 -13.664,-2.177c-3.911,-1.452 -7.201,-3.607 -9.871,-6.464c-2.67,-2.857 -4.683,-6.44 -6.042,-10.749c-1.358,-4.309 -2.037,-9.32 -2.037,-15.034c0,-5.433 0.702,-10.316 2.108,-14.648c1.405,-4.332 3.43,-8.009 6.077,-11.03c2.646,-3.021 5.842,-5.339 9.589,-6.955c3.747,-1.616 7.939,-2.424 12.576,-2.424c4.964,0 9.191,0.797 12.68,2.389c3.49,1.592 6.358,3.735 8.606,6.428c2.249,2.693 3.9,5.855 4.953,9.485c1.054,3.629 1.581,7.505 1.581,11.627l0,2.107Zm-11.662,-3.442c0.14,-6.089 -1.214,-10.866 -4.065,-14.332c-2.85,-3.466 -7.079,-5.199 -12.687,-5.199c-2.875,0 -5.396,0.539 -7.564,1.616c-2.167,1.077 -3.982,2.506 -5.443,4.285c-1.461,1.78 -2.592,3.853 -3.393,6.218c-0.801,2.365 -1.248,4.836 -1.343,7.412l34.495,0Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M379.752,276.089c0,0.493 -0.016,0.924 -0.047,1.294c-0.03,0.369 -0.084,0.693 -0.161,0.97c-0.077,0.277 -0.177,0.524 -0.301,0.739c-0.123,0.216 -0.338,0.478 -0.646,0.786c-0.308,0.308 -0.955,0.778 -1.941,1.409c-0.986,0.631 -2.21,1.247 -3.673,1.848c-1.463,0.601 -3.142,1.109 -5.036,1.525c-1.894,0.416 -3.966,0.623 -6.214,0.623c-3.881,0 -7.385,-0.646 -10.511,-1.94c-3.127,-1.294 -5.791,-3.203 -7.993,-5.729c-2.203,-2.526 -3.897,-5.645 -5.083,-9.356c-1.185,-3.712 -1.778,-7.985 -1.778,-12.821c0,-4.959 0.639,-9.379 1.917,-13.26c1.278,-3.881 3.072,-7.169 5.383,-9.865c2.31,-2.695 5.074,-4.751 8.293,-6.168c3.219,-1.417 6.784,-2.125 10.696,-2.125c1.725,0 3.403,0.162 5.036,0.485c1.632,0.324 3.142,0.732 4.528,1.225c1.386,0.492 2.618,1.062 3.696,1.709c1.078,0.647 1.825,1.178 2.241,1.594c0.416,0.416 0.685,0.732 0.808,0.947c0.123,0.216 0.224,0.47 0.301,0.763c0.077,0.292 0.138,0.639 0.184,1.039c0.047,0.4 0.07,0.878 0.07,1.432c0,0.616 -0.031,1.14 -0.093,1.571c-0.062,0.431 -0.155,0.793 -0.279,1.086c-0.124,0.293 -0.271,0.508 -0.441,0.647c-0.171,0.138 -0.38,0.208 -0.628,0.208c-0.433,0 -1.036,-0.301 -1.811,-0.901c-0.774,-0.601 -1.773,-1.263 -2.996,-1.987c-1.223,-0.724 -2.71,-1.386 -4.459,-1.987c-1.749,-0.6 -3.847,-0.901 -6.294,-0.901c-2.663,0 -5.086,0.532 -7.269,1.594c-2.183,1.063 -4.049,2.626 -5.597,4.69c-1.549,2.064 -2.748,4.582 -3.6,7.554c-0.852,2.972 -1.278,6.368 -1.278,10.188c0,3.788 0.411,7.138 1.231,10.049c0.821,2.91 1.998,5.344 3.53,7.3c1.533,1.956 3.415,3.434 5.644,4.435c2.23,1.001 4.753,1.502 7.571,1.502c2.384,0 4.467,-0.293 6.247,-0.878c1.781,-0.585 3.298,-1.24 4.552,-1.964c1.254,-0.724 2.283,-1.378 3.089,-1.963c0.805,-0.586 1.44,-0.878 1.904,-0.878c0.217,0 0.403,0.046 0.558,0.138c0.154,0.093 0.278,0.27 0.371,0.532c0.093,0.262 0.163,0.623 0.209,1.085c0.046,0.462 0.07,1.048 0.07,1.756Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M428.079,262.136c0,3.388 -0.446,6.507 -1.339,9.356c-0.894,2.849 -2.226,5.306 -3.997,7.369c-1.771,2.064 -3.989,3.673 -6.653,4.828c-2.664,1.156 -5.752,1.733 -9.264,1.733c-3.419,0 -6.399,-0.508 -8.94,-1.525c-2.541,-1.016 -4.659,-2.495 -6.353,-4.435c-1.694,-1.941 -2.957,-4.297 -3.788,-7.069c-0.832,-2.772 -1.248,-5.914 -1.248,-9.425c0,-3.388 0.439,-6.507 1.317,-9.356c0.878,-2.849 2.202,-5.306 3.973,-7.37c1.772,-2.063 3.982,-3.665 6.63,-4.805c2.649,-1.139 5.745,-1.709 9.287,-1.709c3.419,0 6.399,0.508 8.94,1.525c2.541,1.016 4.659,2.494 6.353,4.435c1.694,1.94 2.965,4.297 3.812,7.069c0.847,2.772 1.27,5.898 1.27,9.379Zm-7.9,0.508c0,-2.248 -0.21,-4.374 -0.63,-6.376c-0.419,-2.002 -1.111,-3.757 -2.074,-5.267c-0.964,-1.509 -2.269,-2.703 -3.917,-3.58c-1.647,-0.878 -3.698,-1.317 -6.153,-1.317c-2.269,0 -4.219,0.4 -5.851,1.201c-1.632,0.801 -2.976,1.933 -4.033,3.396c-1.056,1.463 -1.841,3.196 -2.354,5.198c-0.513,2.002 -0.769,4.189 -0.769,6.56c0,2.28 0.21,4.42 0.629,6.423c0.42,2.002 1.119,3.75 2.098,5.244c0.979,1.493 2.292,2.679 3.939,3.557c1.648,0.878 3.699,1.317 6.154,1.317c2.238,0 4.181,-0.401 5.828,-1.201c1.647,-0.801 2.999,-1.925 4.056,-3.373c1.056,-1.448 1.833,-3.173 2.331,-5.175c0.497,-2.002 0.746,-4.204 0.746,-6.607Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M500.987,283.389c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.77,0 -1.401,-0.03 -1.894,-0.092c-0.493,-0.062 -0.886,-0.154 -1.178,-0.277c-0.293,-0.123 -0.501,-0.27 -0.624,-0.439c-0.123,-0.17 -0.185,-0.377 -0.185,-0.624l0,-25.273c0,-1.755 -0.154,-3.357 -0.462,-4.805c-0.308,-1.447 -0.801,-2.695 -1.478,-3.742c-0.678,-1.047 -1.54,-1.848 -2.588,-2.403c-1.047,-0.554 -2.279,-0.831 -3.696,-0.831c-1.756,0 -3.519,0.677 -5.29,2.033c-1.771,1.355 -3.719,3.342 -5.845,5.96l0,29.061c0,0.247 -0.061,0.454 -0.184,0.624c-0.124,0.169 -0.332,0.316 -0.624,0.439c-0.293,0.123 -0.685,0.215 -1.178,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.709,0 -1.317,-0.03 -1.825,-0.092c-0.509,-0.062 -0.909,-0.154 -1.202,-0.277c-0.292,-0.123 -0.492,-0.27 -0.6,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-25.273c0,-1.755 -0.169,-3.357 -0.508,-4.805c-0.339,-1.447 -0.847,-2.695 -1.525,-3.742c-0.678,-1.047 -1.532,-1.848 -2.564,-2.403c-1.032,-0.554 -2.256,-0.831 -3.673,-0.831c-1.756,0 -3.527,0.677 -5.314,2.033c-1.786,1.355 -3.727,3.342 -5.821,5.96l0,29.061c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.6,0.439c-0.278,0.123 -0.663,0.215 -1.156,0.277c-0.492,0.062 -1.124,0.092 -1.894,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.108,-0.17 -0.161,-0.377 -0.161,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.138,-0.624c0.093,-0.169 0.277,-0.323 0.555,-0.462c0.277,-0.138 0.631,-0.231 1.062,-0.277c0.432,-0.046 1.001,-0.069 1.71,-0.069c0.677,0 1.24,0.023 1.686,0.069c0.447,0.046 0.793,0.139 1.04,0.277c0.246,0.139 0.423,0.293 0.531,0.462c0.108,0.17 0.162,0.378 0.162,0.624l0,5.498c2.341,-2.618 4.612,-4.535 6.815,-5.752c2.202,-1.217 4.427,-1.825 6.676,-1.825c1.725,0 3.273,0.2 4.643,0.601c1.371,0.4 2.58,0.962 3.627,1.686c1.047,0.724 1.941,1.586 2.68,2.587c0.739,1.001 1.355,2.118 1.848,3.35c1.386,-1.509 2.703,-2.788 3.95,-3.835c1.248,-1.047 2.449,-1.894 3.604,-2.541c1.155,-0.647 2.279,-1.117 3.373,-1.409c1.093,-0.293 2.194,-0.439 3.303,-0.439c2.68,0 4.929,0.47 6.746,1.409c1.817,0.939 3.288,2.195 4.412,3.766c1.124,1.57 1.925,3.411 2.403,5.521c0.477,2.11 0.716,4.335 0.716,6.676l0,26.289Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M576.574,283.389c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.492,0.062 -1.108,0.092 -1.848,0.092c-0.77,0 -1.401,-0.03 -1.894,-0.092c-0.493,-0.062 -0.886,-0.154 -1.178,-0.277c-0.293,-0.123 -0.501,-0.27 -0.624,-0.439c-0.123,-0.17 -0.185,-0.377 -0.185,-0.624l0,-25.273c0,-1.755 -0.154,-3.357 -0.462,-4.805c-0.308,-1.447 -0.801,-2.695 -1.478,-3.742c-0.678,-1.047 -1.54,-1.848 -2.588,-2.403c-1.047,-0.554 -2.279,-0.831 -3.696,-0.831c-1.755,0 -3.519,0.677 -5.29,2.033c-1.771,1.355 -3.719,3.342 -5.844,5.96l0,29.061c0,0.247 -0.062,0.454 -0.185,0.624c-0.124,0.169 -0.331,0.316 -0.624,0.439c-0.293,0.123 -0.685,0.215 -1.178,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.709,0 -1.317,-0.03 -1.825,-0.092c-0.509,-0.062 -0.909,-0.154 -1.202,-0.277c-0.292,-0.123 -0.492,-0.27 -0.6,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-25.273c0,-1.755 -0.169,-3.357 -0.508,-4.805c-0.339,-1.447 -0.847,-2.695 -1.525,-3.742c-0.677,-1.047 -1.532,-1.848 -2.564,-2.403c-1.032,-0.554 -2.256,-0.831 -3.673,-0.831c-1.756,0 -3.527,0.677 -5.313,2.033c-1.787,1.355 -3.727,3.342 -5.822,5.96l0,29.061c0,0.247 -0.061,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.6,0.439c-0.278,0.123 -0.663,0.215 -1.155,0.277c-0.493,0.062 -1.125,0.092 -1.895,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.107,-0.17 -0.161,-0.377 -0.161,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.138,-0.624c0.093,-0.169 0.278,-0.323 0.555,-0.462c0.277,-0.138 0.631,-0.231 1.062,-0.277c0.432,-0.046 1.001,-0.069 1.71,-0.069c0.678,0 1.24,0.023 1.686,0.069c0.447,0.046 0.793,0.139 1.04,0.277c0.246,0.139 0.423,0.293 0.531,0.462c0.108,0.17 0.162,0.378 0.162,0.624l0,5.498c2.341,-2.618 4.612,-4.535 6.815,-5.752c2.202,-1.217 4.427,-1.825 6.676,-1.825c1.725,0 3.273,0.2 4.643,0.601c1.371,0.4 2.58,0.962 3.627,1.686c1.047,0.724 1.941,1.586 2.68,2.587c0.739,1.001 1.355,2.118 1.848,3.35c1.386,-1.509 2.703,-2.788 3.95,-3.835c1.248,-1.047 2.449,-1.894 3.604,-2.541c1.155,-0.647 2.279,-1.117 3.373,-1.409c1.093,-0.293 2.195,-0.439 3.303,-0.439c2.68,0 4.929,0.47 6.746,1.409c1.817,0.939 3.288,2.195 4.412,3.766c1.125,1.57 1.925,3.411 2.403,5.521c0.477,2.11 0.716,4.335 0.716,6.676l0,26.289Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M626.103,283.389c0,0.247 -0.054,0.454 -0.162,0.624c-0.108,0.169 -0.3,0.316 -0.577,0.439c-0.278,0.123 -0.639,0.215 -1.086,0.277c-0.447,0.062 -0.993,0.092 -1.64,0.092c-0.709,0 -1.286,-0.03 -1.733,-0.092c-0.447,-0.062 -0.801,-0.154 -1.063,-0.277c-0.261,-0.123 -0.438,-0.27 -0.531,-0.439c-0.092,-0.17 -0.138,-0.377 -0.138,-0.624l0,-5.498c-2.372,2.618 -4.713,4.528 -7.023,5.729c-2.31,1.201 -4.651,1.802 -7.023,1.802c-2.772,0 -5.105,-0.462 -7,-1.386c-1.894,-0.924 -3.426,-2.179 -4.597,-3.766c-1.17,-1.586 -2.01,-3.434 -2.518,-5.544c-0.508,-2.11 -0.762,-4.674 -0.762,-7.693l0,-25.226c0,-0.246 0.054,-0.454 0.162,-0.624c0.107,-0.169 0.315,-0.323 0.623,-0.462c0.308,-0.138 0.709,-0.231 1.202,-0.277c0.492,-0.046 1.108,-0.069 1.848,-0.069c0.739,0 1.355,0.023 1.848,0.069c0.493,0.046 0.885,0.139 1.178,0.277c0.292,0.139 0.5,0.293 0.624,0.462c0.123,0.17 0.184,0.378 0.184,0.624l0,24.21c0,2.433 0.178,4.382 0.532,5.845c0.354,1.463 0.893,2.71 1.617,3.742c0.724,1.032 1.64,1.833 2.749,2.403c1.109,0.569 2.402,0.854 3.881,0.854c1.91,0 3.812,-0.677 5.706,-2.033c1.894,-1.355 3.904,-3.342 6.029,-5.96l0,-29.061c0,-0.246 0.054,-0.454 0.162,-0.624c0.108,-0.169 0.316,-0.323 0.624,-0.462c0.308,-0.138 0.7,-0.231 1.178,-0.277c0.477,-0.046 1.101,-0.069 1.871,-0.069c0.739,0 1.355,0.023 1.848,0.069c0.493,0.046 0.878,0.139 1.155,0.277c0.277,0.139 0.485,0.293 0.624,0.462c0.139,0.17 0.208,0.378 0.208,0.624l0,41.582Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M676.001,283.389c0,0.247 -0.061,0.454 -0.184,0.624c-0.124,0.169 -0.324,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.77,0 -1.402,-0.03 -1.894,-0.092c-0.493,-0.062 -0.878,-0.154 -1.155,-0.277c-0.278,-0.123 -0.478,-0.27 -0.601,-0.439c-0.123,-0.17 -0.185,-0.377 -0.185,-0.624l0,-24.349c0,-2.371 -0.185,-4.281 -0.554,-5.729c-0.37,-1.447 -0.909,-2.695 -1.617,-3.742c-0.709,-1.047 -1.625,-1.848 -2.749,-2.403c-1.125,-0.554 -2.426,-0.831 -3.905,-0.831c-1.909,0 -3.819,0.677 -5.729,2.033c-1.909,1.355 -3.911,3.342 -6.006,5.96l0,29.061c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.6,0.439c-0.278,0.123 -0.663,0.215 -1.155,0.277c-0.493,0.062 -1.125,0.092 -1.895,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.107,-0.17 -0.161,-0.377 -0.161,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.138,-0.624c0.093,-0.169 0.277,-0.323 0.555,-0.462c0.277,-0.138 0.631,-0.231 1.062,-0.277c0.432,-0.046 1.001,-0.069 1.71,-0.069c0.677,0 1.24,0.023 1.686,0.069c0.447,0.046 0.793,0.139 1.04,0.277c0.246,0.139 0.423,0.293 0.531,0.462c0.108,0.17 0.162,0.378 0.162,0.624l0,5.498c2.341,-2.618 4.674,-4.535 6.999,-5.752c2.326,-1.217 4.675,-1.825 7.046,-1.825c2.772,0 5.106,0.47 7,1.409c1.894,0.939 3.427,2.195 4.597,3.766c1.171,1.57 2.01,3.411 2.518,5.521c0.508,2.11 0.762,4.643 0.762,7.6l0,25.365Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M697.532,283.389c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.124,0.092 -1.894,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.886,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-41.582c0,-0.216 0.054,-0.416 0.162,-0.601c0.108,-0.184 0.308,-0.338 0.601,-0.462c0.292,-0.123 0.685,-0.215 1.178,-0.277c0.493,-0.061 1.109,-0.092 1.848,-0.092c0.77,0 1.401,0.031 1.894,0.092c0.493,0.062 0.878,0.154 1.155,0.277c0.278,0.124 0.478,0.278 0.601,0.462c0.123,0.185 0.185,0.385 0.185,0.601l0,41.582Zm0.878,-55.628c0,1.787 -0.339,3.004 -1.017,3.65c-0.677,0.647 -1.925,0.971 -3.742,0.971c-1.787,0 -3.011,-0.316 -3.673,-0.947c-0.663,-0.632 -0.994,-1.825 -0.994,-3.581c0,-1.787 0.339,-3.003 1.017,-3.65c0.677,-0.647 1.925,-0.97 3.742,-0.97c1.787,0 3.011,0.315 3.673,0.947c0.663,0.631 0.994,1.825 0.994,3.58Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M733.246,280.34c0,0.893 -0.061,1.601 -0.185,2.125c-0.123,0.524 -0.308,0.909 -0.554,1.155c-0.246,0.247 -0.616,0.478 -1.109,0.693c-0.493,0.216 -1.055,0.393 -1.686,0.532c-0.632,0.138 -1.302,0.254 -2.01,0.346c-0.708,0.092 -1.417,0.139 -2.125,0.139c-2.156,0 -4.005,-0.285 -5.545,-0.855c-1.54,-0.57 -2.803,-1.432 -3.788,-2.587c-0.986,-1.155 -1.702,-2.619 -2.149,-4.39c-0.446,-1.771 -0.67,-3.858 -0.67,-6.26l0,-24.303l-5.821,0c-0.462,0 -0.832,-0.246 -1.109,-0.739c-0.277,-0.493 -0.416,-1.293 -0.416,-2.402c0,-0.586 0.039,-1.078 0.116,-1.479c0.077,-0.4 0.177,-0.731 0.3,-0.993c0.123,-0.262 0.285,-0.447 0.485,-0.555c0.2,-0.107 0.424,-0.161 0.67,-0.161l5.775,0l0,-9.888c0,-0.215 0.054,-0.415 0.162,-0.6c0.108,-0.185 0.308,-0.347 0.601,-0.485c0.292,-0.139 0.685,-0.239 1.178,-0.301c0.493,-0.061 1.109,-0.092 1.848,-0.092c0.77,0 1.401,0.031 1.894,0.092c0.493,0.062 0.878,0.162 1.155,0.301c0.278,0.138 0.478,0.3 0.601,0.485c0.123,0.185 0.185,0.385 0.185,0.6l0,9.888l10.673,0c0.246,0 0.462,0.054 0.646,0.161c0.185,0.108 0.347,0.293 0.486,0.555c0.138,0.262 0.238,0.593 0.3,0.993c0.061,0.401 0.092,0.893 0.092,1.479c0,1.109 -0.138,1.909 -0.416,2.402c-0.277,0.493 -0.646,0.739 -1.108,0.739l-10.673,0l0,23.194c0,2.865 0.423,5.028 1.27,6.491c0.847,1.464 2.364,2.195 4.551,2.195c0.709,0 1.34,-0.069 1.895,-0.208c0.554,-0.138 1.047,-0.285 1.478,-0.439c0.431,-0.154 0.801,-0.3 1.109,-0.439c0.308,-0.138 0.585,-0.208 0.832,-0.208c0.154,0 0.3,0.039 0.439,0.116c0.138,0.077 0.246,0.223 0.323,0.439c0.077,0.215 0.146,0.508 0.208,0.878c0.061,0.369 0.092,0.831 0.092,1.386Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M762.261,284.544l-5.544,15.293c-0.185,0.493 -0.654,0.87 -1.409,1.132c-0.755,0.262 -1.902,0.393 -3.442,0.393c-0.801,0 -1.448,-0.039 -1.941,-0.116c-0.493,-0.077 -0.87,-0.208 -1.132,-0.392c-0.261,-0.185 -0.408,-0.432 -0.439,-0.74c-0.03,-0.308 0.047,-0.677 0.231,-1.108l5.73,-14.462c-0.278,-0.123 -0.539,-0.323 -0.786,-0.6c-0.246,-0.278 -0.416,-0.57 -0.508,-0.878l-14.831,-39.734c-0.247,-0.647 -0.37,-1.155 -0.37,-1.525c0,-0.37 0.123,-0.662 0.37,-0.878c0.246,-0.215 0.647,-0.362 1.201,-0.439c0.555,-0.077 1.294,-0.115 2.218,-0.115c0.924,0 1.648,0.023 2.171,0.069c0.524,0.046 0.94,0.131 1.248,0.254c0.308,0.123 0.531,0.3 0.67,0.531c0.138,0.231 0.285,0.547 0.439,0.948l11.874,33.358l0.138,0l11.459,-33.543c0.184,-0.585 0.408,-0.963 0.669,-1.132c0.262,-0.17 0.655,-0.293 1.179,-0.37c0.523,-0.077 1.278,-0.115 2.264,-0.115c0.862,0 1.57,0.038 2.125,0.115c0.554,0.077 0.962,0.224 1.224,0.439c0.262,0.216 0.393,0.508 0.393,0.878c0,0.37 -0.092,0.832 -0.277,1.386l-14.924,41.351Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M840.528,267.773c0,2.803 -0.516,5.298 -1.548,7.485c-1.031,2.186 -2.464,4.042 -4.296,5.567c-1.833,1.525 -3.989,2.672 -6.469,3.442c-2.479,0.77 -5.151,1.155 -8.016,1.155c-2.002,0 -3.858,-0.169 -5.567,-0.508c-1.71,-0.339 -3.234,-0.755 -4.574,-1.248c-1.34,-0.492 -2.464,-1.001 -3.373,-1.524c-0.909,-0.524 -1.54,-0.971 -1.894,-1.34c-0.355,-0.37 -0.616,-0.84 -0.786,-1.409c-0.169,-0.57 -0.254,-1.333 -0.254,-2.287c0,-0.678 0.031,-1.24 0.093,-1.687c0.061,-0.446 0.154,-0.808 0.277,-1.086c0.123,-0.277 0.277,-0.469 0.462,-0.577c0.185,-0.108 0.4,-0.162 0.647,-0.162c0.431,0 1.039,0.262 1.825,0.786c0.785,0.523 1.794,1.093 3.026,1.709c1.232,0.616 2.718,1.194 4.458,1.733c1.741,0.539 3.75,0.808 6.03,0.808c1.725,0 3.303,-0.231 4.736,-0.693c1.432,-0.462 2.664,-1.116 3.696,-1.963c1.032,-0.847 1.825,-1.887 2.379,-3.119c0.555,-1.232 0.832,-2.634 0.832,-4.204c0,-1.695 -0.385,-3.142 -1.155,-4.343c-0.77,-1.202 -1.787,-2.257 -3.05,-3.165c-1.262,-0.909 -2.702,-1.741 -4.32,-2.495c-1.617,-0.755 -3.272,-1.525 -4.966,-2.31c-1.694,-0.786 -3.342,-1.656 -4.944,-2.611c-1.602,-0.955 -3.034,-2.079 -4.297,-3.373c-1.263,-1.293 -2.287,-2.81 -3.072,-4.551c-0.786,-1.74 -1.178,-3.827 -1.178,-6.26c0,-2.495 0.454,-4.72 1.363,-6.676c0.908,-1.956 2.171,-3.596 3.788,-4.921c1.617,-1.324 3.542,-2.333 5.775,-3.026c2.234,-0.693 4.644,-1.04 7.231,-1.04c1.325,0 2.657,0.116 3.997,0.347c1.34,0.231 2.602,0.539 3.788,0.924c1.186,0.385 2.241,0.816 3.165,1.294c0.924,0.477 1.532,0.862 1.825,1.155c0.293,0.292 0.485,0.523 0.578,0.693c0.092,0.169 0.169,0.385 0.231,0.647c0.061,0.261 0.107,0.577 0.138,0.947c0.031,0.369 0.046,0.847 0.046,1.432c0,0.554 -0.023,1.047 -0.069,1.479c-0.046,0.431 -0.115,0.793 -0.208,1.085c-0.092,0.293 -0.223,0.508 -0.392,0.647c-0.17,0.139 -0.362,0.208 -0.578,0.208c-0.339,0 -0.87,-0.216 -1.594,-0.647c-0.724,-0.431 -1.609,-0.916 -2.657,-1.455c-1.047,-0.539 -2.287,-1.032 -3.719,-1.479c-1.432,-0.446 -3.042,-0.67 -4.828,-0.67c-1.663,0 -3.111,0.224 -4.343,0.67c-1.232,0.447 -2.249,1.04 -3.049,1.779c-0.801,0.739 -1.402,1.617 -1.802,2.634c-0.401,1.016 -0.601,2.094 -0.601,3.234c0,1.663 0.385,3.095 1.155,4.297c0.77,1.201 1.794,2.264 3.073,3.188c1.278,0.924 2.733,1.771 4.366,2.541c1.632,0.77 3.295,1.548 4.99,2.333c1.694,0.785 3.357,1.648 4.989,2.587c1.633,0.94 3.088,2.049 4.367,3.327c1.278,1.278 2.31,2.787 3.095,4.528c0.786,1.74 1.178,3.796 1.178,6.168Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M886.638,283.389c0,0.247 -0.054,0.454 -0.161,0.624c-0.108,0.169 -0.301,0.316 -0.578,0.439c-0.277,0.123 -0.639,0.215 -1.086,0.277c-0.446,0.062 -0.993,0.092 -1.64,0.092c-0.708,0 -1.286,-0.03 -1.733,-0.092c-0.446,-0.062 -0.8,-0.154 -1.062,-0.277c-0.262,-0.123 -0.439,-0.27 -0.532,-0.439c-0.092,-0.17 -0.138,-0.377 -0.138,-0.624l0,-5.498c-2.372,2.618 -4.713,4.528 -7.023,5.729c-2.31,1.201 -4.651,1.802 -7.023,1.802c-2.772,0 -5.105,-0.462 -6.999,-1.386c-1.895,-0.924 -3.427,-2.179 -4.597,-3.766c-1.171,-1.586 -2.01,-3.434 -2.519,-5.544c-0.508,-2.11 -0.762,-4.674 -0.762,-7.693l0,-25.226c0,-0.246 0.054,-0.454 0.162,-0.624c0.108,-0.169 0.316,-0.323 0.624,-0.462c0.308,-0.138 0.708,-0.231 1.201,-0.277c0.493,-0.046 1.109,-0.069 1.848,-0.069c0.739,0 1.355,0.023 1.848,0.069c0.493,0.046 0.886,0.139 1.178,0.277c0.293,0.139 0.501,0.293 0.624,0.462c0.123,0.17 0.185,0.378 0.185,0.624l0,24.21c0,2.433 0.177,4.382 0.531,5.845c0.354,1.463 0.893,2.71 1.617,3.742c0.724,1.032 1.64,1.833 2.749,2.403c1.109,0.569 2.403,0.854 3.881,0.854c1.91,0 3.812,-0.677 5.706,-2.033c1.895,-1.355 3.904,-3.342 6.03,-5.96l0,-29.061c0,-0.246 0.054,-0.454 0.161,-0.624c0.108,-0.169 0.316,-0.323 0.624,-0.462c0.308,-0.138 0.701,-0.231 1.178,-0.277c0.478,-0.046 1.101,-0.069 1.871,-0.069c0.74,0 1.356,0.023 1.849,0.069c0.492,0.046 0.877,0.139 1.155,0.277c0.277,0.139 0.485,0.293 0.623,0.462c0.139,0.17 0.208,0.378 0.208,0.624l0,41.582Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M938.986,261.951c0,3.635 -0.393,6.9 -1.179,9.795c-0.785,2.895 -1.94,5.352 -3.465,7.369c-1.524,2.018 -3.411,3.573 -5.66,4.667c-2.248,1.093 -4.82,1.64 -7.715,1.64c-1.232,0 -2.372,-0.123 -3.419,-0.37c-1.048,-0.246 -2.072,-0.631 -3.073,-1.155c-1.001,-0.523 -1.994,-1.185 -2.98,-1.986c-0.986,-0.801 -2.033,-1.741 -3.142,-2.819l0,20.791c0,0.247 -0.061,0.462 -0.184,0.647c-0.124,0.185 -0.324,0.339 -0.601,0.462c-0.277,0.123 -0.662,0.216 -1.155,0.277c-0.493,0.062 -1.124,0.093 -1.894,0.093c-0.74,0 -1.356,-0.031 -1.849,-0.093c-0.492,-0.061 -0.885,-0.154 -1.178,-0.277c-0.292,-0.123 -0.493,-0.277 -0.6,-0.462c-0.108,-0.185 -0.162,-0.4 -0.162,-0.647l0,-58.076c0,-0.277 0.046,-0.501 0.139,-0.67c0.092,-0.169 0.277,-0.316 0.554,-0.439c0.277,-0.123 0.631,-0.208 1.063,-0.254c0.431,-0.046 0.954,-0.069 1.571,-0.069c0.646,0 1.178,0.023 1.594,0.069c0.415,0.046 0.762,0.131 1.039,0.254c0.277,0.123 0.47,0.27 0.578,0.439c0.107,0.169 0.161,0.393 0.161,0.67l0,5.59c1.263,-1.293 2.48,-2.417 3.65,-3.372c1.171,-0.955 2.349,-1.748 3.535,-2.38c1.186,-0.631 2.402,-1.109 3.65,-1.432c1.247,-0.323 2.564,-0.485 3.95,-0.485c3.019,0 5.591,0.585 7.716,1.756c2.125,1.17 3.858,2.772 5.198,4.805c1.34,2.033 2.317,4.397 2.933,7.092c0.617,2.695 0.925,5.552 0.925,8.57Zm-7.901,0.878c0,-2.125 -0.163,-4.181 -0.488,-6.168c-0.325,-1.987 -0.883,-3.75 -1.673,-5.29c-0.791,-1.54 -1.852,-2.772 -3.185,-3.696c-1.332,-0.924 -2.99,-1.386 -4.974,-1.386c-0.992,0 -1.968,0.146 -2.929,0.439c-0.96,0.292 -1.936,0.754 -2.928,1.386c-0.992,0.631 -2.03,1.463 -3.115,2.495c-1.085,1.031 -2.231,2.302 -3.44,3.811l0,16.541c2.108,2.556 4.107,4.512 5.997,5.867c1.891,1.356 3.874,2.033 5.95,2.033c1.922,0 3.572,-0.462 4.951,-1.386c1.379,-0.924 2.495,-2.156 3.347,-3.696c0.852,-1.54 1.48,-3.265 1.883,-5.175c0.403,-1.909 0.604,-3.834 0.604,-5.775Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M988.699,261.951c0,3.635 -0.392,6.9 -1.178,9.795c-0.785,2.895 -1.94,5.352 -3.465,7.369c-1.525,2.018 -3.411,3.573 -5.66,4.667c-2.248,1.093 -4.82,1.64 -7.716,1.64c-1.232,0 -2.371,-0.123 -3.419,-0.37c-1.047,-0.246 -2.071,-0.631 -3.072,-1.155c-1.001,-0.523 -1.994,-1.185 -2.98,-1.986c-0.986,-0.801 -2.033,-1.741 -3.142,-2.819l0,20.791c0,0.247 -0.061,0.462 -0.185,0.647c-0.123,0.185 -0.323,0.339 -0.6,0.462c-0.278,0.123 -0.663,0.216 -1.155,0.277c-0.493,0.062 -1.125,0.093 -1.895,0.093c-0.739,0 -1.355,-0.031 -1.848,-0.093c-0.493,-0.061 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.277 -0.601,-0.462c-0.107,-0.185 -0.161,-0.4 -0.161,-0.647l0,-58.076c0,-0.277 0.046,-0.501 0.138,-0.67c0.093,-0.169 0.278,-0.316 0.555,-0.439c0.277,-0.123 0.631,-0.208 1.062,-0.254c0.432,-0.046 0.955,-0.069 1.571,-0.069c0.647,0 1.178,0.023 1.594,0.069c0.416,0.046 0.763,0.131 1.04,0.254c0.277,0.123 0.47,0.27 0.577,0.439c0.108,0.169 0.162,0.393 0.162,0.67l0,5.59c1.263,-1.293 2.48,-2.417 3.65,-3.372c1.171,-0.955 2.349,-1.748 3.535,-2.38c1.185,-0.631 2.402,-1.109 3.65,-1.432c1.247,-0.323 2.564,-0.485 3.95,-0.485c3.018,0 5.59,0.585 7.716,1.756c2.125,1.17 3.858,2.772 5.197,4.805c1.34,2.033 2.318,4.397 2.934,7.092c0.616,2.695 0.924,5.552 0.924,8.57Zm-7.9,0.878c0,-2.125 -0.163,-4.181 -0.488,-6.168c-0.326,-1.987 -0.883,-3.75 -1.674,-5.29c-0.79,-1.54 -1.851,-2.772 -3.184,-3.696c-1.333,-0.924 -2.991,-1.386 -4.974,-1.386c-0.992,0 -1.968,0.146 -2.929,0.439c-0.96,0.292 -1.937,0.754 -2.928,1.386c-0.992,0.631 -2.03,1.463 -3.115,2.495c-1.085,1.031 -2.231,2.302 -3.44,3.811l0,16.541c2.108,2.556 4.107,4.512 5.997,5.867c1.891,1.356 3.874,2.033 5.95,2.033c1.921,0 3.571,-0.462 4.951,-1.386c1.379,-0.924 2.494,-2.156 3.347,-3.696c0.852,-1.54 1.48,-3.265 1.882,-5.175c0.403,-1.909 0.605,-3.834 0.605,-5.775Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1038.83,262.136c0,3.388 -0.447,6.507 -1.34,9.356c-0.893,2.849 -2.225,5.306 -3.996,7.369c-1.772,2.064 -3.989,3.673 -6.654,4.828c-2.664,1.156 -5.752,1.733 -9.263,1.733c-3.419,0 -6.399,-0.508 -8.94,-1.525c-2.541,-1.016 -4.659,-2.495 -6.353,-4.435c-1.694,-1.941 -2.957,-4.297 -3.789,-7.069c-0.831,-2.772 -1.247,-5.914 -1.247,-9.425c0,-3.388 0.439,-6.507 1.317,-9.356c0.877,-2.849 2.202,-5.306 3.973,-7.37c1.771,-2.063 3.981,-3.665 6.63,-4.805c2.649,-1.139 5.744,-1.709 9.287,-1.709c3.419,0 6.399,0.508 8.94,1.525c2.541,1.016 4.659,2.494 6.353,4.435c1.694,1.94 2.964,4.297 3.811,7.069c0.847,2.772 1.271,5.898 1.271,9.379Zm-7.901,0.508c0,-2.248 -0.21,-4.374 -0.629,-6.376c-0.42,-2.002 -1.111,-3.757 -2.075,-5.267c-0.963,-1.509 -2.269,-2.703 -3.916,-3.58c-1.647,-0.878 -3.698,-1.317 -6.154,-1.317c-2.269,0 -4.219,0.4 -5.851,1.201c-1.631,0.801 -2.976,1.933 -4.032,3.396c-1.057,1.463 -1.842,3.196 -2.354,5.198c-0.513,2.002 -0.77,4.189 -0.77,6.56c0,2.28 0.21,4.42 0.63,6.423c0.42,2.002 1.119,3.75 2.098,5.244c0.979,1.493 2.292,2.679 3.939,3.557c1.647,0.878 3.698,1.317 6.154,1.317c2.238,0 4.18,-0.401 5.827,-1.201c1.648,-0.801 3,-1.925 4.056,-3.373c1.057,-1.448 1.834,-3.173 2.331,-5.175c0.498,-2.002 0.746,-4.204 0.746,-6.607Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1074.36,244.533c0,0.678 -0.016,1.247 -0.047,1.709c-0.03,0.462 -0.092,0.824 -0.184,1.086c-0.093,0.262 -0.208,0.462 -0.347,0.601c-0.139,0.138 -0.331,0.208 -0.577,0.208c-0.247,0 -0.547,-0.07 -0.901,-0.208c-0.355,-0.139 -0.755,-0.277 -1.202,-0.416c-0.446,-0.139 -0.947,-0.27 -1.501,-0.393c-0.555,-0.123 -1.155,-0.185 -1.802,-0.185c-0.77,0 -1.525,0.154 -2.264,0.462c-0.739,0.308 -1.517,0.817 -2.333,1.525c-0.817,0.709 -1.671,1.648 -2.565,2.818c-0.893,1.171 -1.878,2.603 -2.956,4.297l0,27.352c0,0.247 -0.062,0.454 -0.185,0.624c-0.124,0.169 -0.324,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.124,0.092 -1.894,0.092c-0.74,0 -1.356,-0.03 -1.848,-0.092c-0.493,-0.062 -0.886,-0.154 -1.179,-0.277c-0.292,-0.123 -0.492,-0.27 -0.6,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.139,-0.624c0.092,-0.169 0.277,-0.323 0.554,-0.462c0.277,-0.138 0.632,-0.231 1.063,-0.277c0.431,-0.046 1.001,-0.069 1.709,-0.069c0.678,0 1.24,0.023 1.687,0.069c0.446,0.046 0.793,0.139 1.039,0.277c0.247,0.139 0.424,0.293 0.532,0.462c0.107,0.17 0.161,0.378 0.161,0.624l0,6.052c1.14,-1.663 2.21,-3.018 3.211,-4.065c1.001,-1.048 1.949,-1.872 2.842,-2.472c0.893,-0.601 1.779,-1.017 2.656,-1.248c0.878,-0.231 1.764,-0.346 2.657,-0.346c0.4,0 0.855,0.023 1.363,0.069c0.508,0.046 1.04,0.131 1.594,0.254c0.554,0.123 1.055,0.262 1.502,0.416c0.446,0.154 0.762,0.308 0.947,0.462c0.185,0.154 0.308,0.3 0.369,0.439c0.062,0.139 0.116,0.316 0.162,0.531c0.046,0.216 0.077,0.532 0.092,0.948c0.016,0.415 0.024,0.977 0.024,1.686Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1104.67,280.34c0,0.893 -0.061,1.601 -0.184,2.125c-0.124,0.524 -0.308,0.909 -0.555,1.155c-0.246,0.247 -0.616,0.478 -1.109,0.693c-0.493,0.216 -1.055,0.393 -1.686,0.532c-0.632,0.138 -1.302,0.254 -2.01,0.346c-0.708,0.092 -1.417,0.139 -2.125,0.139c-2.156,0 -4.004,-0.285 -5.545,-0.855c-1.54,-0.57 -2.802,-1.432 -3.788,-2.587c-0.986,-1.155 -1.702,-2.619 -2.149,-4.39c-0.446,-1.771 -0.669,-3.858 -0.669,-6.26l0,-24.303l-5.822,0c-0.462,0 -0.832,-0.246 -1.109,-0.739c-0.277,-0.493 -0.416,-1.293 -0.416,-2.402c0,-0.586 0.039,-1.078 0.116,-1.479c0.077,-0.4 0.177,-0.731 0.3,-0.993c0.123,-0.262 0.285,-0.447 0.485,-0.555c0.2,-0.107 0.424,-0.161 0.67,-0.161l5.776,0l0,-9.888c0,-0.215 0.053,-0.415 0.161,-0.6c0.108,-0.185 0.308,-0.347 0.601,-0.485c0.292,-0.139 0.685,-0.239 1.178,-0.301c0.493,-0.061 1.109,-0.092 1.848,-0.092c0.77,0 1.402,0.031 1.894,0.092c0.493,0.062 0.878,0.162 1.155,0.301c0.278,0.138 0.478,0.3 0.601,0.485c0.123,0.185 0.185,0.385 0.185,0.6l0,9.888l10.673,0c0.246,0 0.462,0.054 0.646,0.161c0.185,0.108 0.347,0.293 0.486,0.555c0.138,0.262 0.238,0.593 0.3,0.993c0.062,0.401 0.092,0.893 0.092,1.479c0,1.109 -0.138,1.909 -0.415,2.402c-0.278,0.493 -0.647,0.739 -1.109,0.739l-10.673,0l0,23.194c0,2.865 0.423,5.028 1.27,6.491c0.848,1.464 2.364,2.195 4.551,2.195c0.709,0 1.34,-0.069 1.895,-0.208c0.554,-0.138 1.047,-0.285 1.478,-0.439c0.431,-0.154 0.801,-0.3 1.109,-0.439c0.308,-0.138 0.585,-0.208 0.832,-0.208c0.154,0 0.3,0.039 0.439,0.116c0.138,0.077 0.246,0.223 0.323,0.439c0.077,0.215 0.146,0.508 0.208,0.878c0.062,0.369 0.092,0.831 0.092,1.386Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1149.21,260.796c0,1.201 -0.301,2.056 -0.904,2.564c-0.604,0.509 -1.292,0.763 -2.066,0.763l-27.385,0c0,2.31 0.233,4.389 0.697,6.237c0.464,1.848 1.238,3.434 2.321,4.759c1.083,1.324 2.492,2.341 4.225,3.049c1.733,0.709 3.854,1.063 6.36,1.063c1.981,0 3.746,-0.162 5.293,-0.485c1.548,-0.324 2.886,-0.686 4.016,-1.086c1.13,-0.4 2.059,-0.762 2.786,-1.086c0.727,-0.323 1.277,-0.485 1.649,-0.485c0.216,0 0.409,0.054 0.58,0.162c0.17,0.108 0.301,0.269 0.394,0.485c0.093,0.216 0.163,0.516 0.209,0.901c0.047,0.385 0.07,0.855 0.07,1.409c0,0.401 -0.016,0.747 -0.046,1.04c-0.031,0.292 -0.07,0.554 -0.116,0.785c-0.046,0.231 -0.123,0.439 -0.231,0.624c-0.108,0.185 -0.246,0.362 -0.416,0.531c-0.169,0.17 -0.67,0.447 -1.501,0.832c-0.832,0.385 -1.91,0.762 -3.235,1.132c-1.324,0.369 -2.856,0.701 -4.597,0.993c-1.74,0.293 -3.596,0.439 -5.567,0.439c-3.419,0 -6.414,-0.477 -8.986,-1.432c-2.572,-0.955 -4.736,-2.372 -6.492,-4.251c-1.756,-1.879 -3.08,-4.235 -3.973,-7.069c-0.894,-2.834 -1.34,-6.129 -1.34,-9.887c0,-3.573 0.462,-6.784 1.386,-9.633c0.924,-2.849 2.256,-5.267 3.996,-7.254c1.741,-1.987 3.843,-3.511 6.307,-4.574c2.464,-1.063 5.221,-1.594 8.27,-1.594c3.265,0 6.045,0.524 8.34,1.571c2.295,1.047 4.181,2.456 5.66,4.227c1.478,1.771 2.564,3.85 3.257,6.238c0.693,2.387 1.039,4.936 1.039,7.646l0,1.386Zm-7.669,-2.264c0.092,-4.004 -0.799,-7.146 -2.673,-9.425c-1.875,-2.279 -4.656,-3.419 -8.344,-3.419c-1.891,0 -3.549,0.354 -4.974,1.063c-1.426,0.708 -2.619,1.648 -3.58,2.818c-0.961,1.17 -1.705,2.533 -2.231,4.089c-0.527,1.555 -0.821,3.18 -0.884,4.874l22.686,0Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1196.42,283.389c0,0.247 -0.054,0.462 -0.161,0.647c-0.108,0.185 -0.293,0.331 -0.555,0.439c-0.262,0.108 -0.608,0.192 -1.039,0.254c-0.432,0.062 -0.955,0.092 -1.571,0.092c-0.647,0 -1.186,-0.03 -1.617,-0.092c-0.432,-0.062 -0.786,-0.146 -1.063,-0.254c-0.277,-0.108 -0.477,-0.254 -0.601,-0.439c-0.123,-0.185 -0.184,-0.4 -0.184,-0.647l0,-5.498c-2.187,2.372 -4.459,4.22 -6.815,5.544c-2.357,1.325 -4.936,1.987 -7.739,1.987c-3.05,0 -5.652,-0.593 -7.808,-1.779c-2.157,-1.186 -3.905,-2.787 -5.244,-4.805c-1.34,-2.017 -2.318,-4.389 -2.934,-7.115c-0.616,-2.726 -0.924,-5.598 -0.924,-8.617c0,-3.573 0.385,-6.799 1.155,-9.679c0.77,-2.88 1.909,-5.336 3.419,-7.369c1.509,-2.033 3.38,-3.596 5.613,-4.69c2.233,-1.093 4.813,-1.64 7.739,-1.64c2.434,0 4.659,0.531 6.676,1.594c2.018,1.063 4.012,2.626 5.984,4.689l0,-24.163c0,-0.216 0.054,-0.424 0.161,-0.624c0.108,-0.2 0.316,-0.354 0.624,-0.462c0.308,-0.108 0.701,-0.2 1.178,-0.277c0.478,-0.077 1.086,-0.116 1.825,-0.116c0.77,0 1.402,0.039 1.895,0.116c0.492,0.077 0.877,0.169 1.155,0.277c0.277,0.108 0.485,0.262 0.623,0.462c0.139,0.2 0.208,0.408 0.208,0.624l0,61.541Zm-7.669,-29.246c-2.064,-2.557 -4.058,-4.505 -5.984,-5.845c-1.925,-1.339 -3.934,-2.009 -6.029,-2.009c-1.94,0 -3.588,0.462 -4.944,1.386c-1.355,0.924 -2.456,2.14 -3.303,3.65c-0.847,1.509 -1.463,3.218 -1.848,5.128c-0.385,1.91 -0.578,3.85 -0.578,5.822c0,2.094 0.162,4.142 0.485,6.145c0.324,2.002 0.886,3.78 1.687,5.336c0.801,1.555 1.863,2.803 3.188,3.742c1.324,0.94 2.988,1.41 4.99,1.41c1.016,0 1.994,-0.139 2.934,-0.416c0.939,-0.278 1.902,-0.74 2.887,-1.386c0.986,-0.647 2.018,-1.487 3.096,-2.518c1.078,-1.032 2.217,-2.303 3.419,-3.812l0,-16.633Z" style="fill:#fff;fill-rule:nonzero;"/></g></svg> \ No newline at end of file
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 1260 371" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"><rect id="badge.-community.-dark" x="0" y="0.321" width="1260" height="370" style="fill:none;"/><clipPath id="_clip1"><rect x="0" y="0.321" width="1260" height="370"/></clipPath><g clip-path="url(#_clip1)"><path d="M1260,33.621c0,-18.379 -14.921,-33.3 -33.3,-33.3l-1193.4,0c-18.379,0 -33.3,14.921 -33.3,33.3l0,303.4c0,18.378 14.921,33.3 33.3,33.3l1193.4,0c18.379,0 33.3,-14.922 33.3,-33.3l0,-303.4Z" style="fill:#333;"/><path d="M118.018,302.021l-6.434,0c-1.775,0 -3.217,-1.441 -3.217,-3.217l0,-20.679l-4.548,0c-15.366,0 -27.841,-12.475 -27.841,-27.841l0,-4.548l-20.679,0c-1.776,0 -3.217,-1.442 -3.217,-3.217l0,-6.434c0,-1.775 1.441,-3.217 3.217,-3.217l20.679,0l0,-14.123l-20.679,0c-1.776,0 -3.217,-1.441 -3.217,-3.217l0,-6.434c0,-1.775 1.441,-3.217 3.217,-3.217l20.679,0l0,-14.123l-20.679,0c-1.776,0 -3.217,-1.441 -3.217,-3.216l0,-6.434c0,-1.776 1.441,-3.217 3.217,-3.217l20.679,0l0,-14.123l-20.679,0c-1.776,0 -3.217,-1.442 -3.217,-3.217l0,-6.434c0,-1.775 1.441,-3.217 3.217,-3.217l20.679,0l0,-14.123l-20.679,0c-1.776,0 -3.217,-1.441 -3.217,-3.217l0,-6.434c0,-1.775 1.441,-3.216 3.217,-3.217l20.679,0l0,-4.548c0,-15.366 12.475,-27.841 27.841,-27.841l4.548,0l0,-20.679c0,-1.776 1.442,-3.217 3.217,-3.217l6.434,0c1.776,0 3.217,1.441 3.217,3.217l0,20.679l14.123,0l0,-20.679c0,-1.776 1.441,-3.217 3.217,-3.217l6.434,0c1.775,0 3.217,1.441 3.217,3.217l0,20.679l14.123,0l0,-20.679c0,-1.776 1.441,-3.217 3.217,-3.217l6.433,0c1.776,0 3.217,1.441 3.217,3.217l0,20.679l14.123,0l0,-20.679c0,-1.776 1.442,-3.217 3.217,-3.217l6.434,0c1.776,0 3.217,1.441 3.217,3.217l0,20.679l14.123,0l0,-20.679c0,-1.776 1.441,-3.217 3.217,-3.217l6.434,0c1.775,0 3.217,1.441 3.217,3.217l0,20.679l4.548,0c15.366,0 27.841,12.475 27.841,27.841l0,4.548l20.679,0c1.776,0.001 3.217,1.442 3.217,3.217l0,6.434c0,1.775 -1.441,3.217 -3.217,3.217l-20.679,0l0,14.123l20.679,0c1.776,0.001 3.217,1.442 3.217,3.217l0,6.434c0,1.775 -1.441,3.216 -3.217,3.217l-20.679,0l0,14.123l20.679,0c1.776,0 3.217,1.442 3.217,3.217l0,6.434c0,1.775 -1.441,3.216 -3.217,3.216l-20.679,0l0,14.123l20.679,0c1.776,0.001 3.217,1.442 3.217,3.217l0,6.434c0,1.775 -1.441,3.217 -3.217,3.217l-20.679,0l0,14.123l20.679,0c1.776,0.001 3.217,1.442 3.217,3.217l0,6.434c0,1.775 -1.441,3.216 -3.217,3.217l-20.679,0l0,4.548c0,15.366 -12.475,27.841 -27.841,27.841l-4.548,0l0,20.679c0,1.776 -1.441,3.217 -3.217,3.217l-6.434,0c-1.776,0 -3.217,-1.441 -3.217,-3.217l0,-20.679l-14.123,0l0,20.679c0,1.776 -1.441,3.217 -3.217,3.217l-6.434,0c-1.775,0 -3.217,-1.441 -3.217,-3.217l0,-20.679l-14.123,0l0,20.679c0,1.776 -1.441,3.217 -3.217,3.217l-6.433,0c-1.776,0 -3.217,-1.441 -3.217,-3.217l0,-20.679l-14.123,0l0,20.679c0,1.776 -1.441,3.217 -3.217,3.217l-6.434,0c-1.775,0 -3.217,-1.441 -3.217,-3.217l0,-20.679l-14.123,0l0,20.679c0,1.776 -1.441,3.217 -3.217,3.217Zm103.74,-127.253c0,6.774 -1.062,12.845 -3.187,18.213c-2.124,5.368 -5.152,9.946 -9.085,13.735c-3.932,3.789 -8.697,6.717 -14.295,8.784c-5.597,2.067 -11.927,3.186 -18.988,3.359l0,20.581c0,0.459 -0.115,0.861 -0.345,1.206c-0.229,0.344 -0.631,0.617 -1.205,0.818c-0.574,0.201 -1.335,0.358 -2.282,0.473c-0.947,0.115 -2.139,0.173 -3.574,0.173c-1.435,0 -2.626,-0.058 -3.574,-0.173c-0.947,-0.115 -1.693,-0.272 -2.239,-0.473c-0.545,-0.201 -0.947,-0.474 -1.205,-0.818c-0.259,-0.345 -0.388,-0.747 -0.388,-1.206l0,-20.581c-7.176,-0.173 -13.577,-1.206 -19.203,-3.101c-5.627,-1.894 -10.392,-4.635 -14.295,-8.224c-3.904,-3.588 -6.89,-7.994 -8.956,-13.218c-2.067,-5.224 -3.101,-11.224 -3.101,-17.998l0,-44.005c0,-0.402 0.13,-0.775 0.388,-1.119c0.258,-0.345 0.66,-0.632 1.206,-0.861c0.545,-0.23 1.291,-0.402 2.239,-0.517c0.947,-0.115 2.138,-0.172 3.573,-0.172c1.436,0 2.627,0.057 3.574,0.172c0.947,0.115 1.708,0.287 2.282,0.517c0.574,0.229 0.976,0.516 1.206,0.861c0.229,0.344 0.344,0.717 0.344,1.119l0,42.713c0,4.765 0.632,9.057 1.895,12.874c1.263,3.818 3.157,7.062 5.683,9.731c2.526,2.67 5.727,4.737 9.602,6.201c3.875,1.463 8.396,2.253 13.563,2.368l0,-73.887c0,-0.402 0.129,-0.775 0.388,-1.119c0.258,-0.345 0.689,-0.632 1.291,-0.861c0.603,-0.23 1.378,-0.402 2.326,-0.517c0.947,-0.115 2.081,-0.172 3.401,-0.172c1.435,0 2.627,0.057 3.574,0.172c0.947,0.115 1.708,0.287 2.282,0.517c0.574,0.229 0.976,0.516 1.205,0.861c0.23,0.344 0.345,0.717 0.345,1.119l0,73.887c5.167,-0.058 9.673,-0.847 13.52,-2.368c3.846,-1.522 7.047,-3.617 9.602,-6.287c2.554,-2.669 4.478,-5.884 5.769,-9.645c1.292,-3.76 1.938,-7.937 1.938,-12.529l0,-43.058c0,-0.402 0.115,-0.775 0.344,-1.119c0.23,-0.345 0.632,-0.632 1.206,-0.861c0.574,-0.23 1.321,-0.402 2.239,-0.517c0.919,-0.115 2.124,-0.172 3.617,-0.172c1.378,0 2.54,0.057 3.488,0.172c0.947,0.115 1.693,0.287 2.239,0.517c0.545,0.229 0.947,0.516 1.205,0.861c0.258,0.344 0.388,0.717 0.388,1.119l0,42.455Z" style="fill:#fff;"/><path d="M426.392,189.328c0,1.077 -0.059,1.978 -0.176,2.704c-0.117,0.726 -0.293,1.288 -0.527,1.686c-0.234,0.398 -0.491,0.668 -0.772,0.808c-0.281,0.141 -0.563,0.211 -0.844,0.211c-0.936,0 -2.447,-0.386 -4.531,-1.159c-2.084,-0.773 -4.484,-1.897 -7.201,-3.372c-2.716,-1.476 -5.62,-3.267 -8.711,-5.375c-3.092,-2.107 -6.089,-4.566 -8.993,-7.376c-2.295,1.405 -5.199,2.622 -8.711,3.653c-3.513,1.03 -7.588,1.545 -12.224,1.545c-6.839,0 -12.752,-1.007 -17.74,-3.021c-4.988,-2.013 -9.109,-4.964 -12.364,-8.851c-3.255,-3.888 -5.679,-8.724 -7.272,-14.508c-1.592,-5.784 -2.388,-12.423 -2.388,-19.917c0,-7.213 0.866,-13.734 2.599,-19.566c1.733,-5.831 4.333,-10.795 7.798,-14.893c3.466,-4.098 7.799,-7.26 12.997,-9.485c5.199,-2.224 11.264,-3.337 18.196,-3.337c6.51,0 12.236,1.007 17.177,3.021c4.941,2.014 9.086,4.953 12.435,8.817c3.349,3.864 5.866,8.63 7.552,14.297c1.686,5.667 2.529,12.177 2.529,19.53c0,3.794 -0.222,7.424 -0.667,10.89c-0.445,3.466 -1.147,6.744 -2.108,9.835c-0.96,3.091 -2.166,5.948 -3.618,8.571c-1.452,2.623 -3.161,4.988 -5.128,7.096c3.419,2.81 6.416,5 8.992,6.569c2.576,1.569 4.707,2.751 6.393,3.547c1.687,0.797 2.998,1.37 3.935,1.722c0.936,0.351 1.639,0.749 2.107,1.194c0.469,0.445 0.796,1.077 0.984,1.897c0.187,0.819 0.281,1.908 0.281,3.267Zm-23.886,-53.745c0,-5.152 -0.457,-9.929 -1.37,-14.331c-0.914,-4.403 -2.436,-8.232 -4.567,-11.487c-2.131,-3.255 -4.976,-5.796 -8.536,-7.622c-3.559,-1.827 -7.962,-2.74 -13.207,-2.74c-5.246,0 -9.649,0.972 -13.208,2.915c-3.56,1.944 -6.452,4.567 -8.676,7.869c-2.225,3.302 -3.818,7.13 -4.778,11.486c-0.96,4.356 -1.44,8.969 -1.44,13.84c0,5.339 0.445,10.245 1.335,14.718c0.89,4.473 2.389,8.349 4.496,11.627c2.108,3.279 4.93,5.82 8.466,7.623c3.536,1.803 7.974,2.705 13.313,2.705c5.292,0 9.742,-0.984 13.348,-2.951c3.606,-1.967 6.51,-4.625 8.711,-7.974c2.202,-3.349 3.771,-7.236 4.707,-11.662c0.937,-4.426 1.406,-9.098 1.406,-14.016Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M534.723,179.492c0,0.375 -0.096,0.703 -0.289,0.984c-0.193,0.281 -0.531,0.503 -1.013,0.667c-0.483,0.164 -1.098,0.304 -1.846,0.421c-0.747,0.118 -1.724,0.176 -2.93,0.176c-1.109,0 -2.062,-0.058 -2.858,-0.176c-0.796,-0.117 -1.423,-0.257 -1.881,-0.421c-0.459,-0.164 -0.784,-0.386 -0.977,-0.667c-0.193,-0.281 -0.289,-0.609 -0.289,-0.984l0,-79.176l-0.141,0l-32.036,79.527c-0.14,0.328 -0.339,0.609 -0.597,0.843c-0.257,0.234 -0.632,0.434 -1.124,0.597c-0.492,0.164 -1.077,0.281 -1.756,0.352c-0.679,0.07 -1.487,0.105 -2.424,0.105c-0.984,0 -1.827,-0.047 -2.529,-0.14c-0.703,-0.094 -1.288,-0.223 -1.756,-0.387c-0.469,-0.164 -0.832,-0.363 -1.089,-0.597c-0.258,-0.234 -0.434,-0.492 -0.527,-0.773l-30.631,-79.527l-0.07,0l0,79.176c0,0.375 -0.097,0.703 -0.289,0.984c-0.193,0.281 -0.531,0.503 -1.014,0.667c-0.482,0.164 -1.109,0.304 -1.881,0.421c-0.772,0.118 -1.761,0.176 -2.967,0.176c-1.157,0 -2.122,-0.058 -2.894,-0.176c-0.772,-0.117 -1.387,-0.257 -1.845,-0.421c-0.459,-0.164 -0.772,-0.386 -0.941,-0.667c-0.169,-0.281 -0.253,-0.609 -0.253,-0.984l0,-83.602c0,-1.967 0.523,-3.372 1.569,-4.215c1.046,-0.843 2.212,-1.265 3.496,-1.265l7.419,0c1.522,0 2.853,0.141 3.995,0.422c1.142,0.281 2.14,0.726 2.996,1.335c0.856,0.608 1.569,1.381 2.14,2.318c0.571,0.937 1.07,2.037 1.499,3.302l25.994,65.828l0.351,0l27.047,-65.617c0.524,-1.405 1.095,-2.6 1.713,-3.583c0.619,-0.984 1.297,-1.768 2.035,-2.354c0.738,-0.585 1.558,-1.007 2.462,-1.264c0.904,-0.258 1.951,-0.387 3.141,-0.387l7.779,0c0.715,0 1.393,0.106 2.035,0.316c0.642,0.211 1.189,0.539 1.642,0.984c0.452,0.445 0.821,1.007 1.106,1.686c0.285,0.679 0.428,1.51 0.428,2.494l0,83.602Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M618.185,179.351c0,0.375 -0.082,0.715 -0.246,1.019c-0.164,0.305 -0.48,0.55 -0.949,0.738c-0.468,0.187 -1.1,0.339 -1.896,0.456c-0.797,0.118 -1.827,0.176 -3.092,0.176c-1.639,0 -2.974,-0.07 -4.004,-0.211c-1.031,-0.14 -1.803,-0.398 -2.318,-0.772c-0.516,-0.375 -0.937,-0.797 -1.265,-1.265l-33.441,-45.454l0,45.454c0,0.328 -0.094,0.644 -0.281,0.948c-0.187,0.305 -0.515,0.539 -0.983,0.703c-0.469,0.164 -1.089,0.304 -1.862,0.421c-0.773,0.118 -1.745,0.176 -2.916,0.176c-1.124,0 -2.084,-0.058 -2.88,-0.176c-0.796,-0.117 -1.429,-0.257 -1.897,-0.421c-0.468,-0.164 -0.796,-0.398 -0.983,-0.703c-0.188,-0.304 -0.282,-0.62 -0.282,-0.948l0,-87.255c0,-0.375 0.094,-0.703 0.282,-0.984c0.187,-0.281 0.515,-0.503 0.983,-0.667c0.468,-0.164 1.101,-0.305 1.897,-0.422c0.796,-0.117 1.756,-0.175 2.88,-0.175c1.171,0 2.143,0.058 2.916,0.175c0.773,0.117 1.393,0.258 1.862,0.422c0.468,0.164 0.796,0.386 0.983,0.667c0.187,0.281 0.281,0.609 0.281,0.984l0,40.396l32.176,-40.396c0.281,-0.422 0.609,-0.773 0.984,-1.054c0.375,-0.281 0.831,-0.504 1.37,-0.667c0.538,-0.164 1.194,-0.293 1.967,-0.387c0.773,-0.094 1.768,-0.14 2.986,-0.14c1.218,0 2.201,0.058 2.95,0.175c0.75,0.117 1.347,0.27 1.792,0.457c0.445,0.187 0.749,0.421 0.913,0.702c0.164,0.282 0.246,0.586 0.246,0.914c0,0.609 -0.152,1.218 -0.457,1.826c-0.304,0.609 -0.878,1.452 -1.721,2.53l-30.139,36.04l32.458,43.136c0.796,1.217 1.276,2.049 1.44,2.494c0.164,0.444 0.246,0.807 0.246,1.088Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M713.941,95.609c0,0.89 -0.047,1.663 -0.141,2.318c-0.094,0.656 -0.258,1.183 -0.492,1.581c-0.234,0.398 -0.503,0.691 -0.808,0.878c-0.304,0.188 -0.62,0.281 -0.948,0.281l-33.3,0l0,30.912l31.473,0c0.328,0 0.644,0.082 0.949,0.246c0.304,0.164 0.574,0.433 0.808,0.808c0.234,0.374 0.398,0.878 0.491,1.51c0.094,0.632 0.141,1.44 0.141,2.424c0,0.89 -0.047,1.651 -0.141,2.283c-0.093,0.632 -0.257,1.148 -0.491,1.546c-0.234,0.398 -0.504,0.702 -0.808,0.913c-0.305,0.211 -0.621,0.316 -0.949,0.316l-31.473,0l0,37.867c0,0.328 -0.094,0.644 -0.281,0.948c-0.188,0.305 -0.516,0.539 -0.984,0.703c-0.468,0.164 -1.077,0.304 -1.826,0.421c-0.75,0.118 -1.733,0.176 -2.951,0.176c-1.124,0 -2.084,-0.058 -2.881,-0.176c-0.796,-0.117 -1.428,-0.257 -1.896,-0.421c-0.469,-0.164 -0.797,-0.398 -0.984,-0.703c-0.187,-0.304 -0.281,-0.62 -0.281,-0.948l0,-84.164c0,-1.827 0.48,-3.103 1.44,-3.829c0.96,-0.726 1.979,-1.089 3.056,-1.089l40.888,0c0.328,0 0.644,0.094 0.948,0.281c0.305,0.188 0.574,0.492 0.808,0.914c0.234,0.421 0.398,0.971 0.492,1.65c0.094,0.68 0.141,1.464 0.141,2.354Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M742.534,179.562c0,0.375 -0.094,0.691 -0.281,0.949c-0.187,0.257 -0.492,0.48 -0.913,0.667c-0.422,0.187 -1.007,0.328 -1.757,0.422c-0.749,0.093 -1.709,0.14 -2.88,0.14c-1.124,0 -2.061,-0.047 -2.81,-0.14c-0.75,-0.094 -1.347,-0.235 -1.792,-0.422c-0.445,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.328 0.082,-0.632 0.246,-0.913c0.164,-0.281 0.468,-0.516 0.913,-0.703c0.445,-0.187 1.042,-0.328 1.792,-0.422c0.749,-0.093 1.686,-0.14 2.81,-0.14c1.171,0 2.131,0.047 2.88,0.14c0.75,0.094 1.335,0.235 1.757,0.422c0.421,0.187 0.726,0.422 0.913,0.703c0.187,0.281 0.281,0.585 0.281,0.913l0,63.228Zm1.335,-84.585c0,2.716 -0.515,4.566 -1.546,5.55c-1.03,0.983 -2.927,1.475 -5.69,1.475c-2.717,0 -4.579,-0.48 -5.586,-1.44c-1.007,-0.96 -1.51,-2.775 -1.51,-5.445c0,-2.716 0.515,-4.566 1.546,-5.55c1.03,-0.983 2.927,-1.475 5.69,-1.475c2.717,0 4.578,0.48 5.585,1.44c1.007,0.96 1.511,2.775 1.511,5.445Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M800.915,120.479c0,1.03 -0.024,1.897 -0.07,2.599c-0.047,0.703 -0.141,1.253 -0.281,1.651c-0.141,0.398 -0.317,0.703 -0.527,0.913c-0.211,0.211 -0.504,0.317 -0.879,0.317c-0.374,0 -0.831,-0.106 -1.37,-0.317c-0.538,-0.21 -1.147,-0.421 -1.826,-0.632c-0.679,-0.211 -1.44,-0.41 -2.283,-0.597c-0.843,-0.187 -1.757,-0.281 -2.74,-0.281c-1.171,0 -2.319,0.234 -3.443,0.703c-1.124,0.468 -2.306,1.241 -3.548,2.318c-1.241,1.077 -2.54,2.506 -3.899,4.285c-1.358,1.78 -2.857,3.958 -4.496,6.534l0,41.59c0,0.375 -0.094,0.691 -0.281,0.949c-0.187,0.257 -0.492,0.48 -0.913,0.667c-0.422,0.187 -1.007,0.328 -1.756,0.422c-0.75,0.093 -1.71,0.14 -2.881,0.14c-1.124,0 -2.061,-0.047 -2.81,-0.14c-0.749,-0.094 -1.347,-0.235 -1.792,-0.422c-0.444,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.375 0.071,-0.691 0.211,-0.949c0.141,-0.257 0.422,-0.491 0.843,-0.702c0.422,-0.211 0.96,-0.351 1.616,-0.422c0.656,-0.07 1.522,-0.105 2.599,-0.105c1.031,0 1.885,0.035 2.565,0.105c0.679,0.071 1.206,0.211 1.58,0.422c0.375,0.211 0.644,0.445 0.808,0.702c0.164,0.258 0.246,0.574 0.246,0.949l0,9.203c1.733,-2.529 3.361,-4.59 4.883,-6.182c1.522,-1.593 2.962,-2.846 4.32,-3.759c1.359,-0.913 2.705,-1.545 4.04,-1.897c1.335,-0.351 2.681,-0.527 4.04,-0.527c0.608,0 1.299,0.036 2.072,0.106c0.773,0.07 1.581,0.199 2.424,0.386c0.843,0.188 1.604,0.398 2.283,0.632c0.679,0.235 1.159,0.469 1.44,0.703c0.281,0.234 0.469,0.457 0.562,0.667c0.094,0.211 0.176,0.48 0.246,0.808c0.07,0.328 0.117,0.808 0.141,1.441c0.023,0.632 0.035,1.487 0.035,2.564Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M907.911,179.562c0,0.375 -0.093,0.691 -0.281,0.949c-0.187,0.257 -0.491,0.48 -0.913,0.667c-0.422,0.187 -1.007,0.328 -1.756,0.422c-0.75,0.093 -1.686,0.14 -2.811,0.14c-1.17,0 -2.131,-0.047 -2.88,-0.14c-0.749,-0.094 -1.346,-0.235 -1.791,-0.422c-0.445,-0.187 -0.761,-0.41 -0.949,-0.667c-0.187,-0.258 -0.281,-0.574 -0.281,-0.949l0,-38.429c0,-2.669 -0.234,-5.105 -0.702,-7.306c-0.469,-2.201 -1.218,-4.098 -2.248,-5.691c-1.031,-1.592 -2.342,-2.81 -3.935,-3.653c-1.592,-0.843 -3.466,-1.264 -5.62,-1.264c-2.67,0 -5.351,1.03 -8.044,3.091c-2.693,2.061 -5.655,5.082 -8.887,9.063l0,44.189c0,0.375 -0.094,0.691 -0.281,0.949c-0.188,0.257 -0.504,0.48 -0.949,0.667c-0.445,0.187 -1.042,0.328 -1.791,0.422c-0.749,0.093 -1.686,0.14 -2.81,0.14c-1.077,0 -2.002,-0.047 -2.775,-0.14c-0.773,-0.094 -1.382,-0.235 -1.827,-0.422c-0.445,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-38.429c0,-2.669 -0.258,-5.105 -0.773,-7.306c-0.515,-2.201 -1.288,-4.098 -2.318,-5.691c-1.031,-1.592 -2.33,-2.81 -3.899,-3.653c-1.569,-0.843 -3.431,-1.264 -5.585,-1.264c-2.67,0 -5.363,1.03 -8.08,3.091c-2.716,2.061 -5.667,5.082 -8.852,9.063l0,44.189c0,0.375 -0.093,0.691 -0.281,0.949c-0.187,0.257 -0.491,0.48 -0.913,0.667c-0.421,0.187 -1.007,0.328 -1.756,0.422c-0.75,0.093 -1.71,0.14 -2.881,0.14c-1.124,0 -2.06,-0.047 -2.81,-0.14c-0.749,-0.094 -1.346,-0.235 -1.791,-0.422c-0.445,-0.187 -0.75,-0.41 -0.914,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.375 0.071,-0.691 0.211,-0.949c0.141,-0.257 0.422,-0.491 0.843,-0.702c0.422,-0.211 0.96,-0.351 1.616,-0.422c0.656,-0.07 1.522,-0.105 2.6,-0.105c1.03,0 1.885,0.035 2.564,0.105c0.679,0.071 1.206,0.211 1.581,0.422c0.374,0.211 0.643,0.445 0.807,0.702c0.164,0.258 0.246,0.574 0.246,0.949l0,8.36c3.56,-3.981 7.014,-6.897 10.363,-8.747c3.349,-1.85 6.732,-2.775 10.151,-2.775c2.623,0 4.977,0.305 7.061,0.914c2.084,0.609 3.922,1.463 5.515,2.564c1.592,1.101 2.951,2.412 4.075,3.934c1.124,1.522 2.06,3.22 2.81,5.094c2.107,-2.295 4.11,-4.239 6.006,-5.831c1.897,-1.593 3.724,-2.881 5.48,-3.864c1.757,-0.984 3.466,-1.698 5.129,-2.143c1.662,-0.445 3.337,-0.668 5.023,-0.668c4.075,0 7.494,0.715 10.257,2.143c2.763,1.429 5,3.337 6.709,5.726c1.71,2.388 2.927,5.187 3.653,8.395c0.726,3.208 1.089,6.592 1.089,10.152l0,39.974Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1016.52,116.193c0,0.328 -0.047,0.726 -0.141,1.195c-0.094,0.468 -0.257,1.053 -0.492,1.756l-18.617,60.067c-0.14,0.515 -0.363,0.937 -0.667,1.265c-0.305,0.327 -0.726,0.585 -1.265,0.772c-0.538,0.188 -1.276,0.316 -2.213,0.387c-0.937,0.07 -2.107,0.105 -3.513,0.105c-1.451,0 -2.669,-0.047 -3.653,-0.14c-0.983,-0.094 -1.768,-0.235 -2.353,-0.422c-0.586,-0.187 -1.019,-0.445 -1.3,-0.773c-0.281,-0.328 -0.492,-0.726 -0.632,-1.194l-13.278,-45.876l-0.141,-0.632l-0.14,0.632l-12.295,45.876c-0.14,0.515 -0.363,0.937 -0.667,1.265c-0.304,0.327 -0.761,0.585 -1.37,0.772c-0.609,0.188 -1.393,0.316 -2.353,0.387c-0.961,0.07 -2.143,0.105 -3.548,0.105c-1.452,0 -2.635,-0.047 -3.548,-0.14c-0.913,-0.094 -1.663,-0.235 -2.248,-0.422c-0.586,-0.187 -1.019,-0.445 -1.3,-0.773c-0.281,-0.328 -0.492,-0.726 -0.632,-1.194l-18.477,-60.067c-0.234,-0.703 -0.398,-1.288 -0.492,-1.756c-0.093,-0.469 -0.14,-0.867 -0.14,-1.195c0,-0.421 0.093,-0.761 0.281,-1.018c0.187,-0.258 0.503,-0.469 0.948,-0.633c0.445,-0.164 1.042,-0.269 1.792,-0.316c0.749,-0.047 1.662,-0.07 2.74,-0.07c1.311,0 2.365,0.035 3.161,0.105c0.796,0.071 1.405,0.188 1.827,0.352c0.421,0.164 0.726,0.398 0.913,0.702c0.187,0.305 0.351,0.668 0.492,1.089l15.245,52.128l0.14,0.633l0.141,-0.633l13.98,-52.128c0.094,-0.421 0.246,-0.784 0.457,-1.089c0.211,-0.304 0.527,-0.538 0.948,-0.702c0.422,-0.164 0.996,-0.281 1.722,-0.352c0.726,-0.07 1.674,-0.105 2.845,-0.105c1.124,0 2.049,0.035 2.775,0.105c0.726,0.071 1.3,0.188 1.721,0.352c0.422,0.164 0.726,0.386 0.913,0.667c0.188,0.281 0.328,0.609 0.422,0.984l15.104,52.268l0.141,0.633l0.07,-0.633l15.035,-52.128c0.093,-0.421 0.245,-0.784 0.456,-1.089c0.211,-0.304 0.539,-0.538 0.984,-0.702c0.445,-0.164 1.054,-0.281 1.826,-0.352c0.773,-0.07 1.768,-0.105 2.986,-0.105c1.124,0 2.026,0.023 2.705,0.07c0.679,0.047 1.218,0.164 1.616,0.351c0.398,0.188 0.679,0.399 0.843,0.633c0.164,0.234 0.246,0.562 0.246,0.983Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1076.94,179.632c0,0.563 -0.187,0.984 -0.562,1.265c-0.375,0.281 -0.89,0.492 -1.546,0.632c-0.655,0.141 -1.616,0.211 -2.88,0.211c-1.218,0 -2.19,-0.07 -2.916,-0.211c-0.726,-0.14 -1.252,-0.351 -1.58,-0.632c-0.328,-0.281 -0.492,-0.702 -0.492,-1.265l0,-6.322c-2.763,2.95 -5.843,5.245 -9.238,6.885c-3.396,1.639 -6.991,2.458 -10.784,2.458c-3.326,0 -6.335,-0.433 -9.028,-1.299c-2.693,-0.867 -4.988,-2.12 -6.885,-3.759c-1.897,-1.639 -3.372,-3.653 -4.426,-6.042c-1.054,-2.388 -1.581,-5.105 -1.581,-8.149c0,-3.56 0.726,-6.651 2.178,-9.274c1.452,-2.622 3.536,-4.8 6.253,-6.533c2.716,-1.733 6.042,-3.033 9.976,-3.899c3.934,-0.867 8.36,-1.3 13.278,-1.3l8.711,0l0,-4.918c0,-2.435 -0.257,-4.59 -0.772,-6.463c-0.516,-1.874 -1.347,-3.431 -2.495,-4.672c-1.147,-1.241 -2.634,-2.178 -4.461,-2.81c-1.826,-0.632 -4.074,-0.949 -6.744,-0.949c-2.857,0 -5.421,0.34 -7.693,1.019c-2.271,0.679 -4.262,1.429 -5.971,2.248c-1.71,0.82 -3.138,1.569 -4.286,2.248c-1.147,0.679 -2.002,1.019 -2.564,1.019c-0.375,0 -0.703,-0.094 -0.984,-0.281c-0.281,-0.187 -0.527,-0.468 -0.737,-0.843c-0.211,-0.375 -0.363,-0.855 -0.457,-1.44c-0.094,-0.586 -0.14,-1.23 -0.14,-1.932c0,-1.171 0.081,-2.096 0.245,-2.775c0.164,-0.679 0.562,-1.323 1.195,-1.932c0.632,-0.609 1.721,-1.323 3.267,-2.143c1.545,-0.82 3.325,-1.569 5.339,-2.248c2.014,-0.679 4.215,-1.241 6.604,-1.686c2.388,-0.445 4.8,-0.668 7.236,-0.668c4.543,0 8.407,0.516 11.592,1.546c3.185,1.03 5.761,2.541 7.728,4.531c1.967,1.991 3.395,4.461 4.285,7.412c0.89,2.951 1.335,6.393 1.335,10.327l0,42.644Zm-11.522,-28.874l-9.905,0c-3.185,0 -5.949,0.269 -8.29,0.808c-2.342,0.539 -4.286,1.335 -5.832,2.389c-1.545,1.054 -2.681,2.318 -3.407,3.793c-0.726,1.476 -1.089,3.174 -1.089,5.094c0,3.278 1.042,5.889 3.127,7.833c2.084,1.944 4.999,2.916 8.746,2.916c3.044,0 5.866,-0.773 8.466,-2.319c2.599,-1.545 5.327,-3.91 8.184,-7.095l0,-13.419Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1135.18,120.479c0,1.03 -0.023,1.897 -0.07,2.599c-0.047,0.703 -0.14,1.253 -0.281,1.651c-0.14,0.398 -0.316,0.703 -0.527,0.913c-0.211,0.211 -0.503,0.317 -0.878,0.317c-0.375,0 -0.831,-0.106 -1.37,-0.317c-0.539,-0.21 -1.147,-0.421 -1.827,-0.632c-0.679,-0.211 -1.44,-0.41 -2.283,-0.597c-0.843,-0.187 -1.756,-0.281 -2.74,-0.281c-1.171,0 -2.318,0.234 -3.442,0.703c-1.124,0.468 -2.307,1.241 -3.548,2.318c-1.241,1.077 -2.541,2.506 -3.899,4.285c-1.358,1.78 -2.857,3.958 -4.496,6.534l0,41.59c0,0.375 -0.094,0.691 -0.281,0.949c-0.188,0.257 -0.492,0.48 -0.914,0.667c-0.421,0.187 -1.007,0.328 -1.756,0.422c-0.749,0.093 -1.709,0.14 -2.88,0.14c-1.124,0 -2.061,-0.047 -2.811,-0.14c-0.749,-0.094 -1.346,-0.235 -1.791,-0.422c-0.445,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.375 0.07,-0.691 0.211,-0.949c0.14,-0.257 0.421,-0.491 0.843,-0.702c0.421,-0.211 0.96,-0.351 1.615,-0.422c0.656,-0.07 1.523,-0.105 2.6,-0.105c1.03,0 1.885,0.035 2.564,0.105c0.679,0.071 1.206,0.211 1.581,0.422c0.375,0.211 0.644,0.445 0.808,0.702c0.164,0.258 0.246,0.574 0.246,0.949l0,9.203c1.733,-2.529 3.36,-4.59 4.882,-6.182c1.522,-1.593 2.963,-2.846 4.321,-3.759c1.358,-0.913 2.705,-1.545 4.039,-1.897c1.335,-0.351 2.682,-0.527 4.04,-0.527c0.609,0 1.3,0.036 2.073,0.106c0.772,0.07 1.58,0.199 2.423,0.386c0.843,0.188 1.604,0.398 2.284,0.632c0.679,0.235 1.159,0.469 1.44,0.703c0.281,0.234 0.468,0.457 0.562,0.667c0.093,0.211 0.175,0.48 0.246,0.808c0.07,0.328 0.117,0.808 0.14,1.441c0.024,0.632 0.035,1.487 0.035,2.564Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1200.45,145.208c0,1.827 -0.459,3.126 -1.376,3.899c-0.917,0.773 -1.964,1.159 -3.141,1.159l-41.64,0c0,3.513 0.353,6.675 1.059,9.485c0.706,2.81 1.882,5.222 3.53,7.236c1.647,2.014 3.789,3.559 6.424,4.637c2.636,1.077 5.86,1.615 9.672,1.615c3.012,0 5.694,-0.245 8.047,-0.737c2.354,-0.492 4.389,-1.042 6.107,-1.651c1.718,-0.609 3.13,-1.159 4.236,-1.651c1.106,-0.492 1.942,-0.738 2.507,-0.738c0.329,0 0.623,0.082 0.882,0.246c0.259,0.164 0.458,0.41 0.6,0.738c0.141,0.328 0.247,0.784 0.317,1.37c0.071,0.585 0.106,1.299 0.106,2.142c0,0.609 -0.023,1.136 -0.07,1.581c-0.047,0.445 -0.105,0.843 -0.175,1.194c-0.071,0.352 -0.188,0.668 -0.352,0.949c-0.164,0.281 -0.374,0.55 -0.632,0.808c-0.258,0.257 -1.019,0.679 -2.283,1.264c-1.265,0.586 -2.904,1.16 -4.918,1.722c-2.014,0.562 -4.344,1.065 -6.99,1.51c-2.647,0.445 -5.468,0.667 -8.466,0.667c-5.199,0 -9.753,-0.726 -13.664,-2.177c-3.911,-1.452 -7.201,-3.607 -9.871,-6.464c-2.67,-2.857 -4.683,-6.44 -6.042,-10.749c-1.358,-4.309 -2.037,-9.32 -2.037,-15.034c0,-5.433 0.702,-10.316 2.108,-14.648c1.405,-4.332 3.43,-8.009 6.077,-11.03c2.646,-3.021 5.842,-5.339 9.589,-6.955c3.747,-1.616 7.939,-2.424 12.576,-2.424c4.964,0 9.191,0.797 12.68,2.389c3.49,1.592 6.358,3.735 8.606,6.428c2.249,2.693 3.9,5.855 4.953,9.485c1.054,3.629 1.581,7.505 1.581,11.627l0,2.107Zm-11.662,-3.442c0.14,-6.089 -1.214,-10.866 -4.065,-14.332c-2.85,-3.466 -7.079,-5.199 -12.687,-5.199c-2.875,0 -5.396,0.539 -7.564,1.616c-2.167,1.077 -3.982,2.506 -5.443,4.285c-1.461,1.78 -2.592,3.853 -3.393,6.218c-0.801,2.365 -1.248,4.836 -1.343,7.412l34.495,0Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M379.752,276.089c0,0.493 -0.016,0.924 -0.047,1.294c-0.03,0.369 -0.084,0.693 -0.161,0.97c-0.077,0.277 -0.177,0.524 -0.301,0.739c-0.123,0.216 -0.338,0.478 -0.646,0.786c-0.308,0.308 -0.955,0.778 -1.941,1.409c-0.986,0.631 -2.21,1.247 -3.673,1.848c-1.463,0.601 -3.142,1.109 -5.036,1.525c-1.894,0.416 -3.966,0.623 -6.214,0.623c-3.881,0 -7.385,-0.646 -10.511,-1.94c-3.127,-1.294 -5.791,-3.203 -7.993,-5.729c-2.203,-2.526 -3.897,-5.645 -5.083,-9.356c-1.185,-3.712 -1.778,-7.985 -1.778,-12.821c0,-4.959 0.639,-9.379 1.917,-13.26c1.278,-3.881 3.072,-7.169 5.383,-9.865c2.31,-2.695 5.074,-4.751 8.293,-6.168c3.219,-1.417 6.784,-2.125 10.696,-2.125c1.725,0 3.403,0.162 5.036,0.485c1.632,0.324 3.142,0.732 4.528,1.225c1.386,0.492 2.618,1.062 3.696,1.709c1.078,0.647 1.825,1.178 2.241,1.594c0.416,0.416 0.685,0.732 0.808,0.947c0.123,0.216 0.224,0.47 0.301,0.763c0.077,0.292 0.138,0.639 0.184,1.039c0.047,0.4 0.07,0.878 0.07,1.432c0,0.616 -0.031,1.14 -0.093,1.571c-0.062,0.431 -0.155,0.793 -0.279,1.086c-0.124,0.293 -0.271,0.508 -0.441,0.647c-0.171,0.138 -0.38,0.208 -0.628,0.208c-0.433,0 -1.036,-0.301 -1.811,-0.901c-0.774,-0.601 -1.773,-1.263 -2.996,-1.987c-1.223,-0.724 -2.71,-1.386 -4.459,-1.987c-1.749,-0.6 -3.847,-0.901 -6.294,-0.901c-2.663,0 -5.086,0.532 -7.269,1.594c-2.183,1.063 -4.049,2.626 -5.597,4.69c-1.549,2.064 -2.748,4.582 -3.6,7.554c-0.852,2.972 -1.278,6.368 -1.278,10.188c0,3.788 0.411,7.138 1.231,10.049c0.821,2.91 1.998,5.344 3.53,7.3c1.533,1.956 3.415,3.434 5.644,4.435c2.23,1.001 4.753,1.502 7.571,1.502c2.384,0 4.467,-0.293 6.247,-0.878c1.781,-0.585 3.298,-1.24 4.552,-1.964c1.254,-0.724 2.283,-1.378 3.089,-1.963c0.805,-0.586 1.44,-0.878 1.904,-0.878c0.217,0 0.403,0.046 0.558,0.138c0.154,0.093 0.278,0.27 0.371,0.532c0.093,0.262 0.163,0.623 0.209,1.085c0.046,0.462 0.07,1.048 0.07,1.756Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M428.079,262.136c0,3.388 -0.446,6.507 -1.339,9.356c-0.894,2.849 -2.226,5.306 -3.997,7.369c-1.771,2.064 -3.989,3.673 -6.653,4.828c-2.664,1.156 -5.752,1.733 -9.264,1.733c-3.419,0 -6.399,-0.508 -8.94,-1.525c-2.541,-1.016 -4.659,-2.495 -6.353,-4.435c-1.694,-1.941 -2.957,-4.297 -3.788,-7.069c-0.832,-2.772 -1.248,-5.914 -1.248,-9.425c0,-3.388 0.439,-6.507 1.317,-9.356c0.878,-2.849 2.202,-5.306 3.973,-7.37c1.772,-2.063 3.982,-3.665 6.63,-4.805c2.649,-1.139 5.745,-1.709 9.287,-1.709c3.419,0 6.399,0.508 8.94,1.525c2.541,1.016 4.659,2.494 6.353,4.435c1.694,1.94 2.965,4.297 3.812,7.069c0.847,2.772 1.27,5.898 1.27,9.379Zm-7.9,0.508c0,-2.248 -0.21,-4.374 -0.63,-6.376c-0.419,-2.002 -1.111,-3.757 -2.074,-5.267c-0.964,-1.509 -2.269,-2.703 -3.917,-3.58c-1.647,-0.878 -3.698,-1.317 -6.153,-1.317c-2.269,0 -4.219,0.4 -5.851,1.201c-1.632,0.801 -2.976,1.933 -4.033,3.396c-1.056,1.463 -1.841,3.196 -2.354,5.198c-0.513,2.002 -0.769,4.189 -0.769,6.56c0,2.28 0.21,4.42 0.629,6.423c0.42,2.002 1.119,3.75 2.098,5.244c0.979,1.493 2.292,2.679 3.939,3.557c1.648,0.878 3.699,1.317 6.154,1.317c2.238,0 4.181,-0.401 5.828,-1.201c1.647,-0.801 2.999,-1.925 4.056,-3.373c1.056,-1.448 1.833,-3.173 2.331,-5.175c0.497,-2.002 0.746,-4.204 0.746,-6.607Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M500.987,283.389c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.77,0 -1.401,-0.03 -1.894,-0.092c-0.493,-0.062 -0.886,-0.154 -1.178,-0.277c-0.293,-0.123 -0.501,-0.27 -0.624,-0.439c-0.123,-0.17 -0.185,-0.377 -0.185,-0.624l0,-25.273c0,-1.755 -0.154,-3.357 -0.462,-4.805c-0.308,-1.447 -0.801,-2.695 -1.478,-3.742c-0.678,-1.047 -1.54,-1.848 -2.588,-2.403c-1.047,-0.554 -2.279,-0.831 -3.696,-0.831c-1.756,0 -3.519,0.677 -5.29,2.033c-1.771,1.355 -3.719,3.342 -5.845,5.96l0,29.061c0,0.247 -0.061,0.454 -0.184,0.624c-0.124,0.169 -0.332,0.316 -0.624,0.439c-0.293,0.123 -0.685,0.215 -1.178,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.709,0 -1.317,-0.03 -1.825,-0.092c-0.509,-0.062 -0.909,-0.154 -1.202,-0.277c-0.292,-0.123 -0.492,-0.27 -0.6,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-25.273c0,-1.755 -0.169,-3.357 -0.508,-4.805c-0.339,-1.447 -0.847,-2.695 -1.525,-3.742c-0.678,-1.047 -1.532,-1.848 -2.564,-2.403c-1.032,-0.554 -2.256,-0.831 -3.673,-0.831c-1.756,0 -3.527,0.677 -5.314,2.033c-1.786,1.355 -3.727,3.342 -5.821,5.96l0,29.061c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.6,0.439c-0.278,0.123 -0.663,0.215 -1.156,0.277c-0.492,0.062 -1.124,0.092 -1.894,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.108,-0.17 -0.161,-0.377 -0.161,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.138,-0.624c0.093,-0.169 0.277,-0.323 0.555,-0.462c0.277,-0.138 0.631,-0.231 1.062,-0.277c0.432,-0.046 1.001,-0.069 1.71,-0.069c0.677,0 1.24,0.023 1.686,0.069c0.447,0.046 0.793,0.139 1.04,0.277c0.246,0.139 0.423,0.293 0.531,0.462c0.108,0.17 0.162,0.378 0.162,0.624l0,5.498c2.341,-2.618 4.612,-4.535 6.815,-5.752c2.202,-1.217 4.427,-1.825 6.676,-1.825c1.725,0 3.273,0.2 4.643,0.601c1.371,0.4 2.58,0.962 3.627,1.686c1.047,0.724 1.941,1.586 2.68,2.587c0.739,1.001 1.355,2.118 1.848,3.35c1.386,-1.509 2.703,-2.788 3.95,-3.835c1.248,-1.047 2.449,-1.894 3.604,-2.541c1.155,-0.647 2.279,-1.117 3.373,-1.409c1.093,-0.293 2.194,-0.439 3.303,-0.439c2.68,0 4.929,0.47 6.746,1.409c1.817,0.939 3.288,2.195 4.412,3.766c1.124,1.57 1.925,3.411 2.403,5.521c0.477,2.11 0.716,4.335 0.716,6.676l0,26.289Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M576.574,283.389c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.492,0.062 -1.108,0.092 -1.848,0.092c-0.77,0 -1.401,-0.03 -1.894,-0.092c-0.493,-0.062 -0.886,-0.154 -1.178,-0.277c-0.293,-0.123 -0.501,-0.27 -0.624,-0.439c-0.123,-0.17 -0.185,-0.377 -0.185,-0.624l0,-25.273c0,-1.755 -0.154,-3.357 -0.462,-4.805c-0.308,-1.447 -0.801,-2.695 -1.478,-3.742c-0.678,-1.047 -1.54,-1.848 -2.588,-2.403c-1.047,-0.554 -2.279,-0.831 -3.696,-0.831c-1.755,0 -3.519,0.677 -5.29,2.033c-1.771,1.355 -3.719,3.342 -5.844,5.96l0,29.061c0,0.247 -0.062,0.454 -0.185,0.624c-0.124,0.169 -0.331,0.316 -0.624,0.439c-0.293,0.123 -0.685,0.215 -1.178,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.709,0 -1.317,-0.03 -1.825,-0.092c-0.509,-0.062 -0.909,-0.154 -1.202,-0.277c-0.292,-0.123 -0.492,-0.27 -0.6,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-25.273c0,-1.755 -0.169,-3.357 -0.508,-4.805c-0.339,-1.447 -0.847,-2.695 -1.525,-3.742c-0.677,-1.047 -1.532,-1.848 -2.564,-2.403c-1.032,-0.554 -2.256,-0.831 -3.673,-0.831c-1.756,0 -3.527,0.677 -5.313,2.033c-1.787,1.355 -3.727,3.342 -5.822,5.96l0,29.061c0,0.247 -0.061,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.6,0.439c-0.278,0.123 -0.663,0.215 -1.155,0.277c-0.493,0.062 -1.125,0.092 -1.895,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.107,-0.17 -0.161,-0.377 -0.161,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.138,-0.624c0.093,-0.169 0.278,-0.323 0.555,-0.462c0.277,-0.138 0.631,-0.231 1.062,-0.277c0.432,-0.046 1.001,-0.069 1.71,-0.069c0.678,0 1.24,0.023 1.686,0.069c0.447,0.046 0.793,0.139 1.04,0.277c0.246,0.139 0.423,0.293 0.531,0.462c0.108,0.17 0.162,0.378 0.162,0.624l0,5.498c2.341,-2.618 4.612,-4.535 6.815,-5.752c2.202,-1.217 4.427,-1.825 6.676,-1.825c1.725,0 3.273,0.2 4.643,0.601c1.371,0.4 2.58,0.962 3.627,1.686c1.047,0.724 1.941,1.586 2.68,2.587c0.739,1.001 1.355,2.118 1.848,3.35c1.386,-1.509 2.703,-2.788 3.95,-3.835c1.248,-1.047 2.449,-1.894 3.604,-2.541c1.155,-0.647 2.279,-1.117 3.373,-1.409c1.093,-0.293 2.195,-0.439 3.303,-0.439c2.68,0 4.929,0.47 6.746,1.409c1.817,0.939 3.288,2.195 4.412,3.766c1.125,1.57 1.925,3.411 2.403,5.521c0.477,2.11 0.716,4.335 0.716,6.676l0,26.289Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M626.103,283.389c0,0.247 -0.054,0.454 -0.162,0.624c-0.108,0.169 -0.3,0.316 -0.577,0.439c-0.278,0.123 -0.639,0.215 -1.086,0.277c-0.447,0.062 -0.993,0.092 -1.64,0.092c-0.709,0 -1.286,-0.03 -1.733,-0.092c-0.447,-0.062 -0.801,-0.154 -1.063,-0.277c-0.261,-0.123 -0.438,-0.27 -0.531,-0.439c-0.092,-0.17 -0.138,-0.377 -0.138,-0.624l0,-5.498c-2.372,2.618 -4.713,4.528 -7.023,5.729c-2.31,1.201 -4.651,1.802 -7.023,1.802c-2.772,0 -5.105,-0.462 -7,-1.386c-1.894,-0.924 -3.426,-2.179 -4.597,-3.766c-1.17,-1.586 -2.01,-3.434 -2.518,-5.544c-0.508,-2.11 -0.762,-4.674 -0.762,-7.693l0,-25.226c0,-0.246 0.054,-0.454 0.162,-0.624c0.107,-0.169 0.315,-0.323 0.623,-0.462c0.308,-0.138 0.709,-0.231 1.202,-0.277c0.492,-0.046 1.108,-0.069 1.848,-0.069c0.739,0 1.355,0.023 1.848,0.069c0.493,0.046 0.885,0.139 1.178,0.277c0.292,0.139 0.5,0.293 0.624,0.462c0.123,0.17 0.184,0.378 0.184,0.624l0,24.21c0,2.433 0.178,4.382 0.532,5.845c0.354,1.463 0.893,2.71 1.617,3.742c0.724,1.032 1.64,1.833 2.749,2.403c1.109,0.569 2.402,0.854 3.881,0.854c1.91,0 3.812,-0.677 5.706,-2.033c1.894,-1.355 3.904,-3.342 6.029,-5.96l0,-29.061c0,-0.246 0.054,-0.454 0.162,-0.624c0.108,-0.169 0.316,-0.323 0.624,-0.462c0.308,-0.138 0.7,-0.231 1.178,-0.277c0.477,-0.046 1.101,-0.069 1.871,-0.069c0.739,0 1.355,0.023 1.848,0.069c0.493,0.046 0.878,0.139 1.155,0.277c0.277,0.139 0.485,0.293 0.624,0.462c0.139,0.17 0.208,0.378 0.208,0.624l0,41.582Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M676.001,283.389c0,0.247 -0.061,0.454 -0.184,0.624c-0.124,0.169 -0.324,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.77,0 -1.402,-0.03 -1.894,-0.092c-0.493,-0.062 -0.878,-0.154 -1.155,-0.277c-0.278,-0.123 -0.478,-0.27 -0.601,-0.439c-0.123,-0.17 -0.185,-0.377 -0.185,-0.624l0,-24.349c0,-2.371 -0.185,-4.281 -0.554,-5.729c-0.37,-1.447 -0.909,-2.695 -1.617,-3.742c-0.709,-1.047 -1.625,-1.848 -2.749,-2.403c-1.125,-0.554 -2.426,-0.831 -3.905,-0.831c-1.909,0 -3.819,0.677 -5.729,2.033c-1.909,1.355 -3.911,3.342 -6.006,5.96l0,29.061c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.6,0.439c-0.278,0.123 -0.663,0.215 -1.155,0.277c-0.493,0.062 -1.125,0.092 -1.895,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.107,-0.17 -0.161,-0.377 -0.161,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.138,-0.624c0.093,-0.169 0.277,-0.323 0.555,-0.462c0.277,-0.138 0.631,-0.231 1.062,-0.277c0.432,-0.046 1.001,-0.069 1.71,-0.069c0.677,0 1.24,0.023 1.686,0.069c0.447,0.046 0.793,0.139 1.04,0.277c0.246,0.139 0.423,0.293 0.531,0.462c0.108,0.17 0.162,0.378 0.162,0.624l0,5.498c2.341,-2.618 4.674,-4.535 6.999,-5.752c2.326,-1.217 4.675,-1.825 7.046,-1.825c2.772,0 5.106,0.47 7,1.409c1.894,0.939 3.427,2.195 4.597,3.766c1.171,1.57 2.01,3.411 2.518,5.521c0.508,2.11 0.762,4.643 0.762,7.6l0,25.365Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M697.532,283.389c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.124,0.092 -1.894,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.886,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-41.582c0,-0.216 0.054,-0.416 0.162,-0.601c0.108,-0.184 0.308,-0.338 0.601,-0.462c0.292,-0.123 0.685,-0.215 1.178,-0.277c0.493,-0.061 1.109,-0.092 1.848,-0.092c0.77,0 1.401,0.031 1.894,0.092c0.493,0.062 0.878,0.154 1.155,0.277c0.278,0.124 0.478,0.278 0.601,0.462c0.123,0.185 0.185,0.385 0.185,0.601l0,41.582Zm0.878,-55.628c0,1.787 -0.339,3.004 -1.017,3.65c-0.677,0.647 -1.925,0.971 -3.742,0.971c-1.787,0 -3.011,-0.316 -3.673,-0.947c-0.663,-0.632 -0.994,-1.825 -0.994,-3.581c0,-1.787 0.339,-3.003 1.017,-3.65c0.677,-0.647 1.925,-0.97 3.742,-0.97c1.787,0 3.011,0.315 3.673,0.947c0.663,0.631 0.994,1.825 0.994,3.58Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M733.246,280.34c0,0.893 -0.061,1.601 -0.185,2.125c-0.123,0.524 -0.308,0.909 -0.554,1.155c-0.246,0.247 -0.616,0.478 -1.109,0.693c-0.493,0.216 -1.055,0.393 -1.686,0.532c-0.632,0.138 -1.302,0.254 -2.01,0.346c-0.708,0.092 -1.417,0.139 -2.125,0.139c-2.156,0 -4.005,-0.285 -5.545,-0.855c-1.54,-0.57 -2.803,-1.432 -3.788,-2.587c-0.986,-1.155 -1.702,-2.619 -2.149,-4.39c-0.446,-1.771 -0.67,-3.858 -0.67,-6.26l0,-24.303l-5.821,0c-0.462,0 -0.832,-0.246 -1.109,-0.739c-0.277,-0.493 -0.416,-1.293 -0.416,-2.402c0,-0.586 0.039,-1.078 0.116,-1.479c0.077,-0.4 0.177,-0.731 0.3,-0.993c0.123,-0.262 0.285,-0.447 0.485,-0.555c0.2,-0.107 0.424,-0.161 0.67,-0.161l5.775,0l0,-9.888c0,-0.215 0.054,-0.415 0.162,-0.6c0.108,-0.185 0.308,-0.347 0.601,-0.485c0.292,-0.139 0.685,-0.239 1.178,-0.301c0.493,-0.061 1.109,-0.092 1.848,-0.092c0.77,0 1.401,0.031 1.894,0.092c0.493,0.062 0.878,0.162 1.155,0.301c0.278,0.138 0.478,0.3 0.601,0.485c0.123,0.185 0.185,0.385 0.185,0.6l0,9.888l10.673,0c0.246,0 0.462,0.054 0.646,0.161c0.185,0.108 0.347,0.293 0.486,0.555c0.138,0.262 0.238,0.593 0.3,0.993c0.061,0.401 0.092,0.893 0.092,1.479c0,1.109 -0.138,1.909 -0.416,2.402c-0.277,0.493 -0.646,0.739 -1.108,0.739l-10.673,0l0,23.194c0,2.865 0.423,5.028 1.27,6.491c0.847,1.464 2.364,2.195 4.551,2.195c0.709,0 1.34,-0.069 1.895,-0.208c0.554,-0.138 1.047,-0.285 1.478,-0.439c0.431,-0.154 0.801,-0.3 1.109,-0.439c0.308,-0.138 0.585,-0.208 0.832,-0.208c0.154,0 0.3,0.039 0.439,0.116c0.138,0.077 0.246,0.223 0.323,0.439c0.077,0.215 0.146,0.508 0.208,0.878c0.061,0.369 0.092,0.831 0.092,1.386Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M762.261,284.544l-5.544,15.293c-0.185,0.493 -0.654,0.87 -1.409,1.132c-0.755,0.262 -1.902,0.393 -3.442,0.393c-0.801,0 -1.448,-0.039 -1.941,-0.116c-0.493,-0.077 -0.87,-0.208 -1.132,-0.392c-0.261,-0.185 -0.408,-0.432 -0.439,-0.74c-0.03,-0.308 0.047,-0.677 0.231,-1.108l5.73,-14.462c-0.278,-0.123 -0.539,-0.323 -0.786,-0.6c-0.246,-0.278 -0.416,-0.57 -0.508,-0.878l-14.831,-39.734c-0.247,-0.647 -0.37,-1.155 -0.37,-1.525c0,-0.37 0.123,-0.662 0.37,-0.878c0.246,-0.215 0.647,-0.362 1.201,-0.439c0.555,-0.077 1.294,-0.115 2.218,-0.115c0.924,0 1.648,0.023 2.171,0.069c0.524,0.046 0.94,0.131 1.248,0.254c0.308,0.123 0.531,0.3 0.67,0.531c0.138,0.231 0.285,0.547 0.439,0.948l11.874,33.358l0.138,0l11.459,-33.543c0.184,-0.585 0.408,-0.963 0.669,-1.132c0.262,-0.17 0.655,-0.293 1.179,-0.37c0.523,-0.077 1.278,-0.115 2.264,-0.115c0.862,0 1.57,0.038 2.125,0.115c0.554,0.077 0.962,0.224 1.224,0.439c0.262,0.216 0.393,0.508 0.393,0.878c0,0.37 -0.092,0.832 -0.277,1.386l-14.924,41.351Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M840.528,267.773c0,2.803 -0.516,5.298 -1.548,7.485c-1.031,2.186 -2.464,4.042 -4.296,5.567c-1.833,1.525 -3.989,2.672 -6.469,3.442c-2.479,0.77 -5.151,1.155 -8.016,1.155c-2.002,0 -3.858,-0.169 -5.567,-0.508c-1.71,-0.339 -3.234,-0.755 -4.574,-1.248c-1.34,-0.492 -2.464,-1.001 -3.373,-1.524c-0.909,-0.524 -1.54,-0.971 -1.894,-1.34c-0.355,-0.37 -0.616,-0.84 -0.786,-1.409c-0.169,-0.57 -0.254,-1.333 -0.254,-2.287c0,-0.678 0.031,-1.24 0.093,-1.687c0.061,-0.446 0.154,-0.808 0.277,-1.086c0.123,-0.277 0.277,-0.469 0.462,-0.577c0.185,-0.108 0.4,-0.162 0.647,-0.162c0.431,0 1.039,0.262 1.825,0.786c0.785,0.523 1.794,1.093 3.026,1.709c1.232,0.616 2.718,1.194 4.458,1.733c1.741,0.539 3.75,0.808 6.03,0.808c1.725,0 3.303,-0.231 4.736,-0.693c1.432,-0.462 2.664,-1.116 3.696,-1.963c1.032,-0.847 1.825,-1.887 2.379,-3.119c0.555,-1.232 0.832,-2.634 0.832,-4.204c0,-1.695 -0.385,-3.142 -1.155,-4.343c-0.77,-1.202 -1.787,-2.257 -3.05,-3.165c-1.262,-0.909 -2.702,-1.741 -4.32,-2.495c-1.617,-0.755 -3.272,-1.525 -4.966,-2.31c-1.694,-0.786 -3.342,-1.656 -4.944,-2.611c-1.602,-0.955 -3.034,-2.079 -4.297,-3.373c-1.263,-1.293 -2.287,-2.81 -3.072,-4.551c-0.786,-1.74 -1.178,-3.827 -1.178,-6.26c0,-2.495 0.454,-4.72 1.363,-6.676c0.908,-1.956 2.171,-3.596 3.788,-4.921c1.617,-1.324 3.542,-2.333 5.775,-3.026c2.234,-0.693 4.644,-1.04 7.231,-1.04c1.325,0 2.657,0.116 3.997,0.347c1.34,0.231 2.602,0.539 3.788,0.924c1.186,0.385 2.241,0.816 3.165,1.294c0.924,0.477 1.532,0.862 1.825,1.155c0.293,0.292 0.485,0.523 0.578,0.693c0.092,0.169 0.169,0.385 0.231,0.647c0.061,0.261 0.107,0.577 0.138,0.947c0.031,0.369 0.046,0.847 0.046,1.432c0,0.554 -0.023,1.047 -0.069,1.479c-0.046,0.431 -0.115,0.793 -0.208,1.085c-0.092,0.293 -0.223,0.508 -0.392,0.647c-0.17,0.139 -0.362,0.208 -0.578,0.208c-0.339,0 -0.87,-0.216 -1.594,-0.647c-0.724,-0.431 -1.609,-0.916 -2.657,-1.455c-1.047,-0.539 -2.287,-1.032 -3.719,-1.479c-1.432,-0.446 -3.042,-0.67 -4.828,-0.67c-1.663,0 -3.111,0.224 -4.343,0.67c-1.232,0.447 -2.249,1.04 -3.049,1.779c-0.801,0.739 -1.402,1.617 -1.802,2.634c-0.401,1.016 -0.601,2.094 -0.601,3.234c0,1.663 0.385,3.095 1.155,4.297c0.77,1.201 1.794,2.264 3.073,3.188c1.278,0.924 2.733,1.771 4.366,2.541c1.632,0.77 3.295,1.548 4.99,2.333c1.694,0.785 3.357,1.648 4.989,2.587c1.633,0.94 3.088,2.049 4.367,3.327c1.278,1.278 2.31,2.787 3.095,4.528c0.786,1.74 1.178,3.796 1.178,6.168Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M886.638,283.389c0,0.247 -0.054,0.454 -0.161,0.624c-0.108,0.169 -0.301,0.316 -0.578,0.439c-0.277,0.123 -0.639,0.215 -1.086,0.277c-0.446,0.062 -0.993,0.092 -1.64,0.092c-0.708,0 -1.286,-0.03 -1.733,-0.092c-0.446,-0.062 -0.8,-0.154 -1.062,-0.277c-0.262,-0.123 -0.439,-0.27 -0.532,-0.439c-0.092,-0.17 -0.138,-0.377 -0.138,-0.624l0,-5.498c-2.372,2.618 -4.713,4.528 -7.023,5.729c-2.31,1.201 -4.651,1.802 -7.023,1.802c-2.772,0 -5.105,-0.462 -6.999,-1.386c-1.895,-0.924 -3.427,-2.179 -4.597,-3.766c-1.171,-1.586 -2.01,-3.434 -2.519,-5.544c-0.508,-2.11 -0.762,-4.674 -0.762,-7.693l0,-25.226c0,-0.246 0.054,-0.454 0.162,-0.624c0.108,-0.169 0.316,-0.323 0.624,-0.462c0.308,-0.138 0.708,-0.231 1.201,-0.277c0.493,-0.046 1.109,-0.069 1.848,-0.069c0.739,0 1.355,0.023 1.848,0.069c0.493,0.046 0.886,0.139 1.178,0.277c0.293,0.139 0.501,0.293 0.624,0.462c0.123,0.17 0.185,0.378 0.185,0.624l0,24.21c0,2.433 0.177,4.382 0.531,5.845c0.354,1.463 0.893,2.71 1.617,3.742c0.724,1.032 1.64,1.833 2.749,2.403c1.109,0.569 2.403,0.854 3.881,0.854c1.91,0 3.812,-0.677 5.706,-2.033c1.895,-1.355 3.904,-3.342 6.03,-5.96l0,-29.061c0,-0.246 0.054,-0.454 0.161,-0.624c0.108,-0.169 0.316,-0.323 0.624,-0.462c0.308,-0.138 0.701,-0.231 1.178,-0.277c0.478,-0.046 1.101,-0.069 1.871,-0.069c0.74,0 1.356,0.023 1.849,0.069c0.492,0.046 0.877,0.139 1.155,0.277c0.277,0.139 0.485,0.293 0.623,0.462c0.139,0.17 0.208,0.378 0.208,0.624l0,41.582Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M938.986,261.951c0,3.635 -0.393,6.9 -1.179,9.795c-0.785,2.895 -1.94,5.352 -3.465,7.369c-1.524,2.018 -3.411,3.573 -5.66,4.667c-2.248,1.093 -4.82,1.64 -7.715,1.64c-1.232,0 -2.372,-0.123 -3.419,-0.37c-1.048,-0.246 -2.072,-0.631 -3.073,-1.155c-1.001,-0.523 -1.994,-1.185 -2.98,-1.986c-0.986,-0.801 -2.033,-1.741 -3.142,-2.819l0,20.791c0,0.247 -0.061,0.462 -0.184,0.647c-0.124,0.185 -0.324,0.339 -0.601,0.462c-0.277,0.123 -0.662,0.216 -1.155,0.277c-0.493,0.062 -1.124,0.093 -1.894,0.093c-0.74,0 -1.356,-0.031 -1.849,-0.093c-0.492,-0.061 -0.885,-0.154 -1.178,-0.277c-0.292,-0.123 -0.493,-0.277 -0.6,-0.462c-0.108,-0.185 -0.162,-0.4 -0.162,-0.647l0,-58.076c0,-0.277 0.046,-0.501 0.139,-0.67c0.092,-0.169 0.277,-0.316 0.554,-0.439c0.277,-0.123 0.631,-0.208 1.063,-0.254c0.431,-0.046 0.954,-0.069 1.571,-0.069c0.646,0 1.178,0.023 1.594,0.069c0.415,0.046 0.762,0.131 1.039,0.254c0.277,0.123 0.47,0.27 0.578,0.439c0.107,0.169 0.161,0.393 0.161,0.67l0,5.59c1.263,-1.293 2.48,-2.417 3.65,-3.372c1.171,-0.955 2.349,-1.748 3.535,-2.38c1.186,-0.631 2.402,-1.109 3.65,-1.432c1.247,-0.323 2.564,-0.485 3.95,-0.485c3.019,0 5.591,0.585 7.716,1.756c2.125,1.17 3.858,2.772 5.198,4.805c1.34,2.033 2.317,4.397 2.933,7.092c0.617,2.695 0.925,5.552 0.925,8.57Zm-7.901,0.878c0,-2.125 -0.163,-4.181 -0.488,-6.168c-0.325,-1.987 -0.883,-3.75 -1.673,-5.29c-0.791,-1.54 -1.852,-2.772 -3.185,-3.696c-1.332,-0.924 -2.99,-1.386 -4.974,-1.386c-0.992,0 -1.968,0.146 -2.929,0.439c-0.96,0.292 -1.936,0.754 -2.928,1.386c-0.992,0.631 -2.03,1.463 -3.115,2.495c-1.085,1.031 -2.231,2.302 -3.44,3.811l0,16.541c2.108,2.556 4.107,4.512 5.997,5.867c1.891,1.356 3.874,2.033 5.95,2.033c1.922,0 3.572,-0.462 4.951,-1.386c1.379,-0.924 2.495,-2.156 3.347,-3.696c0.852,-1.54 1.48,-3.265 1.883,-5.175c0.403,-1.909 0.604,-3.834 0.604,-5.775Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M988.699,261.951c0,3.635 -0.392,6.9 -1.178,9.795c-0.785,2.895 -1.94,5.352 -3.465,7.369c-1.525,2.018 -3.411,3.573 -5.66,4.667c-2.248,1.093 -4.82,1.64 -7.716,1.64c-1.232,0 -2.371,-0.123 -3.419,-0.37c-1.047,-0.246 -2.071,-0.631 -3.072,-1.155c-1.001,-0.523 -1.994,-1.185 -2.98,-1.986c-0.986,-0.801 -2.033,-1.741 -3.142,-2.819l0,20.791c0,0.247 -0.061,0.462 -0.185,0.647c-0.123,0.185 -0.323,0.339 -0.6,0.462c-0.278,0.123 -0.663,0.216 -1.155,0.277c-0.493,0.062 -1.125,0.093 -1.895,0.093c-0.739,0 -1.355,-0.031 -1.848,-0.093c-0.493,-0.061 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.277 -0.601,-0.462c-0.107,-0.185 -0.161,-0.4 -0.161,-0.647l0,-58.076c0,-0.277 0.046,-0.501 0.138,-0.67c0.093,-0.169 0.278,-0.316 0.555,-0.439c0.277,-0.123 0.631,-0.208 1.062,-0.254c0.432,-0.046 0.955,-0.069 1.571,-0.069c0.647,0 1.178,0.023 1.594,0.069c0.416,0.046 0.763,0.131 1.04,0.254c0.277,0.123 0.47,0.27 0.577,0.439c0.108,0.169 0.162,0.393 0.162,0.67l0,5.59c1.263,-1.293 2.48,-2.417 3.65,-3.372c1.171,-0.955 2.349,-1.748 3.535,-2.38c1.185,-0.631 2.402,-1.109 3.65,-1.432c1.247,-0.323 2.564,-0.485 3.95,-0.485c3.018,0 5.59,0.585 7.716,1.756c2.125,1.17 3.858,2.772 5.197,4.805c1.34,2.033 2.318,4.397 2.934,7.092c0.616,2.695 0.924,5.552 0.924,8.57Zm-7.9,0.878c0,-2.125 -0.163,-4.181 -0.488,-6.168c-0.326,-1.987 -0.883,-3.75 -1.674,-5.29c-0.79,-1.54 -1.851,-2.772 -3.184,-3.696c-1.333,-0.924 -2.991,-1.386 -4.974,-1.386c-0.992,0 -1.968,0.146 -2.929,0.439c-0.96,0.292 -1.937,0.754 -2.928,1.386c-0.992,0.631 -2.03,1.463 -3.115,2.495c-1.085,1.031 -2.231,2.302 -3.44,3.811l0,16.541c2.108,2.556 4.107,4.512 5.997,5.867c1.891,1.356 3.874,2.033 5.95,2.033c1.921,0 3.571,-0.462 4.951,-1.386c1.379,-0.924 2.494,-2.156 3.347,-3.696c0.852,-1.54 1.48,-3.265 1.882,-5.175c0.403,-1.909 0.605,-3.834 0.605,-5.775Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1038.83,262.136c0,3.388 -0.447,6.507 -1.34,9.356c-0.893,2.849 -2.225,5.306 -3.996,7.369c-1.772,2.064 -3.989,3.673 -6.654,4.828c-2.664,1.156 -5.752,1.733 -9.263,1.733c-3.419,0 -6.399,-0.508 -8.94,-1.525c-2.541,-1.016 -4.659,-2.495 -6.353,-4.435c-1.694,-1.941 -2.957,-4.297 -3.789,-7.069c-0.831,-2.772 -1.247,-5.914 -1.247,-9.425c0,-3.388 0.439,-6.507 1.317,-9.356c0.877,-2.849 2.202,-5.306 3.973,-7.37c1.771,-2.063 3.981,-3.665 6.63,-4.805c2.649,-1.139 5.744,-1.709 9.287,-1.709c3.419,0 6.399,0.508 8.94,1.525c2.541,1.016 4.659,2.494 6.353,4.435c1.694,1.94 2.964,4.297 3.811,7.069c0.847,2.772 1.271,5.898 1.271,9.379Zm-7.901,0.508c0,-2.248 -0.21,-4.374 -0.629,-6.376c-0.42,-2.002 -1.111,-3.757 -2.075,-5.267c-0.963,-1.509 -2.269,-2.703 -3.916,-3.58c-1.647,-0.878 -3.698,-1.317 -6.154,-1.317c-2.269,0 -4.219,0.4 -5.851,1.201c-1.631,0.801 -2.976,1.933 -4.032,3.396c-1.057,1.463 -1.842,3.196 -2.354,5.198c-0.513,2.002 -0.77,4.189 -0.77,6.56c0,2.28 0.21,4.42 0.63,6.423c0.42,2.002 1.119,3.75 2.098,5.244c0.979,1.493 2.292,2.679 3.939,3.557c1.647,0.878 3.698,1.317 6.154,1.317c2.238,0 4.18,-0.401 5.827,-1.201c1.648,-0.801 3,-1.925 4.056,-3.373c1.057,-1.448 1.834,-3.173 2.331,-5.175c0.498,-2.002 0.746,-4.204 0.746,-6.607Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1074.36,244.533c0,0.678 -0.016,1.247 -0.047,1.709c-0.03,0.462 -0.092,0.824 -0.184,1.086c-0.093,0.262 -0.208,0.462 -0.347,0.601c-0.139,0.138 -0.331,0.208 -0.577,0.208c-0.247,0 -0.547,-0.07 -0.901,-0.208c-0.355,-0.139 -0.755,-0.277 -1.202,-0.416c-0.446,-0.139 -0.947,-0.27 -1.501,-0.393c-0.555,-0.123 -1.155,-0.185 -1.802,-0.185c-0.77,0 -1.525,0.154 -2.264,0.462c-0.739,0.308 -1.517,0.817 -2.333,1.525c-0.817,0.709 -1.671,1.648 -2.565,2.818c-0.893,1.171 -1.878,2.603 -2.956,4.297l0,27.352c0,0.247 -0.062,0.454 -0.185,0.624c-0.124,0.169 -0.324,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.124,0.092 -1.894,0.092c-0.74,0 -1.356,-0.03 -1.848,-0.092c-0.493,-0.062 -0.886,-0.154 -1.179,-0.277c-0.292,-0.123 -0.492,-0.27 -0.6,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.139,-0.624c0.092,-0.169 0.277,-0.323 0.554,-0.462c0.277,-0.138 0.632,-0.231 1.063,-0.277c0.431,-0.046 1.001,-0.069 1.709,-0.069c0.678,0 1.24,0.023 1.687,0.069c0.446,0.046 0.793,0.139 1.039,0.277c0.247,0.139 0.424,0.293 0.532,0.462c0.107,0.17 0.161,0.378 0.161,0.624l0,6.052c1.14,-1.663 2.21,-3.018 3.211,-4.065c1.001,-1.048 1.949,-1.872 2.842,-2.472c0.893,-0.601 1.779,-1.017 2.656,-1.248c0.878,-0.231 1.764,-0.346 2.657,-0.346c0.4,0 0.855,0.023 1.363,0.069c0.508,0.046 1.04,0.131 1.594,0.254c0.554,0.123 1.055,0.262 1.502,0.416c0.446,0.154 0.762,0.308 0.947,0.462c0.185,0.154 0.308,0.3 0.369,0.439c0.062,0.139 0.116,0.316 0.162,0.531c0.046,0.216 0.077,0.532 0.092,0.948c0.016,0.415 0.024,0.977 0.024,1.686Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1104.67,280.34c0,0.893 -0.061,1.601 -0.184,2.125c-0.124,0.524 -0.308,0.909 -0.555,1.155c-0.246,0.247 -0.616,0.478 -1.109,0.693c-0.493,0.216 -1.055,0.393 -1.686,0.532c-0.632,0.138 -1.302,0.254 -2.01,0.346c-0.708,0.092 -1.417,0.139 -2.125,0.139c-2.156,0 -4.004,-0.285 -5.545,-0.855c-1.54,-0.57 -2.802,-1.432 -3.788,-2.587c-0.986,-1.155 -1.702,-2.619 -2.149,-4.39c-0.446,-1.771 -0.669,-3.858 -0.669,-6.26l0,-24.303l-5.822,0c-0.462,0 -0.832,-0.246 -1.109,-0.739c-0.277,-0.493 -0.416,-1.293 -0.416,-2.402c0,-0.586 0.039,-1.078 0.116,-1.479c0.077,-0.4 0.177,-0.731 0.3,-0.993c0.123,-0.262 0.285,-0.447 0.485,-0.555c0.2,-0.107 0.424,-0.161 0.67,-0.161l5.776,0l0,-9.888c0,-0.215 0.053,-0.415 0.161,-0.6c0.108,-0.185 0.308,-0.347 0.601,-0.485c0.292,-0.139 0.685,-0.239 1.178,-0.301c0.493,-0.061 1.109,-0.092 1.848,-0.092c0.77,0 1.402,0.031 1.894,0.092c0.493,0.062 0.878,0.162 1.155,0.301c0.278,0.138 0.478,0.3 0.601,0.485c0.123,0.185 0.185,0.385 0.185,0.6l0,9.888l10.673,0c0.246,0 0.462,0.054 0.646,0.161c0.185,0.108 0.347,0.293 0.486,0.555c0.138,0.262 0.238,0.593 0.3,0.993c0.062,0.401 0.092,0.893 0.092,1.479c0,1.109 -0.138,1.909 -0.415,2.402c-0.278,0.493 -0.647,0.739 -1.109,0.739l-10.673,0l0,23.194c0,2.865 0.423,5.028 1.27,6.491c0.848,1.464 2.364,2.195 4.551,2.195c0.709,0 1.34,-0.069 1.895,-0.208c0.554,-0.138 1.047,-0.285 1.478,-0.439c0.431,-0.154 0.801,-0.3 1.109,-0.439c0.308,-0.138 0.585,-0.208 0.832,-0.208c0.154,0 0.3,0.039 0.439,0.116c0.138,0.077 0.246,0.223 0.323,0.439c0.077,0.215 0.146,0.508 0.208,0.878c0.062,0.369 0.092,0.831 0.092,1.386Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1149.21,260.796c0,1.201 -0.301,2.056 -0.904,2.564c-0.604,0.509 -1.292,0.763 -2.066,0.763l-27.385,0c0,2.31 0.233,4.389 0.697,6.237c0.464,1.848 1.238,3.434 2.321,4.759c1.083,1.324 2.492,2.341 4.225,3.049c1.733,0.709 3.854,1.063 6.36,1.063c1.981,0 3.746,-0.162 5.293,-0.485c1.548,-0.324 2.886,-0.686 4.016,-1.086c1.13,-0.4 2.059,-0.762 2.786,-1.086c0.727,-0.323 1.277,-0.485 1.649,-0.485c0.216,0 0.409,0.054 0.58,0.162c0.17,0.108 0.301,0.269 0.394,0.485c0.093,0.216 0.163,0.516 0.209,0.901c0.047,0.385 0.07,0.855 0.07,1.409c0,0.401 -0.016,0.747 -0.046,1.04c-0.031,0.292 -0.07,0.554 -0.116,0.785c-0.046,0.231 -0.123,0.439 -0.231,0.624c-0.108,0.185 -0.246,0.362 -0.416,0.531c-0.169,0.17 -0.67,0.447 -1.501,0.832c-0.832,0.385 -1.91,0.762 -3.235,1.132c-1.324,0.369 -2.856,0.701 -4.597,0.993c-1.74,0.293 -3.596,0.439 -5.567,0.439c-3.419,0 -6.414,-0.477 -8.986,-1.432c-2.572,-0.955 -4.736,-2.372 -6.492,-4.251c-1.756,-1.879 -3.08,-4.235 -3.973,-7.069c-0.894,-2.834 -1.34,-6.129 -1.34,-9.887c0,-3.573 0.462,-6.784 1.386,-9.633c0.924,-2.849 2.256,-5.267 3.996,-7.254c1.741,-1.987 3.843,-3.511 6.307,-4.574c2.464,-1.063 5.221,-1.594 8.27,-1.594c3.265,0 6.045,0.524 8.34,1.571c2.295,1.047 4.181,2.456 5.66,4.227c1.478,1.771 2.564,3.85 3.257,6.238c0.693,2.387 1.039,4.936 1.039,7.646l0,1.386Zm-7.669,-2.264c0.092,-4.004 -0.799,-7.146 -2.673,-9.425c-1.875,-2.279 -4.656,-3.419 -8.344,-3.419c-1.891,0 -3.549,0.354 -4.974,1.063c-1.426,0.708 -2.619,1.648 -3.58,2.818c-0.961,1.17 -1.705,2.533 -2.231,4.089c-0.527,1.555 -0.821,3.18 -0.884,4.874l22.686,0Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M1196.42,283.389c0,0.247 -0.054,0.462 -0.161,0.647c-0.108,0.185 -0.293,0.331 -0.555,0.439c-0.262,0.108 -0.608,0.192 -1.039,0.254c-0.432,0.062 -0.955,0.092 -1.571,0.092c-0.647,0 -1.186,-0.03 -1.617,-0.092c-0.432,-0.062 -0.786,-0.146 -1.063,-0.254c-0.277,-0.108 -0.477,-0.254 -0.601,-0.439c-0.123,-0.185 -0.184,-0.4 -0.184,-0.647l0,-5.498c-2.187,2.372 -4.459,4.22 -6.815,5.544c-2.357,1.325 -4.936,1.987 -7.739,1.987c-3.05,0 -5.652,-0.593 -7.808,-1.779c-2.157,-1.186 -3.905,-2.787 -5.244,-4.805c-1.34,-2.017 -2.318,-4.389 -2.934,-7.115c-0.616,-2.726 -0.924,-5.598 -0.924,-8.617c0,-3.573 0.385,-6.799 1.155,-9.679c0.77,-2.88 1.909,-5.336 3.419,-7.369c1.509,-2.033 3.38,-3.596 5.613,-4.69c2.233,-1.093 4.813,-1.64 7.739,-1.64c2.434,0 4.659,0.531 6.676,1.594c2.018,1.063 4.012,2.626 5.984,4.689l0,-24.163c0,-0.216 0.054,-0.424 0.161,-0.624c0.108,-0.2 0.316,-0.354 0.624,-0.462c0.308,-0.108 0.701,-0.2 1.178,-0.277c0.478,-0.077 1.086,-0.116 1.825,-0.116c0.77,0 1.402,0.039 1.895,0.116c0.492,0.077 0.877,0.169 1.155,0.277c0.277,0.108 0.485,0.262 0.623,0.462c0.139,0.2 0.208,0.408 0.208,0.624l0,61.541Zm-7.669,-29.246c-2.064,-2.557 -4.058,-4.505 -5.984,-5.845c-1.925,-1.339 -3.934,-2.009 -6.029,-2.009c-1.94,0 -3.588,0.462 -4.944,1.386c-1.355,0.924 -2.456,2.14 -3.303,3.65c-0.847,1.509 -1.463,3.218 -1.848,5.128c-0.385,1.91 -0.578,3.85 -0.578,5.822c0,2.094 0.162,4.142 0.485,6.145c0.324,2.002 0.886,3.78 1.687,5.336c0.801,1.555 1.863,2.803 3.188,3.742c1.324,0.94 2.988,1.41 4.99,1.41c1.016,0 1.994,-0.139 2.934,-0.416c0.939,-0.278 1.902,-0.74 2.887,-1.386c0.986,-0.647 2.018,-1.487 3.096,-2.518c1.078,-1.032 2.217,-2.303 3.419,-3.812l0,-16.633Z" style="fill:#fff;fill-rule:nonzero;"/></g></svg>
diff --git a/docs/public/badge-community-light.svg b/docs/public/badge-community-light.svg
index de4e0cf149..08c49f05b5 100644
--- a/docs/public/badge-community-light.svg
+++ b/docs/public/badge-community-light.svg
@@ -1 +1 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 1260 371" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"><rect id="badge.-community.-light" x="0" y="0.321" width="1260" height="370" style="fill:none;"/><clipPath id="_clip1"><rect x="0" y="0.321" width="1260" height="370"/></clipPath><g clip-path="url(#_clip1)"><path d="M1260,33.621c0,-18.379 -14.921,-33.3 -33.3,-33.3l-1193.4,0c-18.379,0 -33.3,14.921 -33.3,33.3l0,303.4c0,18.378 14.921,33.3 33.3,33.3l1193.4,0c18.379,0 33.3,-14.922 33.3,-33.3l0,-303.4Z" style="fill:#fff;"/><path d="M426.392,189.328c0,1.077 -0.059,1.978 -0.176,2.704c-0.117,0.726 -0.293,1.288 -0.527,1.686c-0.234,0.398 -0.491,0.668 -0.772,0.808c-0.281,0.141 -0.563,0.211 -0.844,0.211c-0.936,0 -2.447,-0.386 -4.531,-1.159c-2.084,-0.773 -4.484,-1.897 -7.201,-3.372c-2.716,-1.476 -5.62,-3.267 -8.711,-5.375c-3.092,-2.107 -6.089,-4.566 -8.993,-7.376c-2.295,1.405 -5.199,2.622 -8.711,3.653c-3.513,1.03 -7.588,1.545 -12.224,1.545c-6.839,0 -12.752,-1.007 -17.74,-3.021c-4.988,-2.013 -9.109,-4.964 -12.364,-8.851c-3.255,-3.888 -5.679,-8.724 -7.272,-14.508c-1.592,-5.784 -2.388,-12.423 -2.388,-19.917c0,-7.213 0.866,-13.734 2.599,-19.566c1.733,-5.831 4.333,-10.795 7.798,-14.893c3.466,-4.098 7.799,-7.26 12.997,-9.485c5.199,-2.224 11.264,-3.337 18.196,-3.337c6.51,0 12.236,1.007 17.177,3.021c4.941,2.014 9.086,4.953 12.435,8.817c3.349,3.864 5.866,8.63 7.552,14.297c1.686,5.667 2.529,12.177 2.529,19.53c0,3.794 -0.222,7.424 -0.667,10.89c-0.445,3.466 -1.147,6.744 -2.108,9.835c-0.96,3.091 -2.166,5.948 -3.618,8.571c-1.452,2.623 -3.161,4.988 -5.128,7.096c3.419,2.81 6.416,5 8.992,6.569c2.576,1.569 4.707,2.751 6.393,3.547c1.687,0.797 2.998,1.37 3.935,1.722c0.936,0.351 1.639,0.749 2.107,1.194c0.469,0.445 0.796,1.077 0.984,1.897c0.187,0.819 0.281,1.908 0.281,3.267Zm-23.886,-53.745c0,-5.152 -0.457,-9.929 -1.37,-14.331c-0.914,-4.403 -2.436,-8.232 -4.567,-11.487c-2.131,-3.255 -4.976,-5.796 -8.536,-7.622c-3.559,-1.827 -7.962,-2.74 -13.207,-2.74c-5.246,0 -9.649,0.972 -13.208,2.915c-3.56,1.944 -6.452,4.567 -8.676,7.869c-2.225,3.302 -3.818,7.13 -4.778,11.486c-0.96,4.356 -1.44,8.969 -1.44,13.84c0,5.339 0.445,10.245 1.335,14.718c0.89,4.473 2.389,8.349 4.496,11.627c2.108,3.279 4.93,5.82 8.466,7.623c3.536,1.803 7.974,2.705 13.313,2.705c5.292,0 9.742,-0.984 13.348,-2.951c3.606,-1.967 6.51,-4.625 8.711,-7.974c2.202,-3.349 3.771,-7.236 4.707,-11.662c0.937,-4.426 1.406,-9.098 1.406,-14.016Z" style="fill:#333;fill-rule:nonzero;"/><path d="M534.723,179.492c0,0.375 -0.096,0.703 -0.289,0.984c-0.193,0.281 -0.531,0.503 -1.013,0.667c-0.483,0.164 -1.098,0.304 -1.846,0.421c-0.747,0.118 -1.724,0.176 -2.93,0.176c-1.109,0 -2.062,-0.058 -2.858,-0.176c-0.796,-0.117 -1.423,-0.257 -1.881,-0.421c-0.459,-0.164 -0.784,-0.386 -0.977,-0.667c-0.193,-0.281 -0.289,-0.609 -0.289,-0.984l0,-79.176l-0.141,0l-32.036,79.527c-0.14,0.328 -0.339,0.609 -0.597,0.843c-0.257,0.234 -0.632,0.434 -1.124,0.597c-0.492,0.164 -1.077,0.281 -1.756,0.352c-0.679,0.07 -1.487,0.105 -2.424,0.105c-0.984,0 -1.827,-0.047 -2.529,-0.14c-0.703,-0.094 -1.288,-0.223 -1.756,-0.387c-0.469,-0.164 -0.832,-0.363 -1.089,-0.597c-0.258,-0.234 -0.434,-0.492 -0.527,-0.773l-30.631,-79.527l-0.07,0l0,79.176c0,0.375 -0.097,0.703 -0.289,0.984c-0.193,0.281 -0.531,0.503 -1.014,0.667c-0.482,0.164 -1.109,0.304 -1.881,0.421c-0.772,0.118 -1.761,0.176 -2.967,0.176c-1.157,0 -2.122,-0.058 -2.894,-0.176c-0.772,-0.117 -1.387,-0.257 -1.845,-0.421c-0.459,-0.164 -0.772,-0.386 -0.941,-0.667c-0.169,-0.281 -0.253,-0.609 -0.253,-0.984l0,-83.602c0,-1.967 0.523,-3.372 1.569,-4.215c1.046,-0.843 2.212,-1.265 3.496,-1.265l7.419,0c1.522,0 2.853,0.141 3.995,0.422c1.142,0.281 2.14,0.726 2.996,1.335c0.856,0.608 1.569,1.381 2.14,2.318c0.571,0.937 1.07,2.037 1.499,3.302l25.994,65.828l0.351,0l27.047,-65.617c0.524,-1.405 1.095,-2.6 1.713,-3.583c0.619,-0.984 1.297,-1.768 2.035,-2.354c0.738,-0.585 1.558,-1.007 2.462,-1.264c0.904,-0.258 1.951,-0.387 3.141,-0.387l7.779,0c0.715,0 1.393,0.106 2.035,0.316c0.642,0.211 1.189,0.539 1.642,0.984c0.452,0.445 0.821,1.007 1.106,1.686c0.285,0.679 0.428,1.51 0.428,2.494l0,83.602Z" style="fill:#333;fill-rule:nonzero;"/><path d="M618.185,179.351c0,0.375 -0.082,0.715 -0.246,1.019c-0.164,0.305 -0.48,0.55 -0.949,0.738c-0.468,0.187 -1.1,0.339 -1.896,0.456c-0.797,0.118 -1.827,0.176 -3.092,0.176c-1.639,0 -2.974,-0.07 -4.004,-0.211c-1.031,-0.14 -1.803,-0.398 -2.318,-0.772c-0.516,-0.375 -0.937,-0.797 -1.265,-1.265l-33.441,-45.454l0,45.454c0,0.328 -0.094,0.644 -0.281,0.948c-0.187,0.305 -0.515,0.539 -0.983,0.703c-0.469,0.164 -1.089,0.304 -1.862,0.421c-0.773,0.118 -1.745,0.176 -2.916,0.176c-1.124,0 -2.084,-0.058 -2.88,-0.176c-0.796,-0.117 -1.429,-0.257 -1.897,-0.421c-0.468,-0.164 -0.796,-0.398 -0.983,-0.703c-0.188,-0.304 -0.282,-0.62 -0.282,-0.948l0,-87.255c0,-0.375 0.094,-0.703 0.282,-0.984c0.187,-0.281 0.515,-0.503 0.983,-0.667c0.468,-0.164 1.101,-0.305 1.897,-0.422c0.796,-0.117 1.756,-0.175 2.88,-0.175c1.171,0 2.143,0.058 2.916,0.175c0.773,0.117 1.393,0.258 1.862,0.422c0.468,0.164 0.796,0.386 0.983,0.667c0.187,0.281 0.281,0.609 0.281,0.984l0,40.396l32.176,-40.396c0.281,-0.422 0.609,-0.773 0.984,-1.054c0.375,-0.281 0.831,-0.504 1.37,-0.667c0.538,-0.164 1.194,-0.293 1.967,-0.387c0.773,-0.094 1.768,-0.14 2.986,-0.14c1.218,0 2.201,0.058 2.95,0.175c0.75,0.117 1.347,0.27 1.792,0.457c0.445,0.187 0.749,0.421 0.913,0.702c0.164,0.282 0.246,0.586 0.246,0.914c0,0.609 -0.152,1.218 -0.457,1.826c-0.304,0.609 -0.878,1.452 -1.721,2.53l-30.139,36.04l32.458,43.136c0.796,1.217 1.276,2.049 1.44,2.494c0.164,0.444 0.246,0.807 0.246,1.088Z" style="fill:#333;fill-rule:nonzero;"/><path d="M713.941,95.609c0,0.89 -0.047,1.663 -0.141,2.318c-0.094,0.656 -0.258,1.183 -0.492,1.581c-0.234,0.398 -0.503,0.691 -0.808,0.878c-0.304,0.188 -0.62,0.281 -0.948,0.281l-33.3,0l0,30.912l31.473,0c0.328,0 0.644,0.082 0.949,0.246c0.304,0.164 0.574,0.433 0.808,0.808c0.234,0.374 0.398,0.878 0.491,1.51c0.094,0.632 0.141,1.44 0.141,2.424c0,0.89 -0.047,1.651 -0.141,2.283c-0.093,0.632 -0.257,1.148 -0.491,1.546c-0.234,0.398 -0.504,0.702 -0.808,0.913c-0.305,0.211 -0.621,0.316 -0.949,0.316l-31.473,0l0,37.867c0,0.328 -0.094,0.644 -0.281,0.948c-0.188,0.305 -0.516,0.539 -0.984,0.703c-0.468,0.164 -1.077,0.304 -1.826,0.421c-0.75,0.118 -1.733,0.176 -2.951,0.176c-1.124,0 -2.084,-0.058 -2.881,-0.176c-0.796,-0.117 -1.428,-0.257 -1.896,-0.421c-0.469,-0.164 -0.797,-0.398 -0.984,-0.703c-0.187,-0.304 -0.281,-0.62 -0.281,-0.948l0,-84.164c0,-1.827 0.48,-3.103 1.44,-3.829c0.96,-0.726 1.979,-1.089 3.056,-1.089l40.888,0c0.328,0 0.644,0.094 0.948,0.281c0.305,0.188 0.574,0.492 0.808,0.914c0.234,0.421 0.398,0.971 0.492,1.65c0.094,0.68 0.141,1.464 0.141,2.354Z" style="fill:#333;fill-rule:nonzero;"/><path d="M742.534,179.562c0,0.375 -0.094,0.691 -0.281,0.949c-0.187,0.257 -0.492,0.48 -0.913,0.667c-0.422,0.187 -1.007,0.328 -1.757,0.422c-0.749,0.093 -1.709,0.14 -2.88,0.14c-1.124,0 -2.061,-0.047 -2.81,-0.14c-0.75,-0.094 -1.347,-0.235 -1.792,-0.422c-0.445,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.328 0.082,-0.632 0.246,-0.913c0.164,-0.281 0.468,-0.516 0.913,-0.703c0.445,-0.187 1.042,-0.328 1.792,-0.422c0.749,-0.093 1.686,-0.14 2.81,-0.14c1.171,0 2.131,0.047 2.88,0.14c0.75,0.094 1.335,0.235 1.757,0.422c0.421,0.187 0.726,0.422 0.913,0.703c0.187,0.281 0.281,0.585 0.281,0.913l0,63.228Zm1.335,-84.585c0,2.716 -0.515,4.566 -1.546,5.55c-1.03,0.983 -2.927,1.475 -5.69,1.475c-2.717,0 -4.579,-0.48 -5.586,-1.44c-1.007,-0.96 -1.51,-2.775 -1.51,-5.445c0,-2.716 0.515,-4.566 1.546,-5.55c1.03,-0.983 2.927,-1.475 5.69,-1.475c2.717,0 4.578,0.48 5.585,1.44c1.007,0.96 1.511,2.775 1.511,5.445Z" style="fill:#333;fill-rule:nonzero;"/><path d="M800.915,120.479c0,1.03 -0.024,1.897 -0.07,2.599c-0.047,0.703 -0.141,1.253 -0.281,1.651c-0.141,0.398 -0.317,0.703 -0.527,0.913c-0.211,0.211 -0.504,0.317 -0.879,0.317c-0.374,0 -0.831,-0.106 -1.37,-0.317c-0.538,-0.21 -1.147,-0.421 -1.826,-0.632c-0.679,-0.211 -1.44,-0.41 -2.283,-0.597c-0.843,-0.187 -1.757,-0.281 -2.74,-0.281c-1.171,0 -2.319,0.234 -3.443,0.703c-1.124,0.468 -2.306,1.241 -3.548,2.318c-1.241,1.077 -2.54,2.506 -3.899,4.285c-1.358,1.78 -2.857,3.958 -4.496,6.534l0,41.59c0,0.375 -0.094,0.691 -0.281,0.949c-0.187,0.257 -0.492,0.48 -0.913,0.667c-0.422,0.187 -1.007,0.328 -1.756,0.422c-0.75,0.093 -1.71,0.14 -2.881,0.14c-1.124,0 -2.061,-0.047 -2.81,-0.14c-0.749,-0.094 -1.347,-0.235 -1.792,-0.422c-0.444,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.375 0.071,-0.691 0.211,-0.949c0.141,-0.257 0.422,-0.491 0.843,-0.702c0.422,-0.211 0.96,-0.351 1.616,-0.422c0.656,-0.07 1.522,-0.105 2.599,-0.105c1.031,0 1.885,0.035 2.565,0.105c0.679,0.071 1.206,0.211 1.58,0.422c0.375,0.211 0.644,0.445 0.808,0.702c0.164,0.258 0.246,0.574 0.246,0.949l0,9.203c1.733,-2.529 3.361,-4.59 4.883,-6.182c1.522,-1.593 2.962,-2.846 4.32,-3.759c1.359,-0.913 2.705,-1.545 4.04,-1.897c1.335,-0.351 2.681,-0.527 4.04,-0.527c0.608,0 1.299,0.036 2.072,0.106c0.773,0.07 1.581,0.199 2.424,0.386c0.843,0.188 1.604,0.398 2.283,0.632c0.679,0.235 1.159,0.469 1.44,0.703c0.281,0.234 0.469,0.457 0.562,0.667c0.094,0.211 0.176,0.48 0.246,0.808c0.07,0.328 0.117,0.808 0.141,1.441c0.023,0.632 0.035,1.487 0.035,2.564Z" style="fill:#333;fill-rule:nonzero;"/><path d="M907.911,179.562c0,0.375 -0.093,0.691 -0.281,0.949c-0.187,0.257 -0.491,0.48 -0.913,0.667c-0.422,0.187 -1.007,0.328 -1.756,0.422c-0.75,0.093 -1.686,0.14 -2.811,0.14c-1.17,0 -2.131,-0.047 -2.88,-0.14c-0.749,-0.094 -1.346,-0.235 -1.791,-0.422c-0.445,-0.187 -0.761,-0.41 -0.949,-0.667c-0.187,-0.258 -0.281,-0.574 -0.281,-0.949l0,-38.429c0,-2.669 -0.234,-5.105 -0.702,-7.306c-0.469,-2.201 -1.218,-4.098 -2.248,-5.691c-1.031,-1.592 -2.342,-2.81 -3.935,-3.653c-1.592,-0.843 -3.466,-1.264 -5.62,-1.264c-2.67,0 -5.351,1.03 -8.044,3.091c-2.693,2.061 -5.655,5.082 -8.887,9.063l0,44.189c0,0.375 -0.094,0.691 -0.281,0.949c-0.188,0.257 -0.504,0.48 -0.949,0.667c-0.445,0.187 -1.042,0.328 -1.791,0.422c-0.749,0.093 -1.686,0.14 -2.81,0.14c-1.077,0 -2.002,-0.047 -2.775,-0.14c-0.773,-0.094 -1.382,-0.235 -1.827,-0.422c-0.445,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-38.429c0,-2.669 -0.258,-5.105 -0.773,-7.306c-0.515,-2.201 -1.288,-4.098 -2.318,-5.691c-1.031,-1.592 -2.33,-2.81 -3.899,-3.653c-1.569,-0.843 -3.431,-1.264 -5.585,-1.264c-2.67,0 -5.363,1.03 -8.08,3.091c-2.716,2.061 -5.667,5.082 -8.852,9.063l0,44.189c0,0.375 -0.093,0.691 -0.281,0.949c-0.187,0.257 -0.491,0.48 -0.913,0.667c-0.421,0.187 -1.007,0.328 -1.756,0.422c-0.75,0.093 -1.71,0.14 -2.881,0.14c-1.124,0 -2.06,-0.047 -2.81,-0.14c-0.749,-0.094 -1.346,-0.235 -1.791,-0.422c-0.445,-0.187 -0.75,-0.41 -0.914,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.375 0.071,-0.691 0.211,-0.949c0.141,-0.257 0.422,-0.491 0.843,-0.702c0.422,-0.211 0.96,-0.351 1.616,-0.422c0.656,-0.07 1.522,-0.105 2.6,-0.105c1.03,0 1.885,0.035 2.564,0.105c0.679,0.071 1.206,0.211 1.581,0.422c0.374,0.211 0.643,0.445 0.807,0.702c0.164,0.258 0.246,0.574 0.246,0.949l0,8.36c3.56,-3.981 7.014,-6.897 10.363,-8.747c3.349,-1.85 6.732,-2.775 10.151,-2.775c2.623,0 4.977,0.305 7.061,0.914c2.084,0.609 3.922,1.463 5.515,2.564c1.592,1.101 2.951,2.412 4.075,3.934c1.124,1.522 2.06,3.22 2.81,5.094c2.107,-2.295 4.11,-4.239 6.006,-5.831c1.897,-1.593 3.724,-2.881 5.48,-3.864c1.757,-0.984 3.466,-1.698 5.129,-2.143c1.662,-0.445 3.337,-0.668 5.023,-0.668c4.075,0 7.494,0.715 10.257,2.143c2.763,1.429 5,3.337 6.709,5.726c1.71,2.388 2.927,5.187 3.653,8.395c0.726,3.208 1.089,6.592 1.089,10.152l0,39.974Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1016.52,116.193c0,0.328 -0.047,0.726 -0.141,1.195c-0.094,0.468 -0.257,1.053 -0.492,1.756l-18.617,60.067c-0.14,0.515 -0.363,0.937 -0.667,1.265c-0.305,0.327 -0.726,0.585 -1.265,0.772c-0.538,0.188 -1.276,0.316 -2.213,0.387c-0.937,0.07 -2.107,0.105 -3.513,0.105c-1.451,0 -2.669,-0.047 -3.653,-0.14c-0.983,-0.094 -1.768,-0.235 -2.353,-0.422c-0.586,-0.187 -1.019,-0.445 -1.3,-0.773c-0.281,-0.328 -0.492,-0.726 -0.632,-1.194l-13.278,-45.876l-0.141,-0.632l-0.14,0.632l-12.295,45.876c-0.14,0.515 -0.363,0.937 -0.667,1.265c-0.304,0.327 -0.761,0.585 -1.37,0.772c-0.609,0.188 -1.393,0.316 -2.353,0.387c-0.961,0.07 -2.143,0.105 -3.548,0.105c-1.452,0 -2.635,-0.047 -3.548,-0.14c-0.913,-0.094 -1.663,-0.235 -2.248,-0.422c-0.586,-0.187 -1.019,-0.445 -1.3,-0.773c-0.281,-0.328 -0.492,-0.726 -0.632,-1.194l-18.477,-60.067c-0.234,-0.703 -0.398,-1.288 -0.492,-1.756c-0.093,-0.469 -0.14,-0.867 -0.14,-1.195c0,-0.421 0.093,-0.761 0.281,-1.018c0.187,-0.258 0.503,-0.469 0.948,-0.633c0.445,-0.164 1.042,-0.269 1.792,-0.316c0.749,-0.047 1.662,-0.07 2.74,-0.07c1.311,0 2.365,0.035 3.161,0.105c0.796,0.071 1.405,0.188 1.827,0.352c0.421,0.164 0.726,0.398 0.913,0.702c0.187,0.305 0.351,0.668 0.492,1.089l15.245,52.128l0.14,0.633l0.141,-0.633l13.98,-52.128c0.094,-0.421 0.246,-0.784 0.457,-1.089c0.211,-0.304 0.527,-0.538 0.948,-0.702c0.422,-0.164 0.996,-0.281 1.722,-0.352c0.726,-0.07 1.674,-0.105 2.845,-0.105c1.124,0 2.049,0.035 2.775,0.105c0.726,0.071 1.3,0.188 1.721,0.352c0.422,0.164 0.726,0.386 0.913,0.667c0.188,0.281 0.328,0.609 0.422,0.984l15.104,52.268l0.141,0.633l0.07,-0.633l15.035,-52.128c0.093,-0.421 0.245,-0.784 0.456,-1.089c0.211,-0.304 0.539,-0.538 0.984,-0.702c0.445,-0.164 1.054,-0.281 1.826,-0.352c0.773,-0.07 1.768,-0.105 2.986,-0.105c1.124,0 2.026,0.023 2.705,0.07c0.679,0.047 1.218,0.164 1.616,0.351c0.398,0.188 0.679,0.399 0.843,0.633c0.164,0.234 0.246,0.562 0.246,0.983Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1076.94,179.632c0,0.563 -0.187,0.984 -0.562,1.265c-0.375,0.281 -0.89,0.492 -1.546,0.632c-0.655,0.141 -1.616,0.211 -2.88,0.211c-1.218,0 -2.19,-0.07 -2.916,-0.211c-0.726,-0.14 -1.252,-0.351 -1.58,-0.632c-0.328,-0.281 -0.492,-0.702 -0.492,-1.265l0,-6.322c-2.763,2.95 -5.843,5.245 -9.238,6.885c-3.396,1.639 -6.991,2.458 -10.784,2.458c-3.326,0 -6.335,-0.433 -9.028,-1.299c-2.693,-0.867 -4.988,-2.12 -6.885,-3.759c-1.897,-1.639 -3.372,-3.653 -4.426,-6.042c-1.054,-2.388 -1.581,-5.105 -1.581,-8.149c0,-3.56 0.726,-6.651 2.178,-9.274c1.452,-2.622 3.536,-4.8 6.253,-6.533c2.716,-1.733 6.042,-3.033 9.976,-3.899c3.934,-0.867 8.36,-1.3 13.278,-1.3l8.711,0l0,-4.918c0,-2.435 -0.257,-4.59 -0.772,-6.463c-0.516,-1.874 -1.347,-3.431 -2.495,-4.672c-1.147,-1.241 -2.634,-2.178 -4.461,-2.81c-1.826,-0.632 -4.074,-0.949 -6.744,-0.949c-2.857,0 -5.421,0.34 -7.693,1.019c-2.271,0.679 -4.262,1.429 -5.971,2.248c-1.71,0.82 -3.138,1.569 -4.286,2.248c-1.147,0.679 -2.002,1.019 -2.564,1.019c-0.375,0 -0.703,-0.094 -0.984,-0.281c-0.281,-0.187 -0.527,-0.468 -0.737,-0.843c-0.211,-0.375 -0.363,-0.855 -0.457,-1.44c-0.094,-0.586 -0.14,-1.23 -0.14,-1.932c0,-1.171 0.081,-2.096 0.245,-2.775c0.164,-0.679 0.562,-1.323 1.195,-1.932c0.632,-0.609 1.721,-1.323 3.267,-2.143c1.545,-0.82 3.325,-1.569 5.339,-2.248c2.014,-0.679 4.215,-1.241 6.604,-1.686c2.388,-0.445 4.8,-0.668 7.236,-0.668c4.543,0 8.407,0.516 11.592,1.546c3.185,1.03 5.761,2.541 7.728,4.531c1.967,1.991 3.395,4.461 4.285,7.412c0.89,2.951 1.335,6.393 1.335,10.327l0,42.644Zm-11.522,-28.874l-9.905,0c-3.185,0 -5.949,0.269 -8.29,0.808c-2.342,0.539 -4.286,1.335 -5.832,2.389c-1.545,1.054 -2.681,2.318 -3.407,3.793c-0.726,1.476 -1.089,3.174 -1.089,5.094c0,3.278 1.042,5.889 3.127,7.833c2.084,1.944 4.999,2.916 8.746,2.916c3.044,0 5.866,-0.773 8.466,-2.319c2.599,-1.545 5.327,-3.91 8.184,-7.095l0,-13.419Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1135.18,120.479c0,1.03 -0.023,1.897 -0.07,2.599c-0.047,0.703 -0.14,1.253 -0.281,1.651c-0.14,0.398 -0.316,0.703 -0.527,0.913c-0.211,0.211 -0.503,0.317 -0.878,0.317c-0.375,0 -0.831,-0.106 -1.37,-0.317c-0.539,-0.21 -1.147,-0.421 -1.827,-0.632c-0.679,-0.211 -1.44,-0.41 -2.283,-0.597c-0.843,-0.187 -1.756,-0.281 -2.74,-0.281c-1.171,0 -2.318,0.234 -3.442,0.703c-1.124,0.468 -2.307,1.241 -3.548,2.318c-1.241,1.077 -2.541,2.506 -3.899,4.285c-1.358,1.78 -2.857,3.958 -4.496,6.534l0,41.59c0,0.375 -0.094,0.691 -0.281,0.949c-0.188,0.257 -0.492,0.48 -0.914,0.667c-0.421,0.187 -1.007,0.328 -1.756,0.422c-0.749,0.093 -1.709,0.14 -2.88,0.14c-1.124,0 -2.061,-0.047 -2.811,-0.14c-0.749,-0.094 -1.346,-0.235 -1.791,-0.422c-0.445,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.375 0.07,-0.691 0.211,-0.949c0.14,-0.257 0.421,-0.491 0.843,-0.702c0.421,-0.211 0.96,-0.351 1.615,-0.422c0.656,-0.07 1.523,-0.105 2.6,-0.105c1.03,0 1.885,0.035 2.564,0.105c0.679,0.071 1.206,0.211 1.581,0.422c0.375,0.211 0.644,0.445 0.808,0.702c0.164,0.258 0.246,0.574 0.246,0.949l0,9.203c1.733,-2.529 3.36,-4.59 4.882,-6.182c1.522,-1.593 2.963,-2.846 4.321,-3.759c1.358,-0.913 2.705,-1.545 4.039,-1.897c1.335,-0.351 2.682,-0.527 4.04,-0.527c0.609,0 1.3,0.036 2.073,0.106c0.772,0.07 1.58,0.199 2.423,0.386c0.843,0.188 1.604,0.398 2.284,0.632c0.679,0.235 1.159,0.469 1.44,0.703c0.281,0.234 0.468,0.457 0.562,0.667c0.093,0.211 0.175,0.48 0.246,0.808c0.07,0.328 0.117,0.808 0.14,1.441c0.024,0.632 0.035,1.487 0.035,2.564Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1200.45,145.208c0,1.827 -0.459,3.126 -1.376,3.899c-0.917,0.773 -1.964,1.159 -3.141,1.159l-41.64,0c0,3.513 0.353,6.675 1.059,9.485c0.706,2.81 1.882,5.222 3.53,7.236c1.647,2.014 3.789,3.559 6.424,4.637c2.636,1.077 5.86,1.615 9.672,1.615c3.012,0 5.694,-0.245 8.047,-0.737c2.354,-0.492 4.389,-1.042 6.107,-1.651c1.718,-0.609 3.13,-1.159 4.236,-1.651c1.106,-0.492 1.942,-0.738 2.507,-0.738c0.329,0 0.623,0.082 0.882,0.246c0.259,0.164 0.458,0.41 0.6,0.738c0.141,0.328 0.247,0.784 0.317,1.37c0.071,0.585 0.106,1.299 0.106,2.142c0,0.609 -0.023,1.136 -0.07,1.581c-0.047,0.445 -0.105,0.843 -0.175,1.194c-0.071,0.352 -0.188,0.668 -0.352,0.949c-0.164,0.281 -0.374,0.55 -0.632,0.808c-0.258,0.257 -1.019,0.679 -2.283,1.264c-1.265,0.586 -2.904,1.16 -4.918,1.722c-2.014,0.562 -4.344,1.065 -6.99,1.51c-2.647,0.445 -5.468,0.667 -8.466,0.667c-5.199,0 -9.753,-0.726 -13.664,-2.177c-3.911,-1.452 -7.201,-3.607 -9.871,-6.464c-2.67,-2.857 -4.683,-6.44 -6.042,-10.749c-1.358,-4.309 -2.037,-9.32 -2.037,-15.034c0,-5.433 0.702,-10.316 2.108,-14.648c1.405,-4.332 3.43,-8.009 6.077,-11.03c2.646,-3.021 5.842,-5.339 9.589,-6.955c3.747,-1.616 7.939,-2.424 12.576,-2.424c4.964,0 9.191,0.797 12.68,2.389c3.49,1.592 6.358,3.735 8.606,6.428c2.249,2.693 3.9,5.855 4.953,9.485c1.054,3.629 1.581,7.505 1.581,11.627l0,2.107Zm-11.662,-3.442c0.14,-6.089 -1.214,-10.866 -4.065,-14.332c-2.85,-3.466 -7.079,-5.199 -12.687,-5.199c-2.875,0 -5.396,0.539 -7.564,1.616c-2.167,1.077 -3.982,2.506 -5.443,4.285c-1.461,1.78 -2.592,3.853 -3.393,6.218c-0.801,2.365 -1.248,4.836 -1.343,7.412l34.495,0Z" style="fill:#333;fill-rule:nonzero;"/><path d="M379.752,276.089c0,0.493 -0.016,0.924 -0.047,1.294c-0.03,0.369 -0.084,0.693 -0.161,0.97c-0.077,0.277 -0.177,0.524 -0.301,0.739c-0.123,0.216 -0.338,0.478 -0.646,0.786c-0.308,0.308 -0.955,0.778 -1.941,1.409c-0.986,0.631 -2.21,1.247 -3.673,1.848c-1.463,0.601 -3.142,1.109 -5.036,1.525c-1.894,0.416 -3.966,0.623 -6.214,0.623c-3.881,0 -7.385,-0.646 -10.511,-1.94c-3.127,-1.294 -5.791,-3.203 -7.993,-5.729c-2.203,-2.526 -3.897,-5.645 -5.083,-9.356c-1.185,-3.712 -1.778,-7.985 -1.778,-12.821c0,-4.959 0.639,-9.379 1.917,-13.26c1.278,-3.881 3.072,-7.169 5.383,-9.865c2.31,-2.695 5.074,-4.751 8.293,-6.168c3.219,-1.417 6.784,-2.125 10.696,-2.125c1.725,0 3.403,0.162 5.036,0.485c1.632,0.324 3.142,0.732 4.528,1.225c1.386,0.492 2.618,1.062 3.696,1.709c1.078,0.647 1.825,1.178 2.241,1.594c0.416,0.416 0.685,0.732 0.808,0.947c0.123,0.216 0.224,0.47 0.301,0.763c0.077,0.292 0.138,0.639 0.184,1.039c0.047,0.4 0.07,0.878 0.07,1.432c0,0.616 -0.031,1.14 -0.093,1.571c-0.062,0.431 -0.155,0.793 -0.279,1.086c-0.124,0.293 -0.271,0.508 -0.441,0.647c-0.171,0.138 -0.38,0.208 -0.628,0.208c-0.433,0 -1.036,-0.301 -1.811,-0.901c-0.774,-0.601 -1.773,-1.263 -2.996,-1.987c-1.223,-0.724 -2.71,-1.386 -4.459,-1.987c-1.749,-0.6 -3.847,-0.901 -6.294,-0.901c-2.663,0 -5.086,0.532 -7.269,1.594c-2.183,1.063 -4.049,2.626 -5.597,4.69c-1.549,2.064 -2.748,4.582 -3.6,7.554c-0.852,2.972 -1.278,6.368 -1.278,10.188c0,3.788 0.411,7.138 1.231,10.049c0.821,2.91 1.998,5.344 3.53,7.3c1.533,1.956 3.415,3.434 5.644,4.435c2.23,1.001 4.753,1.502 7.571,1.502c2.384,0 4.467,-0.293 6.247,-0.878c1.781,-0.585 3.298,-1.24 4.552,-1.964c1.254,-0.724 2.283,-1.378 3.089,-1.963c0.805,-0.586 1.44,-0.878 1.904,-0.878c0.217,0 0.403,0.046 0.558,0.138c0.154,0.093 0.278,0.27 0.371,0.532c0.093,0.262 0.163,0.623 0.209,1.085c0.046,0.462 0.07,1.048 0.07,1.756Z" style="fill:#333;fill-rule:nonzero;"/><path d="M428.079,262.136c0,3.388 -0.446,6.507 -1.339,9.356c-0.894,2.849 -2.226,5.306 -3.997,7.369c-1.771,2.064 -3.989,3.673 -6.653,4.828c-2.664,1.156 -5.752,1.733 -9.264,1.733c-3.419,0 -6.399,-0.508 -8.94,-1.525c-2.541,-1.016 -4.659,-2.495 -6.353,-4.435c-1.694,-1.941 -2.957,-4.297 -3.788,-7.069c-0.832,-2.772 -1.248,-5.914 -1.248,-9.425c0,-3.388 0.439,-6.507 1.317,-9.356c0.878,-2.849 2.202,-5.306 3.973,-7.37c1.772,-2.063 3.982,-3.665 6.63,-4.805c2.649,-1.139 5.745,-1.709 9.287,-1.709c3.419,0 6.399,0.508 8.94,1.525c2.541,1.016 4.659,2.494 6.353,4.435c1.694,1.94 2.965,4.297 3.812,7.069c0.847,2.772 1.27,5.898 1.27,9.379Zm-7.9,0.508c0,-2.248 -0.21,-4.374 -0.63,-6.376c-0.419,-2.002 -1.111,-3.757 -2.074,-5.267c-0.964,-1.509 -2.269,-2.703 -3.917,-3.58c-1.647,-0.878 -3.698,-1.317 -6.153,-1.317c-2.269,0 -4.219,0.4 -5.851,1.201c-1.632,0.801 -2.976,1.933 -4.033,3.396c-1.056,1.463 -1.841,3.196 -2.354,5.198c-0.513,2.002 -0.769,4.189 -0.769,6.56c0,2.28 0.21,4.42 0.629,6.423c0.42,2.002 1.119,3.75 2.098,5.244c0.979,1.493 2.292,2.679 3.939,3.557c1.648,0.878 3.699,1.317 6.154,1.317c2.238,0 4.181,-0.401 5.828,-1.201c1.647,-0.801 2.999,-1.925 4.056,-3.373c1.056,-1.448 1.833,-3.173 2.331,-5.175c0.497,-2.002 0.746,-4.204 0.746,-6.607Z" style="fill:#333;fill-rule:nonzero;"/><path d="M500.987,283.389c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.77,0 -1.401,-0.03 -1.894,-0.092c-0.493,-0.062 -0.886,-0.154 -1.178,-0.277c-0.293,-0.123 -0.501,-0.27 -0.624,-0.439c-0.123,-0.17 -0.185,-0.377 -0.185,-0.624l0,-25.273c0,-1.755 -0.154,-3.357 -0.462,-4.805c-0.308,-1.447 -0.801,-2.695 -1.478,-3.742c-0.678,-1.047 -1.54,-1.848 -2.588,-2.403c-1.047,-0.554 -2.279,-0.831 -3.696,-0.831c-1.756,0 -3.519,0.677 -5.29,2.033c-1.771,1.355 -3.719,3.342 -5.845,5.96l0,29.061c0,0.247 -0.061,0.454 -0.184,0.624c-0.124,0.169 -0.332,0.316 -0.624,0.439c-0.293,0.123 -0.685,0.215 -1.178,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.709,0 -1.317,-0.03 -1.825,-0.092c-0.509,-0.062 -0.909,-0.154 -1.202,-0.277c-0.292,-0.123 -0.492,-0.27 -0.6,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-25.273c0,-1.755 -0.169,-3.357 -0.508,-4.805c-0.339,-1.447 -0.847,-2.695 -1.525,-3.742c-0.678,-1.047 -1.532,-1.848 -2.564,-2.403c-1.032,-0.554 -2.256,-0.831 -3.673,-0.831c-1.756,0 -3.527,0.677 -5.314,2.033c-1.786,1.355 -3.727,3.342 -5.821,5.96l0,29.061c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.6,0.439c-0.278,0.123 -0.663,0.215 -1.156,0.277c-0.492,0.062 -1.124,0.092 -1.894,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.108,-0.17 -0.161,-0.377 -0.161,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.138,-0.624c0.093,-0.169 0.277,-0.323 0.555,-0.462c0.277,-0.138 0.631,-0.231 1.062,-0.277c0.432,-0.046 1.001,-0.069 1.71,-0.069c0.677,0 1.24,0.023 1.686,0.069c0.447,0.046 0.793,0.139 1.04,0.277c0.246,0.139 0.423,0.293 0.531,0.462c0.108,0.17 0.162,0.378 0.162,0.624l0,5.498c2.341,-2.618 4.612,-4.535 6.815,-5.752c2.202,-1.217 4.427,-1.825 6.676,-1.825c1.725,0 3.273,0.2 4.643,0.601c1.371,0.4 2.58,0.962 3.627,1.686c1.047,0.724 1.941,1.586 2.68,2.587c0.739,1.001 1.355,2.118 1.848,3.35c1.386,-1.509 2.703,-2.788 3.95,-3.835c1.248,-1.047 2.449,-1.894 3.604,-2.541c1.155,-0.647 2.279,-1.117 3.373,-1.409c1.093,-0.293 2.194,-0.439 3.303,-0.439c2.68,0 4.929,0.47 6.746,1.409c1.817,0.939 3.288,2.195 4.412,3.766c1.124,1.57 1.925,3.411 2.403,5.521c0.477,2.11 0.716,4.335 0.716,6.676l0,26.289Z" style="fill:#333;fill-rule:nonzero;"/><path d="M576.574,283.389c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.492,0.062 -1.108,0.092 -1.848,0.092c-0.77,0 -1.401,-0.03 -1.894,-0.092c-0.493,-0.062 -0.886,-0.154 -1.178,-0.277c-0.293,-0.123 -0.501,-0.27 -0.624,-0.439c-0.123,-0.17 -0.185,-0.377 -0.185,-0.624l0,-25.273c0,-1.755 -0.154,-3.357 -0.462,-4.805c-0.308,-1.447 -0.801,-2.695 -1.478,-3.742c-0.678,-1.047 -1.54,-1.848 -2.588,-2.403c-1.047,-0.554 -2.279,-0.831 -3.696,-0.831c-1.755,0 -3.519,0.677 -5.29,2.033c-1.771,1.355 -3.719,3.342 -5.844,5.96l0,29.061c0,0.247 -0.062,0.454 -0.185,0.624c-0.124,0.169 -0.331,0.316 -0.624,0.439c-0.293,0.123 -0.685,0.215 -1.178,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.709,0 -1.317,-0.03 -1.825,-0.092c-0.509,-0.062 -0.909,-0.154 -1.202,-0.277c-0.292,-0.123 -0.492,-0.27 -0.6,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-25.273c0,-1.755 -0.169,-3.357 -0.508,-4.805c-0.339,-1.447 -0.847,-2.695 -1.525,-3.742c-0.677,-1.047 -1.532,-1.848 -2.564,-2.403c-1.032,-0.554 -2.256,-0.831 -3.673,-0.831c-1.756,0 -3.527,0.677 -5.313,2.033c-1.787,1.355 -3.727,3.342 -5.822,5.96l0,29.061c0,0.247 -0.061,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.6,0.439c-0.278,0.123 -0.663,0.215 -1.155,0.277c-0.493,0.062 -1.125,0.092 -1.895,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.107,-0.17 -0.161,-0.377 -0.161,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.138,-0.624c0.093,-0.169 0.278,-0.323 0.555,-0.462c0.277,-0.138 0.631,-0.231 1.062,-0.277c0.432,-0.046 1.001,-0.069 1.71,-0.069c0.678,0 1.24,0.023 1.686,0.069c0.447,0.046 0.793,0.139 1.04,0.277c0.246,0.139 0.423,0.293 0.531,0.462c0.108,0.17 0.162,0.378 0.162,0.624l0,5.498c2.341,-2.618 4.612,-4.535 6.815,-5.752c2.202,-1.217 4.427,-1.825 6.676,-1.825c1.725,0 3.273,0.2 4.643,0.601c1.371,0.4 2.58,0.962 3.627,1.686c1.047,0.724 1.941,1.586 2.68,2.587c0.739,1.001 1.355,2.118 1.848,3.35c1.386,-1.509 2.703,-2.788 3.95,-3.835c1.248,-1.047 2.449,-1.894 3.604,-2.541c1.155,-0.647 2.279,-1.117 3.373,-1.409c1.093,-0.293 2.195,-0.439 3.303,-0.439c2.68,0 4.929,0.47 6.746,1.409c1.817,0.939 3.288,2.195 4.412,3.766c1.125,1.57 1.925,3.411 2.403,5.521c0.477,2.11 0.716,4.335 0.716,6.676l0,26.289Z" style="fill:#333;fill-rule:nonzero;"/><path d="M626.103,283.389c0,0.247 -0.054,0.454 -0.162,0.624c-0.108,0.169 -0.3,0.316 -0.577,0.439c-0.278,0.123 -0.639,0.215 -1.086,0.277c-0.447,0.062 -0.993,0.092 -1.64,0.092c-0.709,0 -1.286,-0.03 -1.733,-0.092c-0.447,-0.062 -0.801,-0.154 -1.063,-0.277c-0.261,-0.123 -0.438,-0.27 -0.531,-0.439c-0.092,-0.17 -0.138,-0.377 -0.138,-0.624l0,-5.498c-2.372,2.618 -4.713,4.528 -7.023,5.729c-2.31,1.201 -4.651,1.802 -7.023,1.802c-2.772,0 -5.105,-0.462 -7,-1.386c-1.894,-0.924 -3.426,-2.179 -4.597,-3.766c-1.17,-1.586 -2.01,-3.434 -2.518,-5.544c-0.508,-2.11 -0.762,-4.674 -0.762,-7.693l0,-25.226c0,-0.246 0.054,-0.454 0.162,-0.624c0.107,-0.169 0.315,-0.323 0.623,-0.462c0.308,-0.138 0.709,-0.231 1.202,-0.277c0.492,-0.046 1.108,-0.069 1.848,-0.069c0.739,0 1.355,0.023 1.848,0.069c0.493,0.046 0.885,0.139 1.178,0.277c0.292,0.139 0.5,0.293 0.624,0.462c0.123,0.17 0.184,0.378 0.184,0.624l0,24.21c0,2.433 0.178,4.382 0.532,5.845c0.354,1.463 0.893,2.71 1.617,3.742c0.724,1.032 1.64,1.833 2.749,2.403c1.109,0.569 2.402,0.854 3.881,0.854c1.91,0 3.812,-0.677 5.706,-2.033c1.894,-1.355 3.904,-3.342 6.029,-5.96l0,-29.061c0,-0.246 0.054,-0.454 0.162,-0.624c0.108,-0.169 0.316,-0.323 0.624,-0.462c0.308,-0.138 0.7,-0.231 1.178,-0.277c0.477,-0.046 1.101,-0.069 1.871,-0.069c0.739,0 1.355,0.023 1.848,0.069c0.493,0.046 0.878,0.139 1.155,0.277c0.277,0.139 0.485,0.293 0.624,0.462c0.139,0.17 0.208,0.378 0.208,0.624l0,41.582Z" style="fill:#333;fill-rule:nonzero;"/><path d="M676.001,283.389c0,0.247 -0.061,0.454 -0.184,0.624c-0.124,0.169 -0.324,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.77,0 -1.402,-0.03 -1.894,-0.092c-0.493,-0.062 -0.878,-0.154 -1.155,-0.277c-0.278,-0.123 -0.478,-0.27 -0.601,-0.439c-0.123,-0.17 -0.185,-0.377 -0.185,-0.624l0,-24.349c0,-2.371 -0.185,-4.281 -0.554,-5.729c-0.37,-1.447 -0.909,-2.695 -1.617,-3.742c-0.709,-1.047 -1.625,-1.848 -2.749,-2.403c-1.125,-0.554 -2.426,-0.831 -3.905,-0.831c-1.909,0 -3.819,0.677 -5.729,2.033c-1.909,1.355 -3.911,3.342 -6.006,5.96l0,29.061c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.6,0.439c-0.278,0.123 -0.663,0.215 -1.155,0.277c-0.493,0.062 -1.125,0.092 -1.895,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.107,-0.17 -0.161,-0.377 -0.161,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.138,-0.624c0.093,-0.169 0.277,-0.323 0.555,-0.462c0.277,-0.138 0.631,-0.231 1.062,-0.277c0.432,-0.046 1.001,-0.069 1.71,-0.069c0.677,0 1.24,0.023 1.686,0.069c0.447,0.046 0.793,0.139 1.04,0.277c0.246,0.139 0.423,0.293 0.531,0.462c0.108,0.17 0.162,0.378 0.162,0.624l0,5.498c2.341,-2.618 4.674,-4.535 6.999,-5.752c2.326,-1.217 4.675,-1.825 7.046,-1.825c2.772,0 5.106,0.47 7,1.409c1.894,0.939 3.427,2.195 4.597,3.766c1.171,1.57 2.01,3.411 2.518,5.521c0.508,2.11 0.762,4.643 0.762,7.6l0,25.365Z" style="fill:#333;fill-rule:nonzero;"/><path d="M697.532,283.389c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.124,0.092 -1.894,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.886,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-41.582c0,-0.216 0.054,-0.416 0.162,-0.601c0.108,-0.184 0.308,-0.338 0.601,-0.462c0.292,-0.123 0.685,-0.215 1.178,-0.277c0.493,-0.061 1.109,-0.092 1.848,-0.092c0.77,0 1.401,0.031 1.894,0.092c0.493,0.062 0.878,0.154 1.155,0.277c0.278,0.124 0.478,0.278 0.601,0.462c0.123,0.185 0.185,0.385 0.185,0.601l0,41.582Zm0.878,-55.628c0,1.787 -0.339,3.004 -1.017,3.65c-0.677,0.647 -1.925,0.971 -3.742,0.971c-1.787,0 -3.011,-0.316 -3.673,-0.947c-0.663,-0.632 -0.994,-1.825 -0.994,-3.581c0,-1.787 0.339,-3.003 1.017,-3.65c0.677,-0.647 1.925,-0.97 3.742,-0.97c1.787,0 3.011,0.315 3.673,0.947c0.663,0.631 0.994,1.825 0.994,3.58Z" style="fill:#333;fill-rule:nonzero;"/><path d="M733.246,280.34c0,0.893 -0.061,1.601 -0.185,2.125c-0.123,0.524 -0.308,0.909 -0.554,1.155c-0.246,0.247 -0.616,0.478 -1.109,0.693c-0.493,0.216 -1.055,0.393 -1.686,0.532c-0.632,0.138 -1.302,0.254 -2.01,0.346c-0.708,0.092 -1.417,0.139 -2.125,0.139c-2.156,0 -4.005,-0.285 -5.545,-0.855c-1.54,-0.57 -2.803,-1.432 -3.788,-2.587c-0.986,-1.155 -1.702,-2.619 -2.149,-4.39c-0.446,-1.771 -0.67,-3.858 -0.67,-6.26l0,-24.303l-5.821,0c-0.462,0 -0.832,-0.246 -1.109,-0.739c-0.277,-0.493 -0.416,-1.293 -0.416,-2.402c0,-0.586 0.039,-1.078 0.116,-1.479c0.077,-0.4 0.177,-0.731 0.3,-0.993c0.123,-0.262 0.285,-0.447 0.485,-0.555c0.2,-0.107 0.424,-0.161 0.67,-0.161l5.775,0l0,-9.888c0,-0.215 0.054,-0.415 0.162,-0.6c0.108,-0.185 0.308,-0.347 0.601,-0.485c0.292,-0.139 0.685,-0.239 1.178,-0.301c0.493,-0.061 1.109,-0.092 1.848,-0.092c0.77,0 1.401,0.031 1.894,0.092c0.493,0.062 0.878,0.162 1.155,0.301c0.278,0.138 0.478,0.3 0.601,0.485c0.123,0.185 0.185,0.385 0.185,0.6l0,9.888l10.673,0c0.246,0 0.462,0.054 0.646,0.161c0.185,0.108 0.347,0.293 0.486,0.555c0.138,0.262 0.238,0.593 0.3,0.993c0.061,0.401 0.092,0.893 0.092,1.479c0,1.109 -0.138,1.909 -0.416,2.402c-0.277,0.493 -0.646,0.739 -1.108,0.739l-10.673,0l0,23.194c0,2.865 0.423,5.028 1.27,6.491c0.847,1.464 2.364,2.195 4.551,2.195c0.709,0 1.34,-0.069 1.895,-0.208c0.554,-0.138 1.047,-0.285 1.478,-0.439c0.431,-0.154 0.801,-0.3 1.109,-0.439c0.308,-0.138 0.585,-0.208 0.832,-0.208c0.154,0 0.3,0.039 0.439,0.116c0.138,0.077 0.246,0.223 0.323,0.439c0.077,0.215 0.146,0.508 0.208,0.878c0.061,0.369 0.092,0.831 0.092,1.386Z" style="fill:#333;fill-rule:nonzero;"/><path d="M762.261,284.544l-5.544,15.293c-0.185,0.493 -0.654,0.87 -1.409,1.132c-0.755,0.262 -1.902,0.393 -3.442,0.393c-0.801,0 -1.448,-0.039 -1.941,-0.116c-0.493,-0.077 -0.87,-0.208 -1.132,-0.392c-0.261,-0.185 -0.408,-0.432 -0.439,-0.74c-0.03,-0.308 0.047,-0.677 0.231,-1.108l5.73,-14.462c-0.278,-0.123 -0.539,-0.323 -0.786,-0.6c-0.246,-0.278 -0.416,-0.57 -0.508,-0.878l-14.831,-39.734c-0.247,-0.647 -0.37,-1.155 -0.37,-1.525c0,-0.37 0.123,-0.662 0.37,-0.878c0.246,-0.215 0.647,-0.362 1.201,-0.439c0.555,-0.077 1.294,-0.115 2.218,-0.115c0.924,0 1.648,0.023 2.171,0.069c0.524,0.046 0.94,0.131 1.248,0.254c0.308,0.123 0.531,0.3 0.67,0.531c0.138,0.231 0.285,0.547 0.439,0.948l11.874,33.358l0.138,0l11.459,-33.543c0.184,-0.585 0.408,-0.963 0.669,-1.132c0.262,-0.17 0.655,-0.293 1.179,-0.37c0.523,-0.077 1.278,-0.115 2.264,-0.115c0.862,0 1.57,0.038 2.125,0.115c0.554,0.077 0.962,0.224 1.224,0.439c0.262,0.216 0.393,0.508 0.393,0.878c0,0.37 -0.092,0.832 -0.277,1.386l-14.924,41.351Z" style="fill:#333;fill-rule:nonzero;"/><path d="M840.528,267.773c0,2.803 -0.516,5.298 -1.548,7.485c-1.031,2.186 -2.464,4.042 -4.296,5.567c-1.833,1.525 -3.989,2.672 -6.469,3.442c-2.479,0.77 -5.151,1.155 -8.016,1.155c-2.002,0 -3.858,-0.169 -5.567,-0.508c-1.71,-0.339 -3.234,-0.755 -4.574,-1.248c-1.34,-0.492 -2.464,-1.001 -3.373,-1.524c-0.909,-0.524 -1.54,-0.971 -1.894,-1.34c-0.355,-0.37 -0.616,-0.84 -0.786,-1.409c-0.169,-0.57 -0.254,-1.333 -0.254,-2.287c0,-0.678 0.031,-1.24 0.093,-1.687c0.061,-0.446 0.154,-0.808 0.277,-1.086c0.123,-0.277 0.277,-0.469 0.462,-0.577c0.185,-0.108 0.4,-0.162 0.647,-0.162c0.431,0 1.039,0.262 1.825,0.786c0.785,0.523 1.794,1.093 3.026,1.709c1.232,0.616 2.718,1.194 4.458,1.733c1.741,0.539 3.75,0.808 6.03,0.808c1.725,0 3.303,-0.231 4.736,-0.693c1.432,-0.462 2.664,-1.116 3.696,-1.963c1.032,-0.847 1.825,-1.887 2.379,-3.119c0.555,-1.232 0.832,-2.634 0.832,-4.204c0,-1.695 -0.385,-3.142 -1.155,-4.343c-0.77,-1.202 -1.787,-2.257 -3.05,-3.165c-1.262,-0.909 -2.702,-1.741 -4.32,-2.495c-1.617,-0.755 -3.272,-1.525 -4.966,-2.31c-1.694,-0.786 -3.342,-1.656 -4.944,-2.611c-1.602,-0.955 -3.034,-2.079 -4.297,-3.373c-1.263,-1.293 -2.287,-2.81 -3.072,-4.551c-0.786,-1.74 -1.178,-3.827 -1.178,-6.26c0,-2.495 0.454,-4.72 1.363,-6.676c0.908,-1.956 2.171,-3.596 3.788,-4.921c1.617,-1.324 3.542,-2.333 5.775,-3.026c2.234,-0.693 4.644,-1.04 7.231,-1.04c1.325,0 2.657,0.116 3.997,0.347c1.34,0.231 2.602,0.539 3.788,0.924c1.186,0.385 2.241,0.816 3.165,1.294c0.924,0.477 1.532,0.862 1.825,1.155c0.293,0.292 0.485,0.523 0.578,0.693c0.092,0.169 0.169,0.385 0.231,0.647c0.061,0.261 0.107,0.577 0.138,0.947c0.031,0.369 0.046,0.847 0.046,1.432c0,0.554 -0.023,1.047 -0.069,1.479c-0.046,0.431 -0.115,0.793 -0.208,1.085c-0.092,0.293 -0.223,0.508 -0.392,0.647c-0.17,0.139 -0.362,0.208 -0.578,0.208c-0.339,0 -0.87,-0.216 -1.594,-0.647c-0.724,-0.431 -1.609,-0.916 -2.657,-1.455c-1.047,-0.539 -2.287,-1.032 -3.719,-1.479c-1.432,-0.446 -3.042,-0.67 -4.828,-0.67c-1.663,0 -3.111,0.224 -4.343,0.67c-1.232,0.447 -2.249,1.04 -3.049,1.779c-0.801,0.739 -1.402,1.617 -1.802,2.634c-0.401,1.016 -0.601,2.094 -0.601,3.234c0,1.663 0.385,3.095 1.155,4.297c0.77,1.201 1.794,2.264 3.073,3.188c1.278,0.924 2.733,1.771 4.366,2.541c1.632,0.77 3.295,1.548 4.99,2.333c1.694,0.785 3.357,1.648 4.989,2.587c1.633,0.94 3.088,2.049 4.367,3.327c1.278,1.278 2.31,2.787 3.095,4.528c0.786,1.74 1.178,3.796 1.178,6.168Z" style="fill:#333;fill-rule:nonzero;"/><path d="M886.638,283.389c0,0.247 -0.054,0.454 -0.161,0.624c-0.108,0.169 -0.301,0.316 -0.578,0.439c-0.277,0.123 -0.639,0.215 -1.086,0.277c-0.446,0.062 -0.993,0.092 -1.64,0.092c-0.708,0 -1.286,-0.03 -1.733,-0.092c-0.446,-0.062 -0.8,-0.154 -1.062,-0.277c-0.262,-0.123 -0.439,-0.27 -0.532,-0.439c-0.092,-0.17 -0.138,-0.377 -0.138,-0.624l0,-5.498c-2.372,2.618 -4.713,4.528 -7.023,5.729c-2.31,1.201 -4.651,1.802 -7.023,1.802c-2.772,0 -5.105,-0.462 -6.999,-1.386c-1.895,-0.924 -3.427,-2.179 -4.597,-3.766c-1.171,-1.586 -2.01,-3.434 -2.519,-5.544c-0.508,-2.11 -0.762,-4.674 -0.762,-7.693l0,-25.226c0,-0.246 0.054,-0.454 0.162,-0.624c0.108,-0.169 0.316,-0.323 0.624,-0.462c0.308,-0.138 0.708,-0.231 1.201,-0.277c0.493,-0.046 1.109,-0.069 1.848,-0.069c0.739,0 1.355,0.023 1.848,0.069c0.493,0.046 0.886,0.139 1.178,0.277c0.293,0.139 0.501,0.293 0.624,0.462c0.123,0.17 0.185,0.378 0.185,0.624l0,24.21c0,2.433 0.177,4.382 0.531,5.845c0.354,1.463 0.893,2.71 1.617,3.742c0.724,1.032 1.64,1.833 2.749,2.403c1.109,0.569 2.403,0.854 3.881,0.854c1.91,0 3.812,-0.677 5.706,-2.033c1.895,-1.355 3.904,-3.342 6.03,-5.96l0,-29.061c0,-0.246 0.054,-0.454 0.161,-0.624c0.108,-0.169 0.316,-0.323 0.624,-0.462c0.308,-0.138 0.701,-0.231 1.178,-0.277c0.478,-0.046 1.101,-0.069 1.871,-0.069c0.74,0 1.356,0.023 1.849,0.069c0.492,0.046 0.877,0.139 1.155,0.277c0.277,0.139 0.485,0.293 0.623,0.462c0.139,0.17 0.208,0.378 0.208,0.624l0,41.582Z" style="fill:#333;fill-rule:nonzero;"/><path d="M938.986,261.951c0,3.635 -0.393,6.9 -1.179,9.795c-0.785,2.895 -1.94,5.352 -3.465,7.369c-1.524,2.018 -3.411,3.573 -5.66,4.667c-2.248,1.093 -4.82,1.64 -7.715,1.64c-1.232,0 -2.372,-0.123 -3.419,-0.37c-1.048,-0.246 -2.072,-0.631 -3.073,-1.155c-1.001,-0.523 -1.994,-1.185 -2.98,-1.986c-0.986,-0.801 -2.033,-1.741 -3.142,-2.819l0,20.791c0,0.247 -0.061,0.462 -0.184,0.647c-0.124,0.185 -0.324,0.339 -0.601,0.462c-0.277,0.123 -0.662,0.216 -1.155,0.277c-0.493,0.062 -1.124,0.093 -1.894,0.093c-0.74,0 -1.356,-0.031 -1.849,-0.093c-0.492,-0.061 -0.885,-0.154 -1.178,-0.277c-0.292,-0.123 -0.493,-0.277 -0.6,-0.462c-0.108,-0.185 -0.162,-0.4 -0.162,-0.647l0,-58.076c0,-0.277 0.046,-0.501 0.139,-0.67c0.092,-0.169 0.277,-0.316 0.554,-0.439c0.277,-0.123 0.631,-0.208 1.063,-0.254c0.431,-0.046 0.954,-0.069 1.571,-0.069c0.646,0 1.178,0.023 1.594,0.069c0.415,0.046 0.762,0.131 1.039,0.254c0.277,0.123 0.47,0.27 0.578,0.439c0.107,0.169 0.161,0.393 0.161,0.67l0,5.59c1.263,-1.293 2.48,-2.417 3.65,-3.372c1.171,-0.955 2.349,-1.748 3.535,-2.38c1.186,-0.631 2.402,-1.109 3.65,-1.432c1.247,-0.323 2.564,-0.485 3.95,-0.485c3.019,0 5.591,0.585 7.716,1.756c2.125,1.17 3.858,2.772 5.198,4.805c1.34,2.033 2.317,4.397 2.933,7.092c0.617,2.695 0.925,5.552 0.925,8.57Zm-7.901,0.878c0,-2.125 -0.163,-4.181 -0.488,-6.168c-0.325,-1.987 -0.883,-3.75 -1.673,-5.29c-0.791,-1.54 -1.852,-2.772 -3.185,-3.696c-1.332,-0.924 -2.99,-1.386 -4.974,-1.386c-0.992,0 -1.968,0.146 -2.929,0.439c-0.96,0.292 -1.936,0.754 -2.928,1.386c-0.992,0.631 -2.03,1.463 -3.115,2.495c-1.085,1.031 -2.231,2.302 -3.44,3.811l0,16.541c2.108,2.556 4.107,4.512 5.997,5.867c1.891,1.356 3.874,2.033 5.95,2.033c1.922,0 3.572,-0.462 4.951,-1.386c1.379,-0.924 2.495,-2.156 3.347,-3.696c0.852,-1.54 1.48,-3.265 1.883,-5.175c0.403,-1.909 0.604,-3.834 0.604,-5.775Z" style="fill:#333;fill-rule:nonzero;"/><path d="M988.699,261.951c0,3.635 -0.392,6.9 -1.178,9.795c-0.785,2.895 -1.94,5.352 -3.465,7.369c-1.525,2.018 -3.411,3.573 -5.66,4.667c-2.248,1.093 -4.82,1.64 -7.716,1.64c-1.232,0 -2.371,-0.123 -3.419,-0.37c-1.047,-0.246 -2.071,-0.631 -3.072,-1.155c-1.001,-0.523 -1.994,-1.185 -2.98,-1.986c-0.986,-0.801 -2.033,-1.741 -3.142,-2.819l0,20.791c0,0.247 -0.061,0.462 -0.185,0.647c-0.123,0.185 -0.323,0.339 -0.6,0.462c-0.278,0.123 -0.663,0.216 -1.155,0.277c-0.493,0.062 -1.125,0.093 -1.895,0.093c-0.739,0 -1.355,-0.031 -1.848,-0.093c-0.493,-0.061 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.277 -0.601,-0.462c-0.107,-0.185 -0.161,-0.4 -0.161,-0.647l0,-58.076c0,-0.277 0.046,-0.501 0.138,-0.67c0.093,-0.169 0.278,-0.316 0.555,-0.439c0.277,-0.123 0.631,-0.208 1.062,-0.254c0.432,-0.046 0.955,-0.069 1.571,-0.069c0.647,0 1.178,0.023 1.594,0.069c0.416,0.046 0.763,0.131 1.04,0.254c0.277,0.123 0.47,0.27 0.577,0.439c0.108,0.169 0.162,0.393 0.162,0.67l0,5.59c1.263,-1.293 2.48,-2.417 3.65,-3.372c1.171,-0.955 2.349,-1.748 3.535,-2.38c1.185,-0.631 2.402,-1.109 3.65,-1.432c1.247,-0.323 2.564,-0.485 3.95,-0.485c3.018,0 5.59,0.585 7.716,1.756c2.125,1.17 3.858,2.772 5.197,4.805c1.34,2.033 2.318,4.397 2.934,7.092c0.616,2.695 0.924,5.552 0.924,8.57Zm-7.9,0.878c0,-2.125 -0.163,-4.181 -0.488,-6.168c-0.326,-1.987 -0.883,-3.75 -1.674,-5.29c-0.79,-1.54 -1.851,-2.772 -3.184,-3.696c-1.333,-0.924 -2.991,-1.386 -4.974,-1.386c-0.992,0 -1.968,0.146 -2.929,0.439c-0.96,0.292 -1.937,0.754 -2.928,1.386c-0.992,0.631 -2.03,1.463 -3.115,2.495c-1.085,1.031 -2.231,2.302 -3.44,3.811l0,16.541c2.108,2.556 4.107,4.512 5.997,5.867c1.891,1.356 3.874,2.033 5.95,2.033c1.921,0 3.571,-0.462 4.951,-1.386c1.379,-0.924 2.494,-2.156 3.347,-3.696c0.852,-1.54 1.48,-3.265 1.882,-5.175c0.403,-1.909 0.605,-3.834 0.605,-5.775Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1038.83,262.136c0,3.388 -0.447,6.507 -1.34,9.356c-0.893,2.849 -2.225,5.306 -3.996,7.369c-1.772,2.064 -3.989,3.673 -6.654,4.828c-2.664,1.156 -5.752,1.733 -9.263,1.733c-3.419,0 -6.399,-0.508 -8.94,-1.525c-2.541,-1.016 -4.659,-2.495 -6.353,-4.435c-1.694,-1.941 -2.957,-4.297 -3.789,-7.069c-0.831,-2.772 -1.247,-5.914 -1.247,-9.425c0,-3.388 0.439,-6.507 1.317,-9.356c0.877,-2.849 2.202,-5.306 3.973,-7.37c1.771,-2.063 3.981,-3.665 6.63,-4.805c2.649,-1.139 5.744,-1.709 9.287,-1.709c3.419,0 6.399,0.508 8.94,1.525c2.541,1.016 4.659,2.494 6.353,4.435c1.694,1.94 2.964,4.297 3.811,7.069c0.847,2.772 1.271,5.898 1.271,9.379Zm-7.901,0.508c0,-2.248 -0.21,-4.374 -0.629,-6.376c-0.42,-2.002 -1.111,-3.757 -2.075,-5.267c-0.963,-1.509 -2.269,-2.703 -3.916,-3.58c-1.647,-0.878 -3.698,-1.317 -6.154,-1.317c-2.269,0 -4.219,0.4 -5.851,1.201c-1.631,0.801 -2.976,1.933 -4.032,3.396c-1.057,1.463 -1.842,3.196 -2.354,5.198c-0.513,2.002 -0.77,4.189 -0.77,6.56c0,2.28 0.21,4.42 0.63,6.423c0.42,2.002 1.119,3.75 2.098,5.244c0.979,1.493 2.292,2.679 3.939,3.557c1.647,0.878 3.698,1.317 6.154,1.317c2.238,0 4.18,-0.401 5.827,-1.201c1.648,-0.801 3,-1.925 4.056,-3.373c1.057,-1.448 1.834,-3.173 2.331,-5.175c0.498,-2.002 0.746,-4.204 0.746,-6.607Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1074.36,244.533c0,0.678 -0.016,1.247 -0.047,1.709c-0.03,0.462 -0.092,0.824 -0.184,1.086c-0.093,0.262 -0.208,0.462 -0.347,0.601c-0.139,0.138 -0.331,0.208 -0.577,0.208c-0.247,0 -0.547,-0.07 -0.901,-0.208c-0.355,-0.139 -0.755,-0.277 -1.202,-0.416c-0.446,-0.139 -0.947,-0.27 -1.501,-0.393c-0.555,-0.123 -1.155,-0.185 -1.802,-0.185c-0.77,0 -1.525,0.154 -2.264,0.462c-0.739,0.308 -1.517,0.817 -2.333,1.525c-0.817,0.709 -1.671,1.648 -2.565,2.818c-0.893,1.171 -1.878,2.603 -2.956,4.297l0,27.352c0,0.247 -0.062,0.454 -0.185,0.624c-0.124,0.169 -0.324,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.124,0.092 -1.894,0.092c-0.74,0 -1.356,-0.03 -1.848,-0.092c-0.493,-0.062 -0.886,-0.154 -1.179,-0.277c-0.292,-0.123 -0.492,-0.27 -0.6,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.139,-0.624c0.092,-0.169 0.277,-0.323 0.554,-0.462c0.277,-0.138 0.632,-0.231 1.063,-0.277c0.431,-0.046 1.001,-0.069 1.709,-0.069c0.678,0 1.24,0.023 1.687,0.069c0.446,0.046 0.793,0.139 1.039,0.277c0.247,0.139 0.424,0.293 0.532,0.462c0.107,0.17 0.161,0.378 0.161,0.624l0,6.052c1.14,-1.663 2.21,-3.018 3.211,-4.065c1.001,-1.048 1.949,-1.872 2.842,-2.472c0.893,-0.601 1.779,-1.017 2.656,-1.248c0.878,-0.231 1.764,-0.346 2.657,-0.346c0.4,0 0.855,0.023 1.363,0.069c0.508,0.046 1.04,0.131 1.594,0.254c0.554,0.123 1.055,0.262 1.502,0.416c0.446,0.154 0.762,0.308 0.947,0.462c0.185,0.154 0.308,0.3 0.369,0.439c0.062,0.139 0.116,0.316 0.162,0.531c0.046,0.216 0.077,0.532 0.092,0.948c0.016,0.415 0.024,0.977 0.024,1.686Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1104.67,280.34c0,0.893 -0.061,1.601 -0.184,2.125c-0.124,0.524 -0.308,0.909 -0.555,1.155c-0.246,0.247 -0.616,0.478 -1.109,0.693c-0.493,0.216 -1.055,0.393 -1.686,0.532c-0.632,0.138 -1.302,0.254 -2.01,0.346c-0.708,0.092 -1.417,0.139 -2.125,0.139c-2.156,0 -4.004,-0.285 -5.545,-0.855c-1.54,-0.57 -2.802,-1.432 -3.788,-2.587c-0.986,-1.155 -1.702,-2.619 -2.149,-4.39c-0.446,-1.771 -0.669,-3.858 -0.669,-6.26l0,-24.303l-5.822,0c-0.462,0 -0.832,-0.246 -1.109,-0.739c-0.277,-0.493 -0.416,-1.293 -0.416,-2.402c0,-0.586 0.039,-1.078 0.116,-1.479c0.077,-0.4 0.177,-0.731 0.3,-0.993c0.123,-0.262 0.285,-0.447 0.485,-0.555c0.2,-0.107 0.424,-0.161 0.67,-0.161l5.776,0l0,-9.888c0,-0.215 0.053,-0.415 0.161,-0.6c0.108,-0.185 0.308,-0.347 0.601,-0.485c0.292,-0.139 0.685,-0.239 1.178,-0.301c0.493,-0.061 1.109,-0.092 1.848,-0.092c0.77,0 1.402,0.031 1.894,0.092c0.493,0.062 0.878,0.162 1.155,0.301c0.278,0.138 0.478,0.3 0.601,0.485c0.123,0.185 0.185,0.385 0.185,0.6l0,9.888l10.673,0c0.246,0 0.462,0.054 0.646,0.161c0.185,0.108 0.347,0.293 0.486,0.555c0.138,0.262 0.238,0.593 0.3,0.993c0.062,0.401 0.092,0.893 0.092,1.479c0,1.109 -0.138,1.909 -0.415,2.402c-0.278,0.493 -0.647,0.739 -1.109,0.739l-10.673,0l0,23.194c0,2.865 0.423,5.028 1.27,6.491c0.848,1.464 2.364,2.195 4.551,2.195c0.709,0 1.34,-0.069 1.895,-0.208c0.554,-0.138 1.047,-0.285 1.478,-0.439c0.431,-0.154 0.801,-0.3 1.109,-0.439c0.308,-0.138 0.585,-0.208 0.832,-0.208c0.154,0 0.3,0.039 0.439,0.116c0.138,0.077 0.246,0.223 0.323,0.439c0.077,0.215 0.146,0.508 0.208,0.878c0.062,0.369 0.092,0.831 0.092,1.386Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1149.21,260.796c0,1.201 -0.301,2.056 -0.904,2.564c-0.604,0.509 -1.292,0.763 -2.066,0.763l-27.385,0c0,2.31 0.233,4.389 0.697,6.237c0.464,1.848 1.238,3.434 2.321,4.759c1.083,1.324 2.492,2.341 4.225,3.049c1.733,0.709 3.854,1.063 6.36,1.063c1.981,0 3.746,-0.162 5.293,-0.485c1.548,-0.324 2.886,-0.686 4.016,-1.086c1.13,-0.4 2.059,-0.762 2.786,-1.086c0.727,-0.323 1.277,-0.485 1.649,-0.485c0.216,0 0.409,0.054 0.58,0.162c0.17,0.108 0.301,0.269 0.394,0.485c0.093,0.216 0.163,0.516 0.209,0.901c0.047,0.385 0.07,0.855 0.07,1.409c0,0.401 -0.016,0.747 -0.046,1.04c-0.031,0.292 -0.07,0.554 -0.116,0.785c-0.046,0.231 -0.123,0.439 -0.231,0.624c-0.108,0.185 -0.246,0.362 -0.416,0.531c-0.169,0.17 -0.67,0.447 -1.501,0.832c-0.832,0.385 -1.91,0.762 -3.235,1.132c-1.324,0.369 -2.856,0.701 -4.597,0.993c-1.74,0.293 -3.596,0.439 -5.567,0.439c-3.419,0 -6.414,-0.477 -8.986,-1.432c-2.572,-0.955 -4.736,-2.372 -6.492,-4.251c-1.756,-1.879 -3.08,-4.235 -3.973,-7.069c-0.894,-2.834 -1.34,-6.129 -1.34,-9.887c0,-3.573 0.462,-6.784 1.386,-9.633c0.924,-2.849 2.256,-5.267 3.996,-7.254c1.741,-1.987 3.843,-3.511 6.307,-4.574c2.464,-1.063 5.221,-1.594 8.27,-1.594c3.265,0 6.045,0.524 8.34,1.571c2.295,1.047 4.181,2.456 5.66,4.227c1.478,1.771 2.564,3.85 3.257,6.238c0.693,2.387 1.039,4.936 1.039,7.646l0,1.386Zm-7.669,-2.264c0.092,-4.004 -0.799,-7.146 -2.673,-9.425c-1.875,-2.279 -4.656,-3.419 -8.344,-3.419c-1.891,0 -3.549,0.354 -4.974,1.063c-1.426,0.708 -2.619,1.648 -3.58,2.818c-0.961,1.17 -1.705,2.533 -2.231,4.089c-0.527,1.555 -0.821,3.18 -0.884,4.874l22.686,0Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1196.42,283.389c0,0.247 -0.054,0.462 -0.161,0.647c-0.108,0.185 -0.293,0.331 -0.555,0.439c-0.262,0.108 -0.608,0.192 -1.039,0.254c-0.432,0.062 -0.955,0.092 -1.571,0.092c-0.647,0 -1.186,-0.03 -1.617,-0.092c-0.432,-0.062 -0.786,-0.146 -1.063,-0.254c-0.277,-0.108 -0.477,-0.254 -0.601,-0.439c-0.123,-0.185 -0.184,-0.4 -0.184,-0.647l0,-5.498c-2.187,2.372 -4.459,4.22 -6.815,5.544c-2.357,1.325 -4.936,1.987 -7.739,1.987c-3.05,0 -5.652,-0.593 -7.808,-1.779c-2.157,-1.186 -3.905,-2.787 -5.244,-4.805c-1.34,-2.017 -2.318,-4.389 -2.934,-7.115c-0.616,-2.726 -0.924,-5.598 -0.924,-8.617c0,-3.573 0.385,-6.799 1.155,-9.679c0.77,-2.88 1.909,-5.336 3.419,-7.369c1.509,-2.033 3.38,-3.596 5.613,-4.69c2.233,-1.093 4.813,-1.64 7.739,-1.64c2.434,0 4.659,0.531 6.676,1.594c2.018,1.063 4.012,2.626 5.984,4.689l0,-24.163c0,-0.216 0.054,-0.424 0.161,-0.624c0.108,-0.2 0.316,-0.354 0.624,-0.462c0.308,-0.108 0.701,-0.2 1.178,-0.277c0.478,-0.077 1.086,-0.116 1.825,-0.116c0.77,0 1.402,0.039 1.895,0.116c0.492,0.077 0.877,0.169 1.155,0.277c0.277,0.108 0.485,0.262 0.623,0.462c0.139,0.2 0.208,0.408 0.208,0.624l0,61.541Zm-7.669,-29.246c-2.064,-2.557 -4.058,-4.505 -5.984,-5.845c-1.925,-1.339 -3.934,-2.009 -6.029,-2.009c-1.94,0 -3.588,0.462 -4.944,1.386c-1.355,0.924 -2.456,2.14 -3.303,3.65c-0.847,1.509 -1.463,3.218 -1.848,5.128c-0.385,1.91 -0.578,3.85 -0.578,5.822c0,2.094 0.162,4.142 0.485,6.145c0.324,2.002 0.886,3.78 1.687,5.336c0.801,1.555 1.863,2.803 3.188,3.742c1.324,0.94 2.988,1.41 4.99,1.41c1.016,0 1.994,-0.139 2.934,-0.416c0.939,-0.278 1.902,-0.74 2.887,-1.386c0.986,-0.647 2.018,-1.487 3.096,-2.518c1.078,-1.032 2.217,-2.303 3.419,-3.812l0,-16.633Z" style="fill:#333;fill-rule:nonzero;"/><g><g><path d="M280.884,219.245c1.765,0 3.198,-1.433 3.198,-3.198l0,-6.395c0,-1.765 -1.433,-3.197 -3.198,-3.197l-225.605,0c-1.764,0 -3.197,1.432 -3.197,3.197l0,6.395c0,1.765 1.433,3.198 3.197,3.198l225.605,0Z" style="fill:#8c8c8c;"/><path d="M280.884,165.588c1.765,0 3.198,-1.433 3.198,-3.198l0,-6.395c0,-1.765 -1.433,-3.197 -3.198,-3.197l-225.605,0c-1.764,0 -3.197,1.432 -3.197,3.197l0,6.395c0,1.765 1.433,3.198 3.197,3.198l225.605,0Z" style="fill:#8c8c8c;"/><path d="M280.884,192.416c1.765,0 3.198,-1.432 3.198,-3.197l0,-6.395c0,-1.765 -1.433,-3.198 -3.198,-3.198l-225.605,0c-1.764,0 -3.197,1.433 -3.197,3.198l0,6.395c0,1.765 1.433,3.197 3.197,3.197l225.605,0Z" style="fill:#8c8c8c;"/><path d="M280.884,138.759c1.765,0 3.198,-1.432 3.198,-3.197l0,-6.395c0,-1.765 -1.433,-3.198 -3.198,-3.198l-225.605,0c-1.764,0 -3.197,1.433 -3.197,3.198l0,6.395c0,1.765 1.433,3.197 3.197,3.197l225.605,0Z" style="fill:#8c8c8c;"/><path d="M280.884,246.074c1.765,0 3.198,-1.433 3.198,-3.198l0,-6.395c0,-1.765 -1.433,-3.198 -3.198,-3.198l-225.605,0c-1.764,0 -3.197,1.433 -3.197,3.198l0,6.395c0,1.765 1.433,3.198 3.197,3.198l225.605,0Z" style="fill:#8c8c8c;"/><path d="M134.858,298.824c0,1.764 1.433,3.197 3.198,3.197l6.395,0c1.765,0 3.197,-1.433 3.197,-3.197l0,-225.605c0,-1.765 -1.432,-3.198 -3.197,-3.198l-6.395,0c-1.765,0 -3.198,1.433 -3.198,3.198l0,225.605Z" style="fill:#8c8c8c;"/><path d="M188.515,298.824c0,1.764 1.433,3.197 3.198,3.197l6.395,0c1.765,0 3.198,-1.433 3.198,-3.197l0,-225.605c0,-1.765 -1.433,-3.198 -3.198,-3.198l-6.395,0c-1.765,0 -3.198,1.433 -3.198,3.198l0,225.605Z" style="fill:#8c8c8c;"/><path d="M161.687,298.824c0,1.764 1.432,3.197 3.197,3.197l6.395,0c1.765,0 3.198,-1.433 3.198,-3.197l0,-225.605c0,-1.765 -1.433,-3.198 -3.198,-3.198l-6.395,0c-1.765,0 -3.197,1.433 -3.197,3.198l0,225.605Z" style="fill:#8c8c8c;"/><path d="M215.344,298.824c0,1.764 1.433,3.197 3.197,3.197l6.396,0c1.764,0 3.197,-1.433 3.197,-3.197l0,-225.605c0,-1.765 -1.433,-3.198 -3.197,-3.198l-6.396,0c-1.764,0 -3.197,1.433 -3.197,3.198l0,225.605Z" style="fill:#8c8c8c;"/><path d="M108.029,298.824c0,1.764 1.433,3.197 3.198,3.197l6.395,0c1.765,0 3.198,-1.433 3.198,-3.197l0,-225.605c0,-1.765 -1.433,-3.198 -3.198,-3.198l-6.395,0c-1.765,0 -3.198,1.433 -3.198,3.198l0,225.605Z" style="fill:#8c8c8c;"/></g><path d="M232.655,278.269c15.274,0 27.674,-12.401 27.674,-27.674l0,-129.147c0,-15.274 -12.4,-27.674 -27.674,-27.674l-129.146,0c-15.274,0 -27.675,12.4 -27.675,27.674l0,129.147c0,15.273 12.401,27.674 27.675,27.674l129.146,0Z" style="fill:#333;"/><path d="M220.739,175.532c0,6.734 -1.056,12.768 -3.167,18.104c-2.112,5.335 -5.122,9.886 -9.031,13.653c-3.909,3.766 -8.645,6.676 -14.209,8.731c-5.564,2.054 -11.855,3.167 -18.874,3.338l0,20.458c0,0.456 -0.114,0.856 -0.343,1.198c-0.228,0.342 -0.627,0.614 -1.198,0.813c-0.571,0.2 -1.327,0.357 -2.268,0.471c-0.942,0.114 -2.126,0.171 -3.553,0.171c-1.426,0 -2.61,-0.057 -3.552,-0.171c-0.942,-0.114 -1.683,-0.271 -2.226,-0.471c-0.542,-0.199 -0.941,-0.471 -1.198,-0.813c-0.257,-0.342 -0.385,-0.742 -0.385,-1.198l0,-20.458c-7.133,-0.171 -13.496,-1.199 -19.088,-3.082c-5.593,-1.883 -10.329,-4.608 -14.21,-8.174c-3.88,-3.567 -6.847,-7.947 -8.902,-13.139c-2.054,-5.193 -3.081,-11.157 -3.081,-17.89l0,-43.741c0,-0.399 0.128,-0.77 0.385,-1.113c0.257,-0.342 0.656,-0.627 1.198,-0.856c0.542,-0.228 1.284,-0.399 2.226,-0.513c0.941,-0.114 2.125,-0.171 3.552,-0.171c1.427,0 2.611,0.057 3.552,0.171c0.942,0.114 1.698,0.285 2.269,0.513c0.57,0.229 0.97,0.514 1.198,0.856c0.228,0.343 0.343,0.714 0.343,1.113l0,42.457c0,4.736 0.627,9.002 1.883,12.796c1.255,3.795 3.138,7.019 5.649,9.673c2.511,2.654 5.692,4.708 9.544,6.163c3.852,1.455 8.346,2.24 13.482,2.354l0,-73.443c0,-0.399 0.128,-0.77 0.385,-1.113c0.257,-0.342 0.685,-0.627 1.284,-0.856c0.599,-0.228 1.37,-0.399 2.311,-0.513c0.942,-0.114 2.069,-0.171 3.381,-0.171c1.427,0 2.611,0.057 3.553,0.171c0.941,0.114 1.697,0.285 2.268,0.513c0.571,0.229 0.97,0.514 1.198,0.856c0.229,0.343 0.343,0.714 0.343,1.113l0,73.443c5.136,-0.057 9.615,-0.842 13.439,-2.354c3.823,-1.512 7.004,-3.595 9.544,-6.249c2.539,-2.653 4.451,-5.849 5.735,-9.587c1.284,-3.737 1.926,-7.889 1.926,-12.454l0,-42.799c0,-0.399 0.114,-0.77 0.342,-1.113c0.228,-0.342 0.628,-0.627 1.198,-0.856c0.571,-0.228 1.313,-0.399 2.226,-0.513c0.913,-0.114 2.111,-0.171 3.595,-0.171c1.37,0 2.525,0.057 3.467,0.171c0.941,0.114 1.683,0.285 2.225,0.513c0.542,0.229 0.942,0.514 1.199,0.856c0.256,0.343 0.385,0.714 0.385,1.113l0,42.2Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M220.739,175.532c0,6.734 -1.056,12.768 -3.167,18.104c-2.112,5.335 -5.122,9.886 -9.031,13.653c-3.909,3.766 -8.645,6.676 -14.209,8.731c-5.564,2.054 -11.855,3.167 -18.874,3.338l0,20.458c0,0.456 -0.114,0.856 -0.343,1.198c-0.228,0.342 -0.627,0.614 -1.198,0.813c-0.571,0.2 -1.327,0.357 -2.268,0.471c-0.942,0.114 -2.126,0.171 -3.553,0.171c-1.426,0 -2.61,-0.057 -3.552,-0.171c-0.942,-0.114 -1.683,-0.271 -2.226,-0.471c-0.542,-0.199 -0.941,-0.471 -1.198,-0.813c-0.257,-0.342 -0.385,-0.742 -0.385,-1.198l0,-20.458c-7.133,-0.171 -13.496,-1.199 -19.088,-3.082c-5.593,-1.883 -10.329,-4.608 -14.21,-8.174c-3.88,-3.567 -6.847,-7.947 -8.902,-13.139c-2.054,-5.193 -3.081,-11.157 -3.081,-17.89l0,-43.741c0,-0.399 0.128,-0.77 0.385,-1.113c0.257,-0.342 0.656,-0.627 1.198,-0.856c0.542,-0.228 1.284,-0.399 2.226,-0.513c0.941,-0.114 2.125,-0.171 3.552,-0.171c1.427,0 2.611,0.057 3.552,0.171c0.942,0.114 1.698,0.285 2.269,0.513c0.57,0.229 0.97,0.514 1.198,0.856c0.228,0.343 0.343,0.714 0.343,1.113l0,42.457c0,4.736 0.627,9.002 1.883,12.796c1.255,3.795 3.138,7.019 5.649,9.673c2.511,2.654 5.692,4.708 9.544,6.163c3.852,1.455 8.346,2.24 13.482,2.354l0,-73.443c0,-0.399 0.128,-0.77 0.385,-1.113c0.257,-0.342 0.685,-0.627 1.284,-0.856c0.599,-0.228 1.37,-0.399 2.311,-0.513c0.942,-0.114 2.069,-0.171 3.381,-0.171c1.427,0 2.611,0.057 3.553,0.171c0.941,0.114 1.697,0.285 2.268,0.513c0.571,0.229 0.97,0.514 1.198,0.856c0.229,0.343 0.343,0.714 0.343,1.113l0,73.443c5.136,-0.057 9.615,-0.842 13.439,-2.354c3.823,-1.512 7.004,-3.595 9.544,-6.249c2.539,-2.653 4.451,-5.849 5.735,-9.587c1.284,-3.737 1.926,-7.889 1.926,-12.454l0,-42.799c0,-0.399 0.114,-0.77 0.342,-1.113c0.228,-0.342 0.628,-0.627 1.198,-0.856c0.571,-0.228 1.313,-0.399 2.226,-0.513c0.913,-0.114 2.111,-0.171 3.595,-0.171c1.37,0 2.525,0.057 3.467,0.171c0.941,0.114 1.683,0.285 2.225,0.513c0.542,0.229 0.942,0.514 1.199,0.856c0.256,0.343 0.385,0.714 0.385,1.113l0,42.2Z" style="fill:#fff;fill-rule:nonzero;"/></g></g></svg> \ No newline at end of file
+<?xml version="1.0" encoding="UTF-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="100%" height="100%" viewBox="0 0 1260 371" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:1.41421;"><rect id="badge.-community.-light" x="0" y="0.321" width="1260" height="370" style="fill:none;"/><clipPath id="_clip1"><rect x="0" y="0.321" width="1260" height="370"/></clipPath><g clip-path="url(#_clip1)"><path d="M1260,33.621c0,-18.379 -14.921,-33.3 -33.3,-33.3l-1193.4,0c-18.379,0 -33.3,14.921 -33.3,33.3l0,303.4c0,18.378 14.921,33.3 33.3,33.3l1193.4,0c18.379,0 33.3,-14.922 33.3,-33.3l0,-303.4Z" style="fill:#fff;"/><path d="M426.392,189.328c0,1.077 -0.059,1.978 -0.176,2.704c-0.117,0.726 -0.293,1.288 -0.527,1.686c-0.234,0.398 -0.491,0.668 -0.772,0.808c-0.281,0.141 -0.563,0.211 -0.844,0.211c-0.936,0 -2.447,-0.386 -4.531,-1.159c-2.084,-0.773 -4.484,-1.897 -7.201,-3.372c-2.716,-1.476 -5.62,-3.267 -8.711,-5.375c-3.092,-2.107 -6.089,-4.566 -8.993,-7.376c-2.295,1.405 -5.199,2.622 -8.711,3.653c-3.513,1.03 -7.588,1.545 -12.224,1.545c-6.839,0 -12.752,-1.007 -17.74,-3.021c-4.988,-2.013 -9.109,-4.964 -12.364,-8.851c-3.255,-3.888 -5.679,-8.724 -7.272,-14.508c-1.592,-5.784 -2.388,-12.423 -2.388,-19.917c0,-7.213 0.866,-13.734 2.599,-19.566c1.733,-5.831 4.333,-10.795 7.798,-14.893c3.466,-4.098 7.799,-7.26 12.997,-9.485c5.199,-2.224 11.264,-3.337 18.196,-3.337c6.51,0 12.236,1.007 17.177,3.021c4.941,2.014 9.086,4.953 12.435,8.817c3.349,3.864 5.866,8.63 7.552,14.297c1.686,5.667 2.529,12.177 2.529,19.53c0,3.794 -0.222,7.424 -0.667,10.89c-0.445,3.466 -1.147,6.744 -2.108,9.835c-0.96,3.091 -2.166,5.948 -3.618,8.571c-1.452,2.623 -3.161,4.988 -5.128,7.096c3.419,2.81 6.416,5 8.992,6.569c2.576,1.569 4.707,2.751 6.393,3.547c1.687,0.797 2.998,1.37 3.935,1.722c0.936,0.351 1.639,0.749 2.107,1.194c0.469,0.445 0.796,1.077 0.984,1.897c0.187,0.819 0.281,1.908 0.281,3.267Zm-23.886,-53.745c0,-5.152 -0.457,-9.929 -1.37,-14.331c-0.914,-4.403 -2.436,-8.232 -4.567,-11.487c-2.131,-3.255 -4.976,-5.796 -8.536,-7.622c-3.559,-1.827 -7.962,-2.74 -13.207,-2.74c-5.246,0 -9.649,0.972 -13.208,2.915c-3.56,1.944 -6.452,4.567 -8.676,7.869c-2.225,3.302 -3.818,7.13 -4.778,11.486c-0.96,4.356 -1.44,8.969 -1.44,13.84c0,5.339 0.445,10.245 1.335,14.718c0.89,4.473 2.389,8.349 4.496,11.627c2.108,3.279 4.93,5.82 8.466,7.623c3.536,1.803 7.974,2.705 13.313,2.705c5.292,0 9.742,-0.984 13.348,-2.951c3.606,-1.967 6.51,-4.625 8.711,-7.974c2.202,-3.349 3.771,-7.236 4.707,-11.662c0.937,-4.426 1.406,-9.098 1.406,-14.016Z" style="fill:#333;fill-rule:nonzero;"/><path d="M534.723,179.492c0,0.375 -0.096,0.703 -0.289,0.984c-0.193,0.281 -0.531,0.503 -1.013,0.667c-0.483,0.164 -1.098,0.304 -1.846,0.421c-0.747,0.118 -1.724,0.176 -2.93,0.176c-1.109,0 -2.062,-0.058 -2.858,-0.176c-0.796,-0.117 -1.423,-0.257 -1.881,-0.421c-0.459,-0.164 -0.784,-0.386 -0.977,-0.667c-0.193,-0.281 -0.289,-0.609 -0.289,-0.984l0,-79.176l-0.141,0l-32.036,79.527c-0.14,0.328 -0.339,0.609 -0.597,0.843c-0.257,0.234 -0.632,0.434 -1.124,0.597c-0.492,0.164 -1.077,0.281 -1.756,0.352c-0.679,0.07 -1.487,0.105 -2.424,0.105c-0.984,0 -1.827,-0.047 -2.529,-0.14c-0.703,-0.094 -1.288,-0.223 -1.756,-0.387c-0.469,-0.164 -0.832,-0.363 -1.089,-0.597c-0.258,-0.234 -0.434,-0.492 -0.527,-0.773l-30.631,-79.527l-0.07,0l0,79.176c0,0.375 -0.097,0.703 -0.289,0.984c-0.193,0.281 -0.531,0.503 -1.014,0.667c-0.482,0.164 -1.109,0.304 -1.881,0.421c-0.772,0.118 -1.761,0.176 -2.967,0.176c-1.157,0 -2.122,-0.058 -2.894,-0.176c-0.772,-0.117 -1.387,-0.257 -1.845,-0.421c-0.459,-0.164 -0.772,-0.386 -0.941,-0.667c-0.169,-0.281 -0.253,-0.609 -0.253,-0.984l0,-83.602c0,-1.967 0.523,-3.372 1.569,-4.215c1.046,-0.843 2.212,-1.265 3.496,-1.265l7.419,0c1.522,0 2.853,0.141 3.995,0.422c1.142,0.281 2.14,0.726 2.996,1.335c0.856,0.608 1.569,1.381 2.14,2.318c0.571,0.937 1.07,2.037 1.499,3.302l25.994,65.828l0.351,0l27.047,-65.617c0.524,-1.405 1.095,-2.6 1.713,-3.583c0.619,-0.984 1.297,-1.768 2.035,-2.354c0.738,-0.585 1.558,-1.007 2.462,-1.264c0.904,-0.258 1.951,-0.387 3.141,-0.387l7.779,0c0.715,0 1.393,0.106 2.035,0.316c0.642,0.211 1.189,0.539 1.642,0.984c0.452,0.445 0.821,1.007 1.106,1.686c0.285,0.679 0.428,1.51 0.428,2.494l0,83.602Z" style="fill:#333;fill-rule:nonzero;"/><path d="M618.185,179.351c0,0.375 -0.082,0.715 -0.246,1.019c-0.164,0.305 -0.48,0.55 -0.949,0.738c-0.468,0.187 -1.1,0.339 -1.896,0.456c-0.797,0.118 -1.827,0.176 -3.092,0.176c-1.639,0 -2.974,-0.07 -4.004,-0.211c-1.031,-0.14 -1.803,-0.398 -2.318,-0.772c-0.516,-0.375 -0.937,-0.797 -1.265,-1.265l-33.441,-45.454l0,45.454c0,0.328 -0.094,0.644 -0.281,0.948c-0.187,0.305 -0.515,0.539 -0.983,0.703c-0.469,0.164 -1.089,0.304 -1.862,0.421c-0.773,0.118 -1.745,0.176 -2.916,0.176c-1.124,0 -2.084,-0.058 -2.88,-0.176c-0.796,-0.117 -1.429,-0.257 -1.897,-0.421c-0.468,-0.164 -0.796,-0.398 -0.983,-0.703c-0.188,-0.304 -0.282,-0.62 -0.282,-0.948l0,-87.255c0,-0.375 0.094,-0.703 0.282,-0.984c0.187,-0.281 0.515,-0.503 0.983,-0.667c0.468,-0.164 1.101,-0.305 1.897,-0.422c0.796,-0.117 1.756,-0.175 2.88,-0.175c1.171,0 2.143,0.058 2.916,0.175c0.773,0.117 1.393,0.258 1.862,0.422c0.468,0.164 0.796,0.386 0.983,0.667c0.187,0.281 0.281,0.609 0.281,0.984l0,40.396l32.176,-40.396c0.281,-0.422 0.609,-0.773 0.984,-1.054c0.375,-0.281 0.831,-0.504 1.37,-0.667c0.538,-0.164 1.194,-0.293 1.967,-0.387c0.773,-0.094 1.768,-0.14 2.986,-0.14c1.218,0 2.201,0.058 2.95,0.175c0.75,0.117 1.347,0.27 1.792,0.457c0.445,0.187 0.749,0.421 0.913,0.702c0.164,0.282 0.246,0.586 0.246,0.914c0,0.609 -0.152,1.218 -0.457,1.826c-0.304,0.609 -0.878,1.452 -1.721,2.53l-30.139,36.04l32.458,43.136c0.796,1.217 1.276,2.049 1.44,2.494c0.164,0.444 0.246,0.807 0.246,1.088Z" style="fill:#333;fill-rule:nonzero;"/><path d="M713.941,95.609c0,0.89 -0.047,1.663 -0.141,2.318c-0.094,0.656 -0.258,1.183 -0.492,1.581c-0.234,0.398 -0.503,0.691 -0.808,0.878c-0.304,0.188 -0.62,0.281 -0.948,0.281l-33.3,0l0,30.912l31.473,0c0.328,0 0.644,0.082 0.949,0.246c0.304,0.164 0.574,0.433 0.808,0.808c0.234,0.374 0.398,0.878 0.491,1.51c0.094,0.632 0.141,1.44 0.141,2.424c0,0.89 -0.047,1.651 -0.141,2.283c-0.093,0.632 -0.257,1.148 -0.491,1.546c-0.234,0.398 -0.504,0.702 -0.808,0.913c-0.305,0.211 -0.621,0.316 -0.949,0.316l-31.473,0l0,37.867c0,0.328 -0.094,0.644 -0.281,0.948c-0.188,0.305 -0.516,0.539 -0.984,0.703c-0.468,0.164 -1.077,0.304 -1.826,0.421c-0.75,0.118 -1.733,0.176 -2.951,0.176c-1.124,0 -2.084,-0.058 -2.881,-0.176c-0.796,-0.117 -1.428,-0.257 -1.896,-0.421c-0.469,-0.164 -0.797,-0.398 -0.984,-0.703c-0.187,-0.304 -0.281,-0.62 -0.281,-0.948l0,-84.164c0,-1.827 0.48,-3.103 1.44,-3.829c0.96,-0.726 1.979,-1.089 3.056,-1.089l40.888,0c0.328,0 0.644,0.094 0.948,0.281c0.305,0.188 0.574,0.492 0.808,0.914c0.234,0.421 0.398,0.971 0.492,1.65c0.094,0.68 0.141,1.464 0.141,2.354Z" style="fill:#333;fill-rule:nonzero;"/><path d="M742.534,179.562c0,0.375 -0.094,0.691 -0.281,0.949c-0.187,0.257 -0.492,0.48 -0.913,0.667c-0.422,0.187 -1.007,0.328 -1.757,0.422c-0.749,0.093 -1.709,0.14 -2.88,0.14c-1.124,0 -2.061,-0.047 -2.81,-0.14c-0.75,-0.094 -1.347,-0.235 -1.792,-0.422c-0.445,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.328 0.082,-0.632 0.246,-0.913c0.164,-0.281 0.468,-0.516 0.913,-0.703c0.445,-0.187 1.042,-0.328 1.792,-0.422c0.749,-0.093 1.686,-0.14 2.81,-0.14c1.171,0 2.131,0.047 2.88,0.14c0.75,0.094 1.335,0.235 1.757,0.422c0.421,0.187 0.726,0.422 0.913,0.703c0.187,0.281 0.281,0.585 0.281,0.913l0,63.228Zm1.335,-84.585c0,2.716 -0.515,4.566 -1.546,5.55c-1.03,0.983 -2.927,1.475 -5.69,1.475c-2.717,0 -4.579,-0.48 -5.586,-1.44c-1.007,-0.96 -1.51,-2.775 -1.51,-5.445c0,-2.716 0.515,-4.566 1.546,-5.55c1.03,-0.983 2.927,-1.475 5.69,-1.475c2.717,0 4.578,0.48 5.585,1.44c1.007,0.96 1.511,2.775 1.511,5.445Z" style="fill:#333;fill-rule:nonzero;"/><path d="M800.915,120.479c0,1.03 -0.024,1.897 -0.07,2.599c-0.047,0.703 -0.141,1.253 -0.281,1.651c-0.141,0.398 -0.317,0.703 -0.527,0.913c-0.211,0.211 -0.504,0.317 -0.879,0.317c-0.374,0 -0.831,-0.106 -1.37,-0.317c-0.538,-0.21 -1.147,-0.421 -1.826,-0.632c-0.679,-0.211 -1.44,-0.41 -2.283,-0.597c-0.843,-0.187 -1.757,-0.281 -2.74,-0.281c-1.171,0 -2.319,0.234 -3.443,0.703c-1.124,0.468 -2.306,1.241 -3.548,2.318c-1.241,1.077 -2.54,2.506 -3.899,4.285c-1.358,1.78 -2.857,3.958 -4.496,6.534l0,41.59c0,0.375 -0.094,0.691 -0.281,0.949c-0.187,0.257 -0.492,0.48 -0.913,0.667c-0.422,0.187 -1.007,0.328 -1.756,0.422c-0.75,0.093 -1.71,0.14 -2.881,0.14c-1.124,0 -2.061,-0.047 -2.81,-0.14c-0.749,-0.094 -1.347,-0.235 -1.792,-0.422c-0.444,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.375 0.071,-0.691 0.211,-0.949c0.141,-0.257 0.422,-0.491 0.843,-0.702c0.422,-0.211 0.96,-0.351 1.616,-0.422c0.656,-0.07 1.522,-0.105 2.599,-0.105c1.031,0 1.885,0.035 2.565,0.105c0.679,0.071 1.206,0.211 1.58,0.422c0.375,0.211 0.644,0.445 0.808,0.702c0.164,0.258 0.246,0.574 0.246,0.949l0,9.203c1.733,-2.529 3.361,-4.59 4.883,-6.182c1.522,-1.593 2.962,-2.846 4.32,-3.759c1.359,-0.913 2.705,-1.545 4.04,-1.897c1.335,-0.351 2.681,-0.527 4.04,-0.527c0.608,0 1.299,0.036 2.072,0.106c0.773,0.07 1.581,0.199 2.424,0.386c0.843,0.188 1.604,0.398 2.283,0.632c0.679,0.235 1.159,0.469 1.44,0.703c0.281,0.234 0.469,0.457 0.562,0.667c0.094,0.211 0.176,0.48 0.246,0.808c0.07,0.328 0.117,0.808 0.141,1.441c0.023,0.632 0.035,1.487 0.035,2.564Z" style="fill:#333;fill-rule:nonzero;"/><path d="M907.911,179.562c0,0.375 -0.093,0.691 -0.281,0.949c-0.187,0.257 -0.491,0.48 -0.913,0.667c-0.422,0.187 -1.007,0.328 -1.756,0.422c-0.75,0.093 -1.686,0.14 -2.811,0.14c-1.17,0 -2.131,-0.047 -2.88,-0.14c-0.749,-0.094 -1.346,-0.235 -1.791,-0.422c-0.445,-0.187 -0.761,-0.41 -0.949,-0.667c-0.187,-0.258 -0.281,-0.574 -0.281,-0.949l0,-38.429c0,-2.669 -0.234,-5.105 -0.702,-7.306c-0.469,-2.201 -1.218,-4.098 -2.248,-5.691c-1.031,-1.592 -2.342,-2.81 -3.935,-3.653c-1.592,-0.843 -3.466,-1.264 -5.62,-1.264c-2.67,0 -5.351,1.03 -8.044,3.091c-2.693,2.061 -5.655,5.082 -8.887,9.063l0,44.189c0,0.375 -0.094,0.691 -0.281,0.949c-0.188,0.257 -0.504,0.48 -0.949,0.667c-0.445,0.187 -1.042,0.328 -1.791,0.422c-0.749,0.093 -1.686,0.14 -2.81,0.14c-1.077,0 -2.002,-0.047 -2.775,-0.14c-0.773,-0.094 -1.382,-0.235 -1.827,-0.422c-0.445,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-38.429c0,-2.669 -0.258,-5.105 -0.773,-7.306c-0.515,-2.201 -1.288,-4.098 -2.318,-5.691c-1.031,-1.592 -2.33,-2.81 -3.899,-3.653c-1.569,-0.843 -3.431,-1.264 -5.585,-1.264c-2.67,0 -5.363,1.03 -8.08,3.091c-2.716,2.061 -5.667,5.082 -8.852,9.063l0,44.189c0,0.375 -0.093,0.691 -0.281,0.949c-0.187,0.257 -0.491,0.48 -0.913,0.667c-0.421,0.187 -1.007,0.328 -1.756,0.422c-0.75,0.093 -1.71,0.14 -2.881,0.14c-1.124,0 -2.06,-0.047 -2.81,-0.14c-0.749,-0.094 -1.346,-0.235 -1.791,-0.422c-0.445,-0.187 -0.75,-0.41 -0.914,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.375 0.071,-0.691 0.211,-0.949c0.141,-0.257 0.422,-0.491 0.843,-0.702c0.422,-0.211 0.96,-0.351 1.616,-0.422c0.656,-0.07 1.522,-0.105 2.6,-0.105c1.03,0 1.885,0.035 2.564,0.105c0.679,0.071 1.206,0.211 1.581,0.422c0.374,0.211 0.643,0.445 0.807,0.702c0.164,0.258 0.246,0.574 0.246,0.949l0,8.36c3.56,-3.981 7.014,-6.897 10.363,-8.747c3.349,-1.85 6.732,-2.775 10.151,-2.775c2.623,0 4.977,0.305 7.061,0.914c2.084,0.609 3.922,1.463 5.515,2.564c1.592,1.101 2.951,2.412 4.075,3.934c1.124,1.522 2.06,3.22 2.81,5.094c2.107,-2.295 4.11,-4.239 6.006,-5.831c1.897,-1.593 3.724,-2.881 5.48,-3.864c1.757,-0.984 3.466,-1.698 5.129,-2.143c1.662,-0.445 3.337,-0.668 5.023,-0.668c4.075,0 7.494,0.715 10.257,2.143c2.763,1.429 5,3.337 6.709,5.726c1.71,2.388 2.927,5.187 3.653,8.395c0.726,3.208 1.089,6.592 1.089,10.152l0,39.974Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1016.52,116.193c0,0.328 -0.047,0.726 -0.141,1.195c-0.094,0.468 -0.257,1.053 -0.492,1.756l-18.617,60.067c-0.14,0.515 -0.363,0.937 -0.667,1.265c-0.305,0.327 -0.726,0.585 -1.265,0.772c-0.538,0.188 -1.276,0.316 -2.213,0.387c-0.937,0.07 -2.107,0.105 -3.513,0.105c-1.451,0 -2.669,-0.047 -3.653,-0.14c-0.983,-0.094 -1.768,-0.235 -2.353,-0.422c-0.586,-0.187 -1.019,-0.445 -1.3,-0.773c-0.281,-0.328 -0.492,-0.726 -0.632,-1.194l-13.278,-45.876l-0.141,-0.632l-0.14,0.632l-12.295,45.876c-0.14,0.515 -0.363,0.937 -0.667,1.265c-0.304,0.327 -0.761,0.585 -1.37,0.772c-0.609,0.188 -1.393,0.316 -2.353,0.387c-0.961,0.07 -2.143,0.105 -3.548,0.105c-1.452,0 -2.635,-0.047 -3.548,-0.14c-0.913,-0.094 -1.663,-0.235 -2.248,-0.422c-0.586,-0.187 -1.019,-0.445 -1.3,-0.773c-0.281,-0.328 -0.492,-0.726 -0.632,-1.194l-18.477,-60.067c-0.234,-0.703 -0.398,-1.288 -0.492,-1.756c-0.093,-0.469 -0.14,-0.867 -0.14,-1.195c0,-0.421 0.093,-0.761 0.281,-1.018c0.187,-0.258 0.503,-0.469 0.948,-0.633c0.445,-0.164 1.042,-0.269 1.792,-0.316c0.749,-0.047 1.662,-0.07 2.74,-0.07c1.311,0 2.365,0.035 3.161,0.105c0.796,0.071 1.405,0.188 1.827,0.352c0.421,0.164 0.726,0.398 0.913,0.702c0.187,0.305 0.351,0.668 0.492,1.089l15.245,52.128l0.14,0.633l0.141,-0.633l13.98,-52.128c0.094,-0.421 0.246,-0.784 0.457,-1.089c0.211,-0.304 0.527,-0.538 0.948,-0.702c0.422,-0.164 0.996,-0.281 1.722,-0.352c0.726,-0.07 1.674,-0.105 2.845,-0.105c1.124,0 2.049,0.035 2.775,0.105c0.726,0.071 1.3,0.188 1.721,0.352c0.422,0.164 0.726,0.386 0.913,0.667c0.188,0.281 0.328,0.609 0.422,0.984l15.104,52.268l0.141,0.633l0.07,-0.633l15.035,-52.128c0.093,-0.421 0.245,-0.784 0.456,-1.089c0.211,-0.304 0.539,-0.538 0.984,-0.702c0.445,-0.164 1.054,-0.281 1.826,-0.352c0.773,-0.07 1.768,-0.105 2.986,-0.105c1.124,0 2.026,0.023 2.705,0.07c0.679,0.047 1.218,0.164 1.616,0.351c0.398,0.188 0.679,0.399 0.843,0.633c0.164,0.234 0.246,0.562 0.246,0.983Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1076.94,179.632c0,0.563 -0.187,0.984 -0.562,1.265c-0.375,0.281 -0.89,0.492 -1.546,0.632c-0.655,0.141 -1.616,0.211 -2.88,0.211c-1.218,0 -2.19,-0.07 -2.916,-0.211c-0.726,-0.14 -1.252,-0.351 -1.58,-0.632c-0.328,-0.281 -0.492,-0.702 -0.492,-1.265l0,-6.322c-2.763,2.95 -5.843,5.245 -9.238,6.885c-3.396,1.639 -6.991,2.458 -10.784,2.458c-3.326,0 -6.335,-0.433 -9.028,-1.299c-2.693,-0.867 -4.988,-2.12 -6.885,-3.759c-1.897,-1.639 -3.372,-3.653 -4.426,-6.042c-1.054,-2.388 -1.581,-5.105 -1.581,-8.149c0,-3.56 0.726,-6.651 2.178,-9.274c1.452,-2.622 3.536,-4.8 6.253,-6.533c2.716,-1.733 6.042,-3.033 9.976,-3.899c3.934,-0.867 8.36,-1.3 13.278,-1.3l8.711,0l0,-4.918c0,-2.435 -0.257,-4.59 -0.772,-6.463c-0.516,-1.874 -1.347,-3.431 -2.495,-4.672c-1.147,-1.241 -2.634,-2.178 -4.461,-2.81c-1.826,-0.632 -4.074,-0.949 -6.744,-0.949c-2.857,0 -5.421,0.34 -7.693,1.019c-2.271,0.679 -4.262,1.429 -5.971,2.248c-1.71,0.82 -3.138,1.569 -4.286,2.248c-1.147,0.679 -2.002,1.019 -2.564,1.019c-0.375,0 -0.703,-0.094 -0.984,-0.281c-0.281,-0.187 -0.527,-0.468 -0.737,-0.843c-0.211,-0.375 -0.363,-0.855 -0.457,-1.44c-0.094,-0.586 -0.14,-1.23 -0.14,-1.932c0,-1.171 0.081,-2.096 0.245,-2.775c0.164,-0.679 0.562,-1.323 1.195,-1.932c0.632,-0.609 1.721,-1.323 3.267,-2.143c1.545,-0.82 3.325,-1.569 5.339,-2.248c2.014,-0.679 4.215,-1.241 6.604,-1.686c2.388,-0.445 4.8,-0.668 7.236,-0.668c4.543,0 8.407,0.516 11.592,1.546c3.185,1.03 5.761,2.541 7.728,4.531c1.967,1.991 3.395,4.461 4.285,7.412c0.89,2.951 1.335,6.393 1.335,10.327l0,42.644Zm-11.522,-28.874l-9.905,0c-3.185,0 -5.949,0.269 -8.29,0.808c-2.342,0.539 -4.286,1.335 -5.832,2.389c-1.545,1.054 -2.681,2.318 -3.407,3.793c-0.726,1.476 -1.089,3.174 -1.089,5.094c0,3.278 1.042,5.889 3.127,7.833c2.084,1.944 4.999,2.916 8.746,2.916c3.044,0 5.866,-0.773 8.466,-2.319c2.599,-1.545 5.327,-3.91 8.184,-7.095l0,-13.419Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1135.18,120.479c0,1.03 -0.023,1.897 -0.07,2.599c-0.047,0.703 -0.14,1.253 -0.281,1.651c-0.14,0.398 -0.316,0.703 -0.527,0.913c-0.211,0.211 -0.503,0.317 -0.878,0.317c-0.375,0 -0.831,-0.106 -1.37,-0.317c-0.539,-0.21 -1.147,-0.421 -1.827,-0.632c-0.679,-0.211 -1.44,-0.41 -2.283,-0.597c-0.843,-0.187 -1.756,-0.281 -2.74,-0.281c-1.171,0 -2.318,0.234 -3.442,0.703c-1.124,0.468 -2.307,1.241 -3.548,2.318c-1.241,1.077 -2.541,2.506 -3.899,4.285c-1.358,1.78 -2.857,3.958 -4.496,6.534l0,41.59c0,0.375 -0.094,0.691 -0.281,0.949c-0.188,0.257 -0.492,0.48 -0.914,0.667c-0.421,0.187 -1.007,0.328 -1.756,0.422c-0.749,0.093 -1.709,0.14 -2.88,0.14c-1.124,0 -2.061,-0.047 -2.811,-0.14c-0.749,-0.094 -1.346,-0.235 -1.791,-0.422c-0.445,-0.187 -0.749,-0.41 -0.913,-0.667c-0.164,-0.258 -0.246,-0.574 -0.246,-0.949l0,-63.228c0,-0.375 0.07,-0.691 0.211,-0.949c0.14,-0.257 0.421,-0.491 0.843,-0.702c0.421,-0.211 0.96,-0.351 1.615,-0.422c0.656,-0.07 1.523,-0.105 2.6,-0.105c1.03,0 1.885,0.035 2.564,0.105c0.679,0.071 1.206,0.211 1.581,0.422c0.375,0.211 0.644,0.445 0.808,0.702c0.164,0.258 0.246,0.574 0.246,0.949l0,9.203c1.733,-2.529 3.36,-4.59 4.882,-6.182c1.522,-1.593 2.963,-2.846 4.321,-3.759c1.358,-0.913 2.705,-1.545 4.039,-1.897c1.335,-0.351 2.682,-0.527 4.04,-0.527c0.609,0 1.3,0.036 2.073,0.106c0.772,0.07 1.58,0.199 2.423,0.386c0.843,0.188 1.604,0.398 2.284,0.632c0.679,0.235 1.159,0.469 1.44,0.703c0.281,0.234 0.468,0.457 0.562,0.667c0.093,0.211 0.175,0.48 0.246,0.808c0.07,0.328 0.117,0.808 0.14,1.441c0.024,0.632 0.035,1.487 0.035,2.564Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1200.45,145.208c0,1.827 -0.459,3.126 -1.376,3.899c-0.917,0.773 -1.964,1.159 -3.141,1.159l-41.64,0c0,3.513 0.353,6.675 1.059,9.485c0.706,2.81 1.882,5.222 3.53,7.236c1.647,2.014 3.789,3.559 6.424,4.637c2.636,1.077 5.86,1.615 9.672,1.615c3.012,0 5.694,-0.245 8.047,-0.737c2.354,-0.492 4.389,-1.042 6.107,-1.651c1.718,-0.609 3.13,-1.159 4.236,-1.651c1.106,-0.492 1.942,-0.738 2.507,-0.738c0.329,0 0.623,0.082 0.882,0.246c0.259,0.164 0.458,0.41 0.6,0.738c0.141,0.328 0.247,0.784 0.317,1.37c0.071,0.585 0.106,1.299 0.106,2.142c0,0.609 -0.023,1.136 -0.07,1.581c-0.047,0.445 -0.105,0.843 -0.175,1.194c-0.071,0.352 -0.188,0.668 -0.352,0.949c-0.164,0.281 -0.374,0.55 -0.632,0.808c-0.258,0.257 -1.019,0.679 -2.283,1.264c-1.265,0.586 -2.904,1.16 -4.918,1.722c-2.014,0.562 -4.344,1.065 -6.99,1.51c-2.647,0.445 -5.468,0.667 -8.466,0.667c-5.199,0 -9.753,-0.726 -13.664,-2.177c-3.911,-1.452 -7.201,-3.607 -9.871,-6.464c-2.67,-2.857 -4.683,-6.44 -6.042,-10.749c-1.358,-4.309 -2.037,-9.32 -2.037,-15.034c0,-5.433 0.702,-10.316 2.108,-14.648c1.405,-4.332 3.43,-8.009 6.077,-11.03c2.646,-3.021 5.842,-5.339 9.589,-6.955c3.747,-1.616 7.939,-2.424 12.576,-2.424c4.964,0 9.191,0.797 12.68,2.389c3.49,1.592 6.358,3.735 8.606,6.428c2.249,2.693 3.9,5.855 4.953,9.485c1.054,3.629 1.581,7.505 1.581,11.627l0,2.107Zm-11.662,-3.442c0.14,-6.089 -1.214,-10.866 -4.065,-14.332c-2.85,-3.466 -7.079,-5.199 -12.687,-5.199c-2.875,0 -5.396,0.539 -7.564,1.616c-2.167,1.077 -3.982,2.506 -5.443,4.285c-1.461,1.78 -2.592,3.853 -3.393,6.218c-0.801,2.365 -1.248,4.836 -1.343,7.412l34.495,0Z" style="fill:#333;fill-rule:nonzero;"/><path d="M379.752,276.089c0,0.493 -0.016,0.924 -0.047,1.294c-0.03,0.369 -0.084,0.693 -0.161,0.97c-0.077,0.277 -0.177,0.524 -0.301,0.739c-0.123,0.216 -0.338,0.478 -0.646,0.786c-0.308,0.308 -0.955,0.778 -1.941,1.409c-0.986,0.631 -2.21,1.247 -3.673,1.848c-1.463,0.601 -3.142,1.109 -5.036,1.525c-1.894,0.416 -3.966,0.623 -6.214,0.623c-3.881,0 -7.385,-0.646 -10.511,-1.94c-3.127,-1.294 -5.791,-3.203 -7.993,-5.729c-2.203,-2.526 -3.897,-5.645 -5.083,-9.356c-1.185,-3.712 -1.778,-7.985 -1.778,-12.821c0,-4.959 0.639,-9.379 1.917,-13.26c1.278,-3.881 3.072,-7.169 5.383,-9.865c2.31,-2.695 5.074,-4.751 8.293,-6.168c3.219,-1.417 6.784,-2.125 10.696,-2.125c1.725,0 3.403,0.162 5.036,0.485c1.632,0.324 3.142,0.732 4.528,1.225c1.386,0.492 2.618,1.062 3.696,1.709c1.078,0.647 1.825,1.178 2.241,1.594c0.416,0.416 0.685,0.732 0.808,0.947c0.123,0.216 0.224,0.47 0.301,0.763c0.077,0.292 0.138,0.639 0.184,1.039c0.047,0.4 0.07,0.878 0.07,1.432c0,0.616 -0.031,1.14 -0.093,1.571c-0.062,0.431 -0.155,0.793 -0.279,1.086c-0.124,0.293 -0.271,0.508 -0.441,0.647c-0.171,0.138 -0.38,0.208 -0.628,0.208c-0.433,0 -1.036,-0.301 -1.811,-0.901c-0.774,-0.601 -1.773,-1.263 -2.996,-1.987c-1.223,-0.724 -2.71,-1.386 -4.459,-1.987c-1.749,-0.6 -3.847,-0.901 -6.294,-0.901c-2.663,0 -5.086,0.532 -7.269,1.594c-2.183,1.063 -4.049,2.626 -5.597,4.69c-1.549,2.064 -2.748,4.582 -3.6,7.554c-0.852,2.972 -1.278,6.368 -1.278,10.188c0,3.788 0.411,7.138 1.231,10.049c0.821,2.91 1.998,5.344 3.53,7.3c1.533,1.956 3.415,3.434 5.644,4.435c2.23,1.001 4.753,1.502 7.571,1.502c2.384,0 4.467,-0.293 6.247,-0.878c1.781,-0.585 3.298,-1.24 4.552,-1.964c1.254,-0.724 2.283,-1.378 3.089,-1.963c0.805,-0.586 1.44,-0.878 1.904,-0.878c0.217,0 0.403,0.046 0.558,0.138c0.154,0.093 0.278,0.27 0.371,0.532c0.093,0.262 0.163,0.623 0.209,1.085c0.046,0.462 0.07,1.048 0.07,1.756Z" style="fill:#333;fill-rule:nonzero;"/><path d="M428.079,262.136c0,3.388 -0.446,6.507 -1.339,9.356c-0.894,2.849 -2.226,5.306 -3.997,7.369c-1.771,2.064 -3.989,3.673 -6.653,4.828c-2.664,1.156 -5.752,1.733 -9.264,1.733c-3.419,0 -6.399,-0.508 -8.94,-1.525c-2.541,-1.016 -4.659,-2.495 -6.353,-4.435c-1.694,-1.941 -2.957,-4.297 -3.788,-7.069c-0.832,-2.772 -1.248,-5.914 -1.248,-9.425c0,-3.388 0.439,-6.507 1.317,-9.356c0.878,-2.849 2.202,-5.306 3.973,-7.37c1.772,-2.063 3.982,-3.665 6.63,-4.805c2.649,-1.139 5.745,-1.709 9.287,-1.709c3.419,0 6.399,0.508 8.94,1.525c2.541,1.016 4.659,2.494 6.353,4.435c1.694,1.94 2.965,4.297 3.812,7.069c0.847,2.772 1.27,5.898 1.27,9.379Zm-7.9,0.508c0,-2.248 -0.21,-4.374 -0.63,-6.376c-0.419,-2.002 -1.111,-3.757 -2.074,-5.267c-0.964,-1.509 -2.269,-2.703 -3.917,-3.58c-1.647,-0.878 -3.698,-1.317 -6.153,-1.317c-2.269,0 -4.219,0.4 -5.851,1.201c-1.632,0.801 -2.976,1.933 -4.033,3.396c-1.056,1.463 -1.841,3.196 -2.354,5.198c-0.513,2.002 -0.769,4.189 -0.769,6.56c0,2.28 0.21,4.42 0.629,6.423c0.42,2.002 1.119,3.75 2.098,5.244c0.979,1.493 2.292,2.679 3.939,3.557c1.648,0.878 3.699,1.317 6.154,1.317c2.238,0 4.181,-0.401 5.828,-1.201c1.647,-0.801 2.999,-1.925 4.056,-3.373c1.056,-1.448 1.833,-3.173 2.331,-5.175c0.497,-2.002 0.746,-4.204 0.746,-6.607Z" style="fill:#333;fill-rule:nonzero;"/><path d="M500.987,283.389c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.77,0 -1.401,-0.03 -1.894,-0.092c-0.493,-0.062 -0.886,-0.154 -1.178,-0.277c-0.293,-0.123 -0.501,-0.27 -0.624,-0.439c-0.123,-0.17 -0.185,-0.377 -0.185,-0.624l0,-25.273c0,-1.755 -0.154,-3.357 -0.462,-4.805c-0.308,-1.447 -0.801,-2.695 -1.478,-3.742c-0.678,-1.047 -1.54,-1.848 -2.588,-2.403c-1.047,-0.554 -2.279,-0.831 -3.696,-0.831c-1.756,0 -3.519,0.677 -5.29,2.033c-1.771,1.355 -3.719,3.342 -5.845,5.96l0,29.061c0,0.247 -0.061,0.454 -0.184,0.624c-0.124,0.169 -0.332,0.316 -0.624,0.439c-0.293,0.123 -0.685,0.215 -1.178,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.709,0 -1.317,-0.03 -1.825,-0.092c-0.509,-0.062 -0.909,-0.154 -1.202,-0.277c-0.292,-0.123 -0.492,-0.27 -0.6,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-25.273c0,-1.755 -0.169,-3.357 -0.508,-4.805c-0.339,-1.447 -0.847,-2.695 -1.525,-3.742c-0.678,-1.047 -1.532,-1.848 -2.564,-2.403c-1.032,-0.554 -2.256,-0.831 -3.673,-0.831c-1.756,0 -3.527,0.677 -5.314,2.033c-1.786,1.355 -3.727,3.342 -5.821,5.96l0,29.061c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.6,0.439c-0.278,0.123 -0.663,0.215 -1.156,0.277c-0.492,0.062 -1.124,0.092 -1.894,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.108,-0.17 -0.161,-0.377 -0.161,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.138,-0.624c0.093,-0.169 0.277,-0.323 0.555,-0.462c0.277,-0.138 0.631,-0.231 1.062,-0.277c0.432,-0.046 1.001,-0.069 1.71,-0.069c0.677,0 1.24,0.023 1.686,0.069c0.447,0.046 0.793,0.139 1.04,0.277c0.246,0.139 0.423,0.293 0.531,0.462c0.108,0.17 0.162,0.378 0.162,0.624l0,5.498c2.341,-2.618 4.612,-4.535 6.815,-5.752c2.202,-1.217 4.427,-1.825 6.676,-1.825c1.725,0 3.273,0.2 4.643,0.601c1.371,0.4 2.58,0.962 3.627,1.686c1.047,0.724 1.941,1.586 2.68,2.587c0.739,1.001 1.355,2.118 1.848,3.35c1.386,-1.509 2.703,-2.788 3.95,-3.835c1.248,-1.047 2.449,-1.894 3.604,-2.541c1.155,-0.647 2.279,-1.117 3.373,-1.409c1.093,-0.293 2.194,-0.439 3.303,-0.439c2.68,0 4.929,0.47 6.746,1.409c1.817,0.939 3.288,2.195 4.412,3.766c1.124,1.57 1.925,3.411 2.403,5.521c0.477,2.11 0.716,4.335 0.716,6.676l0,26.289Z" style="fill:#333;fill-rule:nonzero;"/><path d="M576.574,283.389c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.492,0.062 -1.108,0.092 -1.848,0.092c-0.77,0 -1.401,-0.03 -1.894,-0.092c-0.493,-0.062 -0.886,-0.154 -1.178,-0.277c-0.293,-0.123 -0.501,-0.27 -0.624,-0.439c-0.123,-0.17 -0.185,-0.377 -0.185,-0.624l0,-25.273c0,-1.755 -0.154,-3.357 -0.462,-4.805c-0.308,-1.447 -0.801,-2.695 -1.478,-3.742c-0.678,-1.047 -1.54,-1.848 -2.588,-2.403c-1.047,-0.554 -2.279,-0.831 -3.696,-0.831c-1.755,0 -3.519,0.677 -5.29,2.033c-1.771,1.355 -3.719,3.342 -5.844,5.96l0,29.061c0,0.247 -0.062,0.454 -0.185,0.624c-0.124,0.169 -0.331,0.316 -0.624,0.439c-0.293,0.123 -0.685,0.215 -1.178,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.709,0 -1.317,-0.03 -1.825,-0.092c-0.509,-0.062 -0.909,-0.154 -1.202,-0.277c-0.292,-0.123 -0.492,-0.27 -0.6,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-25.273c0,-1.755 -0.169,-3.357 -0.508,-4.805c-0.339,-1.447 -0.847,-2.695 -1.525,-3.742c-0.677,-1.047 -1.532,-1.848 -2.564,-2.403c-1.032,-0.554 -2.256,-0.831 -3.673,-0.831c-1.756,0 -3.527,0.677 -5.313,2.033c-1.787,1.355 -3.727,3.342 -5.822,5.96l0,29.061c0,0.247 -0.061,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.6,0.439c-0.278,0.123 -0.663,0.215 -1.155,0.277c-0.493,0.062 -1.125,0.092 -1.895,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.107,-0.17 -0.161,-0.377 -0.161,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.138,-0.624c0.093,-0.169 0.278,-0.323 0.555,-0.462c0.277,-0.138 0.631,-0.231 1.062,-0.277c0.432,-0.046 1.001,-0.069 1.71,-0.069c0.678,0 1.24,0.023 1.686,0.069c0.447,0.046 0.793,0.139 1.04,0.277c0.246,0.139 0.423,0.293 0.531,0.462c0.108,0.17 0.162,0.378 0.162,0.624l0,5.498c2.341,-2.618 4.612,-4.535 6.815,-5.752c2.202,-1.217 4.427,-1.825 6.676,-1.825c1.725,0 3.273,0.2 4.643,0.601c1.371,0.4 2.58,0.962 3.627,1.686c1.047,0.724 1.941,1.586 2.68,2.587c0.739,1.001 1.355,2.118 1.848,3.35c1.386,-1.509 2.703,-2.788 3.95,-3.835c1.248,-1.047 2.449,-1.894 3.604,-2.541c1.155,-0.647 2.279,-1.117 3.373,-1.409c1.093,-0.293 2.195,-0.439 3.303,-0.439c2.68,0 4.929,0.47 6.746,1.409c1.817,0.939 3.288,2.195 4.412,3.766c1.125,1.57 1.925,3.411 2.403,5.521c0.477,2.11 0.716,4.335 0.716,6.676l0,26.289Z" style="fill:#333;fill-rule:nonzero;"/><path d="M626.103,283.389c0,0.247 -0.054,0.454 -0.162,0.624c-0.108,0.169 -0.3,0.316 -0.577,0.439c-0.278,0.123 -0.639,0.215 -1.086,0.277c-0.447,0.062 -0.993,0.092 -1.64,0.092c-0.709,0 -1.286,-0.03 -1.733,-0.092c-0.447,-0.062 -0.801,-0.154 -1.063,-0.277c-0.261,-0.123 -0.438,-0.27 -0.531,-0.439c-0.092,-0.17 -0.138,-0.377 -0.138,-0.624l0,-5.498c-2.372,2.618 -4.713,4.528 -7.023,5.729c-2.31,1.201 -4.651,1.802 -7.023,1.802c-2.772,0 -5.105,-0.462 -7,-1.386c-1.894,-0.924 -3.426,-2.179 -4.597,-3.766c-1.17,-1.586 -2.01,-3.434 -2.518,-5.544c-0.508,-2.11 -0.762,-4.674 -0.762,-7.693l0,-25.226c0,-0.246 0.054,-0.454 0.162,-0.624c0.107,-0.169 0.315,-0.323 0.623,-0.462c0.308,-0.138 0.709,-0.231 1.202,-0.277c0.492,-0.046 1.108,-0.069 1.848,-0.069c0.739,0 1.355,0.023 1.848,0.069c0.493,0.046 0.885,0.139 1.178,0.277c0.292,0.139 0.5,0.293 0.624,0.462c0.123,0.17 0.184,0.378 0.184,0.624l0,24.21c0,2.433 0.178,4.382 0.532,5.845c0.354,1.463 0.893,2.71 1.617,3.742c0.724,1.032 1.64,1.833 2.749,2.403c1.109,0.569 2.402,0.854 3.881,0.854c1.91,0 3.812,-0.677 5.706,-2.033c1.894,-1.355 3.904,-3.342 6.029,-5.96l0,-29.061c0,-0.246 0.054,-0.454 0.162,-0.624c0.108,-0.169 0.316,-0.323 0.624,-0.462c0.308,-0.138 0.7,-0.231 1.178,-0.277c0.477,-0.046 1.101,-0.069 1.871,-0.069c0.739,0 1.355,0.023 1.848,0.069c0.493,0.046 0.878,0.139 1.155,0.277c0.277,0.139 0.485,0.293 0.624,0.462c0.139,0.17 0.208,0.378 0.208,0.624l0,41.582Z" style="fill:#333;fill-rule:nonzero;"/><path d="M676.001,283.389c0,0.247 -0.061,0.454 -0.184,0.624c-0.124,0.169 -0.324,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.109,0.092 -1.848,0.092c-0.77,0 -1.402,-0.03 -1.894,-0.092c-0.493,-0.062 -0.878,-0.154 -1.155,-0.277c-0.278,-0.123 -0.478,-0.27 -0.601,-0.439c-0.123,-0.17 -0.185,-0.377 -0.185,-0.624l0,-24.349c0,-2.371 -0.185,-4.281 -0.554,-5.729c-0.37,-1.447 -0.909,-2.695 -1.617,-3.742c-0.709,-1.047 -1.625,-1.848 -2.749,-2.403c-1.125,-0.554 -2.426,-0.831 -3.905,-0.831c-1.909,0 -3.819,0.677 -5.729,2.033c-1.909,1.355 -3.911,3.342 -6.006,5.96l0,29.061c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.6,0.439c-0.278,0.123 -0.663,0.215 -1.155,0.277c-0.493,0.062 -1.125,0.092 -1.895,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.107,-0.17 -0.161,-0.377 -0.161,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.138,-0.624c0.093,-0.169 0.277,-0.323 0.555,-0.462c0.277,-0.138 0.631,-0.231 1.062,-0.277c0.432,-0.046 1.001,-0.069 1.71,-0.069c0.677,0 1.24,0.023 1.686,0.069c0.447,0.046 0.793,0.139 1.04,0.277c0.246,0.139 0.423,0.293 0.531,0.462c0.108,0.17 0.162,0.378 0.162,0.624l0,5.498c2.341,-2.618 4.674,-4.535 6.999,-5.752c2.326,-1.217 4.675,-1.825 7.046,-1.825c2.772,0 5.106,0.47 7,1.409c1.894,0.939 3.427,2.195 4.597,3.766c1.171,1.57 2.01,3.411 2.518,5.521c0.508,2.11 0.762,4.643 0.762,7.6l0,25.365Z" style="fill:#333;fill-rule:nonzero;"/><path d="M697.532,283.389c0,0.247 -0.062,0.454 -0.185,0.624c-0.123,0.169 -0.323,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.124,0.092 -1.894,0.092c-0.739,0 -1.355,-0.03 -1.848,-0.092c-0.493,-0.062 -0.886,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.27 -0.601,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-41.582c0,-0.216 0.054,-0.416 0.162,-0.601c0.108,-0.184 0.308,-0.338 0.601,-0.462c0.292,-0.123 0.685,-0.215 1.178,-0.277c0.493,-0.061 1.109,-0.092 1.848,-0.092c0.77,0 1.401,0.031 1.894,0.092c0.493,0.062 0.878,0.154 1.155,0.277c0.278,0.124 0.478,0.278 0.601,0.462c0.123,0.185 0.185,0.385 0.185,0.601l0,41.582Zm0.878,-55.628c0,1.787 -0.339,3.004 -1.017,3.65c-0.677,0.647 -1.925,0.971 -3.742,0.971c-1.787,0 -3.011,-0.316 -3.673,-0.947c-0.663,-0.632 -0.994,-1.825 -0.994,-3.581c0,-1.787 0.339,-3.003 1.017,-3.65c0.677,-0.647 1.925,-0.97 3.742,-0.97c1.787,0 3.011,0.315 3.673,0.947c0.663,0.631 0.994,1.825 0.994,3.58Z" style="fill:#333;fill-rule:nonzero;"/><path d="M733.246,280.34c0,0.893 -0.061,1.601 -0.185,2.125c-0.123,0.524 -0.308,0.909 -0.554,1.155c-0.246,0.247 -0.616,0.478 -1.109,0.693c-0.493,0.216 -1.055,0.393 -1.686,0.532c-0.632,0.138 -1.302,0.254 -2.01,0.346c-0.708,0.092 -1.417,0.139 -2.125,0.139c-2.156,0 -4.005,-0.285 -5.545,-0.855c-1.54,-0.57 -2.803,-1.432 -3.788,-2.587c-0.986,-1.155 -1.702,-2.619 -2.149,-4.39c-0.446,-1.771 -0.67,-3.858 -0.67,-6.26l0,-24.303l-5.821,0c-0.462,0 -0.832,-0.246 -1.109,-0.739c-0.277,-0.493 -0.416,-1.293 -0.416,-2.402c0,-0.586 0.039,-1.078 0.116,-1.479c0.077,-0.4 0.177,-0.731 0.3,-0.993c0.123,-0.262 0.285,-0.447 0.485,-0.555c0.2,-0.107 0.424,-0.161 0.67,-0.161l5.775,0l0,-9.888c0,-0.215 0.054,-0.415 0.162,-0.6c0.108,-0.185 0.308,-0.347 0.601,-0.485c0.292,-0.139 0.685,-0.239 1.178,-0.301c0.493,-0.061 1.109,-0.092 1.848,-0.092c0.77,0 1.401,0.031 1.894,0.092c0.493,0.062 0.878,0.162 1.155,0.301c0.278,0.138 0.478,0.3 0.601,0.485c0.123,0.185 0.185,0.385 0.185,0.6l0,9.888l10.673,0c0.246,0 0.462,0.054 0.646,0.161c0.185,0.108 0.347,0.293 0.486,0.555c0.138,0.262 0.238,0.593 0.3,0.993c0.061,0.401 0.092,0.893 0.092,1.479c0,1.109 -0.138,1.909 -0.416,2.402c-0.277,0.493 -0.646,0.739 -1.108,0.739l-10.673,0l0,23.194c0,2.865 0.423,5.028 1.27,6.491c0.847,1.464 2.364,2.195 4.551,2.195c0.709,0 1.34,-0.069 1.895,-0.208c0.554,-0.138 1.047,-0.285 1.478,-0.439c0.431,-0.154 0.801,-0.3 1.109,-0.439c0.308,-0.138 0.585,-0.208 0.832,-0.208c0.154,0 0.3,0.039 0.439,0.116c0.138,0.077 0.246,0.223 0.323,0.439c0.077,0.215 0.146,0.508 0.208,0.878c0.061,0.369 0.092,0.831 0.092,1.386Z" style="fill:#333;fill-rule:nonzero;"/><path d="M762.261,284.544l-5.544,15.293c-0.185,0.493 -0.654,0.87 -1.409,1.132c-0.755,0.262 -1.902,0.393 -3.442,0.393c-0.801,0 -1.448,-0.039 -1.941,-0.116c-0.493,-0.077 -0.87,-0.208 -1.132,-0.392c-0.261,-0.185 -0.408,-0.432 -0.439,-0.74c-0.03,-0.308 0.047,-0.677 0.231,-1.108l5.73,-14.462c-0.278,-0.123 -0.539,-0.323 -0.786,-0.6c-0.246,-0.278 -0.416,-0.57 -0.508,-0.878l-14.831,-39.734c-0.247,-0.647 -0.37,-1.155 -0.37,-1.525c0,-0.37 0.123,-0.662 0.37,-0.878c0.246,-0.215 0.647,-0.362 1.201,-0.439c0.555,-0.077 1.294,-0.115 2.218,-0.115c0.924,0 1.648,0.023 2.171,0.069c0.524,0.046 0.94,0.131 1.248,0.254c0.308,0.123 0.531,0.3 0.67,0.531c0.138,0.231 0.285,0.547 0.439,0.948l11.874,33.358l0.138,0l11.459,-33.543c0.184,-0.585 0.408,-0.963 0.669,-1.132c0.262,-0.17 0.655,-0.293 1.179,-0.37c0.523,-0.077 1.278,-0.115 2.264,-0.115c0.862,0 1.57,0.038 2.125,0.115c0.554,0.077 0.962,0.224 1.224,0.439c0.262,0.216 0.393,0.508 0.393,0.878c0,0.37 -0.092,0.832 -0.277,1.386l-14.924,41.351Z" style="fill:#333;fill-rule:nonzero;"/><path d="M840.528,267.773c0,2.803 -0.516,5.298 -1.548,7.485c-1.031,2.186 -2.464,4.042 -4.296,5.567c-1.833,1.525 -3.989,2.672 -6.469,3.442c-2.479,0.77 -5.151,1.155 -8.016,1.155c-2.002,0 -3.858,-0.169 -5.567,-0.508c-1.71,-0.339 -3.234,-0.755 -4.574,-1.248c-1.34,-0.492 -2.464,-1.001 -3.373,-1.524c-0.909,-0.524 -1.54,-0.971 -1.894,-1.34c-0.355,-0.37 -0.616,-0.84 -0.786,-1.409c-0.169,-0.57 -0.254,-1.333 -0.254,-2.287c0,-0.678 0.031,-1.24 0.093,-1.687c0.061,-0.446 0.154,-0.808 0.277,-1.086c0.123,-0.277 0.277,-0.469 0.462,-0.577c0.185,-0.108 0.4,-0.162 0.647,-0.162c0.431,0 1.039,0.262 1.825,0.786c0.785,0.523 1.794,1.093 3.026,1.709c1.232,0.616 2.718,1.194 4.458,1.733c1.741,0.539 3.75,0.808 6.03,0.808c1.725,0 3.303,-0.231 4.736,-0.693c1.432,-0.462 2.664,-1.116 3.696,-1.963c1.032,-0.847 1.825,-1.887 2.379,-3.119c0.555,-1.232 0.832,-2.634 0.832,-4.204c0,-1.695 -0.385,-3.142 -1.155,-4.343c-0.77,-1.202 -1.787,-2.257 -3.05,-3.165c-1.262,-0.909 -2.702,-1.741 -4.32,-2.495c-1.617,-0.755 -3.272,-1.525 -4.966,-2.31c-1.694,-0.786 -3.342,-1.656 -4.944,-2.611c-1.602,-0.955 -3.034,-2.079 -4.297,-3.373c-1.263,-1.293 -2.287,-2.81 -3.072,-4.551c-0.786,-1.74 -1.178,-3.827 -1.178,-6.26c0,-2.495 0.454,-4.72 1.363,-6.676c0.908,-1.956 2.171,-3.596 3.788,-4.921c1.617,-1.324 3.542,-2.333 5.775,-3.026c2.234,-0.693 4.644,-1.04 7.231,-1.04c1.325,0 2.657,0.116 3.997,0.347c1.34,0.231 2.602,0.539 3.788,0.924c1.186,0.385 2.241,0.816 3.165,1.294c0.924,0.477 1.532,0.862 1.825,1.155c0.293,0.292 0.485,0.523 0.578,0.693c0.092,0.169 0.169,0.385 0.231,0.647c0.061,0.261 0.107,0.577 0.138,0.947c0.031,0.369 0.046,0.847 0.046,1.432c0,0.554 -0.023,1.047 -0.069,1.479c-0.046,0.431 -0.115,0.793 -0.208,1.085c-0.092,0.293 -0.223,0.508 -0.392,0.647c-0.17,0.139 -0.362,0.208 -0.578,0.208c-0.339,0 -0.87,-0.216 -1.594,-0.647c-0.724,-0.431 -1.609,-0.916 -2.657,-1.455c-1.047,-0.539 -2.287,-1.032 -3.719,-1.479c-1.432,-0.446 -3.042,-0.67 -4.828,-0.67c-1.663,0 -3.111,0.224 -4.343,0.67c-1.232,0.447 -2.249,1.04 -3.049,1.779c-0.801,0.739 -1.402,1.617 -1.802,2.634c-0.401,1.016 -0.601,2.094 -0.601,3.234c0,1.663 0.385,3.095 1.155,4.297c0.77,1.201 1.794,2.264 3.073,3.188c1.278,0.924 2.733,1.771 4.366,2.541c1.632,0.77 3.295,1.548 4.99,2.333c1.694,0.785 3.357,1.648 4.989,2.587c1.633,0.94 3.088,2.049 4.367,3.327c1.278,1.278 2.31,2.787 3.095,4.528c0.786,1.74 1.178,3.796 1.178,6.168Z" style="fill:#333;fill-rule:nonzero;"/><path d="M886.638,283.389c0,0.247 -0.054,0.454 -0.161,0.624c-0.108,0.169 -0.301,0.316 -0.578,0.439c-0.277,0.123 -0.639,0.215 -1.086,0.277c-0.446,0.062 -0.993,0.092 -1.64,0.092c-0.708,0 -1.286,-0.03 -1.733,-0.092c-0.446,-0.062 -0.8,-0.154 -1.062,-0.277c-0.262,-0.123 -0.439,-0.27 -0.532,-0.439c-0.092,-0.17 -0.138,-0.377 -0.138,-0.624l0,-5.498c-2.372,2.618 -4.713,4.528 -7.023,5.729c-2.31,1.201 -4.651,1.802 -7.023,1.802c-2.772,0 -5.105,-0.462 -6.999,-1.386c-1.895,-0.924 -3.427,-2.179 -4.597,-3.766c-1.171,-1.586 -2.01,-3.434 -2.519,-5.544c-0.508,-2.11 -0.762,-4.674 -0.762,-7.693l0,-25.226c0,-0.246 0.054,-0.454 0.162,-0.624c0.108,-0.169 0.316,-0.323 0.624,-0.462c0.308,-0.138 0.708,-0.231 1.201,-0.277c0.493,-0.046 1.109,-0.069 1.848,-0.069c0.739,0 1.355,0.023 1.848,0.069c0.493,0.046 0.886,0.139 1.178,0.277c0.293,0.139 0.501,0.293 0.624,0.462c0.123,0.17 0.185,0.378 0.185,0.624l0,24.21c0,2.433 0.177,4.382 0.531,5.845c0.354,1.463 0.893,2.71 1.617,3.742c0.724,1.032 1.64,1.833 2.749,2.403c1.109,0.569 2.403,0.854 3.881,0.854c1.91,0 3.812,-0.677 5.706,-2.033c1.895,-1.355 3.904,-3.342 6.03,-5.96l0,-29.061c0,-0.246 0.054,-0.454 0.161,-0.624c0.108,-0.169 0.316,-0.323 0.624,-0.462c0.308,-0.138 0.701,-0.231 1.178,-0.277c0.478,-0.046 1.101,-0.069 1.871,-0.069c0.74,0 1.356,0.023 1.849,0.069c0.492,0.046 0.877,0.139 1.155,0.277c0.277,0.139 0.485,0.293 0.623,0.462c0.139,0.17 0.208,0.378 0.208,0.624l0,41.582Z" style="fill:#333;fill-rule:nonzero;"/><path d="M938.986,261.951c0,3.635 -0.393,6.9 -1.179,9.795c-0.785,2.895 -1.94,5.352 -3.465,7.369c-1.524,2.018 -3.411,3.573 -5.66,4.667c-2.248,1.093 -4.82,1.64 -7.715,1.64c-1.232,0 -2.372,-0.123 -3.419,-0.37c-1.048,-0.246 -2.072,-0.631 -3.073,-1.155c-1.001,-0.523 -1.994,-1.185 -2.98,-1.986c-0.986,-0.801 -2.033,-1.741 -3.142,-2.819l0,20.791c0,0.247 -0.061,0.462 -0.184,0.647c-0.124,0.185 -0.324,0.339 -0.601,0.462c-0.277,0.123 -0.662,0.216 -1.155,0.277c-0.493,0.062 -1.124,0.093 -1.894,0.093c-0.74,0 -1.356,-0.031 -1.849,-0.093c-0.492,-0.061 -0.885,-0.154 -1.178,-0.277c-0.292,-0.123 -0.493,-0.277 -0.6,-0.462c-0.108,-0.185 -0.162,-0.4 -0.162,-0.647l0,-58.076c0,-0.277 0.046,-0.501 0.139,-0.67c0.092,-0.169 0.277,-0.316 0.554,-0.439c0.277,-0.123 0.631,-0.208 1.063,-0.254c0.431,-0.046 0.954,-0.069 1.571,-0.069c0.646,0 1.178,0.023 1.594,0.069c0.415,0.046 0.762,0.131 1.039,0.254c0.277,0.123 0.47,0.27 0.578,0.439c0.107,0.169 0.161,0.393 0.161,0.67l0,5.59c1.263,-1.293 2.48,-2.417 3.65,-3.372c1.171,-0.955 2.349,-1.748 3.535,-2.38c1.186,-0.631 2.402,-1.109 3.65,-1.432c1.247,-0.323 2.564,-0.485 3.95,-0.485c3.019,0 5.591,0.585 7.716,1.756c2.125,1.17 3.858,2.772 5.198,4.805c1.34,2.033 2.317,4.397 2.933,7.092c0.617,2.695 0.925,5.552 0.925,8.57Zm-7.901,0.878c0,-2.125 -0.163,-4.181 -0.488,-6.168c-0.325,-1.987 -0.883,-3.75 -1.673,-5.29c-0.791,-1.54 -1.852,-2.772 -3.185,-3.696c-1.332,-0.924 -2.99,-1.386 -4.974,-1.386c-0.992,0 -1.968,0.146 -2.929,0.439c-0.96,0.292 -1.936,0.754 -2.928,1.386c-0.992,0.631 -2.03,1.463 -3.115,2.495c-1.085,1.031 -2.231,2.302 -3.44,3.811l0,16.541c2.108,2.556 4.107,4.512 5.997,5.867c1.891,1.356 3.874,2.033 5.95,2.033c1.922,0 3.572,-0.462 4.951,-1.386c1.379,-0.924 2.495,-2.156 3.347,-3.696c0.852,-1.54 1.48,-3.265 1.883,-5.175c0.403,-1.909 0.604,-3.834 0.604,-5.775Z" style="fill:#333;fill-rule:nonzero;"/><path d="M988.699,261.951c0,3.635 -0.392,6.9 -1.178,9.795c-0.785,2.895 -1.94,5.352 -3.465,7.369c-1.525,2.018 -3.411,3.573 -5.66,4.667c-2.248,1.093 -4.82,1.64 -7.716,1.64c-1.232,0 -2.371,-0.123 -3.419,-0.37c-1.047,-0.246 -2.071,-0.631 -3.072,-1.155c-1.001,-0.523 -1.994,-1.185 -2.98,-1.986c-0.986,-0.801 -2.033,-1.741 -3.142,-2.819l0,20.791c0,0.247 -0.061,0.462 -0.185,0.647c-0.123,0.185 -0.323,0.339 -0.6,0.462c-0.278,0.123 -0.663,0.216 -1.155,0.277c-0.493,0.062 -1.125,0.093 -1.895,0.093c-0.739,0 -1.355,-0.031 -1.848,-0.093c-0.493,-0.061 -0.885,-0.154 -1.178,-0.277c-0.293,-0.123 -0.493,-0.277 -0.601,-0.462c-0.107,-0.185 -0.161,-0.4 -0.161,-0.647l0,-58.076c0,-0.277 0.046,-0.501 0.138,-0.67c0.093,-0.169 0.278,-0.316 0.555,-0.439c0.277,-0.123 0.631,-0.208 1.062,-0.254c0.432,-0.046 0.955,-0.069 1.571,-0.069c0.647,0 1.178,0.023 1.594,0.069c0.416,0.046 0.763,0.131 1.04,0.254c0.277,0.123 0.47,0.27 0.577,0.439c0.108,0.169 0.162,0.393 0.162,0.67l0,5.59c1.263,-1.293 2.48,-2.417 3.65,-3.372c1.171,-0.955 2.349,-1.748 3.535,-2.38c1.185,-0.631 2.402,-1.109 3.65,-1.432c1.247,-0.323 2.564,-0.485 3.95,-0.485c3.018,0 5.59,0.585 7.716,1.756c2.125,1.17 3.858,2.772 5.197,4.805c1.34,2.033 2.318,4.397 2.934,7.092c0.616,2.695 0.924,5.552 0.924,8.57Zm-7.9,0.878c0,-2.125 -0.163,-4.181 -0.488,-6.168c-0.326,-1.987 -0.883,-3.75 -1.674,-5.29c-0.79,-1.54 -1.851,-2.772 -3.184,-3.696c-1.333,-0.924 -2.991,-1.386 -4.974,-1.386c-0.992,0 -1.968,0.146 -2.929,0.439c-0.96,0.292 -1.937,0.754 -2.928,1.386c-0.992,0.631 -2.03,1.463 -3.115,2.495c-1.085,1.031 -2.231,2.302 -3.44,3.811l0,16.541c2.108,2.556 4.107,4.512 5.997,5.867c1.891,1.356 3.874,2.033 5.95,2.033c1.921,0 3.571,-0.462 4.951,-1.386c1.379,-0.924 2.494,-2.156 3.347,-3.696c0.852,-1.54 1.48,-3.265 1.882,-5.175c0.403,-1.909 0.605,-3.834 0.605,-5.775Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1038.83,262.136c0,3.388 -0.447,6.507 -1.34,9.356c-0.893,2.849 -2.225,5.306 -3.996,7.369c-1.772,2.064 -3.989,3.673 -6.654,4.828c-2.664,1.156 -5.752,1.733 -9.263,1.733c-3.419,0 -6.399,-0.508 -8.94,-1.525c-2.541,-1.016 -4.659,-2.495 -6.353,-4.435c-1.694,-1.941 -2.957,-4.297 -3.789,-7.069c-0.831,-2.772 -1.247,-5.914 -1.247,-9.425c0,-3.388 0.439,-6.507 1.317,-9.356c0.877,-2.849 2.202,-5.306 3.973,-7.37c1.771,-2.063 3.981,-3.665 6.63,-4.805c2.649,-1.139 5.744,-1.709 9.287,-1.709c3.419,0 6.399,0.508 8.94,1.525c2.541,1.016 4.659,2.494 6.353,4.435c1.694,1.94 2.964,4.297 3.811,7.069c0.847,2.772 1.271,5.898 1.271,9.379Zm-7.901,0.508c0,-2.248 -0.21,-4.374 -0.629,-6.376c-0.42,-2.002 -1.111,-3.757 -2.075,-5.267c-0.963,-1.509 -2.269,-2.703 -3.916,-3.58c-1.647,-0.878 -3.698,-1.317 -6.154,-1.317c-2.269,0 -4.219,0.4 -5.851,1.201c-1.631,0.801 -2.976,1.933 -4.032,3.396c-1.057,1.463 -1.842,3.196 -2.354,5.198c-0.513,2.002 -0.77,4.189 -0.77,6.56c0,2.28 0.21,4.42 0.63,6.423c0.42,2.002 1.119,3.75 2.098,5.244c0.979,1.493 2.292,2.679 3.939,3.557c1.647,0.878 3.698,1.317 6.154,1.317c2.238,0 4.18,-0.401 5.827,-1.201c1.648,-0.801 3,-1.925 4.056,-3.373c1.057,-1.448 1.834,-3.173 2.331,-5.175c0.498,-2.002 0.746,-4.204 0.746,-6.607Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1074.36,244.533c0,0.678 -0.016,1.247 -0.047,1.709c-0.03,0.462 -0.092,0.824 -0.184,1.086c-0.093,0.262 -0.208,0.462 -0.347,0.601c-0.139,0.138 -0.331,0.208 -0.577,0.208c-0.247,0 -0.547,-0.07 -0.901,-0.208c-0.355,-0.139 -0.755,-0.277 -1.202,-0.416c-0.446,-0.139 -0.947,-0.27 -1.501,-0.393c-0.555,-0.123 -1.155,-0.185 -1.802,-0.185c-0.77,0 -1.525,0.154 -2.264,0.462c-0.739,0.308 -1.517,0.817 -2.333,1.525c-0.817,0.709 -1.671,1.648 -2.565,2.818c-0.893,1.171 -1.878,2.603 -2.956,4.297l0,27.352c0,0.247 -0.062,0.454 -0.185,0.624c-0.124,0.169 -0.324,0.316 -0.601,0.439c-0.277,0.123 -0.662,0.215 -1.155,0.277c-0.493,0.062 -1.124,0.092 -1.894,0.092c-0.74,0 -1.356,-0.03 -1.848,-0.092c-0.493,-0.062 -0.886,-0.154 -1.179,-0.277c-0.292,-0.123 -0.492,-0.27 -0.6,-0.439c-0.108,-0.17 -0.162,-0.377 -0.162,-0.624l0,-41.582c0,-0.246 0.046,-0.454 0.139,-0.624c0.092,-0.169 0.277,-0.323 0.554,-0.462c0.277,-0.138 0.632,-0.231 1.063,-0.277c0.431,-0.046 1.001,-0.069 1.709,-0.069c0.678,0 1.24,0.023 1.687,0.069c0.446,0.046 0.793,0.139 1.039,0.277c0.247,0.139 0.424,0.293 0.532,0.462c0.107,0.17 0.161,0.378 0.161,0.624l0,6.052c1.14,-1.663 2.21,-3.018 3.211,-4.065c1.001,-1.048 1.949,-1.872 2.842,-2.472c0.893,-0.601 1.779,-1.017 2.656,-1.248c0.878,-0.231 1.764,-0.346 2.657,-0.346c0.4,0 0.855,0.023 1.363,0.069c0.508,0.046 1.04,0.131 1.594,0.254c0.554,0.123 1.055,0.262 1.502,0.416c0.446,0.154 0.762,0.308 0.947,0.462c0.185,0.154 0.308,0.3 0.369,0.439c0.062,0.139 0.116,0.316 0.162,0.531c0.046,0.216 0.077,0.532 0.092,0.948c0.016,0.415 0.024,0.977 0.024,1.686Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1104.67,280.34c0,0.893 -0.061,1.601 -0.184,2.125c-0.124,0.524 -0.308,0.909 -0.555,1.155c-0.246,0.247 -0.616,0.478 -1.109,0.693c-0.493,0.216 -1.055,0.393 -1.686,0.532c-0.632,0.138 -1.302,0.254 -2.01,0.346c-0.708,0.092 -1.417,0.139 -2.125,0.139c-2.156,0 -4.004,-0.285 -5.545,-0.855c-1.54,-0.57 -2.802,-1.432 -3.788,-2.587c-0.986,-1.155 -1.702,-2.619 -2.149,-4.39c-0.446,-1.771 -0.669,-3.858 -0.669,-6.26l0,-24.303l-5.822,0c-0.462,0 -0.832,-0.246 -1.109,-0.739c-0.277,-0.493 -0.416,-1.293 -0.416,-2.402c0,-0.586 0.039,-1.078 0.116,-1.479c0.077,-0.4 0.177,-0.731 0.3,-0.993c0.123,-0.262 0.285,-0.447 0.485,-0.555c0.2,-0.107 0.424,-0.161 0.67,-0.161l5.776,0l0,-9.888c0,-0.215 0.053,-0.415 0.161,-0.6c0.108,-0.185 0.308,-0.347 0.601,-0.485c0.292,-0.139 0.685,-0.239 1.178,-0.301c0.493,-0.061 1.109,-0.092 1.848,-0.092c0.77,0 1.402,0.031 1.894,0.092c0.493,0.062 0.878,0.162 1.155,0.301c0.278,0.138 0.478,0.3 0.601,0.485c0.123,0.185 0.185,0.385 0.185,0.6l0,9.888l10.673,0c0.246,0 0.462,0.054 0.646,0.161c0.185,0.108 0.347,0.293 0.486,0.555c0.138,0.262 0.238,0.593 0.3,0.993c0.062,0.401 0.092,0.893 0.092,1.479c0,1.109 -0.138,1.909 -0.415,2.402c-0.278,0.493 -0.647,0.739 -1.109,0.739l-10.673,0l0,23.194c0,2.865 0.423,5.028 1.27,6.491c0.848,1.464 2.364,2.195 4.551,2.195c0.709,0 1.34,-0.069 1.895,-0.208c0.554,-0.138 1.047,-0.285 1.478,-0.439c0.431,-0.154 0.801,-0.3 1.109,-0.439c0.308,-0.138 0.585,-0.208 0.832,-0.208c0.154,0 0.3,0.039 0.439,0.116c0.138,0.077 0.246,0.223 0.323,0.439c0.077,0.215 0.146,0.508 0.208,0.878c0.062,0.369 0.092,0.831 0.092,1.386Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1149.21,260.796c0,1.201 -0.301,2.056 -0.904,2.564c-0.604,0.509 -1.292,0.763 -2.066,0.763l-27.385,0c0,2.31 0.233,4.389 0.697,6.237c0.464,1.848 1.238,3.434 2.321,4.759c1.083,1.324 2.492,2.341 4.225,3.049c1.733,0.709 3.854,1.063 6.36,1.063c1.981,0 3.746,-0.162 5.293,-0.485c1.548,-0.324 2.886,-0.686 4.016,-1.086c1.13,-0.4 2.059,-0.762 2.786,-1.086c0.727,-0.323 1.277,-0.485 1.649,-0.485c0.216,0 0.409,0.054 0.58,0.162c0.17,0.108 0.301,0.269 0.394,0.485c0.093,0.216 0.163,0.516 0.209,0.901c0.047,0.385 0.07,0.855 0.07,1.409c0,0.401 -0.016,0.747 -0.046,1.04c-0.031,0.292 -0.07,0.554 -0.116,0.785c-0.046,0.231 -0.123,0.439 -0.231,0.624c-0.108,0.185 -0.246,0.362 -0.416,0.531c-0.169,0.17 -0.67,0.447 -1.501,0.832c-0.832,0.385 -1.91,0.762 -3.235,1.132c-1.324,0.369 -2.856,0.701 -4.597,0.993c-1.74,0.293 -3.596,0.439 -5.567,0.439c-3.419,0 -6.414,-0.477 -8.986,-1.432c-2.572,-0.955 -4.736,-2.372 -6.492,-4.251c-1.756,-1.879 -3.08,-4.235 -3.973,-7.069c-0.894,-2.834 -1.34,-6.129 -1.34,-9.887c0,-3.573 0.462,-6.784 1.386,-9.633c0.924,-2.849 2.256,-5.267 3.996,-7.254c1.741,-1.987 3.843,-3.511 6.307,-4.574c2.464,-1.063 5.221,-1.594 8.27,-1.594c3.265,0 6.045,0.524 8.34,1.571c2.295,1.047 4.181,2.456 5.66,4.227c1.478,1.771 2.564,3.85 3.257,6.238c0.693,2.387 1.039,4.936 1.039,7.646l0,1.386Zm-7.669,-2.264c0.092,-4.004 -0.799,-7.146 -2.673,-9.425c-1.875,-2.279 -4.656,-3.419 -8.344,-3.419c-1.891,0 -3.549,0.354 -4.974,1.063c-1.426,0.708 -2.619,1.648 -3.58,2.818c-0.961,1.17 -1.705,2.533 -2.231,4.089c-0.527,1.555 -0.821,3.18 -0.884,4.874l22.686,0Z" style="fill:#333;fill-rule:nonzero;"/><path d="M1196.42,283.389c0,0.247 -0.054,0.462 -0.161,0.647c-0.108,0.185 -0.293,0.331 -0.555,0.439c-0.262,0.108 -0.608,0.192 -1.039,0.254c-0.432,0.062 -0.955,0.092 -1.571,0.092c-0.647,0 -1.186,-0.03 -1.617,-0.092c-0.432,-0.062 -0.786,-0.146 -1.063,-0.254c-0.277,-0.108 -0.477,-0.254 -0.601,-0.439c-0.123,-0.185 -0.184,-0.4 -0.184,-0.647l0,-5.498c-2.187,2.372 -4.459,4.22 -6.815,5.544c-2.357,1.325 -4.936,1.987 -7.739,1.987c-3.05,0 -5.652,-0.593 -7.808,-1.779c-2.157,-1.186 -3.905,-2.787 -5.244,-4.805c-1.34,-2.017 -2.318,-4.389 -2.934,-7.115c-0.616,-2.726 -0.924,-5.598 -0.924,-8.617c0,-3.573 0.385,-6.799 1.155,-9.679c0.77,-2.88 1.909,-5.336 3.419,-7.369c1.509,-2.033 3.38,-3.596 5.613,-4.69c2.233,-1.093 4.813,-1.64 7.739,-1.64c2.434,0 4.659,0.531 6.676,1.594c2.018,1.063 4.012,2.626 5.984,4.689l0,-24.163c0,-0.216 0.054,-0.424 0.161,-0.624c0.108,-0.2 0.316,-0.354 0.624,-0.462c0.308,-0.108 0.701,-0.2 1.178,-0.277c0.478,-0.077 1.086,-0.116 1.825,-0.116c0.77,0 1.402,0.039 1.895,0.116c0.492,0.077 0.877,0.169 1.155,0.277c0.277,0.108 0.485,0.262 0.623,0.462c0.139,0.2 0.208,0.408 0.208,0.624l0,61.541Zm-7.669,-29.246c-2.064,-2.557 -4.058,-4.505 -5.984,-5.845c-1.925,-1.339 -3.934,-2.009 -6.029,-2.009c-1.94,0 -3.588,0.462 -4.944,1.386c-1.355,0.924 -2.456,2.14 -3.303,3.65c-0.847,1.509 -1.463,3.218 -1.848,5.128c-0.385,1.91 -0.578,3.85 -0.578,5.822c0,2.094 0.162,4.142 0.485,6.145c0.324,2.002 0.886,3.78 1.687,5.336c0.801,1.555 1.863,2.803 3.188,3.742c1.324,0.94 2.988,1.41 4.99,1.41c1.016,0 1.994,-0.139 2.934,-0.416c0.939,-0.278 1.902,-0.74 2.887,-1.386c0.986,-0.647 2.018,-1.487 3.096,-2.518c1.078,-1.032 2.217,-2.303 3.419,-3.812l0,-16.633Z" style="fill:#333;fill-rule:nonzero;"/><g><g><path d="M280.884,219.245c1.765,0 3.198,-1.433 3.198,-3.198l0,-6.395c0,-1.765 -1.433,-3.197 -3.198,-3.197l-225.605,0c-1.764,0 -3.197,1.432 -3.197,3.197l0,6.395c0,1.765 1.433,3.198 3.197,3.198l225.605,0Z" style="fill:#8c8c8c;"/><path d="M280.884,165.588c1.765,0 3.198,-1.433 3.198,-3.198l0,-6.395c0,-1.765 -1.433,-3.197 -3.198,-3.197l-225.605,0c-1.764,0 -3.197,1.432 -3.197,3.197l0,6.395c0,1.765 1.433,3.198 3.197,3.198l225.605,0Z" style="fill:#8c8c8c;"/><path d="M280.884,192.416c1.765,0 3.198,-1.432 3.198,-3.197l0,-6.395c0,-1.765 -1.433,-3.198 -3.198,-3.198l-225.605,0c-1.764,0 -3.197,1.433 -3.197,3.198l0,6.395c0,1.765 1.433,3.197 3.197,3.197l225.605,0Z" style="fill:#8c8c8c;"/><path d="M280.884,138.759c1.765,0 3.198,-1.432 3.198,-3.197l0,-6.395c0,-1.765 -1.433,-3.198 -3.198,-3.198l-225.605,0c-1.764,0 -3.197,1.433 -3.197,3.198l0,6.395c0,1.765 1.433,3.197 3.197,3.197l225.605,0Z" style="fill:#8c8c8c;"/><path d="M280.884,246.074c1.765,0 3.198,-1.433 3.198,-3.198l0,-6.395c0,-1.765 -1.433,-3.198 -3.198,-3.198l-225.605,0c-1.764,0 -3.197,1.433 -3.197,3.198l0,6.395c0,1.765 1.433,3.198 3.197,3.198l225.605,0Z" style="fill:#8c8c8c;"/><path d="M134.858,298.824c0,1.764 1.433,3.197 3.198,3.197l6.395,0c1.765,0 3.197,-1.433 3.197,-3.197l0,-225.605c0,-1.765 -1.432,-3.198 -3.197,-3.198l-6.395,0c-1.765,0 -3.198,1.433 -3.198,3.198l0,225.605Z" style="fill:#8c8c8c;"/><path d="M188.515,298.824c0,1.764 1.433,3.197 3.198,3.197l6.395,0c1.765,0 3.198,-1.433 3.198,-3.197l0,-225.605c0,-1.765 -1.433,-3.198 -3.198,-3.198l-6.395,0c-1.765,0 -3.198,1.433 -3.198,3.198l0,225.605Z" style="fill:#8c8c8c;"/><path d="M161.687,298.824c0,1.764 1.432,3.197 3.197,3.197l6.395,0c1.765,0 3.198,-1.433 3.198,-3.197l0,-225.605c0,-1.765 -1.433,-3.198 -3.198,-3.198l-6.395,0c-1.765,0 -3.197,1.433 -3.197,3.198l0,225.605Z" style="fill:#8c8c8c;"/><path d="M215.344,298.824c0,1.764 1.433,3.197 3.197,3.197l6.396,0c1.764,0 3.197,-1.433 3.197,-3.197l0,-225.605c0,-1.765 -1.433,-3.198 -3.197,-3.198l-6.396,0c-1.764,0 -3.197,1.433 -3.197,3.198l0,225.605Z" style="fill:#8c8c8c;"/><path d="M108.029,298.824c0,1.764 1.433,3.197 3.198,3.197l6.395,0c1.765,0 3.198,-1.433 3.198,-3.197l0,-225.605c0,-1.765 -1.433,-3.198 -3.198,-3.198l-6.395,0c-1.765,0 -3.198,1.433 -3.198,3.198l0,225.605Z" style="fill:#8c8c8c;"/></g><path d="M232.655,278.269c15.274,0 27.674,-12.401 27.674,-27.674l0,-129.147c0,-15.274 -12.4,-27.674 -27.674,-27.674l-129.146,0c-15.274,0 -27.675,12.4 -27.675,27.674l0,129.147c0,15.273 12.401,27.674 27.675,27.674l129.146,0Z" style="fill:#333;"/><path d="M220.739,175.532c0,6.734 -1.056,12.768 -3.167,18.104c-2.112,5.335 -5.122,9.886 -9.031,13.653c-3.909,3.766 -8.645,6.676 -14.209,8.731c-5.564,2.054 -11.855,3.167 -18.874,3.338l0,20.458c0,0.456 -0.114,0.856 -0.343,1.198c-0.228,0.342 -0.627,0.614 -1.198,0.813c-0.571,0.2 -1.327,0.357 -2.268,0.471c-0.942,0.114 -2.126,0.171 -3.553,0.171c-1.426,0 -2.61,-0.057 -3.552,-0.171c-0.942,-0.114 -1.683,-0.271 -2.226,-0.471c-0.542,-0.199 -0.941,-0.471 -1.198,-0.813c-0.257,-0.342 -0.385,-0.742 -0.385,-1.198l0,-20.458c-7.133,-0.171 -13.496,-1.199 -19.088,-3.082c-5.593,-1.883 -10.329,-4.608 -14.21,-8.174c-3.88,-3.567 -6.847,-7.947 -8.902,-13.139c-2.054,-5.193 -3.081,-11.157 -3.081,-17.89l0,-43.741c0,-0.399 0.128,-0.77 0.385,-1.113c0.257,-0.342 0.656,-0.627 1.198,-0.856c0.542,-0.228 1.284,-0.399 2.226,-0.513c0.941,-0.114 2.125,-0.171 3.552,-0.171c1.427,0 2.611,0.057 3.552,0.171c0.942,0.114 1.698,0.285 2.269,0.513c0.57,0.229 0.97,0.514 1.198,0.856c0.228,0.343 0.343,0.714 0.343,1.113l0,42.457c0,4.736 0.627,9.002 1.883,12.796c1.255,3.795 3.138,7.019 5.649,9.673c2.511,2.654 5.692,4.708 9.544,6.163c3.852,1.455 8.346,2.24 13.482,2.354l0,-73.443c0,-0.399 0.128,-0.77 0.385,-1.113c0.257,-0.342 0.685,-0.627 1.284,-0.856c0.599,-0.228 1.37,-0.399 2.311,-0.513c0.942,-0.114 2.069,-0.171 3.381,-0.171c1.427,0 2.611,0.057 3.553,0.171c0.941,0.114 1.697,0.285 2.268,0.513c0.571,0.229 0.97,0.514 1.198,0.856c0.229,0.343 0.343,0.714 0.343,1.113l0,73.443c5.136,-0.057 9.615,-0.842 13.439,-2.354c3.823,-1.512 7.004,-3.595 9.544,-6.249c2.539,-2.653 4.451,-5.849 5.735,-9.587c1.284,-3.737 1.926,-7.889 1.926,-12.454l0,-42.799c0,-0.399 0.114,-0.77 0.342,-1.113c0.228,-0.342 0.628,-0.627 1.198,-0.856c0.571,-0.228 1.313,-0.399 2.226,-0.513c0.913,-0.114 2.111,-0.171 3.595,-0.171c1.37,0 2.525,0.057 3.467,0.171c0.941,0.114 1.683,0.285 2.225,0.513c0.542,0.229 0.942,0.514 1.199,0.856c0.256,0.343 0.385,0.714 0.385,1.113l0,42.2Z" style="fill:#fff;fill-rule:nonzero;"/><path d="M220.739,175.532c0,6.734 -1.056,12.768 -3.167,18.104c-2.112,5.335 -5.122,9.886 -9.031,13.653c-3.909,3.766 -8.645,6.676 -14.209,8.731c-5.564,2.054 -11.855,3.167 -18.874,3.338l0,20.458c0,0.456 -0.114,0.856 -0.343,1.198c-0.228,0.342 -0.627,0.614 -1.198,0.813c-0.571,0.2 -1.327,0.357 -2.268,0.471c-0.942,0.114 -2.126,0.171 -3.553,0.171c-1.426,0 -2.61,-0.057 -3.552,-0.171c-0.942,-0.114 -1.683,-0.271 -2.226,-0.471c-0.542,-0.199 -0.941,-0.471 -1.198,-0.813c-0.257,-0.342 -0.385,-0.742 -0.385,-1.198l0,-20.458c-7.133,-0.171 -13.496,-1.199 -19.088,-3.082c-5.593,-1.883 -10.329,-4.608 -14.21,-8.174c-3.88,-3.567 -6.847,-7.947 -8.902,-13.139c-2.054,-5.193 -3.081,-11.157 -3.081,-17.89l0,-43.741c0,-0.399 0.128,-0.77 0.385,-1.113c0.257,-0.342 0.656,-0.627 1.198,-0.856c0.542,-0.228 1.284,-0.399 2.226,-0.513c0.941,-0.114 2.125,-0.171 3.552,-0.171c1.427,0 2.611,0.057 3.552,0.171c0.942,0.114 1.698,0.285 2.269,0.513c0.57,0.229 0.97,0.514 1.198,0.856c0.228,0.343 0.343,0.714 0.343,1.113l0,42.457c0,4.736 0.627,9.002 1.883,12.796c1.255,3.795 3.138,7.019 5.649,9.673c2.511,2.654 5.692,4.708 9.544,6.163c3.852,1.455 8.346,2.24 13.482,2.354l0,-73.443c0,-0.399 0.128,-0.77 0.385,-1.113c0.257,-0.342 0.685,-0.627 1.284,-0.856c0.599,-0.228 1.37,-0.399 2.311,-0.513c0.942,-0.114 2.069,-0.171 3.381,-0.171c1.427,0 2.611,0.057 3.553,0.171c0.941,0.114 1.697,0.285 2.268,0.513c0.571,0.229 0.97,0.514 1.198,0.856c0.229,0.343 0.343,0.714 0.343,1.113l0,73.443c5.136,-0.057 9.615,-0.842 13.439,-2.354c3.823,-1.512 7.004,-3.595 9.544,-6.249c2.539,-2.653 4.451,-5.849 5.735,-9.587c1.284,-3.737 1.926,-7.889 1.926,-12.454l0,-42.799c0,-0.399 0.114,-0.77 0.342,-1.113c0.228,-0.342 0.628,-0.627 1.198,-0.856c0.571,-0.228 1.313,-0.399 2.226,-0.513c0.913,-0.114 2.111,-0.171 3.595,-0.171c1.37,0 2.525,0.057 3.467,0.171c0.941,0.114 1.683,0.285 2.225,0.513c0.542,0.229 0.942,0.514 1.199,0.856c0.256,0.343 0.385,0.714 0.385,1.113l0,42.2Z" style="fill:#fff;fill-rule:nonzero;"/></g></g></svg>
diff --git a/docs/unit_testing.md b/docs/unit_testing.md
index 3e4c914bf1..aec4ec8334 100644
--- a/docs/unit_testing.md
+++ b/docs/unit_testing.md
@@ -58,6 +58,34 @@ It's not yet possible to do a full integration test, where you would compile the
In that model you would emulate the input, and expect a certain output from the emulated keyboard.
+# Keycode String {#keycode-string}
+
+It's much nicer to read keycodes as names like "`LT(2,KC_D)`" than numerical codes like "`0x4207`." To convert keycodes to human-readable strings, add `KEYCODE_STRING_ENABLE = yes` to the `rules.mk` file, then use the `get_keycode_string(kc)` function to convert a given 16-bit keycode to a string.
+
+```c
+const char *key_name = get_keycode_string(keycode);
+dprintf("kc: %s\n", key_name);
+```
+
+The stringified keycode may then be logged to console output with `dprintf()` or elsewhere.
+
+::: warning
+Use the result of `get_keycode_string()` immediately. Subsequent invocations reuse the same static buffer and overwrite the previous contents.
+:::
+
+Many common QMK keycodes are recognized by `get_keycode_string()`, but not all. These include some common basic keycodes, layer switch keycodes, mod-taps, one-shot keycodes, tap dance keycodes, and Unicode keycodes. As a fallback, an unrecognized keycode is written as a hex number.
+
+Optionally, `KEYCODE_STRING_NAMES_USER` may be defined to add names for additional keycodes. For example, supposing keymap.c defines `MYMACRO1` and `MYMACRO2` as custom keycodes, the following adds their names:
+
+```c
+KEYCODE_STRING_NAMES_USER(
+ KEYCODE_STRING_NAME(MYMACRO1),
+ KEYCODE_STRING_NAME(MYMACRO2),
+);
+```
+
+Similarly, `KEYCODE_STRING_NAMES_KB` may be defined to add names at the keyboard level.
+
# Tracing Variables {#tracing-variables}
Sometimes you might wonder why a variable gets changed and where, and this can be quite tricky to track down without having a debugger. It's of course possible to manually add print statements to track it, but you can also enable the variable trace feature. This works for both variables that are changed by the code, and when the variable is changed by some memory corruption.
diff --git a/drivers/battery/battery.c b/drivers/battery/battery.c
new file mode 100644
index 0000000000..65497399e8
--- /dev/null
+++ b/drivers/battery/battery.c
@@ -0,0 +1,31 @@
+// Copyright 2025 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "battery_driver.h"
+#include "battery.h"
+#include "timer.h"
+
+#ifndef BATTERY_SAMPLE_INTERVAL
+# define BATTERY_SAMPLE_INTERVAL 30000
+#endif
+
+static uint8_t last_bat_level = 100;
+
+void battery_init(void) {
+ battery_driver_init();
+
+ last_bat_level = battery_driver_sample_percent();
+}
+
+void battery_task(void) {
+ static uint32_t bat_timer = 0;
+ if (timer_elapsed32(bat_timer) > BATTERY_SAMPLE_INTERVAL) {
+ last_bat_level = battery_driver_sample_percent();
+
+ bat_timer = timer_read32();
+ }
+}
+
+uint8_t battery_get_percent(void) {
+ return last_bat_level;
+}
diff --git a/drivers/battery/battery.h b/drivers/battery/battery.h
new file mode 100644
index 0000000000..831b1f07e5
--- /dev/null
+++ b/drivers/battery/battery.h
@@ -0,0 +1,34 @@
+// Copyright 2025 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <stdint.h>
+
+/**
+ * \file
+ *
+ * \defgroup battery Battery API
+ *
+ * \brief API to query battery status.
+ * \{
+ */
+
+/**
+ * \brief Initialize the battery driver.
+ */
+void battery_init(void);
+
+/**
+ * \brief Perform housekeeping tasks.
+ */
+void battery_task(void);
+
+/**
+ * \brief Sample battery level.
+ *
+ * \return The battery percentage, in the range 0-100.
+ */
+uint8_t battery_get_percent(void);
+
+/** \} */
diff --git a/drivers/battery/battery_adc.c b/drivers/battery/battery_adc.c
new file mode 100644
index 0000000000..cf0e69cb48
--- /dev/null
+++ b/drivers/battery/battery_adc.c
@@ -0,0 +1,55 @@
+// Copyright 2025 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "analog.h"
+#include "gpio.h"
+
+#ifndef BATTERY_PIN
+# error("BATTERY_PIN not configured!")
+#endif
+
+#ifndef BATTERY_REF_VOLTAGE_MV
+# define BATTERY_REF_VOLTAGE_MV 3300
+#endif
+
+#ifndef BATTERY_VOLTAGE_DIVIDER_R1
+# define BATTERY_VOLTAGE_DIVIDER_R1 100
+#endif
+
+#ifndef BATTERY_VOLTAGE_DIVIDER_R2
+# define BATTERY_VOLTAGE_DIVIDER_R2 100
+#endif
+
+// TODO: infer from adc config?
+#ifndef BATTERY_ADC_RESOLUTION
+# define BATTERY_ADC_RESOLUTION 10
+#endif
+
+void battery_driver_init(void) {
+ gpio_set_pin_input(BATTERY_PIN);
+}
+
+uint16_t battery_driver_get_mv(void) {
+ uint32_t raw = analogReadPin(BATTERY_PIN);
+
+ uint32_t bat_mv = raw * BATTERY_REF_VOLTAGE_MV / (1 << BATTERY_ADC_RESOLUTION);
+
+#if BATTERY_VOLTAGE_DIVIDER_R1 > 0 && BATTERY_VOLTAGE_DIVIDER_R2 > 0
+ bat_mv = bat_mv * (BATTERY_VOLTAGE_DIVIDER_R1 + BATTERY_VOLTAGE_DIVIDER_R2) / BATTERY_VOLTAGE_DIVIDER_R2;
+#endif
+
+ return bat_mv;
+}
+
+uint8_t battery_driver_sample_percent(void) {
+ uint16_t bat_mv = battery_driver_get_mv();
+
+ // https://github.com/zmkfirmware/zmk/blob/3f7c9d7cc4f46617faad288421025ea2a6b0bd28/app/module/drivers/sensor/battery/battery_common.c#L33
+ if (bat_mv >= 4200) {
+ return 100;
+ } else if (bat_mv <= 3450) {
+ return 0;
+ }
+
+ return bat_mv * 2 / 15 - 459;
+}
diff --git a/drivers/battery/battery_driver.h b/drivers/battery/battery_driver.h
new file mode 100644
index 0000000000..c2ee75e966
--- /dev/null
+++ b/drivers/battery/battery_driver.h
@@ -0,0 +1,29 @@
+// Copyright 2025 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include <stdint.h>
+
+/**
+ * \file
+ *
+ * \defgroup battery Battery Driver API
+ *
+ * \brief API to query battery status.
+ * \{
+ */
+
+/**
+ * \brief Initialize the battery driver. This function must be called only once, before any of the below functions can be called.
+ */
+void battery_driver_init(void);
+
+/**
+ * \brief Sample battery level.
+ *
+ * \return The battery percentage, in the range 0-100.
+ */
+uint8_t battery_driver_sample_percent(void);
+
+/** \} */
diff --git a/drivers/eeprom/eeprom_transient.h b/drivers/eeprom/eeprom_transient.h
index 687b8619fe..0483fd58b9 100644
--- a/drivers/eeprom/eeprom_transient.h
+++ b/drivers/eeprom/eeprom_transient.h
@@ -20,6 +20,6 @@
The size of the transient EEPROM buffer size.
*/
#ifndef TRANSIENT_EEPROM_SIZE
-# include "eeconfig.h"
+# include "nvm_eeprom_eeconfig_internal.h"
# define TRANSIENT_EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO
#endif
diff --git a/drivers/painter/gc9xxx/qp_gc9a01_opcodes.h b/drivers/painter/gc9xxx/qp_gc9a01_opcodes.h
index 5853902e68..31de5ee9e3 100644
--- a/drivers/painter/gc9xxx/qp_gc9a01_opcodes.h
+++ b/drivers/painter/gc9xxx/qp_gc9a01_opcodes.h
@@ -101,4 +101,4 @@
#define GC9A01_GRAM_INTERFACE_RGB 0b00000010
#define GC9A01_RGB_INTERFACE_MODE_1_TRANSFER 0b00000000
-#define GC9A01_RGB_INTERFACE_MODE_3_TRANSFER 0b00000001 \ No newline at end of file
+#define GC9A01_RGB_INTERFACE_MODE_3_TRANSFER 0b00000001
diff --git a/drivers/painter/ili9xxx/qp_ili9486.c b/drivers/painter/ili9xxx/qp_ili9486.c
index c4f3c15cec..48db779c04 100644
--- a/drivers/painter/ili9xxx/qp_ili9486.c
+++ b/drivers/painter/ili9xxx/qp_ili9486.c
@@ -75,9 +75,9 @@ static void qp_comms_spi_dc_reset_send_command_odd_cs_pulse(painter_device_t dev
painter_driver_t * driver = (painter_driver_t *)device;
qp_comms_spi_dc_reset_config_t *comms_config = (qp_comms_spi_dc_reset_config_t *)driver->comms_config;
- writePinLow(comms_config->spi_config.chip_select_pin);
+ gpio_write_pin_low(comms_config->spi_config.chip_select_pin);
qp_comms_spi_dc_reset_send_command(device, cmd);
- writePinHigh(comms_config->spi_config.chip_select_pin);
+ gpio_write_pin_high(comms_config->spi_config.chip_select_pin);
}
static uint32_t qp_comms_spi_send_data_odd_cs_pulse(painter_device_t device, const void *data, uint32_t byte_count) {
@@ -88,20 +88,20 @@ static uint32_t qp_comms_spi_send_data_odd_cs_pulse(painter_device_t device, con
const uint8_t *p = (const uint8_t *)data;
uint32_t max_msg_length = 1024;
- writePinHigh(comms_config->dc_pin);
+ gpio_write_pin_high(comms_config->dc_pin);
while (bytes_remaining > 0) {
uint32_t bytes_this_loop = QP_MIN(bytes_remaining, max_msg_length);
bool odd_bytes = bytes_this_loop & 1;
// send data
- writePinLow(comms_config->spi_config.chip_select_pin);
+ gpio_write_pin_low(comms_config->spi_config.chip_select_pin);
spi_transmit(p, bytes_this_loop);
p += bytes_this_loop;
// extra CS toggle, for alignment
if (odd_bytes) {
- writePinHigh(comms_config->spi_config.chip_select_pin);
- writePinLow(comms_config->spi_config.chip_select_pin);
+ gpio_write_pin_high(comms_config->spi_config.chip_select_pin);
+ gpio_write_pin_low(comms_config->spi_config.chip_select_pin);
}
bytes_remaining -= bytes_this_loop;
@@ -116,9 +116,9 @@ static uint32_t qp_ili9486_send_data_toggling(painter_device_t device, const uin
uint32_t ret;
for (uint8_t j = 0; j < byte_count; ++j) {
- writePinLow(comms_config->spi_config.chip_select_pin);
+ gpio_write_pin_low(comms_config->spi_config.chip_select_pin);
ret = qp_comms_spi_dc_reset_send_data(device, &data[j], 1);
- writePinHigh(comms_config->spi_config.chip_select_pin);
+ gpio_write_pin_high(comms_config->spi_config.chip_select_pin);
}
return ret;
diff --git a/drivers/painter/ld7032/qp_ld7032.h b/drivers/painter/ld7032/qp_ld7032.h
index 967eb7999c..9af80dd468 100644
--- a/drivers/painter/ld7032/qp_ld7032.h
+++ b/drivers/painter/ld7032/qp_ld7032.h
@@ -63,4 +63,4 @@ painter_device_t qp_ld7032_make_spi_device(uint16_t panel_width, uint16_t panel_
*/
painter_device_t qp_ld7032_make_i2c_device(uint16_t panel_width, uint16_t panel_height, uint8_t i2c_address);
-#endif // QUANTUM_PAINTER_LD7032_I2C_ENABLE \ No newline at end of file
+#endif // QUANTUM_PAINTER_LD7032_I2C_ENABLE
diff --git a/drivers/painter/ld7032/qp_ld7032_opcodes.h b/drivers/painter/ld7032/qp_ld7032_opcodes.h
index 08ab77d6f8..ed8b397c67 100644
--- a/drivers/painter/ld7032/qp_ld7032_opcodes.h
+++ b/drivers/painter/ld7032/qp_ld7032_opcodes.h
@@ -42,4 +42,4 @@ typedef enum {
LD7032_S_START_STOP = 0xCD,
LD7032_S_SELECT = 0xCE,
LD7032_TESTCNT1 = 0xF0, //-0xFF
-} ld7032_opcodes; \ No newline at end of file
+} ld7032_opcodes;
diff --git a/drivers/usbpd.h b/drivers/usbpd.h
index df4f29bb9d..e9dca67f66 100644
--- a/drivers/usbpd.h
+++ b/drivers/usbpd.h
@@ -26,4 +26,4 @@ typedef enum {
void usbpd_init(void);
// Gets the current state of the USBPD allowance
-usbpd_allowance_t usbpd_get_allowance(void); \ No newline at end of file
+usbpd_allowance_t usbpd_get_allowance(void);
diff --git a/keyboards/nix_studio/lilith/config.h b/keyboards/akb/vero/board.h
index 225e6ac51b..2a370fe2e0 100644
--- a/keyboards/nix_studio/lilith/config.h
+++ b/keyboards/akb/vero/board.h
@@ -1,7 +1,8 @@
// Copyright 2022 Martin Arnstad (@arnstadm)
// SPDX-License-Identifier: GPL-2.0-or-later
-
#pragma once
-/* Set HSE clock since it differs from F411 default */
-#define STM32_HSECLK 16000000
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/akb/vero/config.h b/keyboards/akb/vero/config.h
deleted file mode 100644
index bb6d15d92c..0000000000
--- a/keyboards/akb/vero/config.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2022 Martin Arnstad (@arnstadm)
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-/*
- * Feature disable options
- * These options are also useful to firmware size reduction.
- */
-
-/* disable debug print */
-//#define NO_DEBUG
-
-/* disable print */
-//#define NO_PRINT
-
-/* disable action features */
-//#define NO_ACTION_LAYER
-//#define NO_ACTION_TAPPING
-//#define NO_ACTION_ONESHOT
-
-/* Set HSE clock since it differs from F411 default */
-#define STM32_HSECLK 16000000
diff --git a/keyboards/akko/5087/5087.c b/keyboards/akko/5087/5087.c
index 996f8c2585..27439c20ef 100644
--- a/keyboards/akko/5087/5087.c
+++ b/keyboards/akko/5087/5087.c
@@ -164,7 +164,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
if (record->event.pressed) {
set_single_persistent_default_layer(MAC_B);
keymap_config.no_gui = 0;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
return false;
case QK_RGB_MATRIX_TOGGLE:
diff --git a/keyboards/bastardkb/charybdis/3x5/v1/elitec/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v1/elitec/keyboard.json
index 4a94d023d4..2fd99fb5ab 100644
--- a/keyboards/bastardkb/charybdis/3x5/v1/elitec/keyboard.json
+++ b/keyboards/bastardkb/charybdis/3x5/v1/elitec/keyboard.json
@@ -26,7 +26,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "D2",
+ "serial": {
+ "pin": "D2"
+ },
"matrix_pins": {
"right": {
"cols": ["C7", "B7", "D7", "E6", "B4"],
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/elitec/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v2/elitec/keyboard.json
index bc95061ced..51f6cedf51 100644
--- a/keyboards/bastardkb/charybdis/3x5/v2/elitec/keyboard.json
+++ b/keyboards/bastardkb/charybdis/3x5/v2/elitec/keyboard.json
@@ -26,7 +26,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "D2"
+ "serial": {
+ "pin": "D2"
+ }
},
"processor": "atmega32u4",
"bootloader": "atmel-dfu"
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/keyboard.json
index cc990d3f21..cf800062b3 100644
--- a/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/keyboard.json
+++ b/keyboards/bastardkb/charybdis/3x5/v2/splinky_2/keyboard.json
@@ -20,7 +20,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1"
+ "serial": {
+ "pin": "GP1"
+ }
},
"ws2812": {
"pin": "GP0",
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/keyboard.json
index 6719b21196..d9039f7591 100644
--- a/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/keyboard.json
+++ b/keyboards/bastardkb/charybdis/3x5/v2/splinky_3/keyboard.json
@@ -20,7 +20,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1"
+ "serial": {
+ "pin": "GP1"
+ }
},
"ws2812": {
"pin": "GP0",
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/keyboard.json b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/keyboard.json
index 2de77b07f0..ca48cc0f3c 100644
--- a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/keyboard.json
+++ b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/keyboard.json
@@ -30,7 +30,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "A3"
+ "serial": {
+ "pin": "A3"
+ }
},
"development_board": "stemcell"
}
diff --git a/keyboards/bastardkb/charybdis/3x6/v1/elitec/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v1/elitec/keyboard.json
index dcc454366c..cef4eab72f 100644
--- a/keyboards/bastardkb/charybdis/3x6/v1/elitec/keyboard.json
+++ b/keyboards/bastardkb/charybdis/3x6/v1/elitec/keyboard.json
@@ -26,7 +26,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "D2",
+ "serial": {
+ "pin": "D2"
+ },
"matrix_pins": {
"right": {
"cols": ["F1", "C7", "B7", "D7", "E6", "B4"],
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/elitec/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v2/elitec/keyboard.json
index ce74b2dc6d..fdfd2c38f9 100644
--- a/keyboards/bastardkb/charybdis/3x6/v2/elitec/keyboard.json
+++ b/keyboards/bastardkb/charybdis/3x6/v2/elitec/keyboard.json
@@ -26,7 +26,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "D2"
+ "serial": {
+ "pin": "D2"
+ }
},
"processor": "atmega32u4",
"bootloader": "atmel-dfu"
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/keyboard.json
index 825508475c..650bf46481 100644
--- a/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/keyboard.json
+++ b/keyboards/bastardkb/charybdis/3x6/v2/splinky_2/keyboard.json
@@ -20,7 +20,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1"
+ "serial": {
+ "pin": "GP1"
+ }
},
"ws2812": {
"pin": "GP0",
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/keyboard.json
index 4d9cfb616d..b2a4890f56 100644
--- a/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/keyboard.json
+++ b/keyboards/bastardkb/charybdis/3x6/v2/splinky_3/keyboard.json
@@ -20,7 +20,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1"
+ "serial": {
+ "pin": "GP1"
+ }
},
"ws2812": {
"pin": "GP0",
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/keyboard.json b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/keyboard.json
index 05d82b2445..a405395438 100644
--- a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/keyboard.json
+++ b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/keyboard.json
@@ -30,7 +30,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "A3"
+ "serial": {
+ "pin": "A3"
+ }
},
"development_board": "stemcell"
}
diff --git a/keyboards/bastardkb/charybdis/4x6/v1/elitec/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v1/elitec/keyboard.json
index b90b144c8b..6b0caff82e 100644
--- a/keyboards/bastardkb/charybdis/4x6/v1/elitec/keyboard.json
+++ b/keyboards/bastardkb/charybdis/4x6/v1/elitec/keyboard.json
@@ -26,7 +26,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "D2",
+ "serial": {
+ "pin": "D2"
+ },
"matrix_pins": {
"right": {
"cols": ["F1", "C7", "B7", "D7", "E6", "B4"],
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/elitec/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v2/elitec/keyboard.json
index 8ae66d083b..4163f9d476 100644
--- a/keyboards/bastardkb/charybdis/4x6/v2/elitec/keyboard.json
+++ b/keyboards/bastardkb/charybdis/4x6/v2/elitec/keyboard.json
@@ -26,7 +26,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "D2"
+ "serial": {
+ "pin": "D2"
+ }
},
"processor": "atmega32u4",
"bootloader": "atmel-dfu"
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/keyboard.json
index b0c98389f7..0da7d0b442 100644
--- a/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/keyboard.json
+++ b/keyboards/bastardkb/charybdis/4x6/v2/splinky_2/keyboard.json
@@ -20,7 +20,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1"
+ "serial": {
+ "pin": "GP1"
+ }
},
"ws2812": {
"pin": "GP0",
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/keyboard.json
index 1e072db85b..026684eb92 100644
--- a/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/keyboard.json
+++ b/keyboards/bastardkb/charybdis/4x6/v2/splinky_3/keyboard.json
@@ -20,7 +20,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1"
+ "serial": {
+ "pin": "GP1"
+ }
},
"ws2812": {
"pin": "GP0",
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/keyboard.json b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/keyboard.json
index ab145e0f95..ed929f7fb7 100644
--- a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/keyboard.json
+++ b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/keyboard.json
@@ -30,7 +30,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "A3"
+ "serial": {
+ "pin": "A3"
+ }
},
"development_board": "stemcell"
}
diff --git a/keyboards/bastardkb/dilemma/3x5_2/assembled/keyboard.json b/keyboards/bastardkb/dilemma/3x5_2/assembled/keyboard.json
index ac52a86eb5..366deac293 100644
--- a/keyboards/bastardkb/dilemma/3x5_2/assembled/keyboard.json
+++ b/keyboards/bastardkb/dilemma/3x5_2/assembled/keyboard.json
@@ -13,7 +13,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1"
+ "serial": {
+ "pin": "GP1"
+ }
},
"processor": "RP2040",
"bootloader": "rp2040"
diff --git a/keyboards/bastardkb/dilemma/3x5_2/splinky/keyboard.json b/keyboards/bastardkb/dilemma/3x5_2/splinky/keyboard.json
index 3c4c559cb6..e954f4f657 100644
--- a/keyboards/bastardkb/dilemma/3x5_2/splinky/keyboard.json
+++ b/keyboards/bastardkb/dilemma/3x5_2/splinky/keyboard.json
@@ -13,7 +13,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1"
+ "serial": {
+ "pin": "GP1"
+ }
},
"processor": "RP2040",
"bootloader": "rp2040"
diff --git a/keyboards/bastardkb/dilemma/3x5_3/keyboard.json b/keyboards/bastardkb/dilemma/3x5_3/keyboard.json
index 12e336f023..3ae31d0b46 100644
--- a/keyboards/bastardkb/dilemma/3x5_3/keyboard.json
+++ b/keyboards/bastardkb/dilemma/3x5_3/keyboard.json
@@ -14,7 +14,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1",
+ "serial": {
+ "pin": "GP1"
+ },
"bootmagic": {
"matrix": [4, 0]
},
diff --git a/keyboards/bastardkb/dilemma/4x6_4/keyboard.json b/keyboards/bastardkb/dilemma/4x6_4/keyboard.json
index 7e40208a5d..4f0ea648c8 100644
--- a/keyboards/bastardkb/dilemma/4x6_4/keyboard.json
+++ b/keyboards/bastardkb/dilemma/4x6_4/keyboard.json
@@ -14,7 +14,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1",
+ "serial": {
+ "pin": "GP1"
+ },
"bootmagic": {
"matrix": [5, 0]
},
diff --git a/keyboards/bastardkb/scylla/v1/elitec/keyboard.json b/keyboards/bastardkb/scylla/v1/elitec/keyboard.json
index 17b6b7fc36..25963f006c 100644
--- a/keyboards/bastardkb/scylla/v1/elitec/keyboard.json
+++ b/keyboards/bastardkb/scylla/v1/elitec/keyboard.json
@@ -22,7 +22,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"processor": "atmega32u4",
"bootloader": "atmel-dfu"
diff --git a/keyboards/bastardkb/scylla/v2/elitec/keyboard.json b/keyboards/bastardkb/scylla/v2/elitec/keyboard.json
index 7bfb7ff5a4..316606b17b 100644
--- a/keyboards/bastardkb/scylla/v2/elitec/keyboard.json
+++ b/keyboards/bastardkb/scylla/v2/elitec/keyboard.json
@@ -22,7 +22,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "D2"
+ "serial": {
+ "pin": "D2"
+ }
},
"processor": "atmega32u4",
"bootloader": "atmel-dfu"
diff --git a/keyboards/bastardkb/scylla/v2/splinky_2/keyboard.json b/keyboards/bastardkb/scylla/v2/splinky_2/keyboard.json
index 2b9022d24e..2c0beb5c1d 100644
--- a/keyboards/bastardkb/scylla/v2/splinky_2/keyboard.json
+++ b/keyboards/bastardkb/scylla/v2/splinky_2/keyboard.json
@@ -19,7 +19,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1"
+ "serial": {
+ "pin": "GP1"
+ }
},
"ws2812": {
"pin": "GP0",
diff --git a/keyboards/bastardkb/scylla/v2/splinky_3/keyboard.json b/keyboards/bastardkb/scylla/v2/splinky_3/keyboard.json
index cd4da3ac41..ed92be5a45 100644
--- a/keyboards/bastardkb/scylla/v2/splinky_3/keyboard.json
+++ b/keyboards/bastardkb/scylla/v2/splinky_3/keyboard.json
@@ -19,7 +19,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1"
+ "serial": {
+ "pin": "GP1"
+ }
},
"ws2812": {
"pin": "GP0",
diff --git a/keyboards/bastardkb/scylla/v2/stemcell/keyboard.json b/keyboards/bastardkb/scylla/v2/stemcell/keyboard.json
index 06bfeda7d2..80325bfea3 100644
--- a/keyboards/bastardkb/scylla/v2/stemcell/keyboard.json
+++ b/keyboards/bastardkb/scylla/v2/stemcell/keyboard.json
@@ -26,7 +26,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "A3"
+ "serial": {
+ "pin": "A3"
+ }
},
"development_board": "stemcell"
}
diff --git a/keyboards/bastardkb/skeletyl/v1/elitec/keyboard.json b/keyboards/bastardkb/skeletyl/v1/elitec/keyboard.json
index 2910d80b2f..3bbba6d310 100644
--- a/keyboards/bastardkb/skeletyl/v1/elitec/keyboard.json
+++ b/keyboards/bastardkb/skeletyl/v1/elitec/keyboard.json
@@ -22,7 +22,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"processor": "atmega32u4",
"bootloader": "atmel-dfu"
diff --git a/keyboards/bastardkb/skeletyl/v2/elitec/keyboard.json b/keyboards/bastardkb/skeletyl/v2/elitec/keyboard.json
index dec2537b65..43675db36d 100644
--- a/keyboards/bastardkb/skeletyl/v2/elitec/keyboard.json
+++ b/keyboards/bastardkb/skeletyl/v2/elitec/keyboard.json
@@ -22,7 +22,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "D2"
+ "serial": {
+ "pin": "D2"
+ }
},
"processor": "atmega32u4",
"bootloader": "atmel-dfu"
diff --git a/keyboards/bastardkb/skeletyl/v2/splinky_2/keyboard.json b/keyboards/bastardkb/skeletyl/v2/splinky_2/keyboard.json
index 897f195a31..32030dbd00 100644
--- a/keyboards/bastardkb/skeletyl/v2/splinky_2/keyboard.json
+++ b/keyboards/bastardkb/skeletyl/v2/splinky_2/keyboard.json
@@ -19,7 +19,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1"
+ "serial": {
+ "pin": "GP1"
+ }
},
"ws2812": {
"pin": "GP0",
diff --git a/keyboards/bastardkb/skeletyl/v2/splinky_3/keyboard.json b/keyboards/bastardkb/skeletyl/v2/splinky_3/keyboard.json
index 06a93dfbeb..51227f5065 100644
--- a/keyboards/bastardkb/skeletyl/v2/splinky_3/keyboard.json
+++ b/keyboards/bastardkb/skeletyl/v2/splinky_3/keyboard.json
@@ -19,7 +19,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1"
+ "serial": {
+ "pin": "GP1"
+ }
},
"ws2812": {
"pin": "GP0",
diff --git a/keyboards/bastardkb/skeletyl/v2/stemcell/keyboard.json b/keyboards/bastardkb/skeletyl/v2/stemcell/keyboard.json
index 6dd86bcc12..2e9745b7f2 100644
--- a/keyboards/bastardkb/skeletyl/v2/stemcell/keyboard.json
+++ b/keyboards/bastardkb/skeletyl/v2/stemcell/keyboard.json
@@ -26,7 +26,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "A3"
+ "serial": {
+ "pin": "A3"
+ }
},
"development_board": "stemcell"
}
diff --git a/keyboards/bastardkb/tbkmini/v1/elitec/keyboard.json b/keyboards/bastardkb/tbkmini/v1/elitec/keyboard.json
index 59988074ba..5110ea0d74 100644
--- a/keyboards/bastardkb/tbkmini/v1/elitec/keyboard.json
+++ b/keyboards/bastardkb/tbkmini/v1/elitec/keyboard.json
@@ -22,7 +22,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"processor": "atmega32u4",
"bootloader": "atmel-dfu"
diff --git a/keyboards/bastardkb/tbkmini/v2/elitec/keyboard.json b/keyboards/bastardkb/tbkmini/v2/elitec/keyboard.json
index 01679bcff9..701ec6af28 100644
--- a/keyboards/bastardkb/tbkmini/v2/elitec/keyboard.json
+++ b/keyboards/bastardkb/tbkmini/v2/elitec/keyboard.json
@@ -22,7 +22,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "D2"
+ "serial": {
+ "pin": "D2"
+ }
},
"processor": "atmega32u4",
"bootloader": "atmel-dfu"
diff --git a/keyboards/bastardkb/tbkmini/v2/splinky_2/keyboard.json b/keyboards/bastardkb/tbkmini/v2/splinky_2/keyboard.json
index 2048db6251..15db3db6e8 100644
--- a/keyboards/bastardkb/tbkmini/v2/splinky_2/keyboard.json
+++ b/keyboards/bastardkb/tbkmini/v2/splinky_2/keyboard.json
@@ -19,7 +19,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1"
+ "serial": {
+ "pin": "GP1"
+ }
},
"ws2812": {
"pin": "GP0",
diff --git a/keyboards/bastardkb/tbkmini/v2/splinky_3/keyboard.json b/keyboards/bastardkb/tbkmini/v2/splinky_3/keyboard.json
index 8dd21b7591..3936b9368a 100644
--- a/keyboards/bastardkb/tbkmini/v2/splinky_3/keyboard.json
+++ b/keyboards/bastardkb/tbkmini/v2/splinky_3/keyboard.json
@@ -19,7 +19,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "GP1"
+ "serial": {
+ "pin": "GP1"
+ }
},
"ws2812": {
"pin": "GP0",
diff --git a/keyboards/bastardkb/tbkmini/v2/stemcell/keyboard.json b/keyboards/bastardkb/tbkmini/v2/stemcell/keyboard.json
index 41abba96cb..2cbee7fe17 100644
--- a/keyboards/bastardkb/tbkmini/v2/stemcell/keyboard.json
+++ b/keyboards/bastardkb/tbkmini/v2/stemcell/keyboard.json
@@ -26,7 +26,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "A3"
+ "serial": {
+ "pin": "A3"
+ }
},
"development_board": "stemcell"
}
diff --git a/keyboards/cannonkeys/lib/satisfaction75/satisfaction_core.c b/keyboards/cannonkeys/lib/satisfaction75/satisfaction_core.c
index 6f76582e4b..a410480d7d 100644
--- a/keyboards/cannonkeys/lib/satisfaction75/satisfaction_core.c
+++ b/keyboards/cannonkeys/lib/satisfaction75/satisfaction_core.c
@@ -53,10 +53,26 @@ void board_init(void) {
SYSCFG->CFGR1 &= ~(SYSCFG_CFGR1_SPI2_DMA_RMP);
}
+uint32_t read_custom_config(void *data, uint32_t offset, uint32_t length) {
+#ifdef VIA_ENABLE
+ return via_read_custom_config(data, offset, length);
+#else
+ return eeconfig_read_kb_datablock(data, offset, length);
+#endif
+}
+
+uint32_t write_custom_config(const void *data, uint32_t offset, uint32_t length) {
+#ifdef VIA_ENABLE
+ return via_update_custom_config(data, offset, length);
+#else
+ return eeconfig_update_kb_datablock(data, offset, length);
+#endif
+}
+
void keyboard_post_init_kb(void) {
/*
This is a workaround to some really weird behavior
- Without this code, the OLED will turn on, but not when you initially plug the keyboard in.
+ Without this code, the OLED will turn on, but not when you initially plug the keyboard in.
You have to manually trigger a user reset to get the OLED to initialize properly
I'm not sure what the root cause is at this time, but this workaround fixes it.
*/
@@ -74,11 +90,11 @@ void keyboard_post_init_kb(void) {
void custom_set_value(uint8_t *data) {
uint8_t *value_id = &(data[0]);
uint8_t *value_data = &(data[1]);
-
+
switch ( *value_id ) {
case id_oled_default_mode:
{
- eeprom_update_byte((uint8_t*)EEPROM_DEFAULT_OLED, value_data[0]);
+ write_custom_config(&value_data[0], EEPROM_DEFAULT_OLED_OFFSET, 1);
break;
}
case id_oled_mode:
@@ -92,7 +108,7 @@ void custom_set_value(uint8_t *data) {
uint8_t index = value_data[0];
uint8_t enable = value_data[1];
enabled_encoder_modes = (enabled_encoder_modes & ~(1<<index)) | (enable<<index);
- eeprom_update_byte((uint8_t*)EEPROM_ENABLED_ENCODER_MODES, enabled_encoder_modes);
+ write_custom_config(&enabled_encoder_modes, EEPROM_ENABLED_ENCODER_MODES_OFFSET, 1);
break;
}
case id_encoder_custom:
@@ -109,11 +125,12 @@ void custom_set_value(uint8_t *data) {
void custom_get_value(uint8_t *data) {
uint8_t *value_id = &(data[0]);
uint8_t *value_data = &(data[1]);
-
+
switch ( *value_id ) {
case id_oled_default_mode:
{
- uint8_t default_oled = eeprom_read_byte((uint8_t*)EEPROM_DEFAULT_OLED);
+ uint8_t default_oled;
+ read_custom_config(&default_oled, EEPROM_DEFAULT_OLED_OFFSET, 1);
value_data[0] = default_oled;
break;
}
@@ -179,7 +196,6 @@ void via_custom_value_command_kb(uint8_t *data, uint8_t length) {
}
#endif
-
void read_host_led_state(void) {
led_t led_state = host_keyboard_led_state();
if (led_state.num_lock) {
@@ -290,25 +306,25 @@ bool encoder_update_kb(uint8_t index, bool clockwise) {
}
void custom_config_reset(void){
- void *p = (void*)(VIA_EEPROM_CUSTOM_CONFIG_ADDR);
- void *end = (void*)(VIA_EEPROM_CUSTOM_CONFIG_ADDR+VIA_EEPROM_CUSTOM_CONFIG_SIZE);
- while ( p != end ) {
- eeprom_update_byte(p, 0);
- ++p;
+ for(int i = 0; i < VIA_EEPROM_CUSTOM_CONFIG_SIZE; ++i) {
+ uint8_t dummy = 0;
+ write_custom_config(&dummy, i, 1);
}
- eeprom_update_byte((uint8_t*)EEPROM_ENABLED_ENCODER_MODES, 0x1F);
+
+ uint8_t encoder_modes = 0x1F;
+ write_custom_config(&encoder_modes, EEPROM_ENABLED_ENCODER_MODES_OFFSET, 1);
}
void custom_config_load(void){
#ifdef DYNAMIC_KEYMAP_ENABLE
- oled_mode = eeprom_read_byte((uint8_t*)EEPROM_DEFAULT_OLED);
- enabled_encoder_modes = eeprom_read_byte((uint8_t*)EEPROM_ENABLED_ENCODER_MODES);
+ read_custom_config(&oled_mode, EEPROM_DEFAULT_OLED_OFFSET, 1);
+ read_custom_config(&enabled_encoder_modes, EEPROM_ENABLED_ENCODER_MODES_OFFSET, 1);
#endif
}
// Called from via_init() if VIA_ENABLE
// Called from matrix_init_kb() if not VIA_ENABLE
-void via_init_kb(void)
+void satisfaction_core_init(void)
{
// This checks both an EEPROM reset (from bootmagic lite, keycodes)
// and also firmware build date (from via_eeprom_is_valid())
@@ -326,8 +342,7 @@ void via_init_kb(void)
void matrix_init_kb(void)
{
#ifndef VIA_ENABLE
- via_init_kb();
- via_eeprom_set_valid(true);
+ satisfaction_core_init();
#endif // VIA_ENABLE
rtcGetTime(&RTCD1, &last_timespec);
@@ -335,6 +350,11 @@ void matrix_init_kb(void)
oled_request_wakeup();
}
+#ifdef VIA_ENABLE
+void via_init_kb(void) {
+ satisfaction_core_init();
+}
+#endif // VIA_ENABLE
void housekeeping_task_kb(void) {
rtcGetTime(&RTCD1, &last_timespec);
@@ -345,52 +365,3 @@ void housekeeping_task_kb(void) {
oled_request_repaint();
}
}
-
-//
-// In the case of VIA being disabled, we still need to check if
-// keyboard level EEPROM memory is valid before loading.
-// Thus these are copies of the same functions in VIA, since
-// the backlight settings reuse VIA's EEPROM magic/version,
-// and the ones in via.c won't be compiled in.
-//
-// Yes, this is sub-optimal, and is only here for completeness
-// (i.e. catering to the 1% of people that want wilba.tech LED bling
-// AND want persistent settings BUT DON'T want to use dynamic keymaps/VIA).
-//
-#ifndef VIA_ENABLE
-
-bool via_eeprom_is_valid(void)
-{
- char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
- uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F );
- uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F );
- uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F );
-
- return (eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0 ) == magic0 &&
- eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1 ) == magic1 &&
- eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2 ) == magic2 );
-}
-
-// Sets VIA/keyboard level usage of EEPROM to valid/invalid
-// Keyboard level code (eg. via_init_kb()) should not call this
-void via_eeprom_set_valid(bool valid)
-{
- char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
- uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F );
- uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F );
- uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F );
-
- eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0, valid ? magic0 : 0xFF);
- eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1, valid ? magic1 : 0xFF);
- eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2, valid ? magic2 : 0xFF);
-}
-
-void via_eeprom_reset(void)
-{
- // Set the VIA specific EEPROM state as invalid.
- via_eeprom_set_valid(false);
- // Set the TMK/QMK EEPROM state as invalid.
- eeconfig_disable();
-}
-
-#endif // VIA_ENABLE
diff --git a/keyboards/cannonkeys/lib/satisfaction75/satisfaction_core.h b/keyboards/cannonkeys/lib/satisfaction75/satisfaction_core.h
index 70ee2a3fda..163aa27fad 100644
--- a/keyboards/cannonkeys/lib/satisfaction75/satisfaction_core.h
+++ b/keyboards/cannonkeys/lib/satisfaction75/satisfaction_core.h
@@ -6,12 +6,14 @@
#include <stdint.h>
#include <stdbool.h>
+#include <hal.h>
+
#include "via.h" // only for EEPROM address
#include "satisfaction_keycodes.h"
-#define EEPROM_ENABLED_ENCODER_MODES (VIA_EEPROM_CUSTOM_CONFIG_ADDR)
-#define EEPROM_DEFAULT_OLED (VIA_EEPROM_CUSTOM_CONFIG_ADDR+1)
-#define EEPROM_CUSTOM_ENCODER (VIA_EEPROM_CUSTOM_CONFIG_ADDR+2)
+#define EEPROM_ENABLED_ENCODER_MODES_OFFSET 0
+#define EEPROM_DEFAULT_OLED_OFFSET 1
+#define EEPROM_CUSTOM_ENCODER_OFFSET 2
enum s75_keyboard_value_id {
id_encoder_modes = 1,
@@ -94,3 +96,6 @@ void oled_request_repaint(void);
bool oled_task_needs_to_repaint(void);
void custom_config_load(void);
+
+uint32_t read_custom_config(void *data, uint32_t offset, uint32_t length);
+uint32_t write_custom_config(const void *data, uint32_t offset, uint32_t length);
diff --git a/keyboards/cannonkeys/lib/satisfaction75/satisfaction_encoder.c b/keyboards/cannonkeys/lib/satisfaction75/satisfaction_encoder.c
index 7e0b82e9e7..87ff87ea66 100644
--- a/keyboards/cannonkeys/lib/satisfaction75/satisfaction_encoder.c
+++ b/keyboards/cannonkeys/lib/satisfaction75/satisfaction_encoder.c
@@ -215,10 +215,13 @@ uint16_t handle_encoder_press(void){
uint16_t retrieve_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior){
#ifdef DYNAMIC_KEYMAP_ENABLE
- void* addr = (void*)(EEPROM_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
+ uint32_t offset = EEPROM_CUSTOM_ENCODER_OFFSET + (encoder_idx * 6) + (behavior * 2);
//big endian
- uint16_t keycode = eeprom_read_byte(addr) << 8;
- keycode |= eeprom_read_byte(addr + 1);
+ uint8_t hi, lo;
+ read_custom_config(&hi, offset+0, 1);
+ read_custom_config(&lo, offset+1, 1);
+ uint16_t keycode = hi << 8;
+ keycode |= lo;
return keycode;
#else
return 0;
@@ -227,8 +230,10 @@ uint16_t retrieve_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior){
void set_custom_encoder_config(uint8_t encoder_idx, uint8_t behavior, uint16_t new_code){
#ifdef DYNAMIC_KEYMAP_ENABLE
- void* addr = (void*)(EEPROM_CUSTOM_ENCODER + (encoder_idx * 6) + (behavior * 2));
- eeprom_update_byte(addr, (uint8_t)(new_code >> 8));
- eeprom_update_byte(addr + 1, (uint8_t)(new_code & 0xFF));
+ uint32_t offset = EEPROM_CUSTOM_ENCODER_OFFSET + (encoder_idx * 6) + (behavior * 2);
+ uint8_t hi = new_code >> 8;
+ uint8_t lo = new_code & 0xFF;
+ write_custom_config(&hi, offset+0, 1);
+ write_custom_config(&lo, offset+1, 1);
#endif
}
diff --git a/keyboards/cannonkeys/lib/satisfaction75/satisfaction_oled.c b/keyboards/cannonkeys/lib/satisfaction75/satisfaction_oled.c
index 0361453c52..815e84901d 100644
--- a/keyboards/cannonkeys/lib/satisfaction75/satisfaction_oled.c
+++ b/keyboards/cannonkeys/lib/satisfaction75/satisfaction_oled.c
@@ -8,7 +8,6 @@
#include "matrix.h"
#include "led.h"
#include "host.h"
-#include "oled_driver.h"
#include "progmem.h"
#include <stdio.h>
@@ -16,6 +15,7 @@ void draw_default(void);
void draw_clock(void);
#ifdef OLED_ENABLE
+#include "oled_driver.h"
oled_rotation_t oled_init_kb(oled_rotation_t rotation) { return OLED_ROTATION_0; }
diff --git a/keyboards/cannonkeys/satisfaction75/config.h b/keyboards/cannonkeys/satisfaction75/config.h
index 969206b19a..28bc6b286a 100644
--- a/keyboards/cannonkeys/satisfaction75/config.h
+++ b/keyboards/cannonkeys/satisfaction75/config.h
@@ -42,4 +42,7 @@
// 6 for 3x custom encoder settings, left, right, and press (18 bytes)
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 20
-
+// And if VIA isn't enabled, fall back to using standard QMK for configuration
+#ifndef VIA_ENABLE
+#define EECONFIG_KB_DATA_SIZE VIA_EEPROM_CUSTOM_CONFIG_SIZE
+#endif
diff --git a/keyboards/cannonkeys/satisfaction75_hs/config.h b/keyboards/cannonkeys/satisfaction75_hs/config.h
index 658babd3c0..26c3e4080c 100644
--- a/keyboards/cannonkeys/satisfaction75_hs/config.h
+++ b/keyboards/cannonkeys/satisfaction75_hs/config.h
@@ -40,5 +40,10 @@
// 6 for 3x custom encoder settings, left, right, and press (18 bytes)
#define VIA_EEPROM_CUSTOM_CONFIG_SIZE 20
+// And if VIA isn't enabled, fall back to using standard QMK for configuration
+#ifndef VIA_ENABLE
+#define EECONFIG_KB_DATA_SIZE VIA_EEPROM_CUSTOM_CONFIG_SIZE
+#endif
+
// VIA lighting is handled by the keyboard-level code
#define VIA_CUSTOM_LIGHTING_ENABLE
diff --git a/keyboards/cipulot/common/ec_board.c b/keyboards/cipulot/common/ec_board.c
index 0ccb9f6d3c..b15543e49e 100644
--- a/keyboards/cipulot/common/ec_board.c
+++ b/keyboards/cipulot/common/ec_board.c
@@ -36,7 +36,7 @@ void eeconfig_init_kb(void) {
}
}
// Write default value to EEPROM now
- eeconfig_update_kb_datablock(&eeprom_ec_config);
+ eeconfig_update_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE);
eeconfig_init_user();
}
@@ -44,7 +44,7 @@ void eeconfig_init_kb(void) {
// On Keyboard startup
void keyboard_post_init_kb(void) {
// Read custom menu variables from memory
- eeconfig_read_kb_datablock(&eeprom_ec_config);
+ eeconfig_read_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE);
// Set runtime values to EEPROM values
ec_config.actuation_mode = eeprom_ec_config.actuation_mode;
diff --git a/keyboards/cipulot/common/eeprom_tools.h b/keyboards/cipulot/common/eeprom_tools.h
deleted file mode 100644
index b3c90d8759..0000000000
--- a/keyboards/cipulot/common/eeprom_tools.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* Copyright 2023 Cipulot
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-#pragma once
-
-#include "eeprom.h"
-
-#if (EECONFIG_KB_DATA_SIZE) > 0
-# define EEPROM_KB_PARTIAL_UPDATE(__struct, __field) eeprom_update_block(&(__struct.__field), (void *)((void *)(EECONFIG_KB_DATABLOCK) + offsetof(typeof(__struct), __field)), sizeof(__struct.__field))
-#endif
-
-#if (EECONFIG_USER_DATA_SIZE) > 0
-# define EEPROM_USER_PARTIAL_UPDATE(__struct, __field) eeprom_update_block(&(__struct.__field), (void *)((void *)(EECONFIG_USER_DATABLOCK) + offsetof(typeof(__struct), __field)), sizeof(__struct.__field))
-#endif
diff --git a/keyboards/cipulot/common/via_ec.c b/keyboards/cipulot/common/via_ec.c
index ed34a579b2..7be6edd026 100644
--- a/keyboards/cipulot/common/via_ec.c
+++ b/keyboards/cipulot/common/via_ec.c
@@ -13,7 +13,6 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "eeprom_tools.h"
#include "ec_switch_matrix.h"
#include "action.h"
#include "print.h"
@@ -73,7 +72,7 @@ void via_config_set_value(uint8_t *data) {
uprintf("# Actuation Mode: Rapid Trigger #\n");
uprintf("#################################\n");
}
- EEPROM_KB_PARTIAL_UPDATE(eeprom_ec_config, actuation_mode);
+ eeconfig_update_kb_datablock_field(eeprom_ec_config, actuation_mode);
break;
}
case id_mode_0_actuation_threshold: {
@@ -293,7 +292,7 @@ void ec_save_threshold_data(uint8_t option) {
ec_rescale_values(3);
ec_rescale_values(4);
}
- eeconfig_update_kb_datablock(&eeprom_ec_config);
+ eeconfig_update_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE);
uprintf("####################################\n");
uprintf("# New thresholds applied and saved #\n");
uprintf("####################################\n");
@@ -321,7 +320,7 @@ void ec_save_bottoming_reading(void) {
ec_rescale_values(2);
ec_rescale_values(3);
ec_rescale_values(4);
- eeconfig_update_kb_datablock(&eeprom_ec_config);
+ eeconfig_update_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE);
}
// Show the calibration data
diff --git a/keyboards/cipulot/ec_980c/ec_980c.c b/keyboards/cipulot/ec_980c/ec_980c.c
index eaa636ede6..7a2062a4e4 100644
--- a/keyboards/cipulot/ec_980c/ec_980c.c
+++ b/keyboards/cipulot/ec_980c/ec_980c.c
@@ -44,7 +44,7 @@ void eeconfig_init_kb(void) {
}
}
// Write default value to EEPROM now
- eeconfig_update_kb_datablock(&eeprom_ec_config);
+ eeconfig_update_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE);
eeconfig_init_user();
}
@@ -52,7 +52,7 @@ void eeconfig_init_kb(void) {
// On Keyboard startup
void keyboard_post_init_kb(void) {
// Read custom menu variables from memory
- eeconfig_read_kb_datablock(&eeprom_ec_config);
+ eeconfig_read_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE);
// Set runtime values to EEPROM values
ec_config.actuation_mode = eeprom_ec_config.actuation_mode;
diff --git a/keyboards/cipulot/ec_typek/ec_typek.c b/keyboards/cipulot/ec_typek/ec_typek.c
index d4241f66f1..31616afc02 100644
--- a/keyboards/cipulot/ec_typek/ec_typek.c
+++ b/keyboards/cipulot/ec_typek/ec_typek.c
@@ -44,7 +44,7 @@ void eeconfig_init_kb(void) {
}
}
// Write default value to EEPROM now
- eeconfig_update_kb_datablock(&eeprom_ec_config);
+ eeconfig_update_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE);
eeconfig_init_user();
}
@@ -52,7 +52,7 @@ void eeconfig_init_kb(void) {
// On Keyboard startup
void keyboard_post_init_kb(void) {
// Read custom menu variables from memory
- eeconfig_read_kb_datablock(&eeprom_ec_config);
+ eeconfig_read_kb_datablock(&eeprom_ec_config, 0, EECONFIG_KB_DATA_SIZE);
// Set runtime values to EEPROM values
ec_config.actuation_mode = eeprom_ec_config.actuation_mode;
diff --git a/keyboards/contra/keymaps/default/keymap.c b/keyboards/contra/keymaps/default/keymap.c
index 415e22e81a..645005769a 100644
--- a/keyboards/contra/keymaps/default/keymap.c
+++ b/keyboards/contra/keymaps/default/keymap.c
@@ -222,9 +222,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
- keymap_config.raw = eeconfig_read_keymap();
+ eeconfig_read_keymap(&keymap_config);
keymap_config.nkro = 1;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
return false;
break;
diff --git a/keyboards/deemen17/de60fs/config.h b/keyboards/deemen17/de60/r1/config.h
index e21d4ae373..e21d4ae373 100644
--- a/keyboards/deemen17/de60fs/config.h
+++ b/keyboards/deemen17/de60/r1/config.h
diff --git a/keyboards/deemen17/de60fs/keyboard.json b/keyboards/deemen17/de60/r1/keyboard.json
index 573c012baa..62de2691ce 100644
--- a/keyboards/deemen17/de60fs/keyboard.json
+++ b/keyboards/deemen17/de60/r1/keyboard.json
@@ -1,6 +1,6 @@
{
- "manufacturer": "Deemen17",
- "keyboard_name": "De60fs",
+ "manufacturer": "Deemen17 Works",
+ "keyboard_name": "DE60 R1",
"maintainer": "Deemen17",
"bootloader": "rp2040",
"build": {
diff --git a/keyboards/deemen17/de60fs/keymaps/default/keymap.c b/keyboards/deemen17/de60/r1/keymaps/default/keymap.c
index f93f61d768..f93f61d768 100644
--- a/keyboards/deemen17/de60fs/keymaps/default/keymap.c
+++ b/keyboards/deemen17/de60/r1/keymaps/default/keymap.c
diff --git a/keyboards/deemen17/de60fs/readme.md b/keyboards/deemen17/de60/r1/readme.md
index e5135691a8..e71a2fc412 100644
--- a/keyboards/deemen17/de60fs/readme.md
+++ b/keyboards/deemen17/de60/r1/readme.md
@@ -1,6 +1,6 @@
-# De60fs
+# DE60 Round 1
-![De60fs](https://i.imgur.com/7hpYaoXh.jpg)
+![DE60 R1](https://i.imgur.com/7hpYaoXh.jpg)
A GH60 form factor PCB for 60% keyboards. Uses a Left USB Type C connector or 5 JST SH positions for daughter board.
@@ -10,11 +10,11 @@ A GH60 form factor PCB for 60% keyboards. Uses a Left USB Type C connector or 5
Make example for this keyboard (after setting up your build environment):
- make deemen17/de60fs:default
+ make deemen17/de60/r1:default
Flashing example for this keyboard:
- make deemen17/de60fs:default:flash
+ make deemen17/de60/r1: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).
diff --git a/keyboards/deemen17/de60/readme.md b/keyboards/deemen17/de60/readme.md
new file mode 100644
index 0000000000..c5ea64a6a6
--- /dev/null
+++ b/keyboards/deemen17/de60/readme.md
@@ -0,0 +1,17 @@
+# DE60
+
+Deemen17 Works's 60% PCB Platform, which works as the base for our 60%-layout PCB designs.
+
+* Keyboard Maintainer: [Deemen17](https://github.com/Deemen17)
+* Hardware Supported: DE60 PCBs
+* Hardware Availability: [Deemen17 Facebook Page](https://www.facebook.com/deemen17/), [Deemen17 Works Instagram](https://www.instagram.com/deemen17.works)
+
+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 (ESC/Escape) and plug in the keyboard
+* **Physical reset button**: Double tap the button RESET on the back of the PCB
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available \ No newline at end of file
diff --git a/keyboards/dm9records/plaid/keymaps/default/keymap.c b/keyboards/dm9records/plaid/keymaps/default/keymap.c
index 0d8d24c575..3ee327f65e 100644
--- a/keyboards/dm9records/plaid/keymaps/default/keymap.c
+++ b/keyboards/dm9records/plaid/keymaps/default/keymap.c
@@ -311,9 +311,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
- keymap_config.raw = eeconfig_read_keymap();
+ eeconfig_read_keymap(&keymap_config);
keymap_config.nkro = 1;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
return false;
break;
diff --git a/keyboards/handwired/dactyl_cc/keyboard.json b/keyboards/handwired/dactyl_cc/keyboard.json
index e607bfad1a..f4097b0487 100644
--- a/keyboards/handwired/dactyl_cc/keyboard.json
+++ b/keyboards/handwired/dactyl_cc/keyboard.json
@@ -23,7 +23,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"development_board": "promicro",
"layouts": {
diff --git a/keyboards/handwired/dactyl_kinesis/keyboard.json b/keyboards/handwired/dactyl_kinesis/keyboard.json
index ee68a2c515..26993fc974 100644
--- a/keyboards/handwired/dactyl_kinesis/keyboard.json
+++ b/keyboards/handwired/dactyl_kinesis/keyboard.json
@@ -29,7 +29,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"development_board": "promicro",
"layouts": {
diff --git a/keyboards/handwired/dactyl_lightcycle/keyboard.json b/keyboards/handwired/dactyl_lightcycle/keyboard.json
index 1b5f2dd39a..6e56b18f6f 100644
--- a/keyboards/handwired/dactyl_lightcycle/keyboard.json
+++ b/keyboards/handwired/dactyl_lightcycle/keyboard.json
@@ -26,7 +26,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"development_board": "promicro",
"community_layouts": ["split_3x6_3", "split_3x5_3"],
diff --git a/keyboards/handwired/dactyl_manuform/4x5/keyboard.json b/keyboards/handwired/dactyl_manuform/4x5/keyboard.json
index e0a1b531a5..ce4b6c648b 100644
--- a/keyboards/handwired/dactyl_manuform/4x5/keyboard.json
+++ b/keyboards/handwired/dactyl_manuform/4x5/keyboard.json
@@ -35,7 +35,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"processor": "atmega32u4",
"bootloader": "caterina",
diff --git a/keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json b/keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json
index 7efc4718ad..134793cac8 100644
--- a/keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json
+++ b/keyboards/handwired/dactyl_manuform/4x5_5/keyboard.json
@@ -29,7 +29,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"development_board": "promicro",
"layouts": {
diff --git a/keyboards/handwired/dactyl_manuform/4x6/keyboard.json b/keyboards/handwired/dactyl_manuform/4x6/keyboard.json
index d589c532a8..0d8af5eed1 100644
--- a/keyboards/handwired/dactyl_manuform/4x6/keyboard.json
+++ b/keyboards/handwired/dactyl_manuform/4x6/keyboard.json
@@ -35,7 +35,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"processor": "atmega32u4",
"bootloader": "caterina",
diff --git a/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json b/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json
index c0c24a8966..1846f2a661 100644
--- a/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json
+++ b/keyboards/handwired/dactyl_manuform/4x6_4_3/keyboard.json
@@ -32,7 +32,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"development_board": "promicro",
"layouts": {
diff --git a/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json b/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json
index 47ad7aa920..ab916b0353 100644
--- a/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json
+++ b/keyboards/handwired/dactyl_manuform/4x6_5/keyboard.json
@@ -35,7 +35,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"processor": "atmega32u4",
"bootloader": "caterina",
diff --git a/keyboards/handwired/dactyl_manuform/5x6/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6/keyboard.json
index 353b148126..1bcba1b648 100644
--- a/keyboards/handwired/dactyl_manuform/5x6/keyboard.json
+++ b/keyboards/handwired/dactyl_manuform/5x6/keyboard.json
@@ -35,7 +35,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"processor": "atmega32u4",
"bootloader": "caterina",
diff --git a/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json
index 620ffdec06..7a0cff5e6c 100644
--- a/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json
+++ b/keyboards/handwired/dactyl_manuform/5x6_2_5/keyboard.json
@@ -29,7 +29,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0",
+ "serial": {
+ "pin": "D0"
+ },
"bootmagic": {
"matrix": [6, 5]
}
diff --git a/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json
index fc7676aa4b..0694447ee9 100644
--- a/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json
+++ b/keyboards/handwired/dactyl_manuform/5x6_5/keyboard.json
@@ -29,7 +29,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0",
+ "serial": {
+ "pin": "D0"
+ },
"bootmagic": {
"matrix": [6, 5]
}
diff --git a/keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json
index 974f1b8bc3..ae73995d49 100644
--- a/keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json
+++ b/keyboards/handwired/dactyl_manuform/5x6_6/keyboard.json
@@ -29,7 +29,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D3"
+ "serial": {
+ "pin": "D3"
+ }
},
"processor": "atmega32u4",
"bootloader": "caterina",
diff --git a/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json b/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json
index 5b6bdfb86e..7d51a06c7c 100644
--- a/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json
+++ b/keyboards/handwired/dactyl_manuform/5x6_68/keyboard.json
@@ -25,7 +25,9 @@
},
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"matrix_pins": {
"cols": ["D4", "C6", "D7", "E6", "B4", "B5"],
diff --git a/keyboards/handwired/dactyl_manuform/5x7/keyboard.json b/keyboards/handwired/dactyl_manuform/5x7/keyboard.json
index d40a45dfa7..cf5f579057 100644
--- a/keyboards/handwired/dactyl_manuform/5x7/keyboard.json
+++ b/keyboards/handwired/dactyl_manuform/5x7/keyboard.json
@@ -35,7 +35,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"processor": "atmega32u4",
"bootloader": "caterina",
diff --git a/keyboards/handwired/dactyl_manuform/6x6/promicro/keyboard.json b/keyboards/handwired/dactyl_manuform/6x6/promicro/keyboard.json
index 213a3c29f5..44ae441270 100644
--- a/keyboards/handwired/dactyl_manuform/6x6/promicro/keyboard.json
+++ b/keyboards/handwired/dactyl_manuform/6x6/promicro/keyboard.json
@@ -6,7 +6,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"rgblight": {
"led_count": 12
diff --git a/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json b/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json
index 98e96c9639..a011a2cc3b 100644
--- a/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json
+++ b/keyboards/handwired/dactyl_manuform/6x6_4/keyboard.json
@@ -35,7 +35,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"processor": "atmega32u4",
"bootloader": "caterina",
diff --git a/keyboards/handwired/dactyl_manuform/6x7/keyboard.json b/keyboards/handwired/dactyl_manuform/6x7/keyboard.json
index 153b6c75c4..bb016647da 100644
--- a/keyboards/handwired/dactyl_manuform/6x7/keyboard.json
+++ b/keyboards/handwired/dactyl_manuform/6x7/keyboard.json
@@ -32,7 +32,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"rgblight": {
"led_count": 12
diff --git a/keyboards/handwired/dactyl_maximus/keyboard.json b/keyboards/handwired/dactyl_maximus/keyboard.json
index 081fab571a..57e91cc3f4 100644
--- a/keyboards/handwired/dactyl_maximus/keyboard.json
+++ b/keyboards/handwired/dactyl_maximus/keyboard.json
@@ -26,7 +26,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D1"
+ "serial": {
+ "pin": "D1"
+ }
},
"development_board": "promicro",
"layouts": {
diff --git a/keyboards/handwired/dactyl_minidox/keyboard.json b/keyboards/handwired/dactyl_minidox/keyboard.json
index 5bd5c5c05a..b488bac4b0 100644
--- a/keyboards/handwired/dactyl_minidox/keyboard.json
+++ b/keyboards/handwired/dactyl_minidox/keyboard.json
@@ -67,7 +67,9 @@
"diode_direction": "ROW2COL",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"development_board": "promicro",
"community_layouts": ["split_3x5_3"],
diff --git a/keyboards/handwired/dactyl_promicro/keyboard.json b/keyboards/handwired/dactyl_promicro/keyboard.json
index 824ffe7e7e..df82505d94 100644
--- a/keyboards/handwired/dactyl_promicro/keyboard.json
+++ b/keyboards/handwired/dactyl_promicro/keyboard.json
@@ -29,7 +29,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"rgblight": {
"led_count": 12
diff --git a/keyboards/handwired/dactyl_rah/keyboard.json b/keyboards/handwired/dactyl_rah/keyboard.json
index 3bc5dc0854..903aafc973 100644
--- a/keyboards/handwired/dactyl_rah/keyboard.json
+++ b/keyboards/handwired/dactyl_rah/keyboard.json
@@ -29,7 +29,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"processor": "atmega32u4",
"bootloader": "caterina",
diff --git a/keyboards/handwired/dactyl_tracer/keyboard.json b/keyboards/handwired/dactyl_tracer/keyboard.json
index 29e5990666..92a8a2c76b 100644
--- a/keyboards/handwired/dactyl_tracer/keyboard.json
+++ b/keyboards/handwired/dactyl_tracer/keyboard.json
@@ -24,7 +24,9 @@
"development_board": "promicro",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"layouts": {
"LAYOUT" : {
diff --git a/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json b/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json
index 8308506512..d40ef0210b 100644
--- a/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json
+++ b/keyboards/handwired/daskeyboard/daskeyboard4/keyboard.json
@@ -43,114 +43,233 @@
"tapping": {
"toggle": 2
},
+ "community_layouts": ["fullsize_ansi", "fullsize_iso"],
"layouts": {
+ "LAYOUT_fullsize_ansi": {
+ "layout": [
+ {"matrix": [5, 16], "x": 0, "y": 0},
+ {"matrix": [2, 4], "x": 2, "y": 0},
+ {"matrix": [2, 5], "x": 3, "y": 0},
+ {"matrix": [3, 5], "x": 4, "y": 0},
+ {"matrix": [5, 5], "x": 5, "y": 0},
+ {"matrix": [0, 1], "x": 6.5, "y": 0},
+ {"matrix": [5, 8], "x": 7.5, "y": 0},
+ {"matrix": [3, 3], "x": 8.5, "y": 0},
+ {"matrix": [2, 3], "x": 9.5, "y": 0},
+ {"matrix": [2, 2], "x": 11, "y": 0},
+ {"matrix": [0, 2], "x": 12, "y": 0},
+ {"matrix": [5, 2], "x": 13, "y": 0},
+ {"matrix": [6, 2], "x": 14, "y": 0},
+ {"matrix": [0, 0], "x": 15.25, "y": 0},
+ {"matrix": [1, 0], "x": 16.25, "y": 0},
+ {"matrix": [1, 1], "x": 17.25, "y": 0},
+
+ {"matrix": [2, 16], "x": 0, "y": 1.25},
+ {"matrix": [0, 16], "x": 1, "y": 1.25},
+ {"matrix": [0, 4], "x": 2, "y": 1.25},
+ {"matrix": [0, 5], "x": 3, "y": 1.25},
+ {"matrix": [0, 6], "x": 4, "y": 1.25},
+ {"matrix": [2, 6], "x": 5, "y": 1.25},
+ {"matrix": [2, 7], "x": 6, "y": 1.25},
+ {"matrix": [0, 7], "x": 7, "y": 1.25},
+ {"matrix": [0, 8], "x": 8, "y": 1.25},
+ {"matrix": [0, 3], "x": 9, "y": 1.25},
+ {"matrix": [0, 9], "x": 10, "y": 1.25},
+ {"matrix": [2, 9], "x": 11, "y": 1.25},
+ {"matrix": [2, 8], "x": 12, "y": 1.25},
+ {"matrix": [3, 2], "w": 2, "x": 13, "y": 1.25},
+ {"matrix": [2, 11], "x": 15.25, "y": 1.25},
+ {"matrix": [2, 15], "x": 16.25, "y": 1.25},
+ {"matrix": [2, 14], "x": 17.25, "y": 1.25},
+ {"matrix": [4, 10], "x": 18.5, "y": 1.25},
+ {"matrix": [4, 11], "x": 19.5, "y": 1.25},
+ {"matrix": [4, 14], "x": 20.5, "y": 1.25},
+ {"matrix": [6, 14], "x": 21.5, "y": 1.25},
+
+ {"matrix": [3, 16], "w": 1.5, "x": 0, "y": 2.25},
+ {"matrix": [1, 16], "x": 1.5, "y": 2.25},
+ {"matrix": [1, 4], "x": 2.5, "y": 2.25},
+ {"matrix": [1, 5], "x": 3.5, "y": 2.25},
+ {"matrix": [1, 6], "x": 4.5, "y": 2.25},
+ {"matrix": [3, 6], "x": 5.5, "y": 2.25},
+ {"matrix": [3, 7], "x": 6.5, "y": 2.25},
+ {"matrix": [1, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [1, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [1, 3], "x": 9.5, "y": 2.25},
+ {"matrix": [1, 9], "x": 10.5, "y": 2.25},
+ {"matrix": [3, 9], "x": 11.5, "y": 2.25},
+ {"matrix": [3, 8], "x": 12.5, "y": 2.25},
+ {"matrix": [7, 2], "x": 13.5, "y": 2.25, "w": 1.5},
+ {"matrix": [2, 10], "x": 15.25, "y": 2.25},
+ {"matrix": [0, 15], "x": 16.25, "y": 2.25},
+ {"matrix": [0, 14], "x": 17.25, "y": 2.25},
+ {"matrix": [1, 10], "x": 18.5, "y": 2.25},
+ {"matrix": [1, 11], "x": 19.5, "y": 2.25},
+ {"matrix": [1, 14], "x": 20.5, "y": 2.25},
+ {"matrix": [1, 15], "x": 21.5, "y": 2.25, "h": 2},
+
+ {"matrix": [3, 4], "w": 1.75, "x": 0, "y": 3.25},
+ {"matrix": [7, 16], "x": 1.75, "y": 3.25},
+ {"matrix": [7, 4], "x": 2.75, "y": 3.25},
+ {"matrix": [7, 5], "x": 3.75, "y": 3.25},
+ {"matrix": [7, 6], "x": 4.75, "y": 3.25},
+ {"matrix": [5, 6], "x": 5.75, "y": 3.25},
+ {"matrix": [5, 7], "x": 6.75, "y": 3.25},
+ {"matrix": [7, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [7, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [7, 3], "x": 9.75, "y": 3.25},
+ {"matrix": [7, 9], "x": 10.75, "y": 3.25},
+ {"matrix": [5, 9], "x": 11.75, "y": 3.25},
+ {"matrix": [4, 2], "w": 2.25, "x": 12.75, "y": 3.25},
+ {"matrix": [3, 10], "x": 18.5, "y": 3.25},
+ {"matrix": [3, 11], "x": 19.5, "y": 3.25},
+ {"matrix": [3, 14], "x": 20.5, "y": 3.25},
+
+ {"matrix": [3, 13], "w": 2.25, "x": 0, "y": 4.25},
+ {"matrix": [4, 16], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 5.25, "y": 4.25},
+ {"matrix": [6, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [6, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 10.25, "y": 4.25},
+ {"matrix": [6, 9], "x": 11.25, "y": 4.25},
+ {"matrix": [7, 13], "w": 2.75, "x": 12.25, "y": 4.25},
+ {"matrix": [5, 15], "x": 16.25, "y": 4.25},
+ {"matrix": [7, 10], "x": 18.5, "y": 4.25},
+ {"matrix": [7, 11], "x": 19.5, "y": 4.25},
+ {"matrix": [7, 14], "x": 20.5, "y": 4.25},
+ {"matrix": [7, 15], "x": 21.5, "y": 4.25, "h": 2},
+
+ {"matrix": [2, 1], "w": 1.25, "x": 0, "y": 5.25},
+ {"matrix": [3, 12], "w": 1.25, "x": 1.25, "y": 5.25},
+ {"matrix": [5, 0], "w": 1.25, "x": 2.5, "y": 5.25},
+ {"matrix": [5, 10], "w": 6.25, "x": 3.75, "y": 5.25},
+ {"matrix": [6, 0], "w": 1.25, "x": 10, "y": 5.25},
+ {"matrix": [7, 12], "w": 1.25, "x": 11.25, "y": 5.25},
+ {"matrix": [6, 3], "w": 1.25, "x": 12.5, "y": 5.25},
+ {"matrix": [4, 1], "w": 1.25, "x": 13.75, "y": 5.25},
+ {"matrix": [6, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [6, 10], "x": 16.25, "y": 5.25},
+ {"matrix": [6, 11], "x": 17.25, "y": 5.25},
+ {"matrix": [5, 11], "w": 2, "x": 18.5, "y": 5.25},
+ {"matrix": [5, 14], "x": 20.5, "y": 5.25}
+ ]
+ },
"LAYOUT_fullsize_iso": {
"layout": [
- {"label": "Esc", "matrix": [5, 16], "x": 0, "y": 0},
- {"label": "F1", "matrix": [2, 4], "x": 2, "y": 0},
- {"label": "F2", "matrix": [2, 5], "x": 3, "y": 0},
- {"label": "F3", "matrix": [3, 5], "x": 4, "y": 0},
- {"label": "F4", "matrix": [5, 5], "x": 5, "y": 0},
- {"label": "F5", "matrix": [0, 1], "x": 6.5, "y": 0},
- {"label": "F6", "matrix": [5, 8], "x": 7.5, "y": 0},
- {"label": "F7", "matrix": [3, 3], "x": 8.5, "y": 0},
- {"label": "F8", "matrix": [2, 3], "x": 9.5, "y": 0},
- {"label": "F9", "matrix": [2, 2], "x": 11, "y": 0},
- {"label": "F10", "matrix": [0, 2], "x": 12, "y": 0},
- {"label": "F11", "matrix": [5, 2], "x": 13, "y": 0},
- {"label": "F12", "matrix": [6, 2], "x": 14, "y": 0},
- {"label": "Prt Sc", "matrix": [0, 0], "x": 15.25, "y": 0},
- {"label": "Scr Lk", "matrix": [1, 0], "x": 16.25, "y": 0},
- {"label": "Pause", "matrix": [1, 1], "x": 17.25, "y": 0},
- {"label": "`", "matrix": [2, 16], "x": 0, "y": 1.25},
- {"label": "1", "matrix": [0, 16], "x": 1, "y": 1.25},
- {"label": "2", "matrix": [0, 4], "x": 2, "y": 1.25},
- {"label": "3", "matrix": [0, 5], "x": 3, "y": 1.25},
- {"label": "4", "matrix": [0, 6], "x": 4, "y": 1.25},
- {"label": "5", "matrix": [2, 6], "x": 5, "y": 1.25},
- {"label": "6", "matrix": [2, 7], "x": 6, "y": 1.25},
- {"label": "7", "matrix": [0, 7], "x": 7, "y": 1.25},
- {"label": "8", "matrix": [0, 8], "x": 8, "y": 1.25},
- {"label": "9", "matrix": [0, 3], "x": 9, "y": 1.25},
- {"label": "0", "matrix": [0, 9], "x": 10, "y": 1.25},
- {"label": "-", "matrix": [2, 9], "x": 11, "y": 1.25},
- {"label": "=", "matrix": [2, 8], "x": 12, "y": 1.25},
- {"label": "Backspace", "matrix": [3, 2], "w": 2, "x": 13, "y": 1.25},
- {"label": "Ins", "matrix": [2, 11], "x": 15.25, "y": 1.25},
- {"label": "Home", "matrix": [2, 15], "x": 16.25, "y": 1.25},
- {"label": "Page Up", "matrix": [2, 14], "x": 17.25, "y": 1.25},
- {"label": "Num Lk", "matrix": [4, 10], "x": 18.5, "y": 1.25},
- {"label": "/", "matrix": [4, 11], "x": 19.5, "y": 1.25},
- {"label": "*", "matrix": [4, 14], "x": 20.5, "y": 1.25},
- {"label": "-", "matrix": [6, 14], "x": 21.5, "y": 1.25},
- {"label": "Tab", "matrix": [3, 16], "w": 1.5, "x": 0, "y": 2.25},
- {"label": "Q", "matrix": [1, 16], "x": 1.5, "y": 2.25},
- {"label": "W", "matrix": [1, 4], "x": 2.5, "y": 2.25},
- {"label": "E", "matrix": [1, 5], "x": 3.5, "y": 2.25},
- {"label": "R", "matrix": [1, 6], "x": 4.5, "y": 2.25},
- {"label": "T", "matrix": [3, 6], "x": 5.5, "y": 2.25},
- {"label": "Y", "matrix": [3, 7], "x": 6.5, "y": 2.25},
- {"label": "U", "matrix": [1, 7], "x": 7.5, "y": 2.25},
- {"label": "I", "matrix": [1, 8], "x": 8.5, "y": 2.25},
- {"label": "O", "matrix": [1, 3], "x": 9.5, "y": 2.25},
- {"label": "P", "matrix": [1, 9], "x": 10.5, "y": 2.25},
- {"label": "[", "matrix": [3, 9], "x": 11.5, "y": 2.25},
- {"label": "]", "matrix": [3, 8], "x": 12.5, "y": 2.25},
- {"label": "Del", "matrix": [2, 10], "x": 15.25, "y": 2.25},
- {"label": "End", "matrix": [0, 15], "x": 16.25, "y": 2.25},
- {"label": "Page Down", "matrix": [0, 14], "x": 17.25, "y": 2.25},
- {"label": "7", "matrix": [1, 10], "x": 18.5, "y": 2.25},
- {"label": "8", "matrix": [1, 11], "x": 19.5, "y": 2.25},
- {"label": "9", "matrix": [1, 14], "x": 20.5, "y": 2.25},
- {"label": "+", "h": 2, "matrix": [1, 15], "x": 21.5, "y": 2.25},
- {"label": "Caps Lock", "matrix": [3, 4], "w": 1.75, "x": 0, "y": 3.25},
- {"label": "A", "matrix": [7, 16], "x": 1.75, "y": 3.25},
- {"label": "S", "matrix": [7, 4], "x": 2.75, "y": 3.25},
- {"label": "D", "matrix": [7, 5], "x": 3.75, "y": 3.25},
- {"label": "F", "matrix": [7, 6], "x": 4.75, "y": 3.25},
- {"label": "G", "matrix": [5, 6], "x": 5.75, "y": 3.25},
- {"label": "H", "matrix": [5, 7], "x": 6.75, "y": 3.25},
- {"label": "J", "matrix": [7, 7], "x": 7.75, "y": 3.25},
- {"label": "K", "matrix": [7, 8], "x": 8.75, "y": 3.25},
- {"label": "L", "matrix": [7, 3], "x": 9.75, "y": 3.25},
- {"label": ";", "matrix": [7, 9], "x": 10.75, "y": 3.25},
- {"label": "'", "matrix": [5, 9], "x": 11.75, "y": 3.25},
- {"label": "#", "matrix": [1, 2], "x": 12.75, "y": 3.25},
- {"label": "Return", "h": 2, "matrix": [4, 2], "w": 1.25, "x": 13.75, "y": 2.25},
- {"label": "4", "matrix": [3, 10], "x": 18.5, "y": 3.25},
- {"label": "5", "matrix": [3, 11], "x": 19.5, "y": 3.25},
- {"label": "6", "matrix": [3, 14], "x": 20.5, "y": 3.25},
- {"label": "Shift L", "matrix": [3, 13], "w": 1.25, "x": 0, "y": 4.25},
- {"label": "\\", "matrix": [5, 4], "x": 1.25, "y": 4.25},
- {"label": "Z", "matrix": [4, 16], "x": 2.25, "y": 4.25},
- {"label": "X", "matrix": [4, 4], "x": 3.25, "y": 4.25},
- {"label": "C", "matrix": [4, 5], "x": 4.25, "y": 4.25},
- {"label": "V", "matrix": [4, 6], "x": 5.25, "y": 4.25},
- {"label": "B", "matrix": [6, 6], "x": 6.25, "y": 4.25},
- {"label": "N", "matrix": [6, 7], "x": 7.25, "y": 4.25},
- {"label": "M", "matrix": [4, 7], "x": 8.25, "y": 4.25},
- {"label": ",", "matrix": [4, 8], "x": 9.25, "y": 4.25},
- {"label": ".", "matrix": [4, 3], "x": 10.25, "y": 4.25},
- {"label": "/", "matrix": [6, 9], "x": 11.25, "y": 4.25},
- {"label": "Shift R", "matrix": [7, 13], "w": 2.75, "x": 12.25, "y": 4.25},
- {"label": "Up", "matrix": [5, 15], "x": 16.25, "y": 4.25},
- {"label": "1", "matrix": [7, 10], "x": 18.5, "y": 4.25},
- {"label": "2", "matrix": [7, 11], "x": 19.5, "y": 4.25},
- {"label": "3", "matrix": [7, 14], "x": 20.5, "y": 4.25},
- {"label": "Enter", "h": 2, "matrix": [7, 15], "x": 21.5, "y": 4.25},
- {"label": "Control L", "matrix": [2, 1], "w": 1.25, "x": 0, "y": 5.25},
- {"label": "Super L", "matrix": [3, 12], "w": 1.25, "x": 1.25, "y": 5.25},
- {"label": "Alt L", "matrix": [5, 0], "w": 1.25, "x": 2.5, "y": 5.25},
- {"label": " ", "matrix": [5, 10], "w": 6.25, "x": 3.75, "y": 5.25},
- {"label": "Alt R", "matrix": [6, 0], "w": 1.25, "x": 10, "y": 5.25},
- {"label": "Super R", "matrix": [7, 12], "w": 1.25, "x": 11.25, "y": 5.25},
- {"label": "Menu", "matrix": [6, 3], "w": 1.25, "x": 12.5, "y": 5.25},
- {"label": "Control R", "matrix": [4, 1], "w": 1.25, "x": 13.75, "y": 5.25},
- {"label": "Left", "matrix": [6, 15], "x": 15.25, "y": 5.25},
- {"label": "Down", "matrix": [6, 10], "x": 16.25, "y": 5.25},
- {"label": "Right", "matrix": [6, 11], "x": 17.25, "y": 5.25},
- {"label": "0", "matrix": [5, 11], "w": 2, "x": 18.5, "y": 5.25},
- {"label": "Del", "matrix": [5, 14], "x": 20.5, "y": 5.25}
+ {"matrix": [5, 16], "x": 0, "y": 0},
+ {"matrix": [2, 4], "x": 2, "y": 0},
+ {"matrix": [2, 5], "x": 3, "y": 0},
+ {"matrix": [3, 5], "x": 4, "y": 0},
+ {"matrix": [5, 5], "x": 5, "y": 0},
+ {"matrix": [0, 1], "x": 6.5, "y": 0},
+ {"matrix": [5, 8], "x": 7.5, "y": 0},
+ {"matrix": [3, 3], "x": 8.5, "y": 0},
+ {"matrix": [2, 3], "x": 9.5, "y": 0},
+ {"matrix": [2, 2], "x": 11, "y": 0},
+ {"matrix": [0, 2], "x": 12, "y": 0},
+ {"matrix": [5, 2], "x": 13, "y": 0},
+ {"matrix": [6, 2], "x": 14, "y": 0},
+ {"matrix": [0, 0], "x": 15.25, "y": 0},
+ {"matrix": [1, 0], "x": 16.25, "y": 0},
+ {"matrix": [1, 1], "x": 17.25, "y": 0},
+
+ {"matrix": [2, 16], "x": 0, "y": 1.25},
+ {"matrix": [0, 16], "x": 1, "y": 1.25},
+ {"matrix": [0, 4], "x": 2, "y": 1.25},
+ {"matrix": [0, 5], "x": 3, "y": 1.25},
+ {"matrix": [0, 6], "x": 4, "y": 1.25},
+ {"matrix": [2, 6], "x": 5, "y": 1.25},
+ {"matrix": [2, 7], "x": 6, "y": 1.25},
+ {"matrix": [0, 7], "x": 7, "y": 1.25},
+ {"matrix": [0, 8], "x": 8, "y": 1.25},
+ {"matrix": [0, 3], "x": 9, "y": 1.25},
+ {"matrix": [0, 9], "x": 10, "y": 1.25},
+ {"matrix": [2, 9], "x": 11, "y": 1.25},
+ {"matrix": [2, 8], "x": 12, "y": 1.25},
+ {"matrix": [3, 2], "w": 2, "x": 13, "y": 1.25},
+ {"matrix": [2, 11], "x": 15.25, "y": 1.25},
+ {"matrix": [2, 15], "x": 16.25, "y": 1.25},
+ {"matrix": [2, 14], "x": 17.25, "y": 1.25},
+ {"matrix": [4, 10], "x": 18.5, "y": 1.25},
+ {"matrix": [4, 11], "x": 19.5, "y": 1.25},
+ {"matrix": [4, 14], "x": 20.5, "y": 1.25},
+ {"matrix": [6, 14], "x": 21.5, "y": 1.25},
+
+ {"matrix": [3, 16], "w": 1.5, "x": 0, "y": 2.25},
+ {"matrix": [1, 16], "x": 1.5, "y": 2.25},
+ {"matrix": [1, 4], "x": 2.5, "y": 2.25},
+ {"matrix": [1, 5], "x": 3.5, "y": 2.25},
+ {"matrix": [1, 6], "x": 4.5, "y": 2.25},
+ {"matrix": [3, 6], "x": 5.5, "y": 2.25},
+ {"matrix": [3, 7], "x": 6.5, "y": 2.25},
+ {"matrix": [1, 7], "x": 7.5, "y": 2.25},
+ {"matrix": [1, 8], "x": 8.5, "y": 2.25},
+ {"matrix": [1, 3], "x": 9.5, "y": 2.25},
+ {"matrix": [1, 9], "x": 10.5, "y": 2.25},
+ {"matrix": [3, 9], "x": 11.5, "y": 2.25},
+ {"matrix": [3, 8], "x": 12.5, "y": 2.25},
+ {"matrix": [2, 10], "x": 15.25, "y": 2.25},
+ {"matrix": [0, 15], "x": 16.25, "y": 2.25},
+ {"matrix": [0, 14], "x": 17.25, "y": 2.25},
+ {"matrix": [1, 10], "x": 18.5, "y": 2.25},
+ {"matrix": [1, 11], "x": 19.5, "y": 2.25},
+ {"matrix": [1, 14], "x": 20.5, "y": 2.25},
+ {"matrix": [1, 15], "x": 21.5, "y": 2.25, "h": 2},
+
+ {"matrix": [3, 4], "w": 1.75, "x": 0, "y": 3.25},
+ {"matrix": [7, 16], "x": 1.75, "y": 3.25},
+ {"matrix": [7, 4], "x": 2.75, "y": 3.25},
+ {"matrix": [7, 5], "x": 3.75, "y": 3.25},
+ {"matrix": [7, 6], "x": 4.75, "y": 3.25},
+ {"matrix": [5, 6], "x": 5.75, "y": 3.25},
+ {"matrix": [5, 7], "x": 6.75, "y": 3.25},
+ {"matrix": [7, 7], "x": 7.75, "y": 3.25},
+ {"matrix": [7, 8], "x": 8.75, "y": 3.25},
+ {"matrix": [7, 3], "x": 9.75, "y": 3.25},
+ {"matrix": [7, 9], "x": 10.75, "y": 3.25},
+ {"matrix": [5, 9], "x": 11.75, "y": 3.25},
+ {"matrix": [1, 2], "x": 12.75, "y": 3.25},
+ {"matrix": [4, 2], "w": 1.25, "x": 13.75, "y": 2.25, "h": 2},
+ {"matrix": [3, 10], "x": 18.5, "y": 3.25},
+ {"matrix": [3, 11], "x": 19.5, "y": 3.25},
+ {"matrix": [3, 14], "x": 20.5, "y": 3.25},
+
+ {"matrix": [3, 13], "w": 1.25, "x": 0, "y": 4.25},
+ {"matrix": [5, 4], "x": 1.25, "y": 4.25},
+ {"matrix": [4, 16], "x": 2.25, "y": 4.25},
+ {"matrix": [4, 4], "x": 3.25, "y": 4.25},
+ {"matrix": [4, 5], "x": 4.25, "y": 4.25},
+ {"matrix": [4, 6], "x": 5.25, "y": 4.25},
+ {"matrix": [6, 6], "x": 6.25, "y": 4.25},
+ {"matrix": [6, 7], "x": 7.25, "y": 4.25},
+ {"matrix": [4, 7], "x": 8.25, "y": 4.25},
+ {"matrix": [4, 8], "x": 9.25, "y": 4.25},
+ {"matrix": [4, 3], "x": 10.25, "y": 4.25},
+ {"matrix": [6, 9], "x": 11.25, "y": 4.25},
+ {"matrix": [7, 13], "w": 2.75, "x": 12.25, "y": 4.25},
+ {"matrix": [5, 15], "x": 16.25, "y": 4.25},
+ {"matrix": [7, 10], "x": 18.5, "y": 4.25},
+ {"matrix": [7, 11], "x": 19.5, "y": 4.25},
+ {"matrix": [7, 14], "x": 20.5, "y": 4.25},
+ {"matrix": [7, 15], "x": 21.5, "y": 4.25, "h": 2},
+
+ {"matrix": [2, 1], "w": 1.25, "x": 0, "y": 5.25},
+ {"matrix": [3, 12], "w": 1.25, "x": 1.25, "y": 5.25},
+ {"matrix": [5, 0], "w": 1.25, "x": 2.5, "y": 5.25},
+ {"matrix": [5, 10], "w": 6.25, "x": 3.75, "y": 5.25},
+ {"matrix": [6, 0], "w": 1.25, "x": 10, "y": 5.25},
+ {"matrix": [7, 12], "w": 1.25, "x": 11.25, "y": 5.25},
+ {"matrix": [6, 3], "w": 1.25, "x": 12.5, "y": 5.25},
+ {"matrix": [4, 1], "w": 1.25, "x": 13.75, "y": 5.25},
+ {"matrix": [6, 15], "x": 15.25, "y": 5.25},
+ {"matrix": [6, 10], "x": 16.25, "y": 5.25},
+ {"matrix": [6, 11], "x": 17.25, "y": 5.25},
+ {"matrix": [5, 11], "w": 2, "x": 18.5, "y": 5.25},
+ {"matrix": [5, 14], "x": 20.5, "y": 5.25}
]
}
}
diff --git a/keyboards/handwired/jankrp2040dactyl/keyboard.json b/keyboards/handwired/jankrp2040dactyl/keyboard.json
index 0d155a70bd..485da14b66 100644
--- a/keyboards/handwired/jankrp2040dactyl/keyboard.json
+++ b/keyboards/handwired/jankrp2040dactyl/keyboard.json
@@ -6,9 +6,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "GP0",
"serial": {
- "driver": "vendor"
+ "driver": "vendor",
+ "pin": "GP0"
}
},
diff --git a/keyboards/handwired/onekey/keymaps/battery/config.h b/keyboards/handwired/onekey/keymaps/battery/config.h
new file mode 100644
index 0000000000..8a1c05d436
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/battery/config.h
@@ -0,0 +1,6 @@
+// Copyright 2024 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define BATTERY_PIN ADC_PIN
diff --git a/keyboards/handwired/onekey/keymaps/battery/keymap.c b/keyboards/handwired/onekey/keymaps/battery/keymap.c
new file mode 100644
index 0000000000..74191e83fc
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/battery/keymap.c
@@ -0,0 +1,28 @@
+// Copyright 2024 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+#include "battery.h"
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ LAYOUT_ortho_1x1(KC_A)
+};
+
+void keyboard_post_init_user(void) {
+ // Customise these values to desired behaviour
+ debug_enable=true;
+// debug_matrix=false;
+// debug_keyboard=true;
+// debug_mouse=false;
+
+ battery_init();
+}
+
+void housekeeping_task_user(void) {
+ static uint32_t last = 0;
+ if (timer_elapsed32(last) > 2000) {
+ uprintf("Bat: %d!\n", battery_get_percent());
+
+ last = timer_read32();
+ }
+}
diff --git a/keyboards/handwired/onekey/keymaps/battery/keymap.json b/keyboards/handwired/onekey/keymaps/battery/keymap.json
new file mode 100644
index 0000000000..c641dfe773
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/battery/keymap.json
@@ -0,0 +1,7 @@
+{
+ "config": {
+ "features": {
+ "console": true
+ }
+ }
+}
diff --git a/keyboards/handwired/onekey/keymaps/battery/rules.mk b/keyboards/handwired/onekey/keymaps/battery/rules.mk
new file mode 100644
index 0000000000..06908179ae
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/battery/rules.mk
@@ -0,0 +1 @@
+BATTERY_DRIVER_REQUIRED = yes
diff --git a/keyboards/handwired/onekey/keymaps/via_ci/config.h b/keyboards/handwired/onekey/keymaps/via_ci/config.h
new file mode 100644
index 0000000000..ec6f1e1ec0
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/via_ci/config.h
@@ -0,0 +1,4 @@
+// Copyright 2025 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+#define TRANSIENT_EEPROM_SIZE 160
diff --git a/keyboards/handwired/onekey/keymaps/via_ci/keymap.c b/keyboards/handwired/onekey/keymaps/via_ci/keymap.c
new file mode 100644
index 0000000000..8261fc6329
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/via_ci/keymap.c
@@ -0,0 +1,30 @@
+// Copyright 2025 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include QMK_KEYBOARD_H
+
+enum custom_keycodes {
+ KC_HELLO = SAFE_RANGE,
+};
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ LAYOUT_ortho_1x1(KC_HELLO)
+};
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ switch (keycode) {
+ case KC_HELLO:
+ if (record->event.pressed) {
+ send_string_P("Hello world!");
+ }
+ return false;
+ }
+ return true;
+}
+
+void keyboard_post_init_user(void) {
+ // Customise these values to desired behaviour
+ debug_enable=true;
+ debug_matrix=true;
+ //debug_keyboard=true;
+ //debug_mouse=true;
+}
diff --git a/keyboards/handwired/onekey/keymaps/via_ci/keymap.json b/keyboards/handwired/onekey/keymaps/via_ci/keymap.json
new file mode 100644
index 0000000000..edb78b5742
--- /dev/null
+++ b/keyboards/handwired/onekey/keymaps/via_ci/keymap.json
@@ -0,0 +1,7 @@
+{
+ "config": {
+ "features": {
+ "via": true
+ }
+ }
+}
diff --git a/keyboards/handwired/onekey/teensy_32/rules.mk b/keyboards/handwired/onekey/teensy_32/rules.mk
new file mode 100644
index 0000000000..d5978ba6f5
--- /dev/null
+++ b/keyboards/handwired/onekey/teensy_32/rules.mk
@@ -0,0 +1 @@
+EEPROM_DRIVER = transient
diff --git a/keyboards/handwired/onekey/teensy_lc/rules.mk b/keyboards/handwired/onekey/teensy_lc/rules.mk
index abd2f7fce9..d1a53e95d7 100644
--- a/keyboards/handwired/onekey/teensy_lc/rules.mk
+++ b/keyboards/handwired/onekey/teensy_lc/rules.mk
@@ -1,2 +1,2 @@
USE_CHIBIOS_CONTRIB = yes
-
+EEPROM_DRIVER = transient
diff --git a/keyboards/handwired/ortho_brass/keymaps/default/keymap.c b/keyboards/handwired/ortho_brass/keymaps/default/keymap.c
index fc43167211..47f731c2c9 100644
--- a/keyboards/handwired/ortho_brass/keymaps/default/keymap.c
+++ b/keyboards/handwired/ortho_brass/keymaps/default/keymap.c
@@ -182,9 +182,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
- keymap_config.raw = eeconfig_read_keymap();
+ eeconfig_read_keymap(&keymap_config);
keymap_config.nkro = 1;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
return false;
break;
diff --git a/keyboards/handwired/skakunm_dactyl/keyboard.json b/keyboards/handwired/skakunm_dactyl/keyboard.json
index cc6f70b482..5d87f23f7b 100644
--- a/keyboards/handwired/skakunm_dactyl/keyboard.json
+++ b/keyboards/handwired/skakunm_dactyl/keyboard.json
@@ -29,7 +29,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"processor": "atmega32u4",
"bootloader": "caterina",
diff --git a/keyboards/handwired/splittest/promicro/keyboard.json b/keyboards/handwired/splittest/promicro/keyboard.json
index 8aca1c3de7..93f09a47ca 100644
--- a/keyboards/handwired/splittest/promicro/keyboard.json
+++ b/keyboards/handwired/splittest/promicro/keyboard.json
@@ -8,7 +8,9 @@
"handedness": {
"pin": "F6"
},
- "soft_serial_pin": "D1"
+ "serial": {
+ "pin": "D1"
+ }
},
"ws2812": {
"pin": "D3"
diff --git a/keyboards/handwired/splittest/teensy_2/keyboard.json b/keyboards/handwired/splittest/teensy_2/keyboard.json
index c10b20a173..78d6c5f9a3 100644
--- a/keyboards/handwired/splittest/teensy_2/keyboard.json
+++ b/keyboards/handwired/splittest/teensy_2/keyboard.json
@@ -8,7 +8,9 @@
"handedness": {
"pin": "F0"
},
- "soft_serial_pin": "D1"
+ "serial": {
+ "pin": "D1"
+ }
},
"ws2812": {
"pin": "D3"
diff --git a/keyboards/handwired/symmetric70_proto/promicro/info.json b/keyboards/handwired/symmetric70_proto/promicro/info.json
index f143f518eb..43ecb4c1c0 100644
--- a/keyboards/handwired/symmetric70_proto/promicro/info.json
+++ b/keyboards/handwired/symmetric70_proto/promicro/info.json
@@ -12,7 +12,9 @@
}
},
"split": {
- "soft_serial_pin": "D0"
+ "serial": {
+ "pin": "D0"
+ }
},
"processor": "atmega32u4",
"bootloader": "caterina"
diff --git a/keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json b/keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json
index e5730a4586..37633e5a56 100644
--- a/keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json
+++ b/keyboards/handwired/tractyl_manuform/4x6_right/keyboard.json
@@ -22,7 +22,9 @@
"handedness": {
"pin": "A6"
},
- "soft_serial_pin": "D3",
+ "serial": {
+ "pin": "D3"
+ },
"bootmagic": {
"matrix": [4, 5]
}
diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/arduinomicro/keyboard.json b/keyboards/handwired/tractyl_manuform/5x6_right/arduinomicro/keyboard.json
index df810f2881..bd4c41e17b 100644
--- a/keyboards/handwired/tractyl_manuform/5x6_right/arduinomicro/keyboard.json
+++ b/keyboards/handwired/tractyl_manuform/5x6_right/arduinomicro/keyboard.json
@@ -6,7 +6,9 @@
},
"diode_direction": "COL2ROW",
"split": {
- "soft_serial_pin": "D0",
+ "serial": {
+ "pin": "D0"
+ },
"matrix_pins": {
"right": {
"cols": ["D6", "D7", "B4", "D3", "C6", "C7"],
diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/elite_c/keyboard.json b/keyboards/handwired/tractyl_manuform/5x6_right/elite_c/keyboard.json
index e6c0e42bde..739aad07ba 100644
--- a/keyboards/handwired/tractyl_manuform/5x6_right/elite_c/keyboard.json
+++ b/keyboards/handwired/tractyl_manuform/5x6_right/elite_c/keyboard.json
@@ -11,7 +11,9 @@
]
},
"split": {
- "soft_serial_pin": "D2"
+ "serial": {
+ "pin": "D2"
+ }
},
"ws2812": {
"pin": "D3"
diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/teensy2pp/keyboard.json b/keyboards/handwired/tractyl_manuform/5x6_right/teensy2pp/keyboard.json
index a131ac085b..5a091996b6 100644
--- a/keyboards/handwired/tractyl_manuform/5x6_right/teensy2pp/keyboard.json
+++ b/keyboards/handwired/tractyl_manuform/5x6_right/teensy2pp/keyboard.json
@@ -11,7 +11,9 @@
]
},
"split": {
- "soft_serial_pin": "D2"
+ "serial": {
+ "pin": "D2"
+ }
},
"ws2812": {
"pin": "E7"
diff --git a/keyboards/helix/pico/info.json b/keyboards/helix/pico/info.json
index d4fabc756e..7909bb0b30 100644
--- a/keyboards/helix/pico/info.json
+++ b/keyboards/helix/pico/info.json
@@ -10,7 +10,9 @@
},
"split": {
"enabled": true,
- "soft_serial_pin": "D2"
+ "serial": {
+ "pin": "D2"
+ }
},
"tapping": {
"term": 100
diff --git a/keyboards/helix/rev2/info.json b/keyboards/helix/rev2/info.json
index fd829782c0..a8bdb23e41 100644
--- a/keyboards/helix/rev2/info.json
+++ b/keyboards/helix/rev2/info.json
@@ -15,7 +15,9 @@
"diode_direction": "COL2ROW",
"split": {
"enabled": true,
- "soft_serial_pin": "D2",
+ "serial": {
+ "pin": "D2"
+ },
"transport": {
"sync": {
"indicators": true,
diff --git a/keyboards/helix/rev2/rev2.c b/keyboards/helix/rev2/rev2.c
index ded22bbe93..7502ad0552 100644
--- a/keyboards/helix/rev2/rev2.c
+++ b/keyboards/helix/rev2/rev2.c
@@ -32,7 +32,7 @@ void set_mac_mode_kb(bool macmode) {
* https://github.com/qmk/qmk_firmware/blob/fb4a6ad30ea7a648acd59793ed4a30c3a8d8dc32/quantum/process_keycode/process_magic.c#L80-L81
*/
keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = !macmode;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
void matrix_init_kb(void) {
diff --git a/keyboards/helix/rev3_4rows/keyboard.json b/keyboards/helix/rev3_4rows/keyboard.json
index 5e9fd2dcd8..537c332d5c 100644
--- a/keyboards/helix/rev3_4rows/keyboard.json
+++ b/keyboards/helix/rev3_4rows/keyboard.json
@@ -33,7 +33,9 @@
},
"split": {
"enabled": true,
- "soft_serial_pin": "D2"
+ "serial": {
+ "pin": "D2"
+ }
},
"ws2812": {
"pin": "D3"
diff --git a/keyboards/helix/rev3_4rows/rev3_4rows.c b/keyboards/helix/rev3_4rows/rev3_4rows.c
index ff61027a96..7f655b6852 100644
--- a/keyboards/helix/rev3_4rows/rev3_4rows.c
+++ b/keyboards/helix/rev3_4rows/rev3_4rows.c
@@ -27,7 +27,7 @@ void set_mac_mode(bool macmode) {
* https://github.com/qmk/qmk_firmware/blob/fb4a6ad30ea7a648acd59793ed4a30c3a8d8dc32/quantum/process_keycode/process_magic.c#L80-L81
*/
keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = !macmode;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
#ifdef DIP_SWITCH_ENABLE
diff --git a/keyboards/helix/rev3_5rows/keyboard.json b/keyboards/helix/rev3_5rows/keyboard.json
index b61db7df86..485cfd924f 100644
--- a/keyboards/helix/rev3_5rows/keyboard.json
+++ b/keyboards/helix/rev3_5rows/keyboard.json
@@ -99,7 +99,9 @@
},
"split": {
"enabled": true,
- "soft_serial_pin": "D2"
+ "serial": {
+ "pin": "D2"
+ }
},
"ws2812": {
"pin": "D3"
diff --git a/keyboards/helix/rev3_5rows/rev3_5rows.c b/keyboards/helix/rev3_5rows/rev3_5rows.c
index 28fa314a7b..af7276a2b5 100644
--- a/keyboards/helix/rev3_5rows/rev3_5rows.c
+++ b/keyboards/helix/rev3_5rows/rev3_5rows.c
@@ -27,7 +27,7 @@ void set_mac_mode(bool macmode) {
* https://github.com/qmk/qmk_firmware/blob/fb4a6ad30ea7a648acd59793ed4a30c3a8d8dc32/quantum/process_keycode/process_magic.c#L80-L81
*/
keymap_config.swap_lalt_lgui = keymap_config.swap_ralt_rgui = !macmode;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
#ifdef DIP_SWITCH_ENABLE
diff --git a/keyboards/horrortroll/nyx/rev1/lib/startup_swirl_anim.h b/keyboards/horrortroll/nyx/rev1/lib/startup_swirl_anim.h
index f26f07fe12..87e2e813a4 100644
--- a/keyboards/horrortroll/nyx/rev1/lib/startup_swirl_anim.h
+++ b/keyboards/horrortroll/nyx/rev1/lib/startup_swirl_anim.h
@@ -18,6 +18,7 @@
#include <string.h>
#include <math.h>
#include <lib/lib8tion/lib8tion.h>
+#include "eeconfig.h"
#define LED_TRAIL 10
@@ -105,7 +106,7 @@ static void swirl_set_color(hsv_t hsv) {
traverse_matrix();
if (!(top <= bottom && left <= right)) {
- eeprom_read_block(&rgb_matrix_config, EECONFIG_RGB_MATRIX, sizeof(rgb_matrix_config));
+ eeconfig_read_rgb_matrix(&rgb_matrix_config);
rgb_matrix_mode_noeeprom(rgb_matrix_config.mode);
return;
}
diff --git a/keyboards/ibm/model_m_4th_gen/overnumpad_1xb/board.h b/keyboards/ibm/model_m_4th_gen/overnumpad_1xb/board.h
new file mode 100644
index 0000000000..5b80eb2230
--- /dev/null
+++ b/keyboards/ibm/model_m_4th_gen/overnumpad_1xb/board.h
@@ -0,0 +1,8 @@
+// Copyright 2020 Purdea Andrei
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/ibm/model_m_4th_gen/overnumpad_1xb/config.h b/keyboards/ibm/model_m_4th_gen/overnumpad_1xb/config.h
index 71e60e9cfe..c10d26b9b2 100644
--- a/keyboards/ibm/model_m_4th_gen/overnumpad_1xb/config.h
+++ b/keyboards/ibm/model_m_4th_gen/overnumpad_1xb/config.h
@@ -21,8 +21,6 @@
#define SERIAL_NUMBER DEF_SERIAL_NUMBER
#endif
-#define STM32_HSECLK 16000000
-
#define SOLENOID_PIN B5
#define HAPTIC_ENABLE_PIN C13
#define SOLENOID_DEFAULT_DWELL 20
diff --git a/keyboards/icebreaker/hotswap/keyboard.json b/keyboards/icebreaker/hotswap/keyboard.json
new file mode 100644
index 0000000000..ab55c5ae5f
--- /dev/null
+++ b/keyboards/icebreaker/hotswap/keyboard.json
@@ -0,0 +1,240 @@
+{
+ "manufacturer": "Serene Studio",
+ "keyboard_name": "Icebreaker HS",
+ "maintainer": "Matthijs Muller",
+ "bootloader": "rp2040",
+ "diode_direction": "COL2ROW",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "GP26", "pin_b": "GP27"}
+ ]
+ },
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "encoder": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "cols": ["GP24", "GP19", "GP18", "GP17", "GP29", "GP0", "GP12", "GP11", "GP10", "GP7", "GP6", "GP5", "GP4", "GP3", "GP2"],
+ "rows": ["GP25", "GP22", "GP28", "GP23", "GP1"]
+ },
+ "processor": "RP2040",
+ "qmk": {
+ "locking": {
+ "enabled": true,
+ "resync": true
+ }
+ },
+ "rgb_matrix": {
+ "animations": {
+ "alphas_mods": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_sat": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "band_val": true,
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "cycle_up_down": true,
+ "digital_rain": true,
+ "dual_beacon": true,
+ "fractal": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "jellybean_raindrops": true,
+ "multisplash": true,
+ "pixel_flow": true,
+ "pixel_rain": true,
+ "rainbow_beacon": true,
+ "rainbow_moving_chevron": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "solid_multisplash": true,
+ "solid_reactive": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_multinexus": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_wide": true,
+ "solid_splash": true,
+ "splash": true,
+ "typing_heatmap": true
+ },
+ "default": {
+ "sat": 100,
+ "val": 80
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4},
+ {"matrix": [0, 1], "x": 16, "y": 0, "flags": 4},
+ {"matrix": [0, 2], "x": 32, "y": 0, "flags": 4},
+ {"matrix": [0, 3], "x": 48, "y": 0, "flags": 4},
+ {"matrix": [0, 4], "x": 64, "y": 0, "flags": 4},
+ {"matrix": [0, 5], "x": 80, "y": 0, "flags": 4},
+ {"matrix": [0, 6], "x": 96, "y": 0, "flags": 4},
+ {"matrix": [0, 7], "x": 112, "y": 0, "flags": 4},
+ {"matrix": [0, 8], "x": 128, "y": 0, "flags": 4},
+ {"matrix": [0, 9], "x": 144, "y": 0, "flags": 4},
+ {"matrix": [0, 10], "x": 160, "y": 0, "flags": 4},
+ {"matrix": [0, 11], "x": 176, "y": 0, "flags": 4},
+ {"matrix": [0, 12], "x": 192, "y": 0, "flags": 4},
+ {"matrix": [0, 13], "x": 208, "y": 0, "flags": 4},
+ {"matrix": [2, 13], "x": 224, "y": 0, "flags": 4},
+ {"matrix": [0, 14], "x": 240, "y": 0, "flags": 4},
+ {"matrix": [1, 14], "x": 0, "y": 16, "flags": 4},
+ {"matrix": [1, 13], "x": 24, "y": 16, "flags": 4},
+ {"matrix": [1, 12], "x": 40, "y": 16, "flags": 4},
+ {"matrix": [1, 11], "x": 56, "y": 16, "flags": 4},
+ {"matrix": [1, 10], "x": 72, "y": 16, "flags": 4},
+ {"matrix": [1, 9], "x": 88, "y": 16, "flags": 4},
+ {"matrix": [1, 8], "x": 104, "y": 16, "flags": 4},
+ {"matrix": [1, 7], "x": 120, "y": 16, "flags": 4},
+ {"matrix": [1, 6], "x": 136, "y": 16, "flags": 4},
+ {"matrix": [1, 5], "x": 152, "y": 16, "flags": 4},
+ {"matrix": [1, 4], "x": 168, "y": 16, "flags": 4},
+ {"matrix": [1, 3], "x": 184, "y": 16, "flags": 4},
+ {"matrix": [1, 2], "x": 200, "y": 16, "flags": 4},
+ {"matrix": [1, 1], "x": 216, "y": 16, "flags": 4},
+ {"matrix": [1, 0], "x": 240, "y": 16, "flags": 4},
+ {"matrix": [2, 0], "x": 0, "y": 32, "flags": 4},
+ {"matrix": [2, 1], "x": 28, "y": 32, "flags": 4},
+ {"matrix": [2, 2], "x": 44, "y": 32, "flags": 4},
+ {"matrix": [2, 3], "x": 60, "y": 32, "flags": 4},
+ {"matrix": [2, 4], "x": 76, "y": 32, "flags": 4},
+ {"matrix": [2, 5], "x": 92, "y": 32, "flags": 4},
+ {"matrix": [2, 6], "x": 108, "y": 32, "flags": 4},
+ {"matrix": [2, 7], "x": 124, "y": 32, "flags": 4},
+ {"matrix": [2, 8], "x": 140, "y": 32, "flags": 4},
+ {"matrix": [2, 9], "x": 156, "y": 32, "flags": 4},
+ {"matrix": [2, 10], "x": 172, "y": 32, "flags": 4},
+ {"matrix": [2, 11], "x": 188, "y": 32, "flags": 4},
+ {"matrix": [2, 12], "x": 204, "y": 32, "flags": 4},
+ {"matrix": [2, 14], "x": 240, "y": 32, "flags": 4},
+ {"matrix": [3, 14], "x": 0, "y": 48, "flags": 4},
+ {"matrix": [3, 13], "x": 36, "y": 48, "flags": 4},
+ {"matrix": [3, 12], "x": 52, "y": 48, "flags": 4},
+ {"matrix": [3, 11], "x": 68, "y": 48, "flags": 4},
+ {"matrix": [3, 10], "x": 84, "y": 48, "flags": 4},
+ {"matrix": [3, 9], "x": 100, "y": 48, "flags": 4},
+ {"matrix": [3, 8], "x": 116, "y": 48, "flags": 4},
+ {"matrix": [3, 7], "x": 132, "y": 48, "flags": 4},
+ {"matrix": [3, 6], "x": 148, "y": 48, "flags": 4},
+ {"matrix": [3, 5], "x": 164, "y": 48, "flags": 4},
+ {"matrix": [3, 4], "x": 180, "y": 48, "flags": 4},
+ {"matrix": [3, 3], "x": 196, "y": 48, "flags": 4},
+ {"matrix": [3, 2], "x": 224, "y": 48, "flags": 4},
+ {"matrix": [3, 0], "x": 240, "y": 48, "flags": 4},
+ {"matrix": [4, 0], "x": 0, "y": 64, "flags": 4},
+ {"matrix": [4, 1], "x": 24, "y": 64, "flags": 4},
+ {"matrix": [4, 6], "x": 48, "y": 64, "flags": 4},
+ {"matrix": [4, 10], "x": 160, "y": 64, "flags": 4},
+ {"matrix": [4, 11], "x": 184, "y": 64, "flags": 4},
+ {"matrix": [4, 12], "x": 208, "y": 64, "flags": 4},
+ {"matrix": [4, 13], "x": 224, "y": 64, "flags": 4},
+ {"matrix": [4, 14], "x": 240, "y": 64, "flags": 4}
+ ],
+ "max_brightness": 120
+ },
+ "url": "",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x6503",
+ "vid": "0x5363"
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP13"
+ },
+ "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": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [2, 13], "x": 14, "y": 0},
+ {"matrix": [0, 14], "x": 15, "y": 0},
+ {"label": "encoder", "matrix": [3, 1], "x": 16, "y": 0, "encoder": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"matrix": [1, 14], "x": 15, "y": 1},
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
+ {"matrix": [2, 14], "x": 15, "y": 2},
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 2], "x": 2.25, "y": 3},
+ {"matrix": [3, 3], "x": 3.25, "y": 3},
+ {"matrix": [3, 4], "x": 4.25, "y": 3},
+ {"matrix": [3, 5], "x": 5.25, "y": 3},
+ {"matrix": [3, 6], "x": 6.25, "y": 3},
+ {"matrix": [3, 7], "x": 7.25, "y": 3},
+ {"matrix": [3, 8], "x": 8.25, "y": 3},
+ {"matrix": [3, 9], "x": 9.25, "y": 3},
+ {"matrix": [3, 10], "x": 10.25, "y": 3},
+ {"matrix": [3, 11], "x": 11.25, "y": 3},
+ {"matrix": [3, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [3, 14], "x": 15, "y": 3},
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4, "w": 1},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 10], "x": 11, "y": 4},
+ {"matrix": [4, 11], "x": 12, "y": 4},
+ {"matrix": [4, 12], "x": 13, "y": 4},
+ {"matrix": [4, 13], "x": 14, "y": 4},
+ {"matrix": [4, 14], "x": 15, "y": 4}
+ ]
+ }
+ }
+}
diff --git a/keyboards/icebreaker/hotswap/keymaps/default/keymap.c b/keyboards/icebreaker/hotswap/keymaps/default/keymap.c
new file mode 100644
index 0000000000..058210fff4
--- /dev/null
+++ b/keyboards/icebreaker/hotswap/keymaps/default/keymap.c
@@ -0,0 +1,43 @@
+/*
+Copyright 2024 Matthijs Muller
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+
+ [0] = LAYOUT(
+ KC_ESC, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSLS, KC_DEL, KC_GRV, KC_MUTE,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSPC, KC_PGUP,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_PGDN,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, MO(1),
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RGUI, MO(1), KC_LEFT, KC_DOWN, KC_RGHT
+ ),
+
+ [1] = LAYOUT(
+ _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, RM_TOGG, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_HOME,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_END,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_MPLY, KC_VOLU, _______,
+ _______, _______, _______, _______, _______, _______, KC_MPRV, KC_VOLD, KC_MNXT
+ )
+};
+
+#if defined(ENCODER_MAP_ENABLE)
+const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
+ [0] = { ENCODER_CCW_CW(KC_VOLD, KC_VOLU) },
+ [1] = { ENCODER_CCW_CW(RM_SATD, RM_SATU) },
+};
+#endif
diff --git a/keyboards/icebreaker/hotswap/keymaps/default/rules.mk b/keyboards/icebreaker/hotswap/keymaps/default/rules.mk
new file mode 100644
index 0000000000..ee32568148
--- /dev/null
+++ b/keyboards/icebreaker/hotswap/keymaps/default/rules.mk
@@ -0,0 +1 @@
+ENCODER_MAP_ENABLE = yes
diff --git a/keyboards/icebreaker/readme.md b/keyboards/icebreaker/readme.md
new file mode 100644
index 0000000000..439756f1b3
--- /dev/null
+++ b/keyboards/icebreaker/readme.md
@@ -0,0 +1,26 @@
+# Icebreaker
+
+![Icebreaker](https://i.imgur.com/vSRfEOD.png)
+
+
+
+* Keyboard Maintainer: [Matthijs Muller](https://github.com/SmollChungus)
+* Hardware Supported: Icebreaker Hotswap PCB
+
+Make example for this keyboard (after setting up your build environment):
+
+ make icebreaker:default
+
+Flashing example for this keyboard:
+
+ make icebreaker: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 (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
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available \ No newline at end of file
diff --git a/keyboards/inland/kb83/kb83.c b/keyboards/inland/kb83/kb83.c
index 1052131a91..41a3ad8df7 100644
--- a/keyboards/inland/kb83/kb83.c
+++ b/keyboards/inland/kb83/kb83.c
@@ -317,7 +317,7 @@ bool dip_switch_update_kb(uint8_t index, bool active) {
}
if(active){
keymap_config.no_gui = 0;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
return true;
}
diff --git a/keyboards/jian/keymaps/advanced/keymap.c b/keyboards/jian/keymaps/advanced/keymap.c
index eaf57cdd78..e3e58a0e9f 100644
--- a/keyboards/jian/keymaps/advanced/keymap.c
+++ b/keyboards/jian/keymaps/advanced/keymap.c
@@ -472,9 +472,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
- keymap_config.raw = eeconfig_read_keymap();
+ eeconfig_read_keymap(&keymap_config);
keymap_config.nkro = 1;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
return false;
case EXT_PLV:
diff --git a/keyboards/keychron/c1_pro_v2/board.h b/keyboards/keychron/c1_pro_v2/board.h
new file mode 100644
index 0000000000..e6cf0b2856
--- /dev/null
+++ b/keyboards/keychron/c1_pro_v2/board.h
@@ -0,0 +1,8 @@
+// Copyright 2025 @ Keychron (https://www.keychron.com)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/keychron/c1_pro_v2/mcuconf.h b/keyboards/keychron/c1_pro_v2/mcuconf.h
index ca470fb5b3..95966a32ce 100644
--- a/keyboards/keychron/c1_pro_v2/mcuconf.h
+++ b/keyboards/keychron/c1_pro_v2/mcuconf.h
@@ -18,9 +18,6 @@
#include_next <mcuconf.h>
-#undef STM32_HSECLK
-#define STM32_HSECLK 16000000U
-
#undef STM32_PLLM_VALUE
#define STM32_PLLM_VALUE 8
diff --git a/keyboards/keychron/c2_pro_v2/board.h b/keyboards/keychron/c2_pro_v2/board.h
new file mode 100644
index 0000000000..e6cf0b2856
--- /dev/null
+++ b/keyboards/keychron/c2_pro_v2/board.h
@@ -0,0 +1,8 @@
+// Copyright 2025 @ Keychron (https://www.keychron.com)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/keychron/c2_pro_v2/mcuconf.h b/keyboards/keychron/c2_pro_v2/mcuconf.h
index ca470fb5b3..95966a32ce 100644
--- a/keyboards/keychron/c2_pro_v2/mcuconf.h
+++ b/keyboards/keychron/c2_pro_v2/mcuconf.h
@@ -18,9 +18,6 @@
#include_next <mcuconf.h>
-#undef STM32_HSECLK
-#define STM32_HSECLK 16000000U
-
#undef STM32_PLLM_VALUE
#define STM32_PLLM_VALUE 8
diff --git a/keyboards/keychron/c3_pro/board.h b/keyboards/keychron/c3_pro/board.h
new file mode 100644
index 0000000000..60d25b93b8
--- /dev/null
+++ b/keyboards/keychron/c3_pro/board.h
@@ -0,0 +1,8 @@
+// Copyright 2024 @ Keychron (https://www.keychron.com)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/keychron/c3_pro/mcuconf.h b/keyboards/keychron/c3_pro/mcuconf.h
index b2b81df855..ad75926a14 100644
--- a/keyboards/keychron/c3_pro/mcuconf.h
+++ b/keyboards/keychron/c3_pro/mcuconf.h
@@ -18,9 +18,6 @@
#include_next <mcuconf.h>
-#undef STM32_HSECLK
-#define STM32_HSECLK 16000000U
-
#undef STM32_PLLM_VALUE
#define STM32_PLLM_VALUE 8
diff --git a/keyboards/keycult/keycult1800/keyboard.json b/keyboards/keycult/keycult1800/keyboard.json
index a50b77d104..8ed6e6e2fa 100644
--- a/keyboards/keycult/keycult1800/keyboard.json
+++ b/keyboards/keycult/keycult1800/keyboard.json
@@ -96,7 +96,8 @@
{ "matrix": [3, 15], "x": 16.5, "y": 3.5 },
{ "matrix": [3, 16], "x": 17.5, "y": 3.5 },
{ "matrix": [3, 17], "x": 18.5, "y": 3.5 },
- { "matrix": [4, 0], "w": 2.25, "x": 0, "y": 4.5 },
+ { "matrix": [4, 0], "w": 1.25, "x": 0, "y": 4.5 },
+ { "matrix": [4, 1], "x": 1.25, "y": 4.5 },
{ "matrix": [4, 2], "x": 2.25, "y": 4.5 },
{ "matrix": [4, 3], "x": 3.25, "y": 4.5 },
{ "matrix": [4, 4], "x": 4.25, "y": 4.5 },
diff --git a/keyboards/keycult/keycult1800/keymaps/default/keymap.c b/keyboards/keycult/keycult1800/keymaps/default/keymap.c
index e596ff2db0..79570b73a2 100644
--- a/keyboards/keycult/keycult1800/keymaps/default/keymap.c
+++ b/keyboards/keycult/keycult1800/keymaps/default/keymap.c
@@ -21,7 +21,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_NUM, KC_PSLS, KC_PAST, KC_PMNS,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_P7, KC_P8, KC_P9, KC_PPLS,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT, KC_P4, KC_P5, KC_P6, KC_PPLS,
- KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
+ KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP, KC_P1, KC_P2, KC_P3, KC_PENT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT, KC_P0, KC_PDOT, KC_PENT),
[1] = LAYOUT( /* FN */
@@ -29,7 +29,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
- _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
+ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______),
};
diff --git a/keyboards/keyten/kt60hs_t/info.json b/keyboards/keyten/kt60hs_t/info.json
new file mode 100644
index 0000000000..97b4f7d222
--- /dev/null
+++ b/keyboards/keyten/kt60hs_t/info.json
@@ -0,0 +1,14 @@
+{
+ "manufacturer": "keyten",
+ "keyboard_name": "kt60HS-T",
+ "maintainer": "key10iq",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "usb": {
+ "vid": "0xEB69"
+ }
+}
diff --git a/keyboards/keyten/kt60hs_t/readme.md b/keyboards/keyten/kt60hs_t/readme.md
index 75ccbc3b69..eb02f6bb8f 100644
--- a/keyboards/keyten/kt60hs_t/readme.md
+++ b/keyboards/keyten/kt60hs_t/readme.md
@@ -2,30 +2,15 @@
60% MX Hot-Swap Tsangan PCB
-![kt60HS-T image](https://i.imgur.com/Iqrf6tHh.jpg)
-
-* Keyboard Maintainer: [keyten](https://github.com/key10iq)
-* Hardware Supported: keyten kt60HS-T
-* Hardware Availability: private GB
+![kt60HS-T image](https://i.imgur.com/vM32aoX.jpeg)
Supports:
1. Split Backspace
2. Stepped Caps Lock
-Make example for this keyboard (after setting up your build environment):
-
- make keyten/kt60hs_t:default
-
-Flashing example for this keyboard:
-
- make keyten/kt60hs_t: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:
+There are two versions of the PCB available.
-* Bootmagic reset: Hold down the key at (0,0) in the matrix (usually the top left key or Escape) and plug in the keyboard
-* Keycode in layout: Press the key mapped to `QK_BOOT` if it is available
-* Physical reset button: Hold the button on the back of the PCB
+|Version| Features |
+|-------|-------------------------------------------|
+|v1 |Blue/Purple PCB / ARM STM32F401 controller |
+|v2 |Purple PCB / ARM STM32F072 controller |
diff --git a/keyboards/keyten/kt60hs_t/keyboard.json b/keyboards/keyten/kt60hs_t/v1/keyboard.json
index 63a755d698..b5b90304b2 100644
--- a/keyboards/keyten/kt60hs_t/keyboard.json
+++ b/keyboards/keyten/kt60hs_t/v1/keyboard.json
@@ -1,17 +1,6 @@
{
- "manufacturer": "keyten",
- "keyboard_name": "kt60HS-T",
- "maintainer": "key10iq",
"bootloader": "stm32-dfu",
"diode_direction": "COL2ROW",
- "features": {
- "bootmagic": true,
- "command": false,
- "console": false,
- "extrakey": true,
- "mousekey": true,
- "nkro": true
- },
"matrix_pins": {
"cols": ["A3", "A4", "A5", "A6", "A7", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "A15", "A14"],
"rows": ["B15", "B14", "B12", "B13", "B0"]
@@ -19,8 +8,7 @@
"processor": "STM32F401",
"usb": {
"device_version": "0.0.1",
- "pid": "0x6004",
- "vid": "0xEB69"
+ "pid": "0x6004"
},
"community_layouts": [
"60_ansi_wkl_split_bs_rshift",
@@ -28,7 +16,8 @@
"60_ansi_tsangan_split_bs_rshift"
],
"layout_aliases": {
- "LAYOUT_60_tsangan_hhkb": "LAYOUT_60_ansi_tsangan_split_bs_rshift"
+ "LAYOUT_60_tsangan_hhkb": "LAYOUT_60_ansi_tsangan_split_bs_rshift",
+ "LAYOUT_all": "LAYOUT_60_ansi_tsangan_split_bs_rshift"
},
"layouts": {
"LAYOUT_60_ansi_wkl_split_bs_rshift": {
@@ -224,6 +213,71 @@
{"matrix": [4, 11], "x": 12.5, "y": 4},
{"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
]
+ },
+ "LAYOUT_60_ansi_tsangan_split_rshift": {
+ "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": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [2, 13], "x": 13, "y": 0, "w": 2},
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 1], "x": 2.25, "y": 3},
+ {"matrix": [3, 2], "x": 3.25, "y": 3},
+ {"matrix": [3, 3], "x": 4.25, "y": 3},
+ {"matrix": [3, 4], "x": 5.25, "y": 3},
+ {"matrix": [3, 5], "x": 6.25, "y": 3},
+ {"matrix": [3, 6], "x": 7.25, "y": 3},
+ {"matrix": [3, 7], "x": 8.25, "y": 3},
+ {"matrix": [3, 8], "x": 9.25, "y": 3},
+ {"matrix": [3, 9], "x": 10.25, "y": 3},
+ {"matrix": [3, 10], "x": 11.25, "y": 3},
+ {"matrix": [4, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 11], "x": 12.5, "y": 4},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
}
}
}
diff --git a/keyboards/keyten/kt60hs_t/v1/readme.md b/keyboards/keyten/kt60hs_t/v1/readme.md
new file mode 100644
index 0000000000..2f31dbf4bf
--- /dev/null
+++ b/keyboards/keyten/kt60hs_t/v1/readme.md
@@ -0,0 +1,29 @@
+# keyten kt60HS-T V1
+
+60% MX Hot-Swap Tsangan PCB
+
+![kt60HS-T image](https://i.imgur.com/tOej7ND.jpeg)
+
+**Note: This firmware only supports the PCB version with STM32F401 controller**
+
+* Keyboard Maintainer: [keyten](https://github.com/key10iq)
+* Hardware Supported: keyten kt60HS-T
+* Hardware Availability: private GB
+
+Make example for this keyboard (after setting up your build environment):
+
+ make keyten/kt60hs_t/v1:default
+
+Flashing example for this keyboard:
+
+ make keyten/kt60hs_t/v1: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 (usually the top left key or Escape) and plug in the keyboard
+* Keycode in layout: Press the key mapped to `QK_BOOT` if it is available
+* Physical reset button: Hold the button on the back of the PCB
diff --git a/keyboards/keyten/kt60hs_t/v2/keyboard.json b/keyboards/keyten/kt60hs_t/v2/keyboard.json
new file mode 100644
index 0000000000..728bd90fe8
--- /dev/null
+++ b/keyboards/keyten/kt60hs_t/v2/keyboard.json
@@ -0,0 +1,282 @@
+{
+ "bootloader": "stm32-dfu",
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "cols": ["A3", "A4", "A5", "A6", "A7", "B9", "B8", "B7", "B6", "B5", "B4", "B3", "A15", "A14"],
+ "rows": ["B15", "B14", "B12", "B13", "B0"]
+ },
+ "processor": "STM32F072",
+ "usb": {
+ "device_version": "2.0.0",
+ "pid": "0x6007"
+ },
+ "community_layouts": [
+ "60_ansi_wkl_split_bs_rshift",
+ "60_hhkb",
+ "60_ansi_tsangan_split_bs_rshift"
+ ],
+ "layout_aliases": {
+ "LAYOUT_all": "LAYOUT_60_ansi_tsangan_split_bs_rshift"
+ },
+ "layouts": {
+ "LAYOUT_60_ansi_wkl_split_bs_rshift": {
+ "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": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [2, 13], "x": 14, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 1], "x": 2.25, "y": 3},
+ {"matrix": [3, 2], "x": 3.25, "y": 3},
+ {"matrix": [3, 3], "x": 4.25, "y": 3},
+ {"matrix": [3, 4], "x": 5.25, "y": 3},
+ {"matrix": [3, 5], "x": 6.25, "y": 3},
+ {"matrix": [3, 6], "x": 7.25, "y": 3},
+ {"matrix": [3, 7], "x": 8.25, "y": 3},
+ {"matrix": [3, 8], "x": 9.25, "y": 3},
+ {"matrix": [3, 9], "x": 10.25, "y": 3},
+ {"matrix": [3, 10], "x": 11.25, "y": 3},
+ {"matrix": [4, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_hhkb": {
+ "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": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [2, 13], "x": 14, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 1], "x": 2.25, "y": 3},
+ {"matrix": [3, 2], "x": 3.25, "y": 3},
+ {"matrix": [3, 3], "x": 4.25, "y": 3},
+ {"matrix": [3, 4], "x": 5.25, "y": 3},
+ {"matrix": [3, 5], "x": 6.25, "y": 3},
+ {"matrix": [3, 6], "x": 7.25, "y": 3},
+ {"matrix": [3, 7], "x": 8.25, "y": 3},
+ {"matrix": [3, 8], "x": 9.25, "y": 3},
+ {"matrix": [3, 9], "x": 10.25, "y": 3},
+ {"matrix": [3, 10], "x": 11.25, "y": 3},
+ {"matrix": [4, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 11], "x": 12.5, "y": 4}
+ ]
+ },
+ "LAYOUT_60_ansi_tsangan_split_bs_rshift": {
+ "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": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [2, 13], "x": 14, "y": 0},
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 1], "x": 2.25, "y": 3},
+ {"matrix": [3, 2], "x": 3.25, "y": 3},
+ {"matrix": [3, 3], "x": 4.25, "y": 3},
+ {"matrix": [3, 4], "x": 5.25, "y": 3},
+ {"matrix": [3, 5], "x": 6.25, "y": 3},
+ {"matrix": [3, 6], "x": 7.25, "y": 3},
+ {"matrix": [3, 7], "x": 8.25, "y": 3},
+ {"matrix": [3, 8], "x": 9.25, "y": 3},
+ {"matrix": [3, 9], "x": 10.25, "y": 3},
+ {"matrix": [3, 10], "x": 11.25, "y": 3},
+ {"matrix": [4, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 11], "x": 12.5, "y": 4},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ },
+ "LAYOUT_60_ansi_tsangan_split_rshift": {
+ "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": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [2, 13], "x": 13, "y": 0, "w": 2},
+ {"matrix": [1, 0], "x": 0, "y": 1, "w": 1.5},
+ {"matrix": [1, 1], "x": 1.5, "y": 1},
+ {"matrix": [1, 2], "x": 2.5, "y": 1},
+ {"matrix": [1, 3], "x": 3.5, "y": 1},
+ {"matrix": [1, 4], "x": 4.5, "y": 1},
+ {"matrix": [1, 5], "x": 5.5, "y": 1},
+ {"matrix": [1, 6], "x": 6.5, "y": 1},
+ {"matrix": [1, 7], "x": 7.5, "y": 1},
+ {"matrix": [1, 8], "x": 8.5, "y": 1},
+ {"matrix": [1, 9], "x": 9.5, "y": 1},
+ {"matrix": [1, 10], "x": 10.5, "y": 1},
+ {"matrix": [1, 11], "x": 11.5, "y": 1},
+ {"matrix": [1, 12], "x": 12.5, "y": 1},
+ {"matrix": [1, 13], "x": 13.5, "y": 1, "w": 1.5},
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.75},
+ {"matrix": [2, 1], "x": 1.75, "y": 2},
+ {"matrix": [2, 2], "x": 2.75, "y": 2},
+ {"matrix": [2, 3], "x": 3.75, "y": 2},
+ {"matrix": [2, 4], "x": 4.75, "y": 2},
+ {"matrix": [2, 5], "x": 5.75, "y": 2},
+ {"matrix": [2, 6], "x": 6.75, "y": 2},
+ {"matrix": [2, 7], "x": 7.75, "y": 2},
+ {"matrix": [2, 8], "x": 8.75, "y": 2},
+ {"matrix": [2, 9], "x": 9.75, "y": 2},
+ {"matrix": [2, 10], "x": 10.75, "y": 2},
+ {"matrix": [2, 11], "x": 11.75, "y": 2},
+ {"matrix": [2, 12], "x": 12.75, "y": 2, "w": 2.25},
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 2.25},
+ {"matrix": [3, 1], "x": 2.25, "y": 3},
+ {"matrix": [3, 2], "x": 3.25, "y": 3},
+ {"matrix": [3, 3], "x": 4.25, "y": 3},
+ {"matrix": [3, 4], "x": 5.25, "y": 3},
+ {"matrix": [3, 5], "x": 6.25, "y": 3},
+ {"matrix": [3, 6], "x": 7.25, "y": 3},
+ {"matrix": [3, 7], "x": 8.25, "y": 3},
+ {"matrix": [3, 8], "x": 9.25, "y": 3},
+ {"matrix": [3, 9], "x": 10.25, "y": 3},
+ {"matrix": [3, 10], "x": 11.25, "y": 3},
+ {"matrix": [4, 12], "x": 12.25, "y": 3, "w": 1.75},
+ {"matrix": [3, 13], "x": 14, "y": 3},
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.5},
+ {"matrix": [4, 1], "x": 1.5, "y": 4},
+ {"matrix": [4, 2], "x": 2.5, "y": 4, "w": 1.5},
+ {"matrix": [4, 6], "x": 4, "y": 4, "w": 7},
+ {"matrix": [4, 10], "x": 11, "y": 4, "w": 1.5},
+ {"matrix": [4, 11], "x": 12.5, "y": 4},
+ {"matrix": [4, 13], "x": 13.5, "y": 4, "w": 1.5}
+ ]
+ }
+ }
+}
diff --git a/keyboards/keyten/kt60hs_t/v2/readme.md b/keyboards/keyten/kt60hs_t/v2/readme.md
new file mode 100644
index 0000000000..db2b8afccf
--- /dev/null
+++ b/keyboards/keyten/kt60hs_t/v2/readme.md
@@ -0,0 +1,29 @@
+# keyten kt60HS-T V2
+
+60% MX Hot-Swap Tsangan PCB
+
+![kt60HS-T image](https://i.imgur.com/vM32aoX.jpeg)
+
+**Note: This firmware only supports the PCB version with STM32F072 controller**
+
+* Keyboard Maintainer: [keyten](https://github.com/key10iq)
+* Hardware Supported: keyten kt60HS-T V2
+* Hardware Availability: private GB
+
+Make example for this keyboard (after setting up your build environment):
+
+ make keyten/kt60hs_t/v2:default
+
+Flashing example for this keyboard:
+
+ make keyten/kt60hs_t/v2: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 (usually the top left key or Escape) and plug in the keyboard
+* Keycode in layout: Press the key mapped to `QK_BOOT` if it is available
+* Physical reset button: Hold the button on the back of the PCB
diff --git a/keyboards/mechlovin/olly/octagon/keyboard.json b/keyboards/mechlovin/olly/octagon/keyboard.json
index 4bc7d88ed7..9c580a664e 100644
--- a/keyboards/mechlovin/olly/octagon/keyboard.json
+++ b/keyboards/mechlovin/olly/octagon/keyboard.json
@@ -170,11 +170,12 @@
"processor": "STM32F103",
"bootloader": "stm32duino",
"layout_aliases": {
- "LAYOUT": "LAYOUT_split_bs",
- "LAYOUT_all": "LAYOUT_split_bs"
+ "LAYOUT": "LAYOUT_all",
+ "LAYOUT_split_bs": "LAYOUT_all"
},
+ "community_layouts": ["75_ansi", "75_iso"],
"layouts": {
- "LAYOUT_split_bs": {
+ "LAYOUT_all": {
"layout": [
{"matrix": [0, 0], "x": 0, "y": 0},
{"matrix": [0, 1], "x": 1, "y": 0},
@@ -269,6 +270,750 @@
{"matrix": [5, 14], "x": 14, "y": 5},
{"matrix": [5, 15], "x": 15, "y": 5}
]
+ },
+ "LAYOUT_75_ansi": {
+ "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": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15, "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": [1, 10], "x": 10, "y": 1},
+ {"matrix": [1, 11], "x": 11, "y": 1},
+ {"matrix": [1, 12], "x": 12, "y": 1},
+ {"matrix": [1, 13], "x": 13, "y": 1, "w": 2},
+ {"matrix": [1, 15], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2},
+ {"matrix": [2, 2], "x": 2.5, "y": 2},
+ {"matrix": [2, 3], "x": 3.5, "y": 2},
+ {"matrix": [2, 4], "x": 4.5, "y": 2},
+ {"matrix": [2, 5], "x": 5.5, "y": 2},
+ {"matrix": [2, 6], "x": 6.5, "y": 2},
+ {"matrix": [2, 7], "x": 7.5, "y": 2},
+ {"matrix": [2, 8], "x": 8.5, "y": 2},
+ {"matrix": [2, 9], "x": 9.5, "y": 2},
+ {"matrix": [2, 10], "x": 10.5, "y": 2},
+ {"matrix": [2, 11], "x": 11.5, "y": 2},
+ {"matrix": [2, 12], "x": 12.5, "y": 2},
+ {"matrix": [2, 14], "x": 13.5, "y": 2, "w": 1.5},
+ {"matrix": [2, 15], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3},
+ {"matrix": [3, 2], "x": 2.75, "y": 3},
+ {"matrix": [3, 3], "x": 3.75, "y": 3},
+ {"matrix": [3, 4], "x": 4.75, "y": 3},
+ {"matrix": [3, 5], "x": 5.75, "y": 3},
+ {"matrix": [3, 6], "x": 6.75, "y": 3},
+ {"matrix": [3, 7], "x": 7.75, "y": 3},
+ {"matrix": [3, 8], "x": 8.75, "y": 3},
+ {"matrix": [3, 9], "x": 9.75, "y": 3},
+ {"matrix": [3, 10], "x": 10.75, "y": 3},
+ {"matrix": [3, 11], "x": 11.75, "y": 3},
+ {"matrix": [3, 13], "x": 12.75, "y": 3, "w": 2.25},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4},
+ {"matrix": [4, 3], "x": 3.25, "y": 4},
+ {"matrix": [4, 4], "x": 4.25, "y": 4},
+ {"matrix": [4, 5], "x": 5.25, "y": 4},
+ {"matrix": [4, 6], "x": 6.25, "y": 4},
+ {"matrix": [4, 7], "x": 7.25, "y": 4},
+ {"matrix": [4, 8], "x": 8.25, "y": 4},
+ {"matrix": [4, 9], "x": 9.25, "y": 4},
+ {"matrix": [4, 10], "x": 10.25, "y": 4},
+ {"matrix": [4, 11], "x": 11.25, "y": 4},
+ {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4},
+
+ {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5, "w": 1.25},
+ {"matrix": [5, 6], "x": 3.75, "y": 5, "w": 6.25},
+ {"matrix": [5, 10], "x": 10, "y": 5},
+ {"matrix": [5, 11], "x": 11, "y": 5},
+ {"matrix": [5, 12], "x": 12, "y": 5},
+ {"matrix": [5, 13], "x": 13, "y": 5},
+ {"matrix": [5, 14], "x": 14, "y": 5},
+ {"matrix": [5, 15], "x": 15, "y": 5}
+ ]
+ },
+ "LAYOUT_75_ansi_split_bs": {
+ "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": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15, "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": [1, 10], "x": 10, "y": 1},
+ {"matrix": [1, 11], "x": 11, "y": 1},
+ {"matrix": [1, 12], "x": 12, "y": 1},
+ {"matrix": [1, 13], "x": 13, "y": 1},
+ {"matrix": [1, 14], "x": 14, "y": 1},
+ {"matrix": [1, 15], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2},
+ {"matrix": [2, 2], "x": 2.5, "y": 2},
+ {"matrix": [2, 3], "x": 3.5, "y": 2},
+ {"matrix": [2, 4], "x": 4.5, "y": 2},
+ {"matrix": [2, 5], "x": 5.5, "y": 2},
+ {"matrix": [2, 6], "x": 6.5, "y": 2},
+ {"matrix": [2, 7], "x": 7.5, "y": 2},
+ {"matrix": [2, 8], "x": 8.5, "y": 2},
+ {"matrix": [2, 9], "x": 9.5, "y": 2},
+ {"matrix": [2, 10], "x": 10.5, "y": 2},
+ {"matrix": [2, 11], "x": 11.5, "y": 2},
+ {"matrix": [2, 12], "x": 12.5, "y": 2},
+ {"matrix": [2, 14], "x": 13.5, "y": 2, "w": 1.5},
+ {"matrix": [2, 15], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3},
+ {"matrix": [3, 2], "x": 2.75, "y": 3},
+ {"matrix": [3, 3], "x": 3.75, "y": 3},
+ {"matrix": [3, 4], "x": 4.75, "y": 3},
+ {"matrix": [3, 5], "x": 5.75, "y": 3},
+ {"matrix": [3, 6], "x": 6.75, "y": 3},
+ {"matrix": [3, 7], "x": 7.75, "y": 3},
+ {"matrix": [3, 8], "x": 8.75, "y": 3},
+ {"matrix": [3, 9], "x": 9.75, "y": 3},
+ {"matrix": [3, 10], "x": 10.75, "y": 3},
+ {"matrix": [3, 11], "x": 11.75, "y": 3},
+ {"matrix": [3, 13], "x": 12.75, "y": 3, "w": 2.25},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4},
+ {"matrix": [4, 3], "x": 3.25, "y": 4},
+ {"matrix": [4, 4], "x": 4.25, "y": 4},
+ {"matrix": [4, 5], "x": 5.25, "y": 4},
+ {"matrix": [4, 6], "x": 6.25, "y": 4},
+ {"matrix": [4, 7], "x": 7.25, "y": 4},
+ {"matrix": [4, 8], "x": 8.25, "y": 4},
+ {"matrix": [4, 9], "x": 9.25, "y": 4},
+ {"matrix": [4, 10], "x": 10.25, "y": 4},
+ {"matrix": [4, 11], "x": 11.25, "y": 4},
+ {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4},
+
+ {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5, "w": 1.25},
+ {"matrix": [5, 6], "x": 3.75, "y": 5, "w": 6.25},
+ {"matrix": [5, 10], "x": 10, "y": 5},
+ {"matrix": [5, 11], "x": 11, "y": 5},
+ {"matrix": [5, 12], "x": 12, "y": 5},
+ {"matrix": [5, 13], "x": 13, "y": 5},
+ {"matrix": [5, 14], "x": 14, "y": 5},
+ {"matrix": [5, 15], "x": 15, "y": 5}
+ ]
+ },
+ "LAYOUT_75_ansi_wkl": {
+ "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": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15, "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": [1, 10], "x": 10, "y": 1},
+ {"matrix": [1, 11], "x": 11, "y": 1},
+ {"matrix": [1, 12], "x": 12, "y": 1},
+ {"matrix": [1, 13], "x": 13, "y": 1, "w": 2},
+ {"matrix": [1, 15], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2},
+ {"matrix": [2, 2], "x": 2.5, "y": 2},
+ {"matrix": [2, 3], "x": 3.5, "y": 2},
+ {"matrix": [2, 4], "x": 4.5, "y": 2},
+ {"matrix": [2, 5], "x": 5.5, "y": 2},
+ {"matrix": [2, 6], "x": 6.5, "y": 2},
+ {"matrix": [2, 7], "x": 7.5, "y": 2},
+ {"matrix": [2, 8], "x": 8.5, "y": 2},
+ {"matrix": [2, 9], "x": 9.5, "y": 2},
+ {"matrix": [2, 10], "x": 10.5, "y": 2},
+ {"matrix": [2, 11], "x": 11.5, "y": 2},
+ {"matrix": [2, 12], "x": 12.5, "y": 2},
+ {"matrix": [2, 14], "x": 13.5, "y": 2, "w": 1.5},
+ {"matrix": [2, 15], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3},
+ {"matrix": [3, 2], "x": 2.75, "y": 3},
+ {"matrix": [3, 3], "x": 3.75, "y": 3},
+ {"matrix": [3, 4], "x": 4.75, "y": 3},
+ {"matrix": [3, 5], "x": 5.75, "y": 3},
+ {"matrix": [3, 6], "x": 6.75, "y": 3},
+ {"matrix": [3, 7], "x": 7.75, "y": 3},
+ {"matrix": [3, 8], "x": 8.75, "y": 3},
+ {"matrix": [3, 9], "x": 9.75, "y": 3},
+ {"matrix": [3, 10], "x": 10.75, "y": 3},
+ {"matrix": [3, 11], "x": 11.75, "y": 3},
+ {"matrix": [3, 13], "x": 12.75, "y": 3, "w": 2.25},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4},
+ {"matrix": [4, 3], "x": 3.25, "y": 4},
+ {"matrix": [4, 4], "x": 4.25, "y": 4},
+ {"matrix": [4, 5], "x": 5.25, "y": 4},
+ {"matrix": [4, 6], "x": 6.25, "y": 4},
+ {"matrix": [4, 7], "x": 7.25, "y": 4},
+ {"matrix": [4, 8], "x": 8.25, "y": 4},
+ {"matrix": [4, 9], "x": 9.25, "y": 4},
+ {"matrix": [4, 10], "x": 10.25, "y": 4},
+ {"matrix": [4, 11], "x": 11.25, "y": 4},
+ {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4},
+
+ {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5, "w": 1.5},
+ {"matrix": [5, 6], "x": 3, "y": 5, "w": 7},
+ {"matrix": [5, 10], "x": 10, "y": 5, "w": 1.5},
+ {"matrix": [5, 12], "x": 11.5, "y": 5, "w": 1.5},
+ {"matrix": [5, 13], "x": 13, "y": 5},
+ {"matrix": [5, 14], "x": 14, "y": 5},
+ {"matrix": [5, 15], "x": 15, "y": 5}
+ ]
+ },
+ "LAYOUT_75_ansi_wkl_split_bs": {
+ "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": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15, "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": [1, 10], "x": 10, "y": 1},
+ {"matrix": [1, 11], "x": 11, "y": 1},
+ {"matrix": [1, 12], "x": 12, "y": 1},
+ {"matrix": [1, 13], "x": 13, "y": 1},
+ {"matrix": [1, 14], "x": 14, "y": 1},
+ {"matrix": [1, 15], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2},
+ {"matrix": [2, 2], "x": 2.5, "y": 2},
+ {"matrix": [2, 3], "x": 3.5, "y": 2},
+ {"matrix": [2, 4], "x": 4.5, "y": 2},
+ {"matrix": [2, 5], "x": 5.5, "y": 2},
+ {"matrix": [2, 6], "x": 6.5, "y": 2},
+ {"matrix": [2, 7], "x": 7.5, "y": 2},
+ {"matrix": [2, 8], "x": 8.5, "y": 2},
+ {"matrix": [2, 9], "x": 9.5, "y": 2},
+ {"matrix": [2, 10], "x": 10.5, "y": 2},
+ {"matrix": [2, 11], "x": 11.5, "y": 2},
+ {"matrix": [2, 12], "x": 12.5, "y": 2},
+ {"matrix": [2, 14], "x": 13.5, "y": 2, "w": 1.5},
+ {"matrix": [2, 15], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3},
+ {"matrix": [3, 2], "x": 2.75, "y": 3},
+ {"matrix": [3, 3], "x": 3.75, "y": 3},
+ {"matrix": [3, 4], "x": 4.75, "y": 3},
+ {"matrix": [3, 5], "x": 5.75, "y": 3},
+ {"matrix": [3, 6], "x": 6.75, "y": 3},
+ {"matrix": [3, 7], "x": 7.75, "y": 3},
+ {"matrix": [3, 8], "x": 8.75, "y": 3},
+ {"matrix": [3, 9], "x": 9.75, "y": 3},
+ {"matrix": [3, 10], "x": 10.75, "y": 3},
+ {"matrix": [3, 11], "x": 11.75, "y": 3},
+ {"matrix": [3, 13], "x": 12.75, "y": 3, "w": 2.25},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 2.25},
+ {"matrix": [4, 2], "x": 2.25, "y": 4},
+ {"matrix": [4, 3], "x": 3.25, "y": 4},
+ {"matrix": [4, 4], "x": 4.25, "y": 4},
+ {"matrix": [4, 5], "x": 5.25, "y": 4},
+ {"matrix": [4, 6], "x": 6.25, "y": 4},
+ {"matrix": [4, 7], "x": 7.25, "y": 4},
+ {"matrix": [4, 8], "x": 8.25, "y": 4},
+ {"matrix": [4, 9], "x": 9.25, "y": 4},
+ {"matrix": [4, 10], "x": 10.25, "y": 4},
+ {"matrix": [4, 11], "x": 11.25, "y": 4},
+ {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4},
+
+ {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5, "w": 1.5},
+ {"matrix": [5, 6], "x": 3, "y": 5, "w": 7},
+ {"matrix": [5, 10], "x": 10, "y": 5, "w": 1.5},
+ {"matrix": [5, 12], "x": 11.5, "y": 5, "w": 1.5},
+ {"matrix": [5, 13], "x": 13, "y": 5},
+ {"matrix": [5, 14], "x": 14, "y": 5},
+ {"matrix": [5, 15], "x": 15, "y": 5}
+ ]
+ },
+ "LAYOUT_75_iso": {
+ "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": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15, "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": [1, 10], "x": 10, "y": 1},
+ {"matrix": [1, 11], "x": 11, "y": 1},
+ {"matrix": [1, 12], "x": 12, "y": 1},
+ {"matrix": [1, 13], "x": 13, "y": 1, "w": 2},
+ {"matrix": [1, 15], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2},
+ {"matrix": [2, 2], "x": 2.5, "y": 2},
+ {"matrix": [2, 3], "x": 3.5, "y": 2},
+ {"matrix": [2, 4], "x": 4.5, "y": 2},
+ {"matrix": [2, 5], "x": 5.5, "y": 2},
+ {"matrix": [2, 6], "x": 6.5, "y": 2},
+ {"matrix": [2, 7], "x": 7.5, "y": 2},
+ {"matrix": [2, 8], "x": 8.5, "y": 2},
+ {"matrix": [2, 9], "x": 9.5, "y": 2},
+ {"matrix": [2, 10], "x": 10.5, "y": 2},
+ {"matrix": [2, 11], "x": 11.5, "y": 2},
+ {"matrix": [2, 12], "x": 12.5, "y": 2},
+ {"matrix": [2, 15], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3},
+ {"matrix": [3, 2], "x": 2.75, "y": 3},
+ {"matrix": [3, 3], "x": 3.75, "y": 3},
+ {"matrix": [3, 4], "x": 4.75, "y": 3},
+ {"matrix": [3, 5], "x": 5.75, "y": 3},
+ {"matrix": [3, 6], "x": 6.75, "y": 3},
+ {"matrix": [3, 7], "x": 7.75, "y": 3},
+ {"matrix": [3, 8], "x": 8.75, "y": 3},
+ {"matrix": [3, 9], "x": 9.75, "y": 3},
+ {"matrix": [3, 10], "x": 10.75, "y": 3},
+ {"matrix": [3, 11], "x": 11.75, "y": 3},
+ {"matrix": [3, 12], "x": 12.75, "y": 3},
+ {"matrix": [2, 14], "x": 13.75, "y": 2, "w": 1.25, "h": 2},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4},
+ {"matrix": [4, 2], "x": 2.25, "y": 4},
+ {"matrix": [4, 3], "x": 3.25, "y": 4},
+ {"matrix": [4, 4], "x": 4.25, "y": 4},
+ {"matrix": [4, 5], "x": 5.25, "y": 4},
+ {"matrix": [4, 6], "x": 6.25, "y": 4},
+ {"matrix": [4, 7], "x": 7.25, "y": 4},
+ {"matrix": [4, 8], "x": 8.25, "y": 4},
+ {"matrix": [4, 9], "x": 9.25, "y": 4},
+ {"matrix": [4, 10], "x": 10.25, "y": 4},
+ {"matrix": [4, 11], "x": 11.25, "y": 4},
+ {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4},
+
+ {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5, "w": 1.25},
+ {"matrix": [5, 6], "x": 3.75, "y": 5, "w": 6.25},
+ {"matrix": [5, 10], "x": 10, "y": 5},
+ {"matrix": [5, 11], "x": 11, "y": 5},
+ {"matrix": [5, 12], "x": 12, "y": 5},
+ {"matrix": [5, 13], "x": 13, "y": 5},
+ {"matrix": [5, 14], "x": 14, "y": 5},
+ {"matrix": [5, 15], "x": 15, "y": 5}
+ ]
+ },
+ "LAYOUT_75_iso_split_bs": {
+ "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": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15, "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": [1, 10], "x": 10, "y": 1},
+ {"matrix": [1, 11], "x": 11, "y": 1},
+ {"matrix": [1, 12], "x": 12, "y": 1},
+ {"matrix": [1, 13], "x": 13, "y": 1},
+ {"matrix": [1, 14], "x": 14, "y": 1},
+ {"matrix": [1, 15], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2},
+ {"matrix": [2, 2], "x": 2.5, "y": 2},
+ {"matrix": [2, 3], "x": 3.5, "y": 2},
+ {"matrix": [2, 4], "x": 4.5, "y": 2},
+ {"matrix": [2, 5], "x": 5.5, "y": 2},
+ {"matrix": [2, 6], "x": 6.5, "y": 2},
+ {"matrix": [2, 7], "x": 7.5, "y": 2},
+ {"matrix": [2, 8], "x": 8.5, "y": 2},
+ {"matrix": [2, 9], "x": 9.5, "y": 2},
+ {"matrix": [2, 10], "x": 10.5, "y": 2},
+ {"matrix": [2, 11], "x": 11.5, "y": 2},
+ {"matrix": [2, 12], "x": 12.5, "y": 2},
+ {"matrix": [2, 15], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3},
+ {"matrix": [3, 2], "x": 2.75, "y": 3},
+ {"matrix": [3, 3], "x": 3.75, "y": 3},
+ {"matrix": [3, 4], "x": 4.75, "y": 3},
+ {"matrix": [3, 5], "x": 5.75, "y": 3},
+ {"matrix": [3, 6], "x": 6.75, "y": 3},
+ {"matrix": [3, 7], "x": 7.75, "y": 3},
+ {"matrix": [3, 8], "x": 8.75, "y": 3},
+ {"matrix": [3, 9], "x": 9.75, "y": 3},
+ {"matrix": [3, 10], "x": 10.75, "y": 3},
+ {"matrix": [3, 11], "x": 11.75, "y": 3},
+ {"matrix": [3, 12], "x": 12.75, "y": 3},
+ {"matrix": [2, 14], "x": 13.75, "y": 2, "w": 1.25, "h": 2},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4},
+ {"matrix": [4, 2], "x": 2.25, "y": 4},
+ {"matrix": [4, 3], "x": 3.25, "y": 4},
+ {"matrix": [4, 4], "x": 4.25, "y": 4},
+ {"matrix": [4, 5], "x": 5.25, "y": 4},
+ {"matrix": [4, 6], "x": 6.25, "y": 4},
+ {"matrix": [4, 7], "x": 7.25, "y": 4},
+ {"matrix": [4, 8], "x": 8.25, "y": 4},
+ {"matrix": [4, 9], "x": 9.25, "y": 4},
+ {"matrix": [4, 10], "x": 10.25, "y": 4},
+ {"matrix": [4, 11], "x": 11.25, "y": 4},
+ {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4},
+
+ {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.25},
+ {"matrix": [5, 1], "x": 1.25, "y": 5, "w": 1.25},
+ {"matrix": [5, 2], "x": 2.5, "y": 5, "w": 1.25},
+ {"matrix": [5, 6], "x": 3.75, "y": 5, "w": 6.25},
+ {"matrix": [5, 10], "x": 10, "y": 5},
+ {"matrix": [5, 11], "x": 11, "y": 5},
+ {"matrix": [5, 12], "x": 12, "y": 5},
+ {"matrix": [5, 13], "x": 13, "y": 5},
+ {"matrix": [5, 14], "x": 14, "y": 5},
+ {"matrix": [5, 15], "x": 15, "y": 5}
+ ]
+ },
+ "LAYOUT_75_iso_wkl": {
+ "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": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15, "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": [1, 10], "x": 10, "y": 1},
+ {"matrix": [1, 11], "x": 11, "y": 1},
+ {"matrix": [1, 12], "x": 12, "y": 1},
+ {"matrix": [1, 13], "x": 13, "y": 1, "w": 2},
+ {"matrix": [1, 15], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2},
+ {"matrix": [2, 2], "x": 2.5, "y": 2},
+ {"matrix": [2, 3], "x": 3.5, "y": 2},
+ {"matrix": [2, 4], "x": 4.5, "y": 2},
+ {"matrix": [2, 5], "x": 5.5, "y": 2},
+ {"matrix": [2, 6], "x": 6.5, "y": 2},
+ {"matrix": [2, 7], "x": 7.5, "y": 2},
+ {"matrix": [2, 8], "x": 8.5, "y": 2},
+ {"matrix": [2, 9], "x": 9.5, "y": 2},
+ {"matrix": [2, 10], "x": 10.5, "y": 2},
+ {"matrix": [2, 11], "x": 11.5, "y": 2},
+ {"matrix": [2, 12], "x": 12.5, "y": 2},
+ {"matrix": [2, 15], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3},
+ {"matrix": [3, 2], "x": 2.75, "y": 3},
+ {"matrix": [3, 3], "x": 3.75, "y": 3},
+ {"matrix": [3, 4], "x": 4.75, "y": 3},
+ {"matrix": [3, 5], "x": 5.75, "y": 3},
+ {"matrix": [3, 6], "x": 6.75, "y": 3},
+ {"matrix": [3, 7], "x": 7.75, "y": 3},
+ {"matrix": [3, 8], "x": 8.75, "y": 3},
+ {"matrix": [3, 9], "x": 9.75, "y": 3},
+ {"matrix": [3, 10], "x": 10.75, "y": 3},
+ {"matrix": [3, 11], "x": 11.75, "y": 3},
+ {"matrix": [3, 12], "x": 12.75, "y": 3},
+ {"matrix": [2, 14], "x": 13.75, "y": 2, "w": 1.25, "h": 2},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4},
+ {"matrix": [4, 2], "x": 2.25, "y": 4},
+ {"matrix": [4, 3], "x": 3.25, "y": 4},
+ {"matrix": [4, 4], "x": 4.25, "y": 4},
+ {"matrix": [4, 5], "x": 5.25, "y": 4},
+ {"matrix": [4, 6], "x": 6.25, "y": 4},
+ {"matrix": [4, 7], "x": 7.25, "y": 4},
+ {"matrix": [4, 8], "x": 8.25, "y": 4},
+ {"matrix": [4, 9], "x": 9.25, "y": 4},
+ {"matrix": [4, 10], "x": 10.25, "y": 4},
+ {"matrix": [4, 11], "x": 11.25, "y": 4},
+ {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4},
+
+ {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5, "w": 1.5},
+ {"matrix": [5, 6], "x": 3, "y": 5, "w": 7},
+ {"matrix": [5, 10], "x": 10, "y": 5, "w": 1.5},
+ {"matrix": [5, 12], "x": 11.5, "y": 5, "w": 1.5},
+ {"matrix": [5, 13], "x": 13, "y": 5},
+ {"matrix": [5, 14], "x": 14, "y": 5},
+ {"matrix": [5, 15], "x": 15, "y": 5}
+ ]
+ },
+ "LAYOUT_75_iso_wkl_split_bs": {
+ "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": [0, 10], "x": 10, "y": 0},
+ {"matrix": [0, 11], "x": 11, "y": 0},
+ {"matrix": [0, 12], "x": 12, "y": 0},
+ {"matrix": [0, 13], "x": 13, "y": 0},
+ {"matrix": [0, 14], "x": 14, "y": 0},
+ {"matrix": [0, 15], "x": 15, "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": [1, 10], "x": 10, "y": 1},
+ {"matrix": [1, 11], "x": 11, "y": 1},
+ {"matrix": [1, 12], "x": 12, "y": 1},
+ {"matrix": [1, 13], "x": 13, "y": 1},
+ {"matrix": [1, 14], "x": 14, "y": 1},
+ {"matrix": [1, 15], "x": 15, "y": 1},
+
+ {"matrix": [2, 0], "x": 0, "y": 2, "w": 1.5},
+ {"matrix": [2, 1], "x": 1.5, "y": 2},
+ {"matrix": [2, 2], "x": 2.5, "y": 2},
+ {"matrix": [2, 3], "x": 3.5, "y": 2},
+ {"matrix": [2, 4], "x": 4.5, "y": 2},
+ {"matrix": [2, 5], "x": 5.5, "y": 2},
+ {"matrix": [2, 6], "x": 6.5, "y": 2},
+ {"matrix": [2, 7], "x": 7.5, "y": 2},
+ {"matrix": [2, 8], "x": 8.5, "y": 2},
+ {"matrix": [2, 9], "x": 9.5, "y": 2},
+ {"matrix": [2, 10], "x": 10.5, "y": 2},
+ {"matrix": [2, 11], "x": 11.5, "y": 2},
+ {"matrix": [2, 12], "x": 12.5, "y": 2},
+ {"matrix": [2, 15], "x": 15, "y": 2},
+
+ {"matrix": [3, 0], "x": 0, "y": 3, "w": 1.75},
+ {"matrix": [3, 1], "x": 1.75, "y": 3},
+ {"matrix": [3, 2], "x": 2.75, "y": 3},
+ {"matrix": [3, 3], "x": 3.75, "y": 3},
+ {"matrix": [3, 4], "x": 4.75, "y": 3},
+ {"matrix": [3, 5], "x": 5.75, "y": 3},
+ {"matrix": [3, 6], "x": 6.75, "y": 3},
+ {"matrix": [3, 7], "x": 7.75, "y": 3},
+ {"matrix": [3, 8], "x": 8.75, "y": 3},
+ {"matrix": [3, 9], "x": 9.75, "y": 3},
+ {"matrix": [3, 10], "x": 10.75, "y": 3},
+ {"matrix": [3, 11], "x": 11.75, "y": 3},
+ {"matrix": [3, 12], "x": 12.75, "y": 3},
+ {"matrix": [2, 14], "x": 13.75, "y": 2, "w": 1.25, "h": 2},
+ {"matrix": [3, 15], "x": 15, "y": 3},
+
+ {"matrix": [4, 0], "x": 0, "y": 4, "w": 1.25},
+ {"matrix": [4, 1], "x": 1.25, "y": 4},
+ {"matrix": [4, 2], "x": 2.25, "y": 4},
+ {"matrix": [4, 3], "x": 3.25, "y": 4},
+ {"matrix": [4, 4], "x": 4.25, "y": 4},
+ {"matrix": [4, 5], "x": 5.25, "y": 4},
+ {"matrix": [4, 6], "x": 6.25, "y": 4},
+ {"matrix": [4, 7], "x": 7.25, "y": 4},
+ {"matrix": [4, 8], "x": 8.25, "y": 4},
+ {"matrix": [4, 9], "x": 9.25, "y": 4},
+ {"matrix": [4, 10], "x": 10.25, "y": 4},
+ {"matrix": [4, 11], "x": 11.25, "y": 4},
+ {"matrix": [4, 12], "x": 12.25, "y": 4, "w": 1.75},
+ {"matrix": [4, 14], "x": 14, "y": 4},
+ {"matrix": [4, 15], "x": 15, "y": 4},
+
+ {"matrix": [5, 0], "x": 0, "y": 5, "w": 1.5},
+ {"matrix": [5, 1], "x": 1.5, "y": 5, "w": 1.5},
+ {"matrix": [5, 6], "x": 3, "y": 5, "w": 7},
+ {"matrix": [5, 10], "x": 10, "y": 5, "w": 1.5},
+ {"matrix": [5, 12], "x": 11.5, "y": 5, "w": 1.5},
+ {"matrix": [5, 13], "x": 13, "y": 5},
+ {"matrix": [5, 14], "x": 14, "y": 5},
+ {"matrix": [5, 15], "x": 15, "y": 5}
+ ]
}
}
}
diff --git a/keyboards/mechlovin/olly/octagon/keymaps/default/keymap.c b/keyboards/mechlovin/olly/octagon/keymaps/default/keymap.c
index 353f5f5d6d..19cd554ac3 100644
--- a/keyboards/mechlovin/olly/octagon/keymaps/default/keymap.c
+++ b/keyboards/mechlovin/olly/octagon/keymaps/default/keymap.c
@@ -16,12 +16,12 @@
#include QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- [0] = LAYOUT_split_bs(
+ [0] = LAYOUT_all(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_PAUS, KC_DEL,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_HOME,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_END,
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, _______, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
- )
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ ),
};
diff --git a/keyboards/mechlovin/olly/octagon/matrix_diagram.md b/keyboards/mechlovin/olly/octagon/matrix_diagram.md
new file mode 100644
index 0000000000..426e0691d1
--- /dev/null
+++ b/keyboards/mechlovin/olly/octagon/matrix_diagram.md
@@ -0,0 +1,26 @@
+# Matrix Diagram for Mechlovin Olly Octagon
+
+```
+┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
+│00 │01 │02 │03 │04 │05 │06 │07 │08 │09 │0A │0B │0C │0D │0E │0F │
+├───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┼───┤ ┌───────┐
+│10 │11 │12 │13 │14 │15 │16 │17 │18 │19 │1A │1B │1C │1D │1E │1F │ │1D │ 2u Backspace
+├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┼───┤ └─┬─────┤
+│20 │21 │22 │23 │24 │25 │26 │27 │28 │29 │2A │2B │2C │2E │2F │ │ │
+├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┼───┤ ┌──┴┐2E │ ISO Enter
+│30 │31 │32 │33 │34 │35 │36 │37 │38 │39 │3A │3B │3D │3F │ │3C │ │
+├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┼───┤ └───┴────┘
+│40 │41 │42 │43 │44 │45 │46 │47 │48 │49 │4A │4B │4C │4E │4F │
+├────┼───┴┬──┴─┬─┴───┴───┴───┴───┴───┴──┬┴──┬┴──┬┴──┬───┼───┼───┤
+│50 │51 │52 │56 │5A │5B │5C │5D │5E │5F │
+└────┴────┴────┴────────────────────────┴───┴───┴───┴───┴───┴───┘
+┌────────┐
+│40 │ 2.25u LShift
+└────────┘
+┌────┬───┬────┬────────────────────────┬────┬───┬───┬───┬───┬───┐
+│50 │51 │52 │56 │5A │5B │5C │5D │5E │5F │ Alternative
+└────┴───┴────┴────────────────────────┴────┴───┴───┴───┴───┴───┘
+┌─────┬─────┬───────────────────────────┬─────┬─────┬───┬───┬───┐
+│50 │51 │56 │5A │5C │5D │5E │5F │ WKL
+└─────┴─────┴───────────────────────────┴─────┴─────┴───┴───┴───┘
+```
diff --git a/keyboards/monsgeek/m1/m1.c b/keyboards/monsgeek/m1/m1.c
index 60479ab801..2f7365e562 100644
--- a/keyboards/monsgeek/m1/m1.c
+++ b/keyboards/monsgeek/m1/m1.c
@@ -190,7 +190,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
set_single_persistent_default_layer(MAC_B);
layer_state_set(1<<MAC_B);
keymap_config.no_gui = 0;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
return false;
case QK_RGB_MATRIX_TOGGLE:
diff --git a/keyboards/monsgeek/m3/m3.c b/keyboards/monsgeek/m3/m3.c
index 4dd9a55f3c..bf5e038b3d 100644
--- a/keyboards/monsgeek/m3/m3.c
+++ b/keyboards/monsgeek/m3/m3.c
@@ -163,7 +163,7 @@ bool process_record_kb(uint16_t keycode, keyrecord_t* record) {
if (record->event.pressed) {
set_single_persistent_default_layer(MAC_B);
keymap_config.no_gui = 0;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
return false;
case GU_TOGG:
diff --git a/keyboards/neson_design/810e/board.h b/keyboards/neson_design/810e/board.h
new file mode 100644
index 0000000000..681350a0ea
--- /dev/null
+++ b/keyboards/neson_design/810e/board.h
@@ -0,0 +1,8 @@
+// Copyright 2024 astro
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/neson_design/810e/config.h b/keyboards/neson_design/810e/config.h
deleted file mode 100644
index c6409b1ece..0000000000
--- a/keyboards/neson_design/810e/config.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * Copyright 2024 astro
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#pragma once
-
-#define BOARD_OTG_NOVBUSSENS 1
-#define STM32_HSECLK 16000000U
diff --git a/keyboards/nix_studio/lilith/board.h b/keyboards/nix_studio/lilith/board.h
new file mode 100644
index 0000000000..2a370fe2e0
--- /dev/null
+++ b/keyboards/nix_studio/lilith/board.h
@@ -0,0 +1,8 @@
+// Copyright 2022 Martin Arnstad (@arnstadm)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/omnikeyish/dynamic_macro.c b/keyboards/omnikeyish/dynamic_macro.c
index b990a09a13..99b6d173b8 100644
--- a/keyboards/omnikeyish/dynamic_macro.c
+++ b/keyboards/omnikeyish/dynamic_macro.c
@@ -1,5 +1,6 @@
#include "omnikeyish.h"
#include <string.h>
+#include "eeprom.h"
dynamic_macro_t dynamic_macros[DYNAMIC_MACRO_COUNT];
diff --git a/keyboards/planck/keymaps/default/keymap.c b/keyboards/planck/keymaps/default/keymap.c
index cc8a69ceca..c08e58653a 100644
--- a/keyboards/planck/keymaps/default/keymap.c
+++ b/keyboards/planck/keymaps/default/keymap.c
@@ -215,9 +215,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
- keymap_config.raw = eeconfig_read_keymap();
+ eeconfig_read_keymap(&keymap_config);
keymap_config.nkro = 1;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
return false;
break;
diff --git a/keyboards/planck/rev7/keymaps/default/keymap.c b/keyboards/planck/rev7/keymaps/default/keymap.c
index 47ded8aba5..6880e2fa94 100644
--- a/keyboards/planck/rev7/keymaps/default/keymap.c
+++ b/keyboards/planck/rev7/keymaps/default/keymap.c
@@ -255,9 +255,9 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) {
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
- keymap_config.raw = eeconfig_read_keymap();
+ eeconfig_read_keymap(&keymap_config);
keymap_config.nkro = 1;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
return false;
break;
diff --git a/keyboards/plywrks/ply8x/config.h b/keyboards/plywrks/ply8x/hotswap/config.h
index 3fc4de978d..3fc4de978d 100644
--- a/keyboards/plywrks/ply8x/config.h
+++ b/keyboards/plywrks/ply8x/hotswap/config.h
diff --git a/keyboards/plywrks/ply8x/halconf.h b/keyboards/plywrks/ply8x/hotswap/halconf.h
index e215e323c5..e215e323c5 100644
--- a/keyboards/plywrks/ply8x/halconf.h
+++ b/keyboards/plywrks/ply8x/hotswap/halconf.h
diff --git a/keyboards/plywrks/ply8x/hotswap/keyboard.json b/keyboards/plywrks/ply8x/hotswap/keyboard.json
new file mode 100644
index 0000000000..2dc2ac5c35
--- /dev/null
+++ b/keyboards/plywrks/ply8x/hotswap/keyboard.json
@@ -0,0 +1,560 @@
+{
+ "manufacturer": "plywrks",
+ "keyboard_name": "ply8x",
+ "maintainer": "ramonimbao",
+ "bootloader": "stm32-dfu",
+ "diode_direction": "COL2ROW",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true,
+ "rgb_matrix": true
+ },
+ "matrix_pins": {
+ "rows": ["B2", "B1", "B0", "A7", "A10", "A2"],
+ "cols": ["A9", "A8", "B12", "B11", "B10", "A6", "A5", "A4", "A15", "C14", "C13", "B9", "B6", "B7", "B5", "B4", "B3"]
+ },
+ "processor": "STM32F072",
+ "url": "",
+ "usb": {
+ "device_version": "1.0.0",
+ "vid": "0x706C",
+ "pid": "0x7915"
+ },
+ "ws2812": {
+ "pin": "B15",
+ "driver": "spi"
+ },
+ "rgb_matrix": {
+ "animations": {
+ "alphas_mods": true,
+ "gradient_up_down": true,
+ "gradient_left_right": true,
+ "breathing": true,
+ "band_sat": true,
+ "band_val": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_up_down": true,
+ "rainbow_moving_chevron": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "dual_beacon": true,
+ "rainbow_beacon": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "jellybean_raindrops": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "pixel_rain": true,
+ "pixel_flow": true,
+ "pixel_fractal": true,
+ "typing_heatmap": true,
+ "digital_rain": true,
+ "solid_reactive_simple": true,
+ "solid_reactive": true,
+ "solid_reactive_wide": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_multinexus": true,
+ "splash": true,
+ "multisplash": true,
+ "solid_splash": true,
+ "solid_multisplash": true
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"flags": 2, "x":224, "y":37},
+ {"flags": 2, "x":224, "y":43},
+ {"flags": 2, "x":218, "y":43},
+ {"flags": 2, "x":218, "y":37},
+
+ {"flags": 2, "matrix": [0, 0], "x":0, "y": 0},
+ {"flags": 2, "matrix": [0, 2], "x":26, "y": 0},
+ {"flags": 2, "matrix": [0, 3], "x":38, "y": 0},
+ {"flags": 2, "matrix": [0, 4], "x":51, "y": 0},
+ {"flags": 2, "matrix": [0, 5], "x":64, "y": 0},
+ {"flags": 2, "matrix": [0, 6], "x":83, "y": 0},
+ {"flags": 2, "matrix": [0, 7], "x":96, "y": 0},
+ {"flags": 2, "matrix": [0, 8], "x":109, "y": 0},
+ {"flags": 2, "matrix": [0, 9], "x":122, "y": 0},
+ {"flags": 2, "matrix": [0,10], "x":141, "y": 0},
+ {"flags": 2, "matrix": [0,11], "x":154, "y": 0},
+ {"flags": 2, "matrix": [0,12], "x":166, "y": 0},
+ {"flags": 2, "matrix": [0,13], "x":179, "y": 0},
+ {"flags": 2, "matrix": [0,14], "x":195, "y": 0},
+ {"flags": 2, "matrix": [0,15], "x":208, "y": 0},
+ {"flags": 2, "matrix": [0,16], "x":221, "y": 0},
+
+ {"flags": 2, "matrix": [1, 0], "x":0, "y": 15},
+ {"flags": 2, "matrix": [1, 1], "x":13, "y": 15},
+ {"flags": 2, "matrix": [1, 2], "x":26, "y": 15},
+ {"flags": 2, "matrix": [1, 3], "x":38, "y": 15},
+ {"flags": 2, "matrix": [1, 4], "x":51, "y": 15},
+ {"flags": 2, "matrix": [1, 5], "x":64, "y": 15},
+ {"flags": 2, "matrix": [1, 6], "x":77, "y": 15},
+ {"flags": 2, "matrix": [1, 7], "x":90, "y": 15},
+ {"flags": 2, "matrix": [1, 8], "x":102, "y": 15},
+ {"flags": 2, "matrix": [1, 9], "x":115, "y": 15},
+ {"flags": 2, "matrix": [1,10], "x":128, "y": 15},
+ {"flags": 2, "matrix": [1,11], "x":141, "y": 15},
+ {"flags": 2, "matrix": [1,12], "x":154, "y": 15},
+ {"flags": 2, "matrix": [1,13], "x":166, "y": 15},
+ {"flags": 2, "matrix": [3,13], "x":179, "y": 15},
+ {"flags": 2, "matrix": [1,14], "x":195, "y": 15},
+ {"flags": 2, "matrix": [1,15], "x":208, "y": 15},
+ {"flags": 2, "matrix": [1,16], "x":221, "y": 15},
+
+ {"flags": 2, "matrix": [2, 0], "x":3, "y": 27},
+ {"flags": 2, "matrix": [2, 1], "x":19, "y": 27},
+ {"flags": 2, "matrix": [2, 2], "x":32, "y": 27},
+ {"flags": 2, "matrix": [2, 3], "x":45, "y": 27},
+ {"flags": 2, "matrix": [2, 4], "x":58, "y": 27},
+ {"flags": 2, "matrix": [2, 5], "x":70, "y": 27},
+ {"flags": 2, "matrix": [2, 6], "x":83, "y": 27},
+ {"flags": 2, "matrix": [2, 7], "x":96, "y": 27},
+ {"flags": 2, "matrix": [2, 8], "x":109, "y": 27},
+ {"flags": 2, "matrix": [2, 9], "x":122, "y": 27},
+ {"flags": 2, "matrix": [2,10], "x":134, "y": 27},
+ {"flags": 2, "matrix": [2,11], "x":147, "y": 27},
+ {"flags": 2, "matrix": [2,12], "x":160, "y": 27},
+ {"flags": 2, "matrix": [2,13], "x":176, "y": 27},
+ {"flags": 2, "matrix": [2,14], "x":195, "y": 27},
+ {"flags": 2, "matrix": [2,15], "x":208, "y": 27},
+ {"flags": 2, "matrix": [2,16], "x":221, "y": 27},
+
+ {"flags": 2, "matrix": [3, 0], "x":5, "y":40},
+ {"flags": 2, "matrix": [3, 1], "x":23, "y": 40},
+ {"flags": 2, "matrix": [3, 2], "x":36, "y": 40},
+ {"flags": 2, "matrix": [3, 3], "x":49, "y": 40},
+ {"flags": 2, "matrix": [3, 4], "x":62, "y": 40},
+ {"flags": 2, "matrix": [3, 5], "x":75, "y": 40},
+ {"flags": 2, "matrix": [3, 6], "x":88, "y": 40},
+ {"flags": 2, "matrix": [3, 7], "x":101, "y": 40},
+ {"flags": 2, "matrix": [3, 8], "x":114, "y": 40},
+ {"flags": 2, "matrix": [3, 9], "x":127, "y": 40},
+ {"flags": 2, "matrix": [3,10], "x":140, "y": 40},
+ {"flags": 2, "matrix": [3,11], "x":153, "y": 40},
+ {"flags": 2, "matrix": [3,12], "x":166, "y": 40},
+
+ {"flags": 2, "matrix": [4, 0], "x":8, "y": 52},
+ {"flags": 2, "matrix": [4, 2], "x":29, "y": 52},
+ {"flags": 2, "matrix": [4, 3], "x":42, "y": 52},
+ {"flags": 2, "matrix": [4, 4], "x":54, "y": 52},
+ {"flags": 2, "matrix": [4, 5], "x":67, "y": 52},
+ {"flags": 2, "matrix": [4, 6], "x":80, "y": 52},
+ {"flags": 2, "matrix": [4, 7], "x":93, "y": 52},
+ {"flags": 2, "matrix": [4, 8], "x":106, "y": 52},
+ {"flags": 2, "matrix": [4, 9], "x":118, "y": 52},
+ {"flags": 2, "matrix": [4,10], "x":131, "y": 52},
+ {"flags": 2, "matrix": [4,11], "x":144, "y": 52},
+ {"flags": 2, "matrix": [4,12], "x":162, "y": 52},
+ {"flags": 2, "matrix": [4,13], "x":179, "y": 52},
+ {"flags": 2, "matrix": [4,15], "x":208, "y": 52},
+
+ {"flags": 2, "matrix": [5, 0], "x":2, "y": 64},
+ {"flags": 2, "matrix": [5, 1], "x":18, "y": 64},
+ {"flags": 2, "matrix": [5, 2], "x":34, "y": 64},
+ {"flags": 2, "matrix": [5, 7], "x":82, "y": 64},
+ {"flags": 2, "matrix": [5,11], "x":146, "y": 64},
+ {"flags": 2, "matrix": [5,12], "x":162, "y": 64},
+ {"flags": 2, "matrix": [5,13], "x":178, "y": 64},
+ {"flags": 2, "matrix": [5,14], "x":195, "y": 64},
+ {"flags": 2, "matrix": [5,15], "x":208, "y": 64},
+ {"flags": 2, "matrix": [5,16], "x":221, "y": 64}
+ ]
+ },
+ "community_layouts": ["tkl_ansi_tsangan", "tkl_ansi_tsangan_split_bs_rshift", "tkl_ansi_wkl", "tkl_ansi_wkl_split_bs_rshift"],
+ "layouts": {
+ "LAYOUT_tkl_ansi_tsangan": {
+ "layout": [
+ {"matrix": [0, 0], "x":0, "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.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":11, "y":0},
+ {"matrix": [0,11], "x":12, "y":0},
+ {"matrix": [0,12], "x":13, "y":0},
+ {"matrix": [0,13], "x":14, "y":0},
+ {"matrix": [0,14], "x":15.25, "y":0},
+ {"matrix": [0,15], "x":16.25, "y":0},
+ {"matrix": [0,16], "x":17.25, "y":0},
+
+ {"matrix": [1, 0], "x":0, "y":1.25},
+ {"matrix": [1, 1], "x":1, "y":1.25},
+ {"matrix": [1, 2], "x":2, "y":1.25},
+ {"matrix": [1, 3], "x":3, "y":1.25},
+ {"matrix": [1, 4], "x":4, "y":1.25},
+ {"matrix": [1, 5], "x":5, "y":1.25},
+ {"matrix": [1, 6], "x":6, "y":1.25},
+ {"matrix": [1, 7], "x":7, "y":1.25},
+ {"matrix": [1, 8], "x":8, "y":1.25},
+ {"matrix": [1, 9], "x":9, "y":1.25},
+ {"matrix": [1,10], "x":10, "y":1.25},
+ {"matrix": [1,11], "x":11, "y":1.25},
+ {"matrix": [1,12], "x":12, "y":1.25},
+ {"matrix": [1,13], "x":13, "y":1.25, "w":2},
+ {"matrix": [1,14], "x":15.25, "y":1.25},
+ {"matrix": [1,15], "x":16.25, "y":1.25},
+ {"matrix": [1,16], "x":17.25, "y":1.25},
+
+ {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5},
+ {"matrix": [2, 1], "x":1.5, "y":2.25},
+ {"matrix": [2, 2], "x":2.5, "y":2.25},
+ {"matrix": [2, 3], "x":3.5, "y":2.25},
+ {"matrix": [2, 4], "x":4.5, "y":2.25},
+ {"matrix": [2, 5], "x":5.5, "y":2.25},
+ {"matrix": [2, 6], "x":6.5, "y":2.25},
+ {"matrix": [2, 7], "x":7.5, "y":2.25},
+ {"matrix": [2, 8], "x":8.5, "y":2.25},
+ {"matrix": [2, 9], "x":9.5, "y":2.25},
+ {"matrix": [2,10], "x":10.5, "y":2.25},
+ {"matrix": [2,11], "x":11.5, "y":2.25},
+ {"matrix": [2,12], "x":12.5, "y":2.25},
+ {"matrix": [2,13], "x":13.5, "y":2.25, "w":1.5},
+ {"matrix": [2,14], "x":15.25, "y":2.25},
+ {"matrix": [2,15], "x":16.25, "y":2.25},
+ {"matrix": [2,16], "x":17.25, "y":2.25},
+
+ {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75},
+ {"matrix": [3, 1], "x":1.75, "y":3.25},
+ {"matrix": [3, 2], "x":2.75, "y":3.25},
+ {"matrix": [3, 3], "x":3.75, "y":3.25},
+ {"matrix": [3, 4], "x":4.75, "y":3.25},
+ {"matrix": [3, 5], "x":5.75, "y":3.25},
+ {"matrix": [3, 6], "x":6.75, "y":3.25},
+ {"matrix": [3, 7], "x":7.75, "y":3.25},
+ {"matrix": [3, 8], "x":8.75, "y":3.25},
+ {"matrix": [3, 9], "x":9.75, "y":3.25},
+ {"matrix": [3,10], "x":10.75, "y":3.25},
+ {"matrix": [3,11], "x":11.75, "y":3.25},
+ {"matrix": [3,12], "x":12.75, "y":3.25, "w":2.25},
+
+ {"matrix": [4, 0], "x":0, "y":4.25, "w":2.25},
+ {"matrix": [4, 2], "x":2.25, "y":4.25},
+ {"matrix": [4, 3], "x":3.25, "y":4.25},
+ {"matrix": [4, 4], "x":4.25, "y":4.25},
+ {"matrix": [4, 5], "x":5.25, "y":4.25},
+ {"matrix": [4, 6], "x":6.25, "y":4.25},
+ {"matrix": [4, 7], "x":7.25, "y":4.25},
+ {"matrix": [4, 8], "x":8.25, "y":4.25},
+ {"matrix": [4, 9], "x":9.25, "y":4.25},
+ {"matrix": [4,10], "x":10.25, "y":4.25},
+ {"matrix": [4,11], "x":11.25, "y":4.25},
+ {"matrix": [4,12], "x":12.25, "y":4.25, "w":2.75},
+ {"matrix": [4,15], "x":16.25, "y":4.25},
+
+ {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5},
+ {"matrix": [5, 1], "x":1.5, "y":5.25},
+ {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5},
+ {"matrix": [5, 7], "x":4, "y":5.25, "w":7},
+ {"matrix": [5,11], "x":11, "y":5.25, "w":1.5},
+ {"matrix": [5,12], "x":12.5, "y":5.25},
+ {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5},
+ {"matrix": [5,14], "x":15.25, "y":5.25},
+ {"matrix": [5,15], "x":16.25, "y":5.25},
+ {"matrix": [5,16], "x":17.25, "y":5.25}
+ ]
+ },
+ "LAYOUT_tkl_ansi_tsangan_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x":0, "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.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":11, "y":0},
+ {"matrix": [0,11], "x":12, "y":0},
+ {"matrix": [0,12], "x":13, "y":0},
+ {"matrix": [0,13], "x":14, "y":0},
+ {"matrix": [0,14], "x":15.25, "y":0},
+ {"matrix": [0,15], "x":16.25, "y":0},
+ {"matrix": [0,16], "x":17.25, "y":0},
+
+ {"matrix": [1, 0], "x":0, "y":1.25},
+ {"matrix": [1, 1], "x":1, "y":1.25},
+ {"matrix": [1, 2], "x":2, "y":1.25},
+ {"matrix": [1, 3], "x":3, "y":1.25},
+ {"matrix": [1, 4], "x":4, "y":1.25},
+ {"matrix": [1, 5], "x":5, "y":1.25},
+ {"matrix": [1, 6], "x":6, "y":1.25},
+ {"matrix": [1, 7], "x":7, "y":1.25},
+ {"matrix": [1, 8], "x":8, "y":1.25},
+ {"matrix": [1, 9], "x":9, "y":1.25},
+ {"matrix": [1,10], "x":10, "y":1.25},
+ {"matrix": [1,11], "x":11, "y":1.25},
+ {"matrix": [1,12], "x":12, "y":1.25},
+ {"matrix": [1,13], "x":13, "y":1.25},
+ {"matrix": [3,13], "x":14, "y":1.25},
+ {"matrix": [1,14], "x":15.25, "y":1.25},
+ {"matrix": [1,15], "x":16.25, "y":1.25},
+ {"matrix": [1,16], "x":17.25, "y":1.25},
+
+ {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5},
+ {"matrix": [2, 1], "x":1.5, "y":2.25},
+ {"matrix": [2, 2], "x":2.5, "y":2.25},
+ {"matrix": [2, 3], "x":3.5, "y":2.25},
+ {"matrix": [2, 4], "x":4.5, "y":2.25},
+ {"matrix": [2, 5], "x":5.5, "y":2.25},
+ {"matrix": [2, 6], "x":6.5, "y":2.25},
+ {"matrix": [2, 7], "x":7.5, "y":2.25},
+ {"matrix": [2, 8], "x":8.5, "y":2.25},
+ {"matrix": [2, 9], "x":9.5, "y":2.25},
+ {"matrix": [2,10], "x":10.5, "y":2.25},
+ {"matrix": [2,11], "x":11.5, "y":2.25},
+ {"matrix": [2,12], "x":12.5, "y":2.25},
+ {"matrix": [2,13], "x":13.5, "y":2.25, "w":1.5},
+ {"matrix": [2,14], "x":15.25, "y":2.25},
+ {"matrix": [2,15], "x":16.25, "y":2.25},
+ {"matrix": [2,16], "x":17.25, "y":2.25},
+
+ {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75},
+ {"matrix": [3, 1], "x":1.75, "y":3.25},
+ {"matrix": [3, 2], "x":2.75, "y":3.25},
+ {"matrix": [3, 3], "x":3.75, "y":3.25},
+ {"matrix": [3, 4], "x":4.75, "y":3.25},
+ {"matrix": [3, 5], "x":5.75, "y":3.25},
+ {"matrix": [3, 6], "x":6.75, "y":3.25},
+ {"matrix": [3, 7], "x":7.75, "y":3.25},
+ {"matrix": [3, 8], "x":8.75, "y":3.25},
+ {"matrix": [3, 9], "x":9.75, "y":3.25},
+ {"matrix": [3,10], "x":10.75, "y":3.25},
+ {"matrix": [3,11], "x":11.75, "y":3.25},
+ {"matrix": [3,12], "x":12.75, "y":3.25, "w":2.25},
+
+ {"matrix": [4, 0], "x":0, "y":4.25, "w":2.25},
+ {"matrix": [4, 2], "x":2.25, "y":4.25},
+ {"matrix": [4, 3], "x":3.25, "y":4.25},
+ {"matrix": [4, 4], "x":4.25, "y":4.25},
+ {"matrix": [4, 5], "x":5.25, "y":4.25},
+ {"matrix": [4, 6], "x":6.25, "y":4.25},
+ {"matrix": [4, 7], "x":7.25, "y":4.25},
+ {"matrix": [4, 8], "x":8.25, "y":4.25},
+ {"matrix": [4, 9], "x":9.25, "y":4.25},
+ {"matrix": [4,10], "x":10.25, "y":4.25},
+ {"matrix": [4,11], "x":11.25, "y":4.25},
+ {"matrix": [4,12], "x":12.25, "y":4.25, "w":1.75},
+ {"matrix": [4,13], "x":14, "y":4.25},
+ {"matrix": [4,15], "x":16.25, "y":4.25},
+
+ {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5},
+ {"matrix": [5, 1], "x":1.5, "y":5.25},
+ {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5},
+ {"matrix": [5, 7], "x":4, "y":5.25, "w":7},
+ {"matrix": [5,11], "x":11, "y":5.25, "w":1.5},
+ {"matrix": [5,12], "x":12.5, "y":5.25},
+ {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5},
+ {"matrix": [5,14], "x":15.25, "y":5.25},
+ {"matrix": [5,15], "x":16.25, "y":5.25},
+ {"matrix": [5,16], "x":17.25, "y":5.25}
+ ]
+ },
+ "LAYOUT_tkl_ansi_wkl": {
+ "layout": [
+ {"matrix": [0, 0], "x":0, "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.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":11, "y":0},
+ {"matrix": [0,11], "x":12, "y":0},
+ {"matrix": [0,12], "x":13, "y":0},
+ {"matrix": [0,13], "x":14, "y":0},
+ {"matrix": [0,14], "x":15.25, "y":0},
+ {"matrix": [0,15], "x":16.25, "y":0},
+ {"matrix": [0,16], "x":17.25, "y":0},
+
+ {"matrix": [1, 0], "x":0, "y":1.25},
+ {"matrix": [1, 1], "x":1, "y":1.25},
+ {"matrix": [1, 2], "x":2, "y":1.25},
+ {"matrix": [1, 3], "x":3, "y":1.25},
+ {"matrix": [1, 4], "x":4, "y":1.25},
+ {"matrix": [1, 5], "x":5, "y":1.25},
+ {"matrix": [1, 6], "x":6, "y":1.25},
+ {"matrix": [1, 7], "x":7, "y":1.25},
+ {"matrix": [1, 8], "x":8, "y":1.25},
+ {"matrix": [1, 9], "x":9, "y":1.25},
+ {"matrix": [1,10], "x":10, "y":1.25},
+ {"matrix": [1,11], "x":11, "y":1.25},
+ {"matrix": [1,12], "x":12, "y":1.25},
+ {"matrix": [1,13], "x":13, "y":1.25, "w":2},
+ {"matrix": [1,14], "x":15.25, "y":1.25},
+ {"matrix": [1,15], "x":16.25, "y":1.25},
+ {"matrix": [1,16], "x":17.25, "y":1.25},
+
+ {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5},
+ {"matrix": [2, 1], "x":1.5, "y":2.25},
+ {"matrix": [2, 2], "x":2.5, "y":2.25},
+ {"matrix": [2, 3], "x":3.5, "y":2.25},
+ {"matrix": [2, 4], "x":4.5, "y":2.25},
+ {"matrix": [2, 5], "x":5.5, "y":2.25},
+ {"matrix": [2, 6], "x":6.5, "y":2.25},
+ {"matrix": [2, 7], "x":7.5, "y":2.25},
+ {"matrix": [2, 8], "x":8.5, "y":2.25},
+ {"matrix": [2, 9], "x":9.5, "y":2.25},
+ {"matrix": [2,10], "x":10.5, "y":2.25},
+ {"matrix": [2,11], "x":11.5, "y":2.25},
+ {"matrix": [2,12], "x":12.5, "y":2.25},
+ {"matrix": [2,13], "x":13.5, "y":2.25, "w":1.5},
+ {"matrix": [2,14], "x":15.25, "y":2.25},
+ {"matrix": [2,15], "x":16.25, "y":2.25},
+ {"matrix": [2,16], "x":17.25, "y":2.25},
+
+ {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75},
+ {"matrix": [3, 1], "x":1.75, "y":3.25},
+ {"matrix": [3, 2], "x":2.75, "y":3.25},
+ {"matrix": [3, 3], "x":3.75, "y":3.25},
+ {"matrix": [3, 4], "x":4.75, "y":3.25},
+ {"matrix": [3, 5], "x":5.75, "y":3.25},
+ {"matrix": [3, 6], "x":6.75, "y":3.25},
+ {"matrix": [3, 7], "x":7.75, "y":3.25},
+ {"matrix": [3, 8], "x":8.75, "y":3.25},
+ {"matrix": [3, 9], "x":9.75, "y":3.25},
+ {"matrix": [3,10], "x":10.75, "y":3.25},
+ {"matrix": [3,11], "x":11.75, "y":3.25},
+ {"matrix": [3,12], "x":12.75, "y":3.25, "w":2.25},
+
+ {"matrix": [4, 0], "x":0, "y":4.25, "w":2.25},
+ {"matrix": [4, 2], "x":2.25, "y":4.25},
+ {"matrix": [4, 3], "x":3.25, "y":4.25},
+ {"matrix": [4, 4], "x":4.25, "y":4.25},
+ {"matrix": [4, 5], "x":5.25, "y":4.25},
+ {"matrix": [4, 6], "x":6.25, "y":4.25},
+ {"matrix": [4, 7], "x":7.25, "y":4.25},
+ {"matrix": [4, 8], "x":8.25, "y":4.25},
+ {"matrix": [4, 9], "x":9.25, "y":4.25},
+ {"matrix": [4,10], "x":10.25, "y":4.25},
+ {"matrix": [4,11], "x":11.25, "y":4.25},
+ {"matrix": [4,12], "x":12.25, "y":4.25, "w":2.75},
+ {"matrix": [4,15], "x":16.25, "y":4.25},
+
+ {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5},
+ {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5},
+ {"matrix": [5, 7], "x":4, "y":5.25, "w":7},
+ {"matrix": [5,11], "x":11, "y":5.25, "w":1.5},
+ {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5},
+ {"matrix": [5,14], "x":15.25, "y":5.25},
+ {"matrix": [5,15], "x":16.25, "y":5.25},
+ {"matrix": [5,16], "x":17.25, "y":5.25}
+ ]
+ },
+ "LAYOUT_tkl_ansi_wkl_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x":0, "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.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":11, "y":0},
+ {"matrix": [0,11], "x":12, "y":0},
+ {"matrix": [0,12], "x":13, "y":0},
+ {"matrix": [0,13], "x":14, "y":0},
+ {"matrix": [0,14], "x":15.25, "y":0},
+ {"matrix": [0,15], "x":16.25, "y":0},
+ {"matrix": [0,16], "x":17.25, "y":0},
+
+ {"matrix": [1, 0], "x":0, "y":1.25},
+ {"matrix": [1, 1], "x":1, "y":1.25},
+ {"matrix": [1, 2], "x":2, "y":1.25},
+ {"matrix": [1, 3], "x":3, "y":1.25},
+ {"matrix": [1, 4], "x":4, "y":1.25},
+ {"matrix": [1, 5], "x":5, "y":1.25},
+ {"matrix": [1, 6], "x":6, "y":1.25},
+ {"matrix": [1, 7], "x":7, "y":1.25},
+ {"matrix": [1, 8], "x":8, "y":1.25},
+ {"matrix": [1, 9], "x":9, "y":1.25},
+ {"matrix": [1,10], "x":10, "y":1.25},
+ {"matrix": [1,11], "x":11, "y":1.25},
+ {"matrix": [1,12], "x":12, "y":1.25},
+ {"matrix": [1,13], "x":13, "y":1.25},
+ {"matrix": [3,13], "x":14, "y":1.25},
+ {"matrix": [1,14], "x":15.25, "y":1.25},
+ {"matrix": [1,15], "x":16.25, "y":1.25},
+ {"matrix": [1,16], "x":17.25, "y":1.25},
+
+ {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5},
+ {"matrix": [2, 1], "x":1.5, "y":2.25},
+ {"matrix": [2, 2], "x":2.5, "y":2.25},
+ {"matrix": [2, 3], "x":3.5, "y":2.25},
+ {"matrix": [2, 4], "x":4.5, "y":2.25},
+ {"matrix": [2, 5], "x":5.5, "y":2.25},
+ {"matrix": [2, 6], "x":6.5, "y":2.25},
+ {"matrix": [2, 7], "x":7.5, "y":2.25},
+ {"matrix": [2, 8], "x":8.5, "y":2.25},
+ {"matrix": [2, 9], "x":9.5, "y":2.25},
+ {"matrix": [2,10], "x":10.5, "y":2.25},
+ {"matrix": [2,11], "x":11.5, "y":2.25},
+ {"matrix": [2,12], "x":12.5, "y":2.25},
+ {"matrix": [2,13], "x":13.5, "y":2.25, "w":1.5},
+ {"matrix": [2,14], "x":15.25, "y":2.25},
+ {"matrix": [2,15], "x":16.25, "y":2.25},
+ {"matrix": [2,16], "x":17.25, "y":2.25},
+
+ {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75},
+ {"matrix": [3, 1], "x":1.75, "y":3.25},
+ {"matrix": [3, 2], "x":2.75, "y":3.25},
+ {"matrix": [3, 3], "x":3.75, "y":3.25},
+ {"matrix": [3, 4], "x":4.75, "y":3.25},
+ {"matrix": [3, 5], "x":5.75, "y":3.25},
+ {"matrix": [3, 6], "x":6.75, "y":3.25},
+ {"matrix": [3, 7], "x":7.75, "y":3.25},
+ {"matrix": [3, 8], "x":8.75, "y":3.25},
+ {"matrix": [3, 9], "x":9.75, "y":3.25},
+ {"matrix": [3,10], "x":10.75, "y":3.25},
+ {"matrix": [3,11], "x":11.75, "y":3.25},
+ {"matrix": [3,12], "x":12.75, "y":3.25, "w":2.25},
+
+ {"matrix": [4, 0], "x":0, "y":4.25, "w":2.25},
+ {"matrix": [4, 2], "x":2.25, "y":4.25},
+ {"matrix": [4, 3], "x":3.25, "y":4.25},
+ {"matrix": [4, 4], "x":4.25, "y":4.25},
+ {"matrix": [4, 5], "x":5.25, "y":4.25},
+ {"matrix": [4, 6], "x":6.25, "y":4.25},
+ {"matrix": [4, 7], "x":7.25, "y":4.25},
+ {"matrix": [4, 8], "x":8.25, "y":4.25},
+ {"matrix": [4, 9], "x":9.25, "y":4.25},
+ {"matrix": [4,10], "x":10.25, "y":4.25},
+ {"matrix": [4,11], "x":11.25, "y":4.25},
+ {"matrix": [4,12], "x":12.25, "y":4.25, "w":1.75},
+ {"matrix": [4,13], "x":14, "y":4.25},
+ {"matrix": [4,15], "x":16.25, "y":4.25},
+
+ {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5},
+ {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5},
+ {"matrix": [5, 7], "x":4, "y":5.25, "w":7},
+ {"matrix": [5,11], "x":11, "y":5.25, "w":1.5},
+ {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5},
+ {"matrix": [5,14], "x":15.25, "y":5.25},
+ {"matrix": [5,15], "x":16.25, "y":5.25},
+ {"matrix": [5,16], "x":17.25, "y":5.25}
+ ]
+ }
+ }
+}
diff --git a/keyboards/plywrks/ply8x/hotswap/keymaps/default/keymap.c b/keyboards/plywrks/ply8x/hotswap/keymaps/default/keymap.c
new file mode 100644
index 0000000000..0da2588ea7
--- /dev/null
+++ b/keyboards/plywrks/ply8x/hotswap/keymaps/default/keymap.c
@@ -0,0 +1,32 @@
+// Copyright 2023 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include QMK_KEYBOARD_H
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ /*
+ * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐
+ * │Esc│ │F1 │F2 │F3 │F4 │ │F5 │F6 │F7 │F8 │ │F9 │F10│F11│F12│ │PSc│Scr│Pse│
+ * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘
+ * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐
+ * │ ` │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ - │ = │ Backsp│ │Ins│Hom│PgU│
+ * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤
+ * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │ [ │ ] │ \ │ │Del│End│PgD│
+ * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘
+ * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │ ; │ ' │ Enter │
+ * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐
+ * │ Shift │ Z │ X │ C │ V │ B │ N │ M │ , │ . │ / │ Shift │ │ ↑ │
+ * ├────┬───┴┬──┴─┬─┴───┴───┴───┴───┴───┴───┴───┼───┴┬────┬────┤ ┌───┼───┼───┐
+ * │Ctrl│GUI │Alt │ │ Alt│ GUI│Ctrl│ │ ← │ ↓ │ → │
+ * └────┴────┴────┴─────────────────────────────┴────┴────┴────┘ └───┴───┴───┘
+ */
+ [0] = LAYOUT_tkl_ansi_tsangan(
+ KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_SCRL, KC_PAUS,
+
+ KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_INS, KC_HOME, KC_PGUP,
+ KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_DEL, KC_END, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_ENT,
+ KC_LSFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT, KC_UP,
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
+};
diff --git a/keyboards/plywrks/ply8x/mcuconf.h b/keyboards/plywrks/ply8x/hotswap/mcuconf.h
index aceb2e3dfc..aceb2e3dfc 100644
--- a/keyboards/plywrks/ply8x/mcuconf.h
+++ b/keyboards/plywrks/ply8x/hotswap/mcuconf.h
diff --git a/keyboards/plywrks/ply8x/solder/config.h b/keyboards/plywrks/ply8x/solder/config.h
new file mode 100644
index 0000000000..3fc4de978d
--- /dev/null
+++ b/keyboards/plywrks/ply8x/solder/config.h
@@ -0,0 +1,10 @@
+// Copyright 2023 Ramon Imbao (@ramonimbao)
+// SPDX-License-Identifier: GPL-2.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_SPI_SCK_PAL_MODE 0
+#define WS2812_EXTERNAL_PULLUP
diff --git a/keyboards/plywrks/ply8x/solder/halconf.h b/keyboards/plywrks/ply8x/solder/halconf.h
new file mode 100644
index 0000000000..e215e323c5
--- /dev/null
+++ b/keyboards/plywrks/ply8x/solder/halconf.h
@@ -0,0 +1,8 @@
+// Copyright 2023 Ramon Imbao (@ramonimbao)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#define HAL_USE_SPI TRUE
+
+#include_next <halconf.h>
diff --git a/keyboards/plywrks/ply8x/keyboard.json b/keyboards/plywrks/ply8x/solder/keyboard.json
index 7c0717ade0..8bae31a1f1 100644
--- a/keyboards/plywrks/ply8x/keyboard.json
+++ b/keyboards/plywrks/ply8x/solder/keyboard.json
@@ -21,8 +21,8 @@
"url": "",
"usb": {
"device_version": "1.0.0",
- "pid": "0x7905",
- "vid": "0x706C"
+ "vid": "0x706C",
+ "pid": "0x7905"
},
"ws2812": {
"pin": "B15",
@@ -76,12 +76,106 @@
},
"driver": "ws2812",
"layout": [
- {"flags": 8, "matrix": [3, 0], "x":2, "y":27},
- {"flags": 8, "matrix": [0,15], "x":211, "y":0},
- {"flags": 2, "x":0, "y":0},
- {"flags": 2, "x":10, "y":0},
- {"flags": 2, "x":20, "y":0},
- {"flags": 2, "x":30, "y":0}
+ {"flags": 8, "matrix": [3, 0], "x":5, "y":40},
+ {"flags": 8, "matrix": [0,15], "x":208, "y":0},
+ {"flags": 2, "x":224, "y":37},
+ {"flags": 2, "x":224, "y":43},
+ {"flags": 2, "x":218, "y":43},
+ {"flags": 2, "x":218, "y":37},
+
+ {"flags": 2, "matrix": [0, 0], "x":0, "y": 0},
+ {"flags": 2, "matrix": [0, 2], "x":26, "y": 0},
+ {"flags": 2, "matrix": [0, 3], "x":38, "y": 0},
+ {"flags": 2, "matrix": [0, 4], "x":51, "y": 0},
+ {"flags": 2, "matrix": [0, 5], "x":64, "y": 0},
+ {"flags": 2, "matrix": [0, 6], "x":83, "y": 0},
+ {"flags": 2, "matrix": [0, 7], "x":96, "y": 0},
+ {"flags": 2, "matrix": [0, 8], "x":109, "y": 0},
+ {"flags": 2, "matrix": [0, 9], "x":122, "y": 0},
+ {"flags": 2, "matrix": [0,10], "x":141, "y": 0},
+ {"flags": 2, "matrix": [0,11], "x":154, "y": 0},
+ {"flags": 2, "matrix": [0,12], "x":166, "y": 0},
+ {"flags": 2, "matrix": [0,13], "x":179, "y": 0},
+ {"flags": 2, "matrix": [0,14], "x":195, "y": 0},
+ {"flags": 2, "matrix": [0,16], "x":221, "y": 0},
+
+ {"flags": 2, "matrix": [1, 0], "x":0, "y": 15},
+ {"flags": 2, "matrix": [1, 1], "x":13, "y": 15},
+ {"flags": 2, "matrix": [1, 2], "x":26, "y": 15},
+ {"flags": 2, "matrix": [1, 3], "x":38, "y": 15},
+ {"flags": 2, "matrix": [1, 4], "x":51, "y": 15},
+ {"flags": 2, "matrix": [1, 5], "x":64, "y": 15},
+ {"flags": 2, "matrix": [1, 6], "x":77, "y": 15},
+ {"flags": 2, "matrix": [1, 7], "x":90, "y": 15},
+ {"flags": 2, "matrix": [1, 8], "x":102, "y": 15},
+ {"flags": 2, "matrix": [1, 9], "x":115, "y": 15},
+ {"flags": 2, "matrix": [1,10], "x":128, "y": 15},
+ {"flags": 2, "matrix": [1,11], "x":141, "y": 15},
+ {"flags": 2, "matrix": [1,12], "x":154, "y": 15},
+ {"flags": 2, "matrix": [1,13], "x":166, "y": 15},
+ {"flags": 2, "matrix": [3,13], "x":179, "y": 15},
+ {"flags": 2, "matrix": [1,14], "x":195, "y": 15},
+ {"flags": 2, "matrix": [1,15], "x":208, "y": 15},
+ {"flags": 2, "matrix": [1,16], "x":221, "y": 15},
+
+ {"flags": 2, "matrix": [2, 0], "x":3, "y": 27},
+ {"flags": 2, "matrix": [2, 1], "x":19, "y": 27},
+ {"flags": 2, "matrix": [2, 2], "x":32, "y": 27},
+ {"flags": 2, "matrix": [2, 3], "x":45, "y": 27},
+ {"flags": 2, "matrix": [2, 4], "x":58, "y": 27},
+ {"flags": 2, "matrix": [2, 5], "x":70, "y": 27},
+ {"flags": 2, "matrix": [2, 6], "x":83, "y": 27},
+ {"flags": 2, "matrix": [2, 7], "x":96, "y": 27},
+ {"flags": 2, "matrix": [2, 8], "x":109, "y": 27},
+ {"flags": 2, "matrix": [2, 9], "x":122, "y": 27},
+ {"flags": 2, "matrix": [2,10], "x":134, "y": 27},
+ {"flags": 2, "matrix": [2,11], "x":147, "y": 27},
+ {"flags": 2, "matrix": [2,12], "x":160, "y": 27},
+ {"flags": 2, "matrix": [2,13], "x":176, "y": 27},
+ {"flags": 2, "matrix": [2,14], "x":195, "y": 27},
+ {"flags": 2, "matrix": [2,15], "x":208, "y": 27},
+ {"flags": 2, "matrix": [2,16], "x":221, "y": 27},
+
+ {"flags": 2, "matrix": [3, 1], "x":23, "y": 40},
+ {"flags": 2, "matrix": [3, 2], "x":36, "y": 40},
+ {"flags": 2, "matrix": [3, 3], "x":49, "y": 40},
+ {"flags": 2, "matrix": [3, 4], "x":62, "y": 40},
+ {"flags": 2, "matrix": [3, 5], "x":75, "y": 40},
+ {"flags": 2, "matrix": [3, 6], "x":88, "y": 40},
+ {"flags": 2, "matrix": [3, 7], "x":101, "y": 40},
+ {"flags": 2, "matrix": [3, 8], "x":114, "y": 40},
+ {"flags": 2, "matrix": [3, 9], "x":127, "y": 40},
+ {"flags": 2, "matrix": [3,10], "x":140, "y": 40},
+ {"flags": 2, "matrix": [3,11], "x":153, "y": 40},
+ {"flags": 2, "matrix": [3,12], "x":166, "y": 40},
+
+ {"flags": 2, "matrix": [4, 0], "x":2, "y": 52},
+ {"flags": 2, "matrix": [4, 1], "x":16, "y": 52},
+ {"flags": 2, "matrix": [4, 2], "x":29, "y": 52},
+ {"flags": 2, "matrix": [4, 3], "x":42, "y": 52},
+ {"flags": 2, "matrix": [4, 4], "x":54, "y": 52},
+ {"flags": 2, "matrix": [4, 5], "x":67, "y": 52},
+ {"flags": 2, "matrix": [4, 6], "x":80, "y": 52},
+ {"flags": 2, "matrix": [4, 7], "x":93, "y": 52},
+ {"flags": 2, "matrix": [4, 8], "x":106, "y": 52},
+ {"flags": 2, "matrix": [4, 9], "x":118, "y": 52},
+ {"flags": 2, "matrix": [4,10], "x":131, "y": 52},
+ {"flags": 2, "matrix": [4,11], "x":144, "y": 52},
+ {"flags": 2, "matrix": [4,12], "x":162, "y": 52},
+ {"flags": 2, "matrix": [4,13], "x":179, "y": 52},
+ {"flags": 2, "matrix": [4,15], "x":208, "y": 52},
+
+ {"flags": 2, "matrix": [5, 0], "x":2, "y": 64},
+ {"flags": 2, "matrix": [5, 1], "x":18, "y": 64},
+ {"flags": 2, "matrix": [5, 2], "x":34, "y": 64},
+ {"flags": 2, "matrix": [5, 6], "x":82, "y": 64},
+ {"flags": 2, "matrix": [5,10], "x":130, "y": 64},
+ {"flags": 2, "matrix": [5,11], "x":146, "y": 64},
+ {"flags": 2, "matrix": [5,12], "x":162, "y": 64},
+ {"flags": 2, "matrix": [5,13], "x":178, "y": 64},
+ {"flags": 2, "matrix": [5,14], "x":195, "y": 64},
+ {"flags": 2, "matrix": [5,15], "x":208, "y": 64},
+ {"flags": 2, "matrix": [5,16], "x":221, "y": 64}
]
},
"layout_aliases": {
@@ -92,11 +186,15 @@
"tkl_ansi",
"tkl_ansi_split_bs_rshift",
"tkl_ansi_tsangan",
+ "tkl_ansi_wkl",
"tkl_ansi_tsangan_split_bs_rshift",
+ "tkl_ansi_wkl_split_bs_rshift",
"tkl_iso",
"tkl_iso_split_bs_rshift",
"tkl_iso_tsangan",
- "tkl_iso_tsangan_split_bs_rshift"
+ "tkl_iso_wkl",
+ "tkl_iso_tsangan_split_bs_rshift",
+ "tkl_iso_wkl_split_bs_rshift"
],
"layouts": {
"LAYOUT_tkl_ansi": {
@@ -388,6 +486,99 @@
{"matrix": [5,16], "x":17.25, "y":5.25}
]
},
+ "LAYOUT_tkl_ansi_wkl": {
+ "layout": [
+ {"matrix": [0, 0], "x":0, "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.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":11, "y":0},
+ {"matrix": [0,11], "x":12, "y":0},
+ {"matrix": [0,12], "x":13, "y":0},
+ {"matrix": [0,13], "x":14, "y":0},
+ {"matrix": [0,14], "x":15.25, "y":0},
+ {"matrix": [0,15], "x":16.25, "y":0},
+ {"matrix": [0,16], "x":17.25, "y":0},
+
+ {"matrix": [1, 0], "x":0, "y":1.25},
+ {"matrix": [1, 1], "x":1, "y":1.25},
+ {"matrix": [1, 2], "x":2, "y":1.25},
+ {"matrix": [1, 3], "x":3, "y":1.25},
+ {"matrix": [1, 4], "x":4, "y":1.25},
+ {"matrix": [1, 5], "x":5, "y":1.25},
+ {"matrix": [1, 6], "x":6, "y":1.25},
+ {"matrix": [1, 7], "x":7, "y":1.25},
+ {"matrix": [1, 8], "x":8, "y":1.25},
+ {"matrix": [1, 9], "x":9, "y":1.25},
+ {"matrix": [1,10], "x":10, "y":1.25},
+ {"matrix": [1,11], "x":11, "y":1.25},
+ {"matrix": [1,12], "x":12, "y":1.25},
+ {"matrix": [1,13], "x":13, "y":1.25, "w":2},
+ {"matrix": [1,14], "x":15.25, "y":1.25},
+ {"matrix": [1,15], "x":16.25, "y":1.25},
+ {"matrix": [1,16], "x":17.25, "y":1.25},
+
+ {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5},
+ {"matrix": [2, 1], "x":1.5, "y":2.25},
+ {"matrix": [2, 2], "x":2.5, "y":2.25},
+ {"matrix": [2, 3], "x":3.5, "y":2.25},
+ {"matrix": [2, 4], "x":4.5, "y":2.25},
+ {"matrix": [2, 5], "x":5.5, "y":2.25},
+ {"matrix": [2, 6], "x":6.5, "y":2.25},
+ {"matrix": [2, 7], "x":7.5, "y":2.25},
+ {"matrix": [2, 8], "x":8.5, "y":2.25},
+ {"matrix": [2, 9], "x":9.5, "y":2.25},
+ {"matrix": [2,10], "x":10.5, "y":2.25},
+ {"matrix": [2,11], "x":11.5, "y":2.25},
+ {"matrix": [2,12], "x":12.5, "y":2.25},
+ {"matrix": [2,13], "x":13.5, "y":2.25, "w":1.5},
+ {"matrix": [2,14], "x":15.25, "y":2.25},
+ {"matrix": [2,15], "x":16.25, "y":2.25},
+ {"matrix": [2,16], "x":17.25, "y":2.25},
+
+ {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75},
+ {"matrix": [3, 1], "x":1.75, "y":3.25},
+ {"matrix": [3, 2], "x":2.75, "y":3.25},
+ {"matrix": [3, 3], "x":3.75, "y":3.25},
+ {"matrix": [3, 4], "x":4.75, "y":3.25},
+ {"matrix": [3, 5], "x":5.75, "y":3.25},
+ {"matrix": [3, 6], "x":6.75, "y":3.25},
+ {"matrix": [3, 7], "x":7.75, "y":3.25},
+ {"matrix": [3, 8], "x":8.75, "y":3.25},
+ {"matrix": [3, 9], "x":9.75, "y":3.25},
+ {"matrix": [3,10], "x":10.75, "y":3.25},
+ {"matrix": [3,11], "x":11.75, "y":3.25},
+ {"matrix": [3,12], "x":12.75, "y":3.25, "w":2.25},
+
+ {"matrix": [4, 0], "x":0, "y":4.25, "w":2.25},
+ {"matrix": [4, 2], "x":2.25, "y":4.25},
+ {"matrix": [4, 3], "x":3.25, "y":4.25},
+ {"matrix": [4, 4], "x":4.25, "y":4.25},
+ {"matrix": [4, 5], "x":5.25, "y":4.25},
+ {"matrix": [4, 6], "x":6.25, "y":4.25},
+ {"matrix": [4, 7], "x":7.25, "y":4.25},
+ {"matrix": [4, 8], "x":8.25, "y":4.25},
+ {"matrix": [4, 9], "x":9.25, "y":4.25},
+ {"matrix": [4,10], "x":10.25, "y":4.25},
+ {"matrix": [4,11], "x":11.25, "y":4.25},
+ {"matrix": [4,12], "x":12.25, "y":4.25, "w":2.75},
+ {"matrix": [4,15], "x":16.25, "y":4.25},
+
+ {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5},
+ {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5},
+ {"matrix": [5, 6], "x":4, "y":5.25, "w":7},
+ {"matrix": [5,11], "x":11, "y":5.25, "w":1.5},
+ {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5},
+ {"matrix": [5,14], "x":15.25, "y":5.25},
+ {"matrix": [5,15], "x":16.25, "y":5.25},
+ {"matrix": [5,16], "x":17.25, "y":5.25}
+ ]
+ },
"LAYOUT_tkl_ansi_tsangan_split_bs_rshift": {
"layout": [
{"matrix": [0, 0], "x":0, "y":0},
@@ -485,6 +676,101 @@
{"matrix": [5,16], "x":17.25, "y":5.25}
]
},
+ "LAYOUT_tkl_ansi_wkl_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x":0, "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.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":11, "y":0},
+ {"matrix": [0,11], "x":12, "y":0},
+ {"matrix": [0,12], "x":13, "y":0},
+ {"matrix": [0,13], "x":14, "y":0},
+ {"matrix": [0,14], "x":15.25, "y":0},
+ {"matrix": [0,15], "x":16.25, "y":0},
+ {"matrix": [0,16], "x":17.25, "y":0},
+
+ {"matrix": [1, 0], "x":0, "y":1.25},
+ {"matrix": [1, 1], "x":1, "y":1.25},
+ {"matrix": [1, 2], "x":2, "y":1.25},
+ {"matrix": [1, 3], "x":3, "y":1.25},
+ {"matrix": [1, 4], "x":4, "y":1.25},
+ {"matrix": [1, 5], "x":5, "y":1.25},
+ {"matrix": [1, 6], "x":6, "y":1.25},
+ {"matrix": [1, 7], "x":7, "y":1.25},
+ {"matrix": [1, 8], "x":8, "y":1.25},
+ {"matrix": [1, 9], "x":9, "y":1.25},
+ {"matrix": [1,10], "x":10, "y":1.25},
+ {"matrix": [1,11], "x":11, "y":1.25},
+ {"matrix": [1,12], "x":12, "y":1.25},
+ {"matrix": [1,13], "x":13, "y":1.25},
+ {"matrix": [3,13], "x":14, "y":1.25},
+ {"matrix": [1,14], "x":15.25, "y":1.25},
+ {"matrix": [1,15], "x":16.25, "y":1.25},
+ {"matrix": [1,16], "x":17.25, "y":1.25},
+
+ {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5},
+ {"matrix": [2, 1], "x":1.5, "y":2.25},
+ {"matrix": [2, 2], "x":2.5, "y":2.25},
+ {"matrix": [2, 3], "x":3.5, "y":2.25},
+ {"matrix": [2, 4], "x":4.5, "y":2.25},
+ {"matrix": [2, 5], "x":5.5, "y":2.25},
+ {"matrix": [2, 6], "x":6.5, "y":2.25},
+ {"matrix": [2, 7], "x":7.5, "y":2.25},
+ {"matrix": [2, 8], "x":8.5, "y":2.25},
+ {"matrix": [2, 9], "x":9.5, "y":2.25},
+ {"matrix": [2,10], "x":10.5, "y":2.25},
+ {"matrix": [2,11], "x":11.5, "y":2.25},
+ {"matrix": [2,12], "x":12.5, "y":2.25},
+ {"matrix": [2,13], "x":13.5, "y":2.25, "w":1.5},
+ {"matrix": [2,14], "x":15.25, "y":2.25},
+ {"matrix": [2,15], "x":16.25, "y":2.25},
+ {"matrix": [2,16], "x":17.25, "y":2.25},
+
+ {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75},
+ {"matrix": [3, 1], "x":1.75, "y":3.25},
+ {"matrix": [3, 2], "x":2.75, "y":3.25},
+ {"matrix": [3, 3], "x":3.75, "y":3.25},
+ {"matrix": [3, 4], "x":4.75, "y":3.25},
+ {"matrix": [3, 5], "x":5.75, "y":3.25},
+ {"matrix": [3, 6], "x":6.75, "y":3.25},
+ {"matrix": [3, 7], "x":7.75, "y":3.25},
+ {"matrix": [3, 8], "x":8.75, "y":3.25},
+ {"matrix": [3, 9], "x":9.75, "y":3.25},
+ {"matrix": [3,10], "x":10.75, "y":3.25},
+ {"matrix": [3,11], "x":11.75, "y":3.25},
+ {"matrix": [3,12], "x":12.75, "y":3.25, "w":2.25},
+
+ {"matrix": [4, 0], "x":0, "y":4.25, "w":2.25},
+ {"matrix": [4, 2], "x":2.25, "y":4.25},
+ {"matrix": [4, 3], "x":3.25, "y":4.25},
+ {"matrix": [4, 4], "x":4.25, "y":4.25},
+ {"matrix": [4, 5], "x":5.25, "y":4.25},
+ {"matrix": [4, 6], "x":6.25, "y":4.25},
+ {"matrix": [4, 7], "x":7.25, "y":4.25},
+ {"matrix": [4, 8], "x":8.25, "y":4.25},
+ {"matrix": [4, 9], "x":9.25, "y":4.25},
+ {"matrix": [4,10], "x":10.25, "y":4.25},
+ {"matrix": [4,11], "x":11.25, "y":4.25},
+ {"matrix": [4,12], "x":12.25, "y":4.25, "w":1.75},
+ {"matrix": [4,13], "x":14, "y":4.25},
+ {"matrix": [4,15], "x":16.25, "y":4.25},
+
+ {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5},
+ {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5},
+ {"matrix": [5, 6], "x":4, "y":5.25, "w":7},
+ {"matrix": [5,11], "x":11, "y":5.25, "w":1.5},
+ {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5},
+ {"matrix": [5,14], "x":15.25, "y":5.25},
+ {"matrix": [5,15], "x":16.25, "y":5.25},
+ {"matrix": [5,16], "x":17.25, "y":5.25}
+ ]
+ },
"LAYOUT_tkl_iso": {
"layout": [
{"matrix": [0, 0], "x":0, "y":0},
@@ -777,6 +1063,100 @@
{"matrix": [5,16], "x":17.25, "y":5.25}
]
},
+ "LAYOUT_tkl_iso_wkl": {
+ "layout": [
+ {"matrix": [0, 0], "x":0, "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.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":11, "y":0},
+ {"matrix": [0,11], "x":12, "y":0},
+ {"matrix": [0,12], "x":13, "y":0},
+ {"matrix": [0,13], "x":14, "y":0},
+ {"matrix": [0,14], "x":15.25, "y":0},
+ {"matrix": [0,15], "x":16.25, "y":0},
+ {"matrix": [0,16], "x":17.25, "y":0},
+
+ {"matrix": [1, 0], "x":0, "y":1.25},
+ {"matrix": [1, 1], "x":1, "y":1.25},
+ {"matrix": [1, 2], "x":2, "y":1.25},
+ {"matrix": [1, 3], "x":3, "y":1.25},
+ {"matrix": [1, 4], "x":4, "y":1.25},
+ {"matrix": [1, 5], "x":5, "y":1.25},
+ {"matrix": [1, 6], "x":6, "y":1.25},
+ {"matrix": [1, 7], "x":7, "y":1.25},
+ {"matrix": [1, 8], "x":8, "y":1.25},
+ {"matrix": [1, 9], "x":9, "y":1.25},
+ {"matrix": [1,10], "x":10, "y":1.25},
+ {"matrix": [1,11], "x":11, "y":1.25},
+ {"matrix": [1,12], "x":12, "y":1.25},
+ {"matrix": [1,13], "x":13, "y":1.25, "w":2},
+ {"matrix": [1,14], "x":15.25, "y":1.25},
+ {"matrix": [1,15], "x":16.25, "y":1.25},
+ {"matrix": [1,16], "x":17.25, "y":1.25},
+
+ {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5},
+ {"matrix": [2, 1], "x":1.5, "y":2.25},
+ {"matrix": [2, 2], "x":2.5, "y":2.25},
+ {"matrix": [2, 3], "x":3.5, "y":2.25},
+ {"matrix": [2, 4], "x":4.5, "y":2.25},
+ {"matrix": [2, 5], "x":5.5, "y":2.25},
+ {"matrix": [2, 6], "x":6.5, "y":2.25},
+ {"matrix": [2, 7], "x":7.5, "y":2.25},
+ {"matrix": [2, 8], "x":8.5, "y":2.25},
+ {"matrix": [2, 9], "x":9.5, "y":2.25},
+ {"matrix": [2,10], "x":10.5, "y":2.25},
+ {"matrix": [2,11], "x":11.5, "y":2.25},
+ {"matrix": [2,12], "x":12.5, "y":2.25},
+ {"matrix": [2,14], "x":15.25, "y":2.25},
+ {"matrix": [2,15], "x":16.25, "y":2.25},
+ {"matrix": [2,16], "x":17.25, "y":2.25},
+
+ {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75},
+ {"matrix": [3, 1], "x":1.75, "y":3.25},
+ {"matrix": [3, 2], "x":2.75, "y":3.25},
+ {"matrix": [3, 3], "x":3.75, "y":3.25},
+ {"matrix": [3, 4], "x":4.75, "y":3.25},
+ {"matrix": [3, 5], "x":5.75, "y":3.25},
+ {"matrix": [3, 6], "x":6.75, "y":3.25},
+ {"matrix": [3, 7], "x":7.75, "y":3.25},
+ {"matrix": [3, 8], "x":8.75, "y":3.25},
+ {"matrix": [3, 9], "x":9.75, "y":3.25},
+ {"matrix": [3,10], "x":10.75, "y":3.25},
+ {"matrix": [3,11], "x":11.75, "y":3.25},
+ {"matrix": [3,12], "x":12.75, "y":3.25},
+ {"matrix": [2,13], "x":13.75, "y":2.25, "w":1.25, "h":2},
+
+ {"matrix": [4, 0], "x":0, "y":4.25, "w":1.25},
+ {"matrix": [4, 1], "x":1.25, "y":4.25},
+ {"matrix": [4, 2], "x":2.25, "y":4.25},
+ {"matrix": [4, 3], "x":3.25, "y":4.25},
+ {"matrix": [4, 4], "x":4.25, "y":4.25},
+ {"matrix": [4, 5], "x":5.25, "y":4.25},
+ {"matrix": [4, 6], "x":6.25, "y":4.25},
+ {"matrix": [4, 7], "x":7.25, "y":4.25},
+ {"matrix": [4, 8], "x":8.25, "y":4.25},
+ {"matrix": [4, 9], "x":9.25, "y":4.25},
+ {"matrix": [4,10], "x":10.25, "y":4.25},
+ {"matrix": [4,11], "x":11.25, "y":4.25},
+ {"matrix": [4,12], "x":12.25, "y":4.25, "w":2.75},
+ {"matrix": [4,15], "x":16.25, "y":4.25},
+
+ {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5},
+ {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5},
+ {"matrix": [5, 6], "x":4, "y":5.25, "w":7},
+ {"matrix": [5,11], "x":11, "y":5.25, "w":1.5},
+ {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5},
+ {"matrix": [5,14], "x":15.25, "y":5.25},
+ {"matrix": [5,15], "x":16.25, "y":5.25},
+ {"matrix": [5,16], "x":17.25, "y":5.25}
+ ]
+ },
"LAYOUT_tkl_iso_tsangan_split_bs_rshift": {
"layout": [
{"matrix": [0, 0], "x":0, "y":0},
@@ -875,6 +1255,102 @@
{"matrix": [5,16], "x":17.25, "y":5.25}
]
},
+ "LAYOUT_tkl_iso_wkl_split_bs_rshift": {
+ "layout": [
+ {"matrix": [0, 0], "x":0, "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.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":11, "y":0},
+ {"matrix": [0,11], "x":12, "y":0},
+ {"matrix": [0,12], "x":13, "y":0},
+ {"matrix": [0,13], "x":14, "y":0},
+ {"matrix": [0,14], "x":15.25, "y":0},
+ {"matrix": [0,15], "x":16.25, "y":0},
+ {"matrix": [0,16], "x":17.25, "y":0},
+
+ {"matrix": [1, 0], "x":0, "y":1.25},
+ {"matrix": [1, 1], "x":1, "y":1.25},
+ {"matrix": [1, 2], "x":2, "y":1.25},
+ {"matrix": [1, 3], "x":3, "y":1.25},
+ {"matrix": [1, 4], "x":4, "y":1.25},
+ {"matrix": [1, 5], "x":5, "y":1.25},
+ {"matrix": [1, 6], "x":6, "y":1.25},
+ {"matrix": [1, 7], "x":7, "y":1.25},
+ {"matrix": [1, 8], "x":8, "y":1.25},
+ {"matrix": [1, 9], "x":9, "y":1.25},
+ {"matrix": [1,10], "x":10, "y":1.25},
+ {"matrix": [1,11], "x":11, "y":1.25},
+ {"matrix": [1,12], "x":12, "y":1.25},
+ {"matrix": [1,13], "x":13, "y":1.25},
+ {"matrix": [3,13], "x":14, "y":1.25},
+ {"matrix": [1,14], "x":15.25, "y":1.25},
+ {"matrix": [1,15], "x":16.25, "y":1.25},
+ {"matrix": [1,16], "x":17.25, "y":1.25},
+
+ {"matrix": [2, 0], "x":0, "y":2.25, "w":1.5},
+ {"matrix": [2, 1], "x":1.5, "y":2.25},
+ {"matrix": [2, 2], "x":2.5, "y":2.25},
+ {"matrix": [2, 3], "x":3.5, "y":2.25},
+ {"matrix": [2, 4], "x":4.5, "y":2.25},
+ {"matrix": [2, 5], "x":5.5, "y":2.25},
+ {"matrix": [2, 6], "x":6.5, "y":2.25},
+ {"matrix": [2, 7], "x":7.5, "y":2.25},
+ {"matrix": [2, 8], "x":8.5, "y":2.25},
+ {"matrix": [2, 9], "x":9.5, "y":2.25},
+ {"matrix": [2,10], "x":10.5, "y":2.25},
+ {"matrix": [2,11], "x":11.5, "y":2.25},
+ {"matrix": [2,12], "x":12.5, "y":2.25},
+ {"matrix": [2,14], "x":15.25, "y":2.25},
+ {"matrix": [2,15], "x":16.25, "y":2.25},
+ {"matrix": [2,16], "x":17.25, "y":2.25},
+
+ {"matrix": [3, 0], "x":0, "y":3.25, "w":1.75},
+ {"matrix": [3, 1], "x":1.75, "y":3.25},
+ {"matrix": [3, 2], "x":2.75, "y":3.25},
+ {"matrix": [3, 3], "x":3.75, "y":3.25},
+ {"matrix": [3, 4], "x":4.75, "y":3.25},
+ {"matrix": [3, 5], "x":5.75, "y":3.25},
+ {"matrix": [3, 6], "x":6.75, "y":3.25},
+ {"matrix": [3, 7], "x":7.75, "y":3.25},
+ {"matrix": [3, 8], "x":8.75, "y":3.25},
+ {"matrix": [3, 9], "x":9.75, "y":3.25},
+ {"matrix": [3,10], "x":10.75, "y":3.25},
+ {"matrix": [3,11], "x":11.75, "y":3.25},
+ {"matrix": [3,12], "x":12.75, "y":3.25},
+ {"matrix": [2,13], "x":13.75, "y":2.25, "w":1.25, "h":2},
+
+ {"matrix": [4, 0], "x":0, "y":4.25, "w":1.25},
+ {"matrix": [4, 1], "x":1.25, "y":4.25},
+ {"matrix": [4, 2], "x":2.25, "y":4.25},
+ {"matrix": [4, 3], "x":3.25, "y":4.25},
+ {"matrix": [4, 4], "x":4.25, "y":4.25},
+ {"matrix": [4, 5], "x":5.25, "y":4.25},
+ {"matrix": [4, 6], "x":6.25, "y":4.25},
+ {"matrix": [4, 7], "x":7.25, "y":4.25},
+ {"matrix": [4, 8], "x":8.25, "y":4.25},
+ {"matrix": [4, 9], "x":9.25, "y":4.25},
+ {"matrix": [4,10], "x":10.25, "y":4.25},
+ {"matrix": [4,11], "x":11.25, "y":4.25},
+ {"matrix": [4,12], "x":12.25, "y":4.25, "w":1.75},
+ {"matrix": [4,13], "x":14, "y":4.25},
+ {"matrix": [4,15], "x":16.25, "y":4.25},
+
+ {"matrix": [5, 0], "x":0, "y":5.25, "w":1.5},
+ {"matrix": [5, 2], "x":2.5, "y":5.25, "w":1.5},
+ {"matrix": [5, 6], "x":4, "y":5.25, "w":7},
+ {"matrix": [5,11], "x":11, "y":5.25, "w":1.5},
+ {"matrix": [5,13], "x":13.5, "y":5.25, "w":1.5},
+ {"matrix": [5,14], "x":15.25, "y":5.25},
+ {"matrix": [5,15], "x":16.25, "y":5.25},
+ {"matrix": [5,16], "x":17.25, "y":5.25}
+ ]
+ },
"LAYOUT_all": {
"layout": [
{"matrix": [0, 0], "x":0, "y":0},
diff --git a/keyboards/plywrks/ply8x/keymaps/default/keymap.c b/keyboards/plywrks/ply8x/solder/keymaps/default/keymap.c
index 4ca5b29581..4ca5b29581 100644
--- a/keyboards/plywrks/ply8x/keymaps/default/keymap.c
+++ b/keyboards/plywrks/ply8x/solder/keymaps/default/keymap.c
diff --git a/keyboards/plywrks/ply8x/solder/mcuconf.h b/keyboards/plywrks/ply8x/solder/mcuconf.h
new file mode 100644
index 0000000000..aceb2e3dfc
--- /dev/null
+++ b/keyboards/plywrks/ply8x/solder/mcuconf.h
@@ -0,0 +1,9 @@
+// Copyright 2023 Ramon Imbao (@ramonimbao)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include_next <mcuconf.h>
+
+#undef STM32_SPI_USE_SPI2
+#define STM32_SPI_USE_SPI2 TRUE
diff --git a/keyboards/rocketboard_16/keycode_lookup.c b/keyboards/rocketboard_16/keycode_lookup.c
index 41fd5c8537..a29808d04d 100644
--- a/keyboards/rocketboard_16/keycode_lookup.c
+++ b/keyboards/rocketboard_16/keycode_lookup.c
@@ -14,6 +14,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <stdlib.h>
#include "keycode_lookup.h"
#include "quantum_keycodes.h"
#include "keymap_us.h"
diff --git a/keyboards/splitography/keymaps/default/keymap.c b/keyboards/splitography/keymaps/default/keymap.c
index 9c6c7d6b26..5d26eb9682 100644
--- a/keyboards/splitography/keymaps/default/keymap.c
+++ b/keyboards/splitography/keymaps/default/keymap.c
@@ -214,9 +214,9 @@ void plover(keyrecord_t *record) {
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
- keymap_config.raw = eeconfig_read_keymap();
+ eeconfig_read_keymap(&keymap_config);
keymap_config.nkro = 1;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
}
diff --git a/keyboards/splitography/keymaps/default_with_ctl_shft_alt_switched/keymap.c b/keyboards/splitography/keymaps/default_with_ctl_shft_alt_switched/keymap.c
index 787f448ffb..a3cb183758 100644
--- a/keyboards/splitography/keymaps/default_with_ctl_shft_alt_switched/keymap.c
+++ b/keyboards/splitography/keymaps/default_with_ctl_shft_alt_switched/keymap.c
@@ -214,9 +214,9 @@ void plover(keyrecord_t *record) {
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
- keymap_config.raw = eeconfig_read_keymap();
+ eeconfig_read_keymap(&keymap_config);
keymap_config.nkro = 1;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
}
diff --git a/keyboards/splitography/keymaps/dvorak/keymap.c b/keyboards/splitography/keymaps/dvorak/keymap.c
index 992cfd0abb..0edec7043c 100644
--- a/keyboards/splitography/keymaps/dvorak/keymap.c
+++ b/keyboards/splitography/keymaps/dvorak/keymap.c
@@ -214,9 +214,9 @@ void plover(keyrecord_t *record) {
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
- keymap_config.raw = eeconfig_read_keymap();
+ eeconfig_read_keymap(&keymap_config);
keymap_config.nkro = 1;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
}
diff --git a/keyboards/system76/launch_1/launch_1.c b/keyboards/system76/launch_1/launch_1.c
index c9af479bf5..c01fb7b01d 100644
--- a/keyboards/system76/launch_1/launch_1.c
+++ b/keyboards/system76/launch_1/launch_1.c
@@ -16,6 +16,7 @@
*/
#include "quantum.h"
+#include "eeprom.h"
#include "usb_mux.h"
@@ -73,7 +74,7 @@ led_config_t g_led_config = { {
} };
#endif // RGB_MATRIX_ENABLE
-bool eeprom_is_valid(void) {
+bool eeprom_is_valid(void) {
return (
eeprom_read_word(((void *)EEPROM_MAGIC_ADDR)) == EEPROM_MAGIC &&
eeprom_read_byte(((void *)EEPROM_VERSION_ADDR)) == EEPROM_VERSION
diff --git a/keyboards/teleport/native/board.h b/keyboards/teleport/native/board.h
new file mode 100644
index 0000000000..41efeb2c1a
--- /dev/null
+++ b/keyboards/teleport/native/board.h
@@ -0,0 +1,8 @@
+// Copyright 2022 Moritz Plattner
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/teleport/native/config.h b/keyboards/teleport/native/config.h
index 31d0025883..cd823d725e 100644
--- a/keyboards/teleport/native/config.h
+++ b/keyboards/teleport/native/config.h
@@ -67,6 +67,3 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifdef ENABLE_RGB_MATRIX_TYPING_HEATMAP
#define RGB_MATRIX_TYPING_HEATMAP_SLIM
#endif
-
-/* Set HSE clock since it differs from F411 default */
-#define STM32_HSECLK 16000000
diff --git a/keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/board.h b/keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/board.h
new file mode 100644
index 0000000000..5b80eb2230
--- /dev/null
+++ b/keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/board.h
@@ -0,0 +1,8 @@
+// Copyright 2020 Purdea Andrei
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/config.h b/keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/config.h
index 71e60e9cfe..c10d26b9b2 100644
--- a/keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/config.h
+++ b/keyboards/unicomp/classic_ultracl_post_2013/overnumpad_1xb/config.h
@@ -21,8 +21,6 @@
#define SERIAL_NUMBER DEF_SERIAL_NUMBER
#endif
-#define STM32_HSECLK 16000000
-
#define SOLENOID_PIN B5
#define HAPTIC_ENABLE_PIN C13
#define SOLENOID_DEFAULT_DWELL 20
diff --git a/keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/board.h b/keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/board.h
new file mode 100644
index 0000000000..5b80eb2230
--- /dev/null
+++ b/keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/board.h
@@ -0,0 +1,8 @@
+// Copyright 2020 Purdea Andrei
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/config.h b/keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/config.h
index 71e60e9cfe..c10d26b9b2 100644
--- a/keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/config.h
+++ b/keyboards/unicomp/classic_ultracl_pre_2013/overnumpad_1xb/config.h
@@ -21,8 +21,6 @@
#define SERIAL_NUMBER DEF_SERIAL_NUMBER
#endif
-#define STM32_HSECLK 16000000
-
#define SOLENOID_PIN B5
#define HAPTIC_ENABLE_PIN C13
#define SOLENOID_DEFAULT_DWELL 20
diff --git a/keyboards/unicomp/pc122/overnumpad_1xb/board.h b/keyboards/unicomp/pc122/overnumpad_1xb/board.h
new file mode 100644
index 0000000000..5b80eb2230
--- /dev/null
+++ b/keyboards/unicomp/pc122/overnumpad_1xb/board.h
@@ -0,0 +1,8 @@
+// Copyright 2020 Purdea Andrei
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/unicomp/pc122/overnumpad_1xb/config.h b/keyboards/unicomp/pc122/overnumpad_1xb/config.h
index 71e60e9cfe..c10d26b9b2 100644
--- a/keyboards/unicomp/pc122/overnumpad_1xb/config.h
+++ b/keyboards/unicomp/pc122/overnumpad_1xb/config.h
@@ -21,8 +21,6 @@
#define SERIAL_NUMBER DEF_SERIAL_NUMBER
#endif
-#define STM32_HSECLK 16000000
-
#define SOLENOID_PIN B5
#define HAPTIC_ENABLE_PIN C13
#define SOLENOID_DEFAULT_DWELL 20
diff --git a/keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/board.h b/keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/board.h
new file mode 100644
index 0000000000..5b80eb2230
--- /dev/null
+++ b/keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/board.h
@@ -0,0 +1,8 @@
+// Copyright 2020 Purdea Andrei
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/config.h b/keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/config.h
index 71e60e9cfe..c10d26b9b2 100644
--- a/keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/config.h
+++ b/keyboards/unicomp/spacesaver_m_post_2013/overnumpad_1xb/config.h
@@ -21,8 +21,6 @@
#define SERIAL_NUMBER DEF_SERIAL_NUMBER
#endif
-#define STM32_HSECLK 16000000
-
#define SOLENOID_PIN B5
#define HAPTIC_ENABLE_PIN C13
#define SOLENOID_DEFAULT_DWELL 20
diff --git a/keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/board.h b/keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/board.h
new file mode 100644
index 0000000000..5b80eb2230
--- /dev/null
+++ b/keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/board.h
@@ -0,0 +1,8 @@
+// Copyright 2020 Purdea Andrei
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/config.h b/keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/config.h
index 71e60e9cfe..c10d26b9b2 100644
--- a/keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/config.h
+++ b/keyboards/unicomp/spacesaver_m_pre_2013/overnumpad_1xb/config.h
@@ -21,8 +21,6 @@
#define SERIAL_NUMBER DEF_SERIAL_NUMBER
#endif
-#define STM32_HSECLK 16000000
-
#define SOLENOID_PIN B5
#define HAPTIC_ENABLE_PIN C13
#define SOLENOID_DEFAULT_DWELL 20
diff --git a/keyboards/vitamins_included/rev2/rev2.c b/keyboards/vitamins_included/rev2/rev2.c
index e445a3da45..28bd73cc75 100644
--- a/keyboards/vitamins_included/rev2/rev2.c
+++ b/keyboards/vitamins_included/rev2/rev2.c
@@ -12,7 +12,7 @@ bool is_keyboard_left(void) {
gpio_set_pin_input(SPLIT_HAND_PIN);
return x;
#elif defined(EE_HANDS)
- return eeprom_read_byte(EECONFIG_HANDEDNESS);
+ return eeconfig_read_handedness();
#endif
return is_keyboard_master();
diff --git a/keyboards/werk_technica/one/board.h b/keyboards/werk_technica/one/board.h
new file mode 100644
index 0000000000..3ad450d023
--- /dev/null
+++ b/keyboards/werk_technica/one/board.h
@@ -0,0 +1,8 @@
+// Copyright 2022 QMK
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/werk_technica/one/config.h b/keyboards/werk_technica/one/config.h
deleted file mode 100644
index 765e70851b..0000000000
--- a/keyboards/werk_technica/one/config.h
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright 2022 QMK
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-/* Set HSE clock since it differs from F411 default */
-#define STM32_HSECLK 16000000 \ No newline at end of file
diff --git a/keyboards/wilba_tech/wt_main.c b/keyboards/wilba_tech/wt_main.c
index 92c43c794d..7e56d98356 100644
--- a/keyboards/wilba_tech/wt_main.c
+++ b/keyboards/wilba_tech/wt_main.c
@@ -33,7 +33,7 @@
// Called from via_init() if VIA_ENABLE
// Called from matrix_init_kb() if not VIA_ENABLE
-void via_init_kb(void)
+void wt_main_init(void)
{
// This checks both an EEPROM reset (from bootmagic lite, keycodes)
// and also firmware build date (from via_eeprom_is_valid())
@@ -64,11 +64,9 @@ void via_init_kb(void)
void matrix_init_kb(void)
{
// If VIA is disabled, we still need to load backlight settings.
- // Call via_init_kb() the same way as via_init(), with setting
- // EEPROM valid afterwards.
+ // Call via_init_kb() the same way as via_init_kb() does.
#ifndef VIA_ENABLE
- via_init_kb();
- via_eeprom_set_valid(true);
+ wt_main_init();
#endif // VIA_ENABLE
matrix_init_user();
@@ -109,6 +107,10 @@ void suspend_wakeup_init_kb(void)
// Moving this to the bottom of this source file is a workaround
// for an intermittent compiler error for Atmel compiler.
#ifdef VIA_ENABLE
+void via_init_kb(void) {
+ wt_main_init();
+}
+
void via_custom_value_command_kb(uint8_t *data, uint8_t length) {
uint8_t *command_id = &(data[0]);
uint8_t *channel_id = &(data[1]);
@@ -159,50 +161,3 @@ void via_set_device_indication(uint8_t value)
}
#endif // VIA_ENABLE
-
-//
-// In the case of VIA being disabled, we still need to check if
-// keyboard level EEPROM memory is valid before loading.
-// Thus these are copies of the same functions in VIA, since
-// the backlight settings reuse VIA's EEPROM magic/version,
-// and the ones in via.c won't be compiled in.
-//
-// Yes, this is sub-optimal, and is only here for completeness
-// (i.e. catering to the 1% of people that want wilba.tech LED bling
-// AND want persistent settings BUT DON'T want to use dynamic keymaps/VIA).
-//
-#ifndef VIA_ENABLE
-
-bool via_eeprom_is_valid(void)
-{
- char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
- uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F );
- uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F );
- uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F );
-
- return (eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0 ) == magic0 &&
- eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1 ) == magic1 &&
- eeprom_read_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2 ) == magic2 );
-}
-
-void via_eeprom_set_valid(bool valid)
-{
- char *p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
- uint8_t magic0 = ( ( p[2] & 0x0F ) << 4 ) | ( p[3] & 0x0F );
- uint8_t magic1 = ( ( p[5] & 0x0F ) << 4 ) | ( p[6] & 0x0F );
- uint8_t magic2 = ( ( p[8] & 0x0F ) << 4 ) | ( p[9] & 0x0F );
-
- eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+0, valid ? magic0 : 0xFF);
- eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+1, valid ? magic1 : 0xFF);
- eeprom_update_byte( (void*)VIA_EEPROM_MAGIC_ADDR+2, valid ? magic2 : 0xFF);
-}
-
-void via_eeprom_reset(void)
-{
- // Set the VIA specific EEPROM state as invalid.
- via_eeprom_set_valid(false);
- // Set the TMK/QMK EEPROM state as invalid.
- eeconfig_disable();
-}
-
-#endif // VIA_ENABLE
diff --git a/keyboards/wilba_tech/wt_mono_backlight.c b/keyboards/wilba_tech/wt_mono_backlight.c
index 01fefc8ecc..8359aab135 100644
--- a/keyboards/wilba_tech/wt_mono_backlight.c
+++ b/keyboards/wilba_tech/wt_mono_backlight.c
@@ -25,6 +25,8 @@
#include "progmem.h"
#include "eeprom.h"
+#include "nvm_eeprom_eeconfig_internal.h" // expose EEPROM addresses, no appetite to move legacy/deprecated code to nvm
+#include "nvm_eeprom_via_internal.h" // expose EEPROM addresses, no appetite to move legacy/deprecated code to nvm
#include "via.h" // uses EEPROM address, lighting value IDs
#define MONO_BACKLIGHT_CONFIG_EEPROM_ADDR (VIA_EEPROM_CUSTOM_CONFIG_ADDR)
diff --git a/keyboards/wilba_tech/wt_rgb_backlight.c b/keyboards/wilba_tech/wt_rgb_backlight.c
index e52d002060..744bcb262d 100644
--- a/keyboards/wilba_tech/wt_rgb_backlight.c
+++ b/keyboards/wilba_tech/wt_rgb_backlight.c
@@ -66,6 +66,8 @@
#include "quantum/color.h"
#include "eeprom.h"
+#include "nvm_eeprom_eeconfig_internal.h" // expose EEPROM addresses, no appetite to move legacy/deprecated code to nvm
+#include "nvm_eeprom_via_internal.h" // expose EEPROM addresses, no appetite to move legacy/deprecated code to nvm
#include "via.h" // uses EEPROM address, lighting value IDs
#define RGB_BACKLIGHT_CONFIG_EEPROM_ADDR (VIA_EEPROM_CUSTOM_CONFIG_ADDR)
diff --git a/keyboards/xelus/la_plus/rgb_matrix_kb.inc b/keyboards/xelus/la_plus/rgb_matrix_kb.inc
index 88dd2ab0a2..93d52ec9d0 100644
--- a/keyboards/xelus/la_plus/rgb_matrix_kb.inc
+++ b/keyboards/xelus/la_plus/rgb_matrix_kb.inc
@@ -31,7 +31,7 @@ static void startup_animation_setleds(effect_params_t* params, bool dots) {
} else if (num == 0 || num == 1 || num == 2) {
return;
} else if (num >= 22) {
- eeprom_read_block(&rgb_matrix_config, EECONFIG_RGB_MATRIX, sizeof(rgb_matrix_config));
+ eeconfig_read_rgb_matrix(&rgb_matrix_config);
rgb_matrix_mode_noeeprom(rgb_matrix_config.mode);
return;
}
diff --git a/keyboards/xelus/rs108/board.h b/keyboards/xelus/rs108/board.h
new file mode 100644
index 0000000000..cce4af40f9
--- /dev/null
+++ b/keyboards/xelus/rs108/board.h
@@ -0,0 +1,8 @@
+// Copyright 2022 Harrison Chan (Xelus)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/xelus/rs108/config.h b/keyboards/xelus/rs108/config.h
index 3d3bc49228..883ed2b9aa 100644
--- a/keyboards/xelus/rs108/config.h
+++ b/keyboards/xelus/rs108/config.h
@@ -28,6 +28,3 @@
// Hardware Defines
#define EARLY_INIT_PERFORM_BOOTLOADER_JUMP TRUE
-
-// HSE CLK
-#define STM32_HSECLK 16000000
diff --git a/keyboards/xelus/rs60/rev2_0/board.h b/keyboards/xelus/rs60/rev2_0/board.h
new file mode 100644
index 0000000000..cce4af40f9
--- /dev/null
+++ b/keyboards/xelus/rs60/rev2_0/board.h
@@ -0,0 +1,8 @@
+// Copyright 2022 Harrison Chan (Xelus)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/xelus/rs60/rev2_0/config.h b/keyboards/xelus/rs60/rev2_0/config.h
index 3d3bc49228..883ed2b9aa 100644
--- a/keyboards/xelus/rs60/rev2_0/config.h
+++ b/keyboards/xelus/rs60/rev2_0/config.h
@@ -28,6 +28,3 @@
// Hardware Defines
#define EARLY_INIT_PERFORM_BOOTLOADER_JUMP TRUE
-
-// HSE CLK
-#define STM32_HSECLK 16000000
diff --git a/keyboards/xelus/valor_frl_tkl/rev2_0/board.h b/keyboards/xelus/valor_frl_tkl/rev2_0/board.h
new file mode 100644
index 0000000000..cce4af40f9
--- /dev/null
+++ b/keyboards/xelus/valor_frl_tkl/rev2_0/board.h
@@ -0,0 +1,8 @@
+// Copyright 2022 Harrison Chan (Xelus)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/xelus/valor_frl_tkl/rev2_0/config.h b/keyboards/xelus/valor_frl_tkl/rev2_0/config.h
deleted file mode 100644
index b085b99d88..0000000000
--- a/keyboards/xelus/valor_frl_tkl/rev2_0/config.h
+++ /dev/null
@@ -1,19 +0,0 @@
-/* Copyright 2022 Harrison Chan (Xelus)
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#pragma once
-
-#define STM32_HSECLK 16000000
diff --git a/keyboards/xelus/valor_frl_tkl/rev2_1/board.h b/keyboards/xelus/valor_frl_tkl/rev2_1/board.h
new file mode 100644
index 0000000000..cce4af40f9
--- /dev/null
+++ b/keyboards/xelus/valor_frl_tkl/rev2_1/board.h
@@ -0,0 +1,8 @@
+// Copyright 2022 Harrison Chan (Xelus)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include_next <board.h>
+
+#undef STM32_HSECLK
+#define STM32_HSECLK 16000000U
diff --git a/keyboards/zsa/moonlander/matrix.c b/keyboards/zsa/moonlander/matrix.c
index 867fa85a66..4e5c120950 100644
--- a/keyboards/zsa/moonlander/matrix.c
+++ b/keyboards/zsa/moonlander/matrix.c
@@ -127,7 +127,7 @@ bool matrix_scan_custom(matrix_row_t current_matrix[]) {
matrix_io_delay();
}
// read col data
- data = ((readPin(A0) << 0) | (readPin(A1) << 1) | (readPin(A2) << 2) | (readPin(A3) << 3) | (readPin(A6) << 4) | (readPin(A7) << 5) | (readPin(B0) << 6));
+ data = ((gpio_read_pin(A0) << 0) | (gpio_read_pin(A1) << 1) | (gpio_read_pin(A2) << 2) | (gpio_read_pin(A3) << 3) | (gpio_read_pin(A6) << 4) | (gpio_read_pin(A7) << 5) | (gpio_read_pin(B0) << 6));
// unstrobe row
switch (row) {
case 0:
diff --git a/layouts/community/75_ansi/layout.json b/layouts/community/75_ansi/layout.json
index 4b7c5a0d88..72be23b486 100644
--- a/layouts/community/75_ansi/layout.json
+++ b/layouts/community/75_ansi/layout.json
@@ -3,4 +3,4 @@
[{w:1.5},"","","","","","","","","","","","","",{w:1.5},"",""],
[{w:1.75},"","","","","","","","","","","","",{w:2.25},"",""],
[{w:2.25},"","","","","","","","","","","",{w:1.75},"","",""],
-[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"","","","","","",""] \ No newline at end of file
+[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"","","","","","",""]
diff --git a/layouts/community/ortho_1x4/layout.json b/layouts/community/ortho_1x4/layout.json
index 6103c7e248..833ff19d4f 100644
--- a/layouts/community/ortho_1x4/layout.json
+++ b/layouts/community/ortho_1x4/layout.json
@@ -1 +1 @@
-["","","",""] \ No newline at end of file
+["","","",""]
diff --git a/layouts/community/ortho_4x12/layout.json b/layouts/community/ortho_4x12/layout.json
index 9439b6e0be..961b080642 100644
--- a/layouts/community/ortho_4x12/layout.json
+++ b/layouts/community/ortho_4x12/layout.json
@@ -1,4 +1,4 @@
["","","","","","","","","","","",""],
["","","","","","","","","","","",""],
["","","","","","","","","","","",""],
-["","","","","","","","","","","",""] \ No newline at end of file
+["","","","","","","","","","","",""]
diff --git a/layouts/default/60_ansi_arrow/layout.json b/layouts/default/60_ansi_arrow/layout.json
index 7fc631c3d1..163107fda4 100644
--- a/layouts/default/60_ansi_arrow/layout.json
+++ b/layouts/default/60_ansi_arrow/layout.json
@@ -3,4 +3,4 @@
[{w:1.75},"","","","","","","","","","","","",{w:2.25},""],
[{w:2.25},"","","","","","","","","","",{w:1.75},"","",""],
[{w:1.25},"",{w:1.25},"",{w:1.25},"",{w:6.25},"","","","","",""]
- \ No newline at end of file
+
diff --git a/layouts/default/ortho_5x5/readme.md b/layouts/default/ortho_5x5/readme.md
index 3dd75765d1..2922976d3a 100644
--- a/layouts/default/ortho_5x5/readme.md
+++ b/layouts/default/ortho_5x5/readme.md
@@ -1,3 +1,3 @@
# ortho_5x5
- LAYOUT_ortho_5x5 \ No newline at end of file
+ LAYOUT_ortho_5x5
diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py
index 3f2ba9ce3c..26905ec134 100644
--- a/lib/python/qmk/cli/__init__.py
+++ b/lib/python/qmk/cli/__init__.py
@@ -58,7 +58,6 @@ subcommands = [
'qmk.cli.generate.keyboard_c',
'qmk.cli.generate.keyboard_h',
'qmk.cli.generate.keycodes',
- 'qmk.cli.generate.keycodes_tests',
'qmk.cli.generate.keymap_h',
'qmk.cli.generate.make_dependencies',
'qmk.cli.generate.rgb_breathe_table',
@@ -215,7 +214,7 @@ if sys.version_info[0] != 3 or sys.version_info[1] < 9:
milc_version = __VERSION__.split('.')
-if int(milc_version[0]) < 2 and int(milc_version[1]) < 4:
+if int(milc_version[0]) < 2 and int(milc_version[1]) < 9:
requirements = Path('requirements.txt').resolve()
_eprint(f'Your MILC library is too old! Please upgrade: python3 -m pip install -U -r {str(requirements)}')
diff --git a/lib/python/qmk/cli/generate/keycodes_tests.py b/lib/python/qmk/cli/generate/keycodes_tests.py
deleted file mode 100644
index 453b4693a7..0000000000
--- a/lib/python/qmk/cli/generate/keycodes_tests.py
+++ /dev/null
@@ -1,39 +0,0 @@
-"""Used by the make system to generate a keycode lookup table from keycodes_{version}.json
-"""
-from milc import cli
-
-from qmk.constants import GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE
-from qmk.commands import dump_lines
-from qmk.path import normpath
-from qmk.keycodes import load_spec
-
-
-def _generate_defines(lines, keycodes):
- lines.append('')
- lines.append('std::map<uint16_t, std::string> KEYCODE_ID_TABLE = {')
- for key, value in keycodes["keycodes"].items():
- lines.append(f' {{{value.get("key")}, "{value.get("key")}"}},')
- lines.append('};')
-
-
[email protected]('-v', '--version', arg_only=True, required=True, help='Version of keycodes to generate.')
[email protected]('-o', '--output', arg_only=True, type=normpath, help='File to write to')
[email protected]('-q', '--quiet', arg_only=True, action='store_true', help="Quiet mode, only output error messages")
[email protected]('Used by the make system to generate a keycode lookup table from keycodes_{version}.json', hidden=True)
-def generate_keycodes_tests(cli):
- """Generates a keycode to identifier lookup table for unit test output.
- """
-
- # Build the keycodes.h file.
- keycodes_h_lines = [GPL2_HEADER_C_LIKE, GENERATED_HEADER_C_LIKE, '// clang-format off']
- keycodes_h_lines.append('extern "C" {\n#include <keycode.h>\n}')
- keycodes_h_lines.append('#include <map>')
- keycodes_h_lines.append('#include <string>')
- keycodes_h_lines.append('#include <cstdint>')
-
- keycodes = load_spec(cli.args.version)
-
- _generate_defines(keycodes_h_lines, keycodes)
-
- # Show the results
- dump_lines(cli.args.output, keycodes_h_lines, cli.args.quiet)
diff --git a/lib/python/qmk/cli/generate/rules_mk.py b/lib/python/qmk/cli/generate/rules_mk.py
index ef4101d77f..01d71d277f 100755
--- a/lib/python/qmk/cli/generate/rules_mk.py
+++ b/lib/python/qmk/cli/generate/rules_mk.py
@@ -72,6 +72,8 @@ def generate_modules_rules(keyboard, filename):
lines.append(f'COMMUNITY_MODULE_PATHS += {module_path}')
lines.append(f'VPATH += {module_path}')
lines.append(f'SRC += $(wildcard {module_path}/{module_path.name}.c)')
+ lines.append(f'MODULE_NAME_{module_path.name.upper()} := {module_path.name}')
+ lines.append(f'MODULE_PATH_{module_path.name.upper()} := {module_path}')
lines.append(f'-include {module_path}/rules.mk')
module_jsons = load_module_jsons(modules)
diff --git a/lib/python/qmk/json_encoders.py b/lib/python/qmk/json_encoders.py
index e83a381d52..e8bcf48996 100755
--- a/lib/python/qmk/json_encoders.py
+++ b/lib/python/qmk/json_encoders.py
@@ -250,12 +250,14 @@ class CommunityModuleJSONEncoder(QMKJSONEncoder):
return '00module_name'
if key == 'maintainer':
return '01maintainer'
+ if key == 'license':
+ return '02license'
if key == 'url':
- return '02url'
+ return '03url'
if key == 'features':
- return '03features'
+ return '04features'
if key == 'keycodes':
- return '04keycodes'
+ return '05keycodes'
elif self.indentation_level == 3: # keycodes
if key == 'key':
return '00key'
diff --git a/modules/qmk/hello_world/qmk_module.json b/modules/qmk/hello_world/qmk_module.json
index fd855a6e23..bbd00f3fcc 100644
--- a/modules/qmk/hello_world/qmk_module.json
+++ b/modules/qmk/hello_world/qmk_module.json
@@ -1,6 +1,7 @@
{
"module_name": "Hello World",
"maintainer": "QMK Maintainers",
+ "license": "GPL-2.0-or-later",
"features": {
"console": true,
"deferred_exec": true
diff --git a/modules/qmk/super_alt_tab/qmk_module.json b/modules/qmk/super_alt_tab/qmk_module.json
index 002f7fb69e..142613a23e 100644
--- a/modules/qmk/super_alt_tab/qmk_module.json
+++ b/modules/qmk/super_alt_tab/qmk_module.json
@@ -1,6 +1,7 @@
{
"module_name": "Super Alt Tab",
"maintainer": "QMK Maintainers",
+ "license": "GPL-2.0-or-later",
"keycodes": [
{
"key": "COMMUNITY_MODULE_SUPER_ALT_TAB",
diff --git a/platforms/avr/drivers/i2c_master.c b/platforms/avr/drivers/i2c_master.c
index 64083d862a..9136f4a7b9 100644
--- a/platforms/avr/drivers/i2c_master.c
+++ b/platforms/avr/drivers/i2c_master.c
@@ -315,4 +315,4 @@ __attribute__((weak)) i2c_status_t i2c_ping_address(uint8_t address, uint16_t ti
i2c_status_t status = i2c_start(address, timeout);
i2c_stop();
return status;
-} \ No newline at end of file
+}
diff --git a/platforms/chibios/boards/BONSAI_C4/configs/board.h b/platforms/chibios/boards/BONSAI_C4/configs/board.h
index 372b9bb8bc..81c80b2773 100644
--- a/platforms/chibios/boards/BONSAI_C4/configs/board.h
+++ b/platforms/chibios/boards/BONSAI_C4/configs/board.h
@@ -17,4 +17,4 @@
#include_next <board.h>
-#undef STM32_HSE_BYPASS \ No newline at end of file
+#undef STM32_HSE_BYPASS
diff --git a/platforms/chibios/boards/BONSAI_C4/configs/config.h b/platforms/chibios/boards/BONSAI_C4/configs/config.h
index e933cd6fd1..e0e95eda25 100644
--- a/platforms/chibios/boards/BONSAI_C4/configs/config.h
+++ b/platforms/chibios/boards/BONSAI_C4/configs/config.h
@@ -87,4 +87,4 @@
#ifndef USB_VBUS_PIN
# define USB_VBUS_PIN PAL_LINE(GPIOA, 9)
-#endif \ No newline at end of file
+#endif
diff --git a/platforms/chibios/boards/BONSAI_C4/configs/halconf.h b/platforms/chibios/boards/BONSAI_C4/configs/halconf.h
index 6bab6fbcff..55bafe5cfa 100644
--- a/platforms/chibios/boards/BONSAI_C4/configs/halconf.h
+++ b/platforms/chibios/boards/BONSAI_C4/configs/halconf.h
@@ -46,4 +46,4 @@
# define SPI_USE_WAIT TRUE
#endif
-#include_next <halconf.h> \ No newline at end of file
+#include_next <halconf.h>
diff --git a/platforms/chibios/boards/GENERIC_STM32_F405XG/board/board.mk b/platforms/chibios/boards/GENERIC_STM32_F405XG/board/board.mk
index 6c837bb8ee..00cc9b20b2 100644
--- a/platforms/chibios/boards/GENERIC_STM32_F405XG/board/board.mk
+++ b/platforms/chibios/boards/GENERIC_STM32_F405XG/board/board.mk
@@ -6,4 +6,4 @@ BOARDINC = $(CHIBIOS)/os/hal/boards/ST_STM32F4_DISCOVERY
# Shared variables
ALLCSRC += $(BOARDSRC)
-ALLINC += $(BOARDINC) \ No newline at end of file
+ALLINC += $(BOARDINC)
diff --git a/platforms/chibios/boards/GENERIC_STM32_F407XE/board/board.mk b/platforms/chibios/boards/GENERIC_STM32_F407XE/board/board.mk
index 6c837bb8ee..00cc9b20b2 100644
--- a/platforms/chibios/boards/GENERIC_STM32_F407XE/board/board.mk
+++ b/platforms/chibios/boards/GENERIC_STM32_F407XE/board/board.mk
@@ -6,4 +6,4 @@ BOARDINC = $(CHIBIOS)/os/hal/boards/ST_STM32F4_DISCOVERY
# Shared variables
ALLCSRC += $(BOARDSRC)
-ALLINC += $(BOARDINC) \ No newline at end of file
+ALLINC += $(BOARDINC)
diff --git a/platforms/chibios/boards/GENERIC_STM32_F407XE/configs/board.h b/platforms/chibios/boards/GENERIC_STM32_F407XE/configs/board.h
index a0d53d86e7..c2f25db810 100644
--- a/platforms/chibios/boards/GENERIC_STM32_F407XE/configs/board.h
+++ b/platforms/chibios/boards/GENERIC_STM32_F407XE/configs/board.h
@@ -21,4 +21,4 @@
#include_next <board.h>
-#undef STM32_HSE_BYPASS \ No newline at end of file
+#undef STM32_HSE_BYPASS
diff --git a/platforms/chibios/boards/GENERIC_STM32_G474XE/configs/config.h b/platforms/chibios/boards/GENERIC_STM32_G474XE/configs/config.h
index eb74d68e85..da0a634bb5 100644
--- a/platforms/chibios/boards/GENERIC_STM32_G474XE/configs/config.h
+++ b/platforms/chibios/boards/GENERIC_STM32_G474XE/configs/config.h
@@ -27,4 +27,4 @@
#if 0
#define STM32_BOOTLOADER_DUAL_BANK TRUE
#define STM32_BOOTLOADER_DUAL_BANK_GPIO B7
-#endif \ No newline at end of file
+#endif
diff --git a/platforms/chibios/boards/GENERIC_WB32_F3G71XX/configs/chconf.h b/platforms/chibios/boards/GENERIC_WB32_F3G71XX/configs/chconf.h
index e4afddb6a5..fa0b6f11d0 100644
--- a/platforms/chibios/boards/GENERIC_WB32_F3G71XX/configs/chconf.h
+++ b/platforms/chibios/boards/GENERIC_WB32_F3G71XX/configs/chconf.h
@@ -23,4 +23,4 @@
#define CH_CFG_ST_TIMEDELTA 0
-#include_next <chconf.h> \ No newline at end of file
+#include_next <chconf.h>
diff --git a/platforms/chibios/boards/GENERIC_WB32_FQ95XX/configs/chconf.h b/platforms/chibios/boards/GENERIC_WB32_FQ95XX/configs/chconf.h
index e4afddb6a5..fa0b6f11d0 100644
--- a/platforms/chibios/boards/GENERIC_WB32_FQ95XX/configs/chconf.h
+++ b/platforms/chibios/boards/GENERIC_WB32_FQ95XX/configs/chconf.h
@@ -23,4 +23,4 @@
#define CH_CFG_ST_TIMEDELTA 0
-#include_next <chconf.h> \ No newline at end of file
+#include_next <chconf.h>
diff --git a/platforms/chibios/boards/SIPEED_LONGAN_NANO/configs/chconf.h b/platforms/chibios/boards/SIPEED_LONGAN_NANO/configs/chconf.h
index 6e5adb0fe1..ca0348e4e0 100644
--- a/platforms/chibios/boards/SIPEED_LONGAN_NANO/configs/chconf.h
+++ b/platforms/chibios/boards/SIPEED_LONGAN_NANO/configs/chconf.h
@@ -20,4 +20,4 @@
struct _reent;
#endif
-#include_next <chconf.h> \ No newline at end of file
+#include_next <chconf.h>
diff --git a/platforms/chibios/bootloaders/stm32duino.c b/platforms/chibios/bootloaders/stm32duino.c
index e2db7fa16c..cc3f6be2df 100644
--- a/platforms/chibios/bootloaders/stm32duino.c
+++ b/platforms/chibios/bootloaders/stm32duino.c
@@ -25,4 +25,4 @@ __attribute__((weak)) void bootloader_jump(void) {
__attribute__((weak)) void mcu_reset(void) {
BKP->DR10 = RTC_BOOTLOADER_JUST_UPLOADED;
NVIC_SystemReset();
-} \ No newline at end of file
+}
diff --git a/platforms/chibios/converters/promicro_to_bonsai_c4/_pin_defs.h b/platforms/chibios/converters/promicro_to_bonsai_c4/_pin_defs.h
index 7e6b8ddaf2..deb0628ef8 100644
--- a/platforms/chibios/converters/promicro_to_bonsai_c4/_pin_defs.h
+++ b/platforms/chibios/converters/promicro_to_bonsai_c4/_pin_defs.h
@@ -37,4 +37,4 @@
// If this is undesirable, either B0 or B5 can be redefined by
// using #undef and #define to change its assignment
#define B0 PAL_LINE(GPIOB, 2)
-#define D5 PAL_LINE(GPIOB, 2) \ No newline at end of file
+#define D5 PAL_LINE(GPIOB, 2)
diff --git a/platforms/chibios/converters/promicro_to_bonsai_c4/post_converter.mk b/platforms/chibios/converters/promicro_to_bonsai_c4/post_converter.mk
index 5f49b17f8a..beefb9de23 100644
--- a/platforms/chibios/converters/promicro_to_bonsai_c4/post_converter.mk
+++ b/platforms/chibios/converters/promicro_to_bonsai_c4/post_converter.mk
@@ -2,4 +2,4 @@ BACKLIGHT_DRIVER ?= pwm
WS2812_DRIVER ?= pwm
SERIAL_DRIVER ?= usart
FLASH_DRIVER ?= spi
-EEPROM_DRIVER ?= spi \ No newline at end of file
+EEPROM_DRIVER ?= spi
diff --git a/platforms/chibios/drivers/i2c_master.c b/platforms/chibios/drivers/i2c_master.c
index 1d7fe27633..20850859b5 100644
--- a/platforms/chibios/drivers/i2c_master.c
+++ b/platforms/chibios/drivers/i2c_master.c
@@ -206,4 +206,4 @@ __attribute__((weak)) i2c_status_t i2c_ping_address(uint8_t address, uint16_t ti
// This approach may produce false negative results for I2C devices that do not respond to a register 0 read request.
uint8_t data = 0;
return i2c_read_register(address, 0, &data, sizeof(data), timeout);
-} \ No newline at end of file
+}
diff --git a/platforms/chibios/drivers/usbpd_stm32g4.c b/platforms/chibios/drivers/usbpd_stm32g4.c
index 21b8f6db95..7603b5627b 100644
--- a/platforms/chibios/drivers/usbpd_stm32g4.c
+++ b/platforms/chibios/drivers/usbpd_stm32g4.c
@@ -76,4 +76,4 @@ __attribute__((weak)) usbpd_allowance_t usbpd_get_allowance(void) {
}
return USBPD_500MA;
-} \ No newline at end of file
+}
diff --git a/platforms/chibios/platform.c b/platforms/chibios/platform.c
index d4a229f278..e559f178cd 100644
--- a/platforms/chibios/platform.c
+++ b/platforms/chibios/platform.c
@@ -19,4 +19,4 @@
void platform_setup(void) {
halInit();
chSysInit();
-} \ No newline at end of file
+}
diff --git a/platforms/test/platform.c b/platforms/test/platform.c
index 8ddceeda8f..3e35b4fe4c 100644
--- a/platforms/test/platform.c
+++ b/platforms/test/platform.c
@@ -18,4 +18,4 @@
void platform_setup(void) {
// do nothing
-} \ No newline at end of file
+}
diff --git a/quantum/action_util.c b/quantum/action_util.c
index c0dc4f3822..9fe17f2124 100644
--- a/quantum/action_util.c
+++ b/quantum/action_util.c
@@ -220,7 +220,7 @@ bool is_oneshot_layer_active(void) {
void oneshot_set(bool active) {
if (keymap_config.oneshot_enable != active) {
keymap_config.oneshot_enable = active;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
clear_oneshot_layer_state(ONESHOT_OTHER_KEY_PRESSED);
dprintf("Oneshot: active: %d\n", active);
}
diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c
index 2cc3c2d661..4e223f0c9a 100644
--- a/quantum/audio/audio.c
+++ b/quantum/audio/audio.c
@@ -149,14 +149,14 @@ void audio_driver_start(void) {
}
void eeconfig_update_audio_current(void) {
- eeconfig_update_audio(audio_config.raw);
+ eeconfig_update_audio(&audio_config);
}
void eeconfig_update_audio_default(void) {
audio_config.valid = true;
audio_config.enable = AUDIO_DEFAULT_ON;
audio_config.clicky_enable = AUDIO_DEFAULT_CLICKY_ON;
- eeconfig_update_audio(audio_config.raw);
+ eeconfig_update_audio(&audio_config);
}
void audio_init(void) {
@@ -164,7 +164,7 @@ void audio_init(void) {
return;
}
- audio_config.raw = eeconfig_read_audio();
+ eeconfig_read_audio(&audio_config);
if (!audio_config.valid) {
dprintf("audio_init audio_config.valid = 0. Write default values to EEPROM.\n");
eeconfig_update_audio_default();
@@ -196,7 +196,7 @@ void audio_toggle(void) {
stop_all_notes();
}
audio_config.enable ^= 1;
- eeconfig_update_audio(audio_config.raw);
+ eeconfig_update_audio(&audio_config);
if (audio_config.enable) {
audio_on_user();
} else {
@@ -206,7 +206,7 @@ void audio_toggle(void) {
void audio_on(void) {
audio_config.enable = 1;
- eeconfig_update_audio(audio_config.raw);
+ eeconfig_update_audio(&audio_config);
audio_on_user();
PLAY_SONG(audio_on_song);
}
@@ -217,7 +217,7 @@ void audio_off(void) {
wait_ms(100);
audio_stop_all();
audio_config.enable = 0;
- eeconfig_update_audio(audio_config.raw);
+ eeconfig_update_audio(&audio_config);
}
bool audio_is_on(void) {
diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h
index 054331d6f3..93dc6f62b1 100644
--- a/quantum/audio/audio.h
+++ b/quantum/audio/audio.h
@@ -28,7 +28,7 @@
# include "audio_dac.h"
#endif
-typedef union {
+typedef union audio_config_t {
uint8_t raw;
struct {
bool enable : 1;
diff --git a/quantum/backlight/backlight.c b/quantum/backlight/backlight.c
index eb64dd71e8..a7d2a45a51 100644
--- a/quantum/backlight/backlight.c
+++ b/quantum/backlight/backlight.c
@@ -16,7 +16,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "backlight.h"
-#include "eeprom.h"
#include "eeconfig.h"
#include "debug.h"
@@ -55,7 +54,7 @@ static void backlight_check_config(void) {
* FIXME: needs doc
*/
void backlight_init(void) {
- backlight_config.raw = eeconfig_read_backlight();
+ eeconfig_read_backlight(&backlight_config);
if (!backlight_config.valid) {
dprintf("backlight_init backlight_config.valid = 0. Write default values to EEPROM.\n");
eeconfig_update_backlight_default();
@@ -74,7 +73,7 @@ void backlight_increase(void) {
backlight_config.level++;
}
backlight_config.enable = 1;
- eeconfig_update_backlight(backlight_config.raw);
+ eeconfig_update_backlight(&backlight_config);
dprintf("backlight increase: %u\n", backlight_config.level);
backlight_set(backlight_config.level);
}
@@ -87,7 +86,7 @@ void backlight_decrease(void) {
if (backlight_config.level > 0) {
backlight_config.level--;
backlight_config.enable = !!backlight_config.level;
- eeconfig_update_backlight(backlight_config.raw);
+ eeconfig_update_backlight(&backlight_config);
}
dprintf("backlight decrease: %u\n", backlight_config.level);
backlight_set(backlight_config.level);
@@ -116,7 +115,7 @@ void backlight_enable(void) {
backlight_config.enable = true;
if (backlight_config.raw == 1) // enabled but level == 0
backlight_config.level = 1;
- eeconfig_update_backlight(backlight_config.raw);
+ eeconfig_update_backlight(&backlight_config);
dprintf("backlight enable\n");
backlight_set(backlight_config.level);
}
@@ -129,7 +128,7 @@ void backlight_disable(void) {
if (!backlight_config.enable) return; // do nothing if backlight is already off
backlight_config.enable = false;
- eeconfig_update_backlight(backlight_config.raw);
+ eeconfig_update_backlight(&backlight_config);
dprintf("backlight disable\n");
backlight_set(0);
}
@@ -152,7 +151,7 @@ void backlight_step(void) {
backlight_config.level = 0;
}
backlight_config.enable = !!backlight_config.level;
- eeconfig_update_backlight(backlight_config.raw);
+ eeconfig_update_backlight(&backlight_config);
dprintf("backlight step: %u\n", backlight_config.level);
backlight_set(backlight_config.level);
}
@@ -173,19 +172,11 @@ void backlight_level_noeeprom(uint8_t level) {
*/
void backlight_level(uint8_t level) {
backlight_level_noeeprom(level);
- eeconfig_update_backlight(backlight_config.raw);
-}
-
-uint8_t eeconfig_read_backlight(void) {
- return eeprom_read_byte(EECONFIG_BACKLIGHT);
-}
-
-void eeconfig_update_backlight(uint8_t val) {
- eeprom_update_byte(EECONFIG_BACKLIGHT, val);
+ eeconfig_update_backlight(&backlight_config);
}
void eeconfig_update_backlight_current(void) {
- eeconfig_update_backlight(backlight_config.raw);
+ eeconfig_update_backlight(&backlight_config);
}
void eeconfig_update_backlight_default(void) {
@@ -193,7 +184,7 @@ void eeconfig_update_backlight_default(void) {
backlight_config.enable = BACKLIGHT_DEFAULT_ON;
backlight_config.breathing = BACKLIGHT_DEFAULT_BREATHING;
backlight_config.level = BACKLIGHT_DEFAULT_LEVEL;
- eeconfig_update_backlight(backlight_config.raw);
+ eeconfig_update_backlight(&backlight_config);
}
/** \brief Get backlight level
@@ -226,7 +217,7 @@ void backlight_enable_breathing(void) {
if (backlight_config.breathing) return; // do nothing if breathing is already on
backlight_config.breathing = true;
- eeconfig_update_backlight(backlight_config.raw);
+ eeconfig_update_backlight(&backlight_config);
dprintf("backlight breathing enable\n");
breathing_enable();
}
@@ -239,7 +230,7 @@ void backlight_disable_breathing(void) {
if (!backlight_config.breathing) return; // do nothing if breathing is already off
backlight_config.breathing = false;
- eeconfig_update_backlight(backlight_config.raw);
+ eeconfig_update_backlight(&backlight_config);
dprintf("backlight breathing disable\n");
breathing_disable();
}
diff --git a/quantum/backlight/backlight.h b/quantum/backlight/backlight.h
index c34fb5858d..561c7f8a94 100644
--- a/quantum/backlight/backlight.h
+++ b/quantum/backlight/backlight.h
@@ -34,7 +34,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# define BREATHING_PERIOD 6
#endif
-typedef union {
+typedef union backlight_config_t {
uint8_t raw;
struct {
bool enable : 1;
@@ -58,10 +58,8 @@ void backlight_level_noeeprom(uint8_t level);
void backlight_level(uint8_t level);
uint8_t get_backlight_level(void);
-uint8_t eeconfig_read_backlight(void);
-void eeconfig_update_backlight(uint8_t val);
-void eeconfig_update_backlight_current(void);
-void eeconfig_update_backlight_default(void);
+void eeconfig_update_backlight_current(void);
+void eeconfig_update_backlight_default(void);
// implementation specific
void backlight_init_ports(void);
diff --git a/quantum/command.c b/quantum/command.c
index 024d96917d..96b637f842 100644
--- a/quantum/command.c
+++ b/quantum/command.c
@@ -246,7 +246,7 @@ static void print_eeconfig(void) {
xprintf("eeconfig:\ndefault_layer: %u\n", eeconfig_read_default_layer());
debug_config_t dc;
- dc.raw = eeconfig_read_debug();
+ eeconfig_read_debug(&dc);
xprintf(/* clang-format off */
"debug_config.raw: %02X\n"
@@ -263,7 +263,7 @@ static void print_eeconfig(void) {
); /* clang-format on */
keymap_config_t kc;
- kc.raw = eeconfig_read_keymap();
+ eeconfig_read_keymap(&kc);
xprintf(/* clang-format off */
"keymap_config.raw: %02X\n"
@@ -296,7 +296,7 @@ static void print_eeconfig(void) {
# ifdef BACKLIGHT_ENABLE
backlight_config_t bc;
- bc.raw = eeconfig_read_backlight();
+ eeconfig_read_backlight(&bc);
xprintf(/* clang-format off */
"backlight_config"
diff --git a/quantum/dynamic_keymap.c b/quantum/dynamic_keymap.c
index beb7f9d18f..756b232f59 100644
--- a/quantum/dynamic_keymap.c
+++ b/quantum/dynamic_keymap.c
@@ -1,4 +1,5 @@
/* Copyright 2017 Jason Williams (Wilba)
+ * Copyright 2024-2025 Nick Brassel (@tzarc)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,14 +22,7 @@
#include "progmem.h"
#include "send_string.h"
#include "keycodes.h"
-
-#ifdef VIA_ENABLE
-# include "via.h"
-# define DYNAMIC_KEYMAP_EEPROM_START (VIA_EEPROM_CONFIG_END)
-#else
-# include "eeconfig.h"
-# define DYNAMIC_KEYMAP_EEPROM_START (EECONFIG_SIZE)
-#endif
+#include "nvm_dynamic_keymap.h"
#ifdef ENCODER_ENABLE
# include "encoder.h"
@@ -36,67 +30,6 @@
# define NUM_ENCODERS 0
#endif
-#ifndef DYNAMIC_KEYMAP_LAYER_COUNT
-# define DYNAMIC_KEYMAP_LAYER_COUNT 4
-#endif
-
-#ifndef DYNAMIC_KEYMAP_MACRO_COUNT
-# define DYNAMIC_KEYMAP_MACRO_COUNT 16
-#endif
-
-#ifndef TOTAL_EEPROM_BYTE_COUNT
-# error Unknown total EEPROM size. Cannot derive maximum for dynamic keymaps.
-#endif
-
-#ifndef DYNAMIC_KEYMAP_EEPROM_MAX_ADDR
-# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR (TOTAL_EEPROM_BYTE_COUNT - 1)
-#endif
-
-#if DYNAMIC_KEYMAP_EEPROM_MAX_ADDR > (TOTAL_EEPROM_BYTE_COUNT - 1)
-# pragma message STR(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) " > " STR((TOTAL_EEPROM_BYTE_COUNT - 1))
-# error DYNAMIC_KEYMAP_EEPROM_MAX_ADDR is configured to use more space than what is available for the selected EEPROM driver
-#endif
-
-// Due to usage of uint16_t check for max 65535
-#if DYNAMIC_KEYMAP_EEPROM_MAX_ADDR > 65535
-# pragma message STR(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) " > 65535"
-# error DYNAMIC_KEYMAP_EEPROM_MAX_ADDR must be less than 65536
-#endif
-
-// If DYNAMIC_KEYMAP_EEPROM_ADDR not explicitly defined in config.h,
-#ifndef DYNAMIC_KEYMAP_EEPROM_ADDR
-# define DYNAMIC_KEYMAP_EEPROM_ADDR DYNAMIC_KEYMAP_EEPROM_START
-#endif
-
-// Dynamic encoders starts after dynamic keymaps
-#ifndef DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR
-# define DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR (DYNAMIC_KEYMAP_EEPROM_ADDR + (DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2))
-#endif
-
-// Dynamic macro starts after dynamic encoders, but only when using ENCODER_MAP
-#ifdef ENCODER_MAP_ENABLE
-# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-# define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR (DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR + (DYNAMIC_KEYMAP_LAYER_COUNT * NUM_ENCODERS * 2 * 2))
-# endif // DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-#else // ENCODER_MAP_ENABLE
-# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-# define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR (DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR)
-# endif // DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
-#endif // ENCODER_MAP_ENABLE
-
-// Sanity check that dynamic keymaps fit in available EEPROM
-// If there's not 100 bytes available for macros, then something is wrong.
-// The keyboard should override DYNAMIC_KEYMAP_LAYER_COUNT to reduce it,
-// or DYNAMIC_KEYMAP_EEPROM_MAX_ADDR to increase it, *only if* the microcontroller has
-// more than the default.
-_Static_assert((DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) - (DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR) >= 100, "Dynamic keymaps are configured to use more EEPROM than is available.");
-
-// Dynamic macros are stored after the keymaps and use what is available
-// up to and including DYNAMIC_KEYMAP_EEPROM_MAX_ADDR.
-#ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE
-# define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE (DYNAMIC_KEYMAP_EEPROM_MAX_ADDR - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + 1)
-#endif
-
#ifndef DYNAMIC_KEYMAP_MACRO_DELAY
# define DYNAMIC_KEYMAP_MACRO_DELAY TAP_CODE_DELAY
#endif
@@ -105,52 +38,28 @@ uint8_t dynamic_keymap_get_layer_count(void) {
return DYNAMIC_KEYMAP_LAYER_COUNT;
}
-void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column) {
- // TODO: optimize this with some left shifts
- return ((void *)DYNAMIC_KEYMAP_EEPROM_ADDR) + (layer * MATRIX_ROWS * MATRIX_COLS * 2) + (row * MATRIX_COLS * 2) + (column * 2);
-}
-
uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column) {
- if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || row >= MATRIX_ROWS || column >= MATRIX_COLS) return KC_NO;
- void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column);
- // Big endian, so we can read/write EEPROM directly from host if we want
- uint16_t keycode = eeprom_read_byte(address) << 8;
- keycode |= eeprom_read_byte(address + 1);
- return keycode;
+ return nvm_dynamic_keymap_read_keycode(layer, row, column);
}
void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode) {
- if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || row >= MATRIX_ROWS || column >= MATRIX_COLS) return;
- void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column);
- // Big endian, so we can read/write EEPROM directly from host if we want
- eeprom_update_byte(address, (uint8_t)(keycode >> 8));
- eeprom_update_byte(address + 1, (uint8_t)(keycode & 0xFF));
+ nvm_dynamic_keymap_update_keycode(layer, row, column, keycode);
}
#ifdef ENCODER_MAP_ENABLE
-void *dynamic_keymap_encoder_to_eeprom_address(uint8_t layer, uint8_t encoder_id) {
- return ((void *)DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR) + (layer * NUM_ENCODERS * 2 * 2) + (encoder_id * 2 * 2);
-}
-
uint16_t dynamic_keymap_get_encoder(uint8_t layer, uint8_t encoder_id, bool clockwise) {
- if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || encoder_id >= NUM_ENCODERS) return KC_NO;
- void *address = dynamic_keymap_encoder_to_eeprom_address(layer, encoder_id);
- // Big endian, so we can read/write EEPROM directly from host if we want
- uint16_t keycode = ((uint16_t)eeprom_read_byte(address + (clockwise ? 0 : 2))) << 8;
- keycode |= eeprom_read_byte(address + (clockwise ? 0 : 2) + 1);
- return keycode;
+ return nvm_dynamic_keymap_read_encoder(layer, encoder_id, clockwise);
}
void dynamic_keymap_set_encoder(uint8_t layer, uint8_t encoder_id, bool clockwise, uint16_t keycode) {
- if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || encoder_id >= NUM_ENCODERS) return;
- void *address = dynamic_keymap_encoder_to_eeprom_address(layer, encoder_id);
- // Big endian, so we can read/write EEPROM directly from host if we want
- eeprom_update_byte(address + (clockwise ? 0 : 2), (uint8_t)(keycode >> 8));
- eeprom_update_byte(address + (clockwise ? 0 : 2) + 1, (uint8_t)(keycode & 0xFF));
+ nvm_dynamic_keymap_update_encoder(layer, encoder_id, clockwise, keycode);
}
#endif // ENCODER_MAP_ENABLE
void dynamic_keymap_reset(void) {
+ // Erase the keymaps, if necessary.
+ nvm_dynamic_keymap_erase();
+
// Reset the keymaps in EEPROM to what is in flash.
for (int layer = 0; layer < DYNAMIC_KEYMAP_LAYER_COUNT; layer++) {
for (int row = 0; row < MATRIX_ROWS; row++) {
@@ -168,31 +77,11 @@ void dynamic_keymap_reset(void) {
}
void dynamic_keymap_get_buffer(uint16_t offset, uint16_t size, uint8_t *data) {
- uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2;
- void * source = (void *)(DYNAMIC_KEYMAP_EEPROM_ADDR + offset);
- uint8_t *target = data;
- for (uint16_t i = 0; i < size; i++) {
- if (offset + i < dynamic_keymap_eeprom_size) {
- *target = eeprom_read_byte(source);
- } else {
- *target = 0x00;
- }
- source++;
- target++;
- }
+ nvm_dynamic_keymap_read_buffer(offset, size, data);
}
void dynamic_keymap_set_buffer(uint16_t offset, uint16_t size, uint8_t *data) {
- uint16_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2;
- void * target = (void *)(DYNAMIC_KEYMAP_EEPROM_ADDR + offset);
- uint8_t *source = data;
- for (uint16_t i = 0; i < size; i++) {
- if (offset + i < dynamic_keymap_eeprom_size) {
- eeprom_update_byte(target, *source);
- }
- source++;
- target++;
- }
+ nvm_dynamic_keymap_update_buffer(offset, size, data);
}
uint16_t keycode_at_keymap_location(uint8_t layer_num, uint8_t row, uint8_t column) {
@@ -216,53 +105,38 @@ uint8_t dynamic_keymap_macro_get_count(void) {
}
uint16_t dynamic_keymap_macro_get_buffer_size(void) {
- return DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE;
+ return (uint16_t)nvm_dynamic_keymap_macro_size();
}
void dynamic_keymap_macro_get_buffer(uint16_t offset, uint16_t size, uint8_t *data) {
- void * source = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + offset);
- uint8_t *target = data;
- for (uint16_t i = 0; i < size; i++) {
- if (offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE) {
- *target = eeprom_read_byte(source);
- } else {
- *target = 0x00;
- }
- source++;
- target++;
- }
+ nvm_dynamic_keymap_macro_read_buffer(offset, size, data);
}
void dynamic_keymap_macro_set_buffer(uint16_t offset, uint16_t size, uint8_t *data) {
- void * target = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + offset);
- uint8_t *source = data;
- for (uint16_t i = 0; i < size; i++) {
- if (offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE) {
- eeprom_update_byte(target, *source);
- }
- source++;
- target++;
- }
+ nvm_dynamic_keymap_macro_update_buffer(offset, size, data);
}
-typedef struct send_string_eeprom_state_t {
- const uint8_t *ptr;
-} send_string_eeprom_state_t;
+static uint8_t dynamic_keymap_read_byte(uint32_t offset) {
+ uint8_t d;
+ nvm_dynamic_keymap_macro_read_buffer(offset, 1, &d);
+ return d;
+}
-char send_string_get_next_eeprom(void *arg) {
- send_string_eeprom_state_t *state = (send_string_eeprom_state_t *)arg;
- char ret = eeprom_read_byte(state->ptr);
- state->ptr++;
+typedef struct send_string_nvm_state_t {
+ uint32_t offset;
+} send_string_nvm_state_t;
+
+char send_string_get_next_nvm(void *arg) {
+ send_string_nvm_state_t *state = (send_string_nvm_state_t *)arg;
+ char ret = dynamic_keymap_read_byte(state->offset);
+ state->offset++;
return ret;
}
void dynamic_keymap_macro_reset(void) {
- void *p = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
- void *end = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE);
- while (p != end) {
- eeprom_update_byte(p, 0);
- ++p;
- }
+ // Erase the macros, if necessary.
+ nvm_dynamic_keymap_macro_erase();
+ nvm_dynamic_keymap_macro_reset();
}
void dynamic_keymap_macro_send(uint8_t id) {
@@ -274,27 +148,26 @@ void dynamic_keymap_macro_send(uint8_t id) {
// If it's not zero, then we are in the middle
// of buffer writing, possibly an aborted buffer
// write. So do nothing.
- void *p = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE - 1);
- if (eeprom_read_byte(p) != 0) {
+ if (dynamic_keymap_read_byte(nvm_dynamic_keymap_macro_size() - 1) != 0) {
return;
}
// Skip N null characters
// p will then point to the Nth macro
- p = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
- void *end = (void *)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE);
+ uint32_t offset = 0;
+ uint32_t end = nvm_dynamic_keymap_macro_size();
while (id > 0) {
// If we are past the end of the buffer, then there is
// no Nth macro in the buffer.
- if (p == end) {
+ if (offset == end) {
return;
}
- if (eeprom_read_byte(p) == 0) {
+ if (dynamic_keymap_read_byte(offset) == 0) {
--id;
}
- ++p;
+ ++offset;
}
- send_string_eeprom_state_t state = {p};
- send_string_with_delay_impl(send_string_get_next_eeprom, &state, DYNAMIC_KEYMAP_MACRO_DELAY);
+ send_string_nvm_state_t state = {.offset = 0};
+ send_string_with_delay_impl(send_string_get_next_nvm, &state, DYNAMIC_KEYMAP_MACRO_DELAY);
}
diff --git a/quantum/dynamic_keymap.h b/quantum/dynamic_keymap.h
index 806342efa3..f1d8077b12 100644
--- a/quantum/dynamic_keymap.h
+++ b/quantum/dynamic_keymap.h
@@ -18,8 +18,15 @@
#include <stdint.h>
#include <stdbool.h>
+#ifndef DYNAMIC_KEYMAP_LAYER_COUNT
+# define DYNAMIC_KEYMAP_LAYER_COUNT 4
+#endif
+
+#ifndef DYNAMIC_KEYMAP_MACRO_COUNT
+# define DYNAMIC_KEYMAP_MACRO_COUNT 16
+#endif
+
uint8_t dynamic_keymap_get_layer_count(void);
-void * dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column);
uint16_t dynamic_keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t column);
void dynamic_keymap_set_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode);
#ifdef ENCODER_MAP_ENABLE
diff --git a/quantum/eeconfig.c b/quantum/eeconfig.c
index e27f604f12..9aa60fc968 100644
--- a/quantum/eeconfig.c
+++ b/quantum/eeconfig.c
@@ -1,355 +1,333 @@
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
+#include "debug.h"
#include "eeprom.h"
#include "eeconfig.h"
+#include "action_layer.h"
+#include "nvm_eeconfig.h"
+#include "keycode_config.h"
-#if defined(EEPROM_DRIVER)
+#ifdef EEPROM_DRIVER
# include "eeprom_driver.h"
-#endif
+#endif // EEPROM_DRIVER
+
+#ifdef BACKLIGHT_ENABLE
+# include "backlight.h"
+#endif // BACKLIGHT_ENABLE
+
+#ifdef AUDIO_ENABLE
+# include "audio.h"
+#endif // AUDIO_ENABLE
+
+#ifdef RGBLIGHT_ENABLE
+# include "rgblight.h"
+#endif // RGBLIGHT_ENABLE
+
+#ifdef RGB_MATRIX_ENABLE
+# include "rgb_matrix_types.h"
+#endif // RGB_MATRIX_ENABLE
-#if defined(HAPTIC_ENABLE)
+#ifdef LED_MATRIX_ENABLE
+# include "led_matrix_types.h"
+#endif // LED_MATRIX_ENABLE
+
+#ifdef UNICODE_COMMON_ENABLE
+# include "unicode.h"
+#endif // UNICODE_COMMON_ENABLE
+
+#ifdef HAPTIC_ENABLE
# include "haptic.h"
-#endif
+#endif // HAPTIC_ENABLE
-#if defined(VIA_ENABLE)
+#ifdef VIA_ENABLE
bool via_eeprom_is_valid(void);
void via_eeprom_set_valid(bool valid);
void eeconfig_init_via(void);
-#endif
-
-_Static_assert((intptr_t)EECONFIG_HANDEDNESS == 14, "EEPROM handedness offset is incorrect");
+#else
+void dynamic_keymap_reset(void);
+#endif // VIA_ENABLE
-/** \brief eeconfig enable
- *
- * FIXME: needs doc
- */
__attribute__((weak)) void eeconfig_init_user(void) {
#if (EECONFIG_USER_DATA_SIZE) == 0
// Reset user EEPROM value to blank, rather than to a set value
eeconfig_update_user(0);
-#endif
+#endif // (EECONFIG_USER_DATA_SIZE) == 0
}
__attribute__((weak)) void eeconfig_init_kb(void) {
#if (EECONFIG_KB_DATA_SIZE) == 0
// Reset Keyboard EEPROM value to blank, rather than to a set value
eeconfig_update_kb(0);
-#endif
+#endif // (EECONFIG_KB_DATA_SIZE) == 0
eeconfig_init_user();
}
-/*
- * FIXME: needs doc
- */
void eeconfig_init_quantum(void) {
-#if defined(EEPROM_DRIVER)
- eeprom_driver_format(false);
-#endif
+ nvm_eeconfig_erase();
+
+ eeconfig_enable();
+
+ debug_config_t debug_config = {0};
+ eeconfig_update_debug(&debug_config);
- eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
- eeprom_update_byte(EECONFIG_DEBUG, 0);
default_layer_state = (layer_state_t)1 << 0;
eeconfig_update_default_layer(default_layer_state);
- // Enable oneshot and autocorrect by default: 0b0001 0100 0000 0000
- eeprom_update_word(EECONFIG_KEYMAP, 0x1400);
- eeprom_update_byte(EECONFIG_BACKLIGHT, 0);
- eeprom_update_byte(EECONFIG_AUDIO, 0);
- eeprom_update_dword(EECONFIG_RGBLIGHT, 0);
- eeprom_update_byte(EECONFIG_RGBLIGHT_EXTENDED, 0);
- eeprom_update_byte(EECONFIG_UNICODEMODE, 0);
- eeprom_update_byte(EECONFIG_STENOMODE, 0);
- eeprom_write_qword(EECONFIG_RGB_MATRIX, 0);
- eeprom_update_dword(EECONFIG_HAPTIC, 0);
-#if defined(HAPTIC_ENABLE)
- haptic_reset();
+
+ keymap_config_t keymap_config = {
+ .swap_control_capslock = false,
+ .capslock_to_control = false,
+ .swap_lalt_lgui = false,
+ .swap_ralt_rgui = false,
+ .no_gui = false,
+ .swap_grave_esc = false,
+ .swap_backslash_backspace = false,
+ .nkro = false,
+ .swap_lctl_lgui = false,
+ .swap_rctl_rgui = false,
+ .oneshot_enable = true, // Enable oneshot by default
+ .swap_escape_capslock = false,
+ .autocorrect_enable = true, // Enable autocorrect by default
+ };
+ eeconfig_update_keymap(&keymap_config);
+
+#ifdef BACKLIGHT_ENABLE
+ backlight_config_t backlight_config = {0};
+ eeconfig_update_backlight(&backlight_config);
+#endif // BACKLIGHT_ENABLE
+
+#ifdef AUDIO_ENABLE
+ audio_config_t audio_config = {0};
+ eeconfig_update_audio(&audio_config);
+#endif // AUDIO_ENABLE
+
+#ifdef RGBLIGHT_ENABLE
+ rgblight_config_t rgblight_config = {0};
+ eeconfig_update_rgblight(&rgblight_config);
+#endif // RGBLIGHT_ENABLE
+
+#ifdef UNICODE_COMMON_ENABLE
+ unicode_config_t unicode_config = {0};
+ eeconfig_update_unicode_mode(&unicode_config);
+#endif // UNICODE_COMMON_ENABLE
+
+#ifdef STENO_ENABLE
+ eeconfig_update_steno_mode(0);
+#endif // STENO_ENABLE
+
+#ifdef RGB_MATRIX_ENABLE
+ rgb_config_t rgb_matrix_config = {0};
+ eeconfig_update_rgb_matrix(&rgb_matrix_config);
#endif
+#ifdef LED_MATRIX_ENABLE
+ led_eeconfig_t led_matrix_config = {0};
+ eeconfig_update_led_matrix(&led_matrix_config);
+#endif // LED_MATRIX_ENABLE
+
+#ifdef HAPTIC_ENABLE
+ haptic_config_t haptic_config = {0};
+ eeconfig_update_haptic(&haptic_config);
+ haptic_reset();
+#endif // HAPTIC_ENABLE
+
#if (EECONFIG_KB_DATA_SIZE) > 0
eeconfig_init_kb_datablock();
-#endif
+#endif // (EECONFIG_KB_DATA_SIZE) > 0
#if (EECONFIG_USER_DATA_SIZE) > 0
eeconfig_init_user_datablock();
-#endif
+#endif // (EECONFIG_USER_DATA_SIZE) > 0
#if defined(VIA_ENABLE)
// Invalidate VIA eeprom config, and then reset.
- // Just in case if power is lost mid init, this makes sure that it pets
+ // Just in case if power is lost mid init, this makes sure that it gets
// properly re-initialized.
- via_eeprom_set_valid(false);
eeconfig_init_via();
+#elif defined(DYNAMIC_KEYMAP_ENABLE)
+ dynamic_keymap_reset();
#endif
eeconfig_init_kb();
}
-/** \brief eeconfig initialization
- *
- * FIXME: needs doc
- */
void eeconfig_init(void) {
eeconfig_init_quantum();
}
-/** \brief eeconfig enable
- *
- * FIXME: needs doc
- */
void eeconfig_enable(void) {
- eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
+ nvm_eeconfig_enable();
}
-/** \brief eeconfig disable
- *
- * FIXME: needs doc
- */
void eeconfig_disable(void) {
-#if defined(EEPROM_DRIVER)
- eeprom_driver_format(false);
-#endif
- eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF);
+ nvm_eeconfig_disable();
}
-/** \brief eeconfig is enabled
- *
- * FIXME: needs doc
- */
bool eeconfig_is_enabled(void) {
- bool is_eeprom_enabled = (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER);
+ bool is_eeprom_enabled = nvm_eeconfig_is_enabled();
#ifdef VIA_ENABLE
if (is_eeprom_enabled) {
is_eeprom_enabled = via_eeprom_is_valid();
}
-#endif
+#endif // VIA_ENABLE
return is_eeprom_enabled;
}
-/** \brief eeconfig is disabled
- *
- * FIXME: needs doc
- */
bool eeconfig_is_disabled(void) {
- bool is_eeprom_disabled = (eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER_OFF);
+ bool is_eeprom_disabled = nvm_eeconfig_is_disabled();
#ifdef VIA_ENABLE
if (!is_eeprom_disabled) {
is_eeprom_disabled = !via_eeprom_is_valid();
}
-#endif
+#endif // VIA_ENABLE
return is_eeprom_disabled;
}
-/** \brief eeconfig read debug
- *
- * FIXME: needs doc
- */
-uint8_t eeconfig_read_debug(void) {
- return eeprom_read_byte(EECONFIG_DEBUG);
+void eeconfig_read_debug(debug_config_t *debug_config) {
+ nvm_eeconfig_read_debug(debug_config);
}
-/** \brief eeconfig update debug
- *
- * FIXME: needs doc
- */
-void eeconfig_update_debug(uint8_t val) {
- eeprom_update_byte(EECONFIG_DEBUG, val);
+void eeconfig_update_debug(const debug_config_t *debug_config) {
+ nvm_eeconfig_update_debug(debug_config);
}
-/** \brief eeconfig read default layer
- *
- * FIXME: needs doc
- */
layer_state_t eeconfig_read_default_layer(void) {
- uint8_t val = eeprom_read_byte(EECONFIG_DEFAULT_LAYER);
-
-#ifdef DEFAULT_LAYER_STATE_IS_VALUE_NOT_BITMASK
- // stored as a layer number, so convert back to bitmask
- return 1 << val;
-#else
- // stored as 8-bit-wide bitmask, so read the value directly - handling padding to 16/32 bit layer_state_t
- return val;
-#endif
+ return nvm_eeconfig_read_default_layer();
}
-/** \brief eeconfig update default layer
- *
- * FIXME: needs doc
- */
void eeconfig_update_default_layer(layer_state_t state) {
-#ifdef DEFAULT_LAYER_STATE_IS_VALUE_NOT_BITMASK
- // stored as a layer number, so only store the highest layer
- uint8_t val = get_highest_layer(state);
-#else
- // stored as 8-bit-wide bitmask, so write the value directly - handling truncation from 16/32 bit layer_state_t
- uint8_t val = state;
-#endif
+ nvm_eeconfig_update_default_layer(state);
+}
+
+void eeconfig_read_keymap(keymap_config_t *keymap_config) {
+ nvm_eeconfig_read_keymap(keymap_config);
+}
+void eeconfig_update_keymap(const keymap_config_t *keymap_config) {
+ nvm_eeconfig_update_keymap(keymap_config);
+}
+
+#ifdef AUDIO_ENABLE
+void eeconfig_read_audio(audio_config_t *audio_config) {
+ nvm_eeconfig_read_audio(audio_config);
+}
+void eeconfig_update_audio(const audio_config_t *audio_config) {
+ nvm_eeconfig_update_audio(audio_config);
+}
+#endif // AUDIO_ENABLE
+
+#ifdef UNICODE_COMMON_ENABLE
+void eeconfig_read_unicode_mode(unicode_config_t *unicode_config) {
+ return nvm_eeconfig_read_unicode_mode(unicode_config);
+}
+void eeconfig_update_unicode_mode(const unicode_config_t *unicode_config) {
+ nvm_eeconfig_update_unicode_mode(unicode_config);
+}
+#endif // UNICODE_COMMON_ENABLE
- eeprom_update_byte(EECONFIG_DEFAULT_LAYER, val);
+#ifdef BACKLIGHT_ENABLE
+void eeconfig_read_backlight(backlight_config_t *backlight_config) {
+ nvm_eeconfig_read_backlight(backlight_config);
+}
+void eeconfig_update_backlight(const backlight_config_t *backlight_config) {
+ nvm_eeconfig_update_backlight(backlight_config);
+}
+#endif // BACKLIGHT_ENABLE
+
+#ifdef STENO_ENABLE
+uint8_t eeconfig_read_steno_mode(void) {
+ return nvm_eeconfig_read_steno_mode();
+}
+void eeconfig_update_steno_mode(uint8_t val) {
+ nvm_eeconfig_update_steno_mode(val);
}
+#endif // STENO_ENABLE
-/** \brief eeconfig read keymap
- *
- * FIXME: needs doc
- */
-uint16_t eeconfig_read_keymap(void) {
- return eeprom_read_word(EECONFIG_KEYMAP);
+#ifdef RGB_MATRIX_ENABLE
+void eeconfig_read_rgb_matrix(rgb_config_t *rgb_matrix_config) {
+ nvm_eeconfig_read_rgb_matrix(rgb_matrix_config);
}
-/** \brief eeconfig update keymap
- *
- * FIXME: needs doc
- */
-void eeconfig_update_keymap(uint16_t val) {
- eeprom_update_word(EECONFIG_KEYMAP, val);
+void eeconfig_update_rgb_matrix(const rgb_config_t *rgb_matrix_config) {
+ nvm_eeconfig_update_rgb_matrix(rgb_matrix_config);
}
+#endif // RGB_MATRIX_ENABLE
-/** \brief eeconfig read audio
- *
- * FIXME: needs doc
- */
-uint8_t eeconfig_read_audio(void) {
- return eeprom_read_byte(EECONFIG_AUDIO);
+#ifdef LED_MATRIX_ENABLE
+void eeconfig_read_led_matrix(led_eeconfig_t *led_matrix_config) {
+ nvm_eeconfig_read_led_matrix(led_matrix_config);
}
-/** \brief eeconfig update audio
- *
- * FIXME: needs doc
- */
-void eeconfig_update_audio(uint8_t val) {
- eeprom_update_byte(EECONFIG_AUDIO, val);
+void eeconfig_update_led_matrix(const led_eeconfig_t *led_matrix_config) {
+ nvm_eeconfig_update_led_matrix(led_matrix_config);
}
+#endif // LED_MATRIX_ENABLE
+
+#ifdef RGBLIGHT_ENABLE
+void eeconfig_read_rgblight(rgblight_config_t *rgblight_config) {
+ nvm_eeconfig_read_rgblight(rgblight_config);
+}
+void eeconfig_update_rgblight(const rgblight_config_t *rgblight_config) {
+ nvm_eeconfig_update_rgblight(rgblight_config);
+}
+#endif // RGBLIGHT_ENABLE
#if (EECONFIG_KB_DATA_SIZE) == 0
-/** \brief eeconfig read kb
- *
- * FIXME: needs doc
- */
uint32_t eeconfig_read_kb(void) {
- return eeprom_read_dword(EECONFIG_KEYBOARD);
+ return nvm_eeconfig_read_kb();
}
-/** \brief eeconfig update kb
- *
- * FIXME: needs doc
- */
void eeconfig_update_kb(uint32_t val) {
- eeprom_update_dword(EECONFIG_KEYBOARD, val);
+ nvm_eeconfig_update_kb(val);
}
#endif // (EECONFIG_KB_DATA_SIZE) == 0
#if (EECONFIG_USER_DATA_SIZE) == 0
-/** \brief eeconfig read user
- *
- * FIXME: needs doc
- */
uint32_t eeconfig_read_user(void) {
- return eeprom_read_dword(EECONFIG_USER);
+ return nvm_eeconfig_read_user();
}
-/** \brief eeconfig update user
- *
- * FIXME: needs doc
- */
void eeconfig_update_user(uint32_t val) {
- eeprom_update_dword(EECONFIG_USER, val);
+ nvm_eeconfig_update_user(val);
}
#endif // (EECONFIG_USER_DATA_SIZE) == 0
-/** \brief eeconfig read haptic
- *
- * FIXME: needs doc
- */
-uint32_t eeconfig_read_haptic(void) {
- return eeprom_read_dword(EECONFIG_HAPTIC);
-}
-/** \brief eeconfig update haptic
- *
- * FIXME: needs doc
- */
-void eeconfig_update_haptic(uint32_t val) {
- eeprom_update_dword(EECONFIG_HAPTIC, val);
-}
-
-/** \brief eeconfig read split handedness
- *
- * FIXME: needs doc
- */
+#ifdef HAPTIC_ENABLE
+void eeconfig_read_haptic(haptic_config_t *haptic_config) {
+ nvm_eeconfig_read_haptic(haptic_config);
+}
+void eeconfig_update_haptic(const haptic_config_t *haptic_config) {
+ nvm_eeconfig_update_haptic(haptic_config);
+}
+#endif // HAPTIC_ENABLE
+
bool eeconfig_read_handedness(void) {
- return !!eeprom_read_byte(EECONFIG_HANDEDNESS);
+ return nvm_eeconfig_read_handedness();
}
-/** \brief eeconfig update split handedness
- *
- * FIXME: needs doc
- */
void eeconfig_update_handedness(bool val) {
- eeprom_update_byte(EECONFIG_HANDEDNESS, !!val);
+ nvm_eeconfig_update_handedness(val);
}
#if (EECONFIG_KB_DATA_SIZE) > 0
-/** \brief eeconfig assert keyboard data block version
- *
- * FIXME: needs doc
- */
bool eeconfig_is_kb_datablock_valid(void) {
- return eeprom_read_dword(EECONFIG_KEYBOARD) == (EECONFIG_KB_DATA_VERSION);
-}
-/** \brief eeconfig read keyboard data block
- *
- * FIXME: needs doc
- */
-void eeconfig_read_kb_datablock(void *data) {
- if (eeconfig_is_kb_datablock_valid()) {
- eeprom_read_block(data, EECONFIG_KB_DATABLOCK, (EECONFIG_KB_DATA_SIZE));
- } else {
- memset(data, 0, (EECONFIG_KB_DATA_SIZE));
- }
+ return nvm_eeconfig_is_kb_datablock_valid();
+}
+uint32_t eeconfig_read_kb_datablock(void *data, uint32_t offset, uint32_t length) {
+ return nvm_eeconfig_read_kb_datablock(data, offset, length);
+}
+uint32_t eeconfig_update_kb_datablock(const void *data, uint32_t offset, uint32_t length) {
+ return nvm_eeconfig_update_kb_datablock(data, offset, length);
}
-/** \brief eeconfig update keyboard data block
- *
- * FIXME: needs doc
- */
-void eeconfig_update_kb_datablock(const void *data) {
- eeprom_update_dword(EECONFIG_KEYBOARD, (EECONFIG_KB_DATA_VERSION));
- eeprom_update_block(data, EECONFIG_KB_DATABLOCK, (EECONFIG_KB_DATA_SIZE));
-}
-/** \brief eeconfig init keyboard data block
- *
- * FIXME: needs doc
- */
__attribute__((weak)) void eeconfig_init_kb_datablock(void) {
- uint8_t dummy_kb[(EECONFIG_KB_DATA_SIZE)] = {0};
- eeconfig_update_kb_datablock(dummy_kb);
+ nvm_eeconfig_init_kb_datablock();
}
#endif // (EECONFIG_KB_DATA_SIZE) > 0
#if (EECONFIG_USER_DATA_SIZE) > 0
-/** \brief eeconfig assert user data block version
- *
- * FIXME: needs doc
- */
bool eeconfig_is_user_datablock_valid(void) {
- return eeprom_read_dword(EECONFIG_USER) == (EECONFIG_USER_DATA_VERSION);
-}
-/** \brief eeconfig read user data block
- *
- * FIXME: needs doc
- */
-void eeconfig_read_user_datablock(void *data) {
- if (eeconfig_is_user_datablock_valid()) {
- eeprom_read_block(data, EECONFIG_USER_DATABLOCK, (EECONFIG_USER_DATA_SIZE));
- } else {
- memset(data, 0, (EECONFIG_USER_DATA_SIZE));
- }
+ return nvm_eeconfig_is_user_datablock_valid();
+}
+uint32_t eeconfig_read_user_datablock(void *data, uint32_t offset, uint32_t length) {
+ return nvm_eeconfig_read_user_datablock(data, offset, length);
+}
+uint32_t eeconfig_update_user_datablock(const void *data, uint32_t offset, uint32_t length) {
+ return nvm_eeconfig_update_user_datablock(data, offset, length);
}
-/** \brief eeconfig update user data block
- *
- * FIXME: needs doc
- */
-void eeconfig_update_user_datablock(const void *data) {
- eeprom_update_dword(EECONFIG_USER, (EECONFIG_USER_DATA_VERSION));
- eeprom_update_block(data, EECONFIG_USER_DATABLOCK, (EECONFIG_USER_DATA_SIZE));
-}
-/** \brief eeconfig init user data block
- *
- * FIXME: needs doc
- */
__attribute__((weak)) void eeconfig_init_user_datablock(void) {
- uint8_t dummy_user[(EECONFIG_USER_DATA_SIZE)] = {0};
- eeconfig_update_user_datablock(dummy_user);
+ nvm_eeconfig_init_user_datablock();
}
#endif // (EECONFIG_USER_DATA_SIZE) > 0
diff --git a/quantum/eeconfig.h b/quantum/eeconfig.h
index 11cf1ccbca..4044f1c294 100644
--- a/quantum/eeconfig.h
+++ b/quantum/eeconfig.h
@@ -19,59 +19,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <stdint.h>
#include <stdbool.h>
-#include <stddef.h> // offsetof
-#include "eeprom.h"
-#include "util.h"
+#include <stddef.h> // offsetof
#include "action_layer.h" // layer_state_t
-#ifndef EECONFIG_MAGIC_NUMBER
-# define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEE5 // When changing, decrement this value to avoid future re-init issues
-#endif
-#define EECONFIG_MAGIC_NUMBER_OFF (uint16_t)0xFFFF
-
-// Dummy struct only used to calculate offsets
-typedef struct PACKED {
- uint16_t magic;
- uint8_t debug;
- uint8_t default_layer;
- uint16_t keymap;
- uint8_t backlight;
- uint8_t audio;
- uint32_t rgblight;
- uint8_t unicode;
- uint8_t steno;
- uint8_t handedness;
- uint32_t keyboard;
- uint32_t user;
- union { // Mutually exclusive
- uint32_t led_matrix;
- uint64_t rgb_matrix;
- };
- uint32_t haptic;
- uint8_t rgblight_ext;
-} eeprom_core_t;
-
-/* EEPROM parameter address */
-#define EECONFIG_MAGIC (uint16_t *)(offsetof(eeprom_core_t, magic))
-#define EECONFIG_DEBUG (uint8_t *)(offsetof(eeprom_core_t, debug))
-#define EECONFIG_DEFAULT_LAYER (uint8_t *)(offsetof(eeprom_core_t, default_layer))
-#define EECONFIG_KEYMAP (uint16_t *)(offsetof(eeprom_core_t, keymap))
-#define EECONFIG_BACKLIGHT (uint8_t *)(offsetof(eeprom_core_t, backlight))
-#define EECONFIG_AUDIO (uint8_t *)(offsetof(eeprom_core_t, audio))
-#define EECONFIG_RGBLIGHT (uint32_t *)(offsetof(eeprom_core_t, rgblight))
-#define EECONFIG_UNICODEMODE (uint8_t *)(offsetof(eeprom_core_t, unicode))
-#define EECONFIG_STENOMODE (uint8_t *)(offsetof(eeprom_core_t, steno))
-#define EECONFIG_HANDEDNESS (uint8_t *)(offsetof(eeprom_core_t, handedness))
-#define EECONFIG_KEYBOARD (uint32_t *)(offsetof(eeprom_core_t, keyboard))
-#define EECONFIG_USER (uint32_t *)(offsetof(eeprom_core_t, user))
-#define EECONFIG_LED_MATRIX (uint32_t *)(offsetof(eeprom_core_t, led_matrix))
-#define EECONFIG_RGB_MATRIX (uint64_t *)(offsetof(eeprom_core_t, rgb_matrix))
-#define EECONFIG_HAPTIC (uint32_t *)(offsetof(eeprom_core_t, haptic))
-#define EECONFIG_RGBLIGHT_EXTENDED (uint8_t *)(offsetof(eeprom_core_t, rgblight_ext))
-
-// Size of EEPROM being used for core data storage
-#define EECONFIG_BASE_SIZE ((uint8_t)sizeof(eeprom_core_t))
-
// Size of EEPROM dedicated to keyboard- and user-specific data
#ifndef EECONFIG_KB_DATA_SIZE
# define EECONFIG_KB_DATA_SIZE 0
@@ -86,12 +36,6 @@ typedef struct PACKED {
# define EECONFIG_USER_DATA_VERSION (EECONFIG_USER_DATA_SIZE)
#endif
-#define EECONFIG_KB_DATABLOCK ((uint8_t *)(EECONFIG_BASE_SIZE))
-#define EECONFIG_USER_DATABLOCK ((uint8_t *)((EECONFIG_BASE_SIZE) + (EECONFIG_KB_DATA_SIZE)))
-
-// Size of EEPROM being used, other code can refer to this for available EEPROM
-#define EECONFIG_SIZE ((EECONFIG_BASE_SIZE) + (EECONFIG_KB_DATA_SIZE) + (EECONFIG_USER_DATA_SIZE))
-
/* debug bit */
#define EECONFIG_DEBUG_ENABLE (1 << 0)
#define EECONFIG_DEBUG_MATRIX (1 << 1)
@@ -117,22 +61,59 @@ void eeconfig_init_kb(void);
void eeconfig_init_user(void);
void eeconfig_enable(void);
-
void eeconfig_disable(void);
-uint8_t eeconfig_read_debug(void);
-void eeconfig_update_debug(uint8_t val);
+typedef union debug_config_t debug_config_t;
+void eeconfig_read_debug(debug_config_t *debug_config) __attribute__((nonnull));
+void eeconfig_update_debug(const debug_config_t *debug_config) __attribute__((nonnull));
layer_state_t eeconfig_read_default_layer(void);
-void eeconfig_update_default_layer(layer_state_t val);
+void eeconfig_update_default_layer(layer_state_t state);
-uint16_t eeconfig_read_keymap(void);
-void eeconfig_update_keymap(uint16_t val);
+typedef union keymap_config_t keymap_config_t;
+void eeconfig_read_keymap(keymap_config_t *keymap_config) __attribute__((nonnull));
+void eeconfig_update_keymap(const keymap_config_t *keymap_config) __attribute__((nonnull));
#ifdef AUDIO_ENABLE
-uint8_t eeconfig_read_audio(void);
-void eeconfig_update_audio(uint8_t val);
-#endif
+typedef union audio_config_t audio_config_t;
+void eeconfig_read_audio(audio_config_t *audio_config) __attribute__((nonnull));
+void eeconfig_update_audio(const audio_config_t *audio_config) __attribute__((nonnull));
+#endif // AUDIO_ENABLE
+
+#ifdef UNICODE_COMMON_ENABLE
+typedef union unicode_config_t unicode_config_t;
+void eeconfig_read_unicode_mode(unicode_config_t *unicode_config) __attribute__((nonnull));
+void eeconfig_update_unicode_mode(const unicode_config_t *unicode_config) __attribute__((nonnull));
+#endif // UNICODE_COMMON_ENABLE
+
+#ifdef BACKLIGHT_ENABLE
+typedef union backlight_config_t backlight_config_t;
+void eeconfig_read_backlight(backlight_config_t *backlight_config) __attribute__((nonnull));
+void eeconfig_update_backlight(const backlight_config_t *backlight_config) __attribute__((nonnull));
+#endif // BACKLIGHT_ENABLE
+
+#ifdef STENO_ENABLE
+uint8_t eeconfig_read_steno_mode(void);
+void eeconfig_update_steno_mode(uint8_t val);
+#endif // STENO_ENABLE
+
+#ifdef RGB_MATRIX_ENABLE
+typedef union rgb_config_t rgb_config_t;
+void eeconfig_read_rgb_matrix(rgb_config_t *rgb_matrix_config) __attribute__((nonnull));
+void eeconfig_update_rgb_matrix(const rgb_config_t *rgb_matrix_config) __attribute__((nonnull));
+#endif // RGB_MATRIX_ENABLE
+
+#ifdef LED_MATRIX_ENABLE
+typedef union led_eeconfig_t led_eeconfig_t;
+void eeconfig_read_led_matrix(led_eeconfig_t *led_matrix_config) __attribute__((nonnull));
+void eeconfig_update_led_matrix(const led_eeconfig_t *led_matrix_config) __attribute__((nonnull));
+#endif // LED_MATRIX_ENABLE
+
+#ifdef RGBLIGHT_ENABLE
+typedef union rgblight_config_t rgblight_config_t;
+void eeconfig_read_rgblight(rgblight_config_t *rgblight_config) __attribute__((nonnull));
+void eeconfig_update_rgblight(const rgblight_config_t *rgblight_config) __attribute__((nonnull));
+#endif // RGBLIGHT_ENABLE
#if (EECONFIG_KB_DATA_SIZE) == 0
uint32_t eeconfig_read_kb(void);
@@ -145,31 +126,36 @@ void eeconfig_update_user(uint32_t val);
#endif // (EECONFIG_USER_DATA_SIZE) == 0
#ifdef HAPTIC_ENABLE
-uint32_t eeconfig_read_haptic(void);
-void eeconfig_update_haptic(uint32_t val);
+typedef union haptic_config_t haptic_config_t;
+void eeconfig_read_haptic(haptic_config_t *haptic_config) __attribute__((nonnull));
+void eeconfig_update_haptic(const haptic_config_t *haptic_config) __attribute__((nonnull));
#endif
bool eeconfig_read_handedness(void);
void eeconfig_update_handedness(bool val);
#if (EECONFIG_KB_DATA_SIZE) > 0
-bool eeconfig_is_kb_datablock_valid(void);
-void eeconfig_read_kb_datablock(void *data);
-void eeconfig_update_kb_datablock(const void *data);
-void eeconfig_init_kb_datablock(void);
+bool eeconfig_is_kb_datablock_valid(void);
+uint32_t eeconfig_read_kb_datablock(void *data, uint32_t offset, uint32_t length) __attribute__((nonnull));
+uint32_t eeconfig_update_kb_datablock(const void *data, uint32_t offset, uint32_t length) __attribute__((nonnull));
+void eeconfig_init_kb_datablock(void);
+# define eeconfig_read_kb_datablock_field(__object, __field) eeconfig_read_kb_datablock(&(__object.__field), offsetof(typeof(__object), __field), sizeof(__object.__field))
+# define eeconfig_update_kb_datablock_field(__object, __field) eeconfig_update_kb_datablock(&(__object.__field), offsetof(typeof(__object), __field), sizeof(__object.__field))
#endif // (EECONFIG_KB_DATA_SIZE) > 0
#if (EECONFIG_USER_DATA_SIZE) > 0
-bool eeconfig_is_user_datablock_valid(void);
-void eeconfig_read_user_datablock(void *data);
-void eeconfig_update_user_datablock(const void *data);
-void eeconfig_init_user_datablock(void);
+bool eeconfig_is_user_datablock_valid(void);
+uint32_t eeconfig_read_user_datablock(void *data, uint32_t offset, uint32_t length) __attribute__((nonnull));
+uint32_t eeconfig_update_user_datablock(const void *data, uint32_t offset, uint32_t length) __attribute__((nonnull));
+void eeconfig_init_user_datablock(void);
+# define eeconfig_read_user_datablock_field(__object, __field) eeconfig_read_user_datablock(&(__object.__field), offsetof(__object, __field), sizeof(__object.__field))
+# define eeconfig_update_user_datablock_field(__object, __field) eeconfig_update_user_datablock(&(__object.__field), offsetof(__object, __field), sizeof(__object.__field))
#endif // (EECONFIG_USER_DATA_SIZE) > 0
// Any "checked" debounce variant used requires implementation of:
// -- bool eeconfig_check_valid_##name(void)
// -- void eeconfig_post_flush_##name(void)
-#define EECONFIG_DEBOUNCE_HELPER_CHECKED(name, offset, config) \
+#define EECONFIG_DEBOUNCE_HELPER_CHECKED(name, config) \
static uint8_t dirty_##name = false; \
\
bool eeconfig_check_valid_##name(void); \
@@ -178,13 +164,13 @@ void eeconfig_init_user_datablock(void);
static inline void eeconfig_init_##name(void) { \
dirty_##name = true; \
if (eeconfig_check_valid_##name()) { \
- eeprom_read_block(&config, offset, sizeof(config)); \
+ eeconfig_read_##name(&config); \
dirty_##name = false; \
} \
} \
static inline void eeconfig_flush_##name(bool force) { \
if (force || dirty_##name) { \
- eeprom_update_block(&config, offset, sizeof(config)); \
+ eeconfig_update_##name(&config); \
eeconfig_post_flush_##name(); \
dirty_##name = false; \
} \
@@ -206,10 +192,10 @@ void eeconfig_init_user_datablock(void);
} \
}
-#define EECONFIG_DEBOUNCE_HELPER(name, offset, config) \
- EECONFIG_DEBOUNCE_HELPER_CHECKED(name, offset, config) \
- \
- bool eeconfig_check_valid_##name(void) { \
- return true; \
- } \
+#define EECONFIG_DEBOUNCE_HELPER(name, config) \
+ EECONFIG_DEBOUNCE_HELPER_CHECKED(name, config) \
+ \
+ bool eeconfig_check_valid_##name(void) { \
+ return true; \
+ } \
void eeconfig_post_flush_##name(void) {}
diff --git a/quantum/haptic.c b/quantum/haptic.c
index 81bad469b3..8a743480ff 100644
--- a/quantum/haptic.c
+++ b/quantum/haptic.c
@@ -67,7 +67,7 @@ void haptic_init(void) {
if (!eeconfig_is_enabled()) {
eeconfig_init();
}
- haptic_config.raw = eeconfig_read_haptic();
+ eeconfig_read_haptic(&haptic_config);
#ifdef HAPTIC_SOLENOID
solenoid_set_dwell(haptic_config.dwell);
#endif
@@ -122,13 +122,13 @@ void eeconfig_debug_haptic(void) {
void haptic_enable(void) {
set_haptic_config_enable(true);
dprintf("haptic_config.enable = %u\n", haptic_config.enable);
- eeconfig_update_haptic(haptic_config.raw);
+ eeconfig_update_haptic(&haptic_config);
}
void haptic_disable(void) {
set_haptic_config_enable(false);
dprintf("haptic_config.enable = %u\n", haptic_config.enable);
- eeconfig_update_haptic(haptic_config.raw);
+ eeconfig_update_haptic(&haptic_config);
}
void haptic_toggle(void) {
@@ -137,14 +137,14 @@ void haptic_toggle(void) {
} else {
haptic_enable();
}
- eeconfig_update_haptic(haptic_config.raw);
+ eeconfig_update_haptic(&haptic_config);
}
void haptic_feedback_toggle(void) {
haptic_config.feedback++;
if (haptic_config.feedback >= HAPTIC_FEEDBACK_MAX) haptic_config.feedback = KEY_PRESS;
dprintf("haptic_config.feedback = %u\n", !haptic_config.feedback);
- eeconfig_update_haptic(haptic_config.raw);
+ eeconfig_update_haptic(&haptic_config);
}
void haptic_buzz_toggle(void) {
@@ -225,26 +225,26 @@ void haptic_reset(void) {
haptic_config.dwell = 0;
haptic_config.buzz = 0;
#endif
- eeconfig_update_haptic(haptic_config.raw);
+ eeconfig_update_haptic(&haptic_config);
dprintf("haptic_config.feedback = %u\n", haptic_config.feedback);
dprintf("haptic_config.mode = %u\n", haptic_config.mode);
}
void haptic_set_feedback(uint8_t feedback) {
haptic_config.feedback = feedback;
- eeconfig_update_haptic(haptic_config.raw);
+ eeconfig_update_haptic(&haptic_config);
dprintf("haptic_config.feedback = %u\n", haptic_config.feedback);
}
void haptic_set_mode(uint8_t mode) {
haptic_config.mode = mode;
- eeconfig_update_haptic(haptic_config.raw);
+ eeconfig_update_haptic(&haptic_config);
dprintf("haptic_config.mode = %u\n", haptic_config.mode);
}
void haptic_set_amplitude(uint8_t amp) {
haptic_config.amplitude = amp;
- eeconfig_update_haptic(haptic_config.raw);
+ eeconfig_update_haptic(&haptic_config);
dprintf("haptic_config.amplitude = %u\n", haptic_config.amplitude);
#ifdef HAPTIC_DRV2605L
drv2605l_amplitude(amp);
@@ -253,13 +253,13 @@ void haptic_set_amplitude(uint8_t amp) {
void haptic_set_buzz(uint8_t buzz) {
haptic_config.buzz = buzz;
- eeconfig_update_haptic(haptic_config.raw);
+ eeconfig_update_haptic(&haptic_config);
dprintf("haptic_config.buzz = %u\n", haptic_config.buzz);
}
void haptic_set_dwell(uint8_t dwell) {
haptic_config.dwell = dwell;
- eeconfig_update_haptic(haptic_config.raw);
+ eeconfig_update_haptic(&haptic_config);
dprintf("haptic_config.dwell = %u\n", haptic_config.dwell);
}
@@ -291,7 +291,7 @@ uint8_t haptic_get_dwell(void) {
void haptic_enable_continuous(void) {
haptic_config.cont = 1;
dprintf("haptic_config.cont = %u\n", haptic_config.cont);
- eeconfig_update_haptic(haptic_config.raw);
+ eeconfig_update_haptic(&haptic_config);
#ifdef HAPTIC_DRV2605L
drv2605l_rtp_init();
#endif
@@ -300,7 +300,7 @@ void haptic_enable_continuous(void) {
void haptic_disable_continuous(void) {
haptic_config.cont = 0;
dprintf("haptic_config.cont = %u\n", haptic_config.cont);
- eeconfig_update_haptic(haptic_config.raw);
+ eeconfig_update_haptic(&haptic_config);
#ifdef HAPTIC_DRV2605L
drv2605l_write(DRV2605L_REG_MODE, 0x00);
#endif
diff --git a/quantum/haptic.h b/quantum/haptic.h
index b283d5d268..e27f546d40 100644
--- a/quantum/haptic.h
+++ b/quantum/haptic.h
@@ -28,7 +28,7 @@
#endif
/* EEPROM config settings */
-typedef union {
+typedef union haptic_config_t {
uint32_t raw;
struct {
bool enable : 1;
diff --git a/quantum/keyboard.c b/quantum/keyboard.c
index ad740de4b3..0671b0461f 100644
--- a/quantum/keyboard.c
+++ b/quantum/keyboard.c
@@ -122,6 +122,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#ifdef SPLIT_KEYBOARD
# include "split_util.h"
#endif
+#ifdef BATTERY_DRIVER
+# include "battery.h"
+#endif
#ifdef BLUETOOTH_ENABLE
# include "bluetooth.h"
#endif
@@ -429,8 +432,8 @@ void quantum_init(void) {
}
/* init globals */
- debug_config.raw = eeconfig_read_debug();
- keymap_config.raw = eeconfig_read_keymap();
+ eeconfig_read_debug(&debug_config);
+ eeconfig_read_keymap(&keymap_config);
#ifdef BOOTMAGIC_ENABLE
bootmagic();
@@ -501,7 +504,7 @@ void keyboard_init(void) {
#endif
#if defined(NKRO_ENABLE) && defined(FORCE_NKRO)
keymap_config.nkro = 1;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
#endif
#ifdef DIP_SWITCH_ENABLE
dip_switch_init();
@@ -522,6 +525,9 @@ void keyboard_init(void) {
// init after split init
pointing_device_init();
#endif
+#ifdef BATTERY_DRIVER
+ battery_init();
+#endif
#ifdef BLUETOOTH_ENABLE
bluetooth_init();
#endif
@@ -782,6 +788,10 @@ void keyboard_task(void) {
joystick_task();
#endif
+#ifdef BATTERY_DRIVER
+ battery_task();
+#endif
+
#ifdef BLUETOOTH_ENABLE
bluetooth_task();
#endif
diff --git a/quantum/keycode_config.h b/quantum/keycode_config.h
index d1352c302e..529cd0e127 100644
--- a/quantum/keycode_config.h
+++ b/quantum/keycode_config.h
@@ -28,7 +28,7 @@ uint16_t keycode_config(uint16_t keycode);
uint8_t mod_config(uint8_t mod);
/* NOTE: Not portable. Bit field order depends on implementation */
-typedef union {
+typedef union keymap_config_t {
uint16_t raw;
struct {
bool swap_control_capslock : 1;
diff --git a/quantum/keycode_string.c b/quantum/keycode_string.c
new file mode 100644
index 0000000000..18044f2ef6
--- /dev/null
+++ b/quantum/keycode_string.c
@@ -0,0 +1,564 @@
+// Copyright 2024-2025 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "keycode_string.h"
+
+#include <string.h>
+#include "bitwise.h"
+#include "keycode.h"
+#include "progmem.h"
+#include "quantum_keycodes.h"
+#include "util.h"
+
+typedef int_fast8_t index_t;
+
+// clang-format off
+/** Packs a 7-char keycode name, ignoring the third char, as 3 words. */
+#define KEYCODE_NAME7(c0, c1, unused_c2, c3, c4, c5, c6) \
+ ((uint16_t)c0) | (((uint16_t)c1) << 8), \
+ ((uint16_t)c3) | (((uint16_t)c4) << 8), \
+ ((uint16_t)c5) | (((uint16_t)c6) << 8)
+
+/**
+ * @brief Names of some common keycodes.
+ *
+ * Each (keycode, name) entry is stored flat in 8 bytes in PROGMEM. Names in
+ * this table must be at most 7 chars long and have an underscore '_' for the
+ * third char. This underscore is assumed and not actually stored.
+ *
+ * To save memory, feature-specific key entries are ifdef'd to include them only
+ * when their feature is enabled.
+ */
+static const uint16_t common_names[] PROGMEM = {
+ KC_TRNS, KEYCODE_NAME7('K', 'C', '_', 'T', 'R', 'N', 'S'),
+ KC_ENT , KEYCODE_NAME7('K', 'C', '_', 'E', 'N', 'T', 0 ),
+ KC_ESC , KEYCODE_NAME7('K', 'C', '_', 'E', 'S', 'C', 0 ),
+ KC_BSPC, KEYCODE_NAME7('K', 'C', '_', 'B', 'S', 'P', 'C'),
+ KC_TAB , KEYCODE_NAME7('K', 'C', '_', 'T', 'A', 'B', 0 ),
+ KC_SPC , KEYCODE_NAME7('K', 'C', '_', 'S', 'P', 'C', 0 ),
+ KC_MINS, KEYCODE_NAME7('K', 'C', '_', 'M', 'I', 'N', 'S'),
+ KC_EQL , KEYCODE_NAME7('K', 'C', '_', 'E', 'Q', 'L', 0 ),
+ KC_LBRC, KEYCODE_NAME7('K', 'C', '_', 'L', 'B', 'R', 'C'),
+ KC_RBRC, KEYCODE_NAME7('K', 'C', '_', 'R', 'B', 'R', 'C'),
+ KC_BSLS, KEYCODE_NAME7('K', 'C', '_', 'B', 'S', 'L', 'S'),
+ KC_NUHS, KEYCODE_NAME7('K', 'C', '_', 'N', 'U', 'H', 'S'),
+ KC_SCLN, KEYCODE_NAME7('K', 'C', '_', 'S', 'C', 'L', 'N'),
+ KC_QUOT, KEYCODE_NAME7('K', 'C', '_', 'Q', 'U', 'O', 'T'),
+ KC_GRV , KEYCODE_NAME7('K', 'C', '_', 'G', 'R', 'V', 0 ),
+ KC_COMM, KEYCODE_NAME7('K', 'C', '_', 'C', 'O', 'M', 'M'),
+ KC_DOT , KEYCODE_NAME7('K', 'C', '_', 'D', 'O', 'T', 0 ),
+ KC_SLSH, KEYCODE_NAME7('K', 'C', '_', 'S', 'L', 'S', 'H'),
+ KC_CAPS, KEYCODE_NAME7('K', 'C', '_', 'C', 'A', 'P', 'S'),
+ KC_PSCR, KEYCODE_NAME7('K', 'C', '_', 'P', 'S', 'C', 'R'),
+ KC_PAUS, KEYCODE_NAME7('K', 'C', '_', 'P', 'A', 'U', 'S'),
+ KC_INS , KEYCODE_NAME7('K', 'C', '_', 'I', 'N', 'S', 0 ),
+ KC_HOME, KEYCODE_NAME7('K', 'C', '_', 'H', 'O', 'M', 'E'),
+ KC_PGUP, KEYCODE_NAME7('K', 'C', '_', 'P', 'G', 'U', 'P'),
+ KC_DEL , KEYCODE_NAME7('K', 'C', '_', 'D', 'E', 'L', 0 ),
+ KC_END , KEYCODE_NAME7('K', 'C', '_', 'E', 'N', 'D', 0 ),
+ KC_PGDN, KEYCODE_NAME7('K', 'C', '_', 'P', 'G', 'D', 'N'),
+ KC_RGHT, KEYCODE_NAME7('K', 'C', '_', 'R', 'G', 'H', 'T'),
+ KC_LEFT, KEYCODE_NAME7('K', 'C', '_', 'L', 'E', 'F', 'T'),
+ KC_DOWN, KEYCODE_NAME7('K', 'C', '_', 'D', 'O', 'W', 'N'),
+ KC_UP , KEYCODE_NAME7('K', 'C', '_', 'U', 'P', 0 , 0 ),
+ KC_NUBS, KEYCODE_NAME7('K', 'C', '_', 'N', 'U', 'B', 'S'),
+ KC_HYPR, KEYCODE_NAME7('K', 'C', '_', 'H', 'Y', 'P', 'R'),
+ KC_MEH , KEYCODE_NAME7('K', 'C', '_', 'M', 'E', 'H', 0 ),
+#ifdef EXTRAKEY_ENABLE
+ KC_WHOM, KEYCODE_NAME7('K', 'C', '_', 'W', 'H', 'O', 'M'),
+ KC_WBAK, KEYCODE_NAME7('K', 'C', '_', 'W', 'B', 'A', 'K'),
+ KC_WFWD, KEYCODE_NAME7('K', 'C', '_', 'W', 'F', 'W', 'D'),
+ KC_WSTP, KEYCODE_NAME7('K', 'C', '_', 'W', 'S', 'T', 'P'),
+ KC_WREF, KEYCODE_NAME7('K', 'C', '_', 'W', 'R', 'E', 'F'),
+ KC_MNXT, KEYCODE_NAME7('K', 'C', '_', 'M', 'N', 'X', 'T'),
+ KC_MPRV, KEYCODE_NAME7('K', 'C', '_', 'M', 'P', 'R', 'V'),
+ KC_MPLY, KEYCODE_NAME7('K', 'C', '_', 'M', 'P', 'L', 'Y'),
+ KC_MUTE, KEYCODE_NAME7('K', 'C', '_', 'M', 'U', 'T', 'E'),
+ KC_VOLU, KEYCODE_NAME7('K', 'C', '_', 'V', 'O', 'L', 'U'),
+ KC_VOLD, KEYCODE_NAME7('K', 'C', '_', 'V', 'O', 'L', 'D'),
+#endif // EXTRAKEY_ENABLE
+#ifdef MOUSEKEY_ENABLE
+ MS_LEFT, KEYCODE_NAME7('M', 'S', '_', 'L', 'E', 'F', 'T'),
+ MS_RGHT, KEYCODE_NAME7('M', 'S', '_', 'R', 'G', 'H', 'T'),
+ MS_UP , KEYCODE_NAME7('M', 'S', '_', 'U', 'P', 0 , 0 ),
+ MS_DOWN, KEYCODE_NAME7('M', 'S', '_', 'D', 'O', 'W', 'N'),
+ MS_WHLL, KEYCODE_NAME7('M', 'S', '_', 'W', 'H', 'L', 'L'),
+ MS_WHLR, KEYCODE_NAME7('M', 'S', '_', 'W', 'H', 'L', 'R'),
+ MS_WHLU, KEYCODE_NAME7('M', 'S', '_', 'W', 'H', 'L', 'U'),
+ MS_WHLD, KEYCODE_NAME7('M', 'S', '_', 'W', 'H', 'L', 'D'),
+#endif // MOUSEKEY_ENABLE
+#ifdef SWAP_HANDS_ENABLE
+ SH_ON , KEYCODE_NAME7('S', 'H', '_', 'O', 'N', 0 , 0 ),
+ SH_OFF , KEYCODE_NAME7('S', 'H', '_', 'O', 'F', 'F', 0 ),
+ SH_MON , KEYCODE_NAME7('S', 'H', '_', 'M', 'O', 'N', 0 ),
+ SH_MOFF, KEYCODE_NAME7('S', 'H', '_', 'M', 'O', 'F', 'F'),
+ SH_TOGG, KEYCODE_NAME7('S', 'H', '_', 'T', 'O', 'G', 'G'),
+ SH_TT , KEYCODE_NAME7('S', 'H', '_', 'T', 'T', 0 , 0 ),
+# if !defined(NO_ACTION_ONESHOT)
+ SH_OS , KEYCODE_NAME7('S', 'H', '_', 'O', 'S', 0 , 0 ),
+# endif // !defined(NO_ACTION_ONESHOT)
+#endif // SWAP_HANDS_ENABLE
+#ifdef LEADER_ENABLE
+ QK_LEAD, KEYCODE_NAME7('Q', 'K', '_', 'L', 'E', 'A', 'D'),
+#endif // LEADER_ENABLE
+#ifdef KEY_LOCK_ENABLE
+ QK_LOCK, KEYCODE_NAME7('Q', 'K', '_', 'L', 'O', 'C', 'K'),
+#endif // KEY_LOCK_ENABLE
+#ifdef TRI_LAYER_ENABLE
+ TL_LOWR, KEYCODE_NAME7('T', 'L', '_', 'L', 'O', 'W', 'R'),
+ TL_UPPR, KEYCODE_NAME7('T', 'L', '_', 'U', 'P', 'P', 'R'),
+#endif // TRI_LAYER_ENABLE
+#ifdef GRAVE_ESC_ENABLE
+ QK_GESC, KEYCODE_NAME7('Q', 'K', '_', 'G', 'E', 'S', 'C'),
+#endif // GRAVE_ESC_ENABLE
+#ifdef CAPS_WORD_ENABLE
+ CW_TOGG, KEYCODE_NAME7('C', 'W', '_', 'T', 'O', 'G', 'G'),
+#endif // CAPS_WORD_ENABLE
+#ifdef SECURE_ENABLE
+ SE_LOCK, KEYCODE_NAME7('S', 'E', '_', 'L', 'O', 'C', 'K'),
+ SE_UNLK, KEYCODE_NAME7('S', 'E', '_', 'U', 'N', 'L', 'K'),
+ SE_TOGG, KEYCODE_NAME7('S', 'E', '_', 'T', 'O', 'G', 'G'),
+ SE_REQ , KEYCODE_NAME7('S', 'E', '_', 'R', 'E', 'Q', 0 ),
+#endif // SECURE_ENABLE
+#ifdef LAYER_LOCK_ENABLE
+ QK_LLCK, KEYCODE_NAME7('Q', 'K', '_', 'L', 'L', 'C', 'K'),
+#endif // LAYER_LOCK_ENABLE
+ EE_CLR , KEYCODE_NAME7('E', 'E', '_', 'C', 'L', 'R', 0 ),
+ QK_BOOT, KEYCODE_NAME7('Q', 'K', '_', 'B', 'O', 'O', 'T'),
+ DB_TOGG, KEYCODE_NAME7('D', 'B', '_', 'T', 'O', 'G', 'G'),
+};
+// clang-format on
+
+/** Users can override this to define names of additional keycodes. */
+__attribute__((weak)) const keycode_string_name_t* keycode_string_names_data_user = NULL;
+__attribute__((weak)) uint16_t keycode_string_names_size_user = 0;
+/** Keyboard vendors can override this to define names of additional keycodes. */
+__attribute__((weak)) const keycode_string_name_t* keycode_string_names_data_kb = NULL;
+__attribute__((weak)) uint16_t keycode_string_names_size_kb = 0;
+/** Names of the 4 mods on each hand. */
+static const char mod_names[] PROGMEM = "CTL\0SFT\0ALT\0GUI";
+/** Internal buffer for holding a stringified keycode. */
+static char buffer[32];
+#define BUFFER_MAX_LEN (sizeof(buffer) - 1)
+static index_t buffer_len;
+
+/** Finds the name of a keycode in `common_names` or returns NULL. */
+static const char* search_common_names(uint16_t keycode) {
+ static uint8_t buffer[8];
+
+ for (int_fast16_t offset = 0; offset < ARRAY_SIZE(common_names); offset += 4) {
+ if (keycode == pgm_read_word(common_names + offset)) {
+ const uint16_t w0 = pgm_read_word(common_names + offset + 1);
+ const uint16_t w1 = pgm_read_word(common_names + offset + 2);
+ const uint16_t w2 = pgm_read_word(common_names + offset + 3);
+ buffer[0] = (uint8_t)w0;
+ buffer[1] = (uint8_t)(w0 >> 8);
+ buffer[2] = '_';
+ buffer[3] = (uint8_t)w1;
+ buffer[4] = (uint8_t)(w1 >> 8);
+ buffer[5] = (uint8_t)w2;
+ buffer[6] = (uint8_t)(w2 >> 8);
+ buffer[7] = 0;
+ return (const char*)buffer;
+ }
+ }
+
+ return NULL;
+}
+
+/**
+ * @brief Finds the name of a keycode in table or returns NULL.
+ *
+ * @param data Pointer to table to be searched.
+ * @param size Numer of entries in the table.
+ * @return Name string for the keycode, or NULL if not found.
+ */
+static const char* search_table(const keycode_string_name_t* data, uint16_t size, uint16_t keycode) {
+ if (data != NULL) {
+ for (uint16_t i = 0; i < size; ++i) {
+ if (data[i].keycode == keycode) {
+ return data[i].name;
+ }
+ }
+ }
+ return NULL;
+}
+
+/** Formats `number` in `base`, either 10 or 16. */
+static char* number_string(uint16_t number, int8_t base) {
+ static char result[7];
+ result[sizeof(result) - 1] = '\0';
+ index_t i = sizeof(result) - 1;
+ do {
+ const uint8_t digit = number % base;
+ number /= base;
+ result[--i] = (digit < 10) ? (char)(digit + UINT8_C('0')) : (char)(digit + (UINT8_C('A') - 10));
+ } while (number > 0 && i > 0);
+
+ if (base == 16 && i >= 2) {
+ result[--i] = 'x';
+ result[--i] = '0';
+ }
+ return result + i;
+}
+
+/** Appends `str` to `buffer`, truncating if the result would overflow. */
+static void append(const char* str) {
+ char* dest = buffer + buffer_len;
+ index_t i;
+ for (i = 0; buffer_len + i < BUFFER_MAX_LEN && str[i]; ++i) {
+ dest[i] = str[i];
+ }
+ buffer_len += i;
+ buffer[buffer_len] = '\0';
+}
+
+/** Same as append(), but where `str` is a PROGMEM string. */
+static void append_P(const char* str) {
+ char* dest = buffer + buffer_len;
+ index_t i;
+ for (i = 0; buffer_len + i < BUFFER_MAX_LEN; ++i) {
+ const char c = pgm_read_byte(&str[i]);
+ if (c == '\0') {
+ break;
+ }
+ dest[i] = c;
+ }
+ buffer_len += i;
+ buffer[buffer_len] = '\0';
+}
+
+/** Appends a single char to `buffer` if there is space. */
+static void append_char(char c) {
+ if (buffer_len < BUFFER_MAX_LEN) {
+ buffer[buffer_len] = c;
+ buffer[++buffer_len] = '\0';
+ }
+}
+
+/** Formats `number` in `base`, either 10 or 16, and appends it to `buffer`. */
+static void append_number(uint16_t number, int8_t base) {
+ append(number_string(number, base));
+}
+
+/** Stringifies 5-bit mods and appends it to `buffer`. */
+static void append_5_bit_mods(uint8_t mods) {
+ const bool is_rhs = mods > 15;
+ const uint8_t csag = mods & 15;
+ if (csag != 0 && (csag & (csag - 1)) == 0) { // One mod is set.
+ append_P(PSTR("MOD_"));
+ append_char(is_rhs ? 'R' : 'L');
+ append_P(&mod_names[4 * biton(csag)]);
+ } else { // Fallback: write the mod as a hex value.
+ append_number(mods, 16);
+ }
+}
+
+/**
+ * @brief Writes a keycode of the format `name` + "(" + `param` + ")".
+ * @note `name` is a PROGMEM string, `param` is not.
+ */
+static void append_unary_keycode(const char* name, const char* param) {
+ append_P(name);
+ append_char('(');
+ append(param);
+ append_char(')');
+}
+
+/**
+ * @brief Writes a keycode of the format `name` + `number`.
+ * @note `name` is a PROGMEM string.
+ */
+static void append_numbered_keycode(const char* name, uint16_t number) {
+ append_P(name);
+ append_number(number, 10);
+}
+
+/** Stringifies `keycode` and appends it to `buffer`. */
+static void append_keycode(uint16_t keycode) {
+ // In case there is overlap among tables, search `keycode_string_names_user`
+ // first so that it takes precedence.
+ const char* keycode_name = search_table(keycode_string_names_data_user, keycode_string_names_size_user, keycode);
+ if (keycode_name) {
+ append(keycode_name);
+ return;
+ }
+ keycode_name = search_table(keycode_string_names_data_kb, keycode_string_names_size_kb, keycode);
+ if (keycode_name) {
+ append(keycode_name);
+ return;
+ }
+ keycode_name = search_common_names(keycode);
+ if (keycode_name) {
+ append(keycode_name);
+ return;
+ }
+
+ if (keycode <= 255) { // Basic keycodes.
+ switch (keycode) {
+ // Modifiers KC_LSFT, KC_RCTL, etc.
+ case MODIFIER_KEYCODE_RANGE: {
+ const uint8_t i = keycode - KC_LCTL;
+ const bool is_rhs = i > 3;
+ append_P(PSTR("KC_"));
+ append_char(is_rhs ? 'R' : 'L');
+ append_P(&mod_names[4 * (i & 3)]);
+ }
+ return;
+
+ // Letters A-Z.
+ case KC_A ... KC_Z:
+ append_P(PSTR("KC_"));
+ append_char((char)(keycode + (UINT8_C('A') - KC_A)));
+ return;
+
+ // Digits 0-9 (NOTE: Unlike the ASCII order, KC_0 comes *after* KC_9.)
+ case KC_1 ... KC_0:
+ append_numbered_keycode(PSTR("KC_"), (keycode - (KC_1 - 1)) % 10);
+ return;
+
+ // Keypad digits.
+ case KC_KP_1 ... KC_KP_0:
+ append_numbered_keycode(PSTR("KC_KP_"), (keycode - (KC_KP_1 - 1)) % 10);
+ return;
+
+ // Function keys. F1-F12 and F13-F24 are coded in separate ranges.
+ case KC_F1 ... KC_F12:
+ append_numbered_keycode(PSTR("KC_F"), keycode - (KC_F1 - 1));
+ return;
+
+ case KC_F13 ... KC_F24:
+ append_numbered_keycode(PSTR("KC_F"), keycode - (KC_F13 - 13));
+ return;
+ }
+ }
+
+ // clang-format off
+ switch (keycode) {
+ // A modified keycode, like S(KC_1) for Shift + 1 = !. This implementation
+ // only covers modified keycodes where one modifier is applied, e.g. a
+ // Ctrl + Shift + kc or Hyper + kc keycode is not formatted.
+ case QK_MODS ... QK_MODS_MAX: {
+ uint8_t mods = QK_MODS_GET_MODS(keycode);
+ const bool is_rhs = mods > 15;
+ mods &= 15;
+ if (mods != 0 && (mods & (mods - 1)) == 0) { // One mod is set.
+ const char* name = &mod_names[4 * biton(mods)];
+ if (is_rhs) {
+ append_char('R');
+ append_P(name);
+ } else {
+ append_char(pgm_read_byte(&name[0]));
+ }
+ append_char('(');
+ append_keycode(QK_MODS_GET_BASIC_KEYCODE(keycode));
+ append_char(')');
+ return;
+ }
+ } break;
+
+#if !defined(NO_ACTION_ONESHOT)
+ case QK_ONE_SHOT_MOD ... QK_ONE_SHOT_MOD_MAX: // One-shot mod OSM(mod) key.
+ append_P(PSTR("OSM("));
+ append_5_bit_mods(QK_ONE_SHOT_MOD_GET_MODS(keycode));
+ append_char(')');
+ return;
+#endif // !defined(NO_ACTION_ONESHOT)
+
+ // Various layer switch keys.
+ case QK_LAYER_TAP ... QK_LAYER_TAP_MAX: // Layer-tap LT(layer,kc) key.
+ append_P(PSTR("LT("));
+ append_number(QK_LAYER_TAP_GET_LAYER(keycode), 10);
+ append_char(',');
+ append_keycode(QK_LAYER_TAP_GET_TAP_KEYCODE(keycode));
+ append_char(')');
+ return;
+
+ case QK_LAYER_MOD ... QK_LAYER_MOD_MAX: // LM(layer,mod) key.
+ append_P(PSTR("LM("));
+ append_number(QK_LAYER_MOD_GET_LAYER(keycode), 10);
+ append_char(',');
+ append_5_bit_mods(QK_LAYER_MOD_GET_MODS(keycode));
+ append_char(')');
+ return;
+
+ case QK_TO ... QK_TO_MAX: // TO(layer) key.
+ append_unary_keycode(PSTR("TO"), number_string(QK_TO_GET_LAYER(keycode), 10));
+ return;
+
+ case QK_MOMENTARY ... QK_MOMENTARY_MAX: // MO(layer) key.
+ append_unary_keycode(PSTR("MO"), number_string(QK_MOMENTARY_GET_LAYER(keycode), 10));
+ return;
+
+ case QK_DEF_LAYER ... QK_DEF_LAYER_MAX: // DF(layer) key.
+ append_unary_keycode(PSTR("DF"), number_string(QK_DEF_LAYER_GET_LAYER(keycode), 10));
+ return;
+
+ case QK_TOGGLE_LAYER ... QK_TOGGLE_LAYER_MAX: // TG(layer) key.
+ append_unary_keycode(PSTR("TG"), number_string(QK_TOGGLE_LAYER_GET_LAYER(keycode), 10));
+ return;
+
+#if !defined(NO_ACTION_ONESHOT)
+ case QK_ONE_SHOT_LAYER ... QK_ONE_SHOT_LAYER_MAX: // OSL(layer) key.
+ append_unary_keycode(PSTR("OSL"), number_string(QK_ONE_SHOT_LAYER_GET_LAYER(keycode), 10));
+ return;
+#endif // !defined(NO_ACTION_ONESHOT)
+
+ case QK_LAYER_TAP_TOGGLE ... QK_LAYER_TAP_TOGGLE_MAX: // TT(layer) key.
+ append_unary_keycode(PSTR("TT"), number_string(QK_LAYER_TAP_TOGGLE_GET_LAYER(keycode), 10));
+ return;
+
+ case QK_PERSISTENT_DEF_LAYER ... QK_PERSISTENT_DEF_LAYER_MAX: // PDF(layer) key.
+ append_unary_keycode(PSTR("PDF"), number_string(QK_PERSISTENT_DEF_LAYER_GET_LAYER(keycode), 10));
+ return;
+
+ // Mod-tap MT(mod,kc) key. This implementation formats the MT keys where
+ // one modifier is applied. For MT keys with multiple modifiers, the mod
+ // arg is written numerically as a hex code.
+ case QK_MOD_TAP ... QK_MOD_TAP_MAX: {
+ uint8_t mods = QK_MOD_TAP_GET_MODS(keycode);
+ const bool is_rhs = mods > 15;
+ const uint8_t csag = mods & 15;
+ if (csag != 0 && (csag & (csag - 1)) == 0) { // One mod is set.
+ append_char(is_rhs ? 'R' : 'L');
+ append_P(&mod_names[4 * biton(csag)]);
+ append_P(PSTR("_T("));
+ } else if (mods == MOD_HYPR) {
+ append_P(PSTR("HYPR_T("));
+ } else if (mods == MOD_MEH) {
+ append_P(PSTR("MEH_T("));
+ } else {
+ append_P(PSTR("MT("));
+ append_number(mods, 16);
+ append_char(',');
+ }
+ append_keycode(QK_MOD_TAP_GET_TAP_KEYCODE(keycode));
+ append_char(')');
+ } return;
+
+ case QK_TAP_DANCE ... QK_TAP_DANCE_MAX: // Tap dance TD(i) key.
+ append_unary_keycode(PSTR("TD"), number_string(QK_TAP_DANCE_GET_INDEX(keycode), 10));
+ return;
+
+#ifdef UNICODE_ENABLE
+ case QK_UNICODE ... QK_UNICODE_MAX: // Unicode UC(codepoint) key.
+ append_unary_keycode(PSTR("UC"), number_string(QK_UNICODE_GET_CODE_POINT(keycode), 16));
+ return;
+#elif defined(UNICODEMAP_ENABLE)
+ case QK_UNICODEMAP ... QK_UNICODEMAP_MAX: // Unicode Map UM(i) key.
+ append_unary_keycode(PSTR("UM"), number_string(QK_UNICODEMAP_GET_INDEX(keycode), 10));
+ return;
+
+ case QK_UNICODEMAP_PAIR ... QK_UNICODEMAP_PAIR_MAX: { // UP(i,j) key.
+ const uint8_t i = QK_UNICODEMAP_PAIR_GET_UNSHIFTED_INDEX(keycode);
+ const uint8_t j = QK_UNICODEMAP_PAIR_GET_SHIFTED_INDEX(keycode);
+ append_P(PSTR("UP("));
+ append_number(i, 10);
+ append_char(',');
+ append_number(j, 10);
+ append_char(')');
+ } return;
+#endif
+#ifdef MOUSEKEY_ENABLE
+ case MS_BTN1 ... MS_BTN8: // Mouse button keycode.
+ append_numbered_keycode(PSTR("MS_BTN"), keycode - (MS_BTN1 - 1));
+ return;
+#endif // MOUSEKEY_ENABLE
+#ifdef SWAP_HANDS_ENABLE
+ case QK_SWAP_HANDS ... QK_SWAP_HANDS_MAX: // Swap Hands SH_T(kc) key.
+ if (!IS_SWAP_HANDS_KEYCODE(keycode)) {
+ append_P(PSTR("SH_T("));
+ append_keycode(QK_SWAP_HANDS_GET_TAP_KEYCODE(keycode));
+ append_char(')');
+ return;
+ }
+ break;
+#endif // SWAP_HANDS_ENABLE
+#ifdef JOYSTICK_ENABLE
+ case JOYSTICK_KEYCODE_RANGE: // Joystick JS_ key.
+ append_numbered_keycode(PSTR("JS_"), keycode - JS_0);
+ return;
+#endif // JOYSTICK_ENABLE
+#ifdef PROGRAMMABLE_BUTTON_ENABLE
+ case PROGRAMMABLE_BUTTON_KEYCODE_RANGE: // Programmable button PB_ key.
+ append_numbered_keycode(PSTR("PB_"), keycode - (PB_1 - 1));
+ return;
+#endif // PROGRAMMABLE_BUTTON_ENABLE
+
+ case MACRO_KEYCODE_RANGE: // Macro range MC_ keycode.
+ append_numbered_keycode(PSTR("MC_"), keycode - MC_0);
+ return;
+
+ case KB_KEYCODE_RANGE: // Keyboard range keycode.
+ append_numbered_keycode(PSTR("QK_KB_"), keycode - QK_KB_0);
+ return;
+
+ case USER_KEYCODE_RANGE: // User range keycode.
+ append_numbered_keycode(PSTR("QK_USER_"), keycode - QK_USER_0);
+ return;
+
+ // It would take a nontrivial amount of string data to cover some
+ // feature-specific keycodes, such as those for MIDI and lighting. As a
+ // fallback while still providing some information, we stringify
+ // remaining keys in known code ranges as "QK_<feature>+<number>".
+#ifdef MAGIC_ENABLE
+ case MAGIC_KEYCODE_RANGE:
+ append_numbered_keycode(PSTR("QK_MAGIC+"), keycode - QK_MAGIC);
+ return;
+#endif // MAGIC_ENABLE
+#ifdef MIDI_ENABLE
+ case MIDI_KEYCODE_RANGE:
+ append_numbered_keycode(PSTR("QK_MIDI+"), keycode - QK_MIDI);
+ return;
+#endif // MIDI_ENABLE
+#ifdef SEQUENCER_ENABLE
+ case SEQUENCER_KEYCODE_RANGE:
+ append_numbered_keycode(PSTR("QK_SEQUENCER+"), keycode - QK_SEQUENCER);
+ return;
+#endif // SEQUENCER_ENABLE
+#ifdef AUDIO_ENABLE
+ case AUDIO_KEYCODE_RANGE:
+ append_numbered_keycode(PSTR("QK_AUDIO+"), keycode - QK_AUDIO);
+ return;
+#endif // AUDIO_ENABLE
+#if defined(BACKLIGHT_ENABLE) || defined(LED_MATRIX_ENABLE) || defined(RGBLIGHT_ENABLED) || defined(RGB_MATRIX_ENABLE) // Lighting-related features.
+ case QK_LIGHTING ... QK_LIGHTING_MAX:
+ append_numbered_keycode(PSTR("QK_LIGHTING+"), keycode - QK_LIGHTING);
+ return;
+#endif // defined(BACKLIGHT_ENABLE) || defined(LED_MATRIX_ENABLE) || defined(RGBLIGHT_ENABLED) || defined(RGB_MATRIX_ENABLE)
+#ifdef STENO_ENABLE
+ case STENO_KEYCODE_RANGE:
+ append_numbered_keycode(PSTR("QK_STENO+"), keycode - QK_STENO);
+ return;
+#endif // AUDIO_ENABLE
+#ifdef BLUETOOTH_ENABLE
+ case CONNECTION_KEYCODE_RANGE:
+ append_numbered_keycode(PSTR("QK_CONNECTION+"), keycode - QK_CONNECTION);
+ return;
+#endif // BLUETOOTH_ENABLE
+ case QUANTUM_KEYCODE_RANGE:
+ append_numbered_keycode(PSTR("QK_QUANTUM+"), keycode - QK_QUANTUM);
+ return;
+ }
+ // clang-format on
+
+ append_number(keycode, 16); // Fallback: write keycode as hex value.
+}
+
+const char* get_keycode_string(uint16_t keycode) {
+ buffer_len = 0;
+ buffer[0] = '\0';
+ append_keycode(keycode);
+ return buffer;
+}
diff --git a/quantum/keycode_string.h b/quantum/keycode_string.h
new file mode 100644
index 0000000000..1315613a80
--- /dev/null
+++ b/quantum/keycode_string.h
@@ -0,0 +1,134 @@
+// Copyright 2024-2025 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+
+#include <stdint.h>
+
+#if KEYCODE_STRING_ENABLE
+
+/**
+ * @brief Formats a QMK keycode as a human-readable string.
+ *
+ * Given a keycode, like `KC_A`, this function returns a formatted string, like
+ * "KC_A". This is useful for debugging and diagnostics so that keys are more
+ * easily identified than they would be by raw numerical codes.
+ *
+ * @note The returned char* string should be used right away. The string memory
+ * is reused and will be overwritten by the next call to `keycode_string()`.
+ *
+ * Many common QMK keycodes are understood by this function, but not all.
+ * Recognized keycodes include:
+ *
+ * - Most basic keycodes, including letters `KC_A` - `KC_Z`, digits `KC_0` -
+ * `KC_9`, function keys `KC_F1` - `KC_F24`, and modifiers like `KC_LSFT`.
+ *
+ * - Modified basic keycodes, like `S(KC_1)` (Shift + 1 = !).
+ *
+ * - `MO`, `TO`, `TG`, `OSL`, `LM(layer,mod)`, `LT(layer,kc)` layer switches.
+ *
+ * - One-shot mod `OSM(mod)` keycodes.
+ *
+ * - Mod-tap `MT(mod, kc)` keycodes.
+ *
+ * - Tap dance keycodes `TD(i)`.
+ *
+ * - Swap hands keycodes `SH_T(kc)`, `SH_TOGG`, etc.
+ *
+ * - Joystick keycodes `JS_n`.
+ *
+ * - Programmable button keycodes `PB_n`.
+ *
+ * - Unicode `UC(codepoint)` and Unicode Map `UM(i)` and `UP(i,j)` keycodes.
+ *
+ * - Keyboard range keycodes `QK_KB_*`.
+ *
+ * - User range (SAFE_RANGE) keycodes `QK_USER_*`.
+ *
+ * Keycodes involving mods like `OSM`, `LM`, `MT` are fully supported only where
+ * a single mod is applied.
+ *
+ * Unrecognized keycodes are printed numerically as hex values like `0x1ABC`.
+ *
+ * Optionally, use `keycode_string_names_user` or `keycode_string_names_kb` to
+ * define names for additional keycodes or override how any of the above are
+ * formatted.
+ *
+ * @param keycode QMK keycode.
+ * @return Stringified keycode.
+ */
+const char* get_keycode_string(uint16_t keycode);
+
+/** Defines a human-readable name for a keycode. */
+typedef struct {
+ uint16_t keycode;
+ const char* name;
+} keycode_string_name_t;
+
+// clang-format off
+/**
+ * @brief Defines names for additional keycodes for `get_keycode_string()`.
+ *
+ * Define `KEYCODE_STRING_NAMES_USER` in your keymap.c to add names for
+ * additional keycodes to `keycode_string()`. This table may also be used to
+ * override how `keycode_string()` formats a keycode. For example, supposing
+ * keymap.c defines `MYMACRO1` and `MYMACRO2` as custom keycodes:
+ *
+ * KEYCODE_STRING_NAMES_USER(
+ * KEYCODE_STRING_NAME(MYMACRO1),
+ * KEYCODE_STRING_NAME(MYMACRO2),
+ * KEYCODE_STRING_NAME(KC_EXLM),
+ * );
+ *
+ * The above defines names for `MYMACRO1` and `MYMACRO2`, and overrides
+ * `KC_EXLM` to format as "KC_EXLM" instead of the default "S(KC_1)".
+ */
+# define KEYCODE_STRING_NAMES_USER(...) \
+ static const keycode_string_name_t keycode_string_names_user[] = {__VA_ARGS__}; \
+ uint16_t keycode_string_names_size_user = \
+ sizeof(keycode_string_names_user) / sizeof(keycode_string_name_t); \
+ const keycode_string_name_t* keycode_string_names_data_user = \
+ keycode_string_names_user
+
+/** Same as above, but defines keycode string names at the keyboard level. */
+# define KEYCODE_STRING_NAMES_KB(...) \
+ static const keycode_string_name_t keycode_string_names_kb[] = {__VA_ARGS__}; \
+ uint16_t keycode_string_names_size_kb = \
+ sizeof(keycode_string_names_kb) / sizeof(keycode_string_name_t); \
+ const keycode_string_name_t* keycode_string_names_data_kb = \
+ keycode_string_names_kb
+
+/** Helper to define a keycode_string_name_t. */
+# define KEYCODE_STRING_NAME(kc) \
+ { (kc), #kc }
+// clang-format on
+
+extern const keycode_string_name_t* keycode_string_names_data_user;
+extern uint16_t keycode_string_names_size_user;
+extern const keycode_string_name_t* keycode_string_names_data_kb;
+extern uint16_t keycode_string_names_size_kb;
+
+#else
+
+// When keycode_string is disabled, fall back to printing keycodes numerically
+// as decimal values, using get_u16_str() from quantum.c.
+# define get_keycode_string(kc) get_u16_str(kc, ' ')
+
+const char* get_u16_str(uint16_t curr_num, char curr_pad);
+
+# define KEYCODE_STRING_NAMES_USER(...)
+# define KEYCODE_STRING_NAMES_KB(...)
+# define KEYCODE_STRING_NAME(kc)
+
+#endif // KEYCODE_STRING_ENABLE
diff --git a/quantum/led_matrix/led_matrix.c b/quantum/led_matrix/led_matrix.c
index 58263c62e3..2e107a66e9 100644
--- a/quantum/led_matrix/led_matrix.c
+++ b/quantum/led_matrix/led_matrix.c
@@ -86,9 +86,9 @@ static last_hit_t last_hit_buffer;
const uint8_t k_led_matrix_split[2] = LED_MATRIX_SPLIT;
#endif
-EECONFIG_DEBOUNCE_HELPER(led_matrix, EECONFIG_LED_MATRIX, led_matrix_eeconfig);
+EECONFIG_DEBOUNCE_HELPER(led_matrix, led_matrix_eeconfig);
-void eeconfig_update_led_matrix(void) {
+void eeconfig_force_flush_led_matrix(void) {
eeconfig_flush_led_matrix(true);
}
diff --git a/quantum/led_matrix/led_matrix.h b/quantum/led_matrix/led_matrix.h
index a3468a2003..0006d487e9 100644
--- a/quantum/led_matrix/led_matrix.h
+++ b/quantum/led_matrix/led_matrix.h
@@ -115,7 +115,7 @@ enum led_matrix_effects {
};
void eeconfig_update_led_matrix_default(void);
-void eeconfig_update_led_matrix(void);
+void eeconfig_force_flush_led_matrix(void);
void eeconfig_debug_led_matrix(void);
uint8_t led_matrix_map_row_column_to_led_kb(uint8_t row, uint8_t column, uint8_t *led_i);
diff --git a/quantum/led_matrix/led_matrix_types.h b/quantum/led_matrix/led_matrix_types.h
index 5a516ceb10..810420f46f 100644
--- a/quantum/led_matrix/led_matrix_types.h
+++ b/quantum/led_matrix/led_matrix_types.h
@@ -71,7 +71,7 @@ typedef struct PACKED {
uint8_t flags[LED_MATRIX_LED_COUNT];
} led_config_t;
-typedef union {
+typedef union led_eeconfig_t {
uint32_t raw;
struct PACKED {
uint8_t enable : 2;
diff --git a/quantum/logging/debug.h b/quantum/logging/debug.h
index b0d9b9a10e..6675680ec7 100644
--- a/quantum/logging/debug.h
+++ b/quantum/logging/debug.h
@@ -28,7 +28,7 @@ extern "C" {
/*
* Debug output control
*/
-typedef union {
+typedef union debug_config_t {
struct {
bool enable : 1;
bool matrix : 1;
diff --git a/quantum/nvm/eeprom/nvm_dynamic_keymap.c b/quantum/nvm/eeprom/nvm_dynamic_keymap.c
new file mode 100644
index 0000000000..5f514acc1a
--- /dev/null
+++ b/quantum/nvm/eeprom/nvm_dynamic_keymap.c
@@ -0,0 +1,193 @@
+// Copyright 2024 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "keycodes.h"
+#include "eeprom.h"
+#include "dynamic_keymap.h"
+#include "nvm_dynamic_keymap.h"
+#include "nvm_eeprom_eeconfig_internal.h"
+#include "nvm_eeprom_via_internal.h"
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#ifdef ENCODER_ENABLE
+# include "encoder.h"
+#endif
+
+#ifdef VIA_ENABLE
+# include "via.h"
+# define DYNAMIC_KEYMAP_EEPROM_START (VIA_EEPROM_CONFIG_END)
+#else
+# define DYNAMIC_KEYMAP_EEPROM_START (EECONFIG_SIZE)
+#endif
+
+#ifndef DYNAMIC_KEYMAP_EEPROM_MAX_ADDR
+# define DYNAMIC_KEYMAP_EEPROM_MAX_ADDR (TOTAL_EEPROM_BYTE_COUNT - 1)
+#endif
+
+_Static_assert(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR <= (TOTAL_EEPROM_BYTE_COUNT - 1), "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR is configured to use more space than what is available for the selected EEPROM driver");
+
+// Due to usage of uint16_t check for max 65535
+_Static_assert(DYNAMIC_KEYMAP_EEPROM_MAX_ADDR <= 65535, "DYNAMIC_KEYMAP_EEPROM_MAX_ADDR must be less than 65536");
+
+// If DYNAMIC_KEYMAP_EEPROM_ADDR not explicitly defined in config.h,
+#ifndef DYNAMIC_KEYMAP_EEPROM_ADDR
+# define DYNAMIC_KEYMAP_EEPROM_ADDR DYNAMIC_KEYMAP_EEPROM_START
+#endif
+
+// Dynamic encoders starts after dynamic keymaps
+#ifndef DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR
+# define DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR (DYNAMIC_KEYMAP_EEPROM_ADDR + (DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2))
+#endif
+
+// Dynamic macro starts after dynamic encoders, but only when using ENCODER_MAP
+#ifdef ENCODER_MAP_ENABLE
+# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
+# define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR (DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR + (DYNAMIC_KEYMAP_LAYER_COUNT * NUM_ENCODERS * 2 * 2))
+# endif // DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
+#else // ENCODER_MAP_ENABLE
+# ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
+# define DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR (DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR)
+# endif // DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR
+#endif // ENCODER_MAP_ENABLE
+
+// Sanity check that dynamic keymaps fit in available EEPROM
+// If there's not 100 bytes available for macros, then something is wrong.
+// The keyboard should override DYNAMIC_KEYMAP_LAYER_COUNT to reduce it,
+// or DYNAMIC_KEYMAP_EEPROM_MAX_ADDR to increase it, *only if* the microcontroller has
+// more than the default.
+_Static_assert((DYNAMIC_KEYMAP_EEPROM_MAX_ADDR) - (DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR) >= 100, "Dynamic keymaps are configured to use more EEPROM than is available.");
+
+#ifndef TOTAL_EEPROM_BYTE_COUNT
+# error Unknown total EEPROM size. Cannot derive maximum for dynamic keymaps.
+#endif
+// Dynamic macros are stored after the keymaps and use what is available
+// up to and including DYNAMIC_KEYMAP_EEPROM_MAX_ADDR.
+#ifndef DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE
+# define DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE (DYNAMIC_KEYMAP_EEPROM_MAX_ADDR - DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + 1)
+#endif
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void nvm_dynamic_keymap_erase(void) {
+ // No-op, nvm_eeconfig_erase() will have already erased EEPROM if necessary.
+}
+
+void nvm_dynamic_keymap_macro_erase(void) {
+ // No-op, nvm_eeconfig_erase() will have already erased EEPROM if necessary.
+}
+
+static inline void *dynamic_keymap_key_to_eeprom_address(uint8_t layer, uint8_t row, uint8_t column) {
+ return ((void *)DYNAMIC_KEYMAP_EEPROM_ADDR) + (layer * MATRIX_ROWS * MATRIX_COLS * 2) + (row * MATRIX_COLS * 2) + (column * 2);
+}
+
+uint16_t nvm_dynamic_keymap_read_keycode(uint8_t layer, uint8_t row, uint8_t column) {
+ if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || row >= MATRIX_ROWS || column >= MATRIX_COLS) return KC_NO;
+ void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column);
+ // Big endian, so we can read/write EEPROM directly from host if we want
+ uint16_t keycode = eeprom_read_byte(address) << 8;
+ keycode |= eeprom_read_byte(address + 1);
+ return keycode;
+}
+
+void nvm_dynamic_keymap_update_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode) {
+ if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || row >= MATRIX_ROWS || column >= MATRIX_COLS) return;
+ void *address = dynamic_keymap_key_to_eeprom_address(layer, row, column);
+ // Big endian, so we can read/write EEPROM directly from host if we want
+ eeprom_update_byte(address, (uint8_t)(keycode >> 8));
+ eeprom_update_byte(address + 1, (uint8_t)(keycode & 0xFF));
+}
+
+#ifdef ENCODER_MAP_ENABLE
+static void *dynamic_keymap_encoder_to_eeprom_address(uint8_t layer, uint8_t encoder_id) {
+ return ((void *)DYNAMIC_KEYMAP_ENCODER_EEPROM_ADDR) + (layer * NUM_ENCODERS * 2 * 2) + (encoder_id * 2 * 2);
+}
+
+uint16_t nvm_dynamic_keymap_read_encoder(uint8_t layer, uint8_t encoder_id, bool clockwise) {
+ if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || encoder_id >= NUM_ENCODERS) return KC_NO;
+ void *address = dynamic_keymap_encoder_to_eeprom_address(layer, encoder_id);
+ // Big endian, so we can read/write EEPROM directly from host if we want
+ uint16_t keycode = ((uint16_t)eeprom_read_byte(address + (clockwise ? 0 : 2))) << 8;
+ keycode |= eeprom_read_byte(address + (clockwise ? 0 : 2) + 1);
+ return keycode;
+}
+
+void nvm_dynamic_keymap_update_encoder(uint8_t layer, uint8_t encoder_id, bool clockwise, uint16_t keycode) {
+ if (layer >= DYNAMIC_KEYMAP_LAYER_COUNT || encoder_id >= NUM_ENCODERS) return;
+ void *address = dynamic_keymap_encoder_to_eeprom_address(layer, encoder_id);
+ // Big endian, so we can read/write EEPROM directly from host if we want
+ eeprom_update_byte(address + (clockwise ? 0 : 2), (uint8_t)(keycode >> 8));
+ eeprom_update_byte(address + (clockwise ? 0 : 2) + 1, (uint8_t)(keycode & 0xFF));
+}
+#endif // ENCODER_MAP_ENABLE
+
+void nvm_dynamic_keymap_read_buffer(uint32_t offset, uint32_t size, uint8_t *data) {
+ uint32_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2;
+ void * source = (void *)(uintptr_t)(DYNAMIC_KEYMAP_EEPROM_ADDR + offset);
+ uint8_t *target = data;
+ for (uint32_t i = 0; i < size; i++) {
+ if (offset + i < dynamic_keymap_eeprom_size) {
+ *target = eeprom_read_byte(source);
+ } else {
+ *target = 0x00;
+ }
+ source++;
+ target++;
+ }
+}
+
+void nvm_dynamic_keymap_update_buffer(uint32_t offset, uint32_t size, uint8_t *data) {
+ uint32_t dynamic_keymap_eeprom_size = DYNAMIC_KEYMAP_LAYER_COUNT * MATRIX_ROWS * MATRIX_COLS * 2;
+ void * target = (void *)(uintptr_t)(DYNAMIC_KEYMAP_EEPROM_ADDR + offset);
+ uint8_t *source = data;
+ for (uint32_t i = 0; i < size; i++) {
+ if (offset + i < dynamic_keymap_eeprom_size) {
+ eeprom_update_byte(target, *source);
+ }
+ source++;
+ target++;
+ }
+}
+
+uint32_t nvm_dynamic_keymap_macro_size(void) {
+ return DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE;
+}
+
+void nvm_dynamic_keymap_macro_read_buffer(uint32_t offset, uint32_t size, uint8_t *data) {
+ void * source = (void *)(uintptr_t)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + offset);
+ uint8_t *target = data;
+ for (uint16_t i = 0; i < size; i++) {
+ if (offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE) {
+ *target = eeprom_read_byte(source);
+ } else {
+ *target = 0x00;
+ }
+ source++;
+ target++;
+ }
+}
+
+void nvm_dynamic_keymap_macro_update_buffer(uint32_t offset, uint32_t size, uint8_t *data) {
+ void * target = (void *)(uintptr_t)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + offset);
+ uint8_t *source = data;
+ for (uint16_t i = 0; i < size; i++) {
+ if (offset + i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE) {
+ eeprom_update_byte(target, *source);
+ }
+ source++;
+ target++;
+ }
+}
+
+void nvm_dynamic_keymap_macro_reset(void) {
+ void * start = (void *)(uintptr_t)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR);
+ void * end = (void *)(uintptr_t)(DYNAMIC_KEYMAP_MACRO_EEPROM_ADDR + DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE);
+ long remaining = end - start;
+ uint8_t dummy[16] = {0};
+ for (int i = 0; i < DYNAMIC_KEYMAP_MACRO_EEPROM_SIZE; i += sizeof(dummy)) {
+ int this_loop = remaining < sizeof(dummy) ? remaining : sizeof(dummy);
+ eeprom_update_block(dummy, start, this_loop);
+ start += this_loop;
+ remaining -= this_loop;
+ }
+}
diff --git a/quantum/nvm/eeprom/nvm_eeconfig.c b/quantum/nvm/eeprom/nvm_eeconfig.c
new file mode 100644
index 0000000000..d6c388f3bc
--- /dev/null
+++ b/quantum/nvm/eeprom/nvm_eeconfig.c
@@ -0,0 +1,292 @@
+// Copyright 2024 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <string.h>
+#include "nvm_eeconfig.h"
+#include "nvm_eeprom_eeconfig_internal.h"
+#include "util.h"
+#include "eeconfig.h"
+#include "debug.h"
+#include "eeprom.h"
+#include "keycode_config.h"
+
+#ifdef EEPROM_DRIVER
+# include "eeprom_driver.h"
+#endif
+
+#ifdef AUDIO_ENABLE
+# include "audio.h"
+#endif
+
+#ifdef BACKLIGHT_ENABLE
+# include "backlight.h"
+#endif
+
+#ifdef RGBLIGHT_ENABLE
+# include "rgblight.h"
+#endif
+
+#ifdef RGB_MATRIX_ENABLE
+# include "rgb_matrix_types.h"
+#endif
+
+#ifdef LED_MATRIX_ENABLE
+# include "led_matrix_types.h"
+#endif
+
+#ifdef UNICODE_COMMON_ENABLE
+# include "unicode.h"
+#endif
+
+#ifdef HAPTIC_ENABLE
+# include "haptic.h"
+#endif
+
+void nvm_eeconfig_erase(void) {
+#ifdef EEPROM_DRIVER
+ eeprom_driver_format(false);
+#endif // EEPROM_DRIVER
+}
+
+bool nvm_eeconfig_is_enabled(void) {
+ return eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER;
+}
+
+bool nvm_eeconfig_is_disabled(void) {
+ return eeprom_read_word(EECONFIG_MAGIC) == EECONFIG_MAGIC_NUMBER_OFF;
+}
+
+void nvm_eeconfig_enable(void) {
+ eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER);
+}
+
+void nvm_eeconfig_disable(void) {
+#if defined(EEPROM_DRIVER)
+ eeprom_driver_format(false);
+#endif
+ eeprom_update_word(EECONFIG_MAGIC, EECONFIG_MAGIC_NUMBER_OFF);
+}
+
+void nvm_eeconfig_read_debug(debug_config_t *debug_config) {
+ debug_config->raw = eeprom_read_byte(EECONFIG_DEBUG);
+}
+void nvm_eeconfig_update_debug(const debug_config_t *debug_config) {
+ eeprom_update_byte(EECONFIG_DEBUG, debug_config->raw);
+}
+
+layer_state_t nvm_eeconfig_read_default_layer(void) {
+ uint8_t val = eeprom_read_byte(EECONFIG_DEFAULT_LAYER);
+#ifdef DEFAULT_LAYER_STATE_IS_VALUE_NOT_BITMASK
+ // stored as a layer number, so convert back to bitmask
+ return (layer_state_t)1 << val;
+#else
+ // stored as 8-bit-wide bitmask, so read the value directly - handling padding to 16/32 bit layer_state_t
+ return (layer_state_t)val;
+#endif
+}
+void nvm_eeconfig_update_default_layer(layer_state_t state) {
+#ifdef DEFAULT_LAYER_STATE_IS_VALUE_NOT_BITMASK
+ // stored as a layer number, so only store the highest layer
+ uint8_t val = get_highest_layer(state);
+#else
+ // stored as 8-bit-wide bitmask, so write the value directly - handling truncation from 16/32 bit layer_state_t
+ uint8_t val = (uint8_t)state;
+#endif
+ eeprom_update_byte(EECONFIG_DEFAULT_LAYER, val);
+}
+
+void nvm_eeconfig_read_keymap(keymap_config_t *keymap_config) {
+ keymap_config->raw = eeprom_read_word(EECONFIG_KEYMAP);
+}
+void nvm_eeconfig_update_keymap(const keymap_config_t *keymap_config) {
+ eeprom_update_word(EECONFIG_KEYMAP, keymap_config->raw);
+}
+
+#ifdef AUDIO_ENABLE
+void nvm_eeconfig_read_audio(audio_config_t *audio_config) {
+ audio_config->raw = eeprom_read_byte(EECONFIG_AUDIO);
+}
+void nvm_eeconfig_update_audio(const audio_config_t *audio_config) {
+ eeprom_update_byte(EECONFIG_AUDIO, audio_config->raw);
+}
+#endif // AUDIO_ENABLE
+
+#ifdef UNICODE_COMMON_ENABLE
+void nvm_eeconfig_read_unicode_mode(unicode_config_t *unicode_config) {
+ unicode_config->raw = eeprom_read_byte(EECONFIG_UNICODEMODE);
+}
+void nvm_eeconfig_update_unicode_mode(const unicode_config_t *unicode_config) {
+ eeprom_update_byte(EECONFIG_UNICODEMODE, unicode_config->raw);
+}
+#endif // UNICODE_COMMON_ENABLE
+
+#ifdef BACKLIGHT_ENABLE
+void nvm_eeconfig_read_backlight(backlight_config_t *backlight_config) {
+ backlight_config->raw = eeprom_read_byte(EECONFIG_BACKLIGHT);
+}
+void nvm_eeconfig_update_backlight(const backlight_config_t *backlight_config) {
+ eeprom_update_byte(EECONFIG_BACKLIGHT, backlight_config->raw);
+}
+#endif // BACKLIGHT_ENABLE
+
+#ifdef STENO_ENABLE
+uint8_t nvm_eeconfig_read_steno_mode(void) {
+ return eeprom_read_byte(EECONFIG_STENOMODE);
+}
+void nvm_eeconfig_update_steno_mode(uint8_t val) {
+ eeprom_update_byte(EECONFIG_STENOMODE, val);
+}
+#endif // STENO_ENABLE
+
+#ifdef RGBLIGHT_ENABLE
+#endif // RGBLIGHT_ENABLE
+
+#ifdef RGB_MATRIX_ENABLE
+void nvm_eeconfig_read_rgb_matrix(rgb_config_t *rgb_matrix_config) {
+ eeprom_read_block(rgb_matrix_config, EECONFIG_RGB_MATRIX, sizeof(rgb_config_t));
+}
+void nvm_eeconfig_update_rgb_matrix(const rgb_config_t *rgb_matrix_config) {
+ eeprom_update_block(rgb_matrix_config, EECONFIG_RGB_MATRIX, sizeof(rgb_config_t));
+}
+#endif // RGB_MATRIX_ENABLE
+
+#ifdef LED_MATRIX_ENABLE
+void nvm_eeconfig_read_led_matrix(led_eeconfig_t *led_matrix_config) {
+ eeprom_read_block(led_matrix_config, EECONFIG_LED_MATRIX, sizeof(led_eeconfig_t));
+}
+void nvm_eeconfig_update_led_matrix(const led_eeconfig_t *led_matrix_config) {
+ eeprom_update_block(led_matrix_config, EECONFIG_LED_MATRIX, sizeof(led_eeconfig_t));
+}
+#endif // LED_MATRIX_ENABLE
+
+#ifdef RGBLIGHT_ENABLE
+void nvm_eeconfig_read_rgblight(rgblight_config_t *rgblight_config) {
+ rgblight_config->raw = eeprom_read_dword(EECONFIG_RGBLIGHT);
+ rgblight_config->raw |= ((uint64_t)eeprom_read_byte(EECONFIG_RGBLIGHT_EXTENDED) << 32);
+}
+void nvm_eeconfig_update_rgblight(const rgblight_config_t *rgblight_config) {
+ eeprom_update_dword(EECONFIG_RGBLIGHT, rgblight_config->raw & 0xFFFFFFFF);
+ eeprom_update_byte(EECONFIG_RGBLIGHT_EXTENDED, (rgblight_config->raw >> 32) & 0xFF);
+}
+#endif // RGBLIGHT_ENABLE
+
+#if (EECONFIG_KB_DATA_SIZE) == 0
+uint32_t nvm_eeconfig_read_kb(void) {
+ return eeprom_read_dword(EECONFIG_KEYBOARD);
+}
+void nvm_eeconfig_update_kb(uint32_t val) {
+ eeprom_update_dword(EECONFIG_KEYBOARD, val);
+}
+#endif // (EECONFIG_KB_DATA_SIZE) == 0
+
+#if (EECONFIG_USER_DATA_SIZE) == 0
+uint32_t nvm_eeconfig_read_user(void) {
+ return eeprom_read_dword(EECONFIG_USER);
+}
+void nvm_eeconfig_update_user(uint32_t val) {
+ eeprom_update_dword(EECONFIG_USER, val);
+}
+#endif // (EECONFIG_USER_DATA_SIZE) == 0
+
+#ifdef HAPTIC_ENABLE
+void nvm_eeconfig_read_haptic(haptic_config_t *haptic_config) {
+ haptic_config->raw = eeprom_read_dword(EECONFIG_HAPTIC);
+}
+void nvm_eeconfig_update_haptic(const haptic_config_t *haptic_config) {
+ eeprom_update_dword(EECONFIG_HAPTIC, haptic_config->raw);
+}
+#endif // HAPTIC_ENABLE
+
+bool nvm_eeconfig_read_handedness(void) {
+ return !!eeprom_read_byte(EECONFIG_HANDEDNESS);
+}
+void nvm_eeconfig_update_handedness(bool val) {
+ eeprom_update_byte(EECONFIG_HANDEDNESS, !!val);
+}
+
+#if (EECONFIG_KB_DATA_SIZE) > 0
+
+bool nvm_eeconfig_is_kb_datablock_valid(void) {
+ return eeprom_read_dword(EECONFIG_KEYBOARD) == (EECONFIG_KB_DATA_VERSION);
+}
+
+uint32_t nvm_eeconfig_read_kb_datablock(void *data, uint32_t offset, uint32_t length) {
+ if (eeconfig_is_kb_datablock_valid()) {
+ void *ee_start = (void *)(uintptr_t)(EECONFIG_KB_DATABLOCK + offset);
+ void *ee_end = (void *)(uintptr_t)(EECONFIG_KB_DATABLOCK + MIN(EECONFIG_KB_DATA_SIZE, offset + length));
+ eeprom_read_block(data, ee_start, ee_end - ee_start);
+ return ee_end - ee_start;
+ } else {
+ memset(data, 0, length);
+ return length;
+ }
+}
+
+uint32_t nvm_eeconfig_update_kb_datablock(const void *data, uint32_t offset, uint32_t length) {
+ eeprom_update_dword(EECONFIG_KEYBOARD, (EECONFIG_KB_DATA_VERSION));
+
+ void *ee_start = (void *)(uintptr_t)(EECONFIG_KB_DATABLOCK + offset);
+ void *ee_end = (void *)(uintptr_t)(EECONFIG_KB_DATABLOCK + MIN(EECONFIG_KB_DATA_SIZE, offset + length));
+ eeprom_update_block(data, ee_start, ee_end - ee_start);
+ return ee_end - ee_start;
+}
+
+void nvm_eeconfig_init_kb_datablock(void) {
+ eeprom_update_dword(EECONFIG_KEYBOARD, (EECONFIG_KB_DATA_VERSION));
+
+ void * start = (void *)(uintptr_t)(EECONFIG_KB_DATABLOCK);
+ void * end = (void *)(uintptr_t)(EECONFIG_KB_DATABLOCK + EECONFIG_KB_DATA_SIZE);
+ long remaining = end - start;
+ uint8_t dummy[16] = {0};
+ for (int i = 0; i < EECONFIG_KB_DATA_SIZE; i += sizeof(dummy)) {
+ int this_loop = remaining < sizeof(dummy) ? remaining : sizeof(dummy);
+ eeprom_update_block(dummy, start, this_loop);
+ start += this_loop;
+ remaining -= this_loop;
+ }
+}
+
+#endif // (EECONFIG_KB_DATA_SIZE) > 0
+
+#if (EECONFIG_USER_DATA_SIZE) > 0
+
+bool nvm_eeconfig_is_user_datablock_valid(void) {
+ return eeprom_read_dword(EECONFIG_USER) == (EECONFIG_USER_DATA_VERSION);
+}
+
+uint32_t nvm_eeconfig_read_user_datablock(void *data, uint32_t offset, uint32_t length) {
+ if (eeconfig_is_user_datablock_valid()) {
+ void *ee_start = (void *)(uintptr_t)(EECONFIG_USER_DATABLOCK + offset);
+ void *ee_end = (void *)(uintptr_t)(EECONFIG_USER_DATABLOCK + MIN(EECONFIG_USER_DATA_SIZE, offset + length));
+ eeprom_read_block(data, ee_start, ee_end - ee_start);
+ return ee_end - ee_start;
+ } else {
+ memset(data, 0, length);
+ return length;
+ }
+}
+
+uint32_t nvm_eeconfig_update_user_datablock(const void *data, uint32_t offset, uint32_t length) {
+ eeprom_update_dword(EECONFIG_USER, (EECONFIG_USER_DATA_VERSION));
+
+ void *ee_start = (void *)(uintptr_t)(EECONFIG_USER_DATABLOCK + offset);
+ void *ee_end = (void *)(uintptr_t)(EECONFIG_USER_DATABLOCK + MIN(EECONFIG_USER_DATA_SIZE, offset + length));
+ eeprom_update_block(data, ee_start, ee_end - ee_start);
+ return ee_end - ee_start;
+}
+
+void nvm_eeconfig_init_user_datablock(void) {
+ eeprom_update_dword(EECONFIG_USER, (EECONFIG_USER_DATA_VERSION));
+
+ void * start = (void *)(uintptr_t)(EECONFIG_USER_DATABLOCK);
+ void * end = (void *)(uintptr_t)(EECONFIG_USER_DATABLOCK + EECONFIG_USER_DATA_SIZE);
+ long remaining = end - start;
+ uint8_t dummy[16] = {0};
+ for (int i = 0; i < EECONFIG_USER_DATA_SIZE; i += sizeof(dummy)) {
+ int this_loop = remaining < sizeof(dummy) ? remaining : sizeof(dummy);
+ eeprom_update_block(dummy, start, this_loop);
+ start += this_loop;
+ remaining -= this_loop;
+ }
+}
+
+#endif // (EECONFIG_USER_DATA_SIZE) > 0
diff --git a/quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h b/quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h
new file mode 100644
index 0000000000..6efbf9480b
--- /dev/null
+++ b/quantum/nvm/eeprom/nvm_eeprom_eeconfig_internal.h
@@ -0,0 +1,59 @@
+// Copyright 2024 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include <stdint.h>
+#include <stddef.h> // offsetof
+#include "eeconfig.h"
+#include "util.h"
+
+// Dummy struct only used to calculate offsets
+typedef struct PACKED {
+ uint16_t magic;
+ uint8_t debug;
+ uint8_t default_layer;
+ uint16_t keymap;
+ uint8_t backlight;
+ uint8_t audio;
+ uint32_t rgblight;
+ uint8_t unicode;
+ uint8_t steno;
+ uint8_t handedness;
+ uint32_t keyboard;
+ uint32_t user;
+ union { // Mutually exclusive
+ uint32_t led_matrix;
+ uint64_t rgb_matrix;
+ };
+ uint32_t haptic;
+ uint8_t rgblight_ext;
+} eeprom_core_t;
+
+/* EEPROM parameter address */
+#define EECONFIG_MAGIC (uint16_t *)(offsetof(eeprom_core_t, magic))
+#define EECONFIG_DEBUG (uint8_t *)(offsetof(eeprom_core_t, debug))
+#define EECONFIG_DEFAULT_LAYER (uint8_t *)(offsetof(eeprom_core_t, default_layer))
+#define EECONFIG_KEYMAP (uint16_t *)(offsetof(eeprom_core_t, keymap))
+#define EECONFIG_BACKLIGHT (uint8_t *)(offsetof(eeprom_core_t, backlight))
+#define EECONFIG_AUDIO (uint8_t *)(offsetof(eeprom_core_t, audio))
+#define EECONFIG_RGBLIGHT (uint32_t *)(offsetof(eeprom_core_t, rgblight))
+#define EECONFIG_UNICODEMODE (uint8_t *)(offsetof(eeprom_core_t, unicode))
+#define EECONFIG_STENOMODE (uint8_t *)(offsetof(eeprom_core_t, steno))
+#define EECONFIG_HANDEDNESS (uint8_t *)(offsetof(eeprom_core_t, handedness))
+#define EECONFIG_KEYBOARD (uint32_t *)(offsetof(eeprom_core_t, keyboard))
+#define EECONFIG_USER (uint32_t *)(offsetof(eeprom_core_t, user))
+#define EECONFIG_LED_MATRIX (uint32_t *)(offsetof(eeprom_core_t, led_matrix))
+#define EECONFIG_RGB_MATRIX (uint64_t *)(offsetof(eeprom_core_t, rgb_matrix))
+#define EECONFIG_HAPTIC (uint32_t *)(offsetof(eeprom_core_t, haptic))
+#define EECONFIG_RGBLIGHT_EXTENDED (uint8_t *)(offsetof(eeprom_core_t, rgblight_ext))
+
+// Size of EEPROM being used for core data storage
+#define EECONFIG_BASE_SIZE ((uint8_t)sizeof(eeprom_core_t))
+
+#define EECONFIG_KB_DATABLOCK ((uint8_t *)(EECONFIG_BASE_SIZE))
+#define EECONFIG_USER_DATABLOCK ((uint8_t *)((EECONFIG_BASE_SIZE) + (EECONFIG_KB_DATA_SIZE)))
+
+// Size of EEPROM being used, other code can refer to this for available EEPROM
+#define EECONFIG_SIZE ((EECONFIG_BASE_SIZE) + (EECONFIG_KB_DATA_SIZE) + (EECONFIG_USER_DATA_SIZE))
+
+_Static_assert((intptr_t)EECONFIG_HANDEDNESS == 14, "EEPROM handedness offset is incorrect");
diff --git a/quantum/nvm/eeprom/nvm_eeprom_via_internal.h b/quantum/nvm/eeprom/nvm_eeprom_via_internal.h
new file mode 100644
index 0000000000..bf0d38e2ac
--- /dev/null
+++ b/quantum/nvm/eeprom/nvm_eeprom_via_internal.h
@@ -0,0 +1,22 @@
+// Copyright 2024 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+// Keyboard level code can change where VIA stores the magic.
+// The magic is the build date YYMMDD encoded as BCD in 3 bytes,
+// thus installing firmware built on a different date to the one
+// already installed can be detected and the EEPROM data is reset.
+// The only reason this is important is in case EEPROM usage changes
+// and the EEPROM was not explicitly reset by bootmagic lite.
+#ifndef VIA_EEPROM_MAGIC_ADDR
+# define VIA_EEPROM_MAGIC_ADDR (EECONFIG_SIZE)
+#endif
+
+#define VIA_EEPROM_LAYOUT_OPTIONS_ADDR (VIA_EEPROM_MAGIC_ADDR + 3)
+
+// The end of the EEPROM memory used by VIA
+// By default, dynamic keymaps will start at this if there is no
+// custom config
+#define VIA_EEPROM_CUSTOM_CONFIG_ADDR (VIA_EEPROM_LAYOUT_OPTIONS_ADDR + VIA_EEPROM_LAYOUT_OPTIONS_SIZE)
+
+#define VIA_EEPROM_CONFIG_END (VIA_EEPROM_CUSTOM_CONFIG_ADDR + VIA_EEPROM_CUSTOM_CONFIG_SIZE)
diff --git a/quantum/nvm/eeprom/nvm_via.c b/quantum/nvm/eeprom/nvm_via.c
new file mode 100644
index 0000000000..5372791fb7
--- /dev/null
+++ b/quantum/nvm/eeprom/nvm_via.c
@@ -0,0 +1,77 @@
+// Copyright 2024 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "eeprom.h"
+#include "util.h"
+#include "via.h"
+#include "nvm_via.h"
+#include "nvm_eeprom_eeconfig_internal.h"
+#include "nvm_eeprom_via_internal.h"
+
+void nvm_via_erase(void) {
+ // No-op, nvm_eeconfig_erase() will have already erased EEPROM if necessary.
+}
+
+void nvm_via_read_magic(uint8_t *magic0, uint8_t *magic1, uint8_t *magic2) {
+ if (magic0) {
+ *magic0 = eeprom_read_byte((void *)VIA_EEPROM_MAGIC_ADDR + 0);
+ }
+
+ if (magic1) {
+ *magic1 = eeprom_read_byte((void *)VIA_EEPROM_MAGIC_ADDR + 1);
+ }
+
+ if (magic2) {
+ *magic2 = eeprom_read_byte((void *)VIA_EEPROM_MAGIC_ADDR + 2);
+ }
+}
+
+void nvm_via_update_magic(uint8_t magic0, uint8_t magic1, uint8_t magic2) {
+ eeprom_update_byte((void *)VIA_EEPROM_MAGIC_ADDR + 0, magic0);
+ eeprom_update_byte((void *)VIA_EEPROM_MAGIC_ADDR + 1, magic1);
+ eeprom_update_byte((void *)VIA_EEPROM_MAGIC_ADDR + 2, magic2);
+}
+
+uint32_t nvm_via_read_layout_options(void) {
+ uint32_t value = 0;
+ // Start at the most significant byte
+ void *source = (void *)(VIA_EEPROM_LAYOUT_OPTIONS_ADDR);
+ for (uint8_t i = 0; i < VIA_EEPROM_LAYOUT_OPTIONS_SIZE; i++) {
+ value = value << 8;
+ value |= eeprom_read_byte(source);
+ source++;
+ }
+ return value;
+}
+
+void nvm_via_update_layout_options(uint32_t val) {
+ // Start at the least significant byte
+ void *target = (void *)(VIA_EEPROM_LAYOUT_OPTIONS_ADDR + VIA_EEPROM_LAYOUT_OPTIONS_SIZE - 1);
+ for (uint8_t i = 0; i < VIA_EEPROM_LAYOUT_OPTIONS_SIZE; i++) {
+ eeprom_update_byte(target, val & 0xFF);
+ val = val >> 8;
+ target--;
+ }
+}
+
+uint32_t nvm_via_read_custom_config(void *buf, uint32_t offset, uint32_t length) {
+#if VIA_EEPROM_CUSTOM_CONFIG_SIZE > 0
+ void *ee_start = (void *)(uintptr_t)(VIA_EEPROM_CUSTOM_CONFIG_ADDR + offset);
+ void *ee_end = (void *)(uintptr_t)(VIA_EEPROM_CUSTOM_CONFIG_ADDR + MIN(VIA_EEPROM_CUSTOM_CONFIG_SIZE, offset + length));
+ eeprom_read_block(buf, ee_start, ee_end - ee_start);
+ return ee_end - ee_start;
+#else
+ return 0;
+#endif
+}
+
+uint32_t nvm_via_update_custom_config(const void *buf, uint32_t offset, uint32_t length) {
+#if VIA_EEPROM_CUSTOM_CONFIG_SIZE > 0
+ void *ee_start = (void *)(uintptr_t)(VIA_EEPROM_CUSTOM_CONFIG_ADDR + offset);
+ void *ee_end = (void *)(uintptr_t)(VIA_EEPROM_CUSTOM_CONFIG_ADDR + MIN(VIA_EEPROM_CUSTOM_CONFIG_SIZE, offset + length));
+ eeprom_update_block(buf, ee_start, ee_end - ee_start);
+ return ee_end - ee_start;
+#else
+ return 0;
+#endif
+}
diff --git a/quantum/nvm/nvm_dynamic_keymap.h b/quantum/nvm/nvm_dynamic_keymap.h
new file mode 100644
index 0000000000..d6e4aaee51
--- /dev/null
+++ b/quantum/nvm/nvm_dynamic_keymap.h
@@ -0,0 +1,27 @@
+// Copyright 2024 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+
+void nvm_dynamic_keymap_erase(void);
+void nvm_dynamic_keymap_macro_erase(void);
+
+uint16_t nvm_dynamic_keymap_read_keycode(uint8_t layer, uint8_t row, uint8_t column);
+void nvm_dynamic_keymap_update_keycode(uint8_t layer, uint8_t row, uint8_t column, uint16_t keycode);
+
+#ifdef ENCODER_MAP_ENABLE
+uint16_t nvm_dynamic_keymap_read_encoder(uint8_t layer, uint8_t encoder_id, bool clockwise);
+void nvm_dynamic_keymap_update_encoder(uint8_t layer, uint8_t encoder_id, bool clockwise, uint16_t keycode);
+#endif // ENCODER_MAP_ENABLE
+
+void nvm_dynamic_keymap_read_buffer(uint32_t offset, uint32_t size, uint8_t *data);
+void nvm_dynamic_keymap_update_buffer(uint32_t offset, uint32_t size, uint8_t *data);
+
+uint32_t nvm_dynamic_keymap_macro_size(void);
+
+void nvm_dynamic_keymap_macro_read_buffer(uint32_t offset, uint32_t size, uint8_t *data);
+void nvm_dynamic_keymap_macro_update_buffer(uint32_t offset, uint32_t size, uint8_t *data);
+
+void nvm_dynamic_keymap_macro_reset(void);
diff --git a/quantum/nvm/nvm_eeconfig.h b/quantum/nvm/nvm_eeconfig.h
new file mode 100644
index 0000000000..131f61d534
--- /dev/null
+++ b/quantum/nvm/nvm_eeconfig.h
@@ -0,0 +1,105 @@
+// Copyright 2024 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "action_layer.h" // layer_state_t
+
+#ifndef EECONFIG_MAGIC_NUMBER
+# define EECONFIG_MAGIC_NUMBER (uint16_t)0xFEE3 // When changing, decrement this value to avoid future re-init issues
+#endif
+#define EECONFIG_MAGIC_NUMBER_OFF (uint16_t)0xFFFF
+
+void nvm_eeconfig_erase(void);
+
+bool nvm_eeconfig_is_enabled(void);
+bool nvm_eeconfig_is_disabled(void);
+
+void nvm_eeconfig_enable(void);
+void nvm_eeconfig_disable(void);
+
+typedef union debug_config_t debug_config_t;
+void nvm_eeconfig_read_debug(debug_config_t *debug_config);
+void nvm_eeconfig_update_debug(const debug_config_t *debug_config);
+
+layer_state_t nvm_eeconfig_read_default_layer(void);
+void nvm_eeconfig_update_default_layer(layer_state_t state);
+
+typedef union keymap_config_t keymap_config_t;
+void nvm_eeconfig_read_keymap(keymap_config_t *keymap_config);
+void nvm_eeconfig_update_keymap(const keymap_config_t *keymap_config);
+
+#ifdef AUDIO_ENABLE
+typedef union audio_config_t audio_config_t;
+void nvm_eeconfig_read_audio(audio_config_t *audio_config);
+void nvm_eeconfig_update_audio(const audio_config_t *audio_config);
+#endif // AUDIO_ENABLE
+
+#ifdef UNICODE_COMMON_ENABLE
+typedef union unicode_config_t unicode_config_t;
+void nvm_eeconfig_read_unicode_mode(unicode_config_t *unicode_config);
+void nvm_eeconfig_update_unicode_mode(const unicode_config_t *unicode_config);
+#endif // UNICODE_COMMON_ENABLE
+
+#ifdef BACKLIGHT_ENABLE
+typedef union backlight_config_t backlight_config_t;
+void nvm_eeconfig_read_backlight(backlight_config_t *backlight_config);
+void nvm_eeconfig_update_backlight(const backlight_config_t *backlight_config);
+#endif // BACKLIGHT_ENABLE
+
+#ifdef STENO_ENABLE
+uint8_t nvm_eeconfig_read_steno_mode(void);
+void nvm_eeconfig_update_steno_mode(uint8_t val);
+#endif // STENO_ENABLE
+
+#ifdef RGB_MATRIX_ENABLE
+typedef union rgb_config_t rgb_config_t;
+void nvm_eeconfig_read_rgb_matrix(rgb_config_t *rgb_matrix_config);
+void nvm_eeconfig_update_rgb_matrix(const rgb_config_t *rgb_matrix_config);
+#endif
+
+#ifdef LED_MATRIX_ENABLE
+typedef union led_eeconfig_t led_eeconfig_t;
+void nvm_eeconfig_read_led_matrix(led_eeconfig_t *led_matrix_config);
+void nvm_eeconfig_update_led_matrix(const led_eeconfig_t *led_matrix_config);
+#endif // LED_MATRIX_ENABLE
+
+#ifdef RGBLIGHT_ENABLE
+typedef union rgblight_config_t rgblight_config_t;
+void nvm_eeconfig_read_rgblight(rgblight_config_t *rgblight_config);
+void nvm_eeconfig_update_rgblight(const rgblight_config_t *rgblight_config);
+#endif // RGBLIGHT_ENABLE
+
+#if (EECONFIG_KB_DATA_SIZE) == 0
+uint32_t nvm_eeconfig_read_kb(void);
+void nvm_eeconfig_update_kb(uint32_t val);
+#endif // (EECONFIG_KB_DATA_SIZE) == 0
+
+#if (EECONFIG_USER_DATA_SIZE) == 0
+uint32_t nvm_eeconfig_read_user(void);
+void nvm_eeconfig_update_user(uint32_t val);
+#endif // (EECONFIG_USER_DATA_SIZE) == 0
+
+#ifdef HAPTIC_ENABLE
+typedef union haptic_config_t haptic_config_t;
+void nvm_eeconfig_read_haptic(haptic_config_t *haptic_config);
+void nvm_eeconfig_update_haptic(const haptic_config_t *haptic_config);
+#endif // HAPTIC_ENABLE
+
+bool nvm_eeconfig_read_handedness(void);
+void nvm_eeconfig_update_handedness(bool val);
+
+#if (EECONFIG_KB_DATA_SIZE) > 0
+bool nvm_eeconfig_is_kb_datablock_valid(void);
+uint32_t nvm_eeconfig_read_kb_datablock(void *data, uint32_t offset, uint32_t length);
+uint32_t nvm_eeconfig_update_kb_datablock(const void *data, uint32_t offset, uint32_t length);
+void nvm_eeconfig_init_kb_datablock(void);
+#endif // (EECONFIG_KB_DATA_SIZE) > 0
+
+#if (EECONFIG_USER_DATA_SIZE) > 0
+bool nvm_eeconfig_is_user_datablock_valid(void);
+uint32_t nvm_eeconfig_read_user_datablock(void *data, uint32_t offset, uint32_t length);
+uint32_t nvm_eeconfig_update_user_datablock(const void *data, uint32_t offset, uint32_t length);
+void nvm_eeconfig_init_user_datablock(void);
+#endif // (EECONFIG_USER_DATA_SIZE) > 0
diff --git a/quantum/nvm/nvm_via.h b/quantum/nvm/nvm_via.h
new file mode 100644
index 0000000000..90c5e67421
--- /dev/null
+++ b/quantum/nvm/nvm_via.h
@@ -0,0 +1,17 @@
+// Copyright 2024 Nick Brassel (@tzarc)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#include <stdint.h>
+#include <stdbool.h>
+
+void nvm_via_erase(void);
+
+void nvm_via_read_magic(uint8_t *magic0, uint8_t *magic1, uint8_t *magic2);
+void nvm_via_update_magic(uint8_t magic0, uint8_t magic1, uint8_t magic2);
+
+uint32_t nvm_via_read_layout_options(void);
+void nvm_via_update_layout_options(uint32_t val);
+
+uint32_t nvm_via_read_custom_config(void *buf, uint32_t offset, uint32_t length);
+uint32_t nvm_via_update_custom_config(const void *buf, uint32_t offset, uint32_t length);
diff --git a/quantum/nvm/readme.md b/quantum/nvm/readme.md
new file mode 100644
index 0000000000..0731695e92
--- /dev/null
+++ b/quantum/nvm/readme.md
@@ -0,0 +1,30 @@
+# Non-volatile Memory - Data Repositories
+
+This area is intentionally structured in the following way:
+
+```
+╰- quantum
+ ╰- nvm
+ ├- readme.md
+ ├- rules.mk
+ |
+ ├- nvm_eeconfig.h
+ ├- nvm_<<system>>.h
+ |
+ ├- eeprom
+ | ├- nvm_eeconfig.c
+ | ├- nvm_<<system>>.c
+ | ╰- ...
+ |
+ ├- <<another provider>>
+ | ├- nvm_eeconfig.c
+ | ├- nvm_<<system>>.c
+ | ╰- ...
+ ╰- ...
+```
+
+At the base `nvm` level, for every QMK core system which requires persistence there must be a corresponding `nvm_<<system>>.h` header file. This provides the data repository API to the "owner" system, and allows the underlying data persistence mechanism to be abstracted away from upper code. Any conversion to/from a `.raw` field should occur inside the `nvm_<<system>>.c` layer, with the API using values, such as structs or unions exposed to the rest of QMK.
+
+Each `nvm` "provider" is a corresponding child directory consisting of its name, such as `eeprom`, and corresponding `nvm_<<system>>.c` implementation files which provide the concrete implementation of the upper `nvm_<<system>>.h`.
+
+New systems requiring persistence can add the corresponding `nvm_<<system>>.h` file, and in most circumstances must also implement equivalent `nvm_<<system>>.c` files for every `nvm` provider. If persistence is not possible for that system, a `nvm_<<system>>.c` file with simple stubs which ignore writes and provide sane defaults must be used instead. \ No newline at end of file
diff --git a/quantum/nvm/rules.mk b/quantum/nvm/rules.mk
new file mode 100644
index 0000000000..c9c1fabfd4
--- /dev/null
+++ b/quantum/nvm/rules.mk
@@ -0,0 +1,31 @@
+# Copyright 2024 Nick Brassel (@tzarc)
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+VPATH += $(QUANTUM_DIR)/nvm
+
+VALID_NVM_DRIVERS := eeprom custom none
+
+NVM_DRIVER ?= eeprom
+
+ifeq ($(filter $(NVM_DRIVER),$(VALID_NVM_DRIVERS)),)
+ $(call CATASTROPHIC_ERROR,Invalid NVM_DRIVER,NVM_DRIVER="$(NVM_DRIVER)" is not a valid NVM driver)
+else
+
+ # If we don't want one, fake it with transient eeprom.
+ ifeq ($(NVM_DRIVER),none)
+ NVM_DRIVER := eeprom
+ EEPROM_DRIVER := transient
+ endif
+
+ NVM_DRIVER_UPPER := $(shell echo $(NVM_DRIVER) | tr '[:lower:]' '[:upper:]')
+ NVM_DRIVER_LOWER := $(shell echo $(NVM_DRIVER) | tr '[:upper:]' '[:lower:]')
+
+ OPT_DEFS += -DNVM_DRIVER_$(NVM_DRIVER_UPPER) -DNVM_DRIVER="$(NVM_DRIVER)"
+
+ ifneq ("$(wildcard $(QUANTUM_DIR)/nvm/$(NVM_DRIVER_LOWER))","")
+ COMMON_VPATH += $(QUANTUM_DIR)/nvm/$(NVM_DRIVER_LOWER)
+ endif
+
+ QUANTUM_SRC += nvm_eeconfig.c
+
+endif
diff --git a/quantum/os_detection.h b/quantum/os_detection.h
index 98a8e805e4..e9e7b25f1d 100644
--- a/quantum/os_detection.h
+++ b/quantum/os_detection.h
@@ -43,6 +43,9 @@ void slave_update_detected_host_os(os_variant_t os);
#endif
#ifdef OS_DETECTION_DEBUG_ENABLE
+# if defined(DYNAMIC_KEYMAP_ENABLE) || defined(VIA_ENABLE)
+# error Cannot enable OS Detection debug mode simultaneously with DYNAMIC_KEYMAP or VIA
+# endif
void print_stored_setups(void);
void store_setups_in_eeprom(void);
#endif
diff --git a/quantum/process_keycode/process_autocorrect.c b/quantum/process_keycode/process_autocorrect.c
index b7f9132acf..0cde520778 100644
--- a/quantum/process_keycode/process_autocorrect.c
+++ b/quantum/process_keycode/process_autocorrect.c
@@ -38,7 +38,7 @@ bool autocorrect_is_enabled(void) {
*/
void autocorrect_enable(void) {
keymap_config.autocorrect_enable = true;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
/**
@@ -48,7 +48,7 @@ void autocorrect_enable(void) {
void autocorrect_disable(void) {
keymap_config.autocorrect_enable = false;
typo_buffer_size = 0;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
/**
@@ -58,7 +58,7 @@ void autocorrect_disable(void) {
void autocorrect_toggle(void) {
keymap_config.autocorrect_enable = !keymap_config.autocorrect_enable;
typo_buffer_size = 0;
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
}
/**
diff --git a/quantum/process_keycode/process_clicky.c b/quantum/process_keycode/process_clicky.c
index 82000db9b3..f50761268a 100644
--- a/quantum/process_keycode/process_clicky.c
+++ b/quantum/process_keycode/process_clicky.c
@@ -66,17 +66,17 @@ void clicky_freq_reset(void) {
void clicky_toggle(void) {
audio_config.clicky_enable ^= 1;
- eeconfig_update_audio(audio_config.raw);
+ eeconfig_update_audio(&audio_config);
}
void clicky_on(void) {
audio_config.clicky_enable = 1;
- eeconfig_update_audio(audio_config.raw);
+ eeconfig_update_audio(&audio_config);
}
void clicky_off(void) {
audio_config.clicky_enable = 0;
- eeconfig_update_audio(audio_config.raw);
+ eeconfig_update_audio(&audio_config);
}
bool is_clicky_on(void) {
diff --git a/quantum/process_keycode/process_magic.c b/quantum/process_keycode/process_magic.c
index 3b35884d68..d5280105de 100644
--- a/quantum/process_keycode/process_magic.c
+++ b/quantum/process_keycode/process_magic.c
@@ -47,7 +47,7 @@ bool process_magic(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed) {
if (IS_MAGIC_KEYCODE(keycode)) {
/* keymap config */
- keymap_config.raw = eeconfig_read_keymap();
+ eeconfig_read_keymap(&keymap_config);
switch (keycode) {
case QK_MAGIC_SWAP_CONTROL_CAPS_LOCK:
keymap_config.swap_control_capslock = true;
@@ -187,7 +187,7 @@ bool process_magic(uint16_t keycode, keyrecord_t *record) {
break;
}
- eeconfig_update_keymap(keymap_config.raw);
+ eeconfig_update_keymap(&keymap_config);
clear_keyboard(); // clear to prevent stuck keys
return false;
diff --git a/quantum/process_keycode/process_steno.c b/quantum/process_keycode/process_steno.c
index c491d6f1d8..4789461352 100644
--- a/quantum/process_keycode/process_steno.c
+++ b/quantum/process_keycode/process_steno.c
@@ -20,9 +20,6 @@
#ifdef VIRTSER_ENABLE
# include "virtser.h"
#endif
-#ifdef STENO_ENABLE_ALL
-# include "eeprom.h"
-#endif
// All steno keys that have been pressed to form this chord,
// stored in MAX_STROKE_SIZE groups of 8-bit arrays.
@@ -128,13 +125,13 @@ static const uint16_t combinedmap_second[] PROGMEM = {STN_S2, STN_KL, STN_WL, ST
#ifdef STENO_ENABLE_ALL
void steno_init(void) {
- mode = eeprom_read_byte(EECONFIG_STENOMODE);
+ mode = eeconfig_read_steno_mode();
}
void steno_set_mode(steno_mode_t new_mode) {
steno_clear_chord();
mode = new_mode;
- eeprom_update_byte(EECONFIG_STENOMODE, mode);
+ eeconfig_update_steno_mode(mode);
}
#endif // STENO_ENABLE_ALL
diff --git a/quantum/quantum.h b/quantum/quantum.h
index 59a415ead4..3a994e9a03 100644
--- a/quantum/quantum.h
+++ b/quantum/quantum.h
@@ -39,6 +39,7 @@
#include "keymap_common.h"
#include "quantum_keycodes.h"
#include "keycode_config.h"
+#include "keycode_string.h"
#include "action_layer.h"
#include "eeconfig.h"
#include "bootloader.h"
diff --git a/quantum/rgb_matrix/animations/rgb_matrix_effects.inc b/quantum/rgb_matrix/animations/rgb_matrix_effects.inc
index a02238a2d1..e8b7a2bcde 100644
--- a/quantum/rgb_matrix/animations/rgb_matrix_effects.inc
+++ b/quantum/rgb_matrix/animations/rgb_matrix_effects.inc
@@ -42,4 +42,4 @@
#include "starlight_anim.h"
#include "starlight_dual_sat_anim.h"
#include "starlight_dual_hue_anim.h"
-#include "riverflow_anim.h" \ No newline at end of file
+#include "riverflow_anim.h"
diff --git a/quantum/rgb_matrix/rgb_matrix.c b/quantum/rgb_matrix/rgb_matrix.c
index 484d177546..a18105c9b3 100644
--- a/quantum/rgb_matrix/rgb_matrix.c
+++ b/quantum/rgb_matrix/rgb_matrix.c
@@ -88,9 +88,9 @@ static last_hit_t last_hit_buffer;
const uint8_t k_rgb_matrix_split[2] = RGB_MATRIX_SPLIT;
#endif
-EECONFIG_DEBOUNCE_HELPER(rgb_matrix, EECONFIG_RGB_MATRIX, rgb_matrix_config);
+EECONFIG_DEBOUNCE_HELPER(rgb_matrix, rgb_matrix_config);
-void eeconfig_update_rgb_matrix(void) {
+void eeconfig_force_flush_rgb_matrix(void) {
eeconfig_flush_rgb_matrix(true);
}
diff --git a/quantum/rgb_matrix/rgb_matrix.h b/quantum/rgb_matrix/rgb_matrix.h
index 33f7e06a63..e00e3927c7 100644
--- a/quantum/rgb_matrix/rgb_matrix.h
+++ b/quantum/rgb_matrix/rgb_matrix.h
@@ -140,7 +140,7 @@ enum rgb_matrix_effects {
};
void eeconfig_update_rgb_matrix_default(void);
-void eeconfig_update_rgb_matrix(void);
+void eeconfig_force_flush_rgb_matrix(void);
uint8_t rgb_matrix_map_row_column_to_led_kb(uint8_t row, uint8_t column, uint8_t *led_i);
uint8_t rgb_matrix_map_row_column_to_led(uint8_t row, uint8_t column, uint8_t *led_i);
@@ -215,7 +215,7 @@ void rgb_matrix_set_flags_noeeprom(led_flags_t flags);
void rgb_matrix_update_pwm_buffers(void);
#ifndef RGBLIGHT_ENABLE
-# define eeconfig_update_rgblight_current eeconfig_update_rgb_matrix
+# define eeconfig_update_rgblight_current eeconfig_force_flush_rgb_matrix
# define rgblight_reload_from_eeprom rgb_matrix_reload_from_eeprom
# define rgblight_toggle rgb_matrix_toggle
# define rgblight_toggle_noeeprom rgb_matrix_toggle_noeeprom
diff --git a/quantum/rgb_matrix/rgb_matrix_types.h b/quantum/rgb_matrix/rgb_matrix_types.h
index 0834a7067c..62005ebea9 100644
--- a/quantum/rgb_matrix/rgb_matrix_types.h
+++ b/quantum/rgb_matrix/rgb_matrix_types.h
@@ -73,7 +73,7 @@ typedef struct PACKED {
uint8_t flags[RGB_MATRIX_LED_COUNT];
} led_config_t;
-typedef union {
+typedef union rgb_config_t {
uint64_t raw;
struct PACKED {
uint8_t enable : 2;
diff --git a/quantum/rgblight/rgblight.c b/quantum/rgblight/rgblight.c
index ddccc9bae3..83f97c8114 100644
--- a/quantum/rgblight/rgblight.c
+++ b/quantum/rgblight/rgblight.c
@@ -24,9 +24,7 @@
#include "util.h"
#include "led_tables.h"
#include <lib/lib8tion/lib8tion.h>
-#ifdef EEPROM_ENABLE
-# include "eeprom.h"
-#endif
+#include "eeconfig.h"
#ifdef RGBLIGHT_SPLIT
/* for split keyboard */
@@ -176,24 +174,9 @@ void rgblight_check_config(void) {
}
}
-uint64_t eeconfig_read_rgblight(void) {
-#ifdef EEPROM_ENABLE
- return (uint64_t)((eeprom_read_dword(EECONFIG_RGBLIGHT)) | ((uint64_t)eeprom_read_byte(EECONFIG_RGBLIGHT_EXTENDED) << 32));
-#else
- return 0;
-#endif
-}
-
-void eeconfig_update_rgblight(uint64_t val) {
-#ifdef EEPROM_ENABLE
- rgblight_check_config();
- eeprom_update_dword(EECONFIG_RGBLIGHT, val & 0xFFFFFFFF);
- eeprom_update_byte(EECONFIG_RGBLIGHT_EXTENDED, (val >> 32) & 0xFF);
-#endif
-}
-
void eeconfig_update_rgblight_current(void) {
- eeconfig_update_rgblight(rgblight_config.raw);
+ rgblight_check_config();
+ eeconfig_update_rgblight(&rgblight_config);
}
void eeconfig_update_rgblight_default(void) {
@@ -205,7 +188,7 @@ void eeconfig_update_rgblight_default(void) {
rgblight_config.val = RGBLIGHT_DEFAULT_VAL;
rgblight_config.speed = RGBLIGHT_DEFAULT_SPD;
RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS;
- eeconfig_update_rgblight(rgblight_config.raw);
+ eeconfig_update_rgblight(&rgblight_config);
}
void eeconfig_debug_rgblight(void) {
@@ -228,12 +211,12 @@ void rgblight_init(void) {
}
dprintf("rgblight_init start!\n");
- rgblight_config.raw = eeconfig_read_rgblight();
+ eeconfig_read_rgblight(&rgblight_config);
RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS;
if (!rgblight_config.mode) {
dprintf("rgblight_init rgblight_config.mode = 0. Write default values to EEPROM.\n");
eeconfig_update_rgblight_default();
- rgblight_config.raw = eeconfig_read_rgblight();
+ eeconfig_read_rgblight(&rgblight_config);
}
rgblight_check_config();
@@ -252,7 +235,7 @@ void rgblight_init(void) {
void rgblight_reload_from_eeprom(void) {
/* Reset back to what we have in eeprom */
- rgblight_config.raw = eeconfig_read_rgblight();
+ eeconfig_read_rgblight(&rgblight_config);
RGBLIGHT_SPLIT_SET_CHANGE_MODEHSVS;
rgblight_check_config();
eeconfig_debug_rgblight(); // display current eeprom values
@@ -341,7 +324,7 @@ void rgblight_mode_eeprom_helper(uint8_t mode, bool write_to_eeprom) {
}
RGBLIGHT_SPLIT_SET_CHANGE_MODE;
if (write_to_eeprom) {
- eeconfig_update_rgblight(rgblight_config.raw);
+ eeconfig_update_rgblight(&rgblight_config);
dprintf("rgblight mode [EEPROM]: %u\n", rgblight_config.mode);
} else {
dprintf("rgblight mode [NOEEPROM]: %u\n", rgblight_config.mode);
@@ -386,7 +369,7 @@ void rgblight_toggle_noeeprom(void) {
void rgblight_enable(void) {
rgblight_config.enable = 1;
// No need to update EEPROM here. rgblight_mode() will do that, actually
- // eeconfig_update_rgblight(rgblight_config.raw);
+ // eeconfig_update_rgblight(&rgblight_config);
dprintf("rgblight enable [EEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable);
rgblight_mode(rgblight_config.mode);
}
@@ -399,7 +382,7 @@ void rgblight_enable_noeeprom(void) {
void rgblight_disable(void) {
rgblight_config.enable = 0;
- eeconfig_update_rgblight(rgblight_config.raw);
+ eeconfig_update_rgblight(&rgblight_config);
dprintf("rgblight disable [EEPROM]: rgblight_config.enable = %u\n", rgblight_config.enable);
rgblight_timer_disable();
RGBLIGHT_SPLIT_SET_CHANGE_MODE;
@@ -487,7 +470,7 @@ void rgblight_increase_speed_helper(bool write_to_eeprom) {
if (rgblight_config.speed < 3) rgblight_config.speed++;
// RGBLIGHT_SPLIT_SET_CHANGE_HSVS; // NEED?
if (write_to_eeprom) {
- eeconfig_update_rgblight(rgblight_config.raw);
+ eeconfig_update_rgblight(&rgblight_config);
}
}
void rgblight_increase_speed(void) {
@@ -501,7 +484,7 @@ void rgblight_decrease_speed_helper(bool write_to_eeprom) {
if (rgblight_config.speed > 0) rgblight_config.speed--;
// RGBLIGHT_SPLIT_SET_CHANGE_HSVS; // NEED??
if (write_to_eeprom) {
- eeconfig_update_rgblight(rgblight_config.raw);
+ eeconfig_update_rgblight(&rgblight_config);
}
}
void rgblight_decrease_speed(void) {
@@ -585,7 +568,7 @@ void rgblight_sethsv_eeprom_helper(uint8_t hue, uint8_t sat, uint8_t val, bool w
rgblight_config.sat = sat;
rgblight_config.val = val;
if (write_to_eeprom) {
- eeconfig_update_rgblight(rgblight_config.raw);
+ eeconfig_update_rgblight(&rgblight_config);
dprintf("rgblight set hsv [EEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
} else {
dprintf("rgblight set hsv [NOEEPROM]: %u,%u,%u\n", rgblight_config.hue, rgblight_config.sat, rgblight_config.val);
@@ -608,7 +591,7 @@ uint8_t rgblight_get_speed(void) {
void rgblight_set_speed_eeprom_helper(uint8_t speed, bool write_to_eeprom) {
rgblight_config.speed = speed;
if (write_to_eeprom) {
- eeconfig_update_rgblight(rgblight_config.raw);
+ eeconfig_update_rgblight(&rgblight_config);
dprintf("rgblight set speed [EEPROM]: %u\n", rgblight_config.speed);
} else {
dprintf("rgblight set speed [NOEEPROM]: %u\n", rgblight_config.speed);
diff --git a/quantum/rgblight/rgblight.h b/quantum/rgblight/rgblight.h
index f4b6e621e4..f5fd450d4c 100644
--- a/quantum/rgblight/rgblight.h
+++ b/quantum/rgblight/rgblight.h
@@ -168,7 +168,6 @@ enum RGBLIGHT_EFFECT_MODE {
#include <stdbool.h>
#include "rgblight_drivers.h"
#include "progmem.h"
-#include "eeconfig.h"
#include "color.h"
#ifdef RGBLIGHT_LAYERS
@@ -248,7 +247,7 @@ extern const uint16_t RGBLED_RGBTEST_INTERVALS[1] PROGMEM;
extern const uint8_t RGBLED_TWINKLE_INTERVALS[3] PROGMEM;
extern bool is_rgblight_initialized;
-typedef union {
+typedef union rgblight_config_t {
uint64_t raw;
struct {
bool enable : 1;
@@ -370,8 +369,6 @@ void rgblight_suspend(void);
void rgblight_wakeup(void);
uint64_t rgblight_read_qword(void);
void rgblight_update_qword(uint64_t qword);
-uint64_t eeconfig_read_rgblight(void);
-void eeconfig_update_rgblight(uint64_t val);
void eeconfig_update_rgblight_current(void);
void eeconfig_update_rgblight_default(void);
void eeconfig_debug_rgblight(void);
diff --git a/quantum/split_common/split_util.h b/quantum/split_common/split_util.h
index f83b05b6a6..6f4c4dc660 100644
--- a/quantum/split_common/split_util.h
+++ b/quantum/split_common/split_util.h
@@ -15,4 +15,4 @@ bool is_transport_connected(void);
void split_watchdog_update(bool done);
void split_watchdog_task(void);
-bool split_watchdog_check(void); \ No newline at end of file
+bool split_watchdog_check(void);
diff --git a/quantum/unicode/unicode.c b/quantum/unicode/unicode.c
index 78a4cad585..b0729335f0 100644
--- a/quantum/unicode/unicode.c
+++ b/quantum/unicode/unicode.c
@@ -136,7 +136,7 @@ static void unicode_play_song(uint8_t mode) {
#endif
void unicode_input_mode_init(void) {
- unicode_config.raw = eeprom_read_byte(EECONFIG_UNICODEMODE);
+ eeconfig_read_unicode_mode(&unicode_config);
#if UNICODE_SELECTED_MODES != -1
# if UNICODE_CYCLE_PERSIST
// Find input_mode in selected modes
@@ -165,7 +165,7 @@ uint8_t get_unicode_input_mode(void) {
}
static void persist_unicode_input_mode(void) {
- eeprom_update_byte(EECONFIG_UNICODEMODE, unicode_config.input_mode);
+ eeconfig_update_unicode_mode(&unicode_config);
}
void set_unicode_input_mode(uint8_t mode) {
diff --git a/quantum/unicode/unicode.h b/quantum/unicode/unicode.h
index 90a54c8b18..f19d803335 100644
--- a/quantum/unicode/unicode.h
+++ b/quantum/unicode/unicode.h
@@ -26,7 +26,7 @@
* \{
*/
-typedef union {
+typedef union unicode_config_t {
uint8_t raw;
struct {
uint8_t input_mode : 8;
diff --git a/quantum/via.c b/quantum/via.c
index 643d7aa3c3..c746d9a608 100644
--- a/quantum/via.c
+++ b/quantum/via.c
@@ -32,6 +32,7 @@
#include "timer.h"
#include "wait.h"
#include "version.h" // for QMK_BUILDDATE used in EEPROM magic
+#include "nvm_via.h"
#if defined(AUDIO_ENABLE)
# include "audio.h"
@@ -65,20 +66,26 @@ bool via_eeprom_is_valid(void) {
uint8_t magic1 = ((p[5] & 0x0F) << 4) | (p[6] & 0x0F);
uint8_t magic2 = ((p[8] & 0x0F) << 4) | (p[9] & 0x0F);
- return (eeprom_read_byte((void *)VIA_EEPROM_MAGIC_ADDR + 0) == magic0 && eeprom_read_byte((void *)VIA_EEPROM_MAGIC_ADDR + 1) == magic1 && eeprom_read_byte((void *)VIA_EEPROM_MAGIC_ADDR + 2) == magic2);
+ uint8_t ee_magic0;
+ uint8_t ee_magic1;
+ uint8_t ee_magic2;
+ nvm_via_read_magic(&ee_magic0, &ee_magic1, &ee_magic2);
+
+ return ee_magic0 == magic0 && ee_magic1 == magic1 && ee_magic2 == magic2;
}
// Sets VIA/keyboard level usage of EEPROM to valid/invalid
// Keyboard level code (eg. via_init_kb()) should not call this
void via_eeprom_set_valid(bool valid) {
- char * p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
- uint8_t magic0 = ((p[2] & 0x0F) << 4) | (p[3] & 0x0F);
- uint8_t magic1 = ((p[5] & 0x0F) << 4) | (p[6] & 0x0F);
- uint8_t magic2 = ((p[8] & 0x0F) << 4) | (p[9] & 0x0F);
-
- eeprom_update_byte((void *)VIA_EEPROM_MAGIC_ADDR + 0, valid ? magic0 : 0xFF);
- eeprom_update_byte((void *)VIA_EEPROM_MAGIC_ADDR + 1, valid ? magic1 : 0xFF);
- eeprom_update_byte((void *)VIA_EEPROM_MAGIC_ADDR + 2, valid ? magic2 : 0xFF);
+ if (valid) {
+ char * p = QMK_BUILDDATE; // e.g. "2019-11-05-11:29:54"
+ uint8_t magic0 = ((p[2] & 0x0F) << 4) | (p[3] & 0x0F);
+ uint8_t magic1 = ((p[5] & 0x0F) << 4) | (p[6] & 0x0F);
+ uint8_t magic2 = ((p[8] & 0x0F) << 4) | (p[9] & 0x0F);
+ nvm_via_update_magic(magic0, magic1, magic2);
+ } else {
+ nvm_via_update_magic(0xFF, 0xFF, 0xFF);
+ }
}
// Override this at the keyboard code level to check
@@ -104,6 +111,8 @@ void via_init(void) {
}
void eeconfig_init_via(void) {
+ // Erase any NVM storage if necessary
+ nvm_via_erase();
// set the magic number to false, in case this gets interrupted
via_eeprom_set_valid(false);
// This resets the layout options
@@ -119,29 +128,24 @@ void eeconfig_init_via(void) {
// This is generalized so the layout options EEPROM usage can be
// variable, between 1 and 4 bytes.
uint32_t via_get_layout_options(void) {
- uint32_t value = 0;
- // Start at the most significant byte
- void *source = (void *)(VIA_EEPROM_LAYOUT_OPTIONS_ADDR);
- for (uint8_t i = 0; i < VIA_EEPROM_LAYOUT_OPTIONS_SIZE; i++) {
- value = value << 8;
- value |= eeprom_read_byte(source);
- source++;
- }
- return value;
+ return nvm_via_read_layout_options();
}
__attribute__((weak)) void via_set_layout_options_kb(uint32_t value) {}
void via_set_layout_options(uint32_t value) {
via_set_layout_options_kb(value);
- // Start at the least significant byte
- void *target = (void *)(VIA_EEPROM_LAYOUT_OPTIONS_ADDR + VIA_EEPROM_LAYOUT_OPTIONS_SIZE - 1);
- for (uint8_t i = 0; i < VIA_EEPROM_LAYOUT_OPTIONS_SIZE; i++) {
- eeprom_update_byte(target, value & 0xFF);
- value = value >> 8;
- target--;
- }
+ nvm_via_update_layout_options(value);
+}
+
+#if VIA_EEPROM_CUSTOM_CONFIG_SIZE > 0
+uint32_t via_read_custom_config(void *buf, uint32_t offset, uint32_t length) {
+ return nvm_via_read_custom_config(buf, offset, length);
+}
+uint32_t via_update_custom_config(const void *buf, uint32_t offset, uint32_t length) {
+ return nvm_via_update_custom_config(buf, offset, length);
}
+#endif
#if defined(AUDIO_ENABLE)
float via_device_indication_song[][2] = SONG(STARTUP_SOUND);
@@ -715,7 +719,7 @@ void via_qmk_rgb_matrix_set_value(uint8_t *data) {
}
void via_qmk_rgb_matrix_save(void) {
- eeconfig_update_rgb_matrix();
+ eeconfig_force_flush_rgb_matrix();
}
#endif // RGB_MATRIX_ENABLE
@@ -794,7 +798,7 @@ void via_qmk_led_matrix_set_value(uint8_t *data) {
}
void via_qmk_led_matrix_save(void) {
- eeconfig_update_led_matrix();
+ eeconfig_force_flush_led_matrix();
}
#endif // LED_MATRIX_ENABLE
@@ -861,7 +865,7 @@ void via_qmk_audio_set_value(uint8_t *data) {
}
void via_qmk_audio_save(void) {
- eeconfig_update_audio(audio_config.raw);
+ eeconfig_update_audio(&audio_config);
}
#endif // QMK_AUDIO_ENABLE
diff --git a/quantum/via.h b/quantum/via.h
index 01d4c48b37..9f0eef10f7 100644
--- a/quantum/via.h
+++ b/quantum/via.h
@@ -16,21 +16,8 @@
#pragma once
-#include "eeconfig.h" // for EECONFIG_SIZE
#include "action.h"
-// Keyboard level code can change where VIA stores the magic.
-// The magic is the build date YYMMDD encoded as BCD in 3 bytes,
-// thus installing firmware built on a different date to the one
-// already installed can be detected and the EEPROM data is reset.
-// The only reason this is important is in case EEPROM usage changes
-// and the EEPROM was not explicitly reset by bootmagic lite.
-#ifndef VIA_EEPROM_MAGIC_ADDR
-# define VIA_EEPROM_MAGIC_ADDR (EECONFIG_SIZE)
-#endif
-
-#define VIA_EEPROM_LAYOUT_OPTIONS_ADDR (VIA_EEPROM_MAGIC_ADDR + 3)
-
// Changing the layout options size after release will invalidate EEPROM,
// but this is something that should be set correctly on initial implementation.
// 1 byte is enough for most uses (i.e. 8 binary states, or 6 binary + 1 ternary/quaternary )
@@ -46,17 +33,10 @@
# define VIA_EEPROM_LAYOUT_OPTIONS_DEFAULT 0x00000000
#endif
-// The end of the EEPROM memory used by VIA
-// By default, dynamic keymaps will start at this if there is no
-// custom config
-#define VIA_EEPROM_CUSTOM_CONFIG_ADDR (VIA_EEPROM_LAYOUT_OPTIONS_ADDR + VIA_EEPROM_LAYOUT_OPTIONS_SIZE)
-
#ifndef VIA_EEPROM_CUSTOM_CONFIG_SIZE
# define VIA_EEPROM_CUSTOM_CONFIG_SIZE 0
#endif
-#define VIA_EEPROM_CONFIG_END (VIA_EEPROM_CUSTOM_CONFIG_ADDR + VIA_EEPROM_CUSTOM_CONFIG_SIZE)
-
// This is changed only when the command IDs change,
// so VIA Configurator can detect compatible firmware.
#define VIA_PROTOCOL_VERSION 0x000C
@@ -160,6 +140,11 @@ uint32_t via_get_layout_options(void);
void via_set_layout_options(uint32_t value);
void via_set_layout_options_kb(uint32_t value);
+#if VIA_EEPROM_CUSTOM_CONFIG_SIZE > 0
+uint32_t via_read_custom_config(void *buf, uint32_t offset, uint32_t length);
+uint32_t via_update_custom_config(const void *buf, uint32_t offset, uint32_t length);
+#endif
+
// Used by VIA to tell a device to flash LEDs (or do something else) when that
// device becomes the active device being configured, on startup or switching
// between devices.
@@ -202,4 +187,4 @@ void via_qmk_audio_command(uint8_t *data, uint8_t length);
void via_qmk_audio_set_value(uint8_t *data);
void via_qmk_audio_get_value(uint8_t *data);
void via_qmk_audio_save(void);
-#endif \ No newline at end of file
+#endif
diff --git a/quantum/wear_leveling/tests/rules.mk b/quantum/wear_leveling/tests/rules.mk
index 4d7a964049..f5f36e5b6e 100644
--- a/quantum/wear_leveling/tests/rules.mk
+++ b/quantum/wear_leveling/tests/rules.mk
@@ -63,4 +63,4 @@ wear_leveling_8byte_SRC := \
$(wear_leveling_common_SRC) \
$(QUANTUM_PATH)/wear_leveling/tests/wear_leveling_8byte.cpp
wear_leveling_8byte_INC := \
- $(wear_leveling_common_INC) \ No newline at end of file
+ $(wear_leveling_common_INC)
diff --git a/readme.md b/readme.md
index 62aed12066..e5c0d41b7b 100644
--- a/readme.md
+++ b/readme.md
@@ -1,3 +1,7 @@
+# THIS IS THE DEVELOP BRANCH
+
+Warning- This is the `develop` branch of QMK Firmware. You may encounter broken code here. Please see [Breaking Changes](https://docs.qmk.fm/#/breaking_changes) for more information.
+
# Quantum Mechanical Keyboard Firmware
[![Current Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags)
diff --git a/requirements.txt b/requirements.txt
index fbee51ee57..68b05d64e6 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,7 +6,7 @@ dotty-dict
hid
hjson
jsonschema>=4
-milc>=1.4.2
+milc>=1.9.0
pygments
pyserial
pyusb
diff --git a/tests/basic/test_keycode_util.cpp b/tests/basic/test_keycode_util.cpp
deleted file mode 100644
index 693334676e..0000000000
--- a/tests/basic/test_keycode_util.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2022 Stefan Kerkmann
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#include "test_common.hpp"
-
-class KeycodeToIdentifierSuite : public ::testing::TestWithParam<std::pair<std::uint16_t, std::string>> {};
-
-TEST_P(KeycodeToIdentifierSuite, ConversionTests) {
- ASSERT_EQ(get_keycode_identifier_or_default(GetParam().first), GetParam().second);
-}
-
-INSTANTIATE_TEST_CASE_P(ConversionTestsP, KeycodeToIdentifierSuite,
- // clang-format off
-::testing::Values(
- // Goto layer
- std::make_pair(TO(0), "TO(0)"),
- std::make_pair(TO(0x1F), "TO(31)"),
- // Momentary switch layer
- std::make_pair(MO(0), "MO(0)"),
- std::make_pair(MO(0x1F), "MO(31)"),
- // Set default layer
- std::make_pair(DF(0), "DF(0)"),
- std::make_pair(DF(0x1F), "DF(31)"),
- // Toggle layer
- std::make_pair(TG(0), "TG(0)"),
- std::make_pair(TG(0x1F), "TG(31)"),
- // One-shot layer
- std::make_pair(OSL(0), "OSL(0)"),
- std::make_pair(OSL(0x1F), "OSL(31)"),
- // One-shot mod
- std::make_pair(OSM(MOD_LSFT), "OSM(MOD_LSFT)"),
- std::make_pair(OSM(MOD_LSFT | MOD_LCTL), "OSM(MOD_LCTL | MOD_LSFT)"),
- // Layer Mod
- std::make_pair(LM(0, MOD_LSFT), "LM(0, MOD_LSFT)"),
- std::make_pair(LM(0xF, MOD_LSFT), "LM(15, MOD_LSFT)"),
- std::make_pair(LM(0xF, MOD_LSFT | MOD_LCTL), "LM(15, MOD_LCTL | MOD_LSFT)"),
- // Layer tap toggle
- std::make_pair(TT(0), "TT(0)"),
- std::make_pair(TT(0x1F), "TT(31)"),
- // Layer tap
- std::make_pair(LT(0, KC_A), "LT(0, KC_A)"),
- std::make_pair(LT(0xF, KC_SPACE), "LT(15, KC_SPACE)"),
- std::make_pair(LT(1, KC_SPC), "LT(1, KC_SPACE)"),
- // Mod tap
- std::make_pair(MT(MOD_LCTL, KC_A), "MT(MOD_LCTL, KC_A)"),
- std::make_pair(MT(MOD_LCTL | MOD_LSFT, KC_A), "MT(MOD_LCTL | MOD_LSFT, KC_A)"),
- std::make_pair(ALT_T(KC_TAB), "MT(MOD_LALT, KC_TAB)"),
- // Mods
- std::make_pair(LCTL(KC_A), "QK_MODS(KC_A, QK_LCTL)"),
- std::make_pair(HYPR(KC_SPACE), "QK_MODS(KC_SPACE, QK_LCTL | QK_LSFT | QK_LALT | QK_LGUI)")
-));
-// clang-format on
diff --git a/tests/basic/test_one_shot_keys.cpp b/tests/basic/test_one_shot_keys.cpp
index 92db52f811..4784c86694 100644
--- a/tests/basic/test_one_shot_keys.cpp
+++ b/tests/basic/test_one_shot_keys.cpp
@@ -686,4 +686,4 @@ TEST_F(OneShot, OSLWithLongModTapKeyAndRegularKey) {
regular_key.release();
run_one_scan_loop();
VERIFY_AND_CLEAR(driver);
-} \ No newline at end of file
+}
diff --git a/tests/combo/combo_repress/test_combo.cpp b/tests/combo/combo_repress/test_combo.cpp
index 1488d5c1bd..b1a2d36cb3 100644
--- a/tests/combo/combo_repress/test_combo.cpp
+++ b/tests/combo/combo_repress/test_combo.cpp
@@ -2,9 +2,9 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include "keyboard_report_util.hpp"
-#include "quantum.h"
#include "keycode.h"
#include "test_common.h"
+#include "test_common.hpp"
#include "test_driver.hpp"
#include "test_fixture.hpp"
#include "test_keymap_key.hpp"
diff --git a/tests/combo/test_combo.cpp b/tests/combo/test_combo.cpp
index ac852f9d16..d78ec55990 100644
--- a/tests/combo/test_combo.cpp
+++ b/tests/combo/test_combo.cpp
@@ -3,7 +3,6 @@
// SPDX-License-Identifier: GPL-2.0-or-later
#include "keyboard_report_util.hpp"
-#include "quantum.h"
#include "keycode.h"
#include "test_common.h"
#include "test_driver.hpp"
diff --git a/keyboards/xelus/valor_frl_tkl/rev2_1/config.h b/tests/keycode_string/config.h
index b085b99d88..7fc76d7c2e 100644
--- a/keyboards/xelus/valor_frl_tkl/rev2_1/config.h
+++ b/tests/keycode_string/config.h
@@ -1,4 +1,4 @@
-/* Copyright 2022 Harrison Chan (Xelus)
+/* Copyright 2017 Fred Sundvik
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -16,4 +16,4 @@
#pragma once
-#define STM32_HSECLK 16000000
+#include "test_common.h"
diff --git a/tests/keycode_string/test.mk b/tests/keycode_string/test.mk
new file mode 100644
index 0000000000..aa255a1b6b
--- /dev/null
+++ b/tests/keycode_string/test.mk
@@ -0,0 +1,22 @@
+# Copyright 2025 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+EXTRAKEY_ENABLE = yes
+KEYCODE_STRING_ENABLE = yes
+KEY_LOCK_ENABLE = yes
+MAGIC_ENABLE = yes
+MOUSEKEY_ENABLE = yes
+PROGRAMMABLE_BUTTON_ENABLE = yes
+SECURE_ENABLE = yes
+SWAP_HANDS_ENABLE = yes
diff --git a/tests/keycode_string/test_keycode_string.cpp b/tests/keycode_string/test_keycode_string.cpp
new file mode 100644
index 0000000000..e1dec70e7a
--- /dev/null
+++ b/tests/keycode_string/test_keycode_string.cpp
@@ -0,0 +1,153 @@
+// Copyright 2025 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include <iostream>
+
+#include "test_common.hpp"
+
+enum {
+ MYMACRO1 = SAFE_RANGE,
+ MYMACRO2,
+};
+
+// clang-format off
+extern "C" {
+
+KEYCODE_STRING_NAMES_KB(
+ KEYCODE_STRING_NAME(MYMACRO1),
+);
+
+KEYCODE_STRING_NAMES_USER(
+ KEYCODE_STRING_NAME(MYMACRO2),
+ KEYCODE_STRING_NAME(KC_EXLM),
+);
+
+const keypos_t PROGMEM hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
+ {{9, 0}, {8, 0}, {7, 0}, {6, 0}, {5, 0}, {4, 0}, {3, 0}, {2, 0}, {1, 0}, {0, 0}},
+ {{9, 1}, {8, 1}, {7, 1}, {6, 1}, {5, 1}, {4, 1}, {3, 1}, {2, 1}, {1, 1}, {0, 1}},
+ {{9, 2}, {8, 2}, {7, 2}, {6, 2}, {5, 2}, {4, 2}, {3, 2}, {2, 2}, {1, 2}, {0, 2}},
+ {{9, 3}, {8, 3}, {7, 3}, {6, 3}, {5, 3}, {4, 3}, {3, 3}, {2, 3}, {1, 3}, {0, 3}},
+};
+
+} // extern "C"
+// clang-format on
+
+class KeycodeStringTest : public TestFixture {};
+
+TEST_F(KeycodeStringTest, get_keycode_string) {
+ struct TestParams {
+ uint16_t keycode;
+ std::string expected;
+ };
+ for (const auto [keycode, expected] : std::vector<TestParams>({
+ {KC_TRNS, "KC_TRNS"},
+ {KC_ESC, "KC_ESC"},
+ {KC_A, "KC_A"},
+ {KC_Z, "KC_Z"},
+ {KC_0, "KC_0"},
+ {KC_9, "KC_9"},
+ {KC_KP_0, "KC_KP_0"},
+ {KC_KP_9, "KC_KP_9"},
+ {KC_LBRC, "KC_LBRC"},
+ {KC_NUHS, "KC_NUHS"},
+ {KC_NUBS, "KC_NUBS"},
+ {KC_CAPS, "KC_CAPS"},
+ {DB_TOGG, "DB_TOGG"},
+ {KC_LCTL, "KC_LCTL"},
+ {KC_LSFT, "KC_LSFT"},
+ {KC_RALT, "KC_RALT"},
+ {KC_RGUI, "KC_RGUI"},
+ {KC_UP, "KC_UP"},
+ {KC_HYPR, "KC_HYPR"},
+ {KC_MEH, "KC_MEH"},
+ // F1-F24 keycodes.
+ {KC_F1, "KC_F1"},
+ {KC_F12, "KC_F12"},
+ {KC_F13, "KC_F13"},
+ {KC_F24, "KC_F24"},
+ // Macro keycodes.
+ {MC_0, "MC_0"},
+ {MC_31, "MC_31"},
+ // Keyboard range keycodes.
+ {QK_KB_0, "QK_KB_0"},
+ {QK_KB_31, "QK_KB_31"},
+ // User range keycodes.
+ {QK_USER_2, "QK_USER_2"},
+ {QK_USER_31, "QK_USER_31"},
+ // Modified keycodes.
+ {KC_COLN, "S(KC_SCLN)"},
+ {C(KC_PGUP), "C(KC_PGUP)"},
+ {RALT(KC_BSPC), "RALT(KC_BSPC)"},
+ // One-shot mods.
+ {OSM(MOD_LSFT), "OSM(MOD_LSFT)"},
+ {OSM(MOD_RGUI), "OSM(MOD_RGUI)"},
+ {OSM(MOD_RCTL | MOD_RGUI), "OSM(0x19)"},
+ // Layer switch keycodes.
+ {DF(2), "DF(2)"},
+ {PDF(12), "PDF(12)"},
+ {MO(3), "MO(3)"},
+ {TO(0), "TO(0)"},
+ {TT(1), "TT(1)"},
+ {TG(3), "TG(3)"},
+ {OSL(3), "OSL(3)"},
+ {LM(3, MOD_RALT), "LM(3,MOD_RALT)"},
+ {LT(15, KC_QUOT), "LT(15,KC_QUOT)"},
+ // Tap dance keycodes.
+ {TD(0), "TD(0)"},
+ {TD(31), "TD(31)"},
+ // Mod-tap keycodes.
+ {LSFT_T(KC_ENT), "LSFT_T(KC_ENT)"},
+ {RCTL_T(KC_RGHT), "RCTL_T(KC_RGHT)"},
+ {HYPR_T(KC_GRV), "HYPR_T(KC_GRV)"},
+ {MEH_T(KC_EQL), "MEH_T(KC_EQL)"},
+ {RSA_T(KC_LBRC), "MT(0x16,KC_LBRC)"},
+ // Extrakey keycodes.
+ {KC_WBAK, "KC_WBAK"},
+ {KC_WFWD, "KC_WFWD"},
+ {KC_WREF, "KC_WREF"},
+ {KC_VOLU, "KC_VOLU"},
+ {KC_VOLD, "KC_VOLD"},
+ // Mouse Key keycodes.
+ {MS_LEFT, "MS_LEFT"},
+ {MS_RGHT, "MS_RGHT"},
+ {MS_UP, "MS_UP"},
+ {MS_WHLU, "MS_WHLU"},
+ {MS_WHLD, "MS_WHLD"},
+ {MS_BTN1, "MS_BTN1"},
+ {MS_BTN8, "MS_BTN8"},
+ // Swap Hands keycodes.
+ {SH_MON, "SH_MON"},
+ {SH_TOGG, "SH_TOGG"},
+ {SH_T(KC_PSCR), "SH_T(KC_PSCR)"},
+ // Secure keycodes.
+ {SE_LOCK, "SE_LOCK"},
+ {SE_UNLK, "SE_UNLK"},
+ {SE_TOGG, "SE_TOGG"},
+ {SE_REQ, "SE_REQ"},
+ // Programmable button keycodes.
+ {PB_1, "PB_1"},
+ {PB_32, "PB_32"},
+ // Magic button keycodes.
+ {QK_MAGIC + 7, "QK_MAGIC+7"},
+ // Quantum keycodes.
+ {QK_LOCK, "QK_LOCK"},
+ {QK_QUANTUM + 7, "QK_QUANTUM+7"},
+ // Custom keycode names.
+ {MYMACRO1, "MYMACRO1"},
+ {MYMACRO2, "MYMACRO2"},
+ {KC_EXLM, "KC_EXLM"},
+ })) {
+ EXPECT_EQ(get_keycode_string(keycode), expected) << "where keycode = 0x" << std::hex << keycode;
+ }
+}
diff --git a/tests/no_tapping/no_action_tapping/test.mk b/tests/no_tapping/no_action_tapping/test.mk
index 29690d1adf..6ec384609c 100644
--- a/tests/no_tapping/no_action_tapping/test.mk
+++ b/tests/no_tapping/no_action_tapping/test.mk
@@ -15,4 +15,4 @@
# --------------------------------------------------------------------------------
# Keep this file, even if it is empty, as a marker that this folder contains tests
-# -------------------------------------------------------------------------------- \ No newline at end of file
+# --------------------------------------------------------------------------------
diff --git a/tests/no_tapping/no_mod_tap_mods/test.mk b/tests/no_tapping/no_mod_tap_mods/test.mk
index 29690d1adf..6ec384609c 100644
--- a/tests/no_tapping/no_mod_tap_mods/test.mk
+++ b/tests/no_tapping/no_mod_tap_mods/test.mk
@@ -15,4 +15,4 @@
# --------------------------------------------------------------------------------
# Keep this file, even if it is empty, as a marker that this folder contains tests
-# -------------------------------------------------------------------------------- \ No newline at end of file
+# --------------------------------------------------------------------------------
diff --git a/tests/repeat_key/alt_repeat_key/test_alt_repeat_key.cpp b/tests/repeat_key/alt_repeat_key/test_alt_repeat_key.cpp
index ae525acb45..e2eed3dbb6 100644
--- a/tests/repeat_key/alt_repeat_key/test_alt_repeat_key.cpp
+++ b/tests/repeat_key/alt_repeat_key/test_alt_repeat_key.cpp
@@ -210,7 +210,7 @@ TEST_F(AltRepeatKey, GetAltRepeatKeyKeycode) {
{MO(1), 0, KC_NO},
// clang-format on
})) {
- SCOPED_TRACE(std::string("Input keycode: ") + get_keycode_identifier_or_default(params.keycode));
+ SCOPED_TRACE(std::string("Input keycode: ") + get_keycode_string(params.keycode));
set_last_keycode(params.keycode);
set_last_mods(params.mods);
diff --git a/tests/test_common/build.mk b/tests/test_common/build.mk
index d7423bc78a..385da7adf9 100644
--- a/tests/test_common/build.mk
+++ b/tests/test_common/build.mk
@@ -14,3 +14,4 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
CUSTOM_MATRIX=yes
+KEYCODE_STRING_ENABLE = yes
diff --git a/tests/test_common/keyboard_report_util.cpp b/tests/test_common/keyboard_report_util.cpp
index 18e0574277..5e40323669 100644
--- a/tests/test_common/keyboard_report_util.cpp
+++ b/tests/test_common/keyboard_report_util.cpp
@@ -19,6 +19,10 @@
#include <vector>
#include <algorithm>
+extern "C" {
+#include "keycode_string.h"
+}
+
using namespace testing;
extern std::map<uint16_t, std::string> KEYCODE_ID_TABLE;
@@ -72,7 +76,7 @@ std::ostream& operator<<(std::ostream& os, const report_keyboard_t& report) {
os << "(";
for (auto key = keys.cbegin(); key != keys.cend();) {
- os << KEYCODE_ID_TABLE.at(*key);
+ os << get_keycode_string(*key);
key++;
if (key != keys.cend()) {
os << ", ";
@@ -82,7 +86,7 @@ std::ostream& operator<<(std::ostream& os, const report_keyboard_t& report) {
os << ") [";
for (auto mod = mods.cbegin(); mod != mods.cend();) {
- os << KEYCODE_ID_TABLE.at(*mod);
+ os << get_keycode_string(*mod);
mod++;
if (mod != mods.cend()) {
os << ", ";
diff --git a/tests/test_common/keycode_table.cpp b/tests/test_common/keycode_table.cpp
deleted file mode 100644
index 26d0919619..0000000000
--- a/tests/test_common/keycode_table.cpp
+++ /dev/null
@@ -1,767 +0,0 @@
-// Copyright 2025 QMK
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-/*******************************************************************************
- 88888888888 888 d8b .d888 d8b 888 d8b
- 888 888 Y8P d88P" Y8P 888 Y8P
- 888 888 888 888
- 888 88888b. 888 .d8888b 888888 888 888 .d88b. 888 .d8888b
- 888 888 "88b 888 88K 888 888 888 d8P Y8b 888 88K
- 888 888 888 888 "Y8888b. 888 888 888 88888888 888 "Y8888b.
- 888 888 888 888 X88 888 888 888 Y8b. 888 X88
- 888 888 888 888 88888P' 888 888 888 "Y8888 888 88888P'
- 888 888
- 888 888
- 888 888
- .d88b. .d88b. 88888b. .d88b. 888d888 8888b. 888888 .d88b. .d88888
- d88P"88b d8P Y8b 888 "88b d8P Y8b 888P" "88b 888 d8P Y8b d88" 888
- 888 888 88888888 888 888 88888888 888 .d888888 888 88888888 888 888
- Y88b 888 Y8b. 888 888 Y8b. 888 888 888 Y88b. Y8b. Y88b 888
- "Y88888 "Y8888 888 888 "Y8888 888 "Y888888 "Y888 "Y8888 "Y88888
- 888
- Y8b d88P
- "Y88P"
-*******************************************************************************/
-
-// clang-format off
-extern "C" {
-#include <keycode.h>
-}
-#include <map>
-#include <string>
-#include <cstdint>
-
-std::map<uint16_t, std::string> KEYCODE_ID_TABLE = {
- {KC_NO, "KC_NO"},
- {KC_TRANSPARENT, "KC_TRANSPARENT"},
- {KC_A, "KC_A"},
- {KC_B, "KC_B"},
- {KC_C, "KC_C"},
- {KC_D, "KC_D"},
- {KC_E, "KC_E"},
- {KC_F, "KC_F"},
- {KC_G, "KC_G"},
- {KC_H, "KC_H"},
- {KC_I, "KC_I"},
- {KC_J, "KC_J"},
- {KC_K, "KC_K"},
- {KC_L, "KC_L"},
- {KC_M, "KC_M"},
- {KC_N, "KC_N"},
- {KC_O, "KC_O"},
- {KC_P, "KC_P"},
- {KC_Q, "KC_Q"},
- {KC_R, "KC_R"},
- {KC_S, "KC_S"},
- {KC_T, "KC_T"},
- {KC_U, "KC_U"},
- {KC_V, "KC_V"},
- {KC_W, "KC_W"},
- {KC_X, "KC_X"},
- {KC_Y, "KC_Y"},
- {KC_Z, "KC_Z"},
- {KC_1, "KC_1"},
- {KC_2, "KC_2"},
- {KC_3, "KC_3"},
- {KC_4, "KC_4"},
- {KC_5, "KC_5"},
- {KC_6, "KC_6"},
- {KC_7, "KC_7"},
- {KC_8, "KC_8"},
- {KC_9, "KC_9"},
- {KC_0, "KC_0"},
- {KC_ENTER, "KC_ENTER"},
- {KC_ESCAPE, "KC_ESCAPE"},
- {KC_BACKSPACE, "KC_BACKSPACE"},
- {KC_TAB, "KC_TAB"},
- {KC_SPACE, "KC_SPACE"},
- {KC_MINUS, "KC_MINUS"},
- {KC_EQUAL, "KC_EQUAL"},
- {KC_LEFT_BRACKET, "KC_LEFT_BRACKET"},
- {KC_RIGHT_BRACKET, "KC_RIGHT_BRACKET"},
- {KC_BACKSLASH, "KC_BACKSLASH"},
- {KC_NONUS_HASH, "KC_NONUS_HASH"},
- {KC_SEMICOLON, "KC_SEMICOLON"},
- {KC_QUOTE, "KC_QUOTE"},
- {KC_GRAVE, "KC_GRAVE"},
- {KC_COMMA, "KC_COMMA"},
- {KC_DOT, "KC_DOT"},
- {KC_SLASH, "KC_SLASH"},
- {KC_CAPS_LOCK, "KC_CAPS_LOCK"},
- {KC_F1, "KC_F1"},
- {KC_F2, "KC_F2"},
- {KC_F3, "KC_F3"},
- {KC_F4, "KC_F4"},
- {KC_F5, "KC_F5"},
- {KC_F6, "KC_F6"},
- {KC_F7, "KC_F7"},
- {KC_F8, "KC_F8"},
- {KC_F9, "KC_F9"},
- {KC_F10, "KC_F10"},
- {KC_F11, "KC_F11"},
- {KC_F12, "KC_F12"},
- {KC_PRINT_SCREEN, "KC_PRINT_SCREEN"},
- {KC_SCROLL_LOCK, "KC_SCROLL_LOCK"},
- {KC_PAUSE, "KC_PAUSE"},
- {KC_INSERT, "KC_INSERT"},
- {KC_HOME, "KC_HOME"},
- {KC_PAGE_UP, "KC_PAGE_UP"},
- {KC_DELETE, "KC_DELETE"},
- {KC_END, "KC_END"},
- {KC_PAGE_DOWN, "KC_PAGE_DOWN"},
- {KC_RIGHT, "KC_RIGHT"},
- {KC_LEFT, "KC_LEFT"},
- {KC_DOWN, "KC_DOWN"},
- {KC_UP, "KC_UP"},
- {KC_NUM_LOCK, "KC_NUM_LOCK"},
- {KC_KP_SLASH, "KC_KP_SLASH"},
- {KC_KP_ASTERISK, "KC_KP_ASTERISK"},
- {KC_KP_MINUS, "KC_KP_MINUS"},
- {KC_KP_PLUS, "KC_KP_PLUS"},
- {KC_KP_ENTER, "KC_KP_ENTER"},
- {KC_KP_1, "KC_KP_1"},
- {KC_KP_2, "KC_KP_2"},
- {KC_KP_3, "KC_KP_3"},
- {KC_KP_4, "KC_KP_4"},
- {KC_KP_5, "KC_KP_5"},
- {KC_KP_6, "KC_KP_6"},
- {KC_KP_7, "KC_KP_7"},
- {KC_KP_8, "KC_KP_8"},
- {KC_KP_9, "KC_KP_9"},
- {KC_KP_0, "KC_KP_0"},
- {KC_KP_DOT, "KC_KP_DOT"},
- {KC_NONUS_BACKSLASH, "KC_NONUS_BACKSLASH"},
- {KC_APPLICATION, "KC_APPLICATION"},
- {KC_KB_POWER, "KC_KB_POWER"},
- {KC_KP_EQUAL, "KC_KP_EQUAL"},
- {KC_F13, "KC_F13"},
- {KC_F14, "KC_F14"},
- {KC_F15, "KC_F15"},
- {KC_F16, "KC_F16"},
- {KC_F17, "KC_F17"},
- {KC_F18, "KC_F18"},
- {KC_F19, "KC_F19"},
- {KC_F20, "KC_F20"},
- {KC_F21, "KC_F21"},
- {KC_F22, "KC_F22"},
- {KC_F23, "KC_F23"},
- {KC_F24, "KC_F24"},
- {KC_EXECUTE, "KC_EXECUTE"},
- {KC_HELP, "KC_HELP"},
- {KC_MENU, "KC_MENU"},
- {KC_SELECT, "KC_SELECT"},
- {KC_STOP, "KC_STOP"},
- {KC_AGAIN, "KC_AGAIN"},
- {KC_UNDO, "KC_UNDO"},
- {KC_CUT, "KC_CUT"},
- {KC_COPY, "KC_COPY"},
- {KC_PASTE, "KC_PASTE"},
- {KC_FIND, "KC_FIND"},
- {KC_KB_MUTE, "KC_KB_MUTE"},
- {KC_KB_VOLUME_UP, "KC_KB_VOLUME_UP"},
- {KC_KB_VOLUME_DOWN, "KC_KB_VOLUME_DOWN"},
- {KC_LOCKING_CAPS_LOCK, "KC_LOCKING_CAPS_LOCK"},
- {KC_LOCKING_NUM_LOCK, "KC_LOCKING_NUM_LOCK"},
- {KC_LOCKING_SCROLL_LOCK, "KC_LOCKING_SCROLL_LOCK"},
- {KC_KP_COMMA, "KC_KP_COMMA"},
- {KC_KP_EQUAL_AS400, "KC_KP_EQUAL_AS400"},
- {KC_INTERNATIONAL_1, "KC_INTERNATIONAL_1"},
- {KC_INTERNATIONAL_2, "KC_INTERNATIONAL_2"},
- {KC_INTERNATIONAL_3, "KC_INTERNATIONAL_3"},
- {KC_INTERNATIONAL_4, "KC_INTERNATIONAL_4"},
- {KC_INTERNATIONAL_5, "KC_INTERNATIONAL_5"},
- {KC_INTERNATIONAL_6, "KC_INTERNATIONAL_6"},
- {KC_INTERNATIONAL_7, "KC_INTERNATIONAL_7"},
- {KC_INTERNATIONAL_8, "KC_INTERNATIONAL_8"},
- {KC_INTERNATIONAL_9, "KC_INTERNATIONAL_9"},
- {KC_LANGUAGE_1, "KC_LANGUAGE_1"},
- {KC_LANGUAGE_2, "KC_LANGUAGE_2"},
- {KC_LANGUAGE_3, "KC_LANGUAGE_3"},
- {KC_LANGUAGE_4, "KC_LANGUAGE_4"},
- {KC_LANGUAGE_5, "KC_LANGUAGE_5"},
- {KC_LANGUAGE_6, "KC_LANGUAGE_6"},
- {KC_LANGUAGE_7, "KC_LANGUAGE_7"},
- {KC_LANGUAGE_8, "KC_LANGUAGE_8"},
- {KC_LANGUAGE_9, "KC_LANGUAGE_9"},
- {KC_ALTERNATE_ERASE, "KC_ALTERNATE_ERASE"},
- {KC_SYSTEM_REQUEST, "KC_SYSTEM_REQUEST"},
- {KC_CANCEL, "KC_CANCEL"},
- {KC_CLEAR, "KC_CLEAR"},
- {KC_PRIOR, "KC_PRIOR"},
- {KC_RETURN, "KC_RETURN"},
- {KC_SEPARATOR, "KC_SEPARATOR"},
- {KC_OUT, "KC_OUT"},
- {KC_OPER, "KC_OPER"},
- {KC_CLEAR_AGAIN, "KC_CLEAR_AGAIN"},
- {KC_CRSEL, "KC_CRSEL"},
- {KC_EXSEL, "KC_EXSEL"},
- {KC_SYSTEM_POWER, "KC_SYSTEM_POWER"},
- {KC_SYSTEM_SLEEP, "KC_SYSTEM_SLEEP"},
- {KC_SYSTEM_WAKE, "KC_SYSTEM_WAKE"},
- {KC_AUDIO_MUTE, "KC_AUDIO_MUTE"},
- {KC_AUDIO_VOL_UP, "KC_AUDIO_VOL_UP"},
- {KC_AUDIO_VOL_DOWN, "KC_AUDIO_VOL_DOWN"},
- {KC_MEDIA_NEXT_TRACK, "KC_MEDIA_NEXT_TRACK"},
- {KC_MEDIA_PREV_TRACK, "KC_MEDIA_PREV_TRACK"},
- {KC_MEDIA_STOP, "KC_MEDIA_STOP"},
- {KC_MEDIA_PLAY_PAUSE, "KC_MEDIA_PLAY_PAUSE"},
- {KC_MEDIA_SELECT, "KC_MEDIA_SELECT"},
- {KC_MEDIA_EJECT, "KC_MEDIA_EJECT"},
- {KC_MAIL, "KC_MAIL"},
- {KC_CALCULATOR, "KC_CALCULATOR"},
- {KC_MY_COMPUTER, "KC_MY_COMPUTER"},
- {KC_WWW_SEARCH, "KC_WWW_SEARCH"},
- {KC_WWW_HOME, "KC_WWW_HOME"},
- {KC_WWW_BACK, "KC_WWW_BACK"},
- {KC_WWW_FORWARD, "KC_WWW_FORWARD"},
- {KC_WWW_STOP, "KC_WWW_STOP"},
- {KC_WWW_REFRESH, "KC_WWW_REFRESH"},
- {KC_WWW_FAVORITES, "KC_WWW_FAVORITES"},
- {KC_MEDIA_FAST_FORWARD, "KC_MEDIA_FAST_FORWARD"},
- {KC_MEDIA_REWIND, "KC_MEDIA_REWIND"},
- {KC_BRIGHTNESS_UP, "KC_BRIGHTNESS_UP"},
- {KC_BRIGHTNESS_DOWN, "KC_BRIGHTNESS_DOWN"},
- {KC_CONTROL_PANEL, "KC_CONTROL_PANEL"},
- {KC_ASSISTANT, "KC_ASSISTANT"},
- {KC_MISSION_CONTROL, "KC_MISSION_CONTROL"},
- {KC_LAUNCHPAD, "KC_LAUNCHPAD"},
- {QK_MOUSE_CURSOR_UP, "QK_MOUSE_CURSOR_UP"},
- {QK_MOUSE_CURSOR_DOWN, "QK_MOUSE_CURSOR_DOWN"},
- {QK_MOUSE_CURSOR_LEFT, "QK_MOUSE_CURSOR_LEFT"},
- {QK_MOUSE_CURSOR_RIGHT, "QK_MOUSE_CURSOR_RIGHT"},
- {QK_MOUSE_BUTTON_1, "QK_MOUSE_BUTTON_1"},
- {QK_MOUSE_BUTTON_2, "QK_MOUSE_BUTTON_2"},
- {QK_MOUSE_BUTTON_3, "QK_MOUSE_BUTTON_3"},
- {QK_MOUSE_BUTTON_4, "QK_MOUSE_BUTTON_4"},
- {QK_MOUSE_BUTTON_5, "QK_MOUSE_BUTTON_5"},
- {QK_MOUSE_BUTTON_6, "QK_MOUSE_BUTTON_6"},
- {QK_MOUSE_BUTTON_7, "QK_MOUSE_BUTTON_7"},
- {QK_MOUSE_BUTTON_8, "QK_MOUSE_BUTTON_8"},
- {QK_MOUSE_WHEEL_UP, "QK_MOUSE_WHEEL_UP"},
- {QK_MOUSE_WHEEL_DOWN, "QK_MOUSE_WHEEL_DOWN"},
- {QK_MOUSE_WHEEL_LEFT, "QK_MOUSE_WHEEL_LEFT"},
- {QK_MOUSE_WHEEL_RIGHT, "QK_MOUSE_WHEEL_RIGHT"},
- {QK_MOUSE_ACCELERATION_0, "QK_MOUSE_ACCELERATION_0"},
- {QK_MOUSE_ACCELERATION_1, "QK_MOUSE_ACCELERATION_1"},
- {QK_MOUSE_ACCELERATION_2, "QK_MOUSE_ACCELERATION_2"},
- {KC_LEFT_CTRL, "KC_LEFT_CTRL"},
- {KC_LEFT_SHIFT, "KC_LEFT_SHIFT"},
- {KC_LEFT_ALT, "KC_LEFT_ALT"},
- {KC_LEFT_GUI, "KC_LEFT_GUI"},
- {KC_RIGHT_CTRL, "KC_RIGHT_CTRL"},
- {KC_RIGHT_SHIFT, "KC_RIGHT_SHIFT"},
- {KC_RIGHT_ALT, "KC_RIGHT_ALT"},
- {KC_RIGHT_GUI, "KC_RIGHT_GUI"},
- {QK_SWAP_HANDS_TOGGLE, "QK_SWAP_HANDS_TOGGLE"},
- {QK_SWAP_HANDS_TAP_TOGGLE, "QK_SWAP_HANDS_TAP_TOGGLE"},
- {QK_SWAP_HANDS_MOMENTARY_ON, "QK_SWAP_HANDS_MOMENTARY_ON"},
- {QK_SWAP_HANDS_MOMENTARY_OFF, "QK_SWAP_HANDS_MOMENTARY_OFF"},
- {QK_SWAP_HANDS_OFF, "QK_SWAP_HANDS_OFF"},
- {QK_SWAP_HANDS_ON, "QK_SWAP_HANDS_ON"},
- {QK_SWAP_HANDS_ONE_SHOT, "QK_SWAP_HANDS_ONE_SHOT"},
- {QK_MAGIC_SWAP_CONTROL_CAPS_LOCK, "QK_MAGIC_SWAP_CONTROL_CAPS_LOCK"},
- {QK_MAGIC_UNSWAP_CONTROL_CAPS_LOCK, "QK_MAGIC_UNSWAP_CONTROL_CAPS_LOCK"},
- {QK_MAGIC_TOGGLE_CONTROL_CAPS_LOCK, "QK_MAGIC_TOGGLE_CONTROL_CAPS_LOCK"},
- {QK_MAGIC_CAPS_LOCK_AS_CONTROL_OFF, "QK_MAGIC_CAPS_LOCK_AS_CONTROL_OFF"},
- {QK_MAGIC_CAPS_LOCK_AS_CONTROL_ON, "QK_MAGIC_CAPS_LOCK_AS_CONTROL_ON"},
- {QK_MAGIC_SWAP_LALT_LGUI, "QK_MAGIC_SWAP_LALT_LGUI"},
- {QK_MAGIC_UNSWAP_LALT_LGUI, "QK_MAGIC_UNSWAP_LALT_LGUI"},
- {QK_MAGIC_SWAP_RALT_RGUI, "QK_MAGIC_SWAP_RALT_RGUI"},
- {QK_MAGIC_UNSWAP_RALT_RGUI, "QK_MAGIC_UNSWAP_RALT_RGUI"},
- {QK_MAGIC_GUI_ON, "QK_MAGIC_GUI_ON"},
- {QK_MAGIC_GUI_OFF, "QK_MAGIC_GUI_OFF"},
- {QK_MAGIC_TOGGLE_GUI, "QK_MAGIC_TOGGLE_GUI"},
- {QK_MAGIC_SWAP_GRAVE_ESC, "QK_MAGIC_SWAP_GRAVE_ESC"},
- {QK_MAGIC_UNSWAP_GRAVE_ESC, "QK_MAGIC_UNSWAP_GRAVE_ESC"},
- {QK_MAGIC_SWAP_BACKSLASH_BACKSPACE, "QK_MAGIC_SWAP_BACKSLASH_BACKSPACE"},
- {QK_MAGIC_UNSWAP_BACKSLASH_BACKSPACE, "QK_MAGIC_UNSWAP_BACKSLASH_BACKSPACE"},
- {QK_MAGIC_TOGGLE_BACKSLASH_BACKSPACE, "QK_MAGIC_TOGGLE_BACKSLASH_BACKSPACE"},
- {QK_MAGIC_NKRO_ON, "QK_MAGIC_NKRO_ON"},
- {QK_MAGIC_NKRO_OFF, "QK_MAGIC_NKRO_OFF"},
- {QK_MAGIC_TOGGLE_NKRO, "QK_MAGIC_TOGGLE_NKRO"},
- {QK_MAGIC_SWAP_ALT_GUI, "QK_MAGIC_SWAP_ALT_GUI"},
- {QK_MAGIC_UNSWAP_ALT_GUI, "QK_MAGIC_UNSWAP_ALT_GUI"},
- {QK_MAGIC_TOGGLE_ALT_GUI, "QK_MAGIC_TOGGLE_ALT_GUI"},
- {QK_MAGIC_SWAP_LCTL_LGUI, "QK_MAGIC_SWAP_LCTL_LGUI"},
- {QK_MAGIC_UNSWAP_LCTL_LGUI, "QK_MAGIC_UNSWAP_LCTL_LGUI"},
- {QK_MAGIC_SWAP_RCTL_RGUI, "QK_MAGIC_SWAP_RCTL_RGUI"},
- {QK_MAGIC_UNSWAP_RCTL_RGUI, "QK_MAGIC_UNSWAP_RCTL_RGUI"},
- {QK_MAGIC_SWAP_CTL_GUI, "QK_MAGIC_SWAP_CTL_GUI"},
- {QK_MAGIC_UNSWAP_CTL_GUI, "QK_MAGIC_UNSWAP_CTL_GUI"},
- {QK_MAGIC_TOGGLE_CTL_GUI, "QK_MAGIC_TOGGLE_CTL_GUI"},
- {QK_MAGIC_EE_HANDS_LEFT, "QK_MAGIC_EE_HANDS_LEFT"},
- {QK_MAGIC_EE_HANDS_RIGHT, "QK_MAGIC_EE_HANDS_RIGHT"},
- {QK_MAGIC_SWAP_ESCAPE_CAPS_LOCK, "QK_MAGIC_SWAP_ESCAPE_CAPS_LOCK"},
- {QK_MAGIC_UNSWAP_ESCAPE_CAPS_LOCK, "QK_MAGIC_UNSWAP_ESCAPE_CAPS_LOCK"},
- {QK_MAGIC_TOGGLE_ESCAPE_CAPS_LOCK, "QK_MAGIC_TOGGLE_ESCAPE_CAPS_LOCK"},
- {QK_MIDI_ON, "QK_MIDI_ON"},
- {QK_MIDI_OFF, "QK_MIDI_OFF"},
- {QK_MIDI_TOGGLE, "QK_MIDI_TOGGLE"},
- {QK_MIDI_NOTE_C_0, "QK_MIDI_NOTE_C_0"},
- {QK_MIDI_NOTE_C_SHARP_0, "QK_MIDI_NOTE_C_SHARP_0"},
- {QK_MIDI_NOTE_D_0, "QK_MIDI_NOTE_D_0"},
- {QK_MIDI_NOTE_D_SHARP_0, "QK_MIDI_NOTE_D_SHARP_0"},
- {QK_MIDI_NOTE_E_0, "QK_MIDI_NOTE_E_0"},
- {QK_MIDI_NOTE_F_0, "QK_MIDI_NOTE_F_0"},
- {QK_MIDI_NOTE_F_SHARP_0, "QK_MIDI_NOTE_F_SHARP_0"},
- {QK_MIDI_NOTE_G_0, "QK_MIDI_NOTE_G_0"},
- {QK_MIDI_NOTE_G_SHARP_0, "QK_MIDI_NOTE_G_SHARP_0"},
- {QK_MIDI_NOTE_A_0, "QK_MIDI_NOTE_A_0"},
- {QK_MIDI_NOTE_A_SHARP_0, "QK_MIDI_NOTE_A_SHARP_0"},
- {QK_MIDI_NOTE_B_0, "QK_MIDI_NOTE_B_0"},
- {QK_MIDI_NOTE_C_1, "QK_MIDI_NOTE_C_1"},
- {QK_MIDI_NOTE_C_SHARP_1, "QK_MIDI_NOTE_C_SHARP_1"},
- {QK_MIDI_NOTE_D_1, "QK_MIDI_NOTE_D_1"},
- {QK_MIDI_NOTE_D_SHARP_1, "QK_MIDI_NOTE_D_SHARP_1"},
- {QK_MIDI_NOTE_E_1, "QK_MIDI_NOTE_E_1"},
- {QK_MIDI_NOTE_F_1, "QK_MIDI_NOTE_F_1"},
- {QK_MIDI_NOTE_F_SHARP_1, "QK_MIDI_NOTE_F_SHARP_1"},
- {QK_MIDI_NOTE_G_1, "QK_MIDI_NOTE_G_1"},
- {QK_MIDI_NOTE_G_SHARP_1, "QK_MIDI_NOTE_G_SHARP_1"},
- {QK_MIDI_NOTE_A_1, "QK_MIDI_NOTE_A_1"},
- {QK_MIDI_NOTE_A_SHARP_1, "QK_MIDI_NOTE_A_SHARP_1"},
- {QK_MIDI_NOTE_B_1, "QK_MIDI_NOTE_B_1"},
- {QK_MIDI_NOTE_C_2, "QK_MIDI_NOTE_C_2"},
- {QK_MIDI_NOTE_C_SHARP_2, "QK_MIDI_NOTE_C_SHARP_2"},
- {QK_MIDI_NOTE_D_2, "QK_MIDI_NOTE_D_2"},
- {QK_MIDI_NOTE_D_SHARP_2, "QK_MIDI_NOTE_D_SHARP_2"},
- {QK_MIDI_NOTE_E_2, "QK_MIDI_NOTE_E_2"},
- {QK_MIDI_NOTE_F_2, "QK_MIDI_NOTE_F_2"},
- {QK_MIDI_NOTE_F_SHARP_2, "QK_MIDI_NOTE_F_SHARP_2"},
- {QK_MIDI_NOTE_G_2, "QK_MIDI_NOTE_G_2"},
- {QK_MIDI_NOTE_G_SHARP_2, "QK_MIDI_NOTE_G_SHARP_2"},
- {QK_MIDI_NOTE_A_2, "QK_MIDI_NOTE_A_2"},
- {QK_MIDI_NOTE_A_SHARP_2, "QK_MIDI_NOTE_A_SHARP_2"},
- {QK_MIDI_NOTE_B_2, "QK_MIDI_NOTE_B_2"},
- {QK_MIDI_NOTE_C_3, "QK_MIDI_NOTE_C_3"},
- {QK_MIDI_NOTE_C_SHARP_3, "QK_MIDI_NOTE_C_SHARP_3"},
- {QK_MIDI_NOTE_D_3, "QK_MIDI_NOTE_D_3"},
- {QK_MIDI_NOTE_D_SHARP_3, "QK_MIDI_NOTE_D_SHARP_3"},
- {QK_MIDI_NOTE_E_3, "QK_MIDI_NOTE_E_3"},
- {QK_MIDI_NOTE_F_3, "QK_MIDI_NOTE_F_3"},
- {QK_MIDI_NOTE_F_SHARP_3, "QK_MIDI_NOTE_F_SHARP_3"},
- {QK_MIDI_NOTE_G_3, "QK_MIDI_NOTE_G_3"},
- {QK_MIDI_NOTE_G_SHARP_3, "QK_MIDI_NOTE_G_SHARP_3"},
- {QK_MIDI_NOTE_A_3, "QK_MIDI_NOTE_A_3"},
- {QK_MIDI_NOTE_A_SHARP_3, "QK_MIDI_NOTE_A_SHARP_3"},
- {QK_MIDI_NOTE_B_3, "QK_MIDI_NOTE_B_3"},
- {QK_MIDI_NOTE_C_4, "QK_MIDI_NOTE_C_4"},
- {QK_MIDI_NOTE_C_SHARP_4, "QK_MIDI_NOTE_C_SHARP_4"},
- {QK_MIDI_NOTE_D_4, "QK_MIDI_NOTE_D_4"},
- {QK_MIDI_NOTE_D_SHARP_4, "QK_MIDI_NOTE_D_SHARP_4"},
- {QK_MIDI_NOTE_E_4, "QK_MIDI_NOTE_E_4"},
- {QK_MIDI_NOTE_F_4, "QK_MIDI_NOTE_F_4"},
- {QK_MIDI_NOTE_F_SHARP_4, "QK_MIDI_NOTE_F_SHARP_4"},
- {QK_MIDI_NOTE_G_4, "QK_MIDI_NOTE_G_4"},
- {QK_MIDI_NOTE_G_SHARP_4, "QK_MIDI_NOTE_G_SHARP_4"},
- {QK_MIDI_NOTE_A_4, "QK_MIDI_NOTE_A_4"},
- {QK_MIDI_NOTE_A_SHARP_4, "QK_MIDI_NOTE_A_SHARP_4"},
- {QK_MIDI_NOTE_B_4, "QK_MIDI_NOTE_B_4"},
- {QK_MIDI_NOTE_C_5, "QK_MIDI_NOTE_C_5"},
- {QK_MIDI_NOTE_C_SHARP_5, "QK_MIDI_NOTE_C_SHARP_5"},
- {QK_MIDI_NOTE_D_5, "QK_MIDI_NOTE_D_5"},
- {QK_MIDI_NOTE_D_SHARP_5, "QK_MIDI_NOTE_D_SHARP_5"},
- {QK_MIDI_NOTE_E_5, "QK_MIDI_NOTE_E_5"},
- {QK_MIDI_NOTE_F_5, "QK_MIDI_NOTE_F_5"},
- {QK_MIDI_NOTE_F_SHARP_5, "QK_MIDI_NOTE_F_SHARP_5"},
- {QK_MIDI_NOTE_G_5, "QK_MIDI_NOTE_G_5"},
- {QK_MIDI_NOTE_G_SHARP_5, "QK_MIDI_NOTE_G_SHARP_5"},
- {QK_MIDI_NOTE_A_5, "QK_MIDI_NOTE_A_5"},
- {QK_MIDI_NOTE_A_SHARP_5, "QK_MIDI_NOTE_A_SHARP_5"},
- {QK_MIDI_NOTE_B_5, "QK_MIDI_NOTE_B_5"},
- {QK_MIDI_OCTAVE_N2, "QK_MIDI_OCTAVE_N2"},
- {QK_MIDI_OCTAVE_N1, "QK_MIDI_OCTAVE_N1"},
- {QK_MIDI_OCTAVE_0, "QK_MIDI_OCTAVE_0"},
- {QK_MIDI_OCTAVE_1, "QK_MIDI_OCTAVE_1"},
- {QK_MIDI_OCTAVE_2, "QK_MIDI_OCTAVE_2"},
- {QK_MIDI_OCTAVE_3, "QK_MIDI_OCTAVE_3"},
- {QK_MIDI_OCTAVE_4, "QK_MIDI_OCTAVE_4"},
- {QK_MIDI_OCTAVE_5, "QK_MIDI_OCTAVE_5"},
- {QK_MIDI_OCTAVE_6, "QK_MIDI_OCTAVE_6"},
- {QK_MIDI_OCTAVE_7, "QK_MIDI_OCTAVE_7"},
- {QK_MIDI_OCTAVE_DOWN, "QK_MIDI_OCTAVE_DOWN"},
- {QK_MIDI_OCTAVE_UP, "QK_MIDI_OCTAVE_UP"},
- {QK_MIDI_TRANSPOSE_N6, "QK_MIDI_TRANSPOSE_N6"},
- {QK_MIDI_TRANSPOSE_N5, "QK_MIDI_TRANSPOSE_N5"},
- {QK_MIDI_TRANSPOSE_N4, "QK_MIDI_TRANSPOSE_N4"},
- {QK_MIDI_TRANSPOSE_N3, "QK_MIDI_TRANSPOSE_N3"},
- {QK_MIDI_TRANSPOSE_N2, "QK_MIDI_TRANSPOSE_N2"},
- {QK_MIDI_TRANSPOSE_N1, "QK_MIDI_TRANSPOSE_N1"},
- {QK_MIDI_TRANSPOSE_0, "QK_MIDI_TRANSPOSE_0"},
- {QK_MIDI_TRANSPOSE_1, "QK_MIDI_TRANSPOSE_1"},
- {QK_MIDI_TRANSPOSE_2, "QK_MIDI_TRANSPOSE_2"},
- {QK_MIDI_TRANSPOSE_3, "QK_MIDI_TRANSPOSE_3"},
- {QK_MIDI_TRANSPOSE_4, "QK_MIDI_TRANSPOSE_4"},
- {QK_MIDI_TRANSPOSE_5, "QK_MIDI_TRANSPOSE_5"},
- {QK_MIDI_TRANSPOSE_6, "QK_MIDI_TRANSPOSE_6"},
- {QK_MIDI_TRANSPOSE_DOWN, "QK_MIDI_TRANSPOSE_DOWN"},
- {QK_MIDI_TRANSPOSE_UP, "QK_MIDI_TRANSPOSE_UP"},
- {QK_MIDI_VELOCITY_0, "QK_MIDI_VELOCITY_0"},
- {QK_MIDI_VELOCITY_1, "QK_MIDI_VELOCITY_1"},
- {QK_MIDI_VELOCITY_2, "QK_MIDI_VELOCITY_2"},
- {QK_MIDI_VELOCITY_3, "QK_MIDI_VELOCITY_3"},
- {QK_MIDI_VELOCITY_4, "QK_MIDI_VELOCITY_4"},
- {QK_MIDI_VELOCITY_5, "QK_MIDI_VELOCITY_5"},
- {QK_MIDI_VELOCITY_6, "QK_MIDI_VELOCITY_6"},
- {QK_MIDI_VELOCITY_7, "QK_MIDI_VELOCITY_7"},
- {QK_MIDI_VELOCITY_8, "QK_MIDI_VELOCITY_8"},
- {QK_MIDI_VELOCITY_9, "QK_MIDI_VELOCITY_9"},
- {QK_MIDI_VELOCITY_10, "QK_MIDI_VELOCITY_10"},
- {QK_MIDI_VELOCITY_DOWN, "QK_MIDI_VELOCITY_DOWN"},
- {QK_MIDI_VELOCITY_UP, "QK_MIDI_VELOCITY_UP"},
- {QK_MIDI_CHANNEL_1, "QK_MIDI_CHANNEL_1"},
- {QK_MIDI_CHANNEL_2, "QK_MIDI_CHANNEL_2"},
- {QK_MIDI_CHANNEL_3, "QK_MIDI_CHANNEL_3"},
- {QK_MIDI_CHANNEL_4, "QK_MIDI_CHANNEL_4"},
- {QK_MIDI_CHANNEL_5, "QK_MIDI_CHANNEL_5"},
- {QK_MIDI_CHANNEL_6, "QK_MIDI_CHANNEL_6"},
- {QK_MIDI_CHANNEL_7, "QK_MIDI_CHANNEL_7"},
- {QK_MIDI_CHANNEL_8, "QK_MIDI_CHANNEL_8"},
- {QK_MIDI_CHANNEL_9, "QK_MIDI_CHANNEL_9"},
- {QK_MIDI_CHANNEL_10, "QK_MIDI_CHANNEL_10"},
- {QK_MIDI_CHANNEL_11, "QK_MIDI_CHANNEL_11"},
- {QK_MIDI_CHANNEL_12, "QK_MIDI_CHANNEL_12"},
- {QK_MIDI_CHANNEL_13, "QK_MIDI_CHANNEL_13"},
- {QK_MIDI_CHANNEL_14, "QK_MIDI_CHANNEL_14"},
- {QK_MIDI_CHANNEL_15, "QK_MIDI_CHANNEL_15"},
- {QK_MIDI_CHANNEL_16, "QK_MIDI_CHANNEL_16"},
- {QK_MIDI_CHANNEL_DOWN, "QK_MIDI_CHANNEL_DOWN"},
- {QK_MIDI_CHANNEL_UP, "QK_MIDI_CHANNEL_UP"},
- {QK_MIDI_ALL_NOTES_OFF, "QK_MIDI_ALL_NOTES_OFF"},
- {QK_MIDI_SUSTAIN, "QK_MIDI_SUSTAIN"},
- {QK_MIDI_PORTAMENTO, "QK_MIDI_PORTAMENTO"},
- {QK_MIDI_SOSTENUTO, "QK_MIDI_SOSTENUTO"},
- {QK_MIDI_SOFT, "QK_MIDI_SOFT"},
- {QK_MIDI_LEGATO, "QK_MIDI_LEGATO"},
- {QK_MIDI_MODULATION, "QK_MIDI_MODULATION"},
- {QK_MIDI_MODULATION_SPEED_DOWN, "QK_MIDI_MODULATION_SPEED_DOWN"},
- {QK_MIDI_MODULATION_SPEED_UP, "QK_MIDI_MODULATION_SPEED_UP"},
- {QK_MIDI_PITCH_BEND_DOWN, "QK_MIDI_PITCH_BEND_DOWN"},
- {QK_MIDI_PITCH_BEND_UP, "QK_MIDI_PITCH_BEND_UP"},
- {QK_SEQUENCER_ON, "QK_SEQUENCER_ON"},
- {QK_SEQUENCER_OFF, "QK_SEQUENCER_OFF"},
- {QK_SEQUENCER_TOGGLE, "QK_SEQUENCER_TOGGLE"},
- {QK_SEQUENCER_TEMPO_DOWN, "QK_SEQUENCER_TEMPO_DOWN"},
- {QK_SEQUENCER_TEMPO_UP, "QK_SEQUENCER_TEMPO_UP"},
- {QK_SEQUENCER_RESOLUTION_DOWN, "QK_SEQUENCER_RESOLUTION_DOWN"},
- {QK_SEQUENCER_RESOLUTION_UP, "QK_SEQUENCER_RESOLUTION_UP"},
- {QK_SEQUENCER_STEPS_ALL, "QK_SEQUENCER_STEPS_ALL"},
- {QK_SEQUENCER_STEPS_CLEAR, "QK_SEQUENCER_STEPS_CLEAR"},
- {QK_JOYSTICK_BUTTON_0, "QK_JOYSTICK_BUTTON_0"},
- {QK_JOYSTICK_BUTTON_1, "QK_JOYSTICK_BUTTON_1"},
- {QK_JOYSTICK_BUTTON_2, "QK_JOYSTICK_BUTTON_2"},
- {QK_JOYSTICK_BUTTON_3, "QK_JOYSTICK_BUTTON_3"},
- {QK_JOYSTICK_BUTTON_4, "QK_JOYSTICK_BUTTON_4"},
- {QK_JOYSTICK_BUTTON_5, "QK_JOYSTICK_BUTTON_5"},
- {QK_JOYSTICK_BUTTON_6, "QK_JOYSTICK_BUTTON_6"},
- {QK_JOYSTICK_BUTTON_7, "QK_JOYSTICK_BUTTON_7"},
- {QK_JOYSTICK_BUTTON_8, "QK_JOYSTICK_BUTTON_8"},
- {QK_JOYSTICK_BUTTON_9, "QK_JOYSTICK_BUTTON_9"},
- {QK_JOYSTICK_BUTTON_10, "QK_JOYSTICK_BUTTON_10"},
- {QK_JOYSTICK_BUTTON_11, "QK_JOYSTICK_BUTTON_11"},
- {QK_JOYSTICK_BUTTON_12, "QK_JOYSTICK_BUTTON_12"},
- {QK_JOYSTICK_BUTTON_13, "QK_JOYSTICK_BUTTON_13"},
- {QK_JOYSTICK_BUTTON_14, "QK_JOYSTICK_BUTTON_14"},
- {QK_JOYSTICK_BUTTON_15, "QK_JOYSTICK_BUTTON_15"},
- {QK_JOYSTICK_BUTTON_16, "QK_JOYSTICK_BUTTON_16"},
- {QK_JOYSTICK_BUTTON_17, "QK_JOYSTICK_BUTTON_17"},
- {QK_JOYSTICK_BUTTON_18, "QK_JOYSTICK_BUTTON_18"},
- {QK_JOYSTICK_BUTTON_19, "QK_JOYSTICK_BUTTON_19"},
- {QK_JOYSTICK_BUTTON_20, "QK_JOYSTICK_BUTTON_20"},
- {QK_JOYSTICK_BUTTON_21, "QK_JOYSTICK_BUTTON_21"},
- {QK_JOYSTICK_BUTTON_22, "QK_JOYSTICK_BUTTON_22"},
- {QK_JOYSTICK_BUTTON_23, "QK_JOYSTICK_BUTTON_23"},
- {QK_JOYSTICK_BUTTON_24, "QK_JOYSTICK_BUTTON_24"},
- {QK_JOYSTICK_BUTTON_25, "QK_JOYSTICK_BUTTON_25"},
- {QK_JOYSTICK_BUTTON_26, "QK_JOYSTICK_BUTTON_26"},
- {QK_JOYSTICK_BUTTON_27, "QK_JOYSTICK_BUTTON_27"},
- {QK_JOYSTICK_BUTTON_28, "QK_JOYSTICK_BUTTON_28"},
- {QK_JOYSTICK_BUTTON_29, "QK_JOYSTICK_BUTTON_29"},
- {QK_JOYSTICK_BUTTON_30, "QK_JOYSTICK_BUTTON_30"},
- {QK_JOYSTICK_BUTTON_31, "QK_JOYSTICK_BUTTON_31"},
- {QK_PROGRAMMABLE_BUTTON_1, "QK_PROGRAMMABLE_BUTTON_1"},
- {QK_PROGRAMMABLE_BUTTON_2, "QK_PROGRAMMABLE_BUTTON_2"},
- {QK_PROGRAMMABLE_BUTTON_3, "QK_PROGRAMMABLE_BUTTON_3"},
- {QK_PROGRAMMABLE_BUTTON_4, "QK_PROGRAMMABLE_BUTTON_4"},
- {QK_PROGRAMMABLE_BUTTON_5, "QK_PROGRAMMABLE_BUTTON_5"},
- {QK_PROGRAMMABLE_BUTTON_6, "QK_PROGRAMMABLE_BUTTON_6"},
- {QK_PROGRAMMABLE_BUTTON_7, "QK_PROGRAMMABLE_BUTTON_7"},
- {QK_PROGRAMMABLE_BUTTON_8, "QK_PROGRAMMABLE_BUTTON_8"},
- {QK_PROGRAMMABLE_BUTTON_9, "QK_PROGRAMMABLE_BUTTON_9"},
- {QK_PROGRAMMABLE_BUTTON_10, "QK_PROGRAMMABLE_BUTTON_10"},
- {QK_PROGRAMMABLE_BUTTON_11, "QK_PROGRAMMABLE_BUTTON_11"},
- {QK_PROGRAMMABLE_BUTTON_12, "QK_PROGRAMMABLE_BUTTON_12"},
- {QK_PROGRAMMABLE_BUTTON_13, "QK_PROGRAMMABLE_BUTTON_13"},
- {QK_PROGRAMMABLE_BUTTON_14, "QK_PROGRAMMABLE_BUTTON_14"},
- {QK_PROGRAMMABLE_BUTTON_15, "QK_PROGRAMMABLE_BUTTON_15"},
- {QK_PROGRAMMABLE_BUTTON_16, "QK_PROGRAMMABLE_BUTTON_16"},
- {QK_PROGRAMMABLE_BUTTON_17, "QK_PROGRAMMABLE_BUTTON_17"},
- {QK_PROGRAMMABLE_BUTTON_18, "QK_PROGRAMMABLE_BUTTON_18"},
- {QK_PROGRAMMABLE_BUTTON_19, "QK_PROGRAMMABLE_BUTTON_19"},
- {QK_PROGRAMMABLE_BUTTON_20, "QK_PROGRAMMABLE_BUTTON_20"},
- {QK_PROGRAMMABLE_BUTTON_21, "QK_PROGRAMMABLE_BUTTON_21"},
- {QK_PROGRAMMABLE_BUTTON_22, "QK_PROGRAMMABLE_BUTTON_22"},
- {QK_PROGRAMMABLE_BUTTON_23, "QK_PROGRAMMABLE_BUTTON_23"},
- {QK_PROGRAMMABLE_BUTTON_24, "QK_PROGRAMMABLE_BUTTON_24"},
- {QK_PROGRAMMABLE_BUTTON_25, "QK_PROGRAMMABLE_BUTTON_25"},
- {QK_PROGRAMMABLE_BUTTON_26, "QK_PROGRAMMABLE_BUTTON_26"},
- {QK_PROGRAMMABLE_BUTTON_27, "QK_PROGRAMMABLE_BUTTON_27"},
- {QK_PROGRAMMABLE_BUTTON_28, "QK_PROGRAMMABLE_BUTTON_28"},
- {QK_PROGRAMMABLE_BUTTON_29, "QK_PROGRAMMABLE_BUTTON_29"},
- {QK_PROGRAMMABLE_BUTTON_30, "QK_PROGRAMMABLE_BUTTON_30"},
- {QK_PROGRAMMABLE_BUTTON_31, "QK_PROGRAMMABLE_BUTTON_31"},
- {QK_PROGRAMMABLE_BUTTON_32, "QK_PROGRAMMABLE_BUTTON_32"},
- {QK_AUDIO_ON, "QK_AUDIO_ON"},
- {QK_AUDIO_OFF, "QK_AUDIO_OFF"},
- {QK_AUDIO_TOGGLE, "QK_AUDIO_TOGGLE"},
- {QK_AUDIO_CLICKY_TOGGLE, "QK_AUDIO_CLICKY_TOGGLE"},
- {QK_AUDIO_CLICKY_ON, "QK_AUDIO_CLICKY_ON"},
- {QK_AUDIO_CLICKY_OFF, "QK_AUDIO_CLICKY_OFF"},
- {QK_AUDIO_CLICKY_UP, "QK_AUDIO_CLICKY_UP"},
- {QK_AUDIO_CLICKY_DOWN, "QK_AUDIO_CLICKY_DOWN"},
- {QK_AUDIO_CLICKY_RESET, "QK_AUDIO_CLICKY_RESET"},
- {QK_MUSIC_ON, "QK_MUSIC_ON"},
- {QK_MUSIC_OFF, "QK_MUSIC_OFF"},
- {QK_MUSIC_TOGGLE, "QK_MUSIC_TOGGLE"},
- {QK_MUSIC_MODE_NEXT, "QK_MUSIC_MODE_NEXT"},
- {QK_AUDIO_VOICE_NEXT, "QK_AUDIO_VOICE_NEXT"},
- {QK_AUDIO_VOICE_PREVIOUS, "QK_AUDIO_VOICE_PREVIOUS"},
- {QK_STENO_BOLT, "QK_STENO_BOLT"},
- {QK_STENO_GEMINI, "QK_STENO_GEMINI"},
- {QK_STENO_COMB, "QK_STENO_COMB"},
- {QK_STENO_COMB_MAX, "QK_STENO_COMB_MAX"},
- {QK_MACRO_0, "QK_MACRO_0"},
- {QK_MACRO_1, "QK_MACRO_1"},
- {QK_MACRO_2, "QK_MACRO_2"},
- {QK_MACRO_3, "QK_MACRO_3"},
- {QK_MACRO_4, "QK_MACRO_4"},
- {QK_MACRO_5, "QK_MACRO_5"},
- {QK_MACRO_6, "QK_MACRO_6"},
- {QK_MACRO_7, "QK_MACRO_7"},
- {QK_MACRO_8, "QK_MACRO_8"},
- {QK_MACRO_9, "QK_MACRO_9"},
- {QK_MACRO_10, "QK_MACRO_10"},
- {QK_MACRO_11, "QK_MACRO_11"},
- {QK_MACRO_12, "QK_MACRO_12"},
- {QK_MACRO_13, "QK_MACRO_13"},
- {QK_MACRO_14, "QK_MACRO_14"},
- {QK_MACRO_15, "QK_MACRO_15"},
- {QK_MACRO_16, "QK_MACRO_16"},
- {QK_MACRO_17, "QK_MACRO_17"},
- {QK_MACRO_18, "QK_MACRO_18"},
- {QK_MACRO_19, "QK_MACRO_19"},
- {QK_MACRO_20, "QK_MACRO_20"},
- {QK_MACRO_21, "QK_MACRO_21"},
- {QK_MACRO_22, "QK_MACRO_22"},
- {QK_MACRO_23, "QK_MACRO_23"},
- {QK_MACRO_24, "QK_MACRO_24"},
- {QK_MACRO_25, "QK_MACRO_25"},
- {QK_MACRO_26, "QK_MACRO_26"},
- {QK_MACRO_27, "QK_MACRO_27"},
- {QK_MACRO_28, "QK_MACRO_28"},
- {QK_MACRO_29, "QK_MACRO_29"},
- {QK_MACRO_30, "QK_MACRO_30"},
- {QK_MACRO_31, "QK_MACRO_31"},
- {QK_OUTPUT_AUTO, "QK_OUTPUT_AUTO"},
- {QK_OUTPUT_NEXT, "QK_OUTPUT_NEXT"},
- {QK_OUTPUT_PREV, "QK_OUTPUT_PREV"},
- {QK_OUTPUT_NONE, "QK_OUTPUT_NONE"},
- {QK_OUTPUT_USB, "QK_OUTPUT_USB"},
- {QK_OUTPUT_2P4GHZ, "QK_OUTPUT_2P4GHZ"},
- {QK_OUTPUT_BLUETOOTH, "QK_OUTPUT_BLUETOOTH"},
- {QK_BLUETOOTH_PROFILE_NEXT, "QK_BLUETOOTH_PROFILE_NEXT"},
- {QK_BLUETOOTH_PROFILE_PREV, "QK_BLUETOOTH_PROFILE_PREV"},
- {QK_BLUETOOTH_UNPAIR, "QK_BLUETOOTH_UNPAIR"},
- {QK_BLUETOOTH_PROFILE1, "QK_BLUETOOTH_PROFILE1"},
- {QK_BLUETOOTH_PROFILE2, "QK_BLUETOOTH_PROFILE2"},
- {QK_BLUETOOTH_PROFILE3, "QK_BLUETOOTH_PROFILE3"},
- {QK_BLUETOOTH_PROFILE4, "QK_BLUETOOTH_PROFILE4"},
- {QK_BLUETOOTH_PROFILE5, "QK_BLUETOOTH_PROFILE5"},
- {QK_BACKLIGHT_ON, "QK_BACKLIGHT_ON"},
- {QK_BACKLIGHT_OFF, "QK_BACKLIGHT_OFF"},
- {QK_BACKLIGHT_TOGGLE, "QK_BACKLIGHT_TOGGLE"},
- {QK_BACKLIGHT_DOWN, "QK_BACKLIGHT_DOWN"},
- {QK_BACKLIGHT_UP, "QK_BACKLIGHT_UP"},
- {QK_BACKLIGHT_STEP, "QK_BACKLIGHT_STEP"},
- {QK_BACKLIGHT_TOGGLE_BREATHING, "QK_BACKLIGHT_TOGGLE_BREATHING"},
- {QK_LED_MATRIX_ON, "QK_LED_MATRIX_ON"},
- {QK_LED_MATRIX_OFF, "QK_LED_MATRIX_OFF"},
- {QK_LED_MATRIX_TOGGLE, "QK_LED_MATRIX_TOGGLE"},
- {QK_LED_MATRIX_MODE_NEXT, "QK_LED_MATRIX_MODE_NEXT"},
- {QK_LED_MATRIX_MODE_PREVIOUS, "QK_LED_MATRIX_MODE_PREVIOUS"},
- {QK_LED_MATRIX_BRIGHTNESS_UP, "QK_LED_MATRIX_BRIGHTNESS_UP"},
- {QK_LED_MATRIX_BRIGHTNESS_DOWN, "QK_LED_MATRIX_BRIGHTNESS_DOWN"},
- {QK_LED_MATRIX_SPEED_UP, "QK_LED_MATRIX_SPEED_UP"},
- {QK_LED_MATRIX_SPEED_DOWN, "QK_LED_MATRIX_SPEED_DOWN"},
- {QK_UNDERGLOW_TOGGLE, "QK_UNDERGLOW_TOGGLE"},
- {QK_UNDERGLOW_MODE_NEXT, "QK_UNDERGLOW_MODE_NEXT"},
- {QK_UNDERGLOW_MODE_PREVIOUS, "QK_UNDERGLOW_MODE_PREVIOUS"},
- {QK_UNDERGLOW_HUE_UP, "QK_UNDERGLOW_HUE_UP"},
- {QK_UNDERGLOW_HUE_DOWN, "QK_UNDERGLOW_HUE_DOWN"},
- {QK_UNDERGLOW_SATURATION_UP, "QK_UNDERGLOW_SATURATION_UP"},
- {QK_UNDERGLOW_SATURATION_DOWN, "QK_UNDERGLOW_SATURATION_DOWN"},
- {QK_UNDERGLOW_VALUE_UP, "QK_UNDERGLOW_VALUE_UP"},
- {QK_UNDERGLOW_VALUE_DOWN, "QK_UNDERGLOW_VALUE_DOWN"},
- {QK_UNDERGLOW_SPEED_UP, "QK_UNDERGLOW_SPEED_UP"},
- {QK_UNDERGLOW_SPEED_DOWN, "QK_UNDERGLOW_SPEED_DOWN"},
- {RGB_MODE_PLAIN, "RGB_MODE_PLAIN"},
- {RGB_MODE_BREATHE, "RGB_MODE_BREATHE"},
- {RGB_MODE_RAINBOW, "RGB_MODE_RAINBOW"},
- {RGB_MODE_SWIRL, "RGB_MODE_SWIRL"},
- {RGB_MODE_SNAKE, "RGB_MODE_SNAKE"},
- {RGB_MODE_KNIGHT, "RGB_MODE_KNIGHT"},
- {RGB_MODE_XMAS, "RGB_MODE_XMAS"},
- {RGB_MODE_GRADIENT, "RGB_MODE_GRADIENT"},
- {RGB_MODE_RGBTEST, "RGB_MODE_RGBTEST"},
- {RGB_MODE_TWINKLE, "RGB_MODE_TWINKLE"},
- {QK_RGB_MATRIX_ON, "QK_RGB_MATRIX_ON"},
- {QK_RGB_MATRIX_OFF, "QK_RGB_MATRIX_OFF"},
- {QK_RGB_MATRIX_TOGGLE, "QK_RGB_MATRIX_TOGGLE"},
- {QK_RGB_MATRIX_MODE_NEXT, "QK_RGB_MATRIX_MODE_NEXT"},
- {QK_RGB_MATRIX_MODE_PREVIOUS, "QK_RGB_MATRIX_MODE_PREVIOUS"},
- {QK_RGB_MATRIX_HUE_UP, "QK_RGB_MATRIX_HUE_UP"},
- {QK_RGB_MATRIX_HUE_DOWN, "QK_RGB_MATRIX_HUE_DOWN"},
- {QK_RGB_MATRIX_SATURATION_UP, "QK_RGB_MATRIX_SATURATION_UP"},
- {QK_RGB_MATRIX_SATURATION_DOWN, "QK_RGB_MATRIX_SATURATION_DOWN"},
- {QK_RGB_MATRIX_VALUE_UP, "QK_RGB_MATRIX_VALUE_UP"},
- {QK_RGB_MATRIX_VALUE_DOWN, "QK_RGB_MATRIX_VALUE_DOWN"},
- {QK_RGB_MATRIX_SPEED_UP, "QK_RGB_MATRIX_SPEED_UP"},
- {QK_RGB_MATRIX_SPEED_DOWN, "QK_RGB_MATRIX_SPEED_DOWN"},
- {QK_BOOTLOADER, "QK_BOOTLOADER"},
- {QK_REBOOT, "QK_REBOOT"},
- {QK_DEBUG_TOGGLE, "QK_DEBUG_TOGGLE"},
- {QK_CLEAR_EEPROM, "QK_CLEAR_EEPROM"},
- {QK_MAKE, "QK_MAKE"},
- {QK_AUTO_SHIFT_DOWN, "QK_AUTO_SHIFT_DOWN"},
- {QK_AUTO_SHIFT_UP, "QK_AUTO_SHIFT_UP"},
- {QK_AUTO_SHIFT_REPORT, "QK_AUTO_SHIFT_REPORT"},
- {QK_AUTO_SHIFT_ON, "QK_AUTO_SHIFT_ON"},
- {QK_AUTO_SHIFT_OFF, "QK_AUTO_SHIFT_OFF"},
- {QK_AUTO_SHIFT_TOGGLE, "QK_AUTO_SHIFT_TOGGLE"},
- {QK_GRAVE_ESCAPE, "QK_GRAVE_ESCAPE"},
- {QK_VELOCIKEY_TOGGLE, "QK_VELOCIKEY_TOGGLE"},
- {QK_SPACE_CADET_LEFT_CTRL_PARENTHESIS_OPEN, "QK_SPACE_CADET_LEFT_CTRL_PARENTHESIS_OPEN"},
- {QK_SPACE_CADET_RIGHT_CTRL_PARENTHESIS_CLOSE, "QK_SPACE_CADET_RIGHT_CTRL_PARENTHESIS_CLOSE"},
- {QK_SPACE_CADET_LEFT_SHIFT_PARENTHESIS_OPEN, "QK_SPACE_CADET_LEFT_SHIFT_PARENTHESIS_OPEN"},
- {QK_SPACE_CADET_RIGHT_SHIFT_PARENTHESIS_CLOSE, "QK_SPACE_CADET_RIGHT_SHIFT_PARENTHESIS_CLOSE"},
- {QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN, "QK_SPACE_CADET_LEFT_ALT_PARENTHESIS_OPEN"},
- {QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE, "QK_SPACE_CADET_RIGHT_ALT_PARENTHESIS_CLOSE"},
- {QK_SPACE_CADET_RIGHT_SHIFT_ENTER, "QK_SPACE_CADET_RIGHT_SHIFT_ENTER"},
- {QK_UNICODE_MODE_NEXT, "QK_UNICODE_MODE_NEXT"},
- {QK_UNICODE_MODE_PREVIOUS, "QK_UNICODE_MODE_PREVIOUS"},
- {QK_UNICODE_MODE_MACOS, "QK_UNICODE_MODE_MACOS"},
- {QK_UNICODE_MODE_LINUX, "QK_UNICODE_MODE_LINUX"},
- {QK_UNICODE_MODE_WINDOWS, "QK_UNICODE_MODE_WINDOWS"},
- {QK_UNICODE_MODE_BSD, "QK_UNICODE_MODE_BSD"},
- {QK_UNICODE_MODE_WINCOMPOSE, "QK_UNICODE_MODE_WINCOMPOSE"},
- {QK_UNICODE_MODE_EMACS, "QK_UNICODE_MODE_EMACS"},
- {QK_HAPTIC_ON, "QK_HAPTIC_ON"},
- {QK_HAPTIC_OFF, "QK_HAPTIC_OFF"},
- {QK_HAPTIC_TOGGLE, "QK_HAPTIC_TOGGLE"},
- {QK_HAPTIC_RESET, "QK_HAPTIC_RESET"},
- {QK_HAPTIC_FEEDBACK_TOGGLE, "QK_HAPTIC_FEEDBACK_TOGGLE"},
- {QK_HAPTIC_BUZZ_TOGGLE, "QK_HAPTIC_BUZZ_TOGGLE"},
- {QK_HAPTIC_MODE_NEXT, "QK_HAPTIC_MODE_NEXT"},
- {QK_HAPTIC_MODE_PREVIOUS, "QK_HAPTIC_MODE_PREVIOUS"},
- {QK_HAPTIC_CONTINUOUS_TOGGLE, "QK_HAPTIC_CONTINUOUS_TOGGLE"},
- {QK_HAPTIC_CONTINUOUS_UP, "QK_HAPTIC_CONTINUOUS_UP"},
- {QK_HAPTIC_CONTINUOUS_DOWN, "QK_HAPTIC_CONTINUOUS_DOWN"},
- {QK_HAPTIC_DWELL_UP, "QK_HAPTIC_DWELL_UP"},
- {QK_HAPTIC_DWELL_DOWN, "QK_HAPTIC_DWELL_DOWN"},
- {QK_COMBO_ON, "QK_COMBO_ON"},
- {QK_COMBO_OFF, "QK_COMBO_OFF"},
- {QK_COMBO_TOGGLE, "QK_COMBO_TOGGLE"},
- {QK_DYNAMIC_MACRO_RECORD_START_1, "QK_DYNAMIC_MACRO_RECORD_START_1"},
- {QK_DYNAMIC_MACRO_RECORD_START_2, "QK_DYNAMIC_MACRO_RECORD_START_2"},
- {QK_DYNAMIC_MACRO_RECORD_STOP, "QK_DYNAMIC_MACRO_RECORD_STOP"},
- {QK_DYNAMIC_MACRO_PLAY_1, "QK_DYNAMIC_MACRO_PLAY_1"},
- {QK_DYNAMIC_MACRO_PLAY_2, "QK_DYNAMIC_MACRO_PLAY_2"},
- {QK_LEADER, "QK_LEADER"},
- {QK_LOCK, "QK_LOCK"},
- {QK_ONE_SHOT_ON, "QK_ONE_SHOT_ON"},
- {QK_ONE_SHOT_OFF, "QK_ONE_SHOT_OFF"},
- {QK_ONE_SHOT_TOGGLE, "QK_ONE_SHOT_TOGGLE"},
- {QK_KEY_OVERRIDE_TOGGLE, "QK_KEY_OVERRIDE_TOGGLE"},
- {QK_KEY_OVERRIDE_ON, "QK_KEY_OVERRIDE_ON"},
- {QK_KEY_OVERRIDE_OFF, "QK_KEY_OVERRIDE_OFF"},
- {QK_SECURE_LOCK, "QK_SECURE_LOCK"},
- {QK_SECURE_UNLOCK, "QK_SECURE_UNLOCK"},
- {QK_SECURE_TOGGLE, "QK_SECURE_TOGGLE"},
- {QK_SECURE_REQUEST, "QK_SECURE_REQUEST"},
- {QK_DYNAMIC_TAPPING_TERM_PRINT, "QK_DYNAMIC_TAPPING_TERM_PRINT"},
- {QK_DYNAMIC_TAPPING_TERM_UP, "QK_DYNAMIC_TAPPING_TERM_UP"},
- {QK_DYNAMIC_TAPPING_TERM_DOWN, "QK_DYNAMIC_TAPPING_TERM_DOWN"},
- {QK_CAPS_WORD_TOGGLE, "QK_CAPS_WORD_TOGGLE"},
- {QK_AUTOCORRECT_ON, "QK_AUTOCORRECT_ON"},
- {QK_AUTOCORRECT_OFF, "QK_AUTOCORRECT_OFF"},
- {QK_AUTOCORRECT_TOGGLE, "QK_AUTOCORRECT_TOGGLE"},
- {QK_TRI_LAYER_LOWER, "QK_TRI_LAYER_LOWER"},
- {QK_TRI_LAYER_UPPER, "QK_TRI_LAYER_UPPER"},
- {QK_REPEAT_KEY, "QK_REPEAT_KEY"},
- {QK_ALT_REPEAT_KEY, "QK_ALT_REPEAT_KEY"},
- {QK_LAYER_LOCK, "QK_LAYER_LOCK"},
- {QK_KB_0, "QK_KB_0"},
- {QK_KB_1, "QK_KB_1"},
- {QK_KB_2, "QK_KB_2"},
- {QK_KB_3, "QK_KB_3"},
- {QK_KB_4, "QK_KB_4"},
- {QK_KB_5, "QK_KB_5"},
- {QK_KB_6, "QK_KB_6"},
- {QK_KB_7, "QK_KB_7"},
- {QK_KB_8, "QK_KB_8"},
- {QK_KB_9, "QK_KB_9"},
- {QK_KB_10, "QK_KB_10"},
- {QK_KB_11, "QK_KB_11"},
- {QK_KB_12, "QK_KB_12"},
- {QK_KB_13, "QK_KB_13"},
- {QK_KB_14, "QK_KB_14"},
- {QK_KB_15, "QK_KB_15"},
- {QK_KB_16, "QK_KB_16"},
- {QK_KB_17, "QK_KB_17"},
- {QK_KB_18, "QK_KB_18"},
- {QK_KB_19, "QK_KB_19"},
- {QK_KB_20, "QK_KB_20"},
- {QK_KB_21, "QK_KB_21"},
- {QK_KB_22, "QK_KB_22"},
- {QK_KB_23, "QK_KB_23"},
- {QK_KB_24, "QK_KB_24"},
- {QK_KB_25, "QK_KB_25"},
- {QK_KB_26, "QK_KB_26"},
- {QK_KB_27, "QK_KB_27"},
- {QK_KB_28, "QK_KB_28"},
- {QK_KB_29, "QK_KB_29"},
- {QK_KB_30, "QK_KB_30"},
- {QK_KB_31, "QK_KB_31"},
- {QK_USER_0, "QK_USER_0"},
- {QK_USER_1, "QK_USER_1"},
- {QK_USER_2, "QK_USER_2"},
- {QK_USER_3, "QK_USER_3"},
- {QK_USER_4, "QK_USER_4"},
- {QK_USER_5, "QK_USER_5"},
- {QK_USER_6, "QK_USER_6"},
- {QK_USER_7, "QK_USER_7"},
- {QK_USER_8, "QK_USER_8"},
- {QK_USER_9, "QK_USER_9"},
- {QK_USER_10, "QK_USER_10"},
- {QK_USER_11, "QK_USER_11"},
- {QK_USER_12, "QK_USER_12"},
- {QK_USER_13, "QK_USER_13"},
- {QK_USER_14, "QK_USER_14"},
- {QK_USER_15, "QK_USER_15"},
- {QK_USER_16, "QK_USER_16"},
- {QK_USER_17, "QK_USER_17"},
- {QK_USER_18, "QK_USER_18"},
- {QK_USER_19, "QK_USER_19"},
- {QK_USER_20, "QK_USER_20"},
- {QK_USER_21, "QK_USER_21"},
- {QK_USER_22, "QK_USER_22"},
- {QK_USER_23, "QK_USER_23"},
- {QK_USER_24, "QK_USER_24"},
- {QK_USER_25, "QK_USER_25"},
- {QK_USER_26, "QK_USER_26"},
- {QK_USER_27, "QK_USER_27"},
- {QK_USER_28, "QK_USER_28"},
- {QK_USER_29, "QK_USER_29"},
- {QK_USER_30, "QK_USER_30"},
- {QK_USER_31, "QK_USER_31"},
-};
diff --git a/tests/test_common/keycode_util.cpp b/tests/test_common/keycode_util.cpp
deleted file mode 100644
index 539cab819a..0000000000
--- a/tests/test_common/keycode_util.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-#include "keycode_util.hpp"
-#include <cstdint>
-extern "C" {
-#include "action_code.h"
-#include "keycode.h"
-#include "quantum_keycodes.h"
-#include "util.h"
-}
-#include <string>
-#include <iomanip>
-#include <map>
-
-extern std::map<uint16_t, std::string> KEYCODE_ID_TABLE;
-
-std::string get_mods(uint8_t mods) {
- std::stringstream s;
- if ((mods & MOD_RCTL) == MOD_RCTL) {
- s << XSTR(MOD_RCTL) << " | ";
- } else if ((mods & MOD_LCTL) == MOD_LCTL) {
- s << XSTR(MOD_LCTL) << " | ";
- }
-
- if ((mods & MOD_RSFT) == MOD_RSFT) {
- s << XSTR(MOD_RSFT) << " | ";
- } else if ((mods & MOD_LSFT) == MOD_LSFT) {
- s << XSTR(MOD_LSFT) << " | ";
- }
-
- if ((mods & MOD_RALT) == MOD_RALT) {
- s << XSTR(MOD_RALT) << " | ";
- } else if ((mods & MOD_LALT) == MOD_LALT) {
- s << XSTR(MOD_LALT) << " | ";
- }
-
- if ((mods & MOD_RGUI) == MOD_RGUI) {
- s << XSTR(MOD_RGUI) << " | ";
- } else if ((mods & MOD_LGUI) == MOD_LGUI) {
- s << XSTR(MOD_LGUI) << " | ";
- }
-
- auto _mods = s.str();
-
- if (_mods.size()) {
- _mods.resize(_mods.size() - 3);
- }
-
- return std::string(_mods);
-}
-
-std::string get_qk_mods(uint16_t keycode) {
- std::stringstream s;
- if ((keycode & QK_RCTL) == QK_RCTL) {
- s << XSTR(QK_RCTL) << " | ";
- } else if ((keycode & QK_LCTL) == QK_LCTL) {
- s << XSTR(QK_LCTL) << " | ";
- }
-
- if ((keycode & QK_RSFT) == QK_RSFT) {
- s << XSTR(QK_RSFT) << " | ";
- } else if ((keycode & QK_LSFT) == QK_LSFT) {
- s << XSTR(QK_LSFT) << " | ";
- }
-
- if ((keycode & QK_RALT) == QK_RALT) {
- s << XSTR(QK_RALT) << " | ";
- } else if ((keycode & QK_LALT) == QK_LALT) {
- s << XSTR(QK_LALT) << " | ";
- }
-
- if ((keycode & QK_RGUI) == QK_RGUI) {
- s << XSTR(QK_RGUI) << " | ";
- } else if ((keycode & QK_LGUI) == QK_LGUI) {
- s << XSTR(QK_LGUI) << " | ";
- }
-
- auto _mods = s.str();
-
- if (_mods.size()) {
- _mods.resize(_mods.size() - 3);
- }
-
- return std::string(_mods);
-}
-
-std::string generate_identifier(uint16_t kc) {
- std::stringstream s;
- if (IS_QK_MOD_TAP(kc)) {
- s << "MT(" << get_mods(QK_MOD_TAP_GET_MODS(kc)) << ", " << KEYCODE_ID_TABLE.at(kc & 0xFF) << ")";
- } else if (IS_QK_LAYER_TAP(kc)) {
- s << "LT(" << +QK_LAYER_TAP_GET_LAYER(kc) << ", " << KEYCODE_ID_TABLE.at(kc & 0xFF) << ")";
- } else if (IS_QK_TO(kc)) {
- s << "TO(" << +QK_TO_GET_LAYER(kc) << ")";
- } else if (IS_QK_MOMENTARY(kc)) {
- s << "MO(" << +QK_MOMENTARY_GET_LAYER(kc) << ")";
- } else if (IS_QK_DEF_LAYER(kc)) {
- s << "DF(" << +QK_DEF_LAYER_GET_LAYER(kc) << ")";
- } else if (IS_QK_PERSISTENT_DEF_LAYER(kc)) {
- s << "PDF(" << +QK_PERSISTENT_DEF_LAYER_GET_LAYER(kc) << ")";
- } else if (IS_QK_TOGGLE_LAYER(kc)) {
- s << "TG(" << +QK_TOGGLE_LAYER_GET_LAYER(kc) << ")";
- } else if (IS_QK_LAYER_TAP_TOGGLE(kc)) {
- s << "TT(" << +QK_LAYER_TAP_TOGGLE_GET_LAYER(kc) << ")";
- } else if (IS_QK_ONE_SHOT_LAYER(kc)) {
- s << "OSL(" << +QK_ONE_SHOT_LAYER_GET_LAYER(kc) << ")";
- } else if (IS_QK_LAYER_MOD(kc)) {
- s << "LM(" << +QK_LAYER_MOD_GET_LAYER(kc) << ", " << get_mods(QK_LAYER_MOD_GET_MODS(kc)) << ")";
- } else if (IS_QK_ONE_SHOT_MOD(kc)) {
- s << "OSM(" << get_mods(QK_ONE_SHOT_MOD_GET_MODS(kc)) << ")";
- } else if (IS_QK_MODS(kc)) {
- s << "QK_MODS(" << KEYCODE_ID_TABLE.at(QK_MODS_GET_BASIC_KEYCODE(kc)) << ", " << get_qk_mods(kc) << ")";
- } else if (IS_QK_TAP_DANCE(kc)) {
- s << "TD(" << +(kc & 0xFF) << ")";
- } else {
- // Fallback - we didn't found any matching keycode, generate the hex representation.
- s << "unknown keycode: 0x" << std::hex << kc << ". Add conversion to " << XSTR(generate_identifier);
- }
-
- return std::string(s.str());
-}
-
-std::string get_keycode_identifier_or_default(uint16_t keycode) {
- auto identifier = KEYCODE_ID_TABLE.find(keycode);
- if (identifier != KEYCODE_ID_TABLE.end()) {
- return identifier->second;
- }
-
- KEYCODE_ID_TABLE[keycode] = generate_identifier(keycode);
-
- return KEYCODE_ID_TABLE[keycode];
-}
diff --git a/tests/test_common/keycode_util.hpp b/tests/test_common/keycode_util.hpp
deleted file mode 100644
index 3143ab364e..0000000000
--- a/tests/test_common/keycode_util.hpp
+++ /dev/null
@@ -1,6 +0,0 @@
-#pragma once
-
-#include <cstdint>
-#include <string>
-
-std::string get_keycode_identifier_or_default(uint16_t keycode);
diff --git a/tests/test_common/test_driver.hpp b/tests/test_common/test_driver.hpp
index fea8225953..5c36c80dfc 100644
--- a/tests/test_common/test_driver.hpp
+++ b/tests/test_common/test_driver.hpp
@@ -20,7 +20,9 @@
#include <stdint.h>
#include "host.h"
#include "keyboard_report_util.hpp"
-#include "keycode_util.hpp"
+extern "C" {
+#include "keycode_string.h"
+}
#include "test_logger.hpp"
class TestDriver {
@@ -146,11 +148,11 @@ class TestDriver {
/** @brief Tests whether keycode `actual` is equal to `expected`. */
#define EXPECT_KEYCODE_EQ(actual, expected) EXPECT_THAT((actual), KeycodeEq((expected)))
-MATCHER_P(KeycodeEq, expected_keycode, "is equal to " + testing::PrintToString(expected_keycode) + ", keycode " + get_keycode_identifier_or_default(expected_keycode)) {
+MATCHER_P(KeycodeEq, expected_keycode, "is equal to " + testing::PrintToString(expected_keycode) + ", keycode " + get_keycode_string(expected_keycode)) {
if (arg == expected_keycode) {
return true;
}
- *result_listener << "keycode " << get_keycode_identifier_or_default(arg);
+ *result_listener << "keycode " << get_keycode_string(arg);
return false;
}
diff --git a/tests/test_common/test_fixture.cpp b/tests/test_common/test_fixture.cpp
index 81806b0e6d..00084721d6 100644
--- a/tests/test_common/test_fixture.cpp
+++ b/tests/test_common/test_fixture.cpp
@@ -46,7 +46,7 @@ void TestFixture::SetUpTestCase() {
// The following is enough to bootstrap the values set in main
eeconfig_init_quantum();
- eeconfig_update_debug(debug_config.raw);
+ eeconfig_update_debug(&debug_config);
TestDriver driver;
keyboard_init();
diff --git a/tests/test_common/test_keymap_key.hpp b/tests/test_common/test_keymap_key.hpp
index 37b4c827e4..ba2c2912e3 100644
--- a/tests/test_common/test_keymap_key.hpp
+++ b/tests/test_common/test_keymap_key.hpp
@@ -18,10 +18,10 @@
#include <cstddef>
#include <string>
-#include "keycode_util.hpp"
extern "C" {
#include "keyboard.h"
#include "test_matrix.h"
+#include "keycode_string.h"
}
#include <cassert>
@@ -29,11 +29,11 @@ extern "C" {
typedef uint8_t layer_t;
struct KeymapKey {
- KeymapKey(layer_t layer, uint8_t col, uint8_t row, uint16_t keycode) : layer(layer), position({.col = col, .row = row}), code(keycode), report_code(keycode), name(get_keycode_identifier_or_default(keycode)) {
+ KeymapKey(layer_t layer, uint8_t col, uint8_t row, uint16_t keycode) : layer(layer), position({.col = col, .row = row}), code(keycode), report_code(keycode), name(get_keycode_string(keycode)) {
validate();
}
- KeymapKey(layer_t layer, uint8_t col, uint8_t row, uint16_t keycode, uint16_t report_code) : layer(layer), position({.col = col, .row = row}), code(keycode), report_code(report_code), name{get_keycode_identifier_or_default(keycode)} {
+ KeymapKey(layer_t layer, uint8_t col, uint8_t row, uint16_t keycode, uint16_t report_code) : layer(layer), position({.col = col, .row = row}), code(keycode), report_code(report_code), name{get_keycode_string(keycode)} {
validate();
}
diff --git a/users/_example/_example.c b/users/_example/_example.c
index 8e0778b122..5f9580d8e9 100644
--- a/users/_example/_example.c
+++ b/users/_example/_example.c
@@ -2,4 +2,4 @@
void my_custom_function(void) {
-} \ No newline at end of file
+}
diff --git a/users/_example/_example.h b/users/_example/_example.h
index f7c7990257..72907d06d7 100644
--- a/users/_example/_example.h
+++ b/users/_example/_example.h
@@ -5,4 +5,4 @@
void my_custom_function(void);
-#endif \ No newline at end of file
+#endif
diff --git a/users/_example/readme.md b/users/_example/readme.md
index fdea33b67a..d6ead7efd2 100644
--- a/users/_example/readme.md
+++ b/users/_example/readme.md
@@ -11,4 +11,4 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>. \ No newline at end of file
+along with this program. If not, see <http://www.gnu.org/licenses/>.
diff --git a/users/_example/rules.mk b/users/_example/rules.mk
index 250adc3d0d..af076dd7fe 100644
--- a/users/_example/rules.mk
+++ b/users/_example/rules.mk
@@ -1 +1 @@
-SRC += _example.c \ No newline at end of file
+SRC += _example.c
diff --git a/users/readme.md b/users/readme.md
index d8f14d8beb..8a490c28ce 100644
--- a/users/readme.md
+++ b/users/readme.md
@@ -1,3 +1,3 @@
# User space
-This is a place for users to put code that they might use between keyboards. If you build the keymap `mine`, `/users/mine/rules.mk` will be included in your build, and `/users/mine/` will be in your path - keep these things in mind when naming your files and referencing them from other places. \ No newline at end of file
+This is a place for users to put code that they might use between keyboards. If you build the keymap `mine`, `/users/mine/rules.mk` will be included in your build, and `/users/mine/` will be in your path - keep these things in mind when naming your files and referencing them from other places.
diff --git a/util/regen.sh b/util/regen.sh
index ab03018893..df40444f80 100755
--- a/util/regen.sh
+++ b/util/regen.sh
@@ -3,7 +3,6 @@ set -e
qmk generate-rgb-breathe-table -o quantum/rgblight/rgblight_breathe_table.h
qmk generate-keycodes --version latest -o quantum/keycodes.h
-qmk generate-keycodes-tests --version latest -o tests/test_common/keycode_table.cpp
for lang in $(find data/constants/keycodes/extras/ -type f -exec basename '{}' \; | sed "s/keycodes_\(.*\)_[0-9].*/\1/"); do
qmk generate-keycode-extras --version latest --lang $lang -o quantum/keymap_extras/keymap_$lang.h
diff --git a/util/usb_detach/usb_detach.c b/util/usb_detach/usb_detach.c
index 786ab5e674..8047c37ba3 100644
--- a/util/usb_detach/usb_detach.c
+++ b/util/usb_detach/usb_detach.c
@@ -31,4 +31,4 @@ int main(int argc, char**argv)
printf ("usage: %s /dev/bus/usb/BUS/DEVICE\n",argv[0]);
printf("Release all interfaces of this usb device for usage in virtualisation\n");
}
-} \ No newline at end of file
+}