/* DO NOT EDIT! This is an autogenerated file. See scripts/buildcommands.py. */ #include "board/irq.h" #include "board/pgm.h" #include "command.h" #include "compiler.h" #include "initial_pins.h" void ctr_run_initfuncs(void) { extern void alloc_init(void); alloc_init(); extern void initial_pins_setup(void); initial_pins_setup(); extern void timer_init(void); timer_init(); } void ctr_run_shutdownfuncs(void) { extern void sendf_shutdown(void); sendf_shutdown(); extern void move_reset(void); move_reset(); extern void digital_out_shutdown(void); digital_out_shutdown(); extern void stepper_shutdown(void); stepper_shutdown(); extern void trsync_shutdown(void); trsync_shutdown(); extern void analog_in_shutdown(void); analog_in_shutdown(); extern void spidev_shutdown(void); spidev_shutdown(); extern void pwm_shutdown(void); pwm_shutdown(); extern void st7920_shutdown(void); st7920_shutdown(); extern void hd44780_shutdown(void); hd44780_shutdown(); extern void tmcuart_shutdown(void); tmcuart_shutdown(); extern void pca9685_shutdown(void); pca9685_shutdown(); } void ctr_run_taskfuncs(void) { irq_poll(); extern void trsync_task(void); trsync_task(); irq_poll(); extern void analog_in_task(void); analog_in_task(); irq_poll(); extern void thermocouple_task(void); thermocouple_task(); irq_poll(); extern void adxl345_task(void); adxl345_task(); irq_poll(); extern void spi_angle_task(void); spi_angle_task(); irq_poll(); extern void mpu9250_task(void); mpu9250_task(); irq_poll(); extern void buttons_task(void); buttons_task(); irq_poll(); extern void tmcuart_task(void); tmcuart_task(); irq_poll(); extern void counter_task(void); counter_task(); irq_poll(); extern void console_task(void); console_task(); irq_poll(); extern void watchdog_task(void); watchdog_task(); irq_poll(); extern void ds18_task(void); ds18_task(); irq_poll(); } uint8_t __always_inline ctr_lookup_static_string(const char *str) { if (__builtin_strcmp(str, "Shutdown cleared when not shutdown") == 0) return 2; if (__builtin_strcmp(str, "Timer too close") == 0) return 3; if (__builtin_strcmp(str, "sentinel timer called") == 0) return 4; if (__builtin_strcmp(str, "Invalid command") == 0) return 5; if (__builtin_strcmp(str, "Message encode error") == 0) return 6; if (__builtin_strcmp(str, "Command parser error") == 0) return 7; if (__builtin_strcmp(str, "Command request") == 0) return 8; if (__builtin_strcmp(str, "config_reset only available when shutdown") == 0) return 9; if (__builtin_strcmp(str, "oids already allocated") == 0) return 10; if (__builtin_strcmp(str, "Can't assign oid") == 0) return 11; if (__builtin_strcmp(str, "Invalid oid type") == 0) return 12; if (__builtin_strcmp(str, "Already finalized") == 0) return 13; if (__builtin_strcmp(str, "Invalid move request size") == 0) return 14; if (__builtin_strcmp(str, "Move queue overflow") == 0) return 15; if (__builtin_strcmp(str, "alloc_chunks failed") == 0) return 16; if (__builtin_strcmp(str, "alloc_chunk failed") == 0) return 17; if (__builtin_strcmp(str, "update_digital_out not valid with active queue") == 0) return 18; if (__builtin_strcmp(str, "Scheduled digital out event will exceed max_duration") == 0) return 19; if (__builtin_strcmp(str, "Can not set soft pwm cycle ticks while updates pending") == 0) return 20; if (__builtin_strcmp(str, "Missed scheduling of next digital out event") == 0) return 21; if (__builtin_strcmp(str, "Can't reset time when stepper active") == 0) return 22; if (__builtin_strcmp(str, "Invalid count parameter") == 0) return 23; if (__builtin_strcmp(str, "Stepper too far in past") == 0) return 24; if (__builtin_strcmp(str, "Can't add signal that is already active") == 0) return 25; if (__builtin_strcmp(str, "ADC out of range") == 0) return 26; if (__builtin_strcmp(str, "Invalid spi config") == 0) return 27; if (__builtin_strcmp(str, "Thermocouple reader fault") == 0) return 28; if (__builtin_strcmp(str, "Thermocouple ADC out of range") == 0) return 29; if (__builtin_strcmp(str, "Invalid thermocouple chip type") == 0) return 30; if (__builtin_strcmp(str, "i2c_modify_bits: Odd number of bits!") == 0) return 31; if (__builtin_strcmp(str, "Scheduled pwm event will exceed max_duration") == 0) return 32; if (__builtin_strcmp(str, "Missed scheduling of next hard pwm event") == 0) return 33; if (__builtin_strcmp(str, "angle sensor requires cs pin") == 0) return 34; if (__builtin_strcmp(str, "Invalid spi_angle chip type") == 0) return 35; if (__builtin_strcmp(str, "Invalid buttons retransmit count") == 0) return 36; if (__builtin_strcmp(str, "Set button past maximum button count") == 0) return 37; if (__builtin_strcmp(str, "Max of 8 buttons") == 0) return 38; if (__builtin_strcmp(str, "tmcuart data too large") == 0) return 39; if (__builtin_strcmp(str, "Invalid neopixel update command") == 0) return 40; if (__builtin_strcmp(str, "Invalid neopixel data_size") == 0) return 41; if (__builtin_strcmp(str, "Rescheduled timer in the past") == 0) return 42; if (__builtin_strcmp(str, "Force shutdown command") == 0) return 43; if (__builtin_strcmp(str, "Invalid pca9685 channel or value") == 0) return 44; if (__builtin_strcmp(str, "Scheduled pca9685 event will exceed max_duration") == 0) return 45; if (__builtin_strcmp(str, "Invalid pca9685 value") == 0) return 46; if (__builtin_strcmp(str, "Missed scheduling of next pca9685 event") == 0) return 47; if (__builtin_strcmp(str, "Unable to open and init PCA9685 device") == 0) return 48; if (__builtin_strcmp(str, "Too many i2c devices") == 0) return 49; if (__builtin_strcmp(str, "All PCA9685 channels must have the same cycle_ticks") == 0) return 50; if (__builtin_strcmp(str, "Unable to update PCA9685 value") == 0) return 51; if (__builtin_strcmp(str, "Unable to write to spi") == 0) return 52; if (__builtin_strcmp(str, "Unable to issue spi ioctl") == 0) return 53; if (__builtin_strcmp(str, "Unable to set SPI mode") == 0) return 54; if (__builtin_strcmp(str, "Unable to set SPI speed") == 0) return 55; if (__builtin_strcmp(str, "Unable to set non-blocking on spi device") == 0) return 56; if (__builtin_strcmp(str, "Unable to open spi device") == 0) return 57; if (__builtin_strcmp(str, "Too many spi devices") == 0) return 58; if (__builtin_strcmp(str, "Error on analog read") == 0) return 59; if (__builtin_strcmp(str, "Unable to open adc device") == 0) return 60; if (__builtin_strcmp(str, "Unable to config pwm device") == 0) return 61; if (__builtin_strcmp(str, "Unable to read i2c device") == 0) return 62; if (__builtin_strcmp(str, "Unable write i2c device") == 0) return 63; if (__builtin_strcmp(str, "Unable to open i2c device") == 0) return 64; if (__builtin_strcmp(str, "Unable to open in GPIO chip line") == 0) return 65; if (__builtin_strcmp(str, "Unable to open out GPIO chip line") == 0) return 66; if (__builtin_strcmp(str, "Unable to open GPIO chip device") == 0) return 67; if (__builtin_strcmp(str, "GPIO chip device not found") == 0) return 68; if (__builtin_strcmp(str, "DS18B20 sensor didn't respond in time") == 0) return 69; if (__builtin_strcmp(str, "DS18B20 out of range") == 0) return 70; if (__builtin_strcmp(str, "Error reading DS18B20 sensor") == 0) return 71; if (__builtin_strcmp(str, "Error getting monotonic clock time") == 0) return 72; if (__builtin_strcmp(str, "Could not start DS18B20 reader thread") == 0) return 73; if (__builtin_strcmp(str, "Could not start DS18B20 reader thread (cond init)") == 0) return 74; if (__builtin_strcmp(str, "Could not start DS18B20 reader thread (mutex init)") == 0) return 75; if (__builtin_strcmp(str, "Invalid DS18B20 serial id, could not open for reading") == 0) return 76; if (__builtin_strcmp(str, "Invalid DS18B20 serial id, must not contain '/'") == 0) return 77; return 0xff; } const struct initial_pin_s initial_pins[] PROGMEM = { }; const int initial_pins_size PROGMEM = ARRAY_SIZE(initial_pins); static const uint8_t command_parameters0[] PROGMEM = { PT_uint16 }; static const uint8_t command_parameters1[] PROGMEM = { PT_uint32, PT_uint16 }; static const uint8_t command_parameters2[] PROGMEM = { PT_uint32, PT_progmem_buffer }; static const uint8_t command_parameters3[] PROGMEM = { PT_uint32, PT_uint32, PT_uint32 }; static const uint8_t command_parameters4[] PROGMEM = { PT_uint32, PT_uint32 }; static const uint8_t command_parameters5[] PROGMEM = { PT_uint32 }; static const uint8_t command_parameters6[] PROGMEM = { PT_byte, PT_uint32, PT_byte, PT_uint16 }; static const uint8_t command_parameters7[] PROGMEM = { PT_buffer }; static const uint8_t command_parameters8[] PROGMEM = { PT_byte, PT_int32 }; static const uint8_t command_parameters9[] PROGMEM = { PT_byte, PT_byte, PT_uint32, PT_byte }; static const uint8_t command_parameters10[] PROGMEM = { PT_byte, PT_byte, PT_byte, PT_uint32 }; static const uint8_t command_parameters11[] PROGMEM = { PT_byte, PT_uint32, PT_uint16 }; static const uint8_t command_parameters12[] PROGMEM = { PT_byte, PT_buffer }; static const uint8_t command_parameters13[] PROGMEM = { PT_byte, PT_uint32, PT_uint32, PT_byte }; static const uint8_t command_parameters14[] PROGMEM = { PT_byte, PT_uint32, PT_uint32, PT_uint16, PT_byte, PT_byte, PT_uint16 }; static const uint8_t command_parameters15[] PROGMEM = { PT_byte, PT_uint16, PT_buffer }; static const uint8_t command_parameters16[] PROGMEM = { PT_byte, PT_uint32, PT_buffer }; static const uint8_t command_parameters17[] PROGMEM = { PT_byte, PT_uint16 }; static const uint8_t command_parameters18[] PROGMEM = { PT_byte, PT_uint32, PT_uint32, PT_uint16, PT_byte, PT_uint32, PT_uint16 }; static const uint8_t command_parameters19[] PROGMEM = { PT_byte, PT_byte, PT_buffer }; static const uint8_t command_parameters20[] PROGMEM = { PT_byte, PT_byte }; static const uint8_t command_parameters21[] PROGMEM = { PT_byte, PT_uint32, PT_uint32, PT_uint32 }; static const uint8_t command_parameters22[] PROGMEM = { PT_byte, PT_uint32, PT_int32, PT_uint32 }; static const uint8_t command_parameters23[] PROGMEM = { PT_uint32, PT_byte }; static const uint8_t command_parameters24[] PROGMEM = { PT_byte }; static const uint8_t command_parameters25[] PROGMEM = { PT_byte, PT_uint32, PT_uint32 }; static const uint8_t command_parameters26[] PROGMEM = { PT_byte, PT_uint32 }; static const uint8_t command_parameters27[] PROGMEM = { PT_byte, PT_uint32, PT_byte, PT_byte, PT_uint32 }; static const uint8_t command_parameters28[] PROGMEM = { PT_byte, PT_uint32, PT_uint16, PT_int16 }; static const uint8_t command_parameters29[] PROGMEM = { PT_byte, PT_byte, PT_byte, PT_byte, PT_uint32 }; static const uint8_t command_parameters30[] PROGMEM = { PT_byte, PT_uint32, PT_uint32, PT_byte, PT_uint32, PT_byte, PT_byte, PT_byte }; static const uint8_t command_parameters31[] PROGMEM = { PT_byte, PT_byte, PT_byte }; static const uint8_t command_parameters32[] PROGMEM = { PT_byte, PT_uint32, PT_uint32, PT_byte, PT_uint32, PT_uint16, PT_uint16, PT_byte }; static const uint8_t command_parameters33[] PROGMEM = { PT_byte, PT_uint32, PT_byte }; static const uint8_t command_parameters34[] PROGMEM = { PT_byte, PT_uint32, PT_uint32, PT_uint32, PT_uint32 }; static const uint8_t command_parameters35[] PROGMEM = { PT_byte, PT_buffer, PT_buffer }; static const uint8_t command_parameters36[] PROGMEM = { PT_byte, PT_buffer, PT_uint32 }; static const uint8_t command_parameters37[] PROGMEM = { PT_uint32, PT_uint32, PT_uint16 }; static const uint8_t command_parameters38[] PROGMEM = { PT_byte, PT_uint32, PT_uint32, PT_uint16, PT_uint16, PT_uint32 }; static const uint8_t command_parameters39[] PROGMEM = { PT_byte, PT_uint32, PT_uint32, PT_uint32, PT_uint32, PT_uint32 }; static const uint8_t command_parameters40[] PROGMEM = { PT_byte, PT_uint32, PT_uint32, PT_uint32, PT_uint32, PT_uint32, PT_uint32, PT_uint32 }; static const uint8_t command_parameters41[] PROGMEM = { PT_byte, PT_uint32, PT_uint32, PT_byte, PT_byte }; static const uint8_t command_parameters42[] PROGMEM = { PT_byte, PT_buffer, PT_byte }; static const uint8_t command_parameters43[] PROGMEM = { PT_byte, PT_uint32, PT_byte, PT_uint32, PT_uint32 }; static const uint8_t command_parameters44[] PROGMEM = { PT_byte, PT_uint32, PT_uint16, PT_uint32, PT_uint32 }; static const uint8_t command_parameters45[] PROGMEM = { PT_byte, PT_byte, PT_byte, PT_uint32, PT_uint16 }; static const uint8_t command_parameters46[] PROGMEM = { PT_byte, PT_byte, PT_byte, PT_byte, PT_uint32, PT_uint16, PT_uint16, PT_uint32 }; static const uint8_t command_parameters47[] PROGMEM = { PT_byte, PT_uint32, PT_uint32, PT_int32, PT_int32 }; const struct command_encoder command_encoder_81 PROGMEM = { // starting .msg_id=81, .num_params=0, .param_types = 0, .max_size=6, }; const struct command_encoder command_encoder_82 PROGMEM = { // is_shutdown static_string_id=%hu .msg_id=82, .num_params=1, .param_types = command_parameters0, .max_size=9, }; const struct command_encoder command_encoder_83 PROGMEM = { // shutdown clock=%u static_string_id=%hu .msg_id=83, .num_params=2, .param_types = command_parameters1, .max_size=14, }; const struct command_encoder command_encoder_0 PROGMEM = { // identify_response offset=%u data=%.*s .msg_id=0, .num_params=2, .param_types = command_parameters2, .max_size=64, }; const struct command_encoder command_encoder_84 PROGMEM = { // stats count=%u sum=%u sumsq=%u .msg_id=84, .num_params=3, .param_types = command_parameters3, .max_size=21, }; const struct command_encoder command_encoder_85 PROGMEM = { // uptime high=%u clock=%u .msg_id=85, .num_params=2, .param_types = command_parameters4, .max_size=16, }; const struct command_encoder command_encoder_86 PROGMEM = { // clock clock=%u .msg_id=86, .num_params=1, .param_types = command_parameters5, .max_size=11, }; const struct command_encoder command_encoder_87 PROGMEM = { // config is_config=%c crc=%u is_shutdown=%c move_count=%hu .msg_id=87, .num_params=4, .param_types = command_parameters6, .max_size=18, }; const struct command_encoder command_encoder_88 PROGMEM = { // pong data=%*s .msg_id=88, .num_params=1, .param_types = command_parameters7, .max_size=64, }; const struct command_encoder command_encoder_89 PROGMEM = { // debug_result val=%u .msg_id=89, .num_params=1, .param_types = command_parameters5, .max_size=11, }; const struct command_encoder command_encoder_90 PROGMEM = { // stepper_position oid=%c pos=%i .msg_id=90, .num_params=2, .param_types = command_parameters8, .max_size=13, }; const struct command_encoder command_encoder_91 PROGMEM = { // endstop_state oid=%c homing=%c next_clock=%u pin_value=%c .msg_id=91, .num_params=4, .param_types = command_parameters9, .max_size=17, }; const struct command_encoder command_encoder_92 PROGMEM = { // trsync_state oid=%c can_trigger=%c trigger_reason=%c clock=%u .msg_id=92, .num_params=4, .param_types = command_parameters10, .max_size=17, }; const struct command_encoder command_encoder_93 PROGMEM = { // analog_in_state oid=%c next_clock=%u value=%hu .msg_id=93, .num_params=3, .param_types = command_parameters11, .max_size=16, }; const struct command_encoder command_encoder_94 PROGMEM = { // spi_transfer_response oid=%c response=%*s .msg_id=94, .num_params=2, .param_types = command_parameters12, .max_size=64, }; const struct command_encoder command_encoder_95 PROGMEM = { // thermocouple_result oid=%c next_clock=%u value=%u fault=%c .msg_id=95, .num_params=4, .param_types = command_parameters13, .max_size=20, }; const struct command_encoder command_encoder_96 PROGMEM = { // i2c_read_response oid=%c response=%*s .msg_id=96, .num_params=2, .param_types = command_parameters12, .max_size=64, }; const struct command_encoder command_encoder_97 PROGMEM = { // adxl345_status oid=%c clock=%u query_ticks=%u next_sequence=%hu buffered=%c fifo=%c limit_count=%hu .msg_id=97, .num_params=7, .param_types = command_parameters14, .max_size=28, }; const struct command_encoder command_encoder_98 PROGMEM = { // adxl345_data oid=%c sequence=%hu data=%*s .msg_id=98, .num_params=3, .param_types = command_parameters15, .max_size=64, }; const struct command_encoder command_encoder_99 PROGMEM = { // spi_angle_transfer_response oid=%c clock=%u response=%*s .msg_id=99, .num_params=3, .param_types = command_parameters16, .max_size=64, }; const struct command_encoder command_encoder_100 PROGMEM = { // spi_angle_end oid=%c sequence=%hu .msg_id=100, .num_params=2, .param_types = command_parameters17, .max_size=11, }; const struct command_encoder command_encoder_101 PROGMEM = { // spi_angle_data oid=%c sequence=%hu data=%*s .msg_id=101, .num_params=3, .param_types = command_parameters15, .max_size=64, }; const struct command_encoder command_encoder_102 PROGMEM = { // mpu9250_status oid=%c clock=%u query_ticks=%u next_sequence=%hu buffered=%c fifo=%u limit_count=%hu .msg_id=102, .num_params=7, .param_types = command_parameters18, .max_size=31, }; const struct command_encoder command_encoder_103 PROGMEM = { // mpu9250_data oid=%c sequence=%hu data=%*s .msg_id=103, .num_params=3, .param_types = command_parameters15, .max_size=64, }; const struct command_encoder command_encoder_104 PROGMEM = { // buttons_state oid=%c ack_count=%c state=%*s .msg_id=104, .num_params=3, .param_types = command_parameters19, .max_size=64, }; const struct command_encoder command_encoder_105 PROGMEM = { // tmcuart_response oid=%c read=%*s .msg_id=105, .num_params=2, .param_types = command_parameters12, .max_size=64, }; const struct command_encoder command_encoder_106 PROGMEM = { // neopixel_result oid=%c success=%c .msg_id=106, .num_params=2, .param_types = command_parameters20, .max_size=10, }; const struct command_encoder command_encoder_107 PROGMEM = { // counter_state oid=%c next_clock=%u count=%u count_clock=%u .msg_id=107, .num_params=4, .param_types = command_parameters21, .max_size=23, }; const struct command_encoder command_encoder_108 PROGMEM = { // ds18b20_result oid=%c next_clock=%u value=%i fault=%u .msg_id=108, .num_params=4, .param_types = command_parameters22, .max_size=23, }; const __always_inline struct command_encoder * ctr_lookup_encoder(const char *str) { if (__builtin_strcmp(str, "starting") == 0) return &command_encoder_81; if (__builtin_strcmp(str, "is_shutdown static_string_id=%hu") == 0) return &command_encoder_82; if (__builtin_strcmp(str, "shutdown clock=%u static_string_id=%hu") == 0) return &command_encoder_83; if (__builtin_strcmp(str, "identify_response offset=%u data=%.*s") == 0) return &command_encoder_0; if (__builtin_strcmp(str, "stats count=%u sum=%u sumsq=%u") == 0) return &command_encoder_84; if (__builtin_strcmp(str, "uptime high=%u clock=%u") == 0) return &command_encoder_85; if (__builtin_strcmp(str, "clock clock=%u") == 0) return &command_encoder_86; if (__builtin_strcmp(str, "config is_config=%c crc=%u is_shutdown=%c move_count=%hu") == 0) return &command_encoder_87; if (__builtin_strcmp(str, "pong data=%*s") == 0) return &command_encoder_88; if (__builtin_strcmp(str, "debug_result val=%u") == 0) return &command_encoder_89; if (__builtin_strcmp(str, "stepper_position oid=%c pos=%i") == 0) return &command_encoder_90; if (__builtin_strcmp(str, "endstop_state oid=%c homing=%c next_clock=%u pin_value=%c") == 0) return &command_encoder_91; if (__builtin_strcmp(str, "trsync_state oid=%c can_trigger=%c trigger_reason=%c clock=%u") == 0) return &command_encoder_92; if (__builtin_strcmp(str, "analog_in_state oid=%c next_clock=%u value=%hu") == 0) return &command_encoder_93; if (__builtin_strcmp(str, "spi_transfer_response oid=%c response=%*s") == 0) return &command_encoder_94; if (__builtin_strcmp(str, "thermocouple_result oid=%c next_clock=%u value=%u fault=%c") == 0) return &command_encoder_95; if (__builtin_strcmp(str, "i2c_read_response oid=%c response=%*s") == 0) return &command_encoder_96; if (__builtin_strcmp(str, "adxl345_status oid=%c clock=%u query_ticks=%u next_sequence=%hu buffered=%c fifo=%c limit_count=%hu") == 0) return &command_encoder_97; if (__builtin_strcmp(str, "adxl345_data oid=%c sequence=%hu data=%*s") == 0) return &command_encoder_98; if (__builtin_strcmp(str, "spi_angle_transfer_response oid=%c clock=%u response=%*s") == 0) return &command_encoder_99; if (__builtin_strcmp(str, "spi_angle_end oid=%c sequence=%hu") == 0) return &command_encoder_100; if (__builtin_strcmp(str, "spi_angle_data oid=%c sequence=%hu data=%*s") == 0) return &command_encoder_101; if (__builtin_strcmp(str, "mpu9250_status oid=%c clock=%u query_ticks=%u next_sequence=%hu buffered=%c fifo=%u limit_count=%hu") == 0) return &command_encoder_102; if (__builtin_strcmp(str, "mpu9250_data oid=%c sequence=%hu data=%*s") == 0) return &command_encoder_103; if (__builtin_strcmp(str, "buttons_state oid=%c ack_count=%c state=%*s") == 0) return &command_encoder_104; if (__builtin_strcmp(str, "tmcuart_response oid=%c read=%*s") == 0) return &command_encoder_105; if (__builtin_strcmp(str, "neopixel_result oid=%c success=%c") == 0) return &command_encoder_106; if (__builtin_strcmp(str, "counter_state oid=%c next_clock=%u count=%u count_clock=%u") == 0) return &command_encoder_107; if (__builtin_strcmp(str, "ds18b20_result oid=%c next_clock=%u value=%i fault=%u") == 0) return &command_encoder_108; return NULL; } const __always_inline struct command_encoder * ctr_lookup_output(const char *str) { return NULL; } extern void command_allocate_oids(uint32_t*); extern void command_buttons_ack(uint32_t*); extern void command_buttons_add(uint32_t*); extern void command_buttons_query(uint32_t*); extern void command_clear_shutdown(uint32_t*); extern void command_config_adxl345(uint32_t*); extern void command_config_analog_in(uint32_t*); extern void command_config_buttons(uint32_t*); extern void command_config_counter(uint32_t*); extern void command_config_digital_out(uint32_t*); extern void command_config_ds18b20(uint32_t*); extern void command_config_endstop(uint32_t*); extern void command_config_hd44780(uint32_t*); extern void command_config_i2c(uint32_t*); extern void command_config_mpu9250(uint32_t*); extern void command_config_neopixel(uint32_t*); extern void command_config_pca9685(uint32_t*); extern void command_config_pwm_out(uint32_t*); extern void command_config_reset(uint32_t*); extern void command_config_spi(uint32_t*); extern void command_config_spi_angle(uint32_t*); extern void command_config_spi_shutdown(uint32_t*); extern void command_config_spi_without_cs(uint32_t*); extern void command_config_st7920(uint32_t*); extern void command_config_stepper(uint32_t*); extern void command_config_thermocouple(uint32_t*); extern void command_config_tmcuart(uint32_t*); extern void command_config_trsync(uint32_t*); extern void command_debug_nop(uint32_t*); extern void command_debug_ping(uint32_t*); extern void command_debug_read(uint32_t*); extern void command_debug_write(uint32_t*); extern void command_emergency_stop(uint32_t*); extern void command_endstop_home(uint32_t*); extern void command_endstop_query_state(uint32_t*); extern void command_finalize_config(uint32_t*); extern void command_get_clock(uint32_t*); extern void command_get_config(uint32_t*); extern void command_get_uptime(uint32_t*); extern void command_hd44780_send_cmds(uint32_t*); extern void command_hd44780_send_data(uint32_t*); extern void command_i2c_modify_bits(uint32_t*); extern void command_i2c_read(uint32_t*); extern void command_i2c_write(uint32_t*); extern void command_identify(uint32_t*); extern void command_neopixel_send(uint32_t*); extern void command_neopixel_update(uint32_t*); extern void command_query_adxl345(uint32_t*); extern void command_query_adxl345_status(uint32_t*); extern void command_query_analog_in(uint32_t*); extern void command_query_counter(uint32_t*); extern void command_query_ds18b20(uint32_t*); extern void command_query_mpu9250(uint32_t*); extern void command_query_mpu9250_status(uint32_t*); extern void command_query_spi_angle(uint32_t*); extern void command_query_thermocouple(uint32_t*); extern void command_queue_digital_out(uint32_t*); extern void command_queue_pca9685_out(uint32_t*); extern void command_queue_pwm_out(uint32_t*); extern void command_queue_step(uint32_t*); extern void command_reset_step_clock(uint32_t*); extern void command_set_digital_out(uint32_t*); extern void command_set_digital_out_pwm_cycle(uint32_t*); extern void command_set_next_step_dir(uint32_t*); extern void command_set_pca9685_out(uint32_t*); extern void command_set_pwm_out(uint32_t*); extern void command_spi_angle_transfer(uint32_t*); extern void command_spi_send(uint32_t*); extern void command_spi_set_bus(uint32_t*); extern void command_spi_set_software_bus(uint32_t*); extern void command_spi_transfer(uint32_t*); extern void command_st7920_send_cmds(uint32_t*); extern void command_st7920_send_data(uint32_t*); extern void command_stepper_get_position(uint32_t*); extern void command_stepper_stop_on_trigger(uint32_t*); extern void command_tmcuart_send(uint32_t*); extern void command_trsync_set_timeout(uint32_t*); extern void command_trsync_start(uint32_t*); extern void command_trsync_trigger(uint32_t*); extern void command_update_digital_out(uint32_t*); const struct command_parser command_index[] PROGMEM = { { }, { // identify offset=%u count=%c .msg_id=1, .num_params=2, .param_types = command_parameters23, .num_args=2, .flags=0x01, .func=command_identify }, { // clear_shutdown .msg_id=2, .num_params=0, .param_types = 0, .num_args=0, .flags=0x01, .func=command_clear_shutdown }, { // emergency_stop .msg_id=3, .num_params=0, .param_types = 0, .num_args=0, .flags=0x01, .func=command_emergency_stop }, { // get_uptime .msg_id=4, .num_params=0, .param_types = 0, .num_args=0, .flags=0x01, .func=command_get_uptime }, { // get_clock .msg_id=5, .num_params=0, .param_types = 0, .num_args=0, .flags=0x01, .func=command_get_clock }, { // finalize_config crc=%u .msg_id=6, .num_params=1, .param_types = command_parameters5, .num_args=1, .flags=0, .func=command_finalize_config }, { // get_config .msg_id=7, .num_params=0, .param_types = 0, .num_args=0, .flags=0x01, .func=command_get_config }, { // allocate_oids count=%c .msg_id=8, .num_params=1, .param_types = command_parameters24, .num_args=1, .flags=0, .func=command_allocate_oids }, { // debug_nop .msg_id=9, .num_params=0, .param_types = 0, .num_args=0, .flags=0x01, .func=command_debug_nop }, { // debug_ping data=%*s .msg_id=10, .num_params=1, .param_types = command_parameters7, .num_args=2, .flags=0x01, .func=command_debug_ping }, { // debug_write order=%c addr=%u val=%u .msg_id=11, .num_params=3, .param_types = command_parameters25, .num_args=3, .flags=0x01, .func=command_debug_write }, { // debug_read order=%c addr=%u .msg_id=12, .num_params=2, .param_types = command_parameters26, .num_args=2, .flags=0x01, .func=command_debug_read }, { // set_digital_out pin=%u value=%c .msg_id=13, .num_params=2, .param_types = command_parameters23, .num_args=2, .flags=0, .func=command_set_digital_out }, { // update_digital_out oid=%c value=%c .msg_id=14, .num_params=2, .param_types = command_parameters20, .num_args=2, .flags=0, .func=command_update_digital_out }, { // queue_digital_out oid=%c clock=%u on_ticks=%u .msg_id=15, .num_params=3, .param_types = command_parameters25, .num_args=3, .flags=0, .func=command_queue_digital_out }, { // set_digital_out_pwm_cycle oid=%c cycle_ticks=%u .msg_id=16, .num_params=2, .param_types = command_parameters26, .num_args=2, .flags=0, .func=command_set_digital_out_pwm_cycle }, { // config_digital_out oid=%c pin=%u value=%c default_value=%c max_duration=%u .msg_id=17, .num_params=5, .param_types = command_parameters27, .num_args=5, .flags=0, .func=command_config_digital_out }, { // stepper_stop_on_trigger oid=%c trsync_oid=%c .msg_id=18, .num_params=2, .param_types = command_parameters20, .num_args=2, .flags=0, .func=command_stepper_stop_on_trigger }, { // stepper_get_position oid=%c .msg_id=19, .num_params=1, .param_types = command_parameters24, .num_args=1, .flags=0, .func=command_stepper_get_position }, { // reset_step_clock oid=%c clock=%u .msg_id=20, .num_params=2, .param_types = command_parameters26, .num_args=2, .flags=0, .func=command_reset_step_clock }, { // set_next_step_dir oid=%c dir=%c .msg_id=21, .num_params=2, .param_types = command_parameters20, .num_args=2, .flags=0, .func=command_set_next_step_dir }, { // queue_step oid=%c interval=%u count=%hu add=%hi .msg_id=22, .num_params=4, .param_types = command_parameters28, .num_args=4, .flags=0, .func=command_queue_step }, { // config_stepper oid=%c step_pin=%c dir_pin=%c invert_step=%c step_pulse_ticks=%u .msg_id=23, .num_params=5, .param_types = command_parameters29, .num_args=5, .flags=0, .func=command_config_stepper }, { // endstop_query_state oid=%c .msg_id=24, .num_params=1, .param_types = command_parameters24, .num_args=1, .flags=0, .func=command_endstop_query_state }, { // endstop_home oid=%c clock=%u sample_ticks=%u sample_count=%c rest_ticks=%u pin_value=%c trsync_oid=%c trigger_reason=%c .msg_id=25, .num_params=8, .param_types = command_parameters30, .num_args=8, .flags=0, .func=command_endstop_home }, { // config_endstop oid=%c pin=%c pull_up=%c .msg_id=26, .num_params=3, .param_types = command_parameters31, .num_args=3, .flags=0, .func=command_config_endstop }, { // trsync_trigger oid=%c reason=%c .msg_id=27, .num_params=2, .param_types = command_parameters20, .num_args=2, .flags=0, .func=command_trsync_trigger }, { // trsync_set_timeout oid=%c clock=%u .msg_id=28, .num_params=2, .param_types = command_parameters26, .num_args=2, .flags=0, .func=command_trsync_set_timeout }, { // trsync_start oid=%c report_clock=%u report_ticks=%u expire_reason=%c .msg_id=29, .num_params=4, .param_types = command_parameters13, .num_args=4, .flags=0, .func=command_trsync_start }, { // config_trsync oid=%c .msg_id=30, .num_params=1, .param_types = command_parameters24, .num_args=1, .flags=0, .func=command_config_trsync }, { // query_analog_in oid=%c clock=%u sample_ticks=%u sample_count=%c rest_ticks=%u min_value=%hu max_value=%hu range_check_count=%c .msg_id=31, .num_params=8, .param_types = command_parameters32, .num_args=8, .flags=0, .func=command_query_analog_in }, { // config_analog_in oid=%c pin=%u .msg_id=32, .num_params=2, .param_types = command_parameters26, .num_args=2, .flags=0, .func=command_config_analog_in }, { // config_spi_shutdown oid=%c spi_oid=%c shutdown_msg=%*s .msg_id=33, .num_params=3, .param_types = command_parameters19, .num_args=4, .flags=0, .func=command_config_spi_shutdown }, { // spi_send oid=%c data=%*s .msg_id=34, .num_params=2, .param_types = command_parameters12, .num_args=3, .flags=0, .func=command_spi_send }, { // spi_transfer oid=%c data=%*s .msg_id=35, .num_params=2, .param_types = command_parameters12, .num_args=3, .flags=0, .func=command_spi_transfer }, { // spi_set_bus oid=%c spi_bus=%u mode=%u rate=%u .msg_id=36, .num_params=4, .param_types = command_parameters21, .num_args=4, .flags=0, .func=command_spi_set_bus }, { // config_spi_without_cs oid=%c .msg_id=37, .num_params=1, .param_types = command_parameters24, .num_args=1, .flags=0, .func=command_config_spi_without_cs }, { // config_spi oid=%c pin=%u cs_active_high=%c .msg_id=38, .num_params=3, .param_types = command_parameters33, .num_args=3, .flags=0, .func=command_config_spi }, { // query_thermocouple oid=%c clock=%u rest_ticks=%u min_value=%u max_value=%u .msg_id=39, .num_params=5, .param_types = command_parameters34, .num_args=5, .flags=0, .func=command_query_thermocouple }, { // config_thermocouple oid=%c spi_oid=%c thermocouple_type=%c .msg_id=40, .num_params=3, .param_types = command_parameters31, .num_args=3, .flags=0, .func=command_config_thermocouple }, { // i2c_modify_bits oid=%c reg=%*s clear_set_bits=%*s .msg_id=41, .num_params=3, .param_types = command_parameters35, .num_args=5, .flags=0, .func=command_i2c_modify_bits }, { // i2c_read oid=%c reg=%*s read_len=%u .msg_id=42, .num_params=3, .param_types = command_parameters36, .num_args=4, .flags=0, .func=command_i2c_read }, { // i2c_write oid=%c data=%*s .msg_id=43, .num_params=2, .param_types = command_parameters12, .num_args=3, .flags=0, .func=command_i2c_write }, { // config_i2c oid=%c i2c_bus=%u rate=%u address=%u .msg_id=44, .num_params=4, .param_types = command_parameters21, .num_args=4, .flags=0, .func=command_config_i2c }, { // set_pwm_out pin=%u cycle_ticks=%u value=%hu .msg_id=45, .num_params=3, .param_types = command_parameters37, .num_args=3, .flags=0, .func=command_set_pwm_out }, { // queue_pwm_out oid=%c clock=%u value=%hu .msg_id=46, .num_params=3, .param_types = command_parameters11, .num_args=3, .flags=0, .func=command_queue_pwm_out }, { // config_pwm_out oid=%c pin=%u cycle_ticks=%u value=%hu default_value=%hu max_duration=%u .msg_id=47, .num_params=6, .param_types = command_parameters38, .num_args=6, .flags=0, .func=command_config_pwm_out }, { // spi_set_software_bus oid=%c miso_pin=%u mosi_pin=%u sclk_pin=%u mode=%u rate=%u .msg_id=48, .num_params=6, .param_types = command_parameters39, .num_args=6, .flags=0, .func=command_spi_set_software_bus }, { // query_adxl345_status oid=%c .msg_id=49, .num_params=1, .param_types = command_parameters24, .num_args=1, .flags=0, .func=command_query_adxl345_status }, { // query_adxl345 oid=%c clock=%u rest_ticks=%u .msg_id=50, .num_params=3, .param_types = command_parameters25, .num_args=3, .flags=0, .func=command_query_adxl345 }, { // config_adxl345 oid=%c spi_oid=%c .msg_id=51, .num_params=2, .param_types = command_parameters20, .num_args=2, .flags=0, .func=command_config_adxl345 }, { // spi_angle_transfer oid=%c data=%*s .msg_id=52, .num_params=2, .param_types = command_parameters12, .num_args=3, .flags=0, .func=command_spi_angle_transfer }, { // query_spi_angle oid=%c clock=%u rest_ticks=%u time_shift=%c .msg_id=53, .num_params=4, .param_types = command_parameters13, .num_args=4, .flags=0, .func=command_query_spi_angle }, { // config_spi_angle oid=%c spi_oid=%c spi_angle_type=%c .msg_id=54, .num_params=3, .param_types = command_parameters31, .num_args=3, .flags=0, .func=command_config_spi_angle }, { // query_mpu9250_status oid=%c .msg_id=55, .num_params=1, .param_types = command_parameters24, .num_args=1, .flags=0, .func=command_query_mpu9250_status }, { // query_mpu9250 oid=%c clock=%u rest_ticks=%u .msg_id=56, .num_params=3, .param_types = command_parameters25, .num_args=3, .flags=0, .func=command_query_mpu9250 }, { // config_mpu9250 oid=%c i2c_oid=%c .msg_id=57, .num_params=2, .param_types = command_parameters20, .num_args=2, .flags=0, .func=command_config_mpu9250 }, { // st7920_send_data oid=%c data=%*s .msg_id=58, .num_params=2, .param_types = command_parameters12, .num_args=3, .flags=0, .func=command_st7920_send_data }, { // st7920_send_cmds oid=%c cmds=%*s .msg_id=59, .num_params=2, .param_types = command_parameters12, .num_args=3, .flags=0, .func=command_st7920_send_cmds }, { // config_st7920 oid=%c cs_pin=%u sclk_pin=%u sid_pin=%u sync_delay_ticks=%u cmd_delay_ticks=%u .msg_id=60, .num_params=6, .param_types = command_parameters39, .num_args=6, .flags=0, .func=command_config_st7920 }, { // hd44780_send_data oid=%c data=%*s .msg_id=61, .num_params=2, .param_types = command_parameters12, .num_args=3, .flags=0, .func=command_hd44780_send_data }, { // hd44780_send_cmds oid=%c cmds=%*s .msg_id=62, .num_params=2, .param_types = command_parameters12, .num_args=3, .flags=0, .func=command_hd44780_send_cmds }, { // config_hd44780 oid=%c rs_pin=%u e_pin=%u d4_pin=%u d5_pin=%u d6_pin=%u d7_pin=%u delay_ticks=%u .msg_id=63, .num_params=8, .param_types = command_parameters40, .num_args=8, .flags=0, .func=command_config_hd44780 }, { // buttons_ack oid=%c count=%c .msg_id=64, .num_params=2, .param_types = command_parameters20, .num_args=2, .flags=0, .func=command_buttons_ack }, { // buttons_query oid=%c clock=%u rest_ticks=%u retransmit_count=%c invert=%c .msg_id=65, .num_params=5, .param_types = command_parameters41, .num_args=5, .flags=0, .func=command_buttons_query }, { // buttons_add oid=%c pos=%c pin=%u pull_up=%c .msg_id=66, .num_params=4, .param_types = command_parameters9, .num_args=4, .flags=0, .func=command_buttons_add }, { // config_buttons oid=%c button_count=%c .msg_id=67, .num_params=2, .param_types = command_parameters20, .num_args=2, .flags=0, .func=command_config_buttons }, { // tmcuart_send oid=%c write=%*s read=%c .msg_id=68, .num_params=3, .param_types = command_parameters42, .num_args=4, .flags=0, .func=command_tmcuart_send }, { // config_tmcuart oid=%c rx_pin=%u pull_up=%c tx_pin=%u bit_time=%u .msg_id=69, .num_params=5, .param_types = command_parameters43, .num_args=5, .flags=0, .func=command_config_tmcuart }, { // neopixel_send oid=%c .msg_id=70, .num_params=1, .param_types = command_parameters24, .num_args=1, .flags=0, .func=command_neopixel_send }, { // neopixel_update oid=%c pos=%hu data=%*s .msg_id=71, .num_params=3, .param_types = command_parameters15, .num_args=4, .flags=0, .func=command_neopixel_update }, { // config_neopixel oid=%c pin=%u data_size=%hu bit_max_ticks=%u reset_min_ticks=%u .msg_id=72, .num_params=5, .param_types = command_parameters44, .num_args=5, .flags=0, .func=command_config_neopixel }, { // query_counter oid=%c clock=%u poll_ticks=%u sample_ticks=%u .msg_id=73, .num_params=4, .param_types = command_parameters21, .num_args=4, .flags=0, .func=command_query_counter }, { // config_counter oid=%c pin=%u pull_up=%c .msg_id=74, .num_params=3, .param_types = command_parameters33, .num_args=3, .flags=0, .func=command_config_counter }, { // config_reset .msg_id=75, .num_params=0, .param_types = 0, .num_args=0, .flags=0x01, .func=command_config_reset }, { // set_pca9685_out bus=%c addr=%c channel=%c cycle_ticks=%u value=%hu .msg_id=76, .num_params=5, .param_types = command_parameters45, .num_args=5, .flags=0, .func=command_set_pca9685_out }, { // queue_pca9685_out oid=%c clock=%u value=%hu .msg_id=77, .num_params=3, .param_types = command_parameters11, .num_args=3, .flags=0, .func=command_queue_pca9685_out }, { // config_pca9685 oid=%c bus=%c addr=%c channel=%c cycle_ticks=%u value=%hu default_value=%hu max_duration=%u .msg_id=78, .num_params=8, .param_types = command_parameters46, .num_args=8, .flags=0, .func=command_config_pca9685 }, { // query_ds18b20 oid=%c clock=%u rest_ticks=%u min_value=%i max_value=%i .msg_id=79, .num_params=5, .param_types = command_parameters47, .num_args=5, .flags=0, .func=command_query_ds18b20 }, { // config_ds18b20 oid=%c serial=%*s max_error_count=%c .msg_id=80, .num_params=3, .param_types = command_parameters42, .num_args=4, .flags=0, .func=command_config_ds18b20 }, }; const uint8_t command_index_size PROGMEM = ARRAY_SIZE(command_index); // version: v0.10.0-530-g3387a9c2 // build_versions: gcc: (Debian 8.3.0-6) 8.3.0 binutils: (GNU Binutils for Debian) 2.31.1 const uint8_t command_identify_data[] PROGMEM = { 0x78, 0xda, 0xa5, 0x1a, 0x6b, 0x6f, 0xdb, 0x38, 0xf2, 0xaf, 0xf0, 0x0c, 0x14, 0xdd, 0x1e, 0x12, 0xaf, 0xad, 0x87, 0x2d, 0x1b, 0xe8, 0x87, 0x34, 0xed, 0x2e, 0x8a, 0xbb, 0x5c, 0xbb, 0x9b, 0x16, 0x77, 0xc0, 0x61, 0x21, 0x28, 0x12, 0x6d, 0x13, 0xd1, 0x6b, 0x45, 0x29, 0x8f, 0x5b, 0xe4, 0xbf, 0xdf, 0x0c, 0x87, 0x2f, 0xc9, 0x4e, 0xda, 0xbb, 0xcd, 0x17, 0x53, 0x9c, 0x19, 0x72, 0x38, 0x9c, 0x37, 0xf3, 0xc7, 0xec, 0x66, 0x10, 0x65, 0x91, 0xde, 0xf1, 0x4e, 0x8a, 0xa6, 0x96, 0xb3, 0xed, 0x6c, 0x9f, 0xe7, 0x5b, 0xf6, 0xc3, 0x7b, 0x7e, 0x23, 0xb2, 0x9a, 0x25, 0xf3, 0x70, 0xbe, 0x38, 0x5f, 0xbd, 0xa1, 0x01, 0xbb, 0x11, 0xf5, 0xd0, 0x8b, 0x52, 0x02, 0xc2, 0xcf, 0xff, 0xf8, 0xca, 0xde, 0xe9, 0x4f, 0xb6, 0x6b, 0x3a, 0x46, 0x14, 0x6f, 0x58, 0x30, 0x0f, 0x97, 0xf3, 0xe5, 0xec, 0x6c, 0x96, 0x37, 0x55, 0x95, 0xd5, 0x05, 0xac, 0xf9, 0xc7, 0x2c, 0x2b, 0xcb, 0x26, 0xcf, 0x7a, 0x9e, 0x36, 0xa2, 0x90, 0x2c, 0x6f, 0x86, 0xba, 0x7f, 0xfb, 0x2a, 0x9f, 0x6d, 0x93, 0x33, 0x60, 0xa0, 0xef, 0x61, 0xe7, 0x34, 0xcb, 0x6f, 0x19, 0x40, 0x61, 0xda, 0x83, 0xaf, 0x22, 0x0f, 0xa1, 0x28, 0x0c, 0x42, 0xdb, 0x48, 0xf5, 0x23, 0xea, 0xb7, 0xaf, 0x06, 0xd6, 0x0e, 0x65, 0x99, 0x0e, 0x2d, 0x11, 0xac, 0x1c, 0xc1, 0xef, 0x03, 0xef, 0x1e, 0xed, 0x9a, 0xc0, 0xc0, 0x2d, 0x62, 0x77, 0x5c, 0xf6, 0x69, 0x2f, 0xf2, 0x5b, 0x49, 0x5f, 0x7d, 0x97, 0xd5, 0xb2, 0x12, 0x7d, 0x6a, 0x76, 0x65, 0xa2, 0x06, 0x71, 0xe8, 0xfd, 0x63, 0x38, 0x47, 0xc9, 0xb3, 0x2e, 0x95, 0x87, 0xa1, 0x2f, 0x9a, 0xfb, 0x7a, 0xb6, 0x0d, 0xf0, 0x68, 0xf5, 0x4e, 0xec, 0x81, 0xa3, 0x87, 0x32, 0x8c, 0x62, 0xb3, 0x85, 0x6c, 0x45, 0x4a, 0xc3, 0xd9, 0x36, 0x5e, 0x3a, 0xac, 0x3a, 0x2b, 0x9b, 0x7d, 0x2a, 0x6a, 0xcb, 0xbd, 0x62, 0x7b, 0xb6, 0x0d, 0xdd, 0x4a, 0x9a, 0x65, 0x83, 0x41, 0x9f, 0xa9, 0x27, 0x87, 0xb5, 0x45, 0x55, 0x93, 0xbc, 0x1b, 0x2f, 0x36, 0x92, 0xc1, 0x3a, 0xb2, 0xc8, 0x85, 0xd8, 0x8b, 0x3e, 0x2b, 0xd3, 0x66, 0xe8, 0x27, 0x04, 0x77, 0x59, 0x39, 0x70, 0xfc, 0x2e, 0xf8, 0x2e, 0x1b, 0xca, 0x3e, 0xb5, 0x13, 0x55, 0xf6, 0x90, 0x16, 0x43, 0x97, 0xf5, 0xa0, 0x10, 0x8a, 0xcf, 0xa5, 0xdb, 0xbc, 0x90, 0xcb, 0xe4, 0x26, 0x58, 0xd8, 0x13, 0xf3, 0x4e, 0x64, 0xe5, 0xdb, 0x57, 0x7f, 0x95, 0x8a, 0x8a, 0x77, 0x5d, 0xd3, 0x79, 0x5c, 0x27, 0x0b, 0x4b, 0xc8, 0x41, 0x11, 0xfa, 0xa6, 0x1d, 0x31, 0x91, 0x8f, 0xb8, 0x0e, 0x56, 0x16, 0xf9, 0x50, 0x44, 0xd1, 0x3a, 0xb1, 0xbb, 0x74, 0x32, 0xd5, 0x4c, 0x73, 0x33, 0x28, 0x22, 0x3b, 0x8a, 0xed, 0x68, 0x65, 0x47, 0x6b, 0x3b, 0xe2, 0x65, 0xf6, 0x68, 0x6f, 0x1b, 0xe4, 0x18, 0xda, 0x4d, 0x44, 0x90, 0x9b, 0x0d, 0x60, 0x08, 0x37, 0x40, 0xfa, 0x00, 0x4a, 0x8a, 0xbf, 0xa0, 0x6c, 0xa0, 0x28, 0x44, 0x14, 0x39, 0x79, 0x56, 0xed, 0xb0, 0x09, 0xe2, 0x85, 0x4f, 0x68, 0x6f, 0xdc, 0x49, 0xa9, 0xe6, 0x4d, 0x2b, 0x1e, 0x78, 0x39, 0x11, 0x79, 0x91, 0xf5, 0x59, 0x2a, 0xc5, 0x7f, 0x60, 0x83, 0xc3, 0x00, 0xb6, 0xd4, 0xa7, 0x28, 0x34, 0x4f, 0x15, 0x25, 0x87, 0x29, 0x51, 0x7b, 0xfc, 0xae, 0x9d, 0x8a, 0xb4, 0x79, 0xb6, 0x59, 0x25, 0xb1, 0x53, 0x11, 0x65, 0x02, 0xc8, 0xa7, 0x52, 0xef, 0x43, 0x56, 0xd7, 0xbc, 0x54, 0xc3, 0x47, 0xd0, 0x58, 0xb7, 0xac, 0xbe, 0xd7, 0xc3, 0x30, 0xbd, 0x69, 0x98, 0x39, 0xba, 0xea, 0x75, 0xe2, 0xf6, 0xbb, 0xaf, 0x4e, 0xa8, 0xcd, 0x9f, 0x59, 0x3c, 0x72, 0x12, 0x52, 0x67, 0x85, 0xed, 0x62, 0x3b, 0x03, 0xc6, 0x33, 0xdd, 0x0a, 0x7d, 0x42, 0x2f, 0xee, 0x78, 0x7a, 0x10, 0xfb, 0x83, 0x92, 0x71, 0x98, 0xf8, 0xf8, 0x60, 0x59, 0xfb, 0x92, 0x1f, 0x5b, 0x1f, 0xb3, 0xb0, 0xb4, 0x7f, 0x6c, 0x39, 0xdd, 0x4e, 0x34, 0xa2, 0x34, 0xd6, 0x7c, 0x8a, 0x58, 0x83, 0xd2, 0x4a, 0xee, 0x51, 0xb3, 0x61, 0xd7, 0x70, 0x44, 0x7b, 0x2f, 0xfa, 0x03, 0x08, 0x26, 0xcd, 0x8d, 0xb9, 0x02, 0x86, 0x3b, 0x99, 0xec, 0xd7, 0x1b, 0x67, 0x20, 0xb9, 0x55, 0x5d, 0x99, 0x97, 0xb7, 0x76, 0x2c, 0x0a, 0x3b, 0x7c, 0xac, 0xf3, 0x74, 0xac, 0xa5, 0x2c, 0xaf, 0x8a, 0xf4, 0x48, 0x71, 0x17, 0xde, 0x0e, 0xbc, 0x6d, 0x9d, 0x03, 0xc0, 0xcf, 0x54, 0xdb, 0x53, 0x21, 0x3a, 0x33, 0x24, 0x27, 0xa6, 0x90, 0x1d, 0xd6, 0x50, 0x4a, 0xee, 0x2d, 0x1a, 0xb8, 0x83, 0xf5, 0x07, 0xde, 0x55, 0x0d, 0x98, 0x6e, 0x7b, 0x52, 0xa2, 0x3e, 0xd8, 0x09, 0x35, 0x72, 0x4c, 0xf5, 0x55, 0x3e, 0x64, 0x9d, 0xd5, 0x96, 0xee, 0x21, 0x3d, 0x72, 0x4c, 0xac, 0xb7, 0x93, 0xa8, 0xfb, 0xbd, 0xa8, 0x38, 0x1d, 0x6d, 0xe3, 0x56, 0xe9, 0x50, 0x1e, 0x4e, 0xac, 0xb0, 0x7e, 0xc1, 0x6f, 0x06, 0xb0, 0xa8, 0xa6, 0x9d, 0x6d, 0x37, 0xe6, 0x0b, 0x56, 0xd9, 0x2b, 0x6b, 0xa2, 0xfb, 0x59, 0x5a, 0xb4, 0x8e, 0x67, 0x10, 0x23, 0xba, 0x82, 0x77, 0xce, 0x36, 0xd0, 0x81, 0x05, 0x06, 0xe1, 0xbe, 0x13, 0x3d, 0x3f, 0xc2, 0x40, 0x35, 0x26, 0x44, 0xf0, 0xda, 0xbc, 0xe2, 0xdd, 0x9e, 0xd7, 0xf9, 0x63, 0x8a, 0x0e, 0x0b, 0x98, 0x80, 0x29, 0x72, 0x5e, 0xe9, 0xa1, 0xa9, 0xf8, 0x51, 0x3c, 0x91, 0x59, 0xd5, 0xfa, 0x26, 0xa1, 0xbf, 0x6d, 0x34, 0x19, 0xc7, 0x1b, 0x60, 0xdd, 0x79, 0x5a, 0x3a, 0xae, 0x95, 0x71, 0x27, 0xf6, 0x7b, 0xde, 0xe1, 0x21, 0x24, 0x5a, 0x0c, 0xfa, 0xc4, 0xd8, 0x6d, 0xae, 0xa2, 0x19, 0xf0, 0x94, 0xf5, 0xdc, 0x0a, 0x28, 0x00, 0xad, 0xde, 0x09, 0x88, 0x2f, 0xe0, 0x54, 0x52, 0x92, 0x21, 0xcb, 0xbb, 0x9c, 0xc4, 0x7a, 0x36, 0xdb, 0x83, 0x3f, 0x51, 0x7c, 0x82, 0xfe, 0xeb, 0x2f, 0x85, 0x03, 0x86, 0x47, 0x9f, 0x43, 0x8b, 0xb7, 0x00, 0x17, 0x79, 0x36, 0xd3, 0x3e, 0x37, 0x95, 0xb0, 0x5f, 0x0a, 0x1a, 0x68, 0x63, 0x11, 0x8e, 0x49, 0xce, 0xab, 0x60, 0x82, 0x86, 0x57, 0x60, 0xd0, 0xdc, 0x75, 0xac, 0x40, 0x88, 0xe8, 0x18, 0xab, 0xa6, 0x10, 0xbb, 0xc7, 0x14, 0xee, 0xda, 0xae, 0xd5, 0x71, 0x65, 0x52, 0x4c, 0x87, 0x54, 0xe0, 0x00, 0xa1, 0x44, 0x16, 0x69, 0x32, 0xba, 0xc3, 0x31, 0x3e, 0xce, 0xa5, 0x25, 0xd7, 0x6e, 0x24, 0x20, 0x44, 0x7d, 0x97, 0xd3, 0xed, 0x23, 0xb8, 0x30, 0x51, 0xf0, 0xba, 0x87, 0xcd, 0x59, 0xb3, 0xdb, 0xc1, 0x2e, 0xca, 0xa8, 0x6c, 0x54, 0x82, 0x7d, 0x8c, 0x83, 0x56, 0xc7, 0xb0, 0xd2, 0x5c, 0x2f, 0x3c, 0xc8, 0xd0, 0x16, 0x4e, 0xd2, 0x94, 0x70, 0x1c, 0x06, 0x6f, 0x9b, 0x35, 0x2c, 0x43, 0x57, 0x32, 0xc9, 0x02, 0x4e, 0x27, 0x1a, 0x70, 0x03, 0x8b, 0x09, 0x81, 0xba, 0xcb, 0xc1, 0x39, 0x91, 0x68, 0x63, 0x11, 0xa6, 0x19, 0xc3, 0xff, 0xa9, 0x6c, 0x95, 0x53, 0x36, 0xed, 0x8f, 0xdd, 0x17, 0x64, 0x3d, 0x7b, 0x20, 0x3c, 0xf0, 0xfc, 0xd6, 0x8b, 0xd8, 0xa1, 0x3d, 0xd5, 0x24, 0xcd, 0xb0, 0x1c, 0xb4, 0x0d, 0xd8, 0xf3, 0x74, 0x7f, 0x2f, 0x60, 0x85, 0x66, 0x81, 0x49, 0xaa, 0xf0, 0x4c, 0xfe, 0xe5, 0xb1, 0x28, 0x7c, 0x0e, 0x05, 0x2c, 0x65, 0xe5, 0x31, 0x89, 0xba, 0xcf, 0x4a, 0x78, 0x35, 0x21, 0x98, 0x4a, 0x38, 0x8e, 0x0d, 0xc2, 0x51, 0xf4, 0x78, 0x86, 0x3d, 0x34, 0x0f, 0x08, 0x16, 0x62, 0x47, 0xe2, 0x89, 0xed, 0xe9, 0x4e, 0xf9, 0xcb, 0x6f, 0x1f, 0x71, 0x74, 0x09, 0x98, 0x01, 0xd2, 0x11, 0x07, 0x7e, 0x2a, 0x51, 0xb3, 0xcb, 0x35, 0x7e, 0x46, 0xb0, 0x8c, 0x0d, 0x89, 0x4e, 0x08, 0x4e, 0x92, 0xd8, 0x7b, 0x06, 0x31, 0xae, 0x2d, 0xc1, 0x38, 0xa2, 0x9f, 0x42, 0x8e, 0x56, 0x06, 0x19, 0x03, 0x86, 0x4d, 0x73, 0x50, 0x13, 0xc8, 0x47, 0x1a, 0x3b, 0x3a, 0xa8, 0x14, 0x09, 0x7e, 0xe1, 0xa2, 0x02, 0x30, 0x48, 0x4a, 0x5e, 0x54, 0x94, 0x51, 0xeb, 0x4e, 0x37, 0x01, 0x2c, 0xd0, 0x7f, 0xc4, 0xf1, 0x4f, 0x3a, 0xc9, 0x45, 0xe1, 0x74, 0xe1, 0x11, 0x92, 0x62, 0x5b, 0xa5, 0x1d, 0x76, 0xcd, 0x51, 0x0e, 0x02, 0x44, 0x2b, 0x22, 0xaa, 0xf9, 0x83, 0x66, 0x01, 0xe2, 0xa0, 0x75, 0x0c, 0xa2, 0x23, 0x57, 0xb9, 0x24, 0x24, 0x5f, 0x6a, 0xff, 0x7b, 0x0e, 0x05, 0xe2, 0xd4, 0x9b, 0x19, 0x61, 0x7e, 0x23, 0x2f, 0x02, 0x91, 0xc2, 0x85, 0x79, 0x09, 0x09, 0x56, 0x1b, 0x3b, 0x67, 0x57, 0xce, 0xa1, 0xc4, 0x01, 0xe1, 0x79, 0x2e, 0xc9, 0x83, 0x86, 0x91, 0x81, 0xf6, 0x98, 0xaa, 0xfa, 0x21, 0x5a, 0x67, 0xae, 0xe0, 0x6e, 0xb9, 0x97, 0xc1, 0x02, 0xc9, 0xca, 0x91, 0xc8, 0x66, 0xd7, 0xdf, 0x67, 0x1d, 0xf7, 0x69, 0x2b, 0x21, 0x1b, 0x13, 0x90, 0xab, 0x46, 0x8a, 0x53, 0x99, 0xca, 0xd1, 0xa2, 0x51, 0x42, 0x8b, 0x3e, 0x7f, 0x8e, 0x10, 0xcf, 0xab, 0x92, 0xa0, 0x97, 0x62, 0x49, 0xbc, 0x19, 0x63, 0x9d, 0x0e, 0x25, 0x31, 0xee, 0x46, 0xe9, 0x4e, 0x8a, 0xf1, 0x0a, 0xdc, 0xb0, 0xc0, 0x74, 0xd2, 0x5a, 0xf4, 0x72, 0xe3, 0x10, 0x54, 0x94, 0x44, 0x5b, 0xa1, 0x38, 0xca, 0x6c, 0x58, 0xf5, 0x82, 0x2c, 0x50, 0xc0, 0x92, 0x3a, 0x59, 0x19, 0x89, 0x5a, 0x45, 0x13, 0x1b, 0x6c, 0xa8, 0xe8, 0x42, 0x54, 0xa2, 0x46, 0x19, 0xa2, 0x2f, 0x38, 0x61, 0x3e, 0xa0, 0x5a, 0x1e, 0x5e, 0xef, 0x27, 0x41, 0xbc, 0x6d, 0x3a, 0x1d, 0x81, 0xc9, 0x2d, 0xa8, 0x6f, 0xab, 0x24, 0xfc, 0xa1, 0x15, 0x70, 0x25, 0x7e, 0xbc, 0xdf, 0xd8, 0x95, 0x26, 0xa7, 0xf0, 0x91, 0xc0, 0xa0, 0x29, 0x3a, 0x9d, 0xf2, 0x1a, 0x9e, 0x2d, 0x45, 0x4f, 0x26, 0xb1, 0xc2, 0x12, 0xfc, 0xe2, 0xfd, 0x65, 0x7a, 0x75, 0xf1, 0x2f, 0xcc, 0xda, 0x36, 0x70, 0x45, 0x97, 0x7f, 0xff, 0x74, 0xf9, 0xb7, 0xf4, 0xa7, 0x5f, 0x3f, 0xfc, 0x82, 0xa1, 0x89, 0xfe, 0xce, 0x66, 0x57, 0x97, 0x5f, 0x67, 0xdb, 0x59, 0x09, 0x75, 0xfd, 0x03, 0x54, 0xf0, 0x9f, 0x2f, 0x2f, 0x94, 0xad, 0x18, 0x32, 0x50, 0xa8, 0xcf, 0xff, 0xbc, 0xa2, 0xcf, 0x30, 0x58, 0xa3, 0x7c, 0xae, 0xbf, 0x5c, 0x7c, 0xb9, 0x4e, 0xaf, 0xbf, 0x5e, 0x5d, 0xff, 0x92, 0xbe, 0xbb, 0xb8, 0xfe, 0x80, 0x39, 0xcb, 0xea, 0x09, 0xb3, 0x96, 0x01, 0xf2, 0x28, 0x95, 0xfb, 0xab, 0x06, 0x80, 0x2e, 0xb1, 0xf4, 0x70, 0xbe, 0x98, 0x6d, 0xff, 0xbd, 0x38, 0x5b, 0xff, 0x06, 0x98, 0xa0, 0x69, 0xaa, 0x43, 0xa0, 0x62, 0x1e, 0xce, 0xab, 0x8d, 0x92, 0xdf, 0x20, 0x43, 0x69, 0x45, 0x43, 0x88, 0xb0, 0xa6, 0xfe, 0xce, 0x0f, 0xa2, 0x5d, 0xfc, 0xf8, 0x1c, 0x64, 0x69, 0x21, 0x30, 0x3f, 0x81, 0x05, 0x16, 0x16, 0x43, 0x3e, 0x38, 0x86, 0x85, 0x16, 0x86, 0x87, 0x1a, 0xc3, 0x22, 0x0b, 0x5b, 0x2e, 0x20, 0xdf, 0x1a, 0x03, 0x63, 0x07, 0x0c, 0x92, 0x29, 0x37, 0x2b, 0x07, 0x8c, 0xc3, 0x29, 0x3b, 0x6b, 0x07, 0x04, 0x2b, 0xd0, 0x40, 0x70, 0x2a, 0x74, 0x40, 0x18, 0x20, 0x68, 0x15, 0x23, 0xe1, 0xd2, 0x03, 0x2d, 0x3d, 0x10, 0x78, 0x0c, 0x1f, 0x14, 0x78, 0x20, 0x38, 0x85, 0x0f, 0x0a, 0x3d, 0x50, 0x12, 0x8d, 0x40, 0x91, 0x03, 0xad, 0x40, 0x03, 0x7c, 0x50, 0xec, 0x81, 0x96, 0x63, 0x36, 0x56, 0x1e, 0x28, 0x1c, 0xb3, 0xb1, 0xf6, 0x40, 0x91, 0x62, 0xe3, 0x69, 0xe4, 0x00, 0xa1, 0x78, 0x50, 0xf7, 0xbd, 0x0c, 0xc3, 0x70, 0xb6, 0x05, 0x9d, 0xcb, 0x64, 0xbc, 0x88, 0xd6, 0x85, 0x4a, 0xcc, 0xfa, 0x92, 0xc7, 0x8b, 0x65, 0x70, 0x03, 0x6a, 0xa4, 0xa9, 0xb4, 0xd2, 0xc0, 0xb0, 0xe0, 0x77, 0x0b, 0xad, 0x38, 0x6a, 0x3f, 0x9a, 0x5a, 0xce, 0xcd, 0x75, 0x7b, 0x93, 0xc1, 0xdc, 0xdc, 0xb3, 0x37, 0x19, 0xce, 0xcd, 0x05, 0x7b, 0x93, 0xd1, 0xdc, 0xde, 0xac, 0x37, 0x1b, 0xcf, 0xed, 0x95, 0x7a, 0xb3, 0xab, 0xb9, 0xbd, 0x4b, 0x6f, 0x76, 0x3d, 0xb7, 0x97, 0xa8, 0xcf, 0x0a, 0x49, 0x87, 0x40, 0x57, 0xd0, 0x41, 0x99, 0x92, 0x8a, 0x42, 0x1b, 0x1f, 0x53, 0x46, 0xba, 0xa3, 0xc4, 0x8b, 0xda, 0x1d, 0x17, 0x65, 0xc9, 0xb4, 0x8d, 0x99, 0xe0, 0x23, 0x59, 0x35, 0xc8, 0x9e, 0x1d, 0xb2, 0x3b, 0x8e, 0x45, 0x17, 0x26, 0x58, 0xdc, 0x0f, 0x2e, 0x94, 0x47, 0x5e, 0x94, 0xe8, 0xa4, 0x1e, 0x99, 0xc9, 0xfd, 0x0b, 0x8a, 0x9c, 0x97, 0x59, 0xcd, 0xea, 0xa6, 0x67, 0xe0, 0xad, 0x18, 0x7a, 0x7c, 0x06, 0x37, 0x41, 0xc4, 0x4c, 0x11, 0xb3, 0xfb, 0x83, 0x80, 0x31, 0x39, 0x0f, 0xc9, 0x5a, 0x70, 0x7f, 0xc0, 0x22, 0x85, 0x66, 0xa0, 0x7d, 0xdd, 0x63, 0x28, 0x84, 0xea, 0x74, 0x0f, 0xab, 0xc2, 0xee, 0x59, 0xcf, 0x84, 0x64, 0x99, 0xde, 0x8b, 0x6a, 0x71, 0xaa, 0x49, 0x34, 0xb2, 0x44, 0x54, 0x74, 0x3c, 0x54, 0x39, 0xd1, 0xac, 0xca, 0x04, 0x54, 0xe2, 0x04, 0xdb, 0xf1, 0x9a, 0x99, 0x72, 0xd5, 0xd2, 0x43, 0x9c, 0xbb, 0xa4, 0xd6, 0x20, 0x6b, 0xb3, 0x4e, 0x02, 0x48, 0xf5, 0x8d, 0x54, 0x51, 0x62, 0x00, 0x1d, 0x87, 0x2c, 0x44, 0xf6, 0xaa, 0x41, 0x78, 0xd9, 0x0c, 0x65, 0x41, 0xe7, 0x52, 0xde, 0xf5, 0xfd, 0xf5, 0x32, 0x79, 0x07, 0x89, 0x25, 0xb2, 0x05, 0xc4, 0xfd, 0x01, 0x07, 0x94, 0x79, 0x7e, 0x17, 0x2a, 0xfb, 0x01, 0x9c, 0x62, 0x01, 0x49, 0x8d, 0xe8, 0xdf, 0x50, 0xb3, 0xec, 0x3b, 0xc9, 0xaa, 0xa1, 0xe7, 0x0f, 0x96, 0x0e, 0xc4, 0x60, 0xf0, 0xc6, 0x37, 0x8b, 0x65, 0x84, 0x81, 0x40, 0x84, 0x91, 0x4d, 0x07, 0x49, 0x48, 0xa1, 0x45, 0xd3, 0xd2, 0xd6, 0x8c, 0xea, 0x2e, 0x2c, 0x7d, 0x3f, 0xe0, 0xe1, 0x19, 0x44, 0xb7, 0x1e, 0xab, 0xda, 0xaa, 0x01, 0x36, 0x9a, 0x5a, 0xe8, 0xf8, 0xa2, 0xf1, 0xb0, 0x0d, 0x44, 0x78, 0x10, 0xfb, 0xc8, 0x53, 0x32, 0x3a, 0x75, 0x6c, 0x57, 0xc0, 0x6f, 0x5c, 0x61, 0xbc, 0x35, 0x15, 0x2a, 0x3f, 0x35, 0x5d, 0xce, 0x6d, 0x67, 0x83, 0xe9, 0xce, 0x2c, 0xd5, 0x4a, 0x3f, 0x7f, 0xfe, 0xf8, 0x89, 0xa1, 0xe1, 0x32, 0x50, 0x66, 0x01, 0x68, 0x28, 0x87, 0x1d, 0x64, 0x79, 0x05, 0x45, 0xc0, 0x8f, 0x35, 0x84, 0x14, 0x51, 0x78, 0xeb, 0x62, 0xcf, 0x8f, 0x89, 0xe2, 0x0c, 0x73, 0x41, 0x2d, 0xb7, 0x06, 0x74, 0x49, 0x75, 0x81, 0x35, 0x17, 0x94, 0x27, 0xbd, 0x40, 0xaa, 0xb4, 0x1c, 0x29, 0xe1, 0x2e, 0xfa, 0x0c, 0x04, 0xf2, 0xfa, 0xc7, 0xd7, 0x94, 0xab, 0x1a, 0x22, 0xd3, 0x12, 0x75, 0x1d, 0x5a, 0xca, 0x3d, 0x29, 0xb1, 0x31, 0x58, 0xf6, 0x28, 0xb1, 0x3f, 0x07, 0x68, 0xa8, 0x5b, 0x60, 0x3b, 0x90, 0xb8, 0x52, 0x9f, 0xc3, 0x00, 0xab, 0x06, 0x2c, 0x4b, 0xab, 0x17, 0xc3, 0x66, 0x1c, 0x06, 0x4a, 0x07, 0xb6, 0xad, 0x3b, 0xdb, 0xac, 0xa3, 0xca, 0xf4, 0x08, 0xae, 0xeb, 0x43, 0x27, 0xca, 0x85, 0x43, 0x02, 0x8b, 0x60, 0xe4, 0xe7, 0xb0, 0xf3, 0x60, 0x66, 0x4d, 0x03, 0x4f, 0x5b, 0x3a, 0x03, 0x69, 0xa9, 0x60, 0x4d, 0x0d, 0xc6, 0x29, 0x96, 0x01, 0x79, 0x67, 0xc5, 0x16, 0x99, 0x89, 0xe7, 0xc1, 0x7a, 0x34, 0xaf, 0x8b, 0x19, 0x75, 0x8d, 0xb4, 0x73, 0xe8, 0x09, 0x64, 0x54, 0xac, 0xf8, 0x38, 0x18, 0xf1, 0xb3, 0x07, 0xd4, 0xdd, 0xc4, 0xc8, 0x9b, 0x9a, 0x6c, 0x57, 0x5c, 0xca, 0x6c, 0xcf, 0x19, 0xaf, 0x73, 0xc8, 0x00, 0x8d, 0x81, 0x02, 0x2f, 0x57, 0x42, 0x4a, 0x0e, 0x5b, 0x42, 0xe1, 0x58, 0x0c, 0x25, 0xea, 0x1b, 0x10, 0x63, 0xe2, 0xcd, 0x74, 0x2e, 0xa2, 0x8c, 0x81, 0xdf, 0x71, 0xbc, 0x28, 0xcc, 0xb9, 0x9f, 0x27, 0x38, 0x64, 0x5d, 0xa1, 0x3c, 0x94, 0xc6, 0xc6, 0x36, 0xdb, 0xf3, 0xd8, 0x46, 0x2e, 0x1a, 0x19, 0x7b, 0x89, 0x57, 0x78, 0x95, 0xaa, 0x5a, 0x61, 0x30, 0xea, 0x76, 0x65, 0x73, 0x4f, 0xf5, 0xd1, 0xaf, 0x5c, 0x2f, 0x00, 0x4b, 0xa1, 0x01, 0x75, 0xca, 0xe2, 0xc0, 0x9b, 0xb6, 0x19, 0xfa, 0x14, 0x6c, 0x20, 0x5c, 0x5b, 0x84, 0x23, 0xbe, 0xd9, 0xbd, 0x00, 0xbf, 0xcc, 0x1f, 0x72, 0x0e, 0x50, 0xbf, 0x89, 0x49, 0xe9, 0xa6, 0xa3, 0x1c, 0xb1, 0xf4, 0x02, 0x15, 0x56, 0x00, 0x1e, 0x95, 0x39, 0xf1, 0x0b, 0x14, 0xf8, 0x32, 0x70, 0xcd, 0x7b, 0x7d, 0x27, 0x8a, 0x6d, 0xc4, 0x10, 0xd5, 0x50, 0x99, 0x39, 0x63, 0x0b, 0x20, 0x87, 0x6b, 0x6b, 0xd7, 0xd8, 0x56, 0x81, 0xc5, 0x94, 0xdf, 0x55, 0xee, 0xcc, 0x7f, 0xb4, 0xb8, 0xd6, 0x8e, 0xb8, 0x6f, 0x1a, 0xb6, 0xcb, 0x94, 0x4c, 0x48, 0x1e, 0xd8, 0x45, 0xfa, 0xe2, 0xab, 0xc8, 0x89, 0x68, 0xb5, 0x99, 0xa0, 0x68, 0xd7, 0xa8, 0x7a, 0xbe, 0x94, 0x01, 0x7f, 0x51, 0x82, 0xc6, 0xc5, 0xc1, 0x73, 0x49, 0xae, 0x1a, 0x67, 0x5f, 0xe0, 0x0b, 0xcc, 0xe3, 0x11, 0x1b, 0xe5, 0xda, 0xbd, 0x48, 0x6a, 0x74, 0x58, 0x08, 0x2a, 0xb5, 0x85, 0x60, 0xbe, 0xff, 0xb5, 0xce, 0x6e, 0x30, 0x60, 0x35, 0x5a, 0xd7, 0x95, 0xc0, 0x08, 0x83, 0x7a, 0x4b, 0x0e, 0x01, 0x94, 0x05, 0xee, 0x1e, 0x57, 0x80, 0x9c, 0xaa, 0x2f, 0xa9, 0x3e, 0x77, 0x60, 0xe5, 0x94, 0xa6, 0xee, 0x8d, 0xde, 0x52, 0x26, 0x48, 0x59, 0x91, 0x3b, 0xf0, 0xe2, 0x18, 0xac, 0xc3, 0x85, 0x0d, 0xd6, 0x06, 0x37, 0x4a, 0x8e, 0x70, 0xdd, 0x49, 0xe9, 0xf5, 0x6a, 0x0a, 0xf6, 0x39, 0x02, 0x05, 0xe7, 0xf4, 0xc6, 0x34, 0xc1, 0x42, 0xe1, 0x1f, 0xa1, 0xad, 0x8e, 0xd0, 0x9c, 0xec, 0xe8, 0xf9, 0xc1, 0x81, 0x55, 0xc0, 0x1a, 0xb1, 0x12, 0xf8, 0x60, 0x8c, 0xd0, 0xd7, 0x9f, 0x3f, 0xaa, 0xf2, 0x8e, 0x7a, 0xe3, 0xc7, 0x30, 0xd9, 0x72, 0xcc, 0x2b, 0xe2, 0x78, 0x0a, 0xac, 0x9b, 0xfa, 0xfc, 0x06, 0x83, 0x93, 0x32, 0xcf, 0x09, 0x17, 0x23, 0x26, 0xb5, 0x8f, 0x34, 0x52, 0xd3, 0x2e, 0x2d, 0x1e, 0xdd, 0x21, 0x75, 0xf1, 0x70, 0xe9, 0x56, 0x50, 0x11, 0xac, 0x61, 0x04, 0x18, 0x9d, 0x01, 0x6e, 0x57, 0x3d, 0x24, 0xa6, 0xf9, 0x61, 0xa8, 0x6f, 0x41, 0xf9, 0x20, 0x9b, 0x29, 0xe8, 0x7d, 0xca, 0x9b, 0x97, 0x0e, 0x00, 0xdc, 0x90, 0x63, 0xd4, 0x71, 0x18, 0xfd, 0x3e, 0x94, 0x5c, 0x92, 0xe5, 0x92, 0xa9, 0xba, 0x23, 0x8c, 0xc6, 0x4f, 0x12, 0x70, 0x9e, 0x12, 0x52, 0x9d, 0x3b, 0x58, 0x80, 0x98, 0x50, 0x19, 0x8c, 0xb5, 0xa2, 0xcd, 0x51, 0x67, 0x73, 0xcb, 0x3e, 0x41, 0xca, 0x04, 0xc5, 0xce, 0x0d, 0xd6, 0x6a, 0x3b, 0xec, 0x6c, 0xcb, 0xbf, 0x50, 0x1f, 0x4d, 0x3d, 0x75, 0xda, 0xec, 0x49, 0x3f, 0x80, 0x16, 0xd4, 0xae, 0x96, 0xd8, 0x9f, 0xc4, 0x20, 0x40, 0xee, 0x29, 0x07, 0x30, 0x82, 0x22, 0x5b, 0x9b, 0xaa, 0xf8, 0xa3, 0xac, 0xa9, 0xcc, 0x3a, 0xb4, 0x40, 0x6c, 0x15, 0x9d, 0xa8, 0xfa, 0xd0, 0xca, 0xc9, 0xc9, 0xe3, 0xb3, 0x84, 0x4e, 0xb2, 0xc8, 0x29, 0x62, 0xad, 0x0b, 0xe9, 0xe8, 0x51, 0xeb, 0x1e, 0xf3, 0x51, 0x28, 0xe1, 0xc2, 0x65, 0x12, 0xc7, 0x2a, 0x01, 0xd7, 0x1f, 0x2b, 0x95, 0x81, 0xd3, 0xc7, 0x2a, 0x56, 0x2e, 0x03, 0x3e, 0x56, 0xab, 0x35, 0x8c, 0xc3, 0xa7, 0x27, 0xd5, 0xe3, 0x81, 0xf4, 0x45, 0x72, 0x7a, 0xd1, 0xd5, 0x4d, 0x4c, 0xbf, 0x70, 0x97, 0x18, 0x56, 0xeb, 0x9c, 0x4f, 0x5a, 0xa5, 0xe7, 0x18, 0x67, 0x4e, 0x36, 0x3d, 0x5d, 0x0f, 0x4a, 0x77, 0xd5, 0x4c, 0x69, 0x4c, 0xad, 0x1c, 0x7f, 0xb9, 0x9b, 0x61, 0xb7, 0xe3, 0xe0, 0xdc, 0x90, 0x6a, 0x27, 0x76, 0x0d, 0xfe, 0x96, 0xc2, 0x7b, 0xb7, 0xc5, 0x5e, 0xcb, 0x39, 0xca, 0xdd, 0x76, 0x4f, 0x47, 0xcd, 0x72, 0x5a, 0xf2, 0x54, 0xcf, 0x6b, 0x13, 0xba, 0x27, 0xe3, 0x11, 0x45, 0xe6, 0xb5, 0x46, 0x99, 0x82, 0xe8, 0xf3, 0xa0, 0xc3, 0xa4, 0xf4, 0xcc, 0x35, 0x01, 0x12, 0xfb, 0x7c, 0x09, 0x6e, 0x49, 0xf7, 0xd9, 0xd5, 0x09, 0x55, 0x3b, 0x1e, 0xe7, 0x8c, 0x1a, 0xa9, 0xde, 0x0b, 0x04, 0x2c, 0x9f, 0xf1, 0x44, 0x3d, 0x20, 0xa9, 0x8e, 0xeb, 0x4b, 0x5c, 0x6b, 0x0a, 0x3d, 0x48, 0xdd, 0xee, 0xe7, 0x18, 0x6a, 0xcd, 0x1b, 0x88, 0x04, 0x9f, 0x6c, 0x9f, 0x34, 0x12, 0x7c, 0x35, 0xa1, 0x56, 0xac, 0x01, 0xbd, 0x24, 0x10, 0x41, 0x2e, 0x5d, 0x2f, 0xba, 0x70, 0xcf, 0x0f, 0x23, 0xae, 0x0e, 0x4d, 0x05, 0xc6, 0x7f, 0xbc, 0x88, 0xff, 0xba, 0x01, 0x82, 0xf5, 0x3a, 0xfa, 0xa9, 0x51, 0x1e, 0xd7, 0xd0, 0xa0, 0x6f, 0xa3, 0x22, 0x81, 0xeb, 0xda, 0x7b, 0xb8, 0xb6, 0x7d, 0x4f, 0xda, 0x34, 0x47, 0x5c, 0x60, 0xca, 0x93, 0x26, 0x9b, 0x96, 0x5b, 0x5a, 0xa0, 0xb0, 0x9e, 0xe9, 0x02, 0x7f, 0x8f, 0x8a, 0x62, 0x55, 0x73, 0xb2, 0x6b, 0xfc, 0xa7, 0x54, 0x74, 0x38, 0xa1, 0xa2, 0x58, 0xf8, 0xd9, 0x57, 0x86, 0xf1, 0x8d, 0xc8, 0x21, 0xcf, 0xd5, 0xa3, 0x73, 0x8e, 0x78, 0x70, 0x02, 0x90, 0x82, 0xff, 0xd0, 0x95, 0x60, 0x3b, 0xcc, 0x05, 0x7b, 0xf3, 0x26, 0x70, 0x5a, 0x00, 0xa1, 0x5f, 0x75, 0x7f, 0x97, 0x08, 0xd6, 0x3e, 0x85, 0xd7, 0x1a, 0xf3, 0x09, 0x10, 0x2f, 0x39, 0xd5, 0xd0, 0x3c, 0xba, 0x60, 0xbf, 0x1b, 0xee, 0xdf, 0x34, 0xa6, 0x12, 0x7e, 0x07, 0xf1, 0x1b, 0x9a, 0xb1, 0x89, 0x54, 0x45, 0xdd, 0xf5, 0xaa, 0xaa, 0x48, 0x96, 0x54, 0x5f, 0x4b, 0x67, 0x0a, 0x72, 0xa8, 0xf4, 0x8f, 0xfc, 0x9d, 0x34, 0x3e, 0x72, 0x3d, 0xc1, 0x49, 0xc3, 0x90, 0xde, 0x71, 0x20, 0xce, 0x6c, 0x16, 0x13, 0xc7, 0xf8, 0x1d, 0xa6, 0x31, 0x18, 0xd3, 0x40, 0xd5, 0x8e, 0x5d, 0x17, 0xf1, 0x98, 0x7f, 0xec, 0x1f, 0xd2, 0x59, 0x43, 0xbf, 0x33, 0xe8, 0xec, 0x27, 0xcf, 0x6c, 0x9b, 0xf2, 0xe4, 0xcb, 0x9f, 0xe7, 0x57, 0x36, 0x01, 0xfa, 0x7d, 0x55, 0x4e, 0xd3, 0x33, 0xf8, 0xe0, 0x3b, 0x9d, 0x18, 0xdc, 0xb2, 0xfe, 0xdf, 0x9d, 0xd9, 0x76, 0x76, 0xb7, 0x98, 0x2f, 0x17, 0xf3, 0xc5, 0x79, 0x1c, 0x2e, 0xce, 0xf7, 0x61, 0x98, 0xac, 0xb3, 0x4d, 0x1e, 0xcc, 0x9e, 0xfe, 0x0b, 0xee, 0xa1, 0xf0, 0x3a, }; // Identify size = 3073 (9189 uncompressed) const uint32_t command_identify_size PROGMEM = ARRAY_SIZE(command_identify_data);