From 9cb2d2c23102feade8faac2be16afc89486e5247 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Thu, 23 Jan 2025 15:34:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=95=D0=A1=D0=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inu/app_wrapper/app_configs.h | 67 ++++- Inu/app_wrapper/app_includes.h | 6 + Inu/app_wrapper/app_init.c | 229 ---------------- Inu/app_wrapper/app_io.c | 32 +-- Inu/app_wrapper/app_wrapper.c | 463 +++++++++++++++++++++++---------- Inu/xilinx_wrapper/adc_sim.c | 22 +- Inu/xilinx_wrapper/adc_sim.h | 1 + README.md | 15 +- init.m | 14 +- inu_23550.slx | Bin 85836 -> 85648 bytes 10 files changed, 444 insertions(+), 405 deletions(-) diff --git a/Inu/app_wrapper/app_configs.h b/Inu/app_wrapper/app_configs.h index 4b9bb68..b3f246c 100644 --- a/Inu/app_wrapper/app_configs.h +++ b/Inu/app_wrapper/app_configs.h @@ -11,7 +11,7 @@ // , (30 .) #define SHIFT -#define ALG_MODE_SIMULINK ALG_MODE_SCALAR_OBOROTS +#define ALG_MODE_SIMULINK ALG_MODE_FOC_OBOROTS /* ALG_MODE_UF_CONST, ALG_MODE_SCALAR_OBOROTS, @@ -26,6 +26,69 @@ V_PWM24_PHASE_SEQ_REVERS_ACB, V_PWM24_PHASE_SEQ_REVERS_CBA, V_PWM24_PHASE_SEQ_REVERS_BAC - */ +*/ + + + +// +#define PI2 6.283185307179586476925286766559 //pi*2 +#define SQRT2 1.4142135623730950488016887242097 //sqrt(2) +#define SQRT3 1.7320508075688772935274463415059 //sqrt(3) +#define ISQRT3 0.57735026918962576450914878050196 //1./sqrt(3) +// +// ... , +#define P_NOM (6300e3) +// ... , (ampl) +#define U_NOM (3300.*SQRT2) +// ... , / +#define N_NOM 180. +// ... +#define PP 6. +// ... +#define COS_FI_ 0.87 +// ... +#define EFF 0.968 +// ... , *^2 +#define J (87e3*0.50) +// ... , +#define S_NOM (P_NOM/(COS_FI_*EFF)) +// ... , / +#define WM_NOM (N_NOM/60.*PI2) +// ... , * +#define M_NOM (P_NOM/WM_NOM) + + +// +// ... , BA +#define S_BAZ S_NOM +// ... , (ampl) +#define U_BAZ U_NOM +// ... , (ampl) +#define I_BAZ (S_BAZ*2./(U_BAZ*SQRT3)*0.5) //0.5 - .. +// ... , / +#define N_BAZ N_NOM +// ... , / +#define WM_BAZ (N_BAZ/60.*PI2) +// ... , / +#define WE_BAZ (WM_BAZ*PP) +// ... , * +#define M_BAZ (S_BAZ/WM_BAZ) +// ... , +#define PSI_BAZ (U_BAZ/(WE_BAZ*SQRT3)) +// ... , +#define L_BAZ (PSI_BAZ/I_BAZ) +// ... , +#define R_BAZ (U_BAZ/(I_BAZ*SQRT3)) + + +// +#define U_2_Y (T1_PRD*SQRT3/U_BAZ) + +// . , . 2048, +#define UDC_SENS_MAX (U_BAZ*1.15*1.3) +// , . 2048, (ampl) +#define IAC_SENS_MAX (I_BAZ*1.5) +#define IDC_SENS_MAX 5000.0 + #endif //_APP_CONFIG diff --git a/Inu/app_wrapper/app_includes.h b/Inu/app_wrapper/app_includes.h index 02ece35..e6933ea 100644 --- a/Inu/app_wrapper/app_includes.h +++ b/Inu/app_wrapper/app_includes.h @@ -29,6 +29,12 @@ #include "global_time.h" #include "PWMTools.h" #include "alg_simple_scalar.h" +#include "can_bs2bs.h" +#include "log_to_mem.h" +#include "optical_bus.h" +#include "sync_tools.h" +#include "oscil_can.h" +#include "alarm_log_can.h" #include #include diff --git a/Inu/app_wrapper/app_init.c b/Inu/app_wrapper/app_init.c index acc02e7..3e8234c 100644 --- a/Inu/app_wrapper/app_init.c +++ b/Inu/app_wrapper/app_init.c @@ -166,232 +166,3 @@ void set_zadanie_u_charge_matlab(void) } -void init_ramp_all_zadanie(void) -{ - _iq rampafloat; - - // rmp_fzad - edrk.zadanie.rmp_fzad.RampLowLimit = _IQ(-MAX_ZADANIE_F / NORMA_FROTOR); //0 - edrk.zadanie.rmp_fzad.RampHighLimit = _IQ(MAX_ZADANIE_F / NORMA_FROTOR); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_F)); - edrk.zadanie.rmp_fzad.RampPlus = rampafloat; - edrk.zadanie.rmp_fzad.RampMinus = -rampafloat; - - edrk.zadanie.rmp_fzad.DesiredInput = 0; - edrk.zadanie.rmp_fzad.Out = 0; - - // rmp_oborots_hz - edrk.zadanie.rmp_oborots_zad_hz.RampLowLimit = _IQ(MIN_ZADANIE_OBOROTS_ROTOR / 60.0 / NORMA_FROTOR); //0 - edrk.zadanie.rmp_oborots_zad_hz.RampHighLimit = _IQ(MAX_ZADANIE_OBOROTS_ROTOR / 60.0 / NORMA_FROTOR); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_OBOROTS_ROTOR)); - edrk.zadanie.rmp_oborots_zad_hz.RampPlus = rampafloat; - edrk.zadanie.rmp_oborots_zad_hz.RampMinus = -rampafloat; - - edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = 0; - edrk.zadanie.rmp_oborots_zad_hz.Out = 0; - - - // - edrk.zadanie.rmp_Izad.RampLowLimit = _IQ(0); //0 - edrk.zadanie.rmp_Izad.RampHighLimit = _IQ(MAX_ZADANIE_I_M / NORMA_ACP); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_I_M)); - edrk.zadanie.rmp_Izad.RampPlus = rampafloat; - edrk.zadanie.rmp_Izad.RampMinus = -rampafloat; - - edrk.zadanie.rmp_Izad.DesiredInput = 0; - edrk.zadanie.rmp_Izad.Out = 0; - - // - edrk.zadanie.rmp_ZadanieU_Charge.RampLowLimit = _IQ(0); //0 - edrk.zadanie.rmp_ZadanieU_Charge.RampHighLimit = _IQ(MAX_ZADANIE_U_CHARGE / NORMA_ACP); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_U_CHARGE)); - edrk.zadanie.rmp_ZadanieU_Charge.RampPlus = rampafloat; - edrk.zadanie.rmp_ZadanieU_Charge.RampMinus = -rampafloat; - - edrk.zadanie.rmp_ZadanieU_Charge.DesiredInput = 0; - edrk.zadanie.rmp_ZadanieU_Charge.Out = 0; - - - - // - edrk.zadanie.rmp_k_u_disbalance.RampLowLimit = _IQ(0); //0 - edrk.zadanie.rmp_k_u_disbalance.RampHighLimit = _IQ(MAX_ZADANIE_K_U_DISBALANCE); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_K_U_DISBALANCE)); - edrk.zadanie.rmp_k_u_disbalance.RampPlus = rampafloat; - edrk.zadanie.rmp_k_u_disbalance.RampMinus = -rampafloat; - - edrk.zadanie.rmp_k_u_disbalance.DesiredInput = 0; - edrk.zadanie.rmp_k_u_disbalance.Out = 0; - - - // - edrk.zadanie.rmp_kplus_u_disbalance.RampLowLimit = _IQ(0); //0 - edrk.zadanie.rmp_kplus_u_disbalance.RampHighLimit = _IQ(MAX_ZADANIE_KPLUS_U_DISBALANCE); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_KPLUS_U_DISBALANCE)); - edrk.zadanie.rmp_kplus_u_disbalance.RampPlus = rampafloat; - edrk.zadanie.rmp_kplus_u_disbalance.RampMinus = -rampafloat; - - edrk.zadanie.rmp_kplus_u_disbalance.DesiredInput = 0; - edrk.zadanie.rmp_kplus_u_disbalance.Out = 0; - - - - // - edrk.zadanie.rmp_kzad.RampLowLimit = _IQ(0); //0 - edrk.zadanie.rmp_kzad.RampHighLimit = _IQ(MAX_ZADANIE_K_M); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_K_M)); - edrk.zadanie.rmp_kzad.RampPlus = rampafloat; - edrk.zadanie.rmp_kzad.RampMinus = -rampafloat; - - edrk.zadanie.rmp_kzad.DesiredInput = 0; - edrk.zadanie.rmp_kzad.Out = 0; - - - - - - // - edrk.zadanie.rmp_powers_zad.RampLowLimit = _IQ(MIN_ZADANIE_POWER * 1000.0 / (NORMA_MZZ * NORMA_MZZ)); //0 - edrk.zadanie.rmp_powers_zad.RampHighLimit = _IQ(MAX_ZADANIE_POWER * 1000.0 / (NORMA_MZZ * NORMA_MZZ)); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_POWER)); - edrk.zadanie.rmp_powers_zad.RampPlus = rampafloat; - edrk.zadanie.rmp_powers_zad.RampMinus = -rampafloat; - - edrk.zadanie.rmp_powers_zad.DesiredInput = 0; - edrk.zadanie.rmp_powers_zad.Out = 0; - - // - edrk.zadanie.rmp_limit_powers_zad.RampLowLimit = _IQ(0); //0 - edrk.zadanie.rmp_limit_powers_zad.RampHighLimit = _IQ(MAX_ZADANIE_POWER * 1000.0 / (NORMA_MZZ * NORMA_MZZ)); - - rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_POWER)); - edrk.zadanie.rmp_limit_powers_zad.RampPlus = rampafloat; - edrk.zadanie.rmp_limit_powers_zad.RampMinus = -rampafloat; - - edrk.zadanie.rmp_limit_powers_zad.DesiredInput = 0; - edrk.zadanie.rmp_limit_powers_zad.Out = 0; - - // - - -} - -void ramp_all_zadanie(int flag_set_zero) -{ - ////////////////////////////////////////////// - if (flag_set_zero == 0) - edrk.zadanie.rmp_Izad.DesiredInput = edrk.zadanie.iq_Izad; - else - if (flag_set_zero == 2) - { - edrk.zadanie.rmp_Izad.DesiredInput = 0; - edrk.zadanie.rmp_Izad.Out = 0; - } - else - edrk.zadanie.rmp_Izad.DesiredInput = 0; - - edrk.zadanie.rmp_Izad.calc(&edrk.zadanie.rmp_Izad); - edrk.zadanie.iq_Izad_rmp = edrk.zadanie.rmp_Izad.Out; - ////////////////////////////////////////////// - edrk.zadanie.rmp_ZadanieU_Charge.DesiredInput = edrk.zadanie.iq_ZadanieU_Charge; - edrk.zadanie.rmp_ZadanieU_Charge.calc(&edrk.zadanie.rmp_ZadanieU_Charge); - edrk.zadanie.iq_ZadanieU_Charge_rmp = edrk.zadanie.rmp_ZadanieU_Charge.Out; - ////////////////////////////////////////////// - if (flag_set_zero == 0) - edrk.zadanie.rmp_fzad.DesiredInput = edrk.zadanie.iq_fzad; - else - if (flag_set_zero == 2) - { - edrk.zadanie.rmp_fzad.DesiredInput = 0; - edrk.zadanie.rmp_fzad.Out = 0; - } - else - edrk.zadanie.rmp_fzad.DesiredInput = 0; - - edrk.zadanie.rmp_fzad.calc(&edrk.zadanie.rmp_fzad); - edrk.zadanie.iq_fzad_rmp = edrk.zadanie.rmp_fzad.Out; - ////////////////////////////////////////////// - edrk.zadanie.rmp_k_u_disbalance.DesiredInput = edrk.zadanie.iq_k_u_disbalance; - edrk.zadanie.rmp_k_u_disbalance.calc(&edrk.zadanie.rmp_k_u_disbalance); - edrk.zadanie.iq_k_u_disbalance_rmp = edrk.zadanie.rmp_k_u_disbalance.Out; - ////////////////////////////////////////////// - edrk.zadanie.rmp_kplus_u_disbalance.DesiredInput = edrk.zadanie.iq_kplus_u_disbalance; - edrk.zadanie.rmp_kplus_u_disbalance.calc(&edrk.zadanie.rmp_kplus_u_disbalance); - edrk.zadanie.iq_kplus_u_disbalance_rmp = edrk.zadanie.rmp_kplus_u_disbalance.Out; - ////////////////////////////////////////////// - if (flag_set_zero == 0) - edrk.zadanie.rmp_kzad.DesiredInput = edrk.zadanie.iq_kzad; - else - if (flag_set_zero == 2) - { - edrk.zadanie.rmp_kzad.DesiredInput = 0; - edrk.zadanie.rmp_kzad.Out = 0; - } - else - edrk.zadanie.rmp_kzad.DesiredInput = 0; - edrk.zadanie.rmp_kzad.calc(&edrk.zadanie.rmp_kzad); - edrk.zadanie.iq_kzad_rmp = edrk.zadanie.rmp_kzad.Out; - ////////////////////////////////////////////// - if (flag_set_zero == 0) - edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = edrk.zadanie.iq_oborots_zad_hz; - else - if (flag_set_zero == 2) - { - edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = 0; - edrk.zadanie.rmp_oborots_zad_hz.Out = 0; - } - else - edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = 0; - - edrk.zadanie.rmp_oborots_zad_hz.calc(&edrk.zadanie.rmp_oborots_zad_hz); - edrk.zadanie.iq_oborots_zad_hz_rmp = edrk.zadanie.rmp_oborots_zad_hz.Out; - - ////////////////////////////////////////////// - if (flag_set_zero == 0) - edrk.zadanie.rmp_limit_powers_zad.DesiredInput = edrk.zadanie.iq_limit_power_zad; - else - if (flag_set_zero == 2) - { - edrk.zadanie.rmp_limit_powers_zad.DesiredInput = 0; - edrk.zadanie.rmp_limit_powers_zad.Out = 0; - } - else - edrk.zadanie.rmp_limit_powers_zad.DesiredInput = 0; - - edrk.zadanie.rmp_limit_powers_zad.calc(&edrk.zadanie.rmp_limit_powers_zad); - edrk.zadanie.iq_limit_power_zad_rmp = edrk.zadanie.rmp_limit_powers_zad.Out; - - - - ////////////////////////////////////////////// - if (flag_set_zero == 0) - { - if (edrk.zadanie.iq_power_zad > edrk.zadanie.iq_limit_power_zad_rmp) - edrk.zadanie.rmp_powers_zad.DesiredInput = edrk.zadanie.iq_limit_power_zad_rmp; - else - edrk.zadanie.rmp_powers_zad.DesiredInput = edrk.zadanie.iq_power_zad; - } - else - if (flag_set_zero == 2) - { - edrk.zadanie.rmp_powers_zad.DesiredInput = 0; - edrk.zadanie.rmp_powers_zad.Out = 0; - } - else - edrk.zadanie.rmp_powers_zad.DesiredInput = 0; - - edrk.zadanie.rmp_powers_zad.calc(&edrk.zadanie.rmp_powers_zad); - edrk.zadanie.iq_power_zad_rmp = edrk.zadanie.rmp_powers_zad.Out; - - - - -} diff --git a/Inu/app_wrapper/app_io.c b/Inu/app_wrapper/app_io.c index d6e2c21..bd23ae3 100644 --- a/Inu/app_wrapper/app_io.c +++ b/Inu/app_wrapper/app_io.c @@ -16,14 +16,14 @@ RS_DATA_STRUCT rs_a = RS_DATA_STRUCT_DEFAULT, rs_b = RS_DATA_STRUCT_DEFAULT; // void readInputParameters(const real_T* u) { - iq_norm_ADC[0][0] = _IQ(AdcSim.udc1.adc_val); - iq_norm_ADC[0][1] = _IQ(AdcSim.udc2.adc_val); - iq_norm_ADC[0][2] = _IQ(AdcSim.ia1.adc_val); - iq_norm_ADC[0][3] = _IQ(AdcSim.ib1.adc_val); - iq_norm_ADC[0][4] = _IQ(AdcSim.ic1.adc_val); - iq_norm_ADC[0][5] = _IQ(AdcSim.ia2.adc_val); - iq_norm_ADC[0][6] = _IQ(AdcSim.ib2.adc_val); - iq_norm_ADC[0][7] = _IQ(AdcSim.ic2.adc_val); + iq_norm_ADC[0][0] = _IQ(AdcSim.udc1.adc_norm); + iq_norm_ADC[0][1] = _IQ(AdcSim.udc2.adc_norm); + iq_norm_ADC[0][2] = _IQ(AdcSim.ia1.adc_norm); + iq_norm_ADC[0][3] = _IQ(AdcSim.ib1.adc_norm); + iq_norm_ADC[0][4] = _IQ(AdcSim.ic1.adc_norm); + iq_norm_ADC[0][5] = _IQ(AdcSim.ia2.adc_norm); + iq_norm_ADC[0][6] = _IQ(AdcSim.ib2.adc_norm); + iq_norm_ADC[0][7] = _IQ(AdcSim.ic2.adc_norm); int nn = 8; WRotor.iqWRotorCalcBeforeRegul1 = _IQ(u[nn++] / (PI*2) / NORMA_FROTOR); @@ -121,12 +121,12 @@ void writeOutputParameters(real_T* xD) { - xD[nn++] = (AdcSim.udc1.adc_val); - xD[nn++] = (AdcSim.udc2.adc_val); - xD[nn++] = (AdcSim.ia1.adc_val); - xD[nn++] = (AdcSim.ib1.adc_val); - xD[nn++] = (AdcSim.ic1.adc_val); - xD[nn++] = (AdcSim.ia2.adc_val); - xD[nn++] = (AdcSim.ib2.adc_val); - xD[nn++] = (AdcSim.ic2.adc_val); + xD[nn++] = _IQtoF(iq_norm_ADC[0][0]); + xD[nn++] = _IQtoF(iq_norm_ADC[0][1]); + xD[nn++] = _IQtoF(iq_norm_ADC[0][2]); + xD[nn++] = _IQtoF(iq_norm_ADC[0][3]); + xD[nn++] = _IQtoF(iq_norm_ADC[0][4]); + xD[nn++] = _IQtoF(iq_norm_ADC[0][5]); + xD[nn++] = _IQtoF(iq_norm_ADC[0][6]); + xD[nn++] = _IQtoF(iq_norm_ADC[0][7]); } \ No newline at end of file diff --git a/Inu/app_wrapper/app_wrapper.c b/Inu/app_wrapper/app_wrapper.c index 3c59e79..e5ff313 100644 --- a/Inu/app_wrapper/app_wrapper.c +++ b/Inu/app_wrapper/app_wrapper.c @@ -9,6 +9,21 @@ T_project project = {0}; WINDING a; EDRK edrk = EDRK_DEFAULT; FLAG f = FLAG_DEFAULTS; +//X_PARALLEL_BUS x_parallel_bus_project = X_PARALLEL_BUS_DEFAULTS; +//int Unites2SecondBS[SIZE_ARR_CAN_UNITES_BS2BS] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ +// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ +// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ +// 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0\ +//}; +//LOGSPARAMS logpar = LOGSPARAMS_DEFAULTS; +//OPTICAL_BUS_DATA optical_write_data = OPTICAL_BUS_DATA_DEFAULT; +//OPTICAL_BUS_DATA optical_read_data = OPTICAL_BUS_DATA_DEFAULT; +//SYNC_TOOLS_DATA sync_data = SYNC_TOOLS_DATA_DEFAULT; +//int flag_enable_can_from_mpu = 0; +//UNITES_CAN_SETUP unites_can_setup = UNITES_CAN_SETUP_DEFAULT; +//OSCIL_CAN oscil_can = OSCIL_CAN_DEFAULTS; +//int flag_special_mode_rs = 0; +//ALARM_LOG_CAN alarm_log_can = ALARM_LOG_CAN_CAN_DEFAULTS; WRotorValues WRotor = WRotorValues_DEFAULTS; WRotorValuesAngle WRotorPBus = WRotorValuesAngle_DEFAULTS; @@ -121,7 +136,235 @@ void mcu_simulate_step(void) +void init_ramp_all_zadanie(void) +{ + _iq rampafloat; + // rmp_fzad + edrk.zadanie.rmp_fzad.RampLowLimit = _IQ(-MAX_ZADANIE_F / NORMA_FROTOR); //0 + edrk.zadanie.rmp_fzad.RampHighLimit = _IQ(MAX_ZADANIE_F / NORMA_FROTOR); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_F)); + edrk.zadanie.rmp_fzad.RampPlus = rampafloat; + edrk.zadanie.rmp_fzad.RampMinus = -rampafloat; + + edrk.zadanie.rmp_fzad.DesiredInput = 0; + edrk.zadanie.rmp_fzad.Out = 0; + + // rmp_oborots_hz + edrk.zadanie.rmp_oborots_zad_hz.RampLowLimit = _IQ(MIN_ZADANIE_OBOROTS_ROTOR / 60.0 / NORMA_FROTOR); //0 + edrk.zadanie.rmp_oborots_zad_hz.RampHighLimit = _IQ(MAX_ZADANIE_OBOROTS_ROTOR / 60.0 / NORMA_FROTOR); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_OBOROTS_ROTOR)); + edrk.zadanie.rmp_oborots_zad_hz.RampPlus = rampafloat; + edrk.zadanie.rmp_oborots_zad_hz.RampMinus = -rampafloat; + + edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = 0; + edrk.zadanie.rmp_oborots_zad_hz.Out = 0; + + + // + edrk.zadanie.rmp_Izad.RampLowLimit = _IQ(0); //0 + edrk.zadanie.rmp_Izad.RampHighLimit = _IQ(MAX_ZADANIE_I_M / NORMA_ACP); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_I_M)); + edrk.zadanie.rmp_Izad.RampPlus = rampafloat; + edrk.zadanie.rmp_Izad.RampMinus = -rampafloat; + + edrk.zadanie.rmp_Izad.DesiredInput = 0; + edrk.zadanie.rmp_Izad.Out = 0; + + // + edrk.zadanie.rmp_ZadanieU_Charge.RampLowLimit = _IQ(0); //0 + edrk.zadanie.rmp_ZadanieU_Charge.RampHighLimit = _IQ(MAX_ZADANIE_U_CHARGE / NORMA_ACP); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_U_CHARGE)); + edrk.zadanie.rmp_ZadanieU_Charge.RampPlus = rampafloat; + edrk.zadanie.rmp_ZadanieU_Charge.RampMinus = -rampafloat; + + edrk.zadanie.rmp_ZadanieU_Charge.DesiredInput = 0; + edrk.zadanie.rmp_ZadanieU_Charge.Out = 0; + + + + // + edrk.zadanie.rmp_k_u_disbalance.RampLowLimit = _IQ(0); //0 + edrk.zadanie.rmp_k_u_disbalance.RampHighLimit = _IQ(MAX_ZADANIE_K_U_DISBALANCE); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_K_U_DISBALANCE)); + edrk.zadanie.rmp_k_u_disbalance.RampPlus = rampafloat; + edrk.zadanie.rmp_k_u_disbalance.RampMinus = -rampafloat; + + edrk.zadanie.rmp_k_u_disbalance.DesiredInput = 0; + edrk.zadanie.rmp_k_u_disbalance.Out = 0; + + + // + edrk.zadanie.rmp_kplus_u_disbalance.RampLowLimit = _IQ(0); //0 + edrk.zadanie.rmp_kplus_u_disbalance.RampHighLimit = _IQ(MAX_ZADANIE_KPLUS_U_DISBALANCE); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_KPLUS_U_DISBALANCE)); + edrk.zadanie.rmp_kplus_u_disbalance.RampPlus = rampafloat; + edrk.zadanie.rmp_kplus_u_disbalance.RampMinus = -rampafloat; + + edrk.zadanie.rmp_kplus_u_disbalance.DesiredInput = 0; + edrk.zadanie.rmp_kplus_u_disbalance.Out = 0; + + + + // + edrk.zadanie.rmp_kzad.RampLowLimit = _IQ(0); //0 + edrk.zadanie.rmp_kzad.RampHighLimit = _IQ(MAX_ZADANIE_K_M); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_K_M)); + edrk.zadanie.rmp_kzad.RampPlus = rampafloat; + edrk.zadanie.rmp_kzad.RampMinus = -rampafloat; + + edrk.zadanie.rmp_kzad.DesiredInput = 0; + edrk.zadanie.rmp_kzad.Out = 0; + + + + + + // + edrk.zadanie.rmp_powers_zad.RampLowLimit = _IQ(MIN_ZADANIE_POWER * 1000.0 / (NORMA_MZZ * NORMA_MZZ)); //0 + edrk.zadanie.rmp_powers_zad.RampHighLimit = _IQ(MAX_ZADANIE_POWER * 1000.0 / (NORMA_MZZ * NORMA_MZZ)); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_POWER)); + edrk.zadanie.rmp_powers_zad.RampPlus = rampafloat; + edrk.zadanie.rmp_powers_zad.RampMinus = -rampafloat; + + edrk.zadanie.rmp_powers_zad.DesiredInput = 0; + edrk.zadanie.rmp_powers_zad.Out = 0; + + // + edrk.zadanie.rmp_limit_powers_zad.RampLowLimit = _IQ(0); //0 + edrk.zadanie.rmp_limit_powers_zad.RampHighLimit = _IQ(MAX_ZADANIE_POWER * 1000.0 / (NORMA_MZZ * NORMA_MZZ)); + + rampafloat = _IQ(1.0 / (2.0 * FREQ_PWM * T_NARAST_ZADANIE_POWER)); + edrk.zadanie.rmp_limit_powers_zad.RampPlus = rampafloat; + edrk.zadanie.rmp_limit_powers_zad.RampMinus = -rampafloat; + + edrk.zadanie.rmp_limit_powers_zad.DesiredInput = 0; + edrk.zadanie.rmp_limit_powers_zad.Out = 0; + + // + + +} + +void ramp_all_zadanie(int flag_set_zero) +{ + ////////////////////////////////////////////// + if (flag_set_zero == 0) + edrk.zadanie.rmp_Izad.DesiredInput = edrk.zadanie.iq_Izad; + else + if (flag_set_zero == 2) + { + edrk.zadanie.rmp_Izad.DesiredInput = 0; + edrk.zadanie.rmp_Izad.Out = 0; + } + else + edrk.zadanie.rmp_Izad.DesiredInput = 0; + + edrk.zadanie.rmp_Izad.calc(&edrk.zadanie.rmp_Izad); + edrk.zadanie.iq_Izad_rmp = edrk.zadanie.rmp_Izad.Out; + ////////////////////////////////////////////// + edrk.zadanie.rmp_ZadanieU_Charge.DesiredInput = edrk.zadanie.iq_ZadanieU_Charge; + edrk.zadanie.rmp_ZadanieU_Charge.calc(&edrk.zadanie.rmp_ZadanieU_Charge); + edrk.zadanie.iq_ZadanieU_Charge_rmp = edrk.zadanie.rmp_ZadanieU_Charge.Out; + ////////////////////////////////////////////// + if (flag_set_zero == 0) + edrk.zadanie.rmp_fzad.DesiredInput = edrk.zadanie.iq_fzad; + else + if (flag_set_zero == 2) + { + edrk.zadanie.rmp_fzad.DesiredInput = 0; + edrk.zadanie.rmp_fzad.Out = 0; + } + else + edrk.zadanie.rmp_fzad.DesiredInput = 0; + + edrk.zadanie.rmp_fzad.calc(&edrk.zadanie.rmp_fzad); + edrk.zadanie.iq_fzad_rmp = edrk.zadanie.rmp_fzad.Out; + ////////////////////////////////////////////// + edrk.zadanie.rmp_k_u_disbalance.DesiredInput = edrk.zadanie.iq_k_u_disbalance; + edrk.zadanie.rmp_k_u_disbalance.calc(&edrk.zadanie.rmp_k_u_disbalance); + edrk.zadanie.iq_k_u_disbalance_rmp = edrk.zadanie.rmp_k_u_disbalance.Out; + ////////////////////////////////////////////// + edrk.zadanie.rmp_kplus_u_disbalance.DesiredInput = edrk.zadanie.iq_kplus_u_disbalance; + edrk.zadanie.rmp_kplus_u_disbalance.calc(&edrk.zadanie.rmp_kplus_u_disbalance); + edrk.zadanie.iq_kplus_u_disbalance_rmp = edrk.zadanie.rmp_kplus_u_disbalance.Out; + ////////////////////////////////////////////// + if (flag_set_zero == 0) + edrk.zadanie.rmp_kzad.DesiredInput = edrk.zadanie.iq_kzad; + else + if (flag_set_zero == 2) + { + edrk.zadanie.rmp_kzad.DesiredInput = 0; + edrk.zadanie.rmp_kzad.Out = 0; + } + else + edrk.zadanie.rmp_kzad.DesiredInput = 0; + edrk.zadanie.rmp_kzad.calc(&edrk.zadanie.rmp_kzad); + edrk.zadanie.iq_kzad_rmp = edrk.zadanie.rmp_kzad.Out; + ////////////////////////////////////////////// + if (flag_set_zero == 0) + edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = edrk.zadanie.iq_oborots_zad_hz; + else + if (flag_set_zero == 2) + { + edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = 0; + edrk.zadanie.rmp_oborots_zad_hz.Out = 0; + } + else + edrk.zadanie.rmp_oborots_zad_hz.DesiredInput = 0; + + edrk.zadanie.rmp_oborots_zad_hz.calc(&edrk.zadanie.rmp_oborots_zad_hz); + edrk.zadanie.iq_oborots_zad_hz_rmp = edrk.zadanie.rmp_oborots_zad_hz.Out; + + ////////////////////////////////////////////// + if (flag_set_zero == 0) + edrk.zadanie.rmp_limit_powers_zad.DesiredInput = edrk.zadanie.iq_limit_power_zad; + else + if (flag_set_zero == 2) + { + edrk.zadanie.rmp_limit_powers_zad.DesiredInput = 0; + edrk.zadanie.rmp_limit_powers_zad.Out = 0; + } + else + edrk.zadanie.rmp_limit_powers_zad.DesiredInput = 0; + + edrk.zadanie.rmp_limit_powers_zad.calc(&edrk.zadanie.rmp_limit_powers_zad); + edrk.zadanie.iq_limit_power_zad_rmp = edrk.zadanie.rmp_limit_powers_zad.Out; + + + + ////////////////////////////////////////////// + if (flag_set_zero == 0) + { + if (edrk.zadanie.iq_power_zad > edrk.zadanie.iq_limit_power_zad_rmp) + edrk.zadanie.rmp_powers_zad.DesiredInput = edrk.zadanie.iq_limit_power_zad_rmp; + else + edrk.zadanie.rmp_powers_zad.DesiredInput = edrk.zadanie.iq_power_zad; + } + else + if (flag_set_zero == 2) + { + edrk.zadanie.rmp_powers_zad.DesiredInput = 0; + edrk.zadanie.rmp_powers_zad.Out = 0; + } + else + edrk.zadanie.rmp_powers_zad.DesiredInput = 0; + + edrk.zadanie.rmp_powers_zad.calc(&edrk.zadanie.rmp_powers_zad); + edrk.zadanie.iq_power_zad_rmp = edrk.zadanie.rmp_powers_zad.Out; + + + + +} unsigned int ReadMemory(unsigned long addr) @@ -215,145 +458,103 @@ _iq break_result_4 = 0; // } -void update_uom(void) -{ -} -void inc_RS_timeout_cicle(void) -{ -} -void inc_CAN_timeout_cicle(void) -{ -} - -void pause_1000(void) -{ - -} - -int xerror(unsigned int er_ID, void* CallBackRef) -{ -}; +void start_pwm(void) {} +void stop_pwm(void) {} +int get_real_in_mbox(int a, int b) {} +void update_uom(void) {} +void inc_RS_timeout_cicle(void) {} +void inc_CAN_timeout_cicle(void) {} +void pause_1000(void) {} +int xerror(unsigned int er_ID, void* CallBackRef) {} void func_unpack_answer_from_Ingeteam(unsigned int a) {} void unpack_answer_from_MPU_SVU_CAN(unsigned int a) {} -int get_real_in_mbox(int a, int b) {} - -void start_pwm(void) -{ - // mPWM_a = 1; - // mPWM_b = 1; -} - -void stop_pwm(void) -{ - // mPWM_a = 0; - // mPWM_b = 0; - - // svgen_set_time_keys_closed(&svgen_pwm24_1); - // svgen_set_time_keys_closed(&svgen_pwm24_2); - // WriteMemory(ADR_TK_MASK_0, 0xFFFF); - // WriteMemory(ADR_PWM_START_STOP, 0x8000); -} -void start_break_pwm() { - -} - - -void stop_break_pwm() { - -} - -void stop_wdog() { - -} - -void start_pwm_b() { - -} -void start_pwm_a() { - -} -void stop_pwm_b() { - -} -void stop_pwm_a() { - -} - -void fillADClogs() { - -} -void break_resistor_managment_calc(){ - -} - - -void break_resistor_managment_init(){ - -} - - -void break_resistor_managment_update(){ - -} - - -void break_resistor_recup_calc(){ - -} - - -void break_resistor_set_closed(){ - -} - - -void DetectI_Out_BreakFase(){ - -} - - -void test_mem_limit(){ - -} - - -void set_start_mem(){ - -} - - -void getFastLogs(){ - -} - - -//void detect_I_M_overload{ -// -// } - - -void sync_inc_error(){ - -} - - -void optical_bus_read(){ - -} - - -void optical_bus_write(void){ - -} +void start_break_pwm() {} +void stop_break_pwm() {} +void stop_wdog() {} +void start_pwm_b() {} +void start_pwm_a() {} +void stop_pwm_b() {} +void stop_pwm_a() {} +void fillADClogs() {} +void break_resistor_managment_calc() {} +void break_resistor_managment_init() {} +void break_resistor_managment_update() {} +void break_resistor_recup_calc() {} +void break_resistor_set_closed() {} +void DetectI_Out_BreakFase() {} +void test_mem_limit() {} +void set_start_mem() {} +void getFastLogs() {} +void detect_I_M_overload() {} +void sync_inc_error() {} +void optical_bus_read() {} +void optical_bus_write(void){} void i_led1_on_off(int i) {} void modbus_table_can_in(void) {} + + +//void init_eva_timer2() {} +//void init_evb_timer3() {} +//void start_eva_timer2() {} +//void start_evb_timer3() {} +//int enable_er0_control() {} +//void i_led2_on_off() {} +//int InitXilinxSpartan2E(void (*int_handler)()) {} +//void start_int13_interrupt() {} +//void project_read_errors_controller() {} +//void project_run_init_all_plates() {} +//void calc_temper_acdrive() {} +//void calc_temper_edrk() {} +//void SendAll2SecondBS() {} +//void clear_errors() {} +//void clear_warnings() {} +//void detect_error_all() {} +//void read_plane_errors() {} +//void init_detect_overloads() {} +//void check_all_power_limits() {} +//void clear_mem() {} +//void modbusNetworkSharing() {} +//void modbusNetworkSharingCAN() {} +//void fillLogArea() {} +//void clear_table_remoute() {} +//void update_progress_load_hmi() {} +//void get_command_HMI() {} +//void update_svu_modbus_table() {} +//void calc_limit_overheat() {} +//void project_prepare_config() {} +//void pump_control() {} +//void start_wdog() {} +//void global_time_interrupt() {} +//void optical_bus_read_write_interrupt() {} +//void setup_sync_line() {} +//void setup_sync_int() {} +//void start_sync_interrupt() {} +//void rotorInit() {} +//void get_adr_pcb_controller() {} +//void InitCan() {} +//void CAN_cycle_send() {} +//int CAN_cycle_free(int box) {} +//int CAN_cycle_full_free(int box, int statistics_flag) {} +//int get_real_out_mbox(int type_box, int box) {} +//int CAN_may_be_send_cycle_fifo(void) {} +//void start_can_interrupt() {} +//void clear_modbus_table_in() {} +//void clear_modbus_table_out() {} +//void initModbusTable() {} +//void RS232_WorkingWith() {} +//void sbor_shema() {} +//void pwm_test_lines_start() {} +//void pwm_test_lines_stop() {} +//void KickDog() {} + + void init_flag_a(void) { @@ -363,10 +564,4 @@ void init_flag_a(void) *(pStr + i) = 0; } - *pStr = (int*)&a; - for (i = 0; i < sizeof(a) / sizeof(int); i++) { - *(pStr + i) = 0; - } - - } diff --git a/Inu/xilinx_wrapper/adc_sim.c b/Inu/xilinx_wrapper/adc_sim.c index d6ec37d..6c8d225 100644 --- a/Inu/xilinx_wrapper/adc_sim.c +++ b/Inu/xilinx_wrapper/adc_sim.c @@ -22,14 +22,14 @@ void Simulate_ADC(SimStruct* S) void Init_ADC_Simulation() { adcInitConvertion(&AdcSim.convertion, NORMA_ACP, 2.5, 4096); - adcInitMeasure(&AdcSim.udc1, K_LEM_ADC[0], R_ADC[0], DEFAULT_ZERO_ADC, 0); - adcInitMeasure(&AdcSim.udc2, K_LEM_ADC[1], R_ADC[1], DEFAULT_ZERO_ADC, 0); - adcInitMeasure(&AdcSim.ia1, K_LEM_ADC[2], R_ADC[2], DEFAULT_ZERO_ADC, 0); - adcInitMeasure(&AdcSim.ib1, K_LEM_ADC[3], R_ADC[3], DEFAULT_ZERO_ADC, 0); - adcInitMeasure(&AdcSim.ic1, K_LEM_ADC[4], R_ADC[4], DEFAULT_ZERO_ADC, 0); - adcInitMeasure(&AdcSim.ia2, K_LEM_ADC[5], R_ADC[5], DEFAULT_ZERO_ADC, 0); - adcInitMeasure(&AdcSim.ib2, K_LEM_ADC[6], R_ADC[6], DEFAULT_ZERO_ADC, 0); - adcInitMeasure(&AdcSim.ic2, K_LEM_ADC[7], R_ADC[7], DEFAULT_ZERO_ADC, 0); + adcInitMeasure(&AdcSim.udc1, K_LEM_ADC[0], R_ADC[0], DEFAULT_ZERO_ADC, UDC_SENS_MAX); + adcInitMeasure(&AdcSim.udc2, K_LEM_ADC[1], R_ADC[1], DEFAULT_ZERO_ADC, UDC_SENS_MAX); + adcInitMeasure(&AdcSim.ia1, K_LEM_ADC[2], R_ADC[2], DEFAULT_ZERO_ADC, IAC_SENS_MAX); + adcInitMeasure(&AdcSim.ib1, K_LEM_ADC[3], R_ADC[3], DEFAULT_ZERO_ADC, IAC_SENS_MAX); + adcInitMeasure(&AdcSim.ic1, K_LEM_ADC[4], R_ADC[4], DEFAULT_ZERO_ADC, IAC_SENS_MAX); + adcInitMeasure(&AdcSim.ia2, K_LEM_ADC[5], R_ADC[5], DEFAULT_ZERO_ADC, IAC_SENS_MAX); + adcInitMeasure(&AdcSim.ib2, K_LEM_ADC[6], R_ADC[6], DEFAULT_ZERO_ADC, IAC_SENS_MAX); + adcInitMeasure(&AdcSim.ic2, K_LEM_ADC[7], R_ADC[7], DEFAULT_ZERO_ADC, IAC_SENS_MAX); } @@ -69,6 +69,8 @@ void adcConvert(AdcConvertionHandle* hconv, AdcMeasureHandle* hmeasure, double r else if (realMeasure < -hmeasure->real_satur) realMeasure = -hmeasure->real_satur; } - hmeasure->adc_val = - (unsigned short)(realMeasure / hmeasure->k_lem_adc * hmeasure->r_adc / hconv->norma_adc / hconv->adc_amplitude * hconv->adc_bit_depth + (float)hmeasure->offset); + + hmeasure->adc_norm = realMeasure / hconv->norma_adc; + //hmeasure->adc_val = + // (unsigned short)(realMeasure / hmeasure->k_lem_adc * hmeasure->r_adc / hconv->norma_adc / hconv->adc_amplitude * hconv->adc_bit_depth + (float)hmeasure->offset); } \ No newline at end of file diff --git a/Inu/xilinx_wrapper/adc_sim.h b/Inu/xilinx_wrapper/adc_sim.h index 57453d1..bb5621e 100644 --- a/Inu/xilinx_wrapper/adc_sim.h +++ b/Inu/xilinx_wrapper/adc_sim.h @@ -34,6 +34,7 @@ typedef struct typedef struct { int adc_val; + double adc_norm; double real_satur; int r_adc; diff --git a/README.md b/README.md index 0713dda..aefd7b6 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ S-Function работает особым образом: на шаге `n` он Конфигурации оболочки: - `RUN_APP_MAIN_FUNC_THREAD` - создание и запуск отдельного потока для main() -- `DEKSTOP_CYCLES_FOR_MCU_APP` - количество циклов пустого for(;;), в течении которого будет работать поток main() +- `DEKSTOP_CYCLES_FOR_MCU_APP` - количество циклов пустого `for(;;)`, в течении которого будет работать поток main() - `MCU_CORE_CLOCK` - частота симулируемого процессора (пока нигде не используется) - `IN_PORT_WIDTH` - размерность входного вектора S-Function - `IN_PORT_NUMB` - количество входных векторов S-Function @@ -57,7 +57,7 @@ _Note: дефайн `RUN_APP_MAIN_FUNC_THREAD` пока выключен и по _Note for future: разные вектора можно использовать для разных плат_ ### Оболочка программы -Оболочка для программы позволяет имитировать реальный алгоритм программы. Она инициализирует её, запускает необходимые для её работы функции и связывает её с входами/выходами S-Function +Оболочка программы позволяет имитировать ёё реальный алгоритм. Оболочка инициализирует программу, запускает необходимые для её работы функции и связывает её с входами/выходами S-Function Ниже приведен перечень всех файлов и краткое описание зачем они нужны: - ***app_includes.h***     - включает все необходимые для симуляции заголовочные файлы программы @@ -72,13 +72,14 @@ _Note for future: разные вектора можно использоват Данная папка содержит исходный код приложения МК. При этом стандартные библиотеки, которые общие для всех проектов следует помещать в [папку с оболочкой программы](#оболочка-программы). Чтобы не редактировать исходники общих библиотек в каждом проекте. ### Симуляция плат -Модули в этой папке моделируют внешние платы. Пока более-менее сделан только ШИМ, но в будущем планируется расширение и вывод их в отельные S-Function. Чтобы сделать подобие корзины. +Модули в этой папке моделируют внешние платы. Пока более-менее сделан ШИМ и АЦП, но в будущем планируется расширение и вывод их в отельные S-Function. Чтобы сделать подобие корзины. -###### adc_sim -***adc_sim.c/.h*** - симуляция АЦП (пока просто заготовка) +###### Cимуляция АЦП (adc_sim.c/.h) +Пока не особо работает. Надо разобраться как конкретно преобразовывать физические величины в АЦПшные значения + +###### Cимуляция ШИМ (pwm_sim.c/.h) +Настраивает счетчик как в Xilinx и симулирует его работу. Есть главный таймер, каждое прерывание которого вызывается алгоритм управления. -###### pwm_sim -***pwm_sim.c/.h*** - симуляция ШИМ Поддерживает два режимы формирования ШИМ: - `PWM_SIMULATION_MODE_REGULAR_PWM` - формирование ШИМ для каждого таймера отдельно - `PWM_SIMULATION_MODE_TK_LINES` - через линии ТК для всей фазы разом diff --git a/init.m b/init.m index 202a5ac..824a92b 100644 --- a/init.m +++ b/init.m @@ -2,7 +2,7 @@ clear;% Ts = 10e-6;% -Decim = 20;% +Decim = 1;% Limit = 2000000;%- % Scope- tt tt = Ts*Decim*Limit; @@ -67,15 +67,15 @@ Inom = Snom/(Unom*SQRT3)*SQRT2*0.5;%0.5 - % Lls = Xls/(Fe*PI2);% % Llr = Xlr/(Fe*PI2);% % Lm = Xm/(Fe*PI2);% -Rs = 0.0362;% +Rs = 0.002%0.0362;% Xls = 0.4016;% -Rr = 0.139;% +Rr = 0.0021%0.139;% Xlr = 0.2006;% Xm = 5.2796;% -Fe = 18.2;% -Lls = Xls/(Fe*PI2);% -Llr = Xlr/(Fe*PI2);% -Lm = Xm/(Fe*PI2);% +Fe = 50;% +Lls = 0.0001467%Xls/(Fe*PI2);% +Llr = 0.00000923%Xlr/(Fe*PI2);% +Lm = 0.00421%Xm/(Fe*PI2);% % INU, Cdc = 50e-3; diff --git a/inu_23550.slx b/inu_23550.slx index 88a966b433204596706852d794191fb81cdcbceb..bf9107065b4ece6daeb51d2e4a5fed0addefcb38 100644 GIT binary patch delta 17449 zcmZ^}Q*b6+)TSNVNyq5ewr$(CZ9K7U8y(y1*zD+uZQJvH|35WVb1+qFAKmL@tMOX7k19c;!Yr@VH&Pt#n_OA9kXG;nS~3BUkb`b1ghM$Ey3JX1I0$d zlB@<6dU#$eT@VKlYXh9rId?Ac&$DSbqv7 zh%uLA>^k_NCPy)Q^VyHd`wa|v;aO&k-@@E6(qgxav|-gU9bF}ONLJ7iz-lMfvx$^n z{O){&C8j{9?SkExrvurC$|9vFePCkEY>_&+U09WgKqQWYt9iR;_RrTfm>g+Q84c zV&u3rajt(U_Mi2JEJ&s|84ml>>2kgM1NF405D55UUx!r03taZ`Hzk zT~=;=+5LTO*JzAgt{{-ajjmTme&Q zWAyF)o8`^t1$;7PZe*ltBlN2ML&I^^)H0c_4JdHx`wD!&X3>sl_)0C$(-$qvNJF~V z$$l=<1(wTHqgD6IU1Mf+w;ov+oCUJVYWw4no!@_ptET&mRmaGjD0vQ5K80?#DysciOV3flo)qo zB&~F!aXj&~iv%^Njua;xifD&J`hzoRW0SeGToeMJ%~?)ucxeD)G5MJMIQtkU7nTUy z`l|X*E{-*wWOCM;#1Op-2&Q>_%%%kdI*RE(bsiH_GbB{k^gPcDrpn!t<2!j)ZaXl| zL@Iwy_7zPc7WAc0KhKlug=ZWE(*$8Qv#N|r3$6g_G~=LQeU_Y$87o!h#(4`z_NKBu$t(^QwDy<6`4y2Vn9xLsPI7K`xv!a2Qaed~4K z2HSHH@4SW?rkUyhhzG`HC(gyvs&GE6* zOU+vTnSZ890%0Ygg6i&L|cMWJora z`HiXdYT+jwINrUCDah4B8}Hb7FlGBAqi~{zMs#-emS*q?sw4{zfdK*n0`uP>2FcKs z21RLRE+|2O7}ND(OIfR?1lT6*b6|W4^pi9J)pesJVG@dRCZa(-Vuojn5nIx#Y|N7J zoW>fHt}f-i{T&IxgJ4-N1K?ltU2mTF1=>FLsE=1Tm9nLsMK3LKw0?u(urziOM@8YT z9)@@x1*8+-W<{1pSN>JHn4=l)ZmJ<6`xv|lbC)#jAbtZ>FWZUm0Vprm_6A^apPjJT zyM`LJ3NLJ}xD@)g`mT{L^F_B-ipgG^zLCL9=~Fj<$pPe!;j64_qSR|n2b191rj6L6MA{@N-nT>_WkMz^K%vYV z94!p*IF{)O`3eN!tb4+Cg(;cuy0&KL&yb;?^Dlm_35Y`O0C3#i`MWut7)X>@j*sQ#D_TwDhu(H1h7Lw8Ffe0=uA+y%ZVOJgnJ5hoF4*G zvELj_w^!BQ5VDlOu|oP7etbshl}q}H?&7_^wi{N@*0+FL4!KUU{mR`JT<-! zJEyr~Iw>uCOq4?s&G~UYKr@+)@!e{k&#~Rlef1n90Kgq#rAdx@<(+<$5RbCUsl2P< zjlL4hodWrQmO>>8+j!IOlO4_~?mOTL_gANC&{9ZqF`a@;F;)524is(N36y*aO;BOg zqwP3L2`pOKEuBKaZz-EOp<02AXgGqPD!8RetYb=s)l{M&n^g9oNQ%uvV!G-B%xTiV zTUAs#KxM!@B}*P$Tzkkbi#D7C|6)XVI#r5>fT%O{;{@ltrN>nt<^oynMaRQo4Z2i5 zI}FxJa!AE~M$qf7x1{{rdU)S#0b)B!*%#2}v^~7eo6^84+B~aA`J#>yNK5}P7(>w! z^Nc*X#YrNo+WRn#05t>G?d6~Ub1$2{>J5b<8B)V}Pf|8-sQ~j+3PVgNkn{figW0_Y zn!r)@lY2C}?iBy^}rBS7Tg; zqUDl`Jtc=9VYYm(lhzNT)G4vda8FQ0_eYq;PgL9GWc8r)O>X62RjtZ3Yo^Ab!`_V> z#;qA}w3KXVB36Hw38bfoP_8ah+XNR4zen1DY+=kSsJij48LE10v&Qu3(yk18q=B2X zNv#sV;8Nyu#{ZdrMuIFTZZp(<0Vv#X-un6h5(tQHV#Wd(C{fDn!!JNBp7KqXeX~{a zv(az)5Uv?8&vqD$22UezS1czSCK!dX`QS*80N!#;Y_ zD_VtBW3>Lf!qs=Np*xaJ_gikQL@ zv)TARzURG*r+`DR$96z`&(1c!z5~Gwqf;0b4z~fIwi!^*wqCu$E>O#qls;T*dvN*1 z*|Vl(KbvfhvRFb$m>t0$-}&7)m~z1C*RQ>MT=XN8d=z1nM1FRNz3wAx)UhdM{Q2SM zsyR-(O@qWAl{|8T`ymh6o0m&*#{<7_muz@&=vO>rY3WEAegg1C_fe1^FmFO~wL?r0 zVqr%FtFdm#7^h0CwEd*+9TU@)lvMaoEgu_WlCKmd4|I>|BU5}-C+GlvR?|W&eMJds)}IhY5Dl{3zgOO)wSEpH?z9~_77T#!~#G> zZO7&Od9Kst0|CbMi44%A=pe3XX58k8nnWOkU-}CIgUH$+nV#C|;hs4N^@3z)EaS(A zbFa=WpG3PpCwuz1r8|yZuf#gNP%YV%Ic`B&4k-suHvTxJ!Wes}=bw*ci2Ea0E@>tE z@^L-YckSYu`#m?#gXYi%z&^844kEolBW3&0L7P z*}g-gbcN1ke)|Tdr)jHREcK24Kiq{`07%amUAGSu323o#2GN?Do;>iwR1lo>Tn&mA zicL--GeSYDap%b>pgPD{&493q6J5hA0LBSPn!dd_o$mY)biMYExu?`zrf-^vF&22Ys#0`=dBL%ok%4u~UF%@gQr>aSAO`ca=NxY;3hVv?#ha!- za*HMXdhwf~qcxin9L9H$Nd{v0{}!s-Hcz6teDfNzceTQHxSG@wyAfGr+JzVC;SZNi zge<*zyI=i;>@F9b6Ju5Rwlgho0P*rArh*YN3&xDryTsNkhFcJi` zwD2}zgu%+A!Z_;Xf$45oN($7gbkyck$J9-9{`pdVQdT{a=4MB53RFXt7EZDPVS+nd z=ZUAUzj%a<9ewjf6u1@F2|9ONA#&F9Gt_Ihkx`Y*0Wg_WRbbBjD+wd3030aMI*}`{Udxv0lR(3D{;L8H)*~o&G}a7rp%S}!{lWhH8++W$Y|dJ*=3qG zjymW({utKWQDL@IGa#8Rz{CaAe7$A@#WI8X8+X6r#n}mK&(|31>|VA(L8UE*{e~J2 z>CpY%?=KCRUK@Ok_y zX@kE*pS~Ye>2@P(14>`p$pO!2Y+s}dg2To4e{{mlHW~+T$O}MThdvXYyPBhVIwxtp zq(MRt=Iy&_Yj!%jNN-P|Y40K*2QP1Yj}Ag&N68~o%tNnuWEe)uS0dIo zEn-zfZrFu7hTl)iKJGSTr3_ASt9tD*srUM3+9-e8j7^>TrF!!rRaUvkAKrNbb{oqV zjaCi=Y6D2OoiYF>iVj7B&Ui$vRWk2jY{SssR}DrTwddEZR07WVGohazWHSBKgtAj+ z(O#?JdgvaHBKXSw+Jr4_ zFl~cmFN0k_;U=o-T_DsKAM)ls3p8;fVoZFVH737=b z9;dip9q$`(&p%~g9Gr1~N0;>Xem-BH#7wEiy^d?$zy0 z`z1U8xMsiz77yiS3M-Zu;<-ex0)QSU1Q2iO(FsXbn2@ZvmE=U0e#a<%v2&>t@3Zf0 zwia@CdupPPb8NLA%aE!& zEZC~Td{ZTIN55?!8+SE?}kAIHAx|#%lP%aSwo_>snB=6Vd4Zf4lg-^nFcoi+ntT;Odi< zr&j~UwoTLUdL(rcS_rMTB34?@be=}Re(C5Q*=;pmXqivVj-MwjlU764^nG%Dh(+ln zzE=Rnwt#%2*Wx{&UNVY_$zGEg^ZDXLpW~eW#(5WEs(y$63!AHkW`AZmEVhsW*diMn ziasu)3|%onP*t$B#s__HdNw=hG&i(@R#k+B?`2?~H%Y#8^E{q{IuN78dN$uy03R2D zbPG!&hpDEK)A3iR14_>DMPEMM-qz;EADtxp^fhZM!W>p5wC%_?4cEsd>>oM=@%hic z2&4VH6+lAK90(dz9XT(y)e+bLy6RHq7j$Z)*s}DaLfVR}&jd)I1NumRf5|6@8#$>A z6{6e*YZGN;`wzw{X0~2yIAvq z<7ZVv1vdg;i^uM%X6|jpIGup3FBOp_3n6?fjSS>Ez*Y#ug&1(j(pE$L>GCTpxgt<9D$P=Y;SMHEK= zr1J?8IpmolVsk-fhjelQxHJDHKt+a>^B$+CSCh@1QqG0ANKwo!)Bp0eQ1n*P$e3zY zKh*y3hbNMa=aPN0f0@58CRU-yshM>0m`X`ja1lMMPhmXmn8ade{XUn?@SYygWx!CA zApuA;jKMMua80LD0qN7AG3CC*mU7IPRN=L>R;aEuyo(a=5RV`hr1ohx?FIBG*-I~!l9E<@zY zc%n9QUsGkeQl*dhc-*2EV~HC&BOrjuV7;bhPA|CF!0ir40}pE>d>*z5@DSLr(IGkZ z@(w-m41+;{S(#JyG0>k=pKMAy(x;rwityIE^9L#6VF$l$>d2 zp4Xk&dO*M(b-7yWe(Q+Q!nLgr(01n*i+ehtIHhvgFjq@FI(6Bxm@7JEj1n&S0U(H5BX3)Zb4-AX=Gc?Wcnt zIb}%fMpu?$;TC6PitcNKv#5aUsFzb3t4O+ztZos5jVv`TECk#>31i9}Z#vx6yd$$1 zV$Y|r`5SNE`WfTZ{&^+r4igyP5y`xYb)Jw9=+`++O%lm)VkGnq5$QwtaTQ3usPkW zF%LYK#L+CDG%CBwWSiOBav1he>_EPf${A)vZWy|>=2s8c-IHP$1eVxkGfHj$_{L^0 zw~AzNN`6L_k1>A3{~sps|FOFEF)+{%P&jSoYVBSK5D?Sf83VAOL>U(lpl|@keJ+fE zoBBu<>sH<=a_8&r0V|zy(ozE@;bs-dhh3=VxbU@c=kk{R0Q-s{5Cxd&bV?=WbpOj6 z{EZ#%F=<{RtUI}nC@VD7&E=W&B3qaUGqgQGx6fp`yy4Fp??tQuTKN8UR=ImPkUmyf zv!8<4%rABOV}(tB$I(ju`v?Fi-+SHRz1qumO~Qh%zQCEnkvvM9jLI!awU3$Sx%YV)*|i>kB3(RlCWuXn@2XIinjClsGeu z&)_^N#$rYLo;RZo?0T2)n%@bZI=7m?IUj%uXE=mUL54MlH7pIRHv{xR*ltNbwp|XK zR4==2g+uvO6lsT7CjvT3(8;FPu5tO3ER|{NG>Uu!Pb%lh)~?SbC;XrcuaC1R5)zL+ z+RG-+$veonj8U5X2uxUn-$Y)K)(j%c%0M~)f%ys388m*uu@dZnZ}b}O(H&Xfy0`R5 zs)}(#&#TOYww5#HH3EE7f42d-tL;u=^LQ=cLb8z<14lgTtZ{x(bi#$yl}N&!O|8au z_#n5$+85CVYq#|mSV34ugA1wPl2~_d%N|ce{*4R}##SCr5E!$XN^dq-UB|%5C~as{ z^^$@;!S4=)?ZTieWttiHi`m`pNcG(Qdh@XI!-%Oh0Eo%|0-W$7fBcv;kk9m!AyjPR9il90k z1*1bC^o7o-*u%%b_|`gz$}jwz8~0z2iJ72eY{^{p<1+Dli=Efwr?UdG!Hx`KGTJKO1@e2tD(`;uvfEwZ*79A|zop8?_P?0yJw#OZfh0LAb3Z6jQB4`liZ$Z!3 zfR$hC)tq*)-g>+Fb?GW|SEK)tvFH6C*3Z{Dd4_Dg{rtMcXqmeE)baXj;AK$h-v@59 zr!DHc_g3b&TUU+XC`E$f(&sHKN?Q((mC8F?L66l9q1q>;Jxh^4f;0KCm>m>`zRCc0 zE%Fkar@Ap&`H*(m@&LejMQ;BC3krq_2R)wiFpLZWq67RN@J9$>W#?k>vbVd^w^!Zh z!2Is(A56*H=$t0|n@qP3Y`b*ZYn#$5oDNU#ldCXAL*;X~t2=0!&-=R3yw@!j^T-W_ z06UlcecxE>>h>r#mqge9`em_;x1-JWIJj#L-ZB&ZH`rnAA^3Z0l&a5;J8tJCz`#ePs0_E&D3?t2dLB3{fMX)x#lwsLC9x{*4odBb*Pjn}AGIb-JV6j7oN z%kLtV;U3|kRPPa4@G^ikSuts8Y7`VN)&W-=YCU6i@9z`<%I(h<%8ML^6RyNvqAnO4 zV(JC8KA}&iJ@enquKChWbaaOT%!Z)-d_~6+!WdlNVYiy~YDdYtCo1Yi8{BK#X^k%;IG$5=Q>~r7O@l@Zd4{L|x z`8~jE?_D+v>Q|jY4crEZ1Ijc#sZOpMPB?F4FX#~9u|L>dCk%s76eG{v?w2vrBmstq z0}+T(*;t`G_OX8b$FG`Y)6+GMG(u84)04I$SGf|9ho?-7JO}VGe^|BsSZw%LHW83G zA*G5*t{zeQL9UA{rTJ<3q2;U-HjrQZaC6RhBWq2V?Lilp$_>~BFia=7&={k_uCWJp zlUx^o$6P-@ku;;FCVFOiVkN&wf#s%Lngb9shXJmT`UuLK6)U{zOy7elWtt(p>H$2J zI8LpFe9s#$6N{mlW{tJKrb6Mrpn|zVOqs88Vn)44t$Gv&h)sP&kF!Q5XIRFpPbqlR z_Si03;`u$YCp!zWTp&Rw)6{}CEYQ`Adl?P@hZ2o7GWbxi{D=Nhe#N2R$ueYZx$=cG zZ$@!#6O_Z_b-2B%9#O6y+S0`!H}*Lu8J=!;62Do1r!%0d-FbS;@B4%p< zfd?qMBn7($!1~V%>kALQzz&f(D*XNzQ^(_b3DpE??;_ipJm0CL{h3b0$d5+Z$$A*- zl!GFm#~3t5Z^z3slYDF;@`?>>q8L5Cm_he<#AA3->O?12qk%(eRBY1}w8JG~*q1>2 zRubo}$=w&*W3ZPNweRJ&l*(BG88kJ(d_Nt0TML}if~1n=M$T!IFe_AwVd}FN&-*%T zF4S|J14Et>LioLRF`!2>PS0>f`ZXbG)WFhq%eY5t=VQVLdixgW>Gw7d(?V~jGA4#0QX(OfZSdAJlSM=_S72eC6* zr(hm%b$0wF;6>_>_kt_<-iQZ;fiw}fQO(iLkyfK&Ip0@P6b@rhFCE=&Tu#IiABiZT z756}Wj(+-Rpw=nrFsDJOfW51@#jIuc0{ipd?jGV-k@W=cCN00TJcdabjVe%Y;*~G& zINZ85y`cb8TjY0Dm7A_iYu2+^y*>Y$bm>3l1hp5tiDQt~$USqnztaGC5Yt#7hJlwm zVY?Gnzc*?7!FEIECfW}}CXC#g;RC=`Mdh;L(ki90Y^YTmS<KlMzFiiV0;H992+fBV~-v(Ud>Z^ z8(z;1qEG3TK}O1l;h~PP{n77`=0Fbk1<&u_ST8qOZp7b=$|N9x54Bpt6*En3 zl2redh$l8YOz~W}jEqPTG*+JE;7C1K5iS0plk_*8o+L!5<~<59{<}85W<^_mHA$EN zXSxDxN(?H@G-KABjPss(Q*i;-qz#8(O7R90Ip$Sg#tCQ1s z_L<&-+XP%Of6)sb+d#$I?3CgZaSI4(1gsbAF_u37GDO#XD!u5k$fPdKqr^L5LhyaWwXV~=B44Wtxe_Mt)4iW!sG%vdKO zczgPC;j@TI`^mub_1OFwJ`$B0Q4bc0v&1|J$~XmN$h?-*-k9?U%BP_eAMAypNTl_% z#H}wt*k!V6RE~s?lk1Y#^TkZ{$ysBSHA(0Jc!sR!uJ$r0f8@+#sYqrnag6iRM5B9r z$GRneDC-WSRSKs12krwfyO{Mtg>MU?5N^zq3}TqnfrbQ6tTeUp?FB zS#~Zh|5>jR>c}9=QQP$tlZc^WJW?uXiP{Mu0afQ^w@e_QSzctiQ6ws;)aK4+`L|-O zE%6xU#swdobSba_X+ar3r3rU|n}{urXyQk4Kg4u`lF^g{gsxYe*t_iyWbWr)F{V)3 zNt~!^!B6qT%+hvEAeWV{SUhyb4C5wWH-Ab-7k+^{?(S7n9mWqJ6wcU*ne zeEDOZyvH(yBZyKSCz|zkskbTx^RYZ~%%>5|B=jwga}1Xnao?oIIOH)h`G4nuI@CgV zuf$mR#T99&hrN^+FzGSV-PH~^$0Q8Eonya+VeUX6-lMH^BP-OGbx*(^uN1NI ziVItJEqtCK+pyq@Z`sTf(Dne-M8g;(sqaZv%DtA0Y6j|n1s=3Q@BmJFuq7GEPs>78 z{#G|nus+DfP%{Cwgnr^S3&BEX6s!wEZ+PHiuOjuX+lVjg29yPsRHkk2eYw|*_^C*7YEewIv%_J z=Is@^?1B8zL>llq69O=zor;6?N--Vq_#_E2qVdIv2m8W&_!eZ3?kNh;&zSz;k4>8V z7%5y92sK*^0oimi?{^|)0{j|MP0t7Vkv=ovww-s0mIJ@ypugX!wk6W9{_$>&1jEn_ zbBe1jm)T}lS)YqmROZ0`8`7^S_9uA*<)^JBw#*?uiE>?wkOlCzzZIRa&#QLO@rT)) zsNmswYy@HKr%h0?6;hN;9t-H_#nNm)wld-P4^gggW2Gq)Ou$x(&(jeTq$q$mxg2MZ zwq=w1&PAT5HUxX>R3TdKr?eO3SWMm-X^>T(60Y$R<%WiYSwGWT;kGwe`+fSjdFd(H zZ|J4ln8w&%kpa|nPmy==>uMwMtm^oa!j6IW!|vpD@;0%?FAWp%K#HoDK~e@;f{$5) zv9^I!P4#>9{2QBS0te_3186)&z*{|n*p1Kq>Q9+qhJJ%S(~B?JHEw?!N@B9d&V3T>olb?Q{gI_u27xk<<@ zgnUv|OE_N@(b-$Kf@1`NQQagfoNve`=a_sDQkE<_?5sr$tST-$BNCHdImuX~SlTwt zie7`H4S)e%P(jY)6|YXvBgc!@{jbU`|AcE;uUt&kS<3jBo1$)s8`BMcKh*;%$f#II zJPz(RhU1Y;5=y!#@rWCaYT)AWtZlj1)GBr{d@R%v`+;jxnN2yBRvk{|9~_*GX}bEX z-qep>6{a~`jq3(CYTey?g$dRgH!aIfFxj{QEWjV9wFxk+D`KsMOqU?I5=G38-%TzR zbdm&0@F$q+jrdd46wBm`Wyc_)se?%54H{7~=T;dPT#j>j@vcbx4eU1V70g=g-?s^iUXB#o-Mkpl zJij=A?9uF7MGi%a<1f&sQJcuPr+`SK6|5hMl!hnIU7^gyaUzJ`X$qNClbNY$q09a& zjA7tew`uSyTKm|MG_t5_Iv1Duu}qIfs{sg?6Yuw#nOVIHU}0XYtk1VZbVGgb9XuLM zqjK%Z!b&fXf6?sdSZz(t$RxRo|A)C4(C!~lf!(}v>?wBTIrecA+g|eOgMnPlKRZhG z(t+6oal8&ZYMVR4Q2op6)QQ!dw_!XD<=g*B^ncUNCr$K%78sBWS0+$;0B{`hd)v^M zdvV!e8KU3Fz(-X>TB@r?BpOWmnnOoD1jh(tV<`R#n4)74_u zbvvJ%_4>_`b!W+-5(WoZ;Osc7$d=9NEfBIq(FY$<(e~Xj&huo;8(X>mPGM=57f5h- zM){TAO%|-}bMV&kES&NKn3jju& zXEmWZm?0IeCN%J;PwS8*7y4T3HgK$Hh2lCBQtd+i4WM9w_2X|6gkbl_T^A@iP^=Wu zeoVPlrERWHqb0lq3NIR&1`8UNX$GLxR$CDhO*a?W3Q}XbnuMMKvxZ0ic^5~p+F$Ex z*AF zPM@Xd0BI~X@FS0w^jNXXcgEjZxl?v6kKaK*4-9#|h|^#y4;BY1IT=2@1^P@qsiiD! zmO19r8tdOdl*Ar`HtT|t*$efAPjssOo!biko!()S@=!9l~C+>nW*Q zE^Iw#MYM%nAHo6>9FF6q7QBg#{ItC}Aya;qMLc_er!NW=q4xOuwCRGLV=Uh`WtJnn zKDfOM@Spj&^%g%}k7+t>)gp(65A3?ax)moI35G<;RKCck7l&V-wQ=qVSty)K- z_xRvZF#I~?Z*?S~_Iw=iKJUSTrK3;;Z41-;rH0Jo>!sAT@AQ~DHWVwI(ND+Ps6q`m z^q2H0Ww17M*|2WSe6n5s()ux4o7&aH4;5N5)?J1?ce$I@8;VyOgRnm-tj+6d%jo0q zdCBmeSY)bDG}#X2g>(@49T1a*+_RYgg-Hs#Q&uCm7j;vx|(l zcR$4Jxqnqu@WaQd%wG#J@$)s=Z{LP8$+~I&S0Qp5`S)-MKLtEYe+&WK`Va)*TCZ&` zQwW|;x+RDkiKbCc#DIOW4?6AqkvQY`7h;G;!<{WL&{{ ziKkuzRj76y5OF`CAey2yx?30Uo)7)O@X56)>9U{n_O#=ijso{LhHGD7yhGc;qw^&j zBb25h`dteyLpawb%FNRi!&`Z8;EpDZd3&|I>5U@Q|Y{*KZ5}o&cE&qXk~Y z&h7W-oGOq;cco>KP+FQU@+f1 z2}$}i3VsH#-QqV=nW#Yg%E?DF7ZXdp?>Ng{&M4vp#RIUyr*(lg^=C4>Q;YU(9{NU8 z|BMY2=0M@QOc>P(dE7*772gTlY>ozX-^Re1(WtvQ#)q+g4?@nZ(4B;iEl8F|*oG$# z+{-+LLQdU1sFYV|5qpFis7AV_R{qz&i>w@(2Ux`*p`4K`@(vWi>&E*}%0*=jgYLxO zm93!`0|fUdou>YmM&R;aTE;+@$OlT;n)yJs2w62t7&JMe$v~IL;aU?_jLy}60<)Do zG1{S=@mC_9__i zA96Ge6gLJr=aEuPiI8%m8It&f4mZXJl~P6*7bpp+W5yQOe`|5+H{bA4icz7;&Jq3n z;o`}uW-flB6tB8aMNbzIEY-7YJ68Ex%<`c2tDjNrY&cx?0=2+gUqg zcyfah1L9;n8)03|5JLGIf>4s>pD#lg?VU_EW9^+X`9F5rW#kL}trxGi2S)wT41p?@ zrSDzms?w)NH-?PRtvOz7*OWt=cqol=I((O8Ti>^z%cD=Fn(cV~jz9PJqJTB|@`Dg# z#`W(q4d1u&FYaqOo3WC^^PAeK*JX*49O@=zfGj}Js(3sOI9te0STUmTk+B-`eJlIV z%3>;I+FZre?EZ*lX%Q!g>b@f#lLz}_wiJNAv+UQ(EH(R)w_;?9XW&4{h#@G)QwxhU z;eY4gvPC$IxA9XG(#B!JX!CRn2Ryr-W$XK)rL`^Ml$7QqWRqAc@?zT|Z|sqUSMQSs z%$>gX30|i-!1J5p*s~nvNS{nOvs}+T*1Im?+S?J0_DBSG7hkZ!;YN*le~e)GwYXCr*(7&o>VB7O61(WrFM<8F#nW6JKfFH6or{{--IE zpE{?VnXM~wX`Zznyrw~AdAWG$UeQ%bn#Y&VwT3sz)kCiogon~xaynZ}EAoExx#)@2 z$JeXUe7Uh$1xEA9OQg0nx&9`WRREdfsa_4}F&|+tv1Ggk6`Pp>X(kfI@f-sHvT^5d zl+{2RqSR0+sswk`w-^^DH|V1CZagzcM)jsOCE=*!M3X2ka1pU^2W*4{GMw2Shx2tR zCOeq{ZGCE*h9zOg+-a$LkRFRy5W=Bi_3G}*%e=uEwu)_=jxmn2LBWZl=GP*1Vkghx zzP!{g?&07?5!qA=guS4~ahf_njd&!;iH0VK-d{`<=fNf^SBfl1`VI{k`71B8vt}dQ z7-`6A(%DY{Z%1+@`lLWa$P_`2UMOg`0GfvO5yq;Om%?*9-=YHSfbS`@IC+Lf1LVG0 z=NBUwS$Db+SY-jY6m2(6G{1y&IYJKCNrtK$()RU> zFi+1w&jm8zw-`gov^2>8M^NiT5oD3EZtJuey+`0v*!$Dt$ppP%AlX}cxvIE`@nM>O zz^X~^4gcjfC_`DQ(1>LwvA&2!okIJ`??HLM2MR(TPI58++LN0pifOdc5mm!AE2Z(S zJ|ZDHeN86B1dG*D9dK$Z>+nMwNZpm&jEb}jMpea#Rf5durKSM^{4s(@o|aC{*$&cE zQy=e#x)sPnQIoD zhJGjrO_lmBEks-fh^K;%W78tdT8?hw#iWh}H~Y(_IJVwhnP@??CglE`Uwr$+J5Vi3 zQ4`j>dWjT)K8YzE_BwWH^PUZnK>9Hm1h^|-QcVsX&6X%l>#Rys`-m}dbMjmAjpHjx zs;b8U8ka=Ywpl@no=zuUin*kW!!%?Dhe-ogYeZ*UyPY-*(4#kp!DXe1Yxav}w|v-6 z;m^1k3-_VCNZ%a;b!wl6G&F{tG4mW*V!o{C)aXmQlT90o zO34ag2R4GiwjsH}YA3RR#jXr26sYMu)2<9AY&;LHvfjj(0^lPo-7~dw-Z_*MGagxF zLNUsj;7six*=FEG<_}-WQ8-rE#Pj>{lM~>n&71^VDoYM6Fm+;y!>h4fj8kG}B%8HY ztW4N*0kVXAkVh$@M;R*7Fuxn>8a$& z$bR~)H*em7M9>^UGBxukR-EEcL7QGV1u=!c$v`lmflMWlXaBgnP$OoCA>W6}DpO;q zR=|>}*2t?=yatadg35%P?M=muq&bei=@6GWp9H9nPOV;n!9U&Zn+Ce|9D&oj~` zwe&%4>@$0K&vaI_jV*r~($R#5|HOkbEUpvKse_$(lBtS_nBb4hTf3=2@myqOO5PX* z0}A2uX2Fwc_;B1Hfd9;162j$`q^c}ECDh+|Yfb3q`Q~{hO;O=#g`0{UbdwbM^`T ziRHkh(ye0Ru^Hn|(UORHBQOm6Z{MZ80NNI~I3AKDhnPQ9g-nM+U?}}2aF#E{!$f&# zzu6Y7F2Ug8r}&ajHBS|vAa)PuY_vzxekJ`BAA^uk#)=MePr59uXrohSR8q?Z+RHyY zN(mHz+tHT5lkp(LmvYbKzz2E!YL1evr71m%nHUp*$NM{NIAz+|iBRQ1e%o3u4e)le zFi*b67KAZwA!>g#z|Wne4M~waj#VRXGD&{!2f23)Ys!U1l9bS3s%0jzjk%4Gv2GMW zoKKG$fDXi=Xeo-r7+<_4R6!>d#v3{L5%Aa>PMUE#9RFH<1D86D%*;Eyr@=|)PR|!* zQ8k-zCfi?Fk`kLW89*DjBFewI2hcCl6UsXvhaXgD(&fTGdk_0pYkxQ_2ScBk*<8l% zuaIq9BSKwioJ`pb<;dFR#vLd(vs?e7?&g%zN%_9@gA60&-Z-Jpn@G`gJi8OnIc{tI z3?+&!^Zpf`zo9zMeO!aZw_o437~pNV*_YtVa>sT8iPCB?yKTgSJA6&4-%Y_=h3h_Xl0Z zT&*vG)Z3+C&Xyy2f~@ls7GTUyv`?f~E_$y(X%)nsMOZ&W-OEAH`+l2MNASMg(~))k zzjk5!v5zzE+5NaHe1D#q-S58}>+N%6e*P8ypLt8-$94688N0kw_XT~t|L5>m>61A% zU-D}oAA2wV^V*h={QLhOt^d@!@V@=$*!Pi9n|69$cRssp;q}d*k7e(-{`%fus=9t( z05aW8w_f8~>Vm)31NpLxe=XYDKdYsU+% zm2CYF*J{mwRqp$^<$b)z`R&iIoSU-mzoot3{KNI>(mpQ#k2}8K_Vszm>r#pR-|Na` z?#(gxTOoU;*z0ZCxy+b-KQ3SRuPoKixb^^+^Q{kMicN9O03MZ5RkZ7J&A;y2OAT(alh z?S&s7KA9~WmC~4Ien8`e&^&qhee$>3&$B;FepVQ#@Z@-j)AI_U^1oNF{*V^G-^t!A zdF^anEBkVb??>jxet$l<Cx0qPnJyY~D z!N*Z-pXSb3$H)pkCt9Kj&>UIxo*T$0NSIBrV4R+B$tXG9 N%%4$!?VAfo6ad4gqcQ*h delta 17571 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