mirror of https://github.com/rusefi/bldc.git
Merge pull request #392 from luna-cycle/luna_bbshd_support
Luna bbshd support
This commit is contained in:
commit
d1b962b7e8
|
@ -125,7 +125,7 @@ void app_set_configuration(app_configuration *conf) {
|
|||
break;
|
||||
|
||||
case APP_ADC_PAS:
|
||||
app_adc_start(true);
|
||||
app_adc_start(false);
|
||||
app_pas_start(false);
|
||||
break;
|
||||
|
||||
|
|
|
@ -81,6 +81,7 @@ void app_pas_stop(void);
|
|||
bool app_pas_is_running(void);
|
||||
void app_pas_configure(pas_config *conf);
|
||||
float app_pas_get_current_target_rel(void);
|
||||
void app_pas_set_current_sub_scaling(float current_sub_scaling);
|
||||
|
||||
// Custom apps
|
||||
void app_custom_start(void);
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
|
||||
// Settings
|
||||
#define PEDAL_INPUT_TIMEOUT 0.2
|
||||
#define MAX_MS_WITHOUT_CADENCE 5000
|
||||
#define MIN_MS_WITHOUT_POWER 500
|
||||
#define FILTER_SAMPLES 5
|
||||
#define RPM_FILTER_SAMPLES 8
|
||||
|
@ -42,6 +43,7 @@ static THD_WORKING_AREA(pas_thread_wa, 1024);
|
|||
|
||||
// Private variables
|
||||
static volatile pas_config config;
|
||||
static volatile float sub_scaling = 1.0;
|
||||
static volatile float output_current_rel = 0.0;
|
||||
static volatile float ms_without_power = 0.0;
|
||||
static volatile float max_pulse_period = 0.0;
|
||||
|
@ -51,7 +53,14 @@ static volatile float pedal_rpm = 0;
|
|||
static volatile bool primary_output = false;
|
||||
static volatile bool stop_now = true;
|
||||
static volatile bool is_running = false;
|
||||
static volatile float torque_ratio = 0.0;
|
||||
|
||||
/**
|
||||
* Configure and initialize PAS application
|
||||
*
|
||||
* @param conf
|
||||
* App config
|
||||
*/
|
||||
void app_pas_configure(pas_config *conf) {
|
||||
config = *conf;
|
||||
ms_without_power = 0.0;
|
||||
|
@ -63,10 +72,7 @@ void app_pas_configure(pas_config *conf) {
|
|||
// if pedal spins at x3 the end rpm, assume its beyond limits
|
||||
min_pedal_period = 1.0 / ((config.pedal_rpm_end * 3.0 / 60.0));
|
||||
|
||||
if (config.invert_pedal_direction == true )
|
||||
direction_conf= -1.0;
|
||||
else
|
||||
direction_conf = 1.0;
|
||||
(config.invert_pedal_direction) ? (direction_conf = -1.0) : (direction_conf = 1.0);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -101,6 +107,10 @@ void app_pas_stop(void) {
|
|||
}
|
||||
}
|
||||
|
||||
void app_pas_set_current_sub_scaling(float current_sub_scaling) {
|
||||
sub_scaling = current_sub_scaling;
|
||||
}
|
||||
|
||||
float app_pas_get_current_target_rel(void) {
|
||||
return output_current_rel;
|
||||
}
|
||||
|
@ -108,12 +118,13 @@ float app_pas_get_current_target_rel(void) {
|
|||
void pas_event_handler(void) {
|
||||
#ifdef HW_PAS1_PORT
|
||||
const int8_t QEM[] = {0,-1,1,2,1,0,2,-1,-1,2,0,1,2,1,-1,0}; // Quadrature Encoder Matrix
|
||||
float direction_qem;
|
||||
int8_t direction_qem;
|
||||
uint8_t new_state;
|
||||
static uint8_t old_state = 0;
|
||||
static float old_timestamp = 0;
|
||||
static float inactivity_time = 0;
|
||||
static float period_filtered = 0;
|
||||
static int32_t correct_direction_counter = 0;
|
||||
|
||||
uint8_t PAS1_level = palReadPad(HW_PAS1_PORT, HW_PAS1_PIN);
|
||||
uint8_t PAS2_level = palReadPad(HW_PAS2_PORT, HW_PAS2_PIN);
|
||||
|
@ -122,10 +133,19 @@ void pas_event_handler(void) {
|
|||
direction_qem = (float) QEM[old_state * 4 + new_state];
|
||||
old_state = new_state;
|
||||
|
||||
// Require several quadrature events in the right direction to prevent vibrations from
|
||||
// engging PAS
|
||||
int8_t direction = (direction_conf * direction_qem);
|
||||
|
||||
switch(direction) {
|
||||
case 1: correct_direction_counter++; break;
|
||||
case -1:correct_direction_counter = 0; break;
|
||||
}
|
||||
|
||||
const float timestamp = (float)chVTGetSystemTimeX() / (float)CH_CFG_ST_FREQUENCY;
|
||||
|
||||
// sensors are poorly placed, so use only one rising edge as reference
|
||||
if(new_state == 3) {
|
||||
if( (new_state == 3) && (correct_direction_counter >= 4) ) {
|
||||
float period = (timestamp - old_timestamp) * (float)config.magnets;
|
||||
old_timestamp = timestamp;
|
||||
|
||||
|
@ -135,7 +155,7 @@ void pas_event_handler(void) {
|
|||
return;
|
||||
}
|
||||
pedal_rpm = 60.0 / period_filtered;
|
||||
pedal_rpm *= (direction_conf * direction_qem);
|
||||
pedal_rpm *= (direction_conf * (float)direction_qem);
|
||||
inactivity_time = 0.0;
|
||||
}
|
||||
else {
|
||||
|
@ -177,7 +197,7 @@ static THD_FUNCTION(pas_thread, arg) {
|
|||
return;
|
||||
}
|
||||
|
||||
pas_event_handler(); // this should happen inside an ISR instead of being polled
|
||||
pas_event_handler(); // this could happen inside an ISR instead of being polled
|
||||
|
||||
// For safe start when fault codes occur
|
||||
if (mc_interface_get_fault() != FAULT_CODE_NONE) {
|
||||
|
@ -188,28 +208,50 @@ static THD_FUNCTION(pas_thread, arg) {
|
|||
continue;
|
||||
}
|
||||
|
||||
// Map the rpm to assist level
|
||||
switch (config.ctrl_type) {
|
||||
case PAS_CTRL_TYPE_NONE:
|
||||
output = 0.0;
|
||||
break;
|
||||
case PAS_CTRL_TYPE_CADENCE:
|
||||
// Map pedal rpm to assist level
|
||||
|
||||
// NOTE: If the limits are the same a numerical instability is approached, so in that case
|
||||
// just use on/off control (which is what setting the limits to the same value essentially means).
|
||||
if (config.pedal_rpm_end > (config.pedal_rpm_start + 1.0)) {
|
||||
output = utils_map(pedal_rpm, config.pedal_rpm_start, config.pedal_rpm_end, 0.0, config.current_scaling);
|
||||
utils_truncate_number(&output, 0.0, config.current_scaling);
|
||||
output = utils_map(pedal_rpm, config.pedal_rpm_start, config.pedal_rpm_end, 0.0, config.current_scaling * sub_scaling);
|
||||
utils_truncate_number(&output, 0.0, config.current_scaling * sub_scaling);
|
||||
} else {
|
||||
if (pedal_rpm > config.pedal_rpm_end) {
|
||||
output = config.current_scaling;
|
||||
output = config.current_scaling * sub_scaling;
|
||||
} else {
|
||||
output = 0.0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PAS_CTRL_TYPE_CONSTANT_TORQUE:
|
||||
output = pedal_rpm > config.pedal_rpm_start ? config.current_scaling : 0;
|
||||
break;
|
||||
|
||||
#ifdef HW_HAS_PAS_TORQUE_SENSOR
|
||||
case PAS_CTRL_TYPE_TORQUE:
|
||||
{
|
||||
torque_ratio = hw_get_PAS_torque();
|
||||
output = torque_ratio * config.current_scaling * sub_scaling;
|
||||
utils_truncate_number(&output, 0.0, config.current_scaling * sub_scaling);
|
||||
}
|
||||
/* fall through */
|
||||
case PAS_CTRL_TYPE_TORQUE_WITH_CADENCE_TIMEOUT:
|
||||
{
|
||||
// disable assistance if torque has been sensed for >5sec without any pedal movement. Prevents
|
||||
// motor overtemps when the rider is just resting on the pedals
|
||||
static float ms_without_cadence_or_torque = 0.0;
|
||||
if(output == 0.0 || pedal_rpm > 0) {
|
||||
ms_without_cadence_or_torque = 0.0;
|
||||
} else {
|
||||
ms_without_cadence_or_torque += (1000.0 * (float)sleep_time) / (float)CH_CFG_ST_FREQUENCY;
|
||||
if(ms_without_cadence_or_torque > MAX_MS_WITHOUT_CADENCE) {
|
||||
output = 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
@ -222,7 +264,7 @@ static THD_FUNCTION(pas_thread, arg) {
|
|||
if (ramp_time > 0.01) {
|
||||
const float ramp_step = (float)ST2MS(chVTTimeElapsedSinceX(last_time)) / (ramp_time * 1000.0);
|
||||
utils_step_towards(&output_ramp, output, ramp_step);
|
||||
utils_truncate_number(&output_ramp, 0.0, config.current_scaling);
|
||||
utils_truncate_number(&output_ramp, 0.0, config.current_scaling * sub_scaling);
|
||||
|
||||
last_time = chVTGetSystemTimeX();
|
||||
output = output_ramp;
|
||||
|
|
|
@ -583,7 +583,8 @@ typedef enum {
|
|||
typedef enum {
|
||||
PAS_CTRL_TYPE_NONE = 0,
|
||||
PAS_CTRL_TYPE_CADENCE,
|
||||
PAS_CTRL_TYPE_CONSTANT_TORQUE
|
||||
PAS_CTRL_TYPE_TORQUE,
|
||||
PAS_CTRL_TYPE_TORQUE_WITH_CADENCE_TIMEOUT
|
||||
} pas_control_type;
|
||||
|
||||
// PAS sensor types
|
||||
|
|
|
@ -17,18 +17,35 @@
|
|||
*/
|
||||
|
||||
#include "hw.h"
|
||||
|
||||
#include "luna_display_serial.h"
|
||||
#include "ch.h"
|
||||
#include "hal.h"
|
||||
#include "stm32f4xx_conf.h"
|
||||
#include "utils.h"
|
||||
#include <math.h>
|
||||
#include "mc_interface.h"
|
||||
#include "terminal.h"
|
||||
#include "commands.h"
|
||||
#include "stdio.h"
|
||||
|
||||
#define EEPROM_ADDR_INITIAL_ASSIST_LEVEL 0
|
||||
#define EEPROM_ADDR_MOTOR_HAS_PTC_SENSOR 1
|
||||
#define EEPROM_ADDR_FIXED_THROTTLE_LEVEL 2
|
||||
#define DEFAULT_INITIAL_ASSIST_LEVEL 1
|
||||
|
||||
// Variables
|
||||
static volatile bool i2c_running = false;
|
||||
static volatile bool motor_has_PTC_sensor;
|
||||
|
||||
void hw_luna_bbshd_setup_dac(void);
|
||||
static void terminal_cmd_set_initial_assist_level(int argc, const char **argv);
|
||||
static void terminal_cmd_read_initial_assist_level(int argc, const char **argv);
|
||||
static void terminal_cmd_set_bbshd_has_PTC_sensor(int argc, const char **argv);
|
||||
static void terminal_cmd_set_bbshd_use_fixed_throttle_level(int argc, const char **argv);
|
||||
|
||||
int8_t hw_read_initial_assist_level(void);
|
||||
bool hw_bbshd_has_PTC_sensor(void);
|
||||
bool hw_bbshd_has_fixed_throttle_level(void);
|
||||
|
||||
// I2C configuration
|
||||
static const I2CConfig i2cfg = {
|
||||
|
@ -45,33 +62,17 @@ void hw_init_gpio(void) {
|
|||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
|
||||
|
||||
// LEDs
|
||||
palSetPadMode(LED_GREEN_GPIO, LED_GREEN_PIN,
|
||||
PAL_MODE_OUTPUT_PUSHPULL |
|
||||
PAL_STM32_OSPEED_HIGHEST);
|
||||
palSetPadMode(LED_RED_GPIO, LED_RED_PIN,
|
||||
PAL_MODE_OUTPUT_PUSHPULL |
|
||||
PAL_STM32_OSPEED_HIGHEST);
|
||||
palSetPadMode(LED_GREEN_GPIO, LED_GREEN_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
|
||||
palSetPadMode(LED_RED_GPIO, LED_RED_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
|
||||
|
||||
// GPIOA Configuration: Channel 1 to 3 as alternate function push-pull
|
||||
palSetPadMode(GPIOA, 8, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
|
||||
PAL_STM32_OSPEED_HIGHEST |
|
||||
PAL_STM32_PUDR_FLOATING);
|
||||
palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
|
||||
PAL_STM32_OSPEED_HIGHEST |
|
||||
PAL_STM32_PUDR_FLOATING);
|
||||
palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
|
||||
PAL_STM32_OSPEED_HIGHEST |
|
||||
PAL_STM32_PUDR_FLOATING);
|
||||
palSetPadMode(GPIOA, 8, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUDR_FLOATING);
|
||||
palSetPadMode(GPIOA, 9, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUDR_FLOATING);
|
||||
palSetPadMode(GPIOA, 10, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUDR_FLOATING);
|
||||
|
||||
palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
|
||||
PAL_STM32_OSPEED_HIGHEST |
|
||||
PAL_STM32_PUDR_FLOATING);
|
||||
palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
|
||||
PAL_STM32_OSPEED_HIGHEST |
|
||||
PAL_STM32_PUDR_FLOATING);
|
||||
palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) |
|
||||
PAL_STM32_OSPEED_HIGHEST |
|
||||
PAL_STM32_PUDR_FLOATING);
|
||||
palSetPadMode(GPIOB, 13, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUDR_FLOATING);
|
||||
palSetPadMode(GPIOB, 14, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUDR_FLOATING);
|
||||
palSetPadMode(GPIOB, 15, PAL_MODE_ALTERNATE(GPIO_AF_TIM1) | PAL_STM32_OSPEED_HIGHEST | PAL_STM32_PUDR_FLOATING);
|
||||
|
||||
// Hall sensors
|
||||
palSetPadMode(HW_HALL_ENC_GPIO1, HW_HALL_ENC_PIN1, PAL_MODE_INPUT_PULLUP);
|
||||
|
@ -83,31 +84,24 @@ void hw_init_gpio(void) {
|
|||
palSetPadMode(BRK_GPIO, BRK_PIN, PAL_MODE_ALTERNATE(GPIO_AF_TIM1));
|
||||
#endif
|
||||
|
||||
// Current filter
|
||||
palSetPadMode(GPIOC, 13,
|
||||
PAL_MODE_OUTPUT_PUSHPULL |
|
||||
PAL_STM32_OSPEED_HIGHEST);
|
||||
palSetPadMode(HW_SPEED_SENSOR_PORT, HW_SPEED_SENSOR_PIN, PAL_MODE_INPUT_PULLUP);
|
||||
|
||||
// Current filter
|
||||
palSetPadMode(GPIOC, 13, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
|
||||
CURRENT_FILTER_OFF();
|
||||
|
||||
// AUX pin
|
||||
AUX_OFF();
|
||||
palSetPadMode(AUX_GPIO, AUX_PIN,
|
||||
PAL_MODE_OUTPUT_PUSHPULL |
|
||||
PAL_STM32_OSPEED_HIGHEST);
|
||||
palSetPadMode(AUX_GPIO, AUX_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST);
|
||||
|
||||
// ADC Pins
|
||||
palSetPadMode(GPIOA, 0, PAL_MODE_INPUT_ANALOG);
|
||||
palSetPadMode(GPIOA, 1, PAL_MODE_INPUT_ANALOG);
|
||||
palSetPadMode(GPIOA, 2, PAL_MODE_INPUT_ANALOG);
|
||||
palSetPadMode(GPIOA, 3, PAL_MODE_INPUT_ANALOG);
|
||||
#ifdef HW_BBSHD_USE_DAC
|
||||
hw_luna_bbshd_setup_dac();
|
||||
#else
|
||||
palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG);
|
||||
#endif
|
||||
palSetPadMode(GPIOA, 6, PAL_MODE_INPUT_ANALOG);
|
||||
|
||||
palSetPadMode(GPIOA, 6, PAL_MODE_INPUT_ANALOG);
|
||||
palSetPadMode(GPIOB, 0, PAL_MODE_INPUT_ANALOG);
|
||||
palSetPadMode(GPIOB, 1, PAL_MODE_INPUT_ANALOG);
|
||||
|
||||
|
@ -117,6 +111,36 @@ void hw_init_gpio(void) {
|
|||
palSetPadMode(GPIOC, 3, PAL_MODE_INPUT_ANALOG);
|
||||
palSetPadMode(GPIOC, 4, PAL_MODE_INPUT_ANALOG);
|
||||
palSetPadMode(GPIOC, 5, PAL_MODE_INPUT_ANALOG);
|
||||
|
||||
|
||||
terminal_register_command_callback(
|
||||
"set_initial_assist_level",
|
||||
"Set initial assist level [0 - 9].",
|
||||
0,
|
||||
terminal_cmd_set_initial_assist_level);
|
||||
|
||||
terminal_register_command_callback(
|
||||
"read_initial_assist_level",
|
||||
"Read initial assist level.",
|
||||
0,
|
||||
terminal_cmd_read_initial_assist_level);
|
||||
|
||||
terminal_register_command_callback(
|
||||
"set_motor_temp_sensor",
|
||||
"Usage: set_motor_temp_sensor [NTC or PTC]",
|
||||
0,
|
||||
terminal_cmd_set_bbshd_has_PTC_sensor);
|
||||
|
||||
terminal_register_command_callback(
|
||||
"fix_throttle",
|
||||
"Usage: fix_throttle [1 or 0]",
|
||||
0,
|
||||
terminal_cmd_set_bbshd_use_fixed_throttle_level);
|
||||
|
||||
int8_t initial_assist_level = hw_read_initial_assist_level();
|
||||
motor_has_PTC_sensor = true;// hw_bbshd_has_PTC_sensor();
|
||||
|
||||
luna_display_serial_start(initial_assist_level);
|
||||
}
|
||||
|
||||
void hw_setup_adc_channels(void) {
|
||||
|
@ -250,29 +274,277 @@ void hw_try_restore_i2c(void) {
|
|||
}
|
||||
}
|
||||
|
||||
void hw_luna_bbshd_setup_dac(void) {
|
||||
// GPIOA clock enable
|
||||
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
|
||||
static float wheel_rpm_filtered = 0;
|
||||
|
||||
// DAC Periph clock enable
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
|
||||
void hw_update_speed_sensor(void) {
|
||||
static float wheel_rpm = 0;
|
||||
static uint8_t sensor_state = 0;
|
||||
static uint8_t sensor_state_old = 0;
|
||||
static float last_sensor_event_time = 0;
|
||||
float current_time = (float)chVTGetSystemTimeX() / (float)CH_CFG_ST_FREQUENCY;
|
||||
|
||||
// DAC channel 1 & 2 (DAC_OUT1 = PA.4)(DAC_OUT2 = PA.5) configuration
|
||||
palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG);
|
||||
palSetPadMode(GPIOA, 5, PAL_MODE_INPUT_ANALOG);
|
||||
sensor_state = palReadPad(HW_SPEED_SENSOR_PORT, HW_SPEED_SENSOR_PIN);
|
||||
|
||||
// Enable both DAC channels with output buffer disabled to achieve rail-to-rail output
|
||||
DAC->CR |= DAC_CR_EN1 | DAC_CR_BOFF1 | DAC_CR_EN2 | DAC_CR_BOFF2;
|
||||
if(sensor_state == 0 && sensor_state_old == 1 ) {
|
||||
float revolution_duration = current_time - last_sensor_event_time;
|
||||
|
||||
// Set DAC channels at 1.65V
|
||||
hw_luna_bbshd_DAC1_setdata(0x800);
|
||||
hw_luna_bbshd_DAC2_setdata(0x800);
|
||||
if (revolution_duration > 0.05) { //ignore periods <50ms
|
||||
|
||||
last_sensor_event_time = current_time;
|
||||
|
||||
wheel_rpm = 60.0 / revolution_duration;
|
||||
// Apply averaging filter
|
||||
UTILS_LP_FAST(wheel_rpm_filtered, (float)wheel_rpm, 0.5);
|
||||
}
|
||||
} else {
|
||||
// After 3 seconds without sensor signal, set RPM as zero
|
||||
if ( (current_time - last_sensor_event_time) > 3.0) {
|
||||
wheel_rpm_filtered = 0.0;
|
||||
}
|
||||
}
|
||||
sensor_state_old = sensor_state;
|
||||
}
|
||||
|
||||
void hw_luna_bbshd_DAC1_setdata(uint16_t data) {
|
||||
DAC->DHR12R1 = data;
|
||||
/* Get speed in m/s */
|
||||
float hw_get_speed(void) {
|
||||
const volatile mc_configuration *conf = mc_interface_get_configuration();
|
||||
float speed = wheel_rpm_filtered * conf->si_wheel_diameter * M_PI / 60.0;
|
||||
return speed;
|
||||
}
|
||||
|
||||
void hw_luna_bbshd_DAC2_setdata(uint16_t data) {
|
||||
DAC->DHR12R2 = data;
|
||||
/* Gear Shift sensor support
|
||||
* Read the gear sensor and use it to override the brake adc signal to reduce motor
|
||||
* power during shifting to extend gearing life.
|
||||
*/
|
||||
void hw_brake_override(float *brake_ptr) {
|
||||
float brake = *brake_ptr;
|
||||
|
||||
// Track an independent gearshift sensor ramping to be multiplied by the brake signal
|
||||
static float gear = 0.0;
|
||||
gear = (float)palReadPad(HW_GEAR_SENSOR_PORT, HW_GEAR_SENSOR_PIN);
|
||||
|
||||
// hardcoded ramps for now
|
||||
const float ramp_time_neg = 0.1;
|
||||
const float ramp_time_pos = 0.3;
|
||||
|
||||
// Apply ramping
|
||||
static systime_t last_time = 0;
|
||||
static float gear_ramp = 0.0;
|
||||
float ramp_time = fabsf(gear) > fabsf(gear_ramp) ? ramp_time_pos : ramp_time_neg;
|
||||
|
||||
if (ramp_time > 0.01) {
|
||||
const float ramp_step = (float)ST2MS(chVTTimeElapsedSinceX(last_time)) / (ramp_time * 1000.0);
|
||||
utils_step_towards(&gear_ramp, gear, ramp_step);
|
||||
last_time = chVTGetSystemTimeX();
|
||||
*brake_ptr = brake * gear_ramp;
|
||||
}
|
||||
|
||||
static uint16_t delay_to_print = 0;
|
||||
if(delay_to_print ++ > 250){
|
||||
delay_to_print = 0;
|
||||
commands_printf("gear_ramp:%.2f",(double)gear_ramp);
|
||||
commands_printf("brake_output:%.2f",(double)brake);
|
||||
}
|
||||
}
|
||||
|
||||
// Lookup table linearly interpolated to support the new, undocumented PTC sensor used
|
||||
// in these drives
|
||||
|
||||
#define PTC_LUT_SIZE 20
|
||||
typedef struct { float x; float y; } coord_t;
|
||||
|
||||
coord_t ptc_lut[PTC_LUT_SIZE] =
|
||||
{
|
||||
{933.0, -15.0},
|
||||
{940.0, -11.0},
|
||||
{1090.0, 25.0},
|
||||
{1107.0, 30.0},
|
||||
{1124.0, 35.0},
|
||||
{1140.0, 40.0},
|
||||
{1155.0, 45.0},
|
||||
{1170.0, 50.0},
|
||||
{1181.0, 55.0},
|
||||
{1191.0, 60.0},
|
||||
{1198.0, 65.0},
|
||||
{1202.0, 70.0},
|
||||
{1211.0, 75.0},
|
||||
{1217.0, 80.0},
|
||||
{1224.0, 85.0},
|
||||
{1231.0, 90.0},
|
||||
{1274.0, 95.0},
|
||||
{1385.0, 100.0},
|
||||
{1390.0, 110.0},//made up
|
||||
{1400.0, 200.0}//made up
|
||||
};
|
||||
|
||||
float interp( coord_t* c, float x)
|
||||
{
|
||||
int i;
|
||||
const int n = PTC_LUT_SIZE;
|
||||
|
||||
for( i = 0; i < n-1; i++ )
|
||||
{
|
||||
if ( c[i].x <= x && c[i+1].x >= x )
|
||||
{
|
||||
//utils_map()
|
||||
float diffx = x - c[i].x;
|
||||
float diffn = c[i+1].x - c[i].x;
|
||||
|
||||
return c[i].y + ( c[i+1].y - c[i].y ) * diffx / diffn;
|
||||
}
|
||||
}
|
||||
|
||||
return 200.0; // Not in range, trip a fault
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void terminal_cmd_set_initial_assist_level(int argc, const char **argv) {
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
|
||||
eeprom_var initial_assist_level;
|
||||
if( argc == 2 ) {
|
||||
sscanf(argv[1], "%i", (int*) &(initial_assist_level.as_i32));
|
||||
|
||||
// Store data in eeprom
|
||||
conf_general_store_eeprom_var_hw(&initial_assist_level, EEPROM_ADDR_INITIAL_ASSIST_LEVEL);
|
||||
|
||||
//read back written data
|
||||
int32_t assist_level = hw_read_initial_assist_level();
|
||||
|
||||
if(assist_level == initial_assist_level.as_i32) {
|
||||
commands_printf("BBSHD initial assist level set to %d", assist_level);
|
||||
}
|
||||
else {
|
||||
commands_printf("Error storing EEPROM data.");
|
||||
}
|
||||
}
|
||||
else {
|
||||
commands_printf("1 argument required, integer from 0 to 9. Here are some examples:");
|
||||
commands_printf("set_initial_assist_level 0");
|
||||
commands_printf("set_initial_assist_level 1");
|
||||
commands_printf("set_initial_assist_level 4");
|
||||
commands_printf("set_initial_assist_level 9");
|
||||
commands_printf(" ");
|
||||
}
|
||||
commands_printf(" ");
|
||||
return;
|
||||
}
|
||||
|
||||
static void terminal_cmd_read_initial_assist_level(int argc, const char **argv) {
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
|
||||
commands_printf("BBSHD initial assist level is set at %i", hw_read_initial_assist_level());
|
||||
commands_printf(" ");
|
||||
return;
|
||||
}
|
||||
|
||||
int8_t hw_read_initial_assist_level(void) {
|
||||
eeprom_var assist_level;
|
||||
bool var_not_found = !conf_general_read_eeprom_var_hw(&assist_level, EEPROM_ADDR_INITIAL_ASSIST_LEVEL);
|
||||
|
||||
if( (assist_level.as_i32 < 0) || (assist_level.as_i32 >= 10) || var_not_found)
|
||||
assist_level.as_i32 = DEFAULT_INITIAL_ASSIST_LEVEL;
|
||||
return (int8_t)assist_level.as_i32;
|
||||
}
|
||||
|
||||
float hw_read_motor_temp(float beta) {
|
||||
static float sensor_resistance = 1000;
|
||||
UTILS_LP_FAST(sensor_resistance, NTC_RES_MOTOR(ADC_Value[ADC_IND_TEMP_MOTOR]), 0.1);
|
||||
|
||||
// the ptc sensor has 1.3kOhm at 100°C and 930 Ohm at -15°C. If resistance is outside this
|
||||
// range there is no way this is a PTC sensor
|
||||
if( (sensor_resistance > 2000 ) || (sensor_resistance < 900) ) {
|
||||
motor_has_PTC_sensor = false;
|
||||
}
|
||||
if( motor_has_PTC_sensor ) {
|
||||
// PTC
|
||||
return interp(ptc_lut, sensor_resistance);
|
||||
} else {
|
||||
// NTC
|
||||
return (1.0 / ((logf(NTC_RES_MOTOR(ADC_Value[ADC_IND_TEMP_MOTOR]) / 10000.0) / beta) + (1.0 / 298.15)) - 273.15);
|
||||
}
|
||||
}
|
||||
|
||||
static void terminal_cmd_set_bbshd_has_PTC_sensor(int argc, const char **argv) {
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
|
||||
eeprom_var has_ptc;
|
||||
if( argc == 2 ) {
|
||||
char sensor_type[32];
|
||||
|
||||
sscanf(argv[1], "%s", sensor_type);
|
||||
|
||||
if( sensor_type[0] == 'N' ) { // NTC
|
||||
has_ptc.as_i32 = 0;
|
||||
}
|
||||
if( sensor_type[0] == 'P' ) { // PTC
|
||||
has_ptc.as_i32 = 1;
|
||||
}
|
||||
|
||||
// Store data in eeprom
|
||||
conf_general_store_eeprom_var_hw(&has_ptc, EEPROM_ADDR_MOTOR_HAS_PTC_SENSOR);
|
||||
|
||||
//read back written data
|
||||
motor_has_PTC_sensor = hw_bbshd_has_PTC_sensor();
|
||||
|
||||
if( motor_has_PTC_sensor ) {
|
||||
commands_printf("Set as PTC\n");
|
||||
} else {
|
||||
commands_printf("Set as NTC\n");
|
||||
}
|
||||
}
|
||||
else {
|
||||
commands_printf("1 argument required, NTC or PTC. Here are some examples:");
|
||||
commands_printf("set_motor_temp_sensor NTC");
|
||||
commands_printf("set_motor_temp_sensor PTC\n");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
bool hw_bbshd_has_PTC_sensor(void) {
|
||||
eeprom_var has_ptc;
|
||||
//return 1;
|
||||
bool var_not_found = !conf_general_read_eeprom_var_hw(&has_ptc, EEPROM_ADDR_MOTOR_HAS_PTC_SENSOR);
|
||||
|
||||
if( (has_ptc.as_i32 != 1) || var_not_found) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
static void terminal_cmd_set_bbshd_use_fixed_throttle_level(int argc, const char **argv) {
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
|
||||
eeprom_var use_fixed_throttle;
|
||||
if( argc == 2 ) {
|
||||
char throttle_type[32];
|
||||
|
||||
sscanf(argv[1], "%s", throttle_type);
|
||||
|
||||
use_fixed_throttle.as_i32 = (throttle_type[0] == '1') ? 1 : 0;
|
||||
|
||||
// Store data in eeprom
|
||||
conf_general_store_eeprom_var_hw(&use_fixed_throttle, EEPROM_ADDR_FIXED_THROTTLE_LEVEL);
|
||||
}
|
||||
else {
|
||||
commands_printf("1 argument required: 1 (fixed) or 0 (follow display level)");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
bool hw_bbshd_has_fixed_throttle_level(void) {
|
||||
eeprom_var use_fixed_throttle;
|
||||
bool var_not_found = !conf_general_read_eeprom_var_hw(&use_fixed_throttle, EEPROM_ADDR_FIXED_THROTTLE_LEVEL);
|
||||
|
||||
if( (use_fixed_throttle.as_i32 != 1) || var_not_found) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -21,14 +21,21 @@
|
|||
#ifndef HW_LUNA_BBSHD_H_
|
||||
#define HW_LUNA_BBSHD_H_
|
||||
|
||||
#define HW_NAME "LUNA_CYCLE_BBSHD"
|
||||
#define HW_NAME "LUNA_BBSHD"
|
||||
#include "mcconf_luna_bbshd_52v.h"
|
||||
#include "appconf_luna_bbshd.h"
|
||||
|
||||
#define QMLUI_SOURCE_APP "qmlui/app/qmlui_luna_v1.c"
|
||||
#define QMLUI_HEADER_APP "qmlui/app/qmlui_luna_v1.h"
|
||||
#define QMLUI_APP_FULLSCREEN
|
||||
|
||||
// HW properties
|
||||
#define HW_HAS_3_SHUNTS
|
||||
#define HW_HAS_PHASE_SHUNTS
|
||||
#define HW_HAS_GATE_DRIVER_SUPPLY_MONITOR
|
||||
#define HW_HAS_WHEEL_SPEED_SENSOR
|
||||
#define HW_HAS_LUNA_SERIAL_DISPLAY
|
||||
#define HW_USE_BRK
|
||||
//#define HW_BBSHD_USE_DAC
|
||||
|
||||
// Macros
|
||||
#define LED_GREEN_GPIO GPIOB
|
||||
|
@ -42,7 +49,7 @@
|
|||
#define LED_RED_OFF() palClearPad(LED_RED_GPIO, LED_RED_PIN)
|
||||
|
||||
#define AUX_GPIO GPIOC
|
||||
#define AUX_PIN 9
|
||||
#define AUX_PIN 14
|
||||
#define AUX_ON() palSetPad(AUX_GPIO, AUX_PIN)
|
||||
#define AUX_OFF() palClearPad(AUX_GPIO, AUX_PIN)
|
||||
|
||||
|
@ -103,9 +110,12 @@
|
|||
#define NTC_RES(adc_val) (10000.0 * adc_val / ( 4095.0 - adc_val))//((4095.0 * 10000.0) / adc_val - 10000.0)
|
||||
#define NTC_TEMP(adc_ind) (1.0 / ((logf(NTC_RES(ADC_Value[adc_ind]) / 10000.0) / 3455.0) + (1.0 / 298.15)) - 273.15)
|
||||
|
||||
#define NTC_RES_MOTOR(adc_val) (10000.0 / ((4095.0 / (float)adc_val) - 1.0)) // Motor temp sensor on low side
|
||||
#define NTC_TEMP_MOTOR(beta) (hw_read_motor_temp(beta))
|
||||
//#define NTC_TEMP_MOTOR(beta) (1.0 / ((logf(NTC_RES_MOTOR(ADC_Value[ADC_IND_TEMP_MOTOR]) / 10000.0) / beta) + (1.0 / 298.15)) - 273.15)
|
||||
#define PTC_TEMP_MOTOR(res, con, tbase) (((NTC_RES_MOTOR(ADC_Value[ADC_IND_TEMP_MOTOR]) - res) / NTC_RES_MOTOR(ADC_Value[ADC_IND_TEMP_MOTOR])) * 100 / con - 10)
|
||||
#define PTC_TEMP_MOTOR_2(res, con, tbase) 0.0
|
||||
|
||||
#define NTC_TEMP_MOTOR(beta) (1.0 / ((logf(NTC_RES_MOTOR(ADC_Value[ADC_IND_TEMP_MOTOR]) / 10000.0) / beta) + (1.0 / 298.15)) - 273.15)
|
||||
#define NTC_RES_MOTOR(adc_val) (10000.0 / ((4095.0 / (float)adc_val) - 1.0))
|
||||
|
||||
// Voltage on ADC channel
|
||||
#define ADC_VOLTS(ch) ((float)ADC_Value[ch] / 4096.0 * V_REG)
|
||||
|
@ -129,37 +139,38 @@
|
|||
#define HW_ADC_EXT2_PIN 0
|
||||
|
||||
// UART Peripheral
|
||||
#define HW_UART_DEV SD1
|
||||
#define HW_UART_GPIO_AF GPIO_AF_USART1
|
||||
#define HW_UART_TX_PORT GPIOB
|
||||
#define HW_UART_TX_PIN 6
|
||||
#define HW_UART_RX_PORT GPIOB
|
||||
#define HW_UART_RX_PIN 7
|
||||
#define HW_UART_DEV SD4
|
||||
#define HW_UART_GPIO_AF GPIO_AF_UART4
|
||||
#define HW_UART_TX_PORT GPIOC
|
||||
#define HW_UART_TX_PIN 10
|
||||
#define HW_UART_RX_PORT GPIOC
|
||||
#define HW_UART_RX_PIN 11
|
||||
|
||||
// Permanent UART Peripheral (for NRF51)
|
||||
#define HW_UART_P_BAUD 115200
|
||||
#define HW_UART_P_DEV SD4
|
||||
#define HW_UART_P_GPIO_AF GPIO_AF_UART4
|
||||
#define HW_UART_P_TX_PORT GPIOC
|
||||
#define HW_UART_P_TX_PIN 10
|
||||
#define HW_UART_P_RX_PORT GPIOC
|
||||
#define HW_UART_P_RX_PIN 11
|
||||
#define HW_UART_P_DEV SD1
|
||||
#define HW_UART_P_GPIO_AF GPIO_AF_USART1
|
||||
#define HW_UART_P_TX_PORT GPIOB
|
||||
#define HW_UART_P_TX_PIN 6
|
||||
#define HW_UART_P_RX_PORT GPIOB
|
||||
#define HW_UART_P_RX_PIN 7
|
||||
|
||||
// NRF SWD
|
||||
#define NRF5x_SWDIO_GPIO GPIOA
|
||||
#define NRF5x_SWDIO_PIN 13
|
||||
#define NRF5x_SWCLK_GPIO GPIOA
|
||||
#define NRF5x_SWCLK_PIN 14
|
||||
#define NRF5x_SWDIO_PIN 15
|
||||
#define NRF5x_SWCLK_GPIO GPIOB
|
||||
#define NRF5x_SWCLK_PIN 3
|
||||
|
||||
// ICU Peripheral for servo decoding
|
||||
// ICU Peripheral for servo decoding. Not used, routed to a pin not present in 64 pin
|
||||
// package to free USART1 TX pad
|
||||
#define HW_USE_SERVO_TIM4
|
||||
#define HW_ICU_TIMER TIM4
|
||||
#define HW_ICU_TIM_CLK_EN() RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE)
|
||||
#define HW_ICU_DEV ICUD4
|
||||
#define HW_ICU_CHANNEL ICU_CHANNEL_1
|
||||
#define HW_ICU_GPIO_AF GPIO_AF_TIM4
|
||||
#define HW_ICU_GPIO GPIOB
|
||||
#define HW_ICU_PIN 6
|
||||
#define HW_ICU_GPIO GPIOD
|
||||
#define HW_ICU_PIN 12
|
||||
|
||||
// I2C Peripheral
|
||||
#define HW_I2C_DEV I2CD2
|
||||
|
@ -188,16 +199,30 @@
|
|||
#define HW_ENC_TIM_ISR_VEC TIM3_IRQHandler
|
||||
|
||||
// SPI pins
|
||||
#define HW_SPI_DEV SPID1
|
||||
#define HW_SPI_GPIO_AF GPIO_AF_SPI1
|
||||
#define HW_SPI_DEV SPID3
|
||||
#define HW_SPI_GPIO_AF GPIO_AF_SPI3
|
||||
#define HW_SPI_PORT_NSS GPIOA
|
||||
#define HW_SPI_PIN_NSS 4
|
||||
#define HW_SPI_PORT_SCK GPIOA
|
||||
#define HW_SPI_PIN_SCK 5
|
||||
#define HW_SPI_PORT_MOSI GPIOA
|
||||
#define HW_SPI_PIN_MOSI 7
|
||||
#define HW_SPI_PORT_MISO GPIOA
|
||||
#define HW_SPI_PIN_MISO 6
|
||||
#define HW_SPI_PORT_SCK GPIOC
|
||||
#define HW_SPI_PIN_SCK 10
|
||||
#define HW_SPI_PORT_MOSI GPIOC
|
||||
#define HW_SPI_PIN_MOSI 12
|
||||
#define HW_SPI_PORT_MISO GPIOC
|
||||
#define HW_SPI_PIN_MISO 11
|
||||
|
||||
// Pedal Assist pins
|
||||
#define HW_PAS1_PORT GPIOB
|
||||
#define HW_PAS1_PIN 5
|
||||
#define HW_PAS2_PORT GPIOB
|
||||
#define HW_PAS2_PIN 4
|
||||
|
||||
#ifdef HW_HAS_WHEEL_SPEED_SENSOR
|
||||
#define HW_SPEED_SENSOR_PORT GPIOC
|
||||
#define HW_SPEED_SENSOR_PIN 9
|
||||
#endif
|
||||
|
||||
#define HW_GEAR_SENSOR_PORT GPIOA
|
||||
#define HW_GEAR_SENSOR_PIN 7
|
||||
|
||||
// Measurement macros
|
||||
#define ADC_V_L1 ADC_Value[ADC_IND_SENS1]
|
||||
|
@ -213,44 +238,25 @@
|
|||
// Override dead time.
|
||||
#define HW_DEAD_TIME_NSEC 460.0
|
||||
|
||||
// Default setting overrides
|
||||
#ifndef MCCONF_L_MAX_VOLTAGE
|
||||
#define MCCONF_L_MAX_VOLTAGE 85.0 // Maximum input voltage
|
||||
#endif
|
||||
#ifndef MCCONF_DEFAULT_MOTOR_TYPE
|
||||
#define MCCONF_DEFAULT_MOTOR_TYPE MOTOR_TYPE_FOC
|
||||
#endif
|
||||
#ifndef MCCONF_FOC_F_SW
|
||||
#define MCCONF_FOC_F_SW 30000.0
|
||||
#endif
|
||||
#ifndef MCCONF_L_MAX_ABS_CURRENT
|
||||
#define MCCONF_L_MAX_ABS_CURRENT 250.0 // The maximum absolute current above which a fault is generated
|
||||
#endif
|
||||
#ifndef MCCONF_FOC_SAMPLE_V0_V7
|
||||
#define MCCONF_FOC_SAMPLE_V0_V7 false // Run control loop in both v0 and v7 (requires phase shunts)
|
||||
#endif
|
||||
#ifndef MCCONF_L_IN_CURRENT_MAX
|
||||
#define MCCONF_L_IN_CURRENT_MAX 200.0 // Input current limit in Amperes (Upper)
|
||||
#endif
|
||||
#ifndef MCCONF_L_IN_CURRENT_MIN
|
||||
#define MCCONF_L_IN_CURRENT_MIN -200.0 // Input current limit in Amperes (Lower)
|
||||
#endif
|
||||
|
||||
// Setting limits
|
||||
#define HW_LIM_CURRENT -200.0, 200.0
|
||||
#define HW_LIM_CURRENT_IN -200.0, 200.0
|
||||
#define HW_LIM_CURRENT_ABS 0.0, 350.0
|
||||
#define HW_LIM_VIN 6.0, 90.0
|
||||
#define HW_LIM_ERPM -200e3, 200e3
|
||||
#define HW_LIM_CURRENT_IN -150.0, 150.0
|
||||
#define HW_LIM_CURRENT_ABS 0.0, 230.0
|
||||
#define HW_LIM_VIN 30.0, 86.0
|
||||
#define HW_LIM_ERPM -26e3, 26e3
|
||||
#define HW_LIM_DUTY_MIN 0.0, 0.1
|
||||
#define HW_LIM_DUTY_MAX 0.0, 0.99
|
||||
#define HW_LIM_TEMP_FET -40.0, 110.0
|
||||
#define HW_LIM_DUTY_MAX 0.0, 0.95
|
||||
#define HW_LIM_TEMP_FET -40.0, 90.0
|
||||
#define HW_LIM_FOC_CTRL_LOOP_FREQ 49999.0, 50001.0
|
||||
|
||||
#define HW_GATE_DRIVER_SUPPLY_MIN_VOLTAGE 10.0
|
||||
#define HW_GATE_DRIVER_SUPPLY_MAX_VOLTAGE 14.0
|
||||
#define HW_GATE_DRIVER_SUPPLY_MIN_VOLTAGE 11.0
|
||||
#define HW_GATE_DRIVER_SUPPLY_MAX_VOLTAGE 13.0
|
||||
|
||||
// HW-specific functions
|
||||
void hw_luna_bbshd_DAC1_setdata(uint16_t data);
|
||||
void hw_luna_bbshd_DAC2_setdata(uint16_t data);
|
||||
void hw_update_speed_sensor(void);
|
||||
float hw_get_speed(void);
|
||||
void hw_brake_override(float *brake);
|
||||
float hw_read_motor_temp(float beta);
|
||||
bool hw_bbshd_has_fixed_throttle_level(void);
|
||||
|
||||
#endif /* HW_LUNA_BBSHD_H_ */
|
||||
|
|
|
@ -3,6 +3,7 @@ HWSRC = hwconf/hw.c \
|
|||
hwconf/drv8305.c \
|
||||
hwconf/drv8320s.c \
|
||||
hwconf/drv8323s.c \
|
||||
hwconf/luna_display_serial.c \
|
||||
hwconf/si8900.c
|
||||
|
||||
HWINC = hwconf
|
||||
|
|
|
@ -0,0 +1,533 @@
|
|||
/*
|
||||
Copyright 2021 Marcos Chaparro mchaparro@powerdesigns.ca
|
||||
Copyright 2021 Maximiliano Cordoba mcordoba@powerdesigns.ca
|
||||
|
||||
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/>.
|
||||
*/
|
||||
|
||||
#include "conf_general.h"
|
||||
#ifdef HW_HAS_LUNA_SERIAL_DISPLAY
|
||||
#include "hw.h"
|
||||
#include "luna_display_serial.h"
|
||||
#include "app.h"
|
||||
#include "ch.h"
|
||||
#include "hal.h"
|
||||
#include "packet.h"
|
||||
#include "commands.h"
|
||||
#include "mc_interface.h"
|
||||
#include "utils.h"
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#include "comm_can.h"
|
||||
#include "datatypes.h"
|
||||
|
||||
#define CMD_READ 0x11
|
||||
#define CMD_WRITE 0x16
|
||||
|
||||
#define CMD_CONNECT 0x51
|
||||
#define CMD_READ_BASIC 0x52
|
||||
#define CMD_WRITE_BASIC 0x52
|
||||
#define CMD_VERSION 0x90
|
||||
#define CMD_AMPS 0x0A
|
||||
#define CMD_WHEEL_RPM 0x20
|
||||
#define CMD_MOVING 0x31
|
||||
#define CMD_LIGHT_ON 0xF1
|
||||
#define CMD_LIGHT_OFF 0xF0
|
||||
#define CMD_PEDAL_MOV 0x08
|
||||
#define CMD_BATT_SOC 0x11
|
||||
#define CMD_BATT_VOLTAGE 0x12
|
||||
#define CMD_PAS_LEVEL 0x0B
|
||||
|
||||
#define CMD_READ_BASIC_LENGTH 26
|
||||
#define CMD_WRITE_BASIC_LENGTH 26
|
||||
|
||||
#define CMD_WRITE_BASIC_SUCCESS 0x18
|
||||
|
||||
#define LUNA_DISPLAY_BAUD 1200
|
||||
#define LUNA_SERIAL_BUFFER_SIZE 32
|
||||
#define LUNA_TX_SERIAL_BUFFER_SIZE 32
|
||||
|
||||
typedef enum {
|
||||
PAS_LEVEL_0 = 0x00,
|
||||
PAS_LEVEL_1 = 0x01,
|
||||
PAS_LEVEL_2 = 0x0B,
|
||||
PAS_LEVEL_3 = 0x0C,
|
||||
PAS_LEVEL_4 = 0x0D,
|
||||
PAS_LEVEL_5 = 0x02,
|
||||
PAS_LEVEL_6 = 0x15,
|
||||
PAS_LEVEL_7 = 0x16,
|
||||
PAS_LEVEL_8 = 0x17,
|
||||
PAS_LEVEL_9 = 0x03,
|
||||
PAS_LEVEL_WALK = 0x06,
|
||||
} LUNA_PAS_LEVEL;
|
||||
|
||||
typedef enum {
|
||||
WRITE_LOW_BATTERY_ERROR = 0x00,
|
||||
WRITE_MAX_CURRENT_ERROR = 0x01,
|
||||
WRITE_ASSIST_LEVEL_ERROR = 0x02,
|
||||
WRITE_ASSIST_SPEED_ERROR = 0x0C,
|
||||
WRITE_SPEEDOMETER_ERROR = 0x16,
|
||||
WRITE_SPEEDOMETER_SIGNAL_ERROR = 0x17,
|
||||
WRITE_BASIC_SUCCESS = 0x18
|
||||
} CMD_WRITE_BASIC_RESPONSE;
|
||||
|
||||
typedef enum {
|
||||
LUNA_ERROR_NONE = 0x00,
|
||||
LUNA_ERROR_BRAKES = 0x03,
|
||||
LUNA_ERROR_HIGH_VOLTAGE = 0x07,
|
||||
LUNA_ERROR_MOTOR_HALL_SENSOR = 0x08,
|
||||
LUNA_ERROR_OVER_TEMPERATURE = 0x10,
|
||||
LUNA_ERROR_CURRENT_SENSOR = 0x12,
|
||||
LUNA_ERROR_BATTERY_TEMPERATURE = 0x13,
|
||||
LUNA_ERROR_WHEEL_SPEED_DETECTION = 0x21,
|
||||
LUNA_ERROR_BMS_COMMUNICATION = 0x22,
|
||||
LUNA_ERROR_TORQUE_SENSOR = 0x25,
|
||||
LUNA_ERROR_SPEED_SENSOR = 0x26,
|
||||
LUNA_ERROR_COMMUNICATION = 0x30,
|
||||
} LUNA_ERROR_CODES;
|
||||
|
||||
typedef struct {
|
||||
uint8_t header;
|
||||
uint8_t length;
|
||||
uint8_t manufacturer[4];
|
||||
uint8_t model[4];
|
||||
uint8_t hardware_version[2];
|
||||
uint8_t firmware_version[2];
|
||||
uint8_t voltage;
|
||||
uint8_t max_current;
|
||||
uint8_t checksum;
|
||||
} controller_info_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned int rd_ptr;
|
||||
unsigned int wr_ptr;
|
||||
unsigned char data[LUNA_SERIAL_BUFFER_SIZE];
|
||||
unsigned char tx[LUNA_TX_SERIAL_BUFFER_SIZE];
|
||||
} luna_serial_buffer_t;
|
||||
|
||||
static volatile LUNA_PAS_LEVEL pas_level = PAS_LEVEL_1;
|
||||
static volatile bool display_thread_is_running = false;
|
||||
static volatile bool display_uart_is_running = false;
|
||||
|
||||
/* UART driver configuration structure */
|
||||
static SerialConfig uart_cfg = {
|
||||
LUNA_DISPLAY_BAUD,
|
||||
0,
|
||||
USART_CR2_LINEN,
|
||||
0
|
||||
};
|
||||
|
||||
static luna_serial_buffer_t serial_buffer;
|
||||
static controller_info_t controller_info = {0x51,0x10,"LUNA","BBSH","12","55",0x05,250,00};
|
||||
|
||||
// Threads
|
||||
static THD_WORKING_AREA(display_process_thread_wa, 1024);
|
||||
static THD_FUNCTION(display_process_thread, arg);
|
||||
|
||||
static bool check_assist_level(uint8_t assist_code);
|
||||
static LUNA_PAS_LEVEL translate_assist_level(int8_t level);
|
||||
static void set_assist_level(uint8_t assist_code);
|
||||
static uint8_t checksum(uint8_t *buf, uint8_t len);
|
||||
static void serial_send_packet(unsigned char *data, unsigned int len);
|
||||
static void serial_display_byte_process(unsigned char byte);
|
||||
static void serial_display_check_rx(void);
|
||||
|
||||
void luna_display_serial_start(int8_t initial_level) {
|
||||
pas_level = translate_assist_level(initial_level);
|
||||
|
||||
if (!display_thread_is_running) {
|
||||
chThdCreateStatic(display_process_thread_wa, sizeof(display_process_thread_wa),
|
||||
NORMALPRIO, display_process_thread, NULL);
|
||||
display_thread_is_running = true;
|
||||
}
|
||||
serial_buffer.rd_ptr = 0;
|
||||
serial_buffer.wr_ptr = 0;
|
||||
|
||||
sdStart(&HW_UART_DEV, &uart_cfg);
|
||||
palSetPadMode(HW_UART_TX_PORT, HW_UART_TX_PIN, PAL_MODE_ALTERNATE(HW_UART_GPIO_AF) |
|
||||
PAL_STM32_OSPEED_HIGHEST |
|
||||
PAL_STM32_PUDR_PULLUP);
|
||||
palSetPadMode(HW_UART_RX_PORT, HW_UART_RX_PIN, PAL_MODE_ALTERNATE(HW_UART_GPIO_AF) |
|
||||
PAL_STM32_OSPEED_HIGHEST |
|
||||
PAL_STM32_PUDR_PULLUP);
|
||||
|
||||
display_uart_is_running = true;
|
||||
}
|
||||
|
||||
static LUNA_PAS_LEVEL translate_assist_level(int8_t level) {
|
||||
switch (level) {
|
||||
case 0: return PAS_LEVEL_0;
|
||||
case 1: return PAS_LEVEL_1;
|
||||
case 2: return PAS_LEVEL_2;
|
||||
case 3: return PAS_LEVEL_3;
|
||||
case 4: return PAS_LEVEL_4;
|
||||
case 5: return PAS_LEVEL_5;
|
||||
case 6: return PAS_LEVEL_6;
|
||||
case 7: return PAS_LEVEL_7;
|
||||
case 8: return PAS_LEVEL_8;
|
||||
case 9: return PAS_LEVEL_9;
|
||||
default: return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* checks if the assist code to a current level
|
||||
*
|
||||
* returns true if valid, false if not.
|
||||
*/
|
||||
static bool check_assist_level(uint8_t assist_code) {
|
||||
bool ret = false;
|
||||
|
||||
switch (assist_code) {
|
||||
case PAS_LEVEL_0:
|
||||
case PAS_LEVEL_1:
|
||||
case PAS_LEVEL_2:
|
||||
case PAS_LEVEL_3:
|
||||
case PAS_LEVEL_4:
|
||||
case PAS_LEVEL_5:
|
||||
case PAS_LEVEL_6:
|
||||
case PAS_LEVEL_7:
|
||||
case PAS_LEVEL_8:
|
||||
case PAS_LEVEL_9:
|
||||
ret = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Sets the PAS current according to the assist code
|
||||
*
|
||||
*/
|
||||
static void set_assist_level(uint8_t assist_code) {
|
||||
float current_scale;
|
||||
volatile mc_configuration *mcconf = (volatile mc_configuration*) mc_interface_get_configuration();
|
||||
|
||||
switch (assist_code) {
|
||||
case PAS_LEVEL_0: current_scale = 0.0; break;
|
||||
case PAS_LEVEL_1: current_scale = 1.0 / 9.0; break;
|
||||
case PAS_LEVEL_2: current_scale = 2.0 / 9.0; break;
|
||||
case PAS_LEVEL_3: current_scale = 3.0 / 9.0; break;
|
||||
case PAS_LEVEL_4: current_scale = 4.0 / 9.0; break;
|
||||
case PAS_LEVEL_5: current_scale = 5.0 / 9.0; break;
|
||||
case PAS_LEVEL_6: current_scale = 6.0 / 9.0; break;
|
||||
case PAS_LEVEL_7: current_scale = 7.0 / 9.0; break;
|
||||
case PAS_LEVEL_8: current_scale = 8.0 / 9.0; break;
|
||||
case PAS_LEVEL_9: current_scale = 1.0; break;
|
||||
default: return;
|
||||
}
|
||||
|
||||
if( hw_bbshd_has_fixed_throttle_level() ) {
|
||||
mcconf->l_current_max_scale = 1.0;
|
||||
app_pas_set_current_sub_scaling(current_scale);
|
||||
} else {
|
||||
mcconf->l_current_max_scale = current_scale;
|
||||
}
|
||||
|
||||
// In level 0, both PAS and throttle should be disabled
|
||||
if(current_scale == 0.0) {
|
||||
mcconf->l_current_max_scale = current_scale;
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t checksum(uint8_t *buf, uint8_t len) {
|
||||
uint8_t sum = 0;
|
||||
for(int i = 0; i<len; i++) {
|
||||
sum += buf[i];
|
||||
}
|
||||
return sum;
|
||||
}
|
||||
|
||||
static void serial_send_packet(unsigned char *data, unsigned int len) {
|
||||
if (display_uart_is_running) {
|
||||
sdWrite(&HW_UART_DEV, data, len);
|
||||
}
|
||||
}
|
||||
|
||||
static void serial_display_byte_process(unsigned char byte) {
|
||||
//append new byte to the buffer.
|
||||
serial_buffer.data[serial_buffer.wr_ptr] = byte;
|
||||
serial_buffer.wr_ptr++;
|
||||
|
||||
uint8_t rd_ptr = serial_buffer.rd_ptr; //read pointer to try at different start addresses
|
||||
|
||||
// process with at least 2 bytes available to read
|
||||
while( (serial_buffer.wr_ptr - rd_ptr ) > 1) {
|
||||
|
||||
if(serial_buffer.data[rd_ptr] == CMD_WRITE) {
|
||||
// start byte found
|
||||
uint8_t command = serial_buffer.data[rd_ptr + 1];
|
||||
uint8_t checksum_addr;
|
||||
|
||||
switch (command) {
|
||||
case CMD_PAS_LEVEL:
|
||||
if ( (serial_buffer.wr_ptr - rd_ptr) < 4 ) { //this packet needs 4 bytes
|
||||
break;
|
||||
}
|
||||
checksum_addr = rd_ptr + 3;
|
||||
if(checksum_addr <= serial_buffer.wr_ptr) { //check the checksum has been received
|
||||
// check sum
|
||||
if( serial_buffer.data[checksum_addr] ==
|
||||
checksum(serial_buffer.data + rd_ptr, 3) ) {
|
||||
|
||||
if(check_assist_level(serial_buffer.data[rd_ptr + 2])){
|
||||
pas_level = serial_buffer.data[rd_ptr + 2];
|
||||
set_assist_level(pas_level);
|
||||
}
|
||||
serial_buffer.rd_ptr = rd_ptr + 4; //mark bytes as read
|
||||
}
|
||||
}
|
||||
break;
|
||||
case CMD_WRITE_BASIC:
|
||||
commands_printf("CMD_WRITE_BASIC");
|
||||
|
||||
if ( (serial_buffer.wr_ptr - rd_ptr) < CMD_WRITE_BASIC_LENGTH ) { //this packet needs 26 bytes
|
||||
break;
|
||||
}
|
||||
|
||||
checksum_addr = rd_ptr + CMD_WRITE_BASIC_LENGTH - 1;
|
||||
|
||||
if(checksum_addr <= serial_buffer.wr_ptr) { //check the checksum has been received
|
||||
commands_printf("checksum received,calculated: %d %d",serial_buffer.data[checksum_addr],
|
||||
checksum(serial_buffer.data + rd_ptr, CMD_WRITE_BASIC_LENGTH - 1));
|
||||
// check sum
|
||||
if( serial_buffer.data[checksum_addr] ==
|
||||
checksum(serial_buffer.data + rd_ptr, CMD_WRITE_BASIC_LENGTH - 1) ) {
|
||||
|
||||
volatile mc_configuration *mcconf = (volatile mc_configuration*) mc_interface_get_configuration();
|
||||
|
||||
mcconf->l_min_vin = (float) serial_buffer.data[rd_ptr + 2];
|
||||
mcconf->l_current_max = (float) serial_buffer.data[rd_ptr + 3];
|
||||
//skipping assist table for now
|
||||
mcconf->si_wheel_diameter = (float)serial_buffer.data[rd_ptr + 24] * 25.4 / 2.0;
|
||||
|
||||
//write settings to flash memory as motor_0
|
||||
conf_general_store_mc_configuration((mc_configuration*)mcconf, false);
|
||||
|
||||
for(int i = 0; i<=CMD_WRITE_BASIC_LENGTH;i++) {
|
||||
commands_printf("%02x ", serial_buffer.data[rd_ptr + i]);
|
||||
}
|
||||
|
||||
serial_buffer.rd_ptr = rd_ptr + CMD_WRITE_BASIC_LENGTH; //mark bytes as read
|
||||
|
||||
serial_buffer.tx[0] = CMD_WRITE_BASIC;
|
||||
serial_buffer.tx[1] = CMD_WRITE_BASIC_SUCCESS;
|
||||
serial_send_packet(serial_buffer.tx, 2);
|
||||
}
|
||||
}
|
||||
break;
|
||||
/* case CMD_LIGHT_ON:
|
||||
// TODO: turn ON the light
|
||||
buffer.tx[0] = 0x01;
|
||||
serial_send_packet(buffer.tx, 1);
|
||||
rd_ptr +=2;
|
||||
buffer.rd_ptr = rd_ptr;
|
||||
continue;
|
||||
case CMD_LIGHT_OFF:
|
||||
// TODO: turn OFF the light
|
||||
buffer.tx[0] = 0x01;
|
||||
serial_send_packet(buffer.tx, 1);
|
||||
rd_ptr +=2;
|
||||
buffer.rd_ptr = rd_ptr;
|
||||
continue; */
|
||||
default:
|
||||
++rd_ptr;
|
||||
serial_buffer.rd_ptr = rd_ptr; //discard the CMD_WRITE byte as it wasn't followed by a supported command
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(serial_buffer.data[rd_ptr] == CMD_READ) {
|
||||
// start byte found
|
||||
uint8_t command = serial_buffer.data[rd_ptr + 1];
|
||||
|
||||
switch (command) {
|
||||
case CMD_VERSION:
|
||||
serial_send_packet((uint8_t*)&controller_info, sizeof(controller_info_t));
|
||||
rd_ptr +=2;
|
||||
serial_buffer.rd_ptr = rd_ptr; //mark bytes as read
|
||||
continue;
|
||||
case CMD_READ_BASIC:
|
||||
{
|
||||
commands_printf("CMD_READ_BASIC");
|
||||
|
||||
volatile mc_configuration *mcconf = (volatile mc_configuration*) mc_interface_get_configuration();
|
||||
|
||||
serial_buffer.tx[0] = 0x52;
|
||||
serial_buffer.tx[1] = CMD_READ_BASIC_LENGTH - 2;
|
||||
serial_buffer.tx[2] = (uint8_t) mcconf->l_min_vin; //low battery protection [V]
|
||||
serial_buffer.tx[3] = (uint8_t) mcconf->l_current_max; //current limit [A]
|
||||
|
||||
for(int i=0; i<10; i++) {
|
||||
serial_buffer.tx[i+4] = (uint8_t) 20; //assist level [%]
|
||||
}
|
||||
|
||||
serial_buffer.tx[4] = 0;
|
||||
serial_buffer.tx[5] = 28;
|
||||
serial_buffer.tx[6] = 37;
|
||||
serial_buffer.tx[7] = 46;
|
||||
serial_buffer.tx[8] = 55;
|
||||
serial_buffer.tx[9] = 64;
|
||||
serial_buffer.tx[10] = 73;
|
||||
serial_buffer.tx[11] = 82;
|
||||
serial_buffer.tx[12] = 91;
|
||||
serial_buffer.tx[13] = 100;
|
||||
|
||||
for(int i=0; i<10; i++) {
|
||||
serial_buffer.tx[i+14] = (uint8_t) 100; //speed level [%]
|
||||
}
|
||||
|
||||
serial_buffer.tx[24] = (uint8_t) (mcconf->si_wheel_diameter * 39.4 * 2.0); //wheel diameter [inch*2]
|
||||
serial_buffer.tx[25] = 0x01; //speedometer [01 = internal]
|
||||
serial_buffer.tx[26] = checksum(serial_buffer.tx + 2, CMD_READ_BASIC_LENGTH - 3);
|
||||
|
||||
for(int i = 0; i<=CMD_READ_BASIC_LENGTH;i++) {
|
||||
commands_printf("%02x ", serial_buffer.tx[i]);
|
||||
}
|
||||
serial_send_packet(serial_buffer.tx, CMD_READ_BASIC_LENGTH);
|
||||
rd_ptr +=2;
|
||||
serial_buffer.rd_ptr = rd_ptr;
|
||||
continue;
|
||||
}
|
||||
case CMD_AMPS:
|
||||
{
|
||||
float current = mc_interface_get_tot_current_in_filtered() * 2.0;
|
||||
utils_truncate_number(¤t, 0, 256);
|
||||
serial_buffer.tx[0] = (uint8_t) (current);
|
||||
serial_buffer.tx[1] = serial_buffer.tx[0];
|
||||
serial_send_packet(serial_buffer.tx, 2);
|
||||
rd_ptr +=2;
|
||||
serial_buffer.rd_ptr = rd_ptr; //mark bytes as read
|
||||
continue;
|
||||
}
|
||||
case CMD_WHEEL_RPM:
|
||||
{
|
||||
#ifdef HW_HAS_WHEEL_SPEED_SENSOR
|
||||
// rpm = spd [m/s] / perim [m] * 60[s/min]
|
||||
const volatile mc_configuration *conf = mc_interface_get_configuration();
|
||||
uint16_t wheel_rpm = (uint16_t)(mc_interface_get_speed() / (M_PI * conf->si_wheel_diameter) * 60.0);
|
||||
|
||||
serial_buffer.tx[0] = (uint8_t)(wheel_rpm / 256);
|
||||
serial_buffer.tx[1] = (uint8_t)(wheel_rpm & 0xFFFF);
|
||||
serial_buffer.tx[2] = serial_buffer.tx[0] + serial_buffer.tx[1] + 32;
|
||||
serial_send_packet(serial_buffer.tx, 3);
|
||||
rd_ptr +=2;
|
||||
serial_buffer.rd_ptr = rd_ptr;
|
||||
#endif
|
||||
continue;
|
||||
}
|
||||
case CMD_MOVING:
|
||||
if( mc_interface_get_speed() > 0.0) {
|
||||
serial_buffer.tx[0] = 0x31; //0x31 0x31 indicates bike is in movement.
|
||||
serial_buffer.tx[1] = 0x31;
|
||||
}
|
||||
else {
|
||||
serial_buffer.tx[0] = 0x30;
|
||||
serial_buffer.tx[1] = 0x30;
|
||||
}
|
||||
serial_send_packet(serial_buffer.tx, 2);
|
||||
rd_ptr +=2;
|
||||
serial_buffer.rd_ptr = rd_ptr;
|
||||
continue;
|
||||
case CMD_PEDAL_MOV:
|
||||
// TODO: return pedal activity. 0: no activity
|
||||
serial_buffer.tx[0] = 0x01;
|
||||
serial_send_packet(serial_buffer.tx, 1);
|
||||
rd_ptr +=2;
|
||||
serial_buffer.rd_ptr = rd_ptr;
|
||||
continue;
|
||||
case CMD_BATT_SOC:
|
||||
// Battery state of charge 0-100%.
|
||||
{
|
||||
float wh_left = 0.0;
|
||||
float battery_level = mc_interface_get_battery_level(&wh_left) * 100.0;
|
||||
utils_truncate_number((float*)&battery_level, 0.0, 100.0);
|
||||
|
||||
serial_buffer.tx[0] = (uint8_t) battery_level;
|
||||
serial_buffer.tx[1] = (uint8_t) battery_level;
|
||||
serial_send_packet(serial_buffer.tx, 2);
|
||||
rd_ptr +=2;
|
||||
serial_buffer.rd_ptr = rd_ptr;
|
||||
continue;
|
||||
}
|
||||
case CMD_BATT_VOLTAGE:
|
||||
{
|
||||
// This command was custom made for the eggrider display running at 72V
|
||||
uint16_t batt_voltage = (uint16_t)(GET_INPUT_VOLTAGE() ) * 100.0;
|
||||
serial_buffer.tx[0] = (uint8_t)(batt_voltage / 256);
|
||||
serial_buffer.tx[1] = (uint8_t)(batt_voltage & 0xFFFF);
|
||||
serial_buffer.tx[2] = serial_buffer.tx[0] + serial_buffer.tx[1] + 0x12;
|
||||
serial_send_packet(serial_buffer.tx, 3);
|
||||
rd_ptr +=2;
|
||||
serial_buffer.rd_ptr = rd_ptr;
|
||||
continue;
|
||||
}
|
||||
default:
|
||||
++rd_ptr;
|
||||
serial_buffer.rd_ptr = rd_ptr; //discard the CMD_READ byte as it wasn't followed by a supported command
|
||||
continue;
|
||||
}
|
||||
}
|
||||
rd_ptr++;
|
||||
}
|
||||
|
||||
if(serial_buffer.rd_ptr > 0) {
|
||||
memmove(serial_buffer.data, serial_buffer.data + serial_buffer.rd_ptr, LUNA_SERIAL_BUFFER_SIZE - serial_buffer.rd_ptr);
|
||||
serial_buffer.wr_ptr -= serial_buffer.rd_ptr;
|
||||
serial_buffer.rd_ptr = 0;
|
||||
}
|
||||
if(serial_buffer.wr_ptr == (LUNA_SERIAL_BUFFER_SIZE - 1) ) {
|
||||
//shift buffer to the left discarding the oldest byte
|
||||
memmove(serial_buffer.data,serial_buffer.data + 1, LUNA_SERIAL_BUFFER_SIZE - 1);
|
||||
serial_buffer.wr_ptr -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void serial_display_check_rx(void){
|
||||
bool rx = true;
|
||||
while (rx) {
|
||||
rx = false;
|
||||
|
||||
if (display_uart_is_running) {
|
||||
msg_t res = sdGetTimeout(&HW_UART_DEV, TIME_IMMEDIATE);
|
||||
if (res != MSG_TIMEOUT) {
|
||||
serial_display_byte_process(res);
|
||||
rx = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static THD_FUNCTION(display_process_thread, arg) {
|
||||
(void)arg;
|
||||
chRegSetThreadName("Luna serial display");
|
||||
|
||||
event_listener_t el;
|
||||
chEvtRegisterMaskWithFlags(&HW_UART_DEV.event, &el, EVENT_MASK(0), CHN_INPUT_AVAILABLE);
|
||||
|
||||
// Wait for motor config initialization
|
||||
chThdSleepMilliseconds(500);
|
||||
|
||||
// Set default power level
|
||||
set_assist_level(pas_level);
|
||||
|
||||
for(;;) {
|
||||
chEvtWaitAnyTimeout(ALL_EVENTS, ST2MS(100));
|
||||
serial_display_check_rx();
|
||||
set_assist_level(pas_level); //assert periodically to make sure changes are commited when a new motor config is written
|
||||
}
|
||||
}
|
||||
#endif
|
|
@ -0,0 +1,27 @@
|
|||
/*
|
||||
Copyright 2021 Marcos Chaparro mchaparro@powerdesigns.ca
|
||||
|
||||
This file is part of the VESC firmware.
|
||||
|
||||
The VESC firmware 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.
|
||||
|
||||
The VESC firmware 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/>.
|
||||
*/
|
||||
|
||||
#ifndef APP_LUNA_DISPLAY_SERIAL_H_
|
||||
#define APP_LUNA_DISPLAY_SERIAL_H_
|
||||
|
||||
#include "stdint.h"
|
||||
|
||||
void luna_display_serial_start(int8_t initial_level);
|
||||
|
||||
#endif /* APP_LUNA_DISPLAY_SERIAL_H_ */
|
|
@ -0,0 +1,512 @@
|
|||
// This file is autogenerated by VESC Tool
|
||||
|
||||
#ifndef MCCONF_LUNA_BBSHD_52V_DIRE_WOLF_H_
|
||||
#define MCCONF_LUNA_BBSHD_52V_DIRE_WOLF_H_
|
||||
|
||||
// PWM Mode
|
||||
#define MCCONF_PWM_MODE 1
|
||||
|
||||
// Commutation Mode
|
||||
#define MCCONF_COMM_MODE 0
|
||||
|
||||
// Motor Type
|
||||
#define MCCONF_DEFAULT_MOTOR_TYPE 2
|
||||
|
||||
// Sensor Mode
|
||||
#define MCCONF_SENSOR_MODE 0
|
||||
|
||||
// Motor Current Max
|
||||
#define MCCONF_L_CURRENT_MAX 160
|
||||
|
||||
// Motor Current Max Brake
|
||||
#define MCCONF_L_CURRENT_MIN -30
|
||||
|
||||
// Battery Current Max
|
||||
#define MCCONF_L_IN_CURRENT_MAX 70
|
||||
|
||||
// Battery Current Max Regen
|
||||
#define MCCONF_L_IN_CURRENT_MIN -20
|
||||
|
||||
// Absolute Maximum Current
|
||||
#define MCCONF_L_MAX_ABS_CURRENT 230
|
||||
|
||||
// Max ERPM Reverse
|
||||
#define MCCONF_L_RPM_MIN -26000
|
||||
|
||||
// Max ERPM
|
||||
#define MCCONF_L_RPM_MAX 26000
|
||||
|
||||
// ERPM Limit Start
|
||||
#define MCCONF_L_RPM_START 0.85
|
||||
|
||||
// Max ERPM Full Brake
|
||||
#define MCCONF_L_CURR_MAX_RPM_FBRAKE 300
|
||||
|
||||
// Max ERPM Full Brake Current Control
|
||||
#define MCCONF_L_CURR_MAX_RPM_FBRAKE_CC 1500
|
||||
|
||||
// Minimum Input Voltage
|
||||
#define MCCONF_L_MIN_VOLTAGE 35
|
||||
|
||||
// Maximum Input Voltage
|
||||
#define MCCONF_L_MAX_VOLTAGE 63
|
||||
|
||||
// Battery Voltage Cutoff Start
|
||||
#define MCCONF_L_BATTERY_CUT_START 44.2
|
||||
|
||||
// Battery Voltage Cutoff End
|
||||
#define MCCONF_L_BATTERY_CUT_END 40.3
|
||||
|
||||
// Slow ABS Current Limit
|
||||
#define MCCONF_L_SLOW_ABS_OVERCURRENT 1
|
||||
|
||||
// MOSFET Temp Cutoff Start
|
||||
#define MCCONF_L_LIM_TEMP_FET_START 85
|
||||
|
||||
// MOSFET Temp Cutoff End
|
||||
#define MCCONF_L_LIM_TEMP_FET_END 90
|
||||
|
||||
// Motor Temp Cutoff Start
|
||||
#define MCCONF_L_LIM_TEMP_MOTOR_START 100
|
||||
|
||||
// Motor Temp Cutoff End
|
||||
#define MCCONF_L_LIM_TEMP_MOTOR_END 110
|
||||
|
||||
// Acceleration Temperature Decrease
|
||||
#define MCCONF_L_LIM_TEMP_ACCEL_DEC 0
|
||||
|
||||
// Minimum Duty Cycle
|
||||
#define MCCONF_L_MIN_DUTY 0.005
|
||||
|
||||
// Maximum Duty Cycle
|
||||
#define MCCONF_L_MAX_DUTY 0.95
|
||||
|
||||
// Maximum Wattage
|
||||
#define MCCONF_L_WATT_MAX 7500
|
||||
|
||||
// Maximum Braking Wattage
|
||||
#define MCCONF_L_WATT_MIN -1.5e+06
|
||||
|
||||
// Max Current Scale
|
||||
#define MCCONF_L_CURRENT_MAX_SCALE 1
|
||||
|
||||
// Min Current Scale
|
||||
#define MCCONF_L_CURRENT_MIN_SCALE 1
|
||||
|
||||
// Duty Cycle Current Limit Start
|
||||
#define MCCONF_L_DUTY_START 1
|
||||
|
||||
// Minimum ERPM
|
||||
#define MCCONF_SL_MIN_RPM 150
|
||||
|
||||
// Minimum ERPM Integrator
|
||||
#define MCCONF_SL_MIN_ERPM_CYCLE_INT_LIMIT 1100
|
||||
|
||||
// Max Brake Current at Direction Change
|
||||
#define MCCONF_SL_MAX_FB_CURR_DIR_CHANGE 10
|
||||
|
||||
// Cycle Integrator Limit
|
||||
#define MCCONF_SL_CYCLE_INT_LIMIT 62
|
||||
|
||||
// Phase Advance at BR ERPM
|
||||
#define MCCONF_SL_PHASE_ADVANCE_AT_BR 0.8
|
||||
|
||||
// BR ERPM
|
||||
#define MCCONF_SL_CYCLE_INT_BR 80000
|
||||
|
||||
// BEMF Coupling
|
||||
#define MCCONF_SL_BEMF_COUPLING_K 600
|
||||
|
||||
// Hall Table [0]
|
||||
#define MCCONF_HALL_TAB_0 -1
|
||||
|
||||
// Hall Table [1]
|
||||
#define MCCONF_HALL_TAB_1 1
|
||||
|
||||
// Hall Table [2]
|
||||
#define MCCONF_HALL_TAB_2 3
|
||||
|
||||
// Hall Table [3]
|
||||
#define MCCONF_HALL_TAB_3 2
|
||||
|
||||
// Hall Table [4]
|
||||
#define MCCONF_HALL_TAB_4 5
|
||||
|
||||
// Hall Table [5]
|
||||
#define MCCONF_HALL_TAB_5 6
|
||||
|
||||
// Hall Table [6]
|
||||
#define MCCONF_HALL_TAB_6 4
|
||||
|
||||
// Hall Table [7]
|
||||
#define MCCONF_HALL_TAB_7 -1
|
||||
|
||||
// Sensorless ERPM Hybrid
|
||||
#define MCCONF_HALL_ERPM 2000
|
||||
|
||||
// Current KP
|
||||
#define MCCONF_FOC_CURRENT_KP 0.1437
|
||||
|
||||
// Current KI
|
||||
#define MCCONF_FOC_CURRENT_KI 32.6
|
||||
|
||||
// Switching Frequency
|
||||
#define MCCONF_FOC_F_SW 50000
|
||||
|
||||
// Dead Time Compensation
|
||||
#define MCCONF_FOC_DT_US 0.12
|
||||
|
||||
// Encoder Inverted
|
||||
#define MCCONF_FOC_ENCODER_INVERTED 0
|
||||
|
||||
// Encoder Offset
|
||||
#define MCCONF_FOC_ENCODER_OFFSET 180
|
||||
|
||||
// Encoder Ratio
|
||||
#define MCCONF_FOC_ENCODER_RATIO 7
|
||||
|
||||
// Sin/Cos Sine Gain Compensation
|
||||
#define MCCONF_FOC_ENCODER_SIN_GAIN 1
|
||||
|
||||
// Sin/Cos Cosine Gain Compensation
|
||||
#define MCCONF_FOC_ENCODER_COS_GAIN 1
|
||||
|
||||
// Sin/Cos Sine Offset
|
||||
#define MCCONF_FOC_ENCODER_SIN_OFFSET 1.65
|
||||
|
||||
// Sin/Cos Cosine Offset
|
||||
#define MCCONF_FOC_ENCODER_COS_OFFSET 1.65
|
||||
|
||||
// Sin/Cos Filter Constant
|
||||
#define MCCONF_FOC_ENCODER_SINCOS_FILTER 0.5
|
||||
|
||||
// Sensor Mode
|
||||
#define MCCONF_FOC_SENSOR_MODE 2
|
||||
|
||||
// Speed Tracker Kp
|
||||
#define MCCONF_FOC_PLL_KP 2000
|
||||
|
||||
// Speed Tracker Ki
|
||||
#define MCCONF_FOC_PLL_KI 30000
|
||||
|
||||
// Motor Inductance (L)
|
||||
#define MCCONF_FOC_MOTOR_L 0.00012374
|
||||
|
||||
// Motor Inductance Difference (Ld - Lq)
|
||||
#define MCCONF_FOC_MOTOR_LD_LQ_DIFF 3e-05
|
||||
|
||||
// Motor Resistance (R)
|
||||
#define MCCONF_FOC_MOTOR_R 0.0326
|
||||
|
||||
// Motor Flux Linkage (λ)
|
||||
#define MCCONF_FOC_MOTOR_FLUX_LINKAGE 0.020798
|
||||
|
||||
// Observer Gain (x1M)
|
||||
#define MCCONF_FOC_OBSERVER_GAIN 710000
|
||||
|
||||
// Observer Gain At Minimum Duty
|
||||
#define MCCONF_FOC_OBSERVER_GAIN_SLOW 0.3
|
||||
|
||||
// Duty Downramp Kp
|
||||
#define MCCONF_FOC_DUTY_DOWNRAMP_KP 10
|
||||
|
||||
// Duty Downramp Ki
|
||||
#define MCCONF_FOC_DUTY_DOWNRAMP_KI 200
|
||||
|
||||
// Openloop ERPM
|
||||
#define MCCONF_FOC_OPENLOOP_RPM 400
|
||||
|
||||
// Openloop ERPM at Min Current
|
||||
#define MCCONF_FOC_OPENLOOP_RPM_LOW 0
|
||||
|
||||
// D Axis Gain Scaling Start
|
||||
#define MCCONF_FOC_D_GAIN_SCALE_START 1
|
||||
|
||||
// D Axis Gain Scaling at Max Mod
|
||||
#define MCCONF_FOC_D_GAIN_SCALE_MAX_MOD 0.2
|
||||
|
||||
// Openloop Hysteresis
|
||||
#define MCCONF_FOC_SL_OPENLOOP_HYST 0.1
|
||||
|
||||
// Openloop Lock Time
|
||||
#define MCCONF_FOC_SL_OPENLOOP_T_LOCK 0
|
||||
|
||||
// Openloop Ramp Time
|
||||
#define MCCONF_FOC_SL_OPENLOOP_T_RAMP 0.1
|
||||
|
||||
// Openloop Time
|
||||
#define MCCONF_FOC_SL_OPENLOOP_TIME 0.1
|
||||
|
||||
// Hall Table [0]
|
||||
#define MCCONF_FOC_HALL_TAB_0 255
|
||||
|
||||
// Hall Table [1]
|
||||
#define MCCONF_FOC_HALL_TAB_1 171
|
||||
|
||||
// Hall Table [2]
|
||||
#define MCCONF_FOC_HALL_TAB_2 102
|
||||
|
||||
// Hall Table [3]
|
||||
#define MCCONF_FOC_HALL_TAB_3 135
|
||||
|
||||
// Hall Table [4]
|
||||
#define MCCONF_FOC_HALL_TAB_4 35
|
||||
|
||||
// Hall Table [5]
|
||||
#define MCCONF_FOC_HALL_TAB_5 5
|
||||
|
||||
// Hall Table [6]
|
||||
#define MCCONF_FOC_HALL_TAB_6 68
|
||||
|
||||
// Hall Table [7]
|
||||
#define MCCONF_FOC_HALL_TAB_7 255
|
||||
|
||||
// Hall Interpolation ERPM
|
||||
#define MCCONF_FOC_HALL_INTERP_ERPM 500
|
||||
|
||||
// Sensorless ERPM
|
||||
#define MCCONF_FOC_SL_ERPM 8000
|
||||
|
||||
// Sample in V0 and V7
|
||||
#define MCCONF_FOC_SAMPLE_V0_V7 0
|
||||
|
||||
// High Current Sampling Mode
|
||||
#define MCCONF_FOC_SAMPLE_HIGH_CURRENT 0
|
||||
|
||||
// Stator Saturation Compensation
|
||||
#define MCCONF_FOC_SAT_COMP 0.2
|
||||
|
||||
// Temp Comp
|
||||
#define MCCONF_FOC_TEMP_COMP 1
|
||||
|
||||
// Temp Comp Base Temp
|
||||
#define MCCONF_FOC_TEMP_COMP_BASE_TEMP 25
|
||||
|
||||
// Current Filter Constant
|
||||
#define MCCONF_FOC_CURRENT_FILTER_CONST 0.1
|
||||
|
||||
// Current Controller Decoupling
|
||||
#define MCCONF_FOC_CC_DECOUPLING 0
|
||||
|
||||
// Observer Type
|
||||
#define MCCONF_FOC_OBSERVER_TYPE 0
|
||||
|
||||
// HFI Start Voltage
|
||||
#define MCCONF_FOC_HFI_VOLTAGE_START 20
|
||||
|
||||
// HFI Run Voltage
|
||||
#define MCCONF_FOC_HFI_VOLTAGE_RUN 4
|
||||
|
||||
// HFI Max Voltage
|
||||
#define MCCONF_FOC_HFI_VOLTAGE_MAX 10
|
||||
|
||||
// Sensorless ERPM HFI
|
||||
#define MCCONF_FOC_SL_ERPM_HFI 2000
|
||||
|
||||
// HFI Start Samples
|
||||
#define MCCONF_FOC_HFI_START_SAMPLES 65
|
||||
|
||||
// HFI Observer Override Time
|
||||
#define MCCONF_FOC_HFI_OBS_OVR_SEC 0.001
|
||||
|
||||
// HFI Samples
|
||||
#define MCCONF_FOC_HFI_SAMPLES 1
|
||||
|
||||
// Run calibration at boot
|
||||
#define MCCONF_FOC_OFFSETS_CAL_ON_BOOT 1
|
||||
|
||||
// Current Offset 0
|
||||
#define MCCONF_FOC_OFFSETS_CURRENT_0 1795.9
|
||||
|
||||
// Current Offset 1
|
||||
#define MCCONF_FOC_OFFSETS_CURRENT_1 1796.08
|
||||
|
||||
// Current Offset 2
|
||||
#define MCCONF_FOC_OFFSETS_CURRENT_2 1795.74
|
||||
|
||||
// Voltage Offset 0
|
||||
#define MCCONF_FOC_OFFSETS_VOLTAGE_0 0
|
||||
|
||||
// Voltage Offset 1
|
||||
#define MCCONF_FOC_OFFSETS_VOLTAGE_1 0
|
||||
|
||||
// Voltage Offset 2
|
||||
#define MCCONF_FOC_OFFSETS_VOLTAGE_2 0
|
||||
|
||||
// Voltage Offset Undriven 0
|
||||
#define MCCONF_FOC_OFFSETS_VOLTAGE_UNDRIVEN_0 0
|
||||
|
||||
// Voltage Offset Undriven 1
|
||||
#define MCCONF_FOC_OFFSETS_VOLTAGE_UNDRIVEN_1 0
|
||||
|
||||
// Voltage Offset Undriven 2
|
||||
#define MCCONF_FOC_OFFSETS_VOLTAGE_UNDRIVEN_2 0
|
||||
|
||||
// Enable Phase Filters
|
||||
#define MCCONF_FOC_PHASE_FILTER_ENABLE 1
|
||||
|
||||
// Maximum ERPM for phase filters
|
||||
#define MCCONF_FOC_PHASE_FILTER_MAX_ERPM 10000
|
||||
|
||||
// Field Weakening Current Max
|
||||
#define MCCONF_FOC_FW_CURRENT_MAX 30
|
||||
|
||||
// Field Weakening Duty Start
|
||||
#define MCCONF_FOC_FW_DUTY_START 0.9
|
||||
|
||||
// Field Weakening Ramp Time
|
||||
#define MCCONF_FOC_FW_RAMP_TIME 0.3
|
||||
|
||||
// Q Axis Current Factor
|
||||
#define MCCONF_FOC_FW_Q_CURRENT_FACTOR 0.02
|
||||
|
||||
// Buffer Notification Length
|
||||
#define MCCONF_GPD_BUFFER_NOTIFY_LEFT 200
|
||||
|
||||
// Buffer Sampling Interpolation
|
||||
#define MCCONF_GPD_BUFFER_INTERPOL 0
|
||||
|
||||
// Current Filter Constant
|
||||
#define MCCONF_GPD_CURRENT_FILTER_CONST 0.1
|
||||
|
||||
// Current KP
|
||||
#define MCCONF_GPD_CURRENT_KP 0.03
|
||||
|
||||
// Current KI
|
||||
#define MCCONF_GPD_CURRENT_KI 50
|
||||
|
||||
// Speed PID Kp
|
||||
#define MCCONF_S_PID_KP 0.004
|
||||
|
||||
// Speed PID Ki
|
||||
#define MCCONF_S_PID_KI 0.004
|
||||
|
||||
// Speed PID Kd
|
||||
#define MCCONF_S_PID_KD 0.0001
|
||||
|
||||
// Speed PID Kd Filer
|
||||
#define MCCONF_S_PID_KD_FILTER 0.2
|
||||
|
||||
// Minimum ERPM
|
||||
#define MCCONF_S_PID_MIN_RPM 900
|
||||
|
||||
// Allow Braking
|
||||
#define MCCONF_S_PID_ALLOW_BRAKING 1
|
||||
|
||||
// Ramp eRPMs per second
|
||||
#define MCCONF_S_PID_RAMP_ERPMS_S -1
|
||||
|
||||
// Position PID Kp
|
||||
#define MCCONF_P_PID_KP 0.03
|
||||
|
||||
// Position PID Ki
|
||||
#define MCCONF_P_PID_KI 0
|
||||
|
||||
// Position PID Kd
|
||||
#define MCCONF_P_PID_KD 0.0004
|
||||
|
||||
// Position PID Kd Filer
|
||||
#define MCCONF_P_PID_KD_FILTER 0.2
|
||||
|
||||
// Position Angle Division
|
||||
#define MCCONF_P_PID_ANG_DIV 1
|
||||
|
||||
// Startup boost
|
||||
#define MCCONF_CC_STARTUP_BOOST_DUTY 0.01
|
||||
|
||||
// Minimum Current
|
||||
#define MCCONF_CC_MIN_CURRENT 0.01
|
||||
|
||||
// Current Controller Gain
|
||||
#define MCCONF_CC_GAIN 0.0046
|
||||
|
||||
// Current Control Ramp Step Max
|
||||
#define MCCONF_CC_RAMP_STEP 0.04
|
||||
|
||||
// Fault Stop Time
|
||||
#define MCCONF_M_FAULT_STOP_TIME 500
|
||||
|
||||
// Duty Ramp Step Max
|
||||
#define MCCONF_M_RAMP_STEP 0.02
|
||||
|
||||
// Current Backoff Gain
|
||||
#define MCCONF_M_CURRENT_BACKOFF_GAIN 0.5
|
||||
|
||||
// ABI Encoder Counts
|
||||
#define MCCONF_M_ENCODER_COUNTS 8192
|
||||
|
||||
// Sensor Port Mode
|
||||
#define MCCONF_M_SENSOR_PORT_MODE 0
|
||||
|
||||
// Invert Motor Direction
|
||||
#define MCCONF_M_INVERT_DIRECTION 1
|
||||
|
||||
// DRV8301 OC Mode
|
||||
#define MCCONF_M_DRV8301_OC_MODE 0
|
||||
|
||||
// DRV8301 OC Adjustment
|
||||
#define MCCONF_M_DRV8301_OC_ADJ 16
|
||||
|
||||
// Minimum Switching Frequency
|
||||
#define MCCONF_M_BLDC_F_SW_MIN 3000
|
||||
|
||||
// Maximum Switching Frequency
|
||||
#define MCCONF_M_BLDC_F_SW_MAX 35000
|
||||
|
||||
// Switching Frequency
|
||||
#define MCCONF_M_DC_F_SW 25000
|
||||
|
||||
// Beta Value for Motor Thermistor
|
||||
#define MCCONF_M_NTC_MOTOR_BETA 3990
|
||||
|
||||
// Auxiliary Output Mode
|
||||
#define MCCONF_M_OUT_AUX_MODE 0
|
||||
|
||||
// Motor Temperature Sensor Type
|
||||
#define MCCONF_M_MOTOR_TEMP_SENS_TYPE 0
|
||||
|
||||
// Coefficient for PTC Motor Thermistor
|
||||
#define MCCONF_M_PTC_MOTOR_COEFF 0.61
|
||||
|
||||
// Hall Sensor Extra Samples
|
||||
#define MCCONF_M_HALL_EXTRA_SAMPLES 1
|
||||
|
||||
// Motor Poles
|
||||
#define MCCONF_SI_MOTOR_POLES 8
|
||||
|
||||
// Gear Ratio
|
||||
#define MCCONF_SI_GEAR_RATIO 7
|
||||
|
||||
// Wheel Diameter
|
||||
#define MCCONF_SI_WHEEL_DIAMETER 0.66
|
||||
|
||||
// Battery Type
|
||||
#define MCCONF_SI_BATTERY_TYPE 0
|
||||
|
||||
// Battery Cells Series
|
||||
#define MCCONF_SI_BATTERY_CELLS 14
|
||||
|
||||
// Battery Capacity
|
||||
#define MCCONF_SI_BATTERY_AH 21
|
||||
|
||||
// BMS Type
|
||||
#define MCCONF_BMS_TYPE 1
|
||||
|
||||
// Temperature Limit Start
|
||||
#define MCCONF_BMS_T_LIMIT_START 45
|
||||
|
||||
// Temperature Limit End
|
||||
#define MCCONF_BMS_T_LIMIT_END 65
|
||||
|
||||
// SOC Limit Start
|
||||
#define MCCONF_BMS_SOC_LIMIT_START 0.05
|
||||
|
||||
// SOC Limit End
|
||||
#define MCCONF_BMS_SOC_LIMIT_END 0
|
||||
|
||||
// Forward CAN to Local
|
||||
#define MCCONF_BMS_FWD_CAN_MODE 0
|
||||
|
||||
// MCCONF_LUNA_BBSHD_52V_DIRE_WOLF_H_
|
||||
#endif
|
||||
|
|
@ -0,0 +1,461 @@
|
|||
// This file is autogenerated by VESC Tool
|
||||
|
||||
#include "qmlui_luna_v1.h"
|
||||
|
||||
uint8_t data_qml_app[7270] = {
|
||||
0x00, 0x01, 0x92, 0x40, 0x78, 0xda, 0xed, 0x3d, 0xdb, 0x72, 0xdb, 0xb8, 0x92, 0xef, 0xfe, 0x0a,
|
||||
0x44, 0x5b, 0x9b, 0x23, 0x4d, 0x1c, 0x4a, 0xb6, 0x63, 0x67, 0x46, 0x67, 0x73, 0x52, 0xb1, 0x13,
|
||||
0x67, 0x5c, 0xe5, 0xcc, 0x78, 0x2c, 0x27, 0x79, 0x38, 0x39, 0xe5, 0xa2, 0x45, 0x48, 0x42, 0x85,
|
||||
0xb7, 0x01, 0x21, 0x5f, 0xce, 0xac, 0xab, 0xf6, 0x03, 0xf6, 0x2b, 0xf7, 0x4b, 0xb6, 0x01, 0x92,
|
||||
0x12, 0x49, 0xf1, 0x02, 0xde, 0x6c, 0xc9, 0x01, 0x33, 0x93, 0xd8, 0x24, 0xd0, 0x0d, 0x34, 0x1a,
|
||||
0xdd, 0x8d, 0x46, 0x37, 0x40, 0x2c, 0xd7, 0xa1, 0x0c, 0x7d, 0xc1, 0x86, 0x81, 0xa9, 0x76, 0x8d,
|
||||
0xbd, 0xb1, 0xf8, 0x8b, 0xd8, 0x0c, 0xd3, 0x89, 0x3e, 0xc6, 0x68, 0x47, 0x1b, 0xfc, 0x9d, 0xf8,
|
||||
0x85, 0x3a, 0x7f, 0xd2, 0xf1, 0xb0, 0x6f, 0x39, 0x57, 0xc4, 0xc4, 0x9d, 0xf0, 0xe5, 0x1f, 0xec,
|
||||
0x8f, 0x39, 0x19, 0x7f, 0x47, 0xbb, 0xda, 0xeb, 0xad, 0xf8, 0x2b, 0xed, 0xc8, 0xb1, 0x19, 0x75,
|
||||
0x4c, 0x0f, 0xbe, 0xed, 0x26, 0xbf, 0x9d, 0xea, 0x77, 0xce, 0x9c, 0x79, 0x00, 0x7e, 0x6f, 0xf9,
|
||||
0x49, 0x33, 0xf5, 0x2b, 0x4f, 0xf3, 0x30, 0x63, 0xc4, 0x9e, 0xf2, 0x6f, 0x03, 0xa4, 0x7b, 0xe8,
|
||||
0x8f, 0x51, 0xf0, 0x22, 0x2c, 0x98, 0xdb, 0xd8, 0xb4, 0x42, 0x57, 0x26, 0x9e, 0xeb, 0xf0, 0x2e,
|
||||
0xe3, 0xf3, 0xd8, 0xb1, 0x2c, 0xdd, 0x36, 0xbc, 0xec, 0xef, 0xf6, 0x84, 0x4c, 0x5d, 0x9d, 0xea,
|
||||
0x56, 0x66, 0x99, 0x39, 0x23, 0x26, 0x61, 0x77, 0xe2, 0xf3, 0xd6, 0x09, 0xc3, 0x16, 0xfa, 0x6b,
|
||||
0x0b, 0xc1, 0x43, 0x8c, 0x21, 0xb2, 0x74, 0x62, 0xf3, 0x57, 0xe2, 0x85, 0x6e, 0x8f, 0x67, 0x0e,
|
||||
0xf5, 0xb4, 0x09, 0x31, 0xcd, 0x21, 0x02, 0xa0, 0xd8, 0x66, 0xe2, 0x43, 0xbf, 0x1f, 0x7e, 0xb2,
|
||||
0x74, 0x3a, 0x25, 0xb6, 0x37, 0x44, 0x3b, 0x03, 0xff, 0xc3, 0x84, 0xdc, 0x22, 0x36, 0x23, 0xde,
|
||||
0x96, 0x28, 0xe8, 0x52, 0xc7, 0xc5, 0x14, 0x70, 0x1d, 0x9a, 0xf8, 0x33, 0xef, 0x96, 0x05, 0x3f,
|
||||
0x0c, 0xa1, 0x35, 0xde, 0xf8, 0x64, 0xc2, 0xfb, 0xfa, 0x1e, 0x5f, 0x93, 0x31, 0xee, 0xf6, 0xe2,
|
||||
0xa5, 0x8f, 0xc2, 0x5e, 0x5a, 0xe1, 0x4f, 0x8b, 0x3a, 0x21, 0x01, 0x92, 0x55, 0xae, 0x75, 0x8a,
|
||||
0x26, 0x37, 0x5f, 0x30, 0xf5, 0x88, 0x63, 0x0f, 0x97, 0x15, 0xb5, 0x29, 0x66, 0xc7, 0xe1, 0xfb,
|
||||
0x55, 0x3c, 0x9c, 0x5a, 0x67, 0x3e, 0xb5, 0xac, 0x4f, 0x63, 0xfe, 0xfb, 0x02, 0x93, 0x35, 0xf6,
|
||||
0x3f, 0xe7, 0x57, 0x7a, 0xe7, 0xba, 0xb1, 0x5a, 0xba, 0xff, 0x7b, 0x51, 0xb5, 0x13, 0x7b, 0xe2,
|
||||
0xc4, 0xea, 0x91, 0xe0, 0xc5, 0x6a, 0xc5, 0x2b, 0xc7, 0x31, 0x11, 0xf1, 0x7e, 0x75, 0x28, 0xf9,
|
||||
0x37, 0x70, 0xa9, 0x0e, 0x43, 0x71, 0x43, 0x0c, 0x36, 0x43, 0xff, 0x40, 0x33, 0x4c, 0xa6, 0x33,
|
||||
0xb6, 0x95, 0x52, 0xde, 0x1b, 0xcf, 0xb0, 0x31, 0x37, 0x31, 0x07, 0xf9, 0x95, 0x12, 0x06, 0x44,
|
||||
0x9f, 0xe8, 0xa6, 0x87, 0x53, 0x8a, 0xc2, 0x88, 0x61, 0xe3, 0x62, 0x46, 0x1d, 0xc6, 0xcc, 0x45,
|
||||
0xb1, 0x55, 0xe2, 0xfa, 0xc3, 0x7f, 0xa1, 0x5f, 0x1d, 0xea, 0x34, 0x64, 0x06, 0x8d, 0x89, 0x5f,
|
||||
0x17, 0x0c, 0x23, 0xfe, 0x02, 0xca, 0xbb, 0x8e, 0xcd, 0xbf, 0x3a, 0x36, 0xff, 0xd9, 0xc4, 0x0c,
|
||||
0x03, 0x67, 0xf9, 0x3c, 0x26, 0xc0, 0x46, 0x20, 0x69, 0xd7, 0xc4, 0x23, 0xc0, 0x07, 0xe8, 0x0d,
|
||||
0x62, 0x74, 0x8e, 0xd3, 0xcb, 0x60, 0x5b, 0x87, 0x22, 0x46, 0xb4, 0xcc, 0xfd, 0x56, 0x80, 0xcb,
|
||||
0x9c, 0x5b, 0xb6, 0x3f, 0x41, 0x23, 0x18, 0x52, 0x19, 0x77, 0xf1, 0xd5, 0x87, 0x1a, 0x29, 0x1e,
|
||||
0x32, 0xbf, 0xdf, 0x9b, 0xd8, 0x6b, 0xbf, 0xee, 0x30, 0xd6, 0x9e, 0x58, 0x81, 0x34, 0x54, 0x9c,
|
||||
0x12, 0xb1, 0x42, 0xe3, 0x39, 0xe5, 0xef, 0x4f, 0x6c, 0x03, 0xdf, 0x0e, 0x91, 0x77, 0x43, 0x5c,
|
||||
0xfc, 0x85, 0xe0, 0x1b, 0x2d, 0xfa, 0x3e, 0x56, 0xc1, 0xef, 0x91, 0x00, 0xfa, 0x95, 0x8f, 0xf5,
|
||||
0x30, 0x4e, 0x1d, 0xd1, 0x60, 0xa0, 0x2c, 0x19, 0x13, 0x16, 0x7c, 0x1f, 0xc4, 0x11, 0x9a, 0xc4,
|
||||
0x0d, 0xea, 0xc4, 0xbb, 0x13, 0x8e, 0x28, 0xc8, 0x21, 0x74, 0x35, 0x67, 0xcc, 0xe1, 0x73, 0x77,
|
||||
0xbf, 0xa8, 0x4c, 0x80, 0x63, 0x67, 0x30, 0x88, 0x83, 0xe3, 0xf4, 0x10, 0x05, 0x12, 0xc4, 0xe4,
|
||||
0x0f, 0xc3, 0xb7, 0x40, 0xb7, 0x3f, 0xbd, 0x0b, 0xda, 0xed, 0x00, 0x17, 0xda, 0x78, 0xcc, 0x3a,
|
||||
0xbd, 0x95, 0x52, 0x37, 0x3e, 0xe4, 0x4f, 0x3a, 0x9b, 0x81, 0x2c, 0xb9, 0xed, 0xfa, 0x43, 0xa0,
|
||||
0x45, 0xd0, 0x6e, 0xaf, 0xd4, 0x59, 0xc1, 0xe4, 0xd7, 0xf1, 0x27, 0x45, 0x1f, 0xc5, 0x40, 0x78,
|
||||
0x71, 0x94, 0xf7, 0x95, 0x9a, 0x7f, 0x4e, 0x0c, 0xbc, 0xa9, 0x6d, 0xbf, 0x98, 0xdb, 0x1b, 0xdb,
|
||||
0xf6, 0x43, 0xf2, 0x1d, 0xa3, 0xa3, 0xe3, 0x8f, 0x9b, 0xda, 0xfe, 0x63, 0x42, 0xad, 0x1b, 0x90,
|
||||
0x08, 0xeb, 0xd4, 0xfe, 0xfb, 0xe5, 0x0c, 0x1e, 0x85, 0x72, 0x28, 0x45, 0x14, 0x2e, 0x64, 0x54,
|
||||
0x8e, 0x1c, 0x0b, 0x10, 0xca, 0x08, 0xb1, 0x5f, 0x85, 0xa2, 0x4a, 0x91, 0x62, 0x19, 0x82, 0x4e,
|
||||
0x4a, 0x98, 0x9d, 0xe9, 0x53, 0x0c, 0x4d, 0x5f, 0xa1, 0xd3, 0x47, 0x4a, 0x8c, 0x15, 0x95, 0x90,
|
||||
0xec, 0xe0, 0x14, 0x0a, 0xa5, 0x7e, 0xcc, 0x34, 0x7a, 0x92, 0x4f, 0xea, 0xcb, 0xb1, 0x50, 0x48,
|
||||
0x20, 0x53, 0xa3, 0x0a, 0x1b, 0xbd, 0x45, 0xbb, 0x08, 0xc4, 0x67, 0x4e, 0x8d, 0x91, 0xab, 0x83,
|
||||
0x6d, 0x38, 0x4d, 0xca, 0xe2, 0xf0, 0xa1, 0xce, 0xcd, 0xa2, 0xc4, 0xce, 0x60, 0x2b, 0xb5, 0xcc,
|
||||
0x89, 0xe5, 0xd3, 0x23, 0x8b, 0x5d, 0x78, 0xaf, 0x09, 0x2f, 0x93, 0x59, 0x22, 0x18, 0x8c, 0x45,
|
||||
0x8b, 0xec, 0x12, 0xdd, 0x88, 0xd4, 0x77, 0x29, 0x9e, 0x60, 0xe0, 0x09, 0x23, 0x1c, 0xd1, 0x08,
|
||||
0x9f, 0x4a, 0xd7, 0x0d, 0x39, 0xa6, 0xeb, 0x39, 0x73, 0x3a, 0xc6, 0x23, 0xf2, 0x6f, 0xac, 0xf9,
|
||||
0xe6, 0x0e, 0xfa, 0x29, 0x1d, 0x51, 0xaf, 0x70, 0xc2, 0x24, 0x9f, 0x3e, 0x8a, 0x00, 0x97, 0x6a,
|
||||
0x9e, 0x6e, 0x92, 0xa9, 0x6d, 0x09, 0x8b, 0x00, 0x96, 0x00, 0xef, 0xf8, 0x6f, 0xbf, 0x1e, 0x61,
|
||||
0x6e, 0xd3, 0xa3, 0xff, 0x5e, 0xbc, 0x39, 0x04, 0x4b, 0xca, 0xb1, 0x32, 0x41, 0x35, 0x31, 0xf5,
|
||||
0x2b, 0x88, 0x80, 0xe8, 0xe3, 0x77, 0x7b, 0x28, 0x56, 0x49, 0x1d, 0xf4, 0x02, 0x7d, 0xf6, 0x57,
|
||||
0x04, 0xdc, 0x56, 0xbe, 0x98, 0x61, 0x0b, 0x9f, 0x41, 0xdb, 0xba, 0x3d, 0xf8, 0xd0, 0xe9, 0x9b,
|
||||
0xce, 0xd4, 0xd1, 0x5c, 0x7b, 0xda, 0x49, 0x05, 0x76, 0x9f, 0xce, 0x8a, 0x1f, 0xa9, 0x33, 0x77,
|
||||
0x0f, 0x9d, 0xdb, 0x02, 0x6e, 0xbc, 0x12, 0xf6, 0x29, 0xd0, 0xeb, 0x36, 0xb3, 0x18, 0x23, 0xc2,
|
||||
0x28, 0x0d, 0xf4, 0xc1, 0xe9, 0x07, 0x14, 0x98, 0x12, 0x60, 0xcc, 0x77, 0x7a, 0x45, 0xa3, 0x95,
|
||||
0x67, 0x3e, 0x15, 0xf0, 0xfd, 0xce, 0x56, 0x66, 0xe9, 0x42, 0xf1, 0x92, 0x94, 0x24, 0xcc, 0x71,
|
||||
0x3f, 0x89, 0x65, 0xd2, 0x10, 0xbd, 0xdc, 0x97, 0xaa, 0x71, 0x25, 0x38, 0xa8, 0x64, 0xa5, 0x74,
|
||||
0x63, 0x37, 0x55, 0xe4, 0x08, 0x81, 0xba, 0x5c, 0x0f, 0x64, 0x3d, 0x81, 0x6d, 0x5e, 0x40, 0xbd,
|
||||
0xa4, 0x7c, 0x7a, 0xb9, 0x33, 0xc8, 0xc7, 0x2e, 0x23, 0xf0, 0x22, 0x80, 0xbd, 0xa2, 0x32, 0x0b,
|
||||
0x99, 0x7b, 0x90, 0xdf, 0xed, 0x4c, 0x9d, 0x9d, 0xc6, 0x9b, 0xb0, 0xb2, 0xff, 0x4d, 0xb7, 0xb0,
|
||||
0x5f, 0xa7, 0x58, 0x15, 0x47, 0xb4, 0x3e, 0xaf, 0xd6, 0x29, 0x16, 0x46, 0x29, 0x4c, 0xb7, 0x2b,
|
||||
0x5b, 0x29, 0x29, 0x61, 0x77, 0x07, 0x03, 0xd9, 0xaa, 0xb2, 0x73, 0x22, 0x7c, 0x82, 0xb5, 0x97,
|
||||
0x98, 0xac, 0x30, 0x51, 0xa1, 0xbd, 0x73, 0x58, 0x16, 0xfc, 0x03, 0x0d, 0xb6, 0x0a, 0xab, 0xc2,
|
||||
0xf2, 0x0f, 0x56, 0x28, 0xdf, 0xe3, 0x8b, 0xbf, 0x5c, 0xba, 0x4f, 0x50, 0x17, 0xd0, 0xf0, 0xe5,
|
||||
0xa4, 0xa7, 0xc1, 0xc8, 0x1f, 0x71, 0x5c, 0x20, 0x87, 0x00, 0x5b, 0x4f, 0x12, 0x04, 0x7f, 0x00,
|
||||
0x04, 0x1f, 0x83, 0xf7, 0x44, 0x07, 0xe1, 0xa5, 0xc1, 0x62, 0x26, 0x5c, 0xf7, 0x17, 0x3d, 0xf7,
|
||||
0x08, 0xc3, 0x94, 0x28, 0x81, 0x29, 0x58, 0xbb, 0x63, 0x8b, 0xb0, 0x4f, 0xd8, 0xf3, 0x40, 0xb7,
|
||||
0xfa, 0x48, 0xbb, 0xa5, 0x55, 0x11, 0x7f, 0x3a, 0x23, 0xcc, 0x10, 0x97, 0x71, 0xbe, 0x53, 0x04,
|
||||
0x09, 0x46, 0xda, 0xae, 0x06, 0xea, 0x37, 0x07, 0x19, 0x3e, 0x14, 0x0f, 0x9b, 0x20, 0x2f, 0xb1,
|
||||
0xa1, 0x55, 0x04, 0x25, 0xc4, 0xc4, 0xb6, 0xff, 0x8f, 0x24, 0x19, 0xb7, 0xea, 0x95, 0xb8, 0x6f,
|
||||
0x68, 0x1a, 0xfb, 0x93, 0xb2, 0x73, 0xa6, 0x13, 0xda, 0x69, 0x6b, 0x7a, 0xd4, 0x9f, 0x90, 0x71,
|
||||
0x01, 0xd0, 0xfc, 0xa4, 0x72, 0xa1, 0xfb, 0x91, 0xa9, 0x10, 0x30, 0x68, 0x6f, 0x4d, 0xc6, 0x48,
|
||||
0x88, 0xda, 0xb1, 0x6e, 0x57, 0x90, 0xb3, 0x23, 0xa8, 0xb6, 0x39, 0x72, 0xb6, 0xf9, 0x81, 0x5d,
|
||||
0x92, 0x2d, 0xe2, 0x20, 0x2b, 0x56, 0xea, 0xe1, 0xc3, 0x3d, 0xb1, 0x9a, 0xc7, 0x74, 0xca, 0x38,
|
||||
0x21, 0xdb, 0x66, 0x88, 0x23, 0xc7, 0xba, 0x72, 0xf2, 0x2d, 0xc2, 0x84, 0x65, 0x98, 0x67, 0x15,
|
||||
0xe6, 0x8c, 0xed, 0x41, 0xcb, 0x33, 0x5d, 0x6a, 0x05, 0xf0, 0xc5, 0x7f, 0x53, 0xcc, 0xce, 0x54,
|
||||
0xb7, 0xbd, 0x89, 0x43, 0xad, 0xdf, 0x29, 0x11, 0xa6, 0x1e, 0x57, 0x7d, 0x5a, 0x50, 0x59, 0x6a,
|
||||
0x32, 0x9c, 0x3b, 0xdc, 0x3e, 0xeb, 0x7c, 0xc7, 0x77, 0xc5, 0x22, 0xce, 0x72, 0x0c, 0x0c, 0x16,
|
||||
0xe2, 0x29, 0xf1, 0xd8, 0x27, 0xfe, 0xa3, 0xac, 0x56, 0xf6, 0xc7, 0x43, 0x68, 0xe5, 0x35, 0x92,
|
||||
0x1a, 0x06, 0xf1, 0xc6, 0xfe, 0x5a, 0xa0, 0x82, 0xec, 0x78, 0xbf, 0xa8, 0x2c, 0x21, 0x41, 0x16,
|
||||
0x26, 0x90, 0xdc, 0xe4, 0x7a, 0x78, 0x1b, 0x2d, 0x65, 0x1a, 0xec, 0xb5, 0x20, 0x70, 0x02, 0x6b,
|
||||
0x67, 0x49, 0xf8, 0x33, 0x87, 0xb2, 0xb5, 0xd2, 0x24, 0xd5, 0x19, 0xe2, 0x48, 0x71, 0xc3, 0xe3,
|
||||
0x18, 0xeb, 0xb1, 0x21, 0xab, 0xa4, 0xc8, 0x22, 0xac, 0x19, 0x02, 0x33, 0x71, 0x35, 0x0b, 0x7c,
|
||||
0xd1, 0x9f, 0x29, 0x66, 0xd5, 0x20, 0x04, 0x50, 0xc4, 0x4a, 0x29, 0xe2, 0x17, 0xed, 0x69, 0xd7,
|
||||
0xba, 0x39, 0x7f, 0x30, 0xfb, 0xb9, 0xdc, 0x97, 0x7a, 0x4e, 0x1c, 0xb0, 0x26, 0x41, 0x75, 0x4d,
|
||||
0xa5, 0x9d, 0x38, 0xef, 0x75, 0xa6, 0xa3, 0x53, 0xbf, 0x52, 0x79, 0x17, 0x4e, 0x66, 0xf9, 0x7e,
|
||||
0x3f, 0xd5, 0x8b, 0x93, 0x5d, 0x7c, 0x74, 0x43, 0xd8, 0x78, 0x96, 0xd3, 0xb9, 0x7e, 0x3f, 0xd2,
|
||||
0x3d, 0xbf, 0x74, 0x4e, 0xd9, 0xa8, 0x30, 0xf9, 0x20, 0xb8, 0x38, 0xac, 0x9a, 0xd3, 0xc9, 0x7e,
|
||||
0x7f, 0xe9, 0xbe, 0x19, 0x0b, 0xad, 0x7f, 0x62, 0xe7, 0xfa, 0x9c, 0xfd, 0x4a, 0xd9, 0x03, 0x5c,
|
||||
0xd8, 0xa9, 0x70, 0xd4, 0x28, 0x83, 0x21, 0xf8, 0x60, 0x17, 0x19, 0x59, 0xc1, 0x12, 0x2a, 0xe8,
|
||||
0xd0, 0xf9, 0x05, 0x8a, 0x8d, 0x9e, 0x94, 0x5b, 0x4a, 0xba, 0x5f, 0x15, 0x45, 0x5e, 0xf9, 0x65,
|
||||
0x54, 0x29, 0x51, 0xc7, 0xc5, 0xdc, 0x78, 0x86, 0x79, 0xf1, 0x5e, 0x09, 0xc9, 0x18, 0x08, 0x24,
|
||||
0xbe, 0xe2, 0x3a, 0xe7, 0xa4, 0x3e, 0x26, 0x55, 0x64, 0x12, 0x0d, 0xab, 0x5e, 0xc0, 0x38, 0x68,
|
||||
0x7c, 0x30, 0x7a, 0x65, 0x64, 0x6b, 0xe8, 0xd6, 0x15, 0x56, 0xfe, 0x47, 0xdb, 0xf3, 0x8e, 0x1d,
|
||||
0x8a, 0xa7, 0x30, 0xad, 0x6d, 0x63, 0x84, 0x69, 0x24, 0xf0, 0xa2, 0x84, 0x88, 0xf5, 0x30, 0xfb,
|
||||
0xaa, 0x7f, 0xc7, 0xa7, 0xce, 0xf8, 0x7b, 0x97, 0x8f, 0x4d, 0x63, 0x22, 0xad, 0x8c, 0xef, 0x25,
|
||||
0x14, 0xf7, 0xa6, 0xe3, 0xe1, 0x25, 0x79, 0xe5, 0x9a, 0xb2, 0x24, 0x8a, 0xe3, 0x66, 0xd1, 0x44,
|
||||
0x7a, 0x98, 0x9f, 0x05, 0x2d, 0x99, 0x7b, 0x78, 0x41, 0x95, 0x52, 0x43, 0x94, 0x42, 0xd5, 0xf5,
|
||||
0xf1, 0xb4, 0x5c, 0x10, 0x0b, 0x53, 0x89, 0xce, 0x50, 0xec, 0x62, 0x9d, 0x49, 0x9a, 0x27, 0x74,
|
||||
0x6e, 0xdb, 0xc2, 0xf1, 0x2b, 0x55, 0x5a, 0xc4, 0x4b, 0x5d, 0xf3, 0x98, 0x97, 0xfd, 0x81, 0x94,
|
||||
0xcb, 0xf1, 0x02, 0x56, 0x52, 0x53, 0x4c, 0xcb, 0xd9, 0x31, 0x4b, 0x69, 0xa8, 0x05, 0x73, 0xbd,
|
||||
0xd4, 0x54, 0x7d, 0xfe, 0x1c, 0x85, 0x8c, 0x40, 0x3c, 0xc1, 0x8f, 0xbf, 0x0b, 0xa7, 0x63, 0xb5,
|
||||
0xb9, 0x5a, 0x93, 0x2d, 0x1b, 0x63, 0xcd, 0xfa, 0xec, 0x29, 0xc7, 0xa2, 0x12, 0x8c, 0x18, 0x93,
|
||||
0x87, 0xb1, 0x71, 0x02, 0x4b, 0x31, 0x8d, 0xf2, 0x0f, 0x6e, 0x41, 0xe5, 0xbf, 0xb9, 0x4f, 0xdd,
|
||||
0xb8, 0x5e, 0xb1, 0x1b, 0xf5, 0xf1, 0x77, 0x7f, 0xc8, 0x87, 0xe8, 0x1c, 0xcc, 0x58, 0xdd, 0x9e,
|
||||
0x9a, 0x59, 0x12, 0xd1, 0xe1, 0xdb, 0x27, 0xec, 0x6e, 0x88, 0x06, 0xda, 0x60, 0x4b, 0x82, 0x9a,
|
||||
0xe7, 0x8c, 0x6b, 0xee, 0x11, 0x66, 0x73, 0x37, 0x05, 0x62, 0xbf, 0xef, 0x7f, 0xff, 0x4a, 0xd8,
|
||||
0xec, 0x02, 0x5b, 0x2e, 0xa6, 0x3a, 0x9b, 0xd3, 0x2c, 0xdc, 0x52, 0x3b, 0xe4, 0xeb, 0x46, 0x80,
|
||||
0x8c, 0x48, 0xb1, 0xb4, 0x7e, 0x45, 0xf6, 0xeb, 0xf6, 0x73, 0x0b, 0xc6, 0xb7, 0xe9, 0x76, 0x80,
|
||||
0x8c, 0x26, 0xd6, 0xaf, 0x31, 0xf2, 0x5c, 0x1e, 0xe0, 0x39, 0x71, 0x28, 0x02, 0xcd, 0xcb, 0xe6,
|
||||
0xde, 0x95, 0x4e, 0xdf, 0xca, 0x53, 0x32, 0x3d, 0x4a, 0xa0, 0x60, 0xcb, 0xae, 0x78, 0xab, 0xce,
|
||||
0x5b, 0x6e, 0xb8, 0xa5, 0x7e, 0x4f, 0x8d, 0x8a, 0x4b, 0x9a, 0x8d, 0x2e, 0x75, 0xa0, 0xad, 0xd8,
|
||||
0x4b, 0x46, 0xc1, 0xc5, 0x9a, 0x1a, 0x0b, 0x12, 0x09, 0x6a, 0x8c, 0xd2, 0x63, 0xde, 0x32, 0x81,
|
||||
0xc4, 0x42, 0x0f, 0x4d, 0xdd, 0x63, 0x67, 0x3e, 0x9c, 0x00, 0xaa, 0x1c, 0x90, 0x92, 0xd6, 0x64,
|
||||
0x6e, 0x44, 0xdd, 0xea, 0x60, 0xe4, 0xaf, 0x47, 0xd2, 0x23, 0xed, 0xf6, 0xca, 0x94, 0xcf, 0x8a,
|
||||
0xba, 0x4b, 0x8e, 0x9a, 0x8c, 0x87, 0x24, 0xe6, 0x38, 0x67, 0x14, 0x63, 0xf6, 0xcd, 0x36, 0xf1,
|
||||
0x54, 0x37, 0x0b, 0x3c, 0x1e, 0xc9, 0x60, 0x05, 0x59, 0xb9, 0x1f, 0x61, 0x94, 0x4a, 0x91, 0x0d,
|
||||
0xd1, 0xfa, 0x61, 0x74, 0xc3, 0x2a, 0xcc, 0x9c, 0x10, 0x87, 0xfb, 0x46, 0x49, 0x76, 0x41, 0x75,
|
||||
0xa2, 0x48, 0x25, 0x45, 0xaa, 0x6f, 0x36, 0xff, 0x73, 0x3a, 0x37, 0xc8, 0x18, 0x44, 0xb9, 0xf7,
|
||||
0x54, 0x89, 0x86, 0xfa, 0x3f, 0xc1, 0x5f, 0xef, 0x6c, 0x62, 0xe9, 0x0c, 0x1b, 0x45, 0xb1, 0x57,
|
||||
0x51, 0x19, 0xaa, 0x07, 0x75, 0x0a, 0x0b, 0x47, 0xf4, 0xd1, 0x32, 0xe0, 0xda, 0x71, 0xcb, 0xd4,
|
||||
0x0b, 0x75, 0xd3, 0x40, 0xba, 0x92, 0x89, 0x27, 0x8b, 0x70, 0x67, 0xf1, 0x8b, 0x74, 0x4d, 0xea,
|
||||
0x07, 0x6c, 0x05, 0x55, 0xc5, 0x6f, 0x85, 0x75, 0x67, 0x41, 0x94, 0xd7, 0x41, 0x71, 0x03, 0xb9,
|
||||
0x14, 0xe7, 0xdb, 0x16, 0xc3, 0x38, 0xd1, 0xb5, 0x33, 0x8a, 0x3d, 0xb0, 0x90, 0xf1, 0x3b, 0xcf,
|
||||
0x05, 0x93, 0xe1, 0x98, 0x14, 0x23, 0x8d, 0x46, 0x3f, 0x0d, 0xfb, 0x50, 0xbd, 0x0f, 0xfa, 0x85,
|
||||
0x3a, 0xb6, 0x3e, 0x67, 0x97, 0xae, 0x03, 0xf2, 0x17, 0xd4, 0xe4, 0xa5, 0xe1, 0xdc, 0xd8, 0xda,
|
||||
0x94, 0x4c, 0xf2, 0x9d, 0x1c, 0xf7, 0x3f, 0xf5, 0x9b, 0x71, 0xb6, 0x65, 0xc5, 0x62, 0x66, 0x28,
|
||||
0xe0, 0x51, 0x6a, 0x78, 0x66, 0xa1, 0x16, 0xf6, 0x72, 0xe3, 0x35, 0x33, 0x54, 0x67, 0x66, 0xec,
|
||||
0x66, 0x1d, 0x77, 0x5d, 0x54, 0x85, 0xe6, 0xb9, 0xc7, 0x7c, 0x5d, 0x85, 0x4e, 0xb9, 0xaa, 0xca,
|
||||
0x2c, 0x27, 0xcc, 0xc9, 0xcc, 0xaf, 0x7f, 0x15, 0x6c, 0x4c, 0x16, 0xda, 0x85, 0x95, 0x6c, 0xc4,
|
||||
0x56, 0xec, 0xc5, 0x6a, 0xb6, 0x63, 0x19, 0x3b, 0xb2, 0x9c, 0x4d, 0x59, 0xc6, 0xbe, 0x8c, 0x71,
|
||||
0x3b, 0xa8, 0x06, 0xd3, 0x2c, 0x60, 0xf7, 0x38, 0x27, 0x48, 0x87, 0xe5, 0xe6, 0x70, 0x9a, 0xe4,
|
||||
0x7e, 0x04, 0x03, 0xd0, 0x01, 0x13, 0x07, 0xc2, 0x2c, 0x3f, 0x36, 0x54, 0x66, 0xde, 0x48, 0x55,
|
||||
0x2e, 0xc9, 0x8b, 0xb5, 0x78, 0xb2, 0x80, 0x37, 0x4b, 0xd7, 0x2f, 0xc7, 0x86, 0x55, 0xd8, 0xb1,
|
||||
0x1a, 0x5b, 0x56, 0x61, 0xcf, 0xf0, 0x89, 0xe4, 0xc6, 0xc9, 0x3e, 0x5c, 0x64, 0xf1, 0xd9, 0x4c,
|
||||
0x4b, 0xd5, 0xaa, 0xb8, 0xd3, 0x57, 0x47, 0x60, 0x57, 0xf4, 0xc0, 0x48, 0x6e, 0x0c, 0x65, 0xa9,
|
||||
0x2f, 0x4f, 0x88, 0xf3, 0x0b, 0x87, 0xfe, 0x39, 0x97, 0x0a, 0xf0, 0x48, 0xec, 0xb1, 0x44, 0xf7,
|
||||
0x91, 0xc2, 0x8c, 0x35, 0xe4, 0x43, 0xeb, 0xf4, 0x9a, 0xa0, 0x78, 0x29, 0x18, 0xe7, 0xce, 0x4d,
|
||||
0xe9, 0xb9, 0x1a, 0xe1, 0x93, 0x5a, 0xd3, 0x76, 0x55, 0x30, 0x56, 0x9d, 0xc0, 0xcd, 0x4c, 0xe4,
|
||||
0x3a, 0x13, 0xba, 0xde, 0xc4, 0x4e, 0x99, 0xe0, 0x65, 0xab, 0xf2, 0xdd, 0x95, 0x0a, 0x63, 0x18,
|
||||
0xd9, 0x20, 0x0b, 0x99, 0xf1, 0x9b, 0xfd, 0xce, 0x72, 0xbd, 0x4e, 0x25, 0x50, 0x63, 0xc7, 0x74,
|
||||
0x28, 0xc0, 0xba, 0x99, 0x11, 0x86, 0xab, 0x81, 0x98, 0x2d, 0x72, 0x35, 0xde, 0x2d, 0xc3, 0x94,
|
||||
0xc4, 0xde, 0x51, 0x34, 0x50, 0xa9, 0x12, 0xe8, 0x60, 0xc2, 0x58, 0x04, 0x8c, 0xef, 0xb9, 0x15,
|
||||
0x71, 0x4d, 0x94, 0x05, 0x74, 0x5f, 0xba, 0xc6, 0xc8, 0x24, 0x86, 0xd4, 0x3e, 0x84, 0x8c, 0xd4,
|
||||
0xf1, 0x81, 0x55, 0x02, 0xe5, 0x31, 0xec, 0xf2, 0x54, 0x11, 0x91, 0x82, 0x53, 0x05, 0xc0, 0x84,
|
||||
0x3a, 0x16, 0x0f, 0xfd, 0xa8, 0x54, 0x59, 0x04, 0x10, 0x0c, 0xd1, 0xab, 0x6a, 0xb5, 0x99, 0x03,
|
||||
0xad, 0x3e, 0x18, 0x80, 0xbc, 0x80, 0x55, 0x36, 0x72, 0x67, 0xba, 0x87, 0x91, 0x0e, 0xac, 0x5a,
|
||||
0x87, 0x17, 0x6a, 0x09, 0xcf, 0xc5, 0xdc, 0x73, 0x1c, 0xf3, 0x82, 0xb8, 0x15, 0x47, 0x57, 0x2c,
|
||||
0xe5, 0x83, 0x14, 0xdd, 0xd5, 0x51, 0xd6, 0x66, 0xba, 0x6d, 0x98, 0xb8, 0x32, 0xe4, 0x85, 0x40,
|
||||
0x4a, 0x01, 0xed, 0xc2, 0xba, 0xd1, 0x2b, 0xb9, 0x4f, 0xb4, 0x2a, 0x38, 0x52, 0x00, 0x8b, 0x71,
|
||||
0x06, 0xa5, 0x70, 0xcc, 0xd3, 0xb2, 0xab, 0x07, 0xa1, 0x2c, 0x9f, 0x9d, 0x5e, 0x25, 0x20, 0xf7,
|
||||
0x2d, 0xcf, 0xec, 0xfb, 0xb5, 0x34, 0x4d, 0xce, 0x74, 0xaf, 0xac, 0x5d, 0xf2, 0xd8, 0xa6, 0x84,
|
||||
0x52, 0xdc, 0x35, 0x14, 0xf7, 0xd9, 0xbb, 0x91, 0xd2, 0xd9, 0xeb, 0xab, 0xb3, 0x61, 0x3a, 0x36,
|
||||
0xa3, 0xb0, 0x6b, 0xe8, 0xeb, 0x5a, 0xea, 0x7a, 0xb7, 0xba, 0xba, 0x6e, 0x57, 0x37, 0xec, 0xf4,
|
||||
0xc0, 0x16, 0xf8, 0x4f, 0xe4, 0x4c, 0x9e, 0xb2, 0x31, 0xb0, 0x60, 0x9f, 0x86, 0x2d, 0x81, 0x25,
|
||||
0xdc, 0x26, 0xcd, 0x80, 0x25, 0x54, 0x65, 0x03, 0x3c, 0xaa, 0x0d, 0xe0, 0xdc, 0x60, 0xaa, 0xac,
|
||||
0x80, 0x1f, 0xc9, 0x0a, 0xe0, 0x23, 0xae, 0x2c, 0x80, 0xb5, 0xb4, 0x00, 0xf8, 0xd0, 0x34, 0x62,
|
||||
0x03, 0xec, 0xee, 0x0f, 0x1e, 0xcb, 0x0a, 0x78, 0xbd, 0x5f, 0xdd, 0x0c, 0x80, 0xba, 0x7c, 0xd9,
|
||||
0x3e, 0x76, 0xe6, 0xa6, 0x81, 0xae, 0x30, 0x9a, 0xbb, 0x06, 0xdf, 0xfc, 0x14, 0xcd, 0x42, 0x57,
|
||||
0x3a, 0x63, 0xe1, 0x56, 0x1f, 0x32, 0x89, 0x45, 0x18, 0x7a, 0x81, 0xf8, 0x0a, 0xff, 0xda, 0x31,
|
||||
0x59, 0xde, 0x51, 0x1f, 0x1b, 0xab, 0xd1, 0x97, 0xec, 0xd0, 0xb4, 0x4e, 0x8f, 0x40, 0x6e, 0x54,
|
||||
0xab, 0x47, 0xe0, 0x2a, 0xbd, 0xfe, 0x98, 0x7a, 0xfd, 0xdc, 0xb5, 0x94, 0x56, 0xff, 0x81, 0xb4,
|
||||
0xfa, 0xf9, 0xd9, 0x27, 0xa5, 0xd3, 0xd7, 0x51, 0xa7, 0xc3, 0x44, 0x5c, 0x03, 0x8d, 0xbe, 0x3f,
|
||||
0xa8, 0xa5, 0xd3, 0xf7, 0x06, 0x83, 0xea, 0x4a, 0xfd, 0xa0, 0x2a, 0xf2, 0x75, 0xd6, 0xcd, 0x8b,
|
||||
0x61, 0x6d, 0x58, 0x33, 0x2f, 0xe1, 0x36, 0xa9, 0x97, 0x97, 0x50, 0x95, 0x56, 0x7e, 0x4c, 0xad,
|
||||
0x1c, 0x6e, 0x9d, 0x9e, 0x63, 0xcf, 0x75, 0x6c, 0x0f, 0x2b, 0x15, 0xfd, 0x03, 0xa9, 0xe8, 0xe5,
|
||||
0xbe, 0x79, 0x38, 0xfc, 0x4a, 0x63, 0xaf, 0xa3, 0xc6, 0x4e, 0x4e, 0xd2, 0x46, 0xd4, 0xf7, 0x40,
|
||||
0xab, 0xe3, 0x96, 0xdf, 0xab, 0xa3, 0xbc, 0x07, 0xda, 0x2f, 0x95, 0x75, 0xf7, 0x40, 0xdb, 0x7b,
|
||||
0x7a, 0xbb, 0xe6, 0xa9, 0xe3, 0xdb, 0xf4, 0xfe, 0x79, 0x3a, 0x92, 0x46, 0x77, 0xd2, 0xd3, 0x51,
|
||||
0x28, 0x0d, 0xbf, 0x0e, 0x1a, 0xfe, 0xc3, 0xad, 0xeb, 0x28, 0xed, 0xfe, 0x43, 0x6a, 0xf7, 0x53,
|
||||
0x62, 0x63, 0x9d, 0x12, 0x76, 0xa7, 0xd4, 0xfb, 0x3a, 0xab, 0x77, 0x3e, 0x43, 0x37, 0x7b, 0xbf,
|
||||
0xfd, 0x97, 0x1a, 0xe1, 0x71, 0x4f, 0x70, 0x49, 0xbe, 0x3a, 0xb0, 0x2d, 0xe9, 0xf4, 0x08, 0x82,
|
||||
0x36, 0xf4, 0x79, 0x04, 0xbc, 0xd2, 0xe5, 0xd5, 0x4b, 0xd6, 0x56, 0xe5, 0xc7, 0xd1, 0xbb, 0x62,
|
||||
0x1a, 0xd2, 0xe5, 0x8f, 0xaa, 0xca, 0x95, 0x26, 0x97, 0xd2, 0xe4, 0x62, 0xdc, 0x91, 0x8a, 0x72,
|
||||
0x6f, 0x51, 0x3a, 0x1c, 0xf1, 0x03, 0x4d, 0xca, 0xcf, 0xcd, 0x82, 0x39, 0x2a, 0xa0, 0x5e, 0x95,
|
||||
0x9c, 0xa8, 0x8b, 0xb1, 0xf2, 0xcf, 0x58, 0xa9, 0xca, 0xef, 0x0d, 0xcd, 0xf9, 0xc7, 0x17, 0x9d,
|
||||
0xb5, 0x8f, 0x59, 0xca, 0xfa, 0xb0, 0x55, 0x61, 0x79, 0xd6, 0xef, 0x23, 0x71, 0x1a, 0x41, 0x7e,
|
||||
0x36, 0xac, 0x4a, 0x7a, 0xad, 0x28, 0xb4, 0x55, 0xd2, 0xab, 0x4a, 0x7a, 0x6d, 0xd9, 0x2b, 0xa0,
|
||||
0x92, 0x5e, 0x9b, 0x52, 0x0d, 0x9b, 0x91, 0xf4, 0xca, 0xb8, 0xb8, 0x56, 0x39, 0xaf, 0x2a, 0xe7,
|
||||
0xf5, 0xa9, 0x7a, 0xf7, 0xd4, 0x6a, 0x60, 0xfd, 0x1c, 0x7b, 0x11, 0xa1, 0xb3, 0xe9, 0x29, 0xaf,
|
||||
0x3b, 0x03, 0x95, 0xf3, 0x9a, 0xe1, 0xe5, 0x5b, 0x19, 0xe5, 0xc6, 0xdc, 0x7b, 0xab, 0x90, 0x9b,
|
||||
0xf1, 0xeb, 0xad, 0xc2, 0x55, 0x0e, 0xbd, 0x47, 0x34, 0x4b, 0x54, 0xbe, 0xab, 0xca, 0x77, 0x55,
|
||||
0xfa, 0x7a, 0x5d, 0xf4, 0xf5, 0xe6, 0xa7, 0xbb, 0xee, 0x57, 0xd6, 0xd4, 0xad, 0x2a, 0x86, 0x27,
|
||||
0x9e, 0xed, 0x1a, 0x67, 0x9e, 0x66, 0x6d, 0x80, 0xa6, 0x73, 0x5d, 0x13, 0x40, 0x95, 0xf6, 0x7f,
|
||||
0x4c, 0xed, 0xaf, 0x32, 0x5d, 0x55, 0xa6, 0xab, 0xd2, 0xfd, 0xeb, 0xa1, 0xfb, 0x9f, 0x42, 0xa2,
|
||||
0xeb, 0xee, 0xfe, 0x40, 0x65, 0xba, 0x36, 0xa3, 0xcd, 0x5b, 0x48, 0x74, 0x5d, 0x01, 0xdc, 0xa4,
|
||||
0x46, 0x57, 0x69, 0xae, 0xeb, 0xa1, 0xd3, 0x55, 0x96, 0xab, 0xca, 0x72, 0x55, 0xfa, 0xfc, 0xf1,
|
||||
0xf5, 0xf9, 0x93, 0x48, 0x72, 0xdd, 0x57, 0x49, 0xae, 0x71, 0xb5, 0xdc, 0x7c, 0x8e, 0x6b, 0x02,
|
||||
0x6c, 0x83, 0x2a, 0x59, 0x65, 0xb8, 0xae, 0x85, 0x42, 0x56, 0x09, 0xae, 0x3f, 0xb0, 0x76, 0x56,
|
||||
0x09, 0xae, 0x1b, 0xa1, 0xac, 0x9f, 0x5e, 0x7e, 0xeb, 0x2b, 0x95, 0xdf, 0x1a, 0xd9, 0x21, 0x6f,
|
||||
0x37, 0xbd, 0x35, 0x0f, 0x47, 0x93, 0xbb, 0xe6, 0x2a, 0xb9, 0x75, 0x6d, 0x95, 0xbb, 0xca, 0x6d,
|
||||
0x55, 0xb9, 0xad, 0x4a, 0xb3, 0xaf, 0xb1, 0x66, 0x57, 0xa9, 0xad, 0x4f, 0x53, 0xa5, 0xb7, 0x90,
|
||||
0xd9, 0x9a, 0x05, 0xbf, 0x05, 0x55, 0xae, 0xf2, 0x5a, 0x1b, 0x29, 0x59, 0x57, 0x8b, 0xab, 0xb4,
|
||||
0x56, 0x95, 0xd6, 0xaa, 0x02, 0xd9, 0x5b, 0x11, 0x0e, 0x0d, 0xa4, 0xb5, 0xae, 0x4e, 0x51, 0x95,
|
||||
0xd5, 0x9a, 0x5f, 0x52, 0xb6, 0x60, 0x63, 0xd9, 0xaf, 0xf9, 0x26, 0xc1, 0x7d, 0xc5, 0x3c, 0xd7,
|
||||
0xc5, 0x25, 0xd2, 0x1b, 0x9a, 0xeb, 0xaa, 0xd2, 0x59, 0xe3, 0x03, 0xaa, 0xd2, 0x59, 0x9b, 0x65,
|
||||
0xbb, 0xba, 0xec, 0xd7, 0x8c, 0x23, 0x40, 0xa5, 0xb3, 0x36, 0xa5, 0x13, 0x36, 0x24, 0x9d, 0x55,
|
||||
0x65, 0xb2, 0xaa, 0x4c, 0xd6, 0x27, 0xea, 0xcb, 0x53, 0x0b, 0x80, 0x35, 0x74, 0xe3, 0x3d, 0x8d,
|
||||
0x24, 0xd6, 0x03, 0x95, 0xc4, 0x9a, 0xe5, 0xcf, 0x6b, 0x25, 0x7f, 0xb5, 0x85, 0xd4, 0x55, 0x95,
|
||||
0xb5, 0xfa, 0xf8, 0xd6, 0x87, 0xab, 0x12, 0x56, 0x55, 0xc2, 0xaa, 0x52, 0xcb, 0x8f, 0xaf, 0x96,
|
||||
0xdd, 0x4d, 0xcf, 0x55, 0xdd, 0xab, 0x91, 0xab, 0xaa, 0xd2, 0x54, 0xab, 0x28, 0x7a, 0xb7, 0xf1,
|
||||
0x0c, 0x55, 0xb7, 0xe1, 0xe4, 0x54, 0x57, 0xe5, 0xa5, 0x3e, 0xb6, 0x7e, 0x57, 0x29, 0xa9, 0x2a,
|
||||
0x25, 0x55, 0x69, 0xf7, 0x47, 0xd7, 0xee, 0x4f, 0xe4, 0xda, 0x55, 0x95, 0x8d, 0x5a, 0x5b, 0x69,
|
||||
0xb7, 0x90, 0x88, 0xea, 0x36, 0x9e, 0x83, 0xea, 0xaa, 0xf4, 0xd3, 0x47, 0x57, 0xdd, 0x54, 0x65,
|
||||
0x9e, 0xaa, 0xcc, 0x53, 0xa5, 0xb6, 0x1f, 0x53, 0x6d, 0xd3, 0xa7, 0x90, 0x74, 0x7a, 0xb0, 0xaf,
|
||||
0x92, 0x4e, 0x43, 0xed, 0x4b, 0x1b, 0xcf, 0x37, 0xa5, 0x0d, 0xa7, 0x9a, 0x52, 0x95, 0x65, 0xfa,
|
||||
0xc8, 0x7a, 0x97, 0xa9, 0x04, 0x53, 0xa4, 0xf6, 0xae, 0x55, 0x82, 0xe9, 0x9a, 0xea, 0x64, 0xf6,
|
||||
0xe4, 0x72, 0x4b, 0xf7, 0x54, 0x6e, 0xa9, 0xbf, 0x71, 0xdd, 0x72, 0x5a, 0x69, 0xab, 0x19, 0xa5,
|
||||
0x2a, 0x99, 0x74, 0x1d, 0x75, 0xb8, 0xca, 0x23, 0x55, 0x79, 0xa4, 0x4a, 0x81, 0xaf, 0xa7, 0x02,
|
||||
0x57, 0x29, 0xa4, 0x4f, 0x4e, 0x73, 0xb7, 0x91, 0x3d, 0xda, 0x5a, 0xe2, 0xa8, 0xca, 0x19, 0x6d,
|
||||
0xb2, 0x64, 0x0d, 0x65, 0x3d, 0x51, 0xe9, 0xa2, 0x2a, 0x5d, 0x54, 0x45, 0x8b, 0xb7, 0x21, 0x17,
|
||||
0x1a, 0x48, 0x17, 0x9d, 0xa8, 0x4c, 0xd1, 0x35, 0xce, 0x14, 0xad, 0xf6, 0x35, 0xfd, 0x4b, 0xfa,
|
||||
0x5b, 0x19, 0xe9, 0x28, 0x42, 0x1c, 0xa8, 0x03, 0xc3, 0x82, 0x3d, 0x28, 0xbf, 0x55, 0x47, 0xd0,
|
||||
0xc9, 0x09, 0x34, 0x99, 0xdc, 0xb5, 0xc3, 0x39, 0x63, 0x8e, 0x5d, 0xc0, 0xfa, 0xe1, 0xe6, 0x1b,
|
||||
0xd6, 0x8d, 0x6f, 0xf6, 0x08, 0x33, 0x06, 0x50, 0x0b, 0xa4, 0x50, 0xc0, 0x84, 0x63, 0x91, 0x9a,
|
||||
0x38, 0x72, 0x75, 0x7b, 0x88, 0x76, 0x65, 0x2a, 0x80, 0xdd, 0x32, 0xc1, 0x94, 0x62, 0x23, 0x60,
|
||||
0xdd, 0xdd, 0x02, 0x11, 0x90, 0xac, 0x16, 0x26, 0xb1, 0xfd, 0x2c, 0x55, 0xad, 0xcc, 0x1c, 0x71,
|
||||
0xec, 0x23, 0x93, 0xf8, 0x73, 0xb3, 0x58, 0x50, 0xb0, 0xb9, 0x8d, 0xbf, 0xc2, 0xc2, 0x0a, 0x87,
|
||||
0xd4, 0xf2, 0xe9, 0xac, 0x61, 0x5b, 0x87, 0x71, 0x33, 0xd0, 0x1b, 0xb9, 0x39, 0x79, 0x45, 0xbe,
|
||||
0xcb, 0x80, 0x29, 0x84, 0x63, 0x1d, 0x39, 0x96, 0x05, 0xc6, 0xa6, 0xa7, 0x4d, 0x31, 0xfb, 0x34,
|
||||
0x1e, 0x3b, 0xf6, 0xa4, 0xdb, 0x2b, 0x57, 0xeb, 0x9d, 0xeb, 0x1e, 0xf9, 0xd5, 0x0a, 0xeb, 0xf5,
|
||||
0xfb, 0xbe, 0x18, 0x13, 0x37, 0xed, 0xea, 0xc8, 0xd2, 0xd9, 0x78, 0x86, 0x88, 0xed, 0x07, 0x4c,
|
||||
0x80, 0x35, 0x60, 0x04, 0xa1, 0xa6, 0x61, 0x30, 0x0b, 0x73, 0x90, 0x87, 0x4d, 0x3c, 0x86, 0x9f,
|
||||
0x66, 0x38, 0x9c, 0x23, 0xc5, 0x69, 0xc6, 0x3a, 0x45, 0x73, 0x0f, 0x9f, 0x58, 0x2e, 0xa6, 0x44,
|
||||
0x37, 0x81, 0x16, 0x5f, 0xb0, 0x37, 0x3e, 0x99, 0x68, 0x91, 0x97, 0x9f, 0x6d, 0xc2, 0x3c, 0x89,
|
||||
0x9e, 0x72, 0x58, 0xc4, 0x72, 0x8f, 0x75, 0x68, 0xc3, 0x9b, 0x18, 0xd4, 0xb7, 0x68, 0xef, 0x17,
|
||||
0x6d, 0xef, 0xf5, 0x60, 0x07, 0x09, 0x75, 0x34, 0xd0, 0x06, 0x5b, 0x52, 0xd0, 0xfc, 0xbe, 0xbe,
|
||||
0x41, 0xd6, 0xa7, 0x31, 0x27, 0x1b, 0xa7, 0xe0, 0x99, 0x4e, 0x75, 0xeb, 0xbd, 0x33, 0x87, 0x91,
|
||||
0xeb, 0x76, 0xcc, 0xcb, 0x1b, 0x9d, 0xb1, 0x4b, 0x4b, 0xbf, 0xed, 0xc8, 0x35, 0xcf, 0x8f, 0xff,
|
||||
0xcd, 0x85, 0x18, 0xd0, 0xd3, 0x07, 0x5a, 0x46, 0x90, 0x72, 0xf8, 0xd4, 0xb5, 0x72, 0x81, 0x03,
|
||||
0xd0, 0x4b, 0x0c, 0x85, 0x00, 0x72, 0x1f, 0xbd, 0xd2, 0x78, 0x9c, 0x52, 0xf7, 0x15, 0x74, 0xd3,
|
||||
0x84, 0x11, 0xd3, 0x09, 0xf5, 0xe4, 0x7a, 0xe1, 0xea, 0x1e, 0xc7, 0x12, 0x30, 0xd3, 0x0a, 0x1a,
|
||||
0xdd, 0x75, 0x2f, 0xa1, 0xc8, 0x25, 0x67, 0x50, 0x2d, 0xec, 0x8e, 0x37, 0xd6, 0x4d, 0xe0, 0x7d,
|
||||
0x40, 0xfc, 0x53, 0x40, 0x05, 0x39, 0x82, 0x25, 0xbc, 0x8d, 0x45, 0x78, 0x75, 0x63, 0xec, 0xe3,
|
||||
0x85, 0xf7, 0xee, 0x25, 0x23, 0x16, 0xbe, 0x74, 0x1d, 0x4f, 0x76, 0x74, 0x22, 0x0b, 0x25, 0x40,
|
||||
0xb4, 0xc3, 0x19, 0x05, 0xbd, 0x44, 0x5d, 0x39, 0x8c, 0x61, 0xed, 0x4b, 0x7c, 0xeb, 0x76, 0x7a,
|
||||
0xbc, 0x9f, 0x2f, 0x77, 0x39, 0xa7, 0xc9, 0x60, 0xe6, 0x61, 0x61, 0x47, 0x40, 0xa9, 0xdc, 0xc1,
|
||||
0x23, 0x76, 0x9c, 0x39, 0xe4, 0x21, 0x63, 0xd3, 0xf4, 0x52, 0x40, 0x9f, 0xd8, 0xac, 0xdb, 0xf1,
|
||||
0xc8, 0x25, 0x2f, 0x83, 0xe9, 0xdd, 0xe5, 0x98, 0x97, 0x8b, 0x31, 0x5d, 0x35, 0x95, 0x1e, 0xe2,
|
||||
0xfd, 0xfd, 0x1a, 0xd3, 0x20, 0xae, 0xad, 0x90, 0x2b, 0xaf, 0x89, 0x5d, 0xa2, 0x47, 0x9f, 0x6d,
|
||||
0x63, 0x01, 0x7a, 0xc4, 0x74, 0xca, 0x72, 0xe1, 0x2f, 0xfa, 0x37, 0x07, 0x3e, 0xe4, 0xa5, 0x2b,
|
||||
0x62, 0xfa, 0x60, 0x1b, 0xd2, 0x78, 0xb0, 0x6d, 0x48, 0x62, 0xb9, 0x99, 0x61, 0x6c, 0xbe, 0x27,
|
||||
0xba, 0x85, 0x59, 0xae, 0xb0, 0x81, 0x81, 0x12, 0x45, 0x2f, 0x8d, 0xa0, 0xac, 0x98, 0x4b, 0x81,
|
||||
0xc0, 0x2b, 0x96, 0x67, 0x64, 0x82, 0xba, 0xdd, 0x40, 0xa0, 0xbd, 0x41, 0x1e, 0xa3, 0x18, 0xe0,
|
||||
0x27, 0x83, 0xdf, 0x7a, 0xe8, 0xf9, 0x73, 0xd4, 0x0d, 0xa5, 0x54, 0x58, 0x6c, 0xf5, 0x72, 0x2d,
|
||||
0x60, 0x6f, 0x39, 0x3b, 0x3b, 0xb4, 0x95, 0x0e, 0x75, 0xaa, 0x79, 0x58, 0xf0, 0x38, 0xf0, 0xef,
|
||||
0x09, 0x10, 0xf5, 0xb6, 0x3b, 0xe8, 0xc9, 0x79, 0x73, 0xb2, 0x1a, 0xc1, 0x15, 0xa7, 0x9c, 0x24,
|
||||
0x59, 0x42, 0x59, 0xe9, 0x31, 0x00, 0xf1, 0x89, 0x52, 0xf3, 0x29, 0xd1, 0x86, 0xc4, 0xf1, 0xda,
|
||||
0xd0, 0x02, 0x90, 0xc8, 0x65, 0xfa, 0x10, 0xcf, 0x35, 0xe0, 0x3d, 0xd0, 0xbd, 0x32, 0x94, 0xcc,
|
||||
0xd9, 0xc1, 0xe1, 0x34, 0x4d, 0x7c, 0xae, 0x00, 0x39, 0xe9, 0x69, 0x8a, 0x40, 0xe5, 0x9f, 0x6a,
|
||||
0x5a, 0xfb, 0xab, 0xdc, 0x9c, 0x7e, 0x91, 0x48, 0x92, 0x99, 0x33, 0x2e, 0x8a, 0x6b, 0x84, 0x97,
|
||||
0x77, 0x24, 0x79, 0x39, 0xa3, 0x0d, 0xe5, 0x58, 0x39, 0xbd, 0xbb, 0x0f, 0xca, 0xc9, 0x69, 0xe7,
|
||||
0xc4, 0x97, 0x60, 0xe4, 0xb4, 0xbb, 0xdc, 0x4a, 0xf0, 0x71, 0xe1, 0xa9, 0xb6, 0x55, 0xd9, 0x38,
|
||||
0xf7, 0x8c, 0xbd, 0xb6, 0xb9, 0xd8, 0x2d, 0x64, 0xe0, 0x76, 0x78, 0x77, 0x57, 0xce, 0x77, 0xcb,
|
||||
0x6a, 0x72, 0xad, 0xdb, 0x12, 0xc3, 0x4a, 0x21, 0xa7, 0x95, 0x59, 0xd5, 0xad, 0xce, 0xa5, 0x6d,
|
||||
0x30, 0x68, 0x53, 0xbc, 0x29, 0x43, 0xb8, 0xd0, 0x2a, 0x3d, 0x74, 0x6e, 0x35, 0x8a, 0x75, 0xf3,
|
||||
0x4b, 0x80, 0xa9, 0x41, 0x13, 0x75, 0x61, 0x9e, 0x16, 0xe1, 0xc8, 0xb0, 0x55, 0xa5, 0x10, 0x44,
|
||||
0xec, 0x50, 0xf9, 0xae, 0xc8, 0x1b, 0xa5, 0xa9, 0x06, 0xa9, 0x3c, 0xa2, 0x2a, 0xd6, 0x69, 0x8a,
|
||||
0x65, 0x5a, 0x0d, 0xa1, 0x9c, 0x99, 0x1a, 0x33, 0x51, 0x65, 0x11, 0xe5, 0xdb, 0xab, 0x4d, 0xba,
|
||||
0xf3, 0xa4, 0x5d, 0x60, 0x62, 0x53, 0x36, 0xdd, 0xa9, 0x53, 0x59, 0xc2, 0x04, 0x6e, 0x35, 0x01,
|
||||
0x52, 0xd6, 0xaf, 0x16, 0x78, 0x7e, 0x64, 0xfc, 0xc3, 0x3f, 0xb8, 0x0b, 0x6e, 0x7d, 0xfd, 0x43,
|
||||
0x64, 0xd2, 0x8d, 0x2a, 0xd5, 0x71, 0x44, 0xa3, 0x72, 0x5d, 0x3d, 0x90, 0xd5, 0xcc, 0xe1, 0xf4,
|
||||
0xf1, 0xd3, 0xc4, 0x72, 0x9c, 0x41, 0xdb, 0xd9, 0xab, 0xb1, 0xfa, 0x88, 0x16, 0x7e, 0xac, 0xed,
|
||||
0xcc, 0xa5, 0x61, 0x7d, 0x24, 0x0b, 0xef, 0xd3, 0x76, 0xc6, 0x4a, 0xe8, 0x27, 0xee, 0x93, 0x92,
|
||||
0x44, 0x14, 0xfa, 0x64, 0x52, 0x30, 0xe5, 0x3a, 0xa0, 0xb6, 0x33, 0x56, 0x51, 0xfd, 0xba, 0xe4,
|
||||
0x2d, 0x68, 0x50, 0x86, 0x67, 0x6a, 0x5b, 0x62, 0x51, 0xd6, 0x43, 0x0d, 0x3d, 0xcd, 0x76, 0x24,
|
||||
0xe6, 0xf0, 0xda, 0x46, 0xdd, 0xd0, 0x5f, 0x96, 0xbf, 0x16, 0xe4, 0x9e, 0x47, 0xe1, 0x18, 0x93,
|
||||
0x23, 0x6b, 0x6c, 0x53, 0x0e, 0x85, 0x1e, 0x89, 0xd4, 0x43, 0x5d, 0xb5, 0x60, 0xdb, 0xad, 0x11,
|
||||
0xc3, 0x3c, 0x77, 0x72, 0xef, 0xb4, 0x30, 0xb9, 0xb3, 0x56, 0xa7, 0x8d, 0xce, 0xed, 0x8c, 0x85,
|
||||
0x72, 0xa3, 0x53, 0x3b, 0x75, 0x69, 0xf8, 0x30, 0x33, 0x3b, 0x75, 0x59, 0xd9, 0xaf, 0x49, 0xda,
|
||||
0xaa, 0xf3, 0xba, 0x70, 0x91, 0xba, 0x61, 0xd3, 0x3a, 0x77, 0x6d, 0x5c, 0x73, 0x56, 0x67, 0x9f,
|
||||
0xd4, 0xfc, 0x70, 0x93, 0x7a, 0xb7, 0x8d, 0x49, 0xdd, 0xf2, 0x7c, 0x76, 0xdb, 0x9d, 0xca, 0xf4,
|
||||
0x51, 0x66, 0xb1, 0xbb, 0x3a, 0x81, 0x1f, 0x7c, 0xee, 0x3e, 0xa1, 0x69, 0xdb, 0xce, 0x8c, 0x9d,
|
||||
0xb4, 0x3c, 0x59, 0x73, 0x59, 0x34, 0xe1, 0x66, 0xd8, 0x4e, 0xf7, 0x54, 0xf4, 0xaa, 0x20, 0x49,
|
||||
0xf7, 0x33, 0x6c, 0x67, 0x38, 0x2a, 0x7a, 0xf5, 0x06, 0xb8, 0x70, 0x1e, 0x72, 0x07, 0xc4, 0x76,
|
||||
0x9e, 0x0b, 0xa3, 0x57, 0x0f, 0xc7, 0xaa, 0xef, 0x61, 0xbb, 0xd8, 0x9b, 0xd1, 0x20, 0x4e, 0xee,
|
||||
0x7e, 0xd8, 0x2e, 0x72, 0x66, 0xd4, 0xc2, 0xb7, 0xea, 0x85, 0xd8, 0xce, 0xf1, 0x66, 0xf4, 0xc3,
|
||||
0x05, 0x62, 0x31, 0x4e, 0x0f, 0x78, 0xdd, 0x98, 0x03, 0xef, 0x03, 0x62, 0xb1, 0xf8, 0x97, 0x0d,
|
||||
0x07, 0xa9, 0x1f, 0xac, 0x14, 0x7f, 0x93, 0xc8, 0x33, 0xc9, 0x38, 0xd9, 0xfe, 0x4a, 0x1f, 0x7f,
|
||||
0x9f, 0x52, 0x67, 0x6e, 0xc3, 0xb2, 0xfb, 0x1c, 0x8f, 0x99, 0x6e, 0x4f, 0xcd, 0xac, 0x13, 0xf0,
|
||||
0x1d, 0x1e, 0x72, 0xc4, 0xee, 0x78, 0xd6, 0xd5, 0x20, 0x05, 0xf9, 0xca, 0x2b, 0x89, 0xa3, 0xcb,
|
||||
0xa5, 0x4f, 0x3d, 0xce, 0x38, 0xd7, 0x18, 0xf5, 0xfb, 0x26, 0xd6, 0xaf, 0xb1, 0x08, 0x87, 0xc2,
|
||||
0x22, 0x26, 0x05, 0xf8, 0x95, 0xcd, 0xbd, 0x2b, 0x9d, 0xbe, 0xcd, 0x05, 0x54, 0x9c, 0x5c, 0x22,
|
||||
0x75, 0x20, 0x7d, 0xc9, 0x43, 0xe8, 0x25, 0x0e, 0x9e, 0xaf, 0x70, 0xd8, 0x7c, 0xd9, 0x73, 0xbe,
|
||||
0xfb, 0xfd, 0x2b, 0x3e, 0xe2, 0xde, 0x21, 0x9e, 0xe9, 0xd7, 0x84, 0x07, 0x8e, 0x8e, 0x60, 0x00,
|
||||
0xde, 0xc1, 0x74, 0xe6, 0x6f, 0x33, 0xab, 0x7d, 0xa4, 0xc4, 0x90, 0x8a, 0x13, 0xe6, 0xfe, 0xb4,
|
||||
0x29, 0x14, 0xce, 0xf7, 0x48, 0x95, 0x8e, 0x1c, 0xf6, 0x9d, 0x5d, 0x9e, 0x3f, 0xec, 0xc4, 0xfb,
|
||||
0x75, 0x11, 0xb0, 0x8a, 0xde, 0x22, 0xe1, 0xa2, 0x91, 0xa8, 0x3d, 0x92, 0x8b, 0xf7, 0xa5, 0xce,
|
||||
0xcd, 0xa2, 0xe4, 0x4e, 0x81, 0xd7, 0xa7, 0x44, 0xe0, 0x37, 0x27, 0x0c, 0x17, 0x6b, 0x23, 0x11,
|
||||
0x11, 0xe5, 0x48, 0x9d, 0x4b, 0x16, 0x3b, 0xe6, 0xfc, 0xd0, 0x17, 0x92, 0xe8, 0x8c, 0x62, 0x0f,
|
||||
0x33, 0x19, 0x47, 0x77, 0xc5, 0x80, 0xd1, 0x14, 0xff, 0xe2, 0x4e, 0xb1, 0xf3, 0xab, 0x6c, 0x20,
|
||||
0x79, 0xe5, 0xe0, 0xf1, 0x45, 0xf4, 0xe3, 0x9e, 0xdc, 0xfe, 0xaa, 0x94, 0x1b, 0x38, 0x39, 0x52,
|
||||
0x37, 0x8e, 0x39, 0xf1, 0x2b, 0x4a, 0x57, 0x0b, 0xbd, 0xbe, 0x50, 0xf3, 0x9b, 0xbd, 0xbf, 0xfb,
|
||||
0x45, 0x3e, 0x14, 0xbb, 0xb4, 0x43, 0xb7, 0x01, 0xe7, 0xae, 0x8c, 0xa3, 0xf7, 0x75, 0x69, 0x10,
|
||||
0x95, 0x53, 0x73, 0x4a, 0x79, 0x80, 0x65, 0x36, 0xa4, 0x5e, 0xcb, 0xc4, 0x59, 0x49, 0x6d, 0x3b,
|
||||
0xed, 0xbc, 0x2a, 0x0d, 0x27, 0x67, 0x77, 0xe9, 0xa0, 0x4a, 0xbb, 0x0a, 0xb7, 0x92, 0x5e, 0xbd,
|
||||
0xd2, 0x76, 0x6b, 0x41, 0x4d, 0xd9, 0x2d, 0x7a, 0x55, 0x36, 0xc1, 0xba, 0xdf, 0xaf, 0x16, 0x8e,
|
||||
0x9a, 0x03, 0x63, 0x19, 0x9c, 0x2a, 0x0b, 0xe0, 0x5e, 0x32, 0xba, 0xbc, 0x1d, 0xd1, 0x11, 0xc8,
|
||||
0x80, 0xf7, 0x84, 0x62, 0xa4, 0x04, 0x41, 0x85, 0x24, 0x85, 0xc6, 0xe5, 0xc0, 0xce, 0x60, 0xbf,
|
||||
0x39, 0x41, 0xd0, 0xf8, 0x52, 0x5e, 0x09, 0x8d, 0x8d, 0x12, 0x1a, 0x6d, 0xca, 0x0c, 0xe1, 0x82,
|
||||
0x0f, 0x84, 0xc6, 0x6b, 0x25, 0x34, 0x1e, 0x55, 0x68, 0x1c, 0x34, 0x66, 0x3c, 0xec, 0x0e, 0x9a,
|
||||
0x97, 0x06, 0x3f, 0x1f, 0xb4, 0x21, 0x0d, 0x0e, 0xf6, 0x4a, 0x1e, 0x03, 0x23, 0x21, 0x0d, 0xf6,
|
||||
0x5f, 0x6b, 0x07, 0x3f, 0xae, 0x34, 0x28, 0x4a, 0x50, 0x6b, 0x7a, 0x65, 0x19, 0x44, 0xf0, 0xc9,
|
||||
0x2c, 0x2c, 0xfb, 0xfd, 0xd4, 0xb5, 0xa5, 0x5a, 0x53, 0x0e, 0xe4, 0x0c, 0xc3, 0x92, 0xf9, 0xbf,
|
||||
0x81, 0x88, 0x0f, 0x06, 0xe8, 0x9b, 0xfd, 0x49, 0xbf, 0x95, 0x97, 0xef, 0x15, 0xf3, 0x7b, 0x1b,
|
||||
0xce, 0xe9, 0xad, 0x95, 0xc7, 0x2b, 0x69, 0x6e, 0xfb, 0x0e, 0xda, 0x91, 0x4b, 0xec, 0x72, 0x59,
|
||||
0xbb, 0xd1, 0x09, 0x50, 0x26, 0x85, 0xbe, 0xa6, 0xda, 0x31, 0xf0, 0x98, 0x58, 0xba, 0xe9, 0x95,
|
||||
0xd1, 0xb7, 0x0b, 0xe9, 0x38, 0x2c, 0x69, 0x99, 0xf2, 0x8a, 0xc7, 0xfe, 0xa9, 0x1d, 0x25, 0x6b,
|
||||
0x5d, 0x38, 0x65, 0x71, 0x71, 0x55, 0x4e, 0x6e, 0x81, 0xe5, 0x4e, 0xe0, 0x7f, 0xf9, 0x1b, 0x15,
|
||||
0xe7, 0x13, 0xbf, 0x16, 0x7a, 0xd7, 0x79, 0xe4, 0x14, 0xdf, 0x8a, 0x02, 0xf4, 0x67, 0x19, 0xe6,
|
||||
0x69, 0x52, 0x00, 0xae, 0xa3, 0xfc, 0x6b, 0x51, 0xfc, 0x89, 0x7d, 0xb3, 0x1f, 0x4b, 0xee, 0x3d,
|
||||
0x88, 0xd8, 0x0b, 0x0c, 0xcf, 0x87, 0x97, 0x7b, 0x83, 0x4a, 0x72, 0xef, 0x55, 0x25, 0xb1, 0xb7,
|
||||
0xb3, 0x57, 0x41, 0xee, 0xed, 0x96, 0x11, 0x96, 0x0b, 0x01, 0xe6, 0x6d, 0xa8, 0xfc, 0x52, 0xe2,
|
||||
0xab, 0x55, 0xf3, 0x2d, 0xb2, 0x24, 0x53, 0xd6, 0x5b, 0xf3, 0x62, 0x2c, 0xbe, 0xe2, 0xdd, 0x10,
|
||||
0x23, 0xee, 0x60, 0xf0, 0x60, 0x36, 0x5c, 0xa9, 0x65, 0xff, 0xc2, 0x84, 0xfb, 0x52, 0xcd, 0x84,
|
||||
0xfb, 0xb2, 0xa1, 0x22, 0x70, 0x57, 0xc9, 0xc0, 0x56, 0x65, 0x60, 0xd4, 0xe1, 0xf3, 0xcd, 0x3e,
|
||||
0x9a, 0x33, 0x67, 0x32, 0x41, 0xc2, 0x9f, 0xa4, 0x44, 0x62, 0xf3, 0x22, 0x31, 0xcd, 0x69, 0xb7,
|
||||
0x21, 0x82, 0xb1, 0xd4, 0xe6, 0x82, 0x12, 0x8c, 0xad, 0x0b, 0xc6, 0x3d, 0x25, 0x18, 0x1f, 0x5e,
|
||||
0x30, 0x7e, 0xb0, 0x0d, 0x25, 0x16, 0xdb, 0x15, 0x8b, 0xfe, 0xae, 0xc3, 0xa6, 0x08, 0xc5, 0x32,
|
||||
0xbb, 0xa3, 0x4a, 0x28, 0x96, 0x64, 0xaf, 0x0a, 0x52, 0xf1, 0x55, 0xe9, 0x28, 0xbc, 0x91, 0x8b,
|
||||
0xb1, 0xe1, 0x3c, 0xf0, 0x46, 0xc9, 0x0f, 0x26, 0x4b, 0xbf, 0xf2, 0x68, 0xec, 0x6f, 0x76, 0x18,
|
||||
0x8f, 0xad, 0x44, 0x68, 0xb3, 0x22, 0x34, 0x19, 0xec, 0xfe, 0xf0, 0xc2, 0x33, 0x2b, 0x61, 0xbb,
|
||||
0xe2, 0xa9, 0xd3, 0x3d, 0xf4, 0x16, 0xed, 0xa2, 0x8a, 0xee, 0xc8, 0x86, 0xdb, 0xe2, 0x37, 0x06,
|
||||
0x84, 0x2f, 0xb4, 0xe7, 0xe0, 0x01, 0xbd, 0x03, 0x3b, 0xfb, 0x83, 0x41, 0x15, 0x89, 0xff, 0x7f,
|
||||
0xff, 0xfb, 0x3f, 0x55, 0x64, 0x7e, 0xa3, 0x54, 0xe3, 0x24, 0xeb, 0x10, 0x90, 0x49, 0x1d, 0x20,
|
||||
0x5a, 0xc7, 0xb2, 0xd6, 0xc1, 0xc4, 0x6e, 0x5a, 0xd3, 0xec, 0x97, 0xd6, 0x34, 0x9f, 0x88, 0x37,
|
||||
0x56, 0x7a, 0xa6, 0x4d, 0x3d, 0xf3, 0x1e, 0x4f, 0xf4, 0xb9, 0xc9, 0xbe, 0xd9, 0x7e, 0xec, 0xd5,
|
||||
0x29, 0xbe, 0xc6, 0xa6, 0x52, 0x36, 0xcd, 0xdb, 0xeb, 0x7c, 0x5f, 0x7e, 0x7f, 0x83, 0x36, 0xa8,
|
||||
0x1e, 0x4c, 0x68, 0xff, 0xa2, 0x0d, 0x36, 0xd3, 0x9b, 0x70, 0x50, 0x42, 0x9a, 0x75, 0xde, 0xeb,
|
||||
0x4c, 0x47, 0xa7, 0xce, 0x74, 0xca, 0x73, 0x79, 0x7f, 0xf4, 0x00, 0xa3, 0xfd, 0x76, 0x23, 0xcf,
|
||||
0x8f, 0x66, 0x8e, 0xe3, 0x61, 0x4e, 0x6d, 0x6e, 0x3f, 0x53, 0x91, 0x69, 0x74, 0xa7, 0x69, 0x5a,
|
||||
0xa7, 0x89, 0x70, 0xce, 0xba, 0x51, 0xa5, 0x3b, 0xbb, 0x83, 0xf6, 0x63, 0x3a, 0xf9, 0x01, 0x7a,
|
||||
0x9f, 0x19, 0x31, 0x09, 0xbb, 0xd3, 0x28, 0xfe, 0x73, 0x8e, 0x3d, 0x76, 0x4c, 0x4c, 0x7c, 0x86,
|
||||
0xa9, 0x45, 0x3c, 0x8f, 0x38, 0x76, 0xf5, 0xbb, 0x4d, 0xa4, 0x8f, 0xd6, 0x8b, 0x3e, 0xa6, 0x33,
|
||||
0x15, 0xf8, 0x79, 0x67, 0x68, 0xd9, 0x73, 0xc2, 0xf3, 0x81, 0x05, 0xa7, 0xc5, 0x57, 0x01, 0x76,
|
||||
0x8f, 0xb0, 0xe9, 0xe1, 0x0a, 0xdd, 0x09, 0x0c, 0x3f, 0x6c, 0x11, 0xf6, 0x09, 0x7b, 0x9e, 0x3e,
|
||||
0xc5, 0xb0, 0x92, 0x80, 0x66, 0xd5, 0xbb, 0x31, 0xa6, 0xc3, 0x7b, 0x85, 0x96, 0x63, 0xe4, 0x75,
|
||||
0xb6, 0xeb, 0xc1, 0xfb, 0x2c, 0xe8, 0xcc, 0x4f, 0x20, 0x0f, 0x78, 0x00, 0xf1, 0x43, 0x1e, 0x90,
|
||||
0x77, 0xe7, 0x31, 0x6c, 0x21, 0x77, 0x81, 0x48, 0xab, 0x89, 0x48, 0x9c, 0xd6, 0xb5, 0xed, 0xff,
|
||||
0xd3, 0x7b, 0xd4, 0x7b, 0x68, 0xee, 0xe5, 0x2d, 0xa5, 0x13, 0xdb, 0x2d, 0x75, 0xdf, 0x4b, 0x45,
|
||||
0x4b, 0x47, 0x5c, 0x22, 0xcd, 0x4e, 0x7d, 0x96, 0xe5, 0x78, 0xa5, 0x6b, 0x96, 0xcc, 0xac, 0xcd,
|
||||
0xae, 0x6e, 0x89, 0x64, 0x61, 0x30, 0x04, 0x5e, 0x4b, 0x57, 0x9e, 0x80, 0x6d, 0xa6, 0xb9, 0x0e,
|
||||
0xb1, 0x59, 0x70, 0xc1, 0xd6, 0x6e, 0x59, 0x19, 0xac, 0xf5, 0x61, 0x3e, 0x74, 0xe4, 0xa5, 0xe5,
|
||||
0x1f, 0xe1, 0x09, 0x71, 0x5a, 0xf8, 0x43, 0xc9, 0x79, 0xe9, 0x52, 0x07, 0x38, 0x9a, 0xdd, 0x21,
|
||||
0xdd, 0x24, 0xba, 0xe7, 0xd3, 0x3c, 0x41, 0x7a, 0x8d, 0x95, 0xa1, 0x7f, 0x0a, 0xd0, 0xe0, 0x98,
|
||||
0x14, 0x71, 0x34, 0xca, 0x10, 0x65, 0x1d, 0x9a, 0x52, 0x0a, 0x43, 0x9d, 0xe6, 0x44, 0x0f, 0xe6,
|
||||
0x1a, 0x66, 0x1e, 0xd3, 0x55, 0x1f, 0xc3, 0x99, 0xee, 0x0d, 0xd3, 0x4f, 0x07, 0x6b, 0x00, 0x36,
|
||||
0x5f, 0x75, 0x0c, 0xb3, 0x0e, 0x57, 0xab, 0x0f, 0xff, 0xdc, 0xb5, 0x86, 0xe9, 0xa7, 0xaa, 0x35,
|
||||
0x40, 0xf9, 0xc4, 0x69, 0x28, 0x43, 0x89, 0x33, 0xcb, 0x9a, 0xc3, 0xca, 0x0f, 0x2e, 0x19, 0x16,
|
||||
0x1c, 0x2a, 0x56, 0x1f, 0x5b, 0xec, 0xf0, 0xa1, 0x61, 0x23, 0xc7, 0x8c, 0x35, 0xc5, 0xfe, 0x91,
|
||||
0xe3, 0xab, 0x86, 0x59, 0x67, 0x59, 0xd5, 0x86, 0x2f, 0x78, 0x3f, 0xed, 0xfc, 0xac, 0xfa, 0x90,
|
||||
0x7d, 0xce, 0x4f, 0x3f, 0x7a, 0xac, 0x36, 0x74, 0xc1, 0xf7, 0x69, 0x47, 0x8e, 0xd5, 0xa7, 0xf8,
|
||||
0x0a, 0xd7, 0x17, 0x9e, 0xe8, 0xd5, 0x18, 0x4e, 0x9f, 0xe7, 0xf3, 0x4f, 0xa3, 0xae, 0x8d, 0x2c,
|
||||
0xc1, 0xf2, 0x0d, 0x9c, 0xc1, 0xd5, 0x20, 0xd3, 0x9b, 0x73, 0x83, 0x2c, 0x78, 0xbe, 0x51, 0x76,
|
||||
0xe7, 0x90, 0x05, 0xb7, 0xbb, 0xcd, 0x31, 0xba, 0x80, 0xe9, 0xf3, 0xb9, 0xdb, 0x24, 0x8b, 0x73,
|
||||
0xb8, 0x82, 0xc3, 0x69, 0x73, 0xcc, 0x2d, 0x28, 0xbb, 0xca, 0xdb, 0x2d, 0xb1, 0x75, 0x14, 0x5b,
|
||||
0xc0, 0xd5, 0x2d, 0xc8, 0x70, 0x8e, 0x25, 0xc1, 0xce, 0x93, 0xb5, 0x90, 0xdd, 0x91, 0x54, 0xad,
|
||||
0x4f, 0xfa, 0x6d, 0x60, 0xf2, 0x0d, 0xd3, 0x73, 0x11, 0x6b, 0xe3, 0xe1, 0xa1, 0xe1, 0x38, 0x8e,
|
||||
0x63, 0x25, 0x4d, 0xb1, 0x0e, 0x12, 0xe7, 0x1a, 0xd3, 0x2f, 0x41, 0x80, 0x52, 0x14, 0x4b, 0x56,
|
||||
0xfa, 0x62, 0x1d, 0x5c, 0x73, 0xbe, 0xed, 0xff, 0x25, 0x12, 0x0d, 0x15, 0xc3, 0x98, 0x9f, 0xe0,
|
||||
0xd8, 0x14, 0xde, 0x0f, 0xb6, 0x91, 0x89, 0x35, 0x99, 0x00, 0x59, 0x07, 0x67, 0x6c, 0x8f, 0x6e,
|
||||
0x81, 0x31, 0xfb, 0x98, 0xaa, 0xcd, 0x4a, 0x6e, 0x3c, 0xe1, 0x8b, 0xf0, 0xbf, 0x64, 0xb2, 0x14,
|
||||
0xf9, 0x49, 0x3c, 0x12, 0xde, 0xf0, 0x7a, 0x4e, 0x43, 0xe9, 0xc3, 0x93, 0xf2, 0x3b, 0x9e, 0x75,
|
||||
0x56, 0x57, 0xad, 0x9b, 0x05, 0xf9, 0x4d, 0x71, 0x47, 0x93, 0xa9, 0xba, 0x58, 0x50, 0xd6, 0xc9,
|
||||
0xa8, 0x2e, 0x16, 0x6c, 0x00, 0x8c, 0xba, 0x78, 0x50, 0x5d, 0x3c, 0xa8, 0x2e, 0x1e, 0x4c, 0x12,
|
||||
0x4c, 0x5d, 0x3c, 0x58, 0xff, 0xe2, 0x41, 0x75, 0x01, 0xa0, 0xf4, 0x18, 0x94, 0xbb, 0xa2, 0xf1,
|
||||
0x01, 0x2f, 0x16, 0x94, 0xc1, 0x14, 0x5b, 0x6b, 0xa9, 0xab, 0x08, 0xe5, 0xa0, 0xa8, 0xab, 0x08,
|
||||
0xd5, 0x55, 0x84, 0xea, 0x2a, 0xc2, 0xfa, 0x9c, 0xac, 0xae, 0x22, 0x54, 0x57, 0x11, 0xaa, 0xab,
|
||||
0x08, 0x0b, 0x08, 0xb6, 0xce, 0x57, 0x11, 0xaa, 0x7b, 0x08, 0xd5, 0x3d, 0x84, 0x3f, 0xde, 0x3d,
|
||||
0x84, 0x19, 0xce, 0x9b, 0x96, 0xef, 0x1a, 0xac, 0x2c, 0xbd, 0xd4, 0x3d, 0x84, 0xea, 0x1e, 0x42,
|
||||
0x75, 0x0f, 0x61, 0x0a, 0x22, 0x75, 0x0f, 0x61, 0x4b, 0x76, 0x92, 0xba, 0x87, 0x50, 0xdd, 0x43,
|
||||
0x58, 0x67, 0x6a, 0xab, 0x7b, 0x08, 0x9b, 0xbc, 0x87, 0x50, 0xdd, 0x31, 0x88, 0xd4, 0x1d, 0x83,
|
||||
0xea, 0x8e, 0xc1, 0x26, 0xe7, 0x65, 0xde, 0x94, 0x54, 0x77, 0x03, 0x56, 0x65, 0xad, 0xf5, 0xb9,
|
||||
0x1b, 0x50, 0x5d, 0xff, 0xa7, 0xae, 0xff, 0xab, 0x1b, 0x4e, 0x54, 0xfc, 0x66, 0x91, 0xf8, 0xe7,
|
||||
0xe7, 0x89, 0x65, 0xe8, 0x17, 0xee, 0x71, 0x88, 0xe5, 0x93, 0xc9, 0xdf, 0x99, 0x97, 0xda, 0xfb,
|
||||
0x99, 0x73, 0xf3, 0xde, 0x61, 0xef, 0x6c, 0x03, 0xfe, 0x86, 0xff, 0x72, 0x96, 0xdb, 0x8b, 0x60,
|
||||
0xa4, 0xec, 0x98, 0xa5, 0xb8, 0x8b, 0x22, 0x7d, 0xc9, 0xeb, 0xf0, 0x0c, 0x47, 0xff, 0x3a, 0xb5,
|
||||
0xfc, 0x15, 0xfb, 0x6a, 0x26, 0x8c, 0x90, 0x48, 0x26, 0xfe, 0x0d, 0x46, 0x7c, 0x43, 0x2f, 0x58,
|
||||
0x3c, 0xbe, 0xf9, 0x2c, 0x58, 0xbb, 0xe0, 0x72, 0xc5, 0xdc, 0x61, 0x4b, 0xf6, 0x29, 0xfe, 0x53,
|
||||
0x80, 0xf4, 0x02, 0xd4, 0x53, 0x94, 0x85, 0x08, 0x4f, 0x4f, 0x07, 0x95, 0x30, 0x44, 0xfb, 0x11,
|
||||
0xbf, 0x0d, 0x9d, 0xdb, 0xb6, 0x88, 0x1c, 0x7b, 0x06, 0x0a, 0xd5, 0x8e, 0x07, 0x1d, 0x2d, 0x0b,
|
||||
0x61, 0x17, 0xeb, 0x2c, 0x79, 0x35, 0xd8, 0x22, 0xf2, 0x11, 0x20, 0x23, 0xc3, 0x61, 0xb1, 0xb4,
|
||||
0x6d, 0xc7, 0xbe, 0xa0, 0x64, 0x3a, 0xc5, 0x74, 0x75, 0x84, 0x45, 0x94, 0x84, 0x3f, 0x96, 0x9d,
|
||||
0x51, 0xdc, 0xe1, 0xc5, 0xc3, 0x84, 0xba, 0xc2, 0xa7, 0x02, 0x1f, 0x07, 0x7f, 0x87, 0x7f, 0xfe,
|
||||
0x4b, 0x40, 0x86, 0x9f, 0x5e, 0xbc, 0x48, 0xb3, 0xb7, 0x42, 0x38, 0x2f, 0x3b, 0xe8, 0x85, 0xff,
|
||||
0xcb, 0x0b, 0xfe, 0x4b, 0xde, 0x98, 0x73, 0x78, 0x2f, 0x5e, 0x6c, 0x25, 0x37, 0x4c, 0xf8, 0x6b,
|
||||
0xf4, 0x0f, 0xb4, 0x97, 0x86, 0x45, 0x7c, 0x7b, 0x93, 0x48, 0x4a, 0x4f, 0x80, 0x8d, 0x90, 0x2f,
|
||||
0x68, 0x54, 0x2c, 0x73, 0x4b, 0x72, 0x68, 0x76, 0xd2, 0x86, 0x26, 0x36, 0x1f, 0xd3, 0xc7, 0x22,
|
||||
0x87, 0xdc, 0x60, 0x35, 0xd8, 0xc0, 0xc3, 0x2b, 0xf1, 0x64, 0x5d, 0xf8, 0x97, 0xc7, 0x73, 0x7a,
|
||||
0x1a, 0x75, 0x6e, 0x8e, 0x80, 0xd9, 0x59, 0xb7, 0x07, 0x04, 0xc8, 0xb0, 0x13, 0x9e, 0x3f, 0x47,
|
||||
0xcf, 0x02, 0x37, 0x19, 0xf1, 0xce, 0x1c, 0xca, 0x8e, 0x7c, 0xb0, 0xd8, 0xe8, 0x8a, 0xfd, 0xa4,
|
||||
0x67, 0xd6, 0xa1, 0x89, 0xe1, 0x53, 0xf0, 0x1a, 0xda, 0x9d, 0xf0, 0x9e, 0x19, 0xc4, 0xcb, 0x6a,
|
||||
0x49, 0x16, 0xdc, 0x74, 0xe2, 0x85, 0x18, 0xc0, 0xce, 0x8a, 0xf4, 0x14, 0x54, 0xdb, 0x14, 0x03,
|
||||
0x59, 0x78, 0x33, 0x22, 0x54, 0x19, 0xc1, 0xa8, 0xbc, 0x77, 0x6c, 0x9c, 0x24, 0x8a, 0x3f, 0xe2,
|
||||
0x36, 0x4e, 0x1b, 0xed, 0xd5, 0x89, 0x90, 0xa5, 0x0f, 0x56, 0xc7, 0x3c, 0x38, 0x6b, 0x0a, 0xde,
|
||||
0x27, 0x5c, 0xe0, 0x09, 0x6e, 0x59, 0xd0, 0x7e, 0x6c, 0x62, 0x9d, 0x26, 0x43, 0xe9, 0x16, 0xd3,
|
||||
0x40, 0x37, 0x0c, 0xca, 0xe3, 0xe5, 0x0c, 0x7c, 0xed, 0xa5, 0x35, 0x95, 0x97, 0xb1, 0x41, 0x16,
|
||||
0x02, 0x66, 0x5e, 0xe4, 0x9f, 0xbc, 0xfc, 0xbf, 0x32, 0x4b, 0xed, 0x42, 0x31, 0x51, 0x1a, 0xe6,
|
||||
0x08, 0xfa, 0x27, 0x9f, 0x31, 0x02, 0x3e, 0xfc, 0xf6, 0xaf, 0x4e, 0x6a, 0x25, 0x0f, 0xb3, 0xdf,
|
||||
0x7c, 0xe8, 0xc1, 0x10, 0x01, 0x89, 0x0f, 0x7d, 0xe9, 0xdb, 0xe5, 0x55, 0x57, 0x59, 0x85, 0xd3,
|
||||
0x35, 0xa8, 0xa5, 0x99, 0xd8, 0x9e, 0xb2, 0x99, 0x60, 0xa9, 0x0c, 0x61, 0x17, 0xc2, 0x7f, 0xf1,
|
||||
0x46, 0xa2, 0x41, 0x31, 0xb2, 0x11, 0x30, 0xb2, 0x29, 0xeb, 0x0e, 0xb6, 0x4b, 0x64, 0x5c, 0x76,
|
||||
0xbe, 0xe3, 0xbb, 0xce, 0x30, 0x44, 0x2a, 0x9f, 0x3e, 0xdc, 0x11, 0x76, 0x34, 0xd4, 0xe4, 0x8d,
|
||||
0x93, 0x8b, 0xc2, 0x5e, 0x25, 0x4c, 0x90, 0xb7, 0xcd, 0xe9, 0xc3, 0x87, 0x00, 0x3a, 0x00, 0xcb,
|
||||
0xc8, 0xdf, 0x27, 0xdd, 0xce, 0x97, 0x0f, 0xa3, 0xa3, 0x4e, 0x0f, 0x3d, 0x83, 0x15, 0xe5, 0xcb,
|
||||
0x4c, 0x1f, 0x50, 0x13, 0xfd, 0x16, 0x1c, 0xf0, 0x38, 0xbd, 0x2e, 0xe8, 0x14, 0xac, 0x6f, 0xc0,
|
||||
0x7a, 0xec, 0x6e, 0x46, 0x8f, 0xf2, 0x66, 0x75, 0xfb, 0xa2, 0x76, 0x45, 0x8a, 0x70, 0xa3, 0x37,
|
||||
0xee, 0x99, 0x88, 0xa8, 0xa9, 0xfb, 0xa8, 0x82, 0x80, 0x89, 0xfb, 0x81, 0x52, 0x9e, 0x0f, 0x1e,
|
||||
0x27, 0x74, 0xe6, 0xc1, 0x00, 0x9d, 0xc3, 0xd3, 0x0f, 0x48, 0x54, 0x81, 0x75, 0x11, 0xb1, 0x27,
|
||||
0xce, 0x76, 0x46, 0xd6, 0x7c, 0x19, 0xf1, 0xec, 0x9b, 0xf7, 0xd1, 0x76, 0xf9, 0xe6, 0x50, 0x9a,
|
||||
0xda, 0x9a, 0x08, 0x3d, 0xa9, 0x59, 0xa2, 0xca, 0xf9, 0x6d, 0x52, 0x0a, 0x97, 0x41, 0x1b, 0xac,
|
||||
0xae, 0x4b, 0xe1, 0xd5, 0xfd, 0x3a, 0xd9, 0x88, 0x17, 0xbe, 0xb4, 0x15, 0x7d, 0x6e, 0x0c, 0x83,
|
||||
0x2b, 0xad, 0xc5, 0x97, 0x34, 0x3d, 0x7f, 0x90, 0xa6, 0xe8, 0xe3, 0x66, 0x75, 0xa8, 0xe9, 0xe3,
|
||||
0x6f, 0x8b, 0x35, 0x3d, 0xac, 0xd7, 0x23, 0xe6, 0xf2, 0x52, 0x72, 0x2f, 0xd8, 0x88, 0xf3, 0x94,
|
||||
0x90, 0xe1, 0xbd, 0xf4, 0xea, 0xdc, 0xe4, 0xd5, 0xc4, 0xd9, 0x01, 0xdc, 0xb4, 0xfa, 0x8f, 0x57,
|
||||
0x13, 0xfe, 0xa7, 0x23, 0x69, 0xca, 0x40, 0xab, 0xe6, 0x24, 0xb3, 0xdb, 0x83, 0x72, 0xf6, 0x4d,
|
||||
0x71, 0xa7, 0xfb, 0x7d, 0x21, 0x53, 0x9f, 0x45, 0xc8, 0xad, 0x05, 0x80, 0xf9, 0x44, 0x4a, 0x21,
|
||||
0x09, 0x97, 0xb4, 0xb9, 0x44, 0x59, 0x11, 0xc2, 0x80, 0xa3, 0x36, 0x71, 0xfb, 0xfd, 0x7b, 0x79,
|
||||
0x02, 0x2e, 0x78, 0xb0, 0x01, 0x12, 0xae, 0x9a, 0xeb, 0x57, 0x8e, 0x63, 0xa2, 0x70, 0x52, 0x25,
|
||||
0xd9, 0x2b, 0x5e, 0x6a, 0x31, 0x05, 0x32, 0x8b, 0x71, 0xdb, 0xff, 0x06, 0xd6, 0xcc, 0xd0, 0x8a,
|
||||
0x11, 0x5f, 0xf1, 0xc7, 0x4e, 0xfe, 0xca, 0xe1, 0x55, 0x32, 0xe9, 0x32, 0xfd, 0x2a, 0xc5, 0xaf,
|
||||
0xea, 0xef, 0x84, 0xf4, 0xfb, 0x33, 0x62, 0x60, 0x98, 0xbf, 0x57, 0xb0, 0x18, 0xa3, 0xc2, 0x20,
|
||||
0xba, 0x12, 0x90, 0xd0, 0x54, 0x9f, 0x4f, 0xf1, 0x6a, 0xa4, 0x8c, 0xbf, 0x52, 0xba, 0xf0, 0x41,
|
||||
0x2e, 0xcf, 0x57, 0x59, 0x5d, 0xa8, 0x66, 0xaa, 0xa4, 0x0c, 0x08, 0x21, 0x65, 0xb7, 0xb2, 0xb5,
|
||||
0x40, 0x46, 0x5f, 0x38, 0xa3, 0xbd, 0x12, 0x7d, 0x81, 0x05, 0x84, 0xfd, 0x37, 0xc6, 0x43, 0xe4,
|
||||
0x4d, 0x6e, 0xcd, 0xf1, 0xdc, 0x86, 0x09, 0xa1, 0xd6, 0x0d, 0x60, 0x44, 0xbe, 0xa3, 0x03, 0xb0,
|
||||
0x4f, 0x71, 0xaa, 0x35, 0x95, 0x67, 0x74, 0x2f, 0xd9, 0xef, 0x54, 0xf7, 0xd8, 0xf1, 0xcd, 0xf9,
|
||||
0xad, 0x70, 0x98, 0x78, 0xdd, 0x9e, 0x36, 0xbb, 0xb9, 0xb8, 0x73, 0xf1, 0x88, 0x81, 0x6d, 0x29,
|
||||
0x88, 0x1a, 0xda, 0x19, 0x19, 0x2e, 0x85, 0x49, 0x77, 0xc5, 0x09, 0x92, 0xe7, 0xde, 0x86, 0xf2,
|
||||
0xd1, 0x41, 0x17, 0x18, 0x0a, 0x77, 0xa7, 0x97, 0x49, 0x24, 0xde, 0x22, 0xf5, 0x84, 0x53, 0x37,
|
||||
0xdf, 0x41, 0x13, 0xc7, 0x93, 0x73, 0xd6, 0x9d, 0xd4, 0xc9, 0x38, 0x69, 0x0d, 0x97, 0xda, 0x79,
|
||||
0x4b, 0xcd, 0x9b, 0xe9, 0xf7, 0x83, 0xd1, 0x8b, 0x3a, 0xa5, 0x31, 0xb2, 0x73, 0x72, 0xbe, 0x32,
|
||||
0xba, 0x95, 0x1f, 0x7f, 0x21, 0x7d, 0xe8, 0x4f, 0x5a, 0xf7, 0xe4, 0xf7, 0x29, 0xa2, 0xe3, 0x13,
|
||||
0x26, 0xf9, 0x88, 0x01, 0x6a, 0x6c, 0x53, 0x29, 0xd1, 0xeb, 0xe2, 0x33, 0x95, 0x4b, 0x1d, 0x77,
|
||||
0x04, 0xbd, 0x8f, 0xb9, 0xab, 0xcb, 0x9c, 0xfa, 0x14, 0xed, 0xbc, 0x0d, 0x32, 0x9e, 0x5a, 0xc4,
|
||||
0xd6, 0xcd, 0x23, 0xcb, 0xe8, 0x76, 0x00, 0xe6, 0x65, 0xe8, 0x5d, 0x47, 0x3b, 0x1d, 0x39, 0x3f,
|
||||
0x7a, 0xe9, 0x73, 0x9a, 0x64, 0x1b, 0x30, 0x90, 0x6d, 0x40, 0x95, 0x01, 0x91, 0x3b, 0xe6, 0x2b,
|
||||
0xcd, 0x5f, 0x9a, 0x9f, 0xc5, 0x28, 0xd7, 0xa8, 0x1c, 0x97, 0x6a, 0x29, 0xae, 0xbb, 0xcf, 0x90,
|
||||
0x71, 0x60, 0x26, 0x84, 0x6a, 0x2f, 0x8f, 0x35, 0xe4, 0x53, 0xe4, 0x72, 0x10, 0x2d, 0x34, 0xa7,
|
||||
0x34, 0xa6, 0xfc, 0xfb, 0x4e, 0xef, 0x4b, 0x3b, 0x01, 0xb3, 0x8c, 0x0b, 0xca, 0xb2, 0x4c, 0x8b,
|
||||
0xfd, 0x86, 0x6d, 0xb3, 0x5c, 0xfd, 0x95, 0x46, 0x17, 0x9e, 0x37, 0xac, 0x5b, 0x2e, 0x70, 0xf9,
|
||||
0xf9, 0x05, 0x32, 0xf8, 0xe9, 0x83, 0x37, 0x33, 0xec, 0xeb, 0xcb, 0xb1, 0x03, 0x12, 0x96, 0x6f,
|
||||
0xae, 0x19, 0xdc, 0xb2, 0xe3, 0xda, 0x12, 0x11, 0x2f, 0x48, 0x16, 0xc4, 0xc6, 0x36, 0x72, 0x44,
|
||||
0x8e, 0x8c, 0x9d, 0x06, 0x12, 0x60, 0x99, 0xfe, 0x21, 0x86, 0xbc, 0x8a, 0x0e, 0x8b, 0x84, 0x6b,
|
||||
0xac, 0xe5, 0xeb, 0xda, 0x73, 0xee, 0x78, 0xfe, 0x1d, 0x56, 0xa5, 0xdd, 0xcc, 0x50, 0xe8, 0x90,
|
||||
0x6c, 0xfc, 0xb6, 0xdc, 0xf4, 0x69, 0x13, 0x1b, 0x5d, 0xb1, 0x29, 0x91, 0x15, 0x51, 0x96, 0x52,
|
||||
0x72, 0x84, 0xd9, 0xdc, 0xcd, 0x28, 0x9e, 0xb8, 0x28, 0xf7, 0xc4, 0x9a, 0xf3, 0x93, 0x1a, 0xbb,
|
||||
0x83, 0xdb, 0x63, 0x78, 0x8a, 0xab, 0x5c, 0x59, 0xde, 0xc7, 0x9c, 0x06, 0xe5, 0x4a, 0x2e, 0x4e,
|
||||
0xa5, 0x74, 0xbb, 0x2d, 0x5f, 0x8d, 0x16, 0x53, 0xab, 0x02, 0x1d, 0xca, 0xcf, 0x89, 0xfb, 0xad,
|
||||
0xff, 0x07, 0xa0, 0xd2, 0xc9, 0x84,
|
||||
};
|
|
@ -0,0 +1,17 @@
|
|||
// This file is autogenerated by VESC Tool
|
||||
|
||||
#ifndef QMLUI_LUNA_V1_H_
|
||||
#define QMLUI_LUNA_V1_H_
|
||||
|
||||
#include "datatypes.h"
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
// Constants
|
||||
#define DATA_QML_APP_SIZE 7270
|
||||
|
||||
// Variables
|
||||
extern uint8_t data_qml_app[];
|
||||
|
||||
// QMLUI_LUNA_V1_H_
|
||||
#endif
|
Loading…
Reference in New Issue