From c06c89003ad0444445f6c942688cd13f2b353d06 Mon Sep 17 00:00:00 2001 From: Edward Emelianov Date: Thu, 6 Feb 2025 16:31:18 +0300 Subject: [PATCH] tested release compilation --- F3:F303/Multistepper/Readme.md | 17 ++++---- F3:F303/Multistepper/can.c | 14 ++++--- F3:F303/Multistepper/can.h | 2 +- F3:F303/Multistepper/commonproto.c | 3 +- F3:F303/Multistepper/flash.c | 11 +++-- F3:F303/Multistepper/multistepper.bin | Bin 29992 -> 27708 bytes .../Multistepper/multistepper.creator.user | 3 +- F3:F303/Multistepper/proto.c | 39 +++++++++++------- F3:F303/Multistepper/version.inc | 4 +- 9 files changed, 54 insertions(+), 39 deletions(-) diff --git a/F3:F303/Multistepper/Readme.md b/F3:F303/Multistepper/Readme.md index a666059..de880a4 100644 --- a/F3:F303/Multistepper/Readme.md +++ b/F3:F303/Multistepper/Readme.md @@ -368,6 +368,7 @@ In case of absence of `ACK` you can get message `CAN bus is off, try to restart ### canspeed N CAN bus speed (in kbps, 50 <= N <= 1500) In case of setter, store new speed value in global parameters (and if you call `saveconf` later, it will be saved in flash memory). +As getter show string like `canspeed=250kbps`. ### canstat Get CAN bus status: values of registers `CAN->MSR`, `CAN->TSR`, `CAN->RF0R` and `CAN->RF1F`. ### diagn[N] (37) G @@ -404,9 +405,10 @@ Dump motor flags' bits (for `motflagsN`) and reaction to limit switches (`eswrea bit5 - 5: [reserved] bit6 - 6,7: drvtype - driver type (0 - only step/dir, 1 - UART, 2 - SPI, 3 - reserved) End-switches reaction: - 0 - ignore end-switches - 1 - stop @ esw in any moving direction - 2 - stop only when moving in given direction (e.g. to minus @ESW0) + 0 - ignore both end-switches + 1 - ignore ESW1, ESW0 stops only when negative mowing + 2 - stop @ esw in any moving direction + 3 - stop only when moving in given direction (e.g. to minus @ESW0) ### dumpstates Dump motors' state codes (for getter `stateN`): @@ -484,6 +486,7 @@ external multiplexer status (<0 - disable, 0..7 - enable and set address). Motor number for next `pdn` commands (if you want to run custom commands by hands or in a batch). ### motreinit (25) Re-init motors after configuration changed. Some changes will run this automatically. +Answer - "OK" or error text. ### pdnN (43) GS Read/write TMC2209 (and other UART-based drivers) registers over uart @ motor number `motno`. For `pdnN=X` `N` is register number, `X` is data to write into it. Due to protocol's particulars @@ -498,6 +501,7 @@ Like `relpos` but with constant slowest speed (you can change it with `minspeed` Software reset. ### saveconf (13) Save current configuration into MCU flash memory. +Answer - "OK" or error text. ### screen* GS Enable (1) or disable (0) screen. ### speedlimit (20) G @@ -506,6 +510,7 @@ Get limiting speed for current microsteps setting. Get Nth motor state (`dumpstates`: 0-relax, 1-accel, 2-move, 3-mvslow, 4-decel, 5-stall, 6-err). ### stopN (30) Stop Nth motor with deceleration (moving by ramp). +Answer - "OK" or error text. ### time (10) G Get time from start (ms). ### tmcbus * GS @@ -554,22 +559,20 @@ Command codes described in USB answer for `dumpcmd`: 26 - goto 27 - relpos 28 - relslow - 29 - emstop N + 29 - emstop 30 - stop - 31 - emstop all 32 - gotoz 33 - state 35 - abspos 36 - motmul 37 - diagn 38 - eraseflash - 39 - udata - 40 - usartstatus 41 - vdrive 42 - vfive 43 - pdn 44 - motno 45 - drvtype + 46 - motcurrent Error codes (`dumperr`): diff --git a/F3:F303/Multistepper/can.c b/F3:F303/Multistepper/can.c index b109441..5a1a54d 100644 --- a/F3:F303/Multistepper/can.c +++ b/F3:F303/Multistepper/can.c @@ -22,9 +22,7 @@ #include "hardware.h" #include "strfunc.h" #include "usb_dev.h" -#ifdef EBUG #include "proto.h" -#endif // PD1 - Tx, PD0 - Rx !!! @@ -304,17 +302,21 @@ CAN_status CAN_send(uint8_t *msg, uint8_t len, uint16_t target_id){ return CAN_OK; } -void CAN_flood(CAN_message *msg, int incr){ +// return: 1 - flood is ON, 0 - flood is OFF +int CAN_flood(CAN_message *msg, int incr){ if(incr){ incrmessagectr = 0; incrflood = 1; - return; + return 1; }else incrflood = 0; - if(!msg) flood_msg = NULL; - else{ + if(!msg){ + flood_msg = NULL; + return 0; + }else{ memcpy(&loc_flood_msg, msg, sizeof(CAN_message)); flood_msg = &loc_flood_msg; } + return 1; } uint32_t CAN_speed(){ diff --git a/F3:F303/Multistepper/can.h b/F3:F303/Multistepper/can.h index feb3556..4dd0a0c 100644 --- a/F3:F303/Multistepper/can.h +++ b/F3:F303/Multistepper/can.h @@ -56,5 +56,5 @@ void CAN_printerr(); CAN_message *CAN_messagebuf_pop(); -void CAN_flood(CAN_message *msg, int incr); +int CAN_flood(CAN_message *msg, int incr); uint32_t CAN_speed(); diff --git a/F3:F303/Multistepper/commonproto.c b/F3:F303/Multistepper/commonproto.c index 1fc6c5d..1ad292d 100644 --- a/F3:F303/Multistepper/commonproto.c +++ b/F3:F303/Multistepper/commonproto.c @@ -275,7 +275,6 @@ errcodes cu_mcuvdd(uint8_t par, int32_t *val){ errcodes cu_microsteps(uint8_t _U_ par, int32_t _U_ *val){ uint8_t n; CHECKN(n, par); - USB_sendstr("===> val="); printi(*val); newline(); if(ISSETTER(par)){ #if MICROSTEPSMAX > 512 #error "Change the code anywhere!" @@ -443,7 +442,7 @@ errcodes cu_usartstatus(uint8_t _U_ par, int32_t _U_ *val){ // V*10 errcodes cu_vdrive(uint8_t par, int32_t _U_ *val){ NOPARCHK(par); - *val = getADCvoltage(ADC_VDRIVE); + *val = getADCvoltage(ADC_VDRIVE) * 11; return ERR_OK; } diff --git a/F3:F303/Multistepper/flash.c b/F3:F303/Multistepper/flash.c index d738549..f1a667a 100644 --- a/F3:F303/Multistepper/flash.c +++ b/F3:F303/Multistepper/flash.c @@ -152,9 +152,9 @@ static int write2flash(const void *start, const void *wrdata, uint32_t stor_size // erase Nth page of flash storage (flash should be prepared!) static int erase_pageN(int N){ int ret = 0; -#ifdef EBUG +//#ifdef EBUG USB_sendstr("Erase block #"); printu(N); newline(); -#endif +//#endif FLASH->AR = (uint32_t)Flash_Data + N*FLASH_blocksize; FLASH->CR |= FLASH_CR_STRT; while(FLASH->SR & FLASH_SR_BSY) IWDG->KR = IWDG_REFRESH; @@ -185,13 +185,16 @@ int erase_storage(int npage){ FLASH->KEYR = FLASH_KEY1; FLASH->KEYR = FLASH_KEY2; } - /*USB_sendstr("size/block size/nblocks/FLASH_SIZE: "); printu(flsz); +//* + USB_sendstr("size/block size/nblocks/FLASH_SIZE: "); printu(flsz); USB_putbyte('/'); printu(FLASH_blocksize); USB_putbyte('/'); - printu(nblocks); USB_putbyte('/'); printu(FLASH_SIZE); newline(); USB_sendall();*/ + printu(flsz / FLASH_blocksize); USB_putbyte('/'); printu(FLASH_SIZE); newline(); +//*/ while(FLASH->SR & FLASH_SR_BSY) IWDG->KR = IWDG_REFRESH; FLASH->SR = FLASH_SR_EOP | FLASH_SR_PGERR | FLASH_SR_WRPERR; FLASH->CR |= FLASH_CR_PER; for(uint32_t i = start; i < end; ++i){ + IWDG->KR = IWDG_REFRESH; if(erase_pageN(i)){ ret = 1; break; diff --git a/F3:F303/Multistepper/multistepper.bin b/F3:F303/Multistepper/multistepper.bin index 7451c881d1c307e5f941a1af5bc083f9e1ca0b01..b4e5f177e9dfcbd37437d8613d401444df3981dc 100755 GIT binary patch literal 27708 zcmbuo30#v`_BVc?JP8Q_6+~M=)Q3d{0S#bVs%;G+#IU1iYweb>XlM}-&|0T622g9O zopEU$TspPdMO!y;nOf^W)lTg;leo;_Hqxn@R$3<@n1@C3|DGp7?aXg}@BjV0_H*;x zd!BR8J@?#m&OLW|C}W)PWdc(*$e3#Pza{o>{|JW?f$2Ft@IUMPJB|O_a!n*tnUMmK zsP4|;O!X#G4bq_dn5rAkt4MaF|6AJk;vfBgtbZ@9|G)Wz=+A${4af*uwNV${6k-TC zkQG)Gptj|g$dYAKSest15oHr2k+$l(?aEA5#*;PEEzgMZOyjMoRest!r-sirRZL?| zEsP1w#I)>bruENQzw(##f-L_NJwB5tJ!!qSe*BNll!)9ZE43Z7qPFWExwxDu+O27d zu8-5S*Hgk{OlL*bd|52D^6lEeCm3t9a-(~Gduw&4Hc#Ge)yun@^{TcSf2&hqKJ8XR zw8^Kd*}#KBq!oDmO!!7rnG{{kY1X9NPPyS5(O=L;n5;%IJnvmm-nvVa3)ieutVe%v z*2o0ho60_bW8^C9KxStT)Q=e z>uOHn+v<23(pM`(UTd+eYb?0w%Z1dk2J5sC)UnHb&PH`wXO?$bXGA&u<#URL0XkIS ze>NyRs*@Gz@s0`Qovffn+{*M4hF@k_QSwp0biWLOX~$T@QM+ik^<0rEC zS@h5L+)jUeBlxAUkj4f4o8?Re*`~gRaaJ3qj<4Id#*ln&boS`n8iU@Tjf-y5M!nl; zG=v-6uF>utZF1SV#&`7N4}aV~b%?Bm-v?RLMO%hvYHv+lz-eoo8ZO3^aqGjevQ}=& zV)Hz}TRj&#uj$$5cPfg`dFFd9Wt4CM(49RO#!D7kt+4lV4ZJhn*b` znd)pWX9T@={HCwZ+=gJodQ16DUlve1O8;(RkjVMTkoH60nJ`!`oUP3Lz4)$h>}E<3 z7yFb=7W=r3#irZlXR?Sn*6}`r&RWv{C|(o3F6Es|`Sm)5P3N@ASmakluZUYU%bXe+ z-x})^ex@K}yfzg!6Qq4Qqpnk%A7l#L=R7)2{>|Arxl@P}#-hKljWQguKu>%gt9{<^ zMKE}I0ld6$1iUmie(cCL=B6JnZ9r?Dw$6ClI#vXI(0uENRvbEO_Z{jSElam?<0so# z%pUuPjzFJ}&V1mIIY;wcZ0_|__sMM}DYq-G|82+b#rHJA6h78RlKOo^RN(v-@dpi? zu-4v&x9@8_rPu6N97#qcG%T>6O{lY9awwyJvQNz9HnRGV8ejj7m9tH3!qUzc_hP(b zrgm2BCCWarOFPTZr2dEMQZJx2A|k2n<{oJq`0*6>Ago*%3`CNWRY{iW(08K zW%kJy79ME5FC*WY=TO8Bw)p}peeWN^$?%L1#48$3aJzoK&4J6UnnxT2|3JK^dB|~O zB^MiNh;HH{Ml?*Z{879T5Mq^Q&auXO?Vzd2?H=$^ze8S5{tD?;Kj_H;ezDTPVwrQT zRc4U24i&knQ}zq7J?AvBdVBt2-g%kLjyBo0w`=6BjmqdJTDZgj0~_PpI^1c>jkgB? z|NVB2BB_Bet~4s+__oh|oabtFgG>?jWP{MEi;b`iTg>82w#(wlW~!@bMXg-mD_Goh z+q>-=A4S`8-gkn$EtUUgOL3a4<%a!%xS!6IJC~*=8~jYpPb;Ps#GVH?Tq28o#0DBs z>Q)w)dtER8=|Vy*@t|tbJ309X;zGg2Q~Um=CL7gck$GW$ri+gCi)D#78>s!jR>g$v z?PmG#bBeeRTb_s-?ySh&-X`b&Z0Fk)!-*P;{e#qF-?;7VDL#%CP1H}0hoY`KSS0at z2y)%Habt+{Aiub7pTaQMAUBLSJhXKfYW}K$WEUUnXXhqyI|b-kj(eFd*Xe#pZI6ci zJCAyxsS=b^cG|ejEVliEvX^%~WTN-1iC;Y8u$*Kx)lZ^EzPI8)-M-*#Zq1-}rJNhf z!etR??cv_Te2l;C*@n!pmPUE>lZ~DB0ONQ)iwvsb_f??p!3K@y@v!lF^3DNOzOjln zAKB`rCz3QtK~t#Wlp+$w+N6xit`0Z_a-Zy5L0k-<6vt>g=d?a#@Y#l|d3kFRj6K_qWyc|A5 ztE&@T0yp-&Bfvl~(#gMaO!)SjZ@w9v!6IwXj&N853b&>LW18lGI@^`_KetHjwYLNq zG+sJHLm54+jVd>(_{)CbK~?g^Pvvj-G8{`!60p{B4AlSaH7qBP7N#YU{r z?PvlI`!|oMLyk8*Y6&xBHgJ!975sqS&pb0!b$u9I-Hih;``Ys;4FY66al@N6J4beA&KP(;%%0@1H&-14m*#wuJ z8z=8tu|Uxt%=Q+zUHdTi?J4-_0^zDN>Y#6o4{ll}sunB*WV$8w*6%1{f$z;XiAM+K zMVcd>2W&seQhf~Dbw`>iENn#Zh~{9;{=fam9$2G$uT8F?{=KPNX4ug*+)$hrji<>F zsZVam8a0}H^iy(?dyahc8Xb4ul;(F~zoioW*>Bn}^=Ci&(P$+D}B$+_e(y^8uD z%S3MCcGM&MLNC4?wKs*D42`C%4wK<~hXyjZ`oh|M?;YkMi**hrnxR{j^xKDFb4Lw6Xobt--vtm|)HWpq#@^j<}MsvKP_m*QI zwh7J1w?uYYQzM;Peq-YZ`Ixg62ky&Q2dTw2a02P1imOFw{c4)0EDd3X($3F1(`-b5;xlYd4r#(*fH}R3J5r!Cp*6>L? z8{)G6S$t%T+qI{kABEgj-%Ec-|F49O)MqrXxF75s#d5D)u>+dGVq5KQSH7FYU9@*N z2K0d9&dXw+wRT@UczIn^GU8`*!{97vS$mw%)fc!3_#IATVDX~eQRsFp?&qSf7IxTM zKr^U8MiEjC0}o@}tlnFKZAz%)vjt0c^ocQ97~^EfacmM~v-PXT6-f{60hk+sIYh#o;f@BTuY{Q;VWtB!R=-|61ia+PrhJmww^ zysm!gd9sA}fEVw5;BmlnNO1cFa4P z9tZuBuX{RAT0;sJJS&i1Mp}vV2GUlfT}Y~fT3@&8WZ%&rRN7sLQ|06(ktz<3$;rLt zuByd+_r5qM0W>kcMT6ge^e)%=AZ8A=6^8lRlyOlPxy|m_aV@oCUII5sVQ6!3oA-CI za``E$$D$O5e>#HDi{D^HBHLGS^pH3woG5S71=$7zUfDm$xI&zrLht-he%_0xM!v|K zS0Vo_^8b)@_+#*`na)(vGUy!gok+t_Zn~NKJ4L!r=2sTX2n9i@Uz-TRnr@RV{>)nC ztViKIkPJWj^aAC?+I=%x&WNVzNC_Y5dTmN4&nu!{7n$~Tk<%!heM&Yy&7SMz{a+Vl zY_6e9Kd7BkCY?K0Rlb z>sGD)8I~;D=fr$Ra-*loxs>^<)&72ibDc_wtJg)JfY(I@IF<{qi@av8;Un~w>`+=4 zV7;L^I4qOb*X>)6=#fQ?P;%>(XWjyKX4q2!g*W9gs>yBk&*Ge;IbT_1=Yq({&Wgg6 zPHO_BG<}))G#8S}MFc=+3*0D8CoLQBrOtyaqHdqRArM-T?>6nfKO;DEo%nR%DMUfP&?1F z2>8Phg=s0*Wf9%>2one0ra0-|e(@PZg-beyU($7YH#%J%%(Yqhb>ddxv}o064#=Xc zW47r=nzj^-wejO)u~Hao%k6B|Uo>-i(->%B^)rPR3!W)m+r2|OeH16W%F;Sn8tdWO zS&yuP#XVCLQgGhnb3u-EhHqw(?;35Y7{w?CAu3zU7aXRjE#?;dUNoO|NHYJ9wFY!9 zO$}>eYE@)_(>X+DlP6thWWIbx0HTh4ELh*%STT)ootW=D@nosM?If)v36m`GT(G9$ zP?vRSAXa8?iAoKkFygJ}KI5B%- zj-pM=hah5Y5a$N$7guOdW5X*!Wd`<-^<@r8TR*f+nDTJF?C%*BS%;p)52Jj|3M_$Kyl)TtRL?kZTo8qAWDxK(O(M}t; zlL;HZ_X_dp6u0Y#emtkM=*u?fpN3$C&Z+2+9Q~PWVCYXmKT8g7;snC`hHTb5r^Np# z=CUZkz)f(%KlAt<{EQrBhj7*+W)j4{XvA!_&ero zHjEjGhkaOIGuYnJXb!!vn5H^N^A!_R&`D)92PsrcGlJhxSQ^?9*89q0Lv6vCd|NZK z{iqGn9Pll%iTae0_|+zi(G6>o2}}sl1vhD(96RMBJ8O0Fthtf&O6{p7vOvOBl>}=~ z`|xM?^;n%+U+B3cAJTW?i*zX9pd9i(=FV#vk{PCdLwqAa7OSxFvHmthwl*dN9OaPS z=-vWbaoORwn5Q%+Oa#Uad-F{#ARhY>C0c*ONM_kJ#)Ne2iOIM&y`oV(kZ@3(o5v+> zZhT9(4JBq1kFvI9JR9Q^g7Wm!;)(DL-CL%Q*B?iY#Z&pTcqJkC`Z8tQrA@lH^BWLZ zv)J!#VHu}GV4HcdmPjYZ$C{3#bYl8(@yhgYJs+}Gd_RDVsT0|BKc(XAWc?|zS#wHk z6*id#ta2zy7muoqdDS!GGVry#xc=<6U@?Q6ONOA`A|ff{%ri07=_nFv02{Ze{;sAb7E1TUf5tpL3OOZOQ%;Fn!?&3`gD;DpwjL0defFnb=gm}5;-^?@x3S*O-3L`@ev2r`K!7erj{7p1**9%seV=OmAQZTzV3+_`Kdh*0s0%1JEihNJx07=gz`^Pd16m|X7Eb4Yd#>~cT>DL zwkI~@wB>@*=WM(Y^Jq9{I&HbA>^(C!Yf|L*rpS^VX{k;bA8CH*+-32NeMoDRy^6WO z9RIb*wi5NGZi?OXp!kVI@pkuIb7V;>RzZ>G?=9z)^0S2bz2&^J=ZpZF-&-#D_@50x zjuZSdf=VJmKgdkJk=7UZePBo0WBR{hcKVm&B=%TpA;)iA?$N9QzLHKZ1erFHo0s;{ ztN;2|kJya%K1=B-`B8I2J!^GOc~thA?k(S8H;KdAfi;NlF2LNzRHYpHVM?h(yUpSx zou?JT-O?Gxt;2YNd?w)e{T3x3>`{n)uqGI(r+OKOA-?8kmXk|7$qQ5BdaxG~Yvj*4d< z;H=C_dVB92H6>j4CY8Z|L1!8kE@(%5UJh!UNXlSP=_u6M*}L%-`#zuUD%ByGGb#$+5Y$l9%gp|>-kpcA`tbK^$cNPDX#06Q>|_R6#qqJOiZU8cBZkAyaH&^z&H zaC)$0B_Cs_jaDthBkZGp>tX-w4;@2cC557&qFu*?thUnd{F}GQChdnlg$801D$(U)ArM(u?hY|MUz5xdYXJSm`e%NPR z#*;pPB1iM$2v8)gAh_BBXrN#S)DuR}6_5UtzQ7Nqf|gGhXbs8sH-MJX$Ns2ZV?cbS ziL8Jf)+ySQD!;|`;`?h>0+tLLKh(>xUyafl#n>Ml+*l24Myw+}6%T@%dULaYevJUHm!ZeeO>`B+fN8^xkSGJzWb;{H1ov+M|`M zZJLrxYPh4N0fs+{2Ga+k0b^O-t2vCENfGs}gF_4_9;J6*IAl?OmiA;k{?<8-I7s>XgEZ*>vh2wNm5=)GTzzDYhxQl!XIVP;mFf(9B3UF8;Gd?c z7qjs>SZk%)Vt;{~TEbtK$s?}weCl<1YMr^&!3iD-9rq2f`7IVQE-JH{ayyv``a;^xh25ZeX5@J1eQ{&a;8emuzQU4my@fy!K6K~1n8x#Zm1%2j^K5Xa~Ow=ES zm=!Q+f)ed3Z7Pe~RoXlIFs*?&B=X(x)v%>5n*wE-v^E;3qqc#zcV<@|4aQvZSYLnv zF?fWnkxT4%J=CWfj}u7D`>LbK-gf+`jvV~J3X`Qesy-EZlYCS;hG8-ALu0?o-Fu~x zdsIk$A*{Kv%g&-a@6ji4uZZT)EsgXuQEY+r7bM**KhChmmhsW@CN>5u=NTalL3%_X ziGC(pc@3(jE-EO@)tKR54NVk;5|VIG2|p+MpHnmfrUEhOQ+`hh6*> zaYo=JzCGAS)@JYtHXITS74M6NX6$2%+6F59!|MUb!-z-mu0j!Y25}SlW(~y#@^G|E za#q=cGB&dyJ!#tsL`lTokPI6|LfT!22N?&!PuH={ScVzca-I63R<~TIykHA%Mx6e= z)C$#*MO|`iW{Rlu-WZqK5i&Phj^E@8M{pGfa91F8^(emU>r|h(1e}V>o#9dAVq)d- z4Dxv??YcZoPrp%$m&T-?SRCcEVzK_ZkKRDPQEc%Hg*=rage@jsxMX?~aY-ojmyL-t zz^mccf#2^PEb20z=N+HF6z_w+0{)$Y6)|mK<{ZlmW$;;f#2nKmO8_E=O%^&$-emI2 z+++zXKpc0#%zR^~FiQCm_v-U!;?>vVF-I;U2q?eq^&n@*x;NHQ!k6s5^dUo*UGs5Y$8$xd%D$P5*Rg0$$S0>fcla?`_xt-5uMveQa~V0gq( z2MBMdZ`=xL2!=*o5N-q{8LW*vb(+0x>p-j=QirtIX~n{V%A0_cI#H^dQSx# z{0yCrNg7%Ba>$_+vn2V-p&6mXt-P^D zE#7cE|Mt(S=fAiyb_o;a-B_`t?}lT^iJ#dL+DrNb>%gR>d@W;3^q#$w9QV-7po|eK zhpxQ*^UyhO|2*`0Pyy|EO9rTI4t?mxTq;eTcVo=+pugnijlpwP-1uP0i#NtB8ED~t zw5>Y&G3XzowIVd5dBQE2Xzz>WEjpW_R^I+ux#aTCN{RNo8?P*R<;MHq z`imtVn#6DU&^qleX(tsAG~Jk1gwESgJSzB8BlQ0#zRUw^|I zv6I964Bk9*D%owt!PUFB7rDL?t{F)N16>(P6&2S!fqUIB< zXRMeleAoQ^2k%h*tJOob3z5xP zd;NEO`;t_?>pPymH4Qk->8PD~Zo5?TTFo{*J-qzGTWbdP6+f~6`n$IzjK9|Y`rKwI z_i1g>xlPDvoy|2%$9P&8)yFn19lzC&YtEf_gS_u>wuX8gdk(Z3@4Rz+$4Vvj=gOY0MgDdgq@ICBoG zeGKy5Adj)BWIo5_n!ZS{gWm{afw4-6vE$*PqAQb)YANjv~uQ<4ZAg4 z_7#qL$TVkAiK_MbHNTeu|2o-+`BaoKgwLwtJmp z6DVA^v(3s_ZO5}U^~SHR)=M;hzh~*KU+>+3yiL;Aepf$sO_p{Z+P&DZR>F98kG5ll z^>(>I-$+<5?pfp5-kw{vz3aiG?OngAqIbS~#+`dnsyPUr zE#?-?Qg5H!Jpz<|fLGX=^by`O=kKiZ zq&CcZo^=#Uxm9}-&J`iIwDWOq-P}Iv^_1PWuWfIyg;!5X+TIZvNf>DoM!(A`$z}ZR zpMY@*)K^9-L49iH$~_~`&5&qmyqKR$-eLIezXLM_n1%38H+kY@Bkl^1gP-_)QlQlP zkM|4*uhS)J+dFjVb&5?Zaky=d3gh}%=6dnz1h$?e+=x-#0oXT4Un4&b&swCtj?vKA zw{g$lw(Fn$-(O)HN5@RPHF$4S_V|!58*6dmM|&)uy_Kb%|JXww_=IG|jlY58g^CT-T~Rz{^)lY*;m1ZXRKtW1NLZyJ(4ZXx%AiOJmkra zODXbz}@A>iDC&_kc%`h7@2Dl57#^;4y@z<{V zPVKDP8=7$eeS12g!qMhS(osTtsb|Zjo{ijts1v8KWWRJ?=Cr@+7|_(EozwTAj@>WQ zbLzO+cgHohnU9_7s@~(15rMmTJWiO2RH6Y$i%j{RFaBVHGMabG~yEE|mTWI=|z1U`aHjhh63 z%GqI2FRaz2**1u2NgKPr64vX&ZEXCfO)TP7@hd_8;m{v(W2i0F-=}T0zkk<^mskIw zWE{@8Rk15j1FP#udPXAp7Whb0q-C@6Jv)nxG|B1S&?_G5HamE?;;!BjRk%;D*%g$lC0)$J4T zmgvKr{Z`-;7H%8{peg~n(|W^QMN?6|m6U`=$pr0Hh)@BA|T(^u(yPWffv zHmx6zv=R5id^3GB*6ZY_SU4af*6Vt4`sy#zJrtrtV_x(EQ_=H;KaIWBxVs}Ods8M0 zSFfF8iE#3=IVQ>tb@~tSv%Q%vZ)HuMlH8`=#3jC_Q?Khf{oBk?+#-%}S}Q|=9co#_ zsn5Qa&I32pvW}CV9l*SGdYOc&>$E0%FxT?xGgdF=2CT2|V*V=qrA)QuSH=kE{W6_% zm`rV&ZK77NKKHirdrp03fw%6P+`V<5$GV<)*EwY}7VhbR%;_&vjrX?|r7NU9c*=Ks z(RtdOVNNf|nr?b3QyK2W{?0NnGH;D3&@`t+*V!kVV?JM^PCaklgwoZBO=eoNdTw~; zI@f4t<)oT@3a}sexS=3F$H$bPv%-|0o@&bN+f9fs$qtwmu;)`)*Va6JcA?pp04fo}*trE`OxsMFF@>h@K(~1q*0R%6 z&1nU4Q>`h?kZSr2`$*iR+pZ7#=`O>l%m>rwJWo3*a|&<==wX>{&hu|zC7zh6$w=#% zH8bnhH)%3K+wsqok)|+=M3`Zt33!ubw(l)0w#OcmIW9ePB~D_-e9mA)7`j)UB#rYaU!%CHpj4kuu>SXxcbcc^i3u8#*JAdw@qd>_Kx7dOy^6uaM~L> zZ{~_34c=S8>%$DIGF~Sdw7XymD+(*VSoCyJaM2M_$JUxK54o46zhcZR$#rhkVaFgp z6L_gSG-`UC=?#;%!;!SsM6@aW9%$UjHBMny?S{ z_y3{QIe>dw3^m-_=2{Dj>Ao-{^M7mcFKCgtN>5KWW@PBHrri=3K4Y#ohZg2`t}`V^ z%r49@D}{`X6xm9%y3kaj%g|+OaaY9z8{}Dw>7;3@@lDf%;WpEB(=f}U>H5wCMZ=Jz zyZOWL?U8li(1=pa>%hyvev+>9K!KW`7&EmbHH;l(;r7a6XhVqQTV*$KloFNs8t~+@ z*Y4m^@7z@b5)HI`1I!WW!;P<5giH_Sv69j0y3Xc^V`kcq)^>yp4aV&)l`trx-V{nU z1KT=Zl85_s_hkkdhh+dOfhz#su#f^^gF3Ho>zz#v!pV zWt!kGS23AZ%UB-mov7rnA3f7bx(+KK+dNm2j&>T-FNOyE0*| z5uv6QoPf(WZ4TYv)w9(9^p13?ygsueRDK~<=46$8Cw8h*SDCkEUO*h6bq-y&HFHGC zX5>`MHhXFCU3vMNOP-TpE#eNI)@K{)h*FEVE9ipwjqp_HdR?<~b=}%bK*Kj%PKvuC zX@2Exx>va+SgZ7Tus@F69O{eceN)W^(WWKXN%7+(7N>QFyi%9_ttj88X#a^Ry7p8l z+IPtmT`OKvbp7E)Mc0M}$~6jn_cF?GSq#|bvnJDU#IV+&HUzeElT>jE+?n)g=X`wI zWxjm7oL9HY)PC)9KUq8G2WLSIw{b`azP$}E|MpTIeJj*FRkE@rVThB+Upk>mG@ zm5V8}B`oHU53Z5LoVK?%e*2>=@wRK)?Eu_ox`cepV&)uL=i8u&Ibna&82&Vu@MWVS zCVb}6bC0J#ksFTh~@#X5d{pX(d9Y_nn$i#}kBS*%#=6LZ*x?;vnn>)Rhy;NeN^C){>D z-py~GYUJBB+}Dk=^|xKBZW&g^ncY(mIm^1yKW6piqA#HabJnd;Yz%2oJdFNyRITs{ zkEwXx0ckI|AhLi@M8-Z5h31z+<8xUr=lr0TReT}_1o*eD30SFX?y%L$gq^^Pt{7|7 zh{N!^59bdLr*IF$HeNPkr_gLDjKR&C@XO-rX0DwZysx+4DfB2^KJ`zFQO&~R--vMm zhZ`XeC5!&Mcw#}Yh3IK-epCC3&V4IuZ=h8!fSbVR3fuG=6QoEG|Ay{ru|Qe*R_w`ndr8q#jXUsZZ3`gvHcbE{6IG3KdH` zf7k=fh|xMrYtdt_wb71I=em|G@aRw4ZPFbUt#wYXZA|CKnP$quCsrg>Y`eBEJ=kJ? zoW)Qrs-wM`Tw4SAytr2$ei*#PRFI4UtR$mS$0gWCy|_A&k5I&}#0dq~VYQpPztXa} z$_w+t>ctcJZ{;j)R8910OH+@vtrEYgm}00G(;_!vr^pR&&txl60vsN~{g50tvsBpU zGO_*QjG!dL@WVl^o6-VpNun%vE#gWxaoUAP4D-T>VhiGGs*k$DXu}!DX7P-M#r|xo z&17wIU-B}lwpV>6Ps42#^CG!*eJ)*ppX+1y5@R3kFdi0X@O`c?Z}++Oy17k_4N;BM zdUe)j+@9fm@$Jf#CwpqU!}NmC=epv?7f3_;T#dl4cfXU?X;%Y!&dnzN@q8cFhxPb+ z1>X@UX&3XK)(c`ZzLL{A&)0B~UyIS23!=a-h*82CtWv+N(cXL+UM37WZS5Gd{DK&q zmpUp&AFJou-H&_@k0EQ_l7{`nnjh(li(GXaZZ5_&cQn+j)SYZXJq<=%wyllHPBxti zZtSv_vzsk7Mq}X4KG*O1S;QJ0S`@T5x6}-3Pvt{rz9s4*73REEqlJG9SpJxCPABdqJ4Y@^={7!){$5njomBe+>ZQrHDjgxKUQcvzO0Fo z@*g1IP!l2LpIX6p$y49N{+8BRQ!~mqI%{-xpLGAf&o$nyG4#1gAo0un(a2rwpNV^| zeXf>%?m?1%sM}}4&-O8VJINNNx>&$eWUm-Q$gS7TMUXtd76r}MViZ!eW+le@BsA!ae%JwK znjZ@HW2a*ME|kKLXC60_b(|D`2wK;8sBv4HkN@bN)qRIT;UAT(Jy?<3$rfNv#2G%X z&UO0w<~n7A{ad;5<8Vj&KHG;4s-(9;t#ntOD4#e>l#d=(61v!5cf$sK9Pez|-z^h- z$LC+#F3Q&Y=$NyzKtHt6cl;dd_lOrcStwa1)*bYF-uw0oyghRXH%42X(ifXIc6q$- zVQX}S<4V1_FNwuY?R=TI|HZ87?yTJP@3ZFAPRlOctFIg7;r;OaJoa=E}nU_fCxhdnJ^D{@0#&fM(bXuFF?-SMI zMf-|tHM*&;sk{Gt^%Xp=yArQ1NMC@N%t!FdV=O!xo+|r_B4%pm+TH0_IP4!@cDr3S zkKp@l*LmcAJTey}bo_R|Yi+kFz36{E4Wl|gbmP3>2=iKN7_5~>U+aupK48I7WW_iI z`xDuqFe7wxF!`PxO;3fAe$-`YN7Fpv+P3HvDOt-83h|Y*;ynt->V4qeO zd2K4VExlcEm2Y2+edMAbzGGy5y>5g(2D>h$y}X8xW*tu~=eFmIf|E6sr!Z9&k{RjT zWB48fwX<*k@!CY#6lb4kbU7v(yRi2afgQg&N#&gx)sfg~XU^5j#sfp^+-D`a+TK$R z+Gl3YMa#4uDK%rH{PWAmO0`Z_LpT$9n;qd2yaYJ4*3nYFVOi<9k;pw`ABmO&Zp&Kf zTdENa^o10Q6)(ca_D_P{O@ghRd>*SM%$uw4nKN53Us8zV1`+t&eJkh%}>rJZy4QhyKi7#*IIrN`^|t|sih zm*-EFywhir%--)wc6=()y&tDgHtQ!+USD?@Pp$J)3FnQTv5rG1FYSC}@4>8tkkHaT zlLh{wr_Z&duMy=J`?jLI8s*Bqy(pLWwW7QX<>&i$p**ioDCu*(jB-IAdAj%dzP!4< zeHV5zS4D2`dbx^d50?0Sw#RvGdsh|qQ$xWeb6%~bQwP4|gCOGPki<_`&p)oo+Mn0S zy55q>I?fl6pMDtJ@3pRzxIa{T?`g$iN#_!KPF!0p_2K-URmN4>m&J;8t8(FU`&g6_ zzWBaA0l%BUVPIb}a)bN0N$^&fA$|LlaX;H@j5S$H;mKtZ|7m^X$*F%mz2wPVy&g|~ zv)ALvALx_AlRt6QdoDCLNz&HEbqge^z9#kJ$L?QY$9E@Wkcd6(2PGM--a}({vAYa! z;-Kq=Nz6=1)1%$FsC{=Qnd+OQ z`unHzexS5=?+4>tI?lZk=r|d7fJ0#?IGzj_pwNsVI_HHtY<#0 zn{Ig^lUdeb?Xn|Dc{~aF@kH-uR}!Vx{G`^N>i+pE**&(mugBL7GW*y`(?O zdrAH$y8B#{CHX%@^2b;udF8*bR|)z5{))6$jD2F-H>SO0I!hY-L!ETqLwm>DpYMO_ zX2RIPWY2G4p4^JG3+ZE|_lJ&NR^L2MHVL-*GHjma(JbV*AW!E>XP=(_Go48t82z&Q zjsD@=m;dFVUmt)^c*De0wEsPO$=`3}zPYfk2z7R#jvmjyO45(4i9YuiDR;p7EqWIs zjoWu(6>Opu@|%kjfZ0JLzh%2genKCM;3AJ3F(*Zm6#HCFJuz3BC3#itCXG2R&boS3 zqWDP-S@S4R`~;);M=|}Xto>zJ%1N2*mK&C`v~$jGng?`s`yuzuJx4@6L%b;Vx!&v{ z$+q<1Ui*>V674jJ_M76kt2B?;G<~jc+!|i+$p>Dqzw$7PSSjiw-L5%D2JPiHufz`f z!{GOPAFYj4M;VW$)uRtFY?Ae7mzA?LOBdtM7Ad>v2v)99L$tB z_l4rU)Hf0=r1x>azLH?~ z;trB5K;HANBNy*K>CQ3sy8i0MyxX0Pa%1-ev6=O{`T^P1oes#(?jxcWV;qluZ0|Mz zvK0^=AW?v9>ed1Bdq7AJMu>yjC#ey4V;$V*I@SFlzMs@Y;VTm@H!06>rLoU-t2;UF z7QRBh{z(i@OI~q@T!}FxVO?D79(IL`Oz_ITT&mxQ802rji^uy)w;Y(U$jwJI<32*Q zEy(pCHxAGO?H zp1dYHOOm5Z=SnmO2VnkHA&G#IZEInZdL$!K9?}oEU)2hGrnRn8JDF>RNyN zjfm!s#kKSut+m5gTO5XOcH}=}MT{F~sB1^sn!AJ%v%Ti+{$5`~|o4d(m&K z=WxmcU4$$(lFYw_4L*mqk3ueAApfMq$1&t)O1Y!R1uh+QP;$5>FN`~O&r;42dTlU>GLS-bHao(g*;Yeaeb0VOx4tbuq41m-Iu>Hjj3 zyl#zD>xB4$j&_5lc3#~H-&_6zeW#p+FI>Rm7I3x%T=;{ZO~_Xx?<4V6jvRM{eA+3r z+V=^axCP!`hyFe;QQZjW(Zi&J({X0r>-wE^V%}799;@_(Xl=)zaG&KOW;)hkw^|!- zyKeR^Gvb}#x!cy!LEk-oBdDSX!ud4@Py z(2d(V@Jye7s2Ed;`;@esrnD8j8oq?M%juP2RZz7Pe;>nMimw&+e}Wt4u(1AHn|GBM zaR!9@f*U@a2OI2yCOmhT_6Jxzb7t2R8jG@ua(i7r;#=}QR~%&5i!;(**LUt@89ZO(_tuE`MJ=%P+x%kEx0;#+ z{JvbHfoH3(VPiQ>uj@0s!{2=2v+?E~YdU`4w(7y#2jDI6a4Key9g)4RtthDv-}O_E z0b_%k{M31$!8VT%TH5)|?uP+?4RAf+^^Id}4;l|$odlRw!X=*;Y)e3Su~Z)LQGT{~ zz{=d`9dUR*kKXsXcB4i6$28A49q>!y_xRl@{>|ah(k*?<@z;k2ZPwoE$CqW=j?>mr zsG05FePtw`>8QK^W7f11Hu(k;#m^^UhbLgSCrg;hir6~z_YY>#c{APhr~rI5*);5a zCCap~<&Sa{>e3pz54OJszTsuiC_<`0szxH8FcWxZke`kBG~aXMNUHbUCXM9Ye8(^g z-|+e2@51!Dbkbiyc-QK;DNU5e_PXS^ecL(T!|n1Ras$5gek;pRkrmu z;;&-pBj_(K$l+h!w#xAPo;9~~hz!~v@Ptu!Jq5QhwGsLFj+!OXjm~3u_PRd8-x}z3 zX`o~8_tQMF9ricq<80*qfExhNMU)jEXP~@6Dxd4eU9zTWDF0TfX-B!Mi8N?M|KrzE z@vN2bJ_r2ACbF=Pup4t5^P1cB_al$seWmpNAl{$D$#Jp~-Yu!uHBW+m2uH%j;`A)yVgp&X2_M_5cSr&n-320|my4t6r=u zHWvcQSh`-QvXn0@EfNZfg@lCof|6>XY~lQZ;>vI}z0b|bdQwOhipjpEh?^j$@8kByt2Bayi6#;dkK$f=i~|?Kd)p_aao*DRa{mil$BRoO3LQp zWp;5@m3dyVP+_jDDlQUoGl5@KvZQ!oL1}s63xbp_lk!y)4OuDq#^>_W=cG**h^Mql zb5*h6L5xH>zuH_`EtrdnDnay7#`L*4<7NukDKk@zQYZ2%%jXHjm6goRyWA71KLiiasx8hV)F$)-#rxk~4G0tQ>+ro|45_ z!NTh5@-pz?$yCoro!m^uDj-&>Z%9ecqJ9D&^}$byK4r$Vd;&2`b#+D6oAyJd~K)fa~Uh|;ZP+mFTTs>JRoL?k7mGg`cFU%{h29dZs zkVl0@=2F0`B={5|2l?^}QXGIw%8H5?tH%Qb#^#$n+9FgftRUTjio8@@9Vbk?hid*E zN@}&apsJ$0is((t7f>iKU04m}Dz7S$)H1rHOpwfi^pJQGo?nO|EVP)*=0T;sRzln@ zERIo2Ha0+u>}_HZw4_vsmPkyjdNvU_MTHWE06BZ=3DG%^Y9>rbit!GOM+DQzUIYxc zWCmWG2V)>Z8po<}V9Q)xtS&T{LC*@yi@*)~AXHSAlvN9*q-W3oQZDHo;ms{6r4C3v zMN#mStKx*YUilZ8%U*~S4C#j4NMSxGMrTh zgfS}A4^SzeD-;zkDk+ruTr#h$yt3Hy-kUFlnhDWxZ$g3w_*F4+LRs-Vb2S-Kbvf#m z7JKAXQdU^$X_FKR>Oz3x`S5m7reAO`M5A4JCP|!-k}ytsJr2rHU0#9S3;-m4E6fYw zUE<-H=$W2_OyLW~)m1`KNmWIu`6U<{b*r+tqzv{PFL*QPo(EjDa6VOsFQUwUtuL|c zA1R8j0ThN4Q0LZv_uAzA~vzUTzDPRus7FI$%%F84Y=m9Y+k#3G`|}m>yZGi)q$E163B`sYfOE zC_$jA1d>z$)hcOHjGnvD<1{4s=8Qu>DhQ4dDyfc9WBwi(KInaX)r%$7g%&stk1H9N z-MwS>3k+%6r+Hc$J&(nChRthzY57ki2;_UI2U?A1fM2u}m!UU{p!s)f(KEynmbvUD z&p1mZC_;>S9`wlDKI#>FMFI2mc)|a0&{BmZRAVlt0bxmTW%*s_Jr)Wy7dm7am@=!> z^D0WpX-soyx`1z)mY1IUOJ(r%FmF}~LJv~Qyu9*-m_JA_bM?r=tw`=VQKIGLRU#uz z0&u6^*Ouba3RLnqWJE7j0zuRR@z+2v;jg@QC`}Rq&68Edg)tH$1!VUkQW=9>Sw7#> zRY)C(g$q5Vnw>gJm`TM&MUv|j2=I7Ok@{{NI6&-9U?|x<#s_2*pT#Vc`0T@==#2{r zTR`Ezad;<893U%sfq_XeIsubfBF!#B!o;LRD&Qe`3v}9xg~rOOCF>y?lIG`-X3wjl z7xNdEdIzd_G3G9s?E$JTLAbG)E3bdUUe*PLwCL zS5}Vq7=4eSd7@T{&oVS4m@10OOi&6bmXO%E$7RP$&ReR8h;=SasK4+L-q4^(4I*Bt zz;=ozzF1j;xMF5@YGR`1Vd&*N3W_Qb@{wO$NMWef!;VHx5gGAcXcCD z)KY_<;FcyDDMwxRm;Ewfq2v^EsYZ%jK|~xj^Mk9COy4mB@s#JaJtfDQC%WU)6)bgBiSOT zU;v{jZmFJMSg^3lD*_BRNvOKAycF_=iIJYp%1@z*j(iIyx)}9B^5EVI-qn(@u!;zh z;gyoKDHs!?t4TSlsuAGLgO?fiblJFgs1VE(aUiBhsSZiuPV=4u8JyH+f~S2fGCZw& zB6Y7nrgmb~i=>GfoFV$GsHiMoEG#N7t(InxGI$c2#np@EQbhGXqdf39^;23isAra! z!&nO~p2->&7*HL9QS_;ZwT=QZW0NkoXX2(xSCw5gHo^dP%l~ zAuvz43-63M3yz9OvPN-S_Qd()B&U#_lAkHLk#Xr0OFW=-eO7w@O!j2?!huCF7LfuX zCPct6B`nFj4TZDxGAt-TK%)E7-3k@u6sT92OUMb#MZh|d&=^Z8D#Dt@8>>s&hdyJm zYo3qrwX%vCJW)K0lLB?@WuosIk_&o-2P4L$#^NXl_N;sFFo0sZ{!!E=$fJycKq;c7 zF+rbm4F(b=%P*k?-7jAuwv!@HiKXKC71b|+J_XifEHP?^$W|gX6YFTu#XIkUX<&6> zl0tf11vL?8)LcRW;w5U(^9Fkgo~XWH;oQ0KiolTC8Gsi_9U}hz1CPQUz@Y=6>`?$O zj@+F7z5^r-@)PK}WTn;EC4q#!hJz3e!h)6rg0!7Obso^XP(WKf z%vdrHVV&2dOOk#-Gw^PPXZbPElxGT%C@|)&PUH7ncK!@%f~l!6(^HW0GYlGfkzZclJFH zH%}&>vZXjfiV~!<8hS)r*@HjM8|Q+}0Xq4ZY+_82UXUmBA{iX(c!?Va5P1O+k1{Gmv-QAbd|KJn)qK z#XWN`WB1N8gb)8%T8goa#`YKH1mrBmmBr!I1jB??UWsRk*JiLmhPn1`P)|7CcNCk) z3Ha4W#tP-4)t3~U-&rBgFMkmVjXKiYrxmamAdi9&9nM4w;1Qn}!;8`$l7w@Yh!+9q zo+$kerVw2`VcrB%VaN;$q9q={y=F4Rioi!&E|-)cSB+M%hQSzBmSa+oT7hqyEIdW= z2dx300dI-_R!*9X;V7%Nlw%hXyFb$Q!vLKM$u>L@8u3f=m^7LCg$98wH46srm6;Ho z5dWA4uMnG=i^wf&;vY+hVGsOUyAQ@agqA%kT#)*IUEMP53DMpvqe!0k^n~!FM^G-5 zDbgS~tzPIk5RFNBvR%(sAoL4ca1@{tF62q?J@KCOr09ov)}5aBOYq*a0VeJ9BD97M z(jp)5yQ@ydJYfNzH1*>hVq0pfj2iHYfmMK6@;x*dcu>2T3yawkGjemLWu@g1Y$zAN z{Y%Da>*U%en2eM09Amz+RAiYo(O1qGCzEkPXLfPEt)_8fIG@`S6Rzx8UB_d{f$RJ zwG4l+5vM!2kBg@qZ$1C`;E>R;38O}g1Vi9RCgZ*Tq`&)#Z&-k9lXEh}?Lzt# zsTm1l%AdqHayFzEBsy0!BAJj{QKs)U>3d61V!H=>o|ON298=8?XR3Durg{eXcg8Z+ zt0S1oH^hT;cob6=hu*~>ITHV`BH)h%e0dmCDe&$bU_|Qylv60q-{ZdbZ*gn!j{Y7uy&L#@+*yFlMlvB;kSdUhiaj`sk*9n1gl|QDCDIzC zdL)9;zju+}g>(SvW29yz`g`AU=z@190lgLDAt494>!(oaa8 zNdAC@AtfWB38R$gZ{rT=FFnZypgdYU2#It{KnmsOvxTgbRkIRSh2LUaps2tv&1wET z{^u)*Y9}DN9m~&R`Amm8sW9VI=~>RoP@|HSqkgHkPB34LW7;D25?ZQaX1tpKjD<|j z`^vSTi4V%~qhgxHRPg*efiqmOUnlp=|7^-%{x=Nn egU&Wt!NNgy*a8WY7g<2X96n`KN`9+^>TB`!A*NN4T;_f&TPXWsk$ zfA90l=To^=r%s(Zb?VfqQ|H!g#svAx)lB<$q_h8&*gyRd4kZH9^MRTF+UB2W{BO%Q zO=j9#kyay7+y9usv^_}QB9$U-LV5z}C8Yl??d$Pd{~z05PwW3S|EpF1GtYH-)+)#0 zVr9QMTXB{+3aq8Y1KDaO7c0)&e`PaW^knR??XG={pRF7WzSYvHqrg(J{RZx|My6IEx+Qe%P&o{ zrWd5=ZifV(E7O*z7Uq{{CTisTi&^5j(%q#o<<(WG`Kh^cigFZ5Rb6VnD5*ZNow41l z|EbMoE3rk|XITw}IRl3)B9YHg1XZN1+8CbjlC9ge#uj5Y4;(Iwp(n;1VU=+z&9)cw?wY}sV_IdVU@WLO@wR4fyZpSQeXX|U`ti^qRz5iJf&*)l_CndOK% zv-4KVe)Dr};&F{dw%lgf28d+Y-L~Is=#(vO<_L?SGsEI+J80h5mf1PmvfKPbo3>|< zne~JsZ|ICdou)svXHj}npCHn@;eBsuJ{MhF3=5ybMuldEd z;rD^U!neQMu$d@zE+CU3o;7z_GJ4m^CH(Q`#G;`ztMWi%bYXqb8XMHb+-McPYi}G=gk;?V(7D2 zsoxk@tgy+&N^q#fqUjZqQ(aQB>>6&>W|S|R=33!ZrQGgStv%+|Ib#~5E~uw`>k<|U z$=`P$8WQE;F~$K{XC&x( z+vD<|8)7DwI`4E$UTl%Ju{>^Vn>Iz;$@Hqe9L;WXP~YR42#4hM$xN?vggO9K1@%1| zG&NVHd@!1^xxRI=g(Xh&3ZW{64Xc#5M`c;1>_m+)|A6`8nGlqo9L=A#zmqX0 zPeb3CNR4+et)rb8%G^r|Q=6CMFUdPzmFk3Tt3O^E%I!s{&3sW;FZ2qF*1GcTF3s@C z1$m)%y&_7Xu%cNPpN}{+GB6!pM&OlgXi0u=!)WgzTYq<<9k79yrrPeZ&38CDOc&3r@~_r(LuO~XtSwYoc6q`etJG1F zgnINBo?w)ccxim39cvStyv*%b1?J)Jte56xH{{|((&h!{lihSiWDk(NkEkNqM3hEU z>G{()XzOIu4t7x2KC3`)&ptBKy01!a(;w;hN@q$$U*Eq&|GydOZB!|rc~y#MBp&52 zM)srppD3RjnU3IXw-g++PgK=PVCi$oj9!t zI>GdMTZl|OsFZ#0gahN5vv%v8tE9XpdBS?_J{BXMX}V_txASEJrU1_o_$t^cdS+mq$Wn$a!@f`RtefdGZ0Z)W$NAu8^UcRHJ0k3QoB0W0 zbH`ViCf^`?FA3w@IpiDMHFm(R&!4b?2mZwdGI%LxNB`&%@Z3252M?92#@jqMqWuFy zGPHc%xJs!WqS;zDM3!s6XDa%}{_un&Vfm6}s$)f~@o-4N-S)k9W)CjZTQo;gZN_&U%Y*WD@Kl5H zL@Sep1g(vBU!s$WMD&S<%6iIvEJ$@y%Gb&2_-@-&+MzK&v=^wXF;&;$8Avi%yRrB%yol$~N4ws}8K~_})@qx3;00Z6? z*k|gG#!h|elt$@B_Xol7DU>a$V0UP~*!QS-%o`+!*rF_cuOh_GlC@{mxvcL|)rY9* zhweqe&k*(BdPrxOj4>!%*cOA}5|Hn_RQ#+uFUb0_T^#5wi^%?qjUcRZjQakT^{Uvg z+Hn{?t7o{U7KK~G3(#5&>N7K(7#{p!`{9v`7Y~ex(&Cz$dtAH3Rp*9C(E+iQ&^dvq6Cv&o!YXm zb%}l1!k@RlIMUzWdU^Af@H6kyj&xS)j|vj|EJ0D0!RB9kgStc|&X?Ib*!*{okVtJs z{(sP^PVDA#^!IfOcq4gCvfPv#AGW;_-9D=M-}MpZU4t zpZKxp_LvPl|2O;?{zrbE`EU983v_0JpE+N9voRY%agflILOy?*Aot=NqvZwfdZXUa z@s)R*x=*7GZQSi$zoQwjOw4B4I5T|XMrnt7=2sqJrqM!pL^Bg}`-oa}(M)G{sI8$6-&fM|el5E%vb{;)kB7cdC;Vj~FNu&!9Oa z#7+9q6)d`S7~i`0g6;IId5?IbdjBdUo+Ragw^^sRU1iD6os2&IYdl1jl;4k&*YL*? z2|BPOS5l6{YHm?e&1>W8ej{4_n&TZ9-!kVGmpCV(`}5#Q?gjY^tSh}qa)~#|7+w`) zj_eflwD;m{(UH-3yj4iixe!CRigSCFa6w}F3xbe!fo1J1{Q`E|+o8`-yo#}_^pr=o z&d4WAi`!65=JUHBaV_|fDOfJ($+Hq2gPOMtX!pu>f6k&MHe7f!B zewEnoe#bM}I;k+dQR)w4vn?kyp(o<(Q|yVVcS}_n+swrmR*FKuN;u`}_k`JJ*nd-c z$@2(&(MOR^2(a@wb8Scd4Dw#&NpcgmOxGTUePh2@#yEA*2lCAz_Uqm+1Y#qB1Qn&YBF3Y_8G(5Mne02>1~(UmYa_y6lnT&!K%Kz5Wu~6 zS^fa;O4!Aeo>3vb$&|G$$*t;JF2&>?@>-0-h;(V2IquB!(CF8^K`oNfC7Dv9U8LQY zMomXRMJ4R}+^L@VJ5SgIU6s-Dd2@=*&!2de(@cw?92jASUblMYFR-?rCmBGmoChU# z{kXO5qVktf#1b&(f7Q8USW42l>Z>~UL!FEX)K~EO|8A{_%8v1gwW8xT7V8l95Hg1J zMdcPB&v#zWlde5T4zr98KI;q2#t-I6!|R%SCN?owXe(_=akNjigt{;WmA?l^M-(`} zbKD4v>gdoUF*%2Q)g~%M<6pE1i{Y-cLi<9&#N89j6e9RRnGmd)tKh zqB3b*n>vJ61k<+rTWPTNH7>24DdNywM@W_eQnBJQGG)li43}MMltnJ%AC8koIo~%v zm_9MmAIO2|mku#QSSR8HXszLqZuhTc26q2 z5WN*JvcZ1MRJ&AsXY=oJ!HuMIi-)<+;Upv`;^f0^dMHjHVcqaOu*M`;cblM0A2zlM z%Cuqs42s}Eja8S~9@wqbDp#=G0BS!OGPcIU2N0CUhP17)h2_psNM4^=?duy$%SM^GI|yA zA-g;wx3{T`^br!9&6M|?#`e(0Z7uMEQkZhsDIBCxJG_sYnev8Hcu|weE*^9m=YP?5 zNA4Ykh!OBe!5@YfW5$0!EbLSFWlP=LMdhdu`#(;mlJfd+AvpV#l6)$6Nu-6xg~4fwvBL)f{ix@C@Ls=Xgsw z-faQA^}yQ?yt_DF+VBm)TgmZKIGzD`H^Iu)0B=6J*$`^-hD4#|7+o5QbFAVKR z`6S9;;xsHN@8LB31|l}bM8s}P!hGQ%lfP*54W1g$OvPR&i!J2a^agZ}*6lZ>XIQ(V zq;t^2F!)8Jqj7kqB4r{?&!1rpUsvLl@$SKR_({ZBovJw7p0XrFEs|YAa+0ffpew7V z)RqWK`@p*Lp0dcid#c0kxP7`HKf#s_uw`sm=x4*?MV5L`MReIIThM8hGD8ftRs`=b zWqT7DovMk(p3*ZOTl}8V9{leq{Tud=$aPHH3x6#PPl~0+S|!@=bWa6~DL1*I^P{cC z!z;bU6(xw1moxDR0jFpVJVwe6l9xM^b^~>ylljz_uueG+nge6>EyCGMMX%HQF;dO zru9X(l)}`azuHps?k}BPmXbFcP}A)Pv2P^j-EaHa_E3CD>C`eq-s}QI#TTqDn`#sK zXWuSdUJ##D_<~KiIP>-rn;S4EVE1LQ%llWzh2^ELG*C&9XRa?xvb}6GCY9U%4!T{D zh>qW$UAnAHW!q|tvt--ehlfC;{g(Shjt(C8W-C^+SA|#Es;>WJDwZoc_A^1VV)aj> z6AnsY65iypT$5=PHjIZ=(p=Zl?e3DydOeG$TdTt@8>?DL34c+{ludvSjP0d07|LC1T&vNVG}O=dfh2 z`_K8iVC{dtbz#p(Jm=gR)AL83`~6na#XjeUJpcMuA$^y*OZm+CJ})P1?ZVTfL~a!< zQShK7~# z=J|-N;$@Zj1>WkOK&#J&GCN+rT%Z2(#TdYuGTJ0wek@(Q_?z%u=IL%f<)xr3_TOg~ zFTW&;7f+QD-sep-d!FW0d%#a`8MXQcC`<~pNkW^Spx&f32YQMFelnt^-Yy{P76?d1n@ErFKbHZvGLqpP50s%9>92?Q>_No z_2BxhaH2XRKsCdg*|8e9Cgp|zI2mFqTb5uW1HsnQ^v|&=FNfrZs!ydKw(XK?LhtmAvuKE;Y{NF>pB>+l(mK0iL~z+->C<=-ZMwQa*)n?L)m_=QcQ zrK@}&EKV=@=C2QZ@y)Id^MysjD?0z}+0X78{`%9q58OAt_HC)ABYnz4ve@5Z1eozvGk+f>L_=%a?D4bRz>b2T}7QV1@-Ke+|lO zQC0=&_n^KOdnDwU@Wz*dWpyr7e(%fd5G<>51?5T93YL|Cy@7Uu<#xcF99E3nk9m%4 z%!52<1)elYc=^cvn&+YrUD-H7Fbi6gal9PVe#Yr#BbU#6%R+6*ReD7{w-~TIp1Tcr z7LG@~E#sR=^W|h zjNhkCkNMfn1*AiyPo!U@Z=`o0eU`VGbny-2i!G#=q_>9*zhq*51m0*w;AHBLaZ`-y zjf-K0Pgz+!+quS`fV&23Y?KRE!ls0}ev+r^Wu5+#%Ek5y=}(&3bC-{AvBub0e1hVv zivf0w{bxeR$sgxQz>TrLAgE4GU|u=CiDQ}voauhdpGqMo9tdFWkW?qGVOHneXAQAe z=O!pOie@EJ48i+z>cxDum*<6$6J>$6&k5JJU5j@f#5>)=V)6bFh)S5KO%8Ld&QtR- z_{-NuF>rik{>r=(Ye}xoR#LFerb$p_mehnd-0-7vUb4mDOqM+YZ>9b~>Gj_!rRg&q}H*)*L-7xy`xOIf&7X3*DME0aema}G;CaCKhPH<9lAWcCG7ZT zI6t2DMjB&Or?W+c)ky<*W1syOZCSc#G2XEDlA?#{McpTHW}W= zXY_7+il{6`-Q|&A@ps#z^2x~9U>JH}hELrXU#ak_sHjGnK{_4c9vdtlf5{V(i!;KA z*AtFs&&Xkq@T#DsfRpcCqT(LG+iIO?a(;I+JX@SWRX4FX*iL$1qw8h8?B#sb(rAH^ z-%IaN819(NhwmLn{x{C62~$Z`}e; zeM*NG5;GwVAS%%#bPiNHUW5!t4%-9c&&4x3Hzxo6su*k5Kv%ru@cX4WCEjeh7(Gp! zI7z;tY^vp??RlHdMmJojj}_=cmp`d!GDVisCh*eArk0(wO|@K)xe}P_iTG0)RypR0 zxEAweO2nr`*teqAF66RfDcw+cl8OhGpNo@y1+Y2@zf)wtQI@?m!H= zlWp*UDdycoGWi|Ots+0S`(dn;AG3=$qwe zZ2jG3=a$Ltm+&6D_L3yg`)pxPl0!(S#+%(!+MmPkV?TjJEF4@8wEeljVFO0Bm4?l1JqwDxEFe;AK&29 zkiVlnx=`I`lD4+=Y^ORAbz+O7LxtJ+Hy<+$x{`8aysLUp=NoKC`Fq#oLOO}hZA^tk zWZzr|Gkoa+XU0@Vxv~`UP(dC-0=?%h8TX$(=Q>XEcZJlyqg`#;+M+MQ>AGGxXt2~b z2}-T+F`UDF^QXAV4-kZ(c$8_!|z6?PBq8DQ=Y zBe{?iByGDXSWvzg@AyhvM`sieGw#+kYC-f*Lkp5PFb)kDH=K{0{iilKP$P&gzv3Q8u*xx9yXjEb}{ z7IjNGBq{)j0_5f)dS5&x0Eq--4#x=!K$u>at4A*h96I9tJC|lGFAaE4A&&79Be|0d2scI~zZGu6EnS~YBJ@dZmzvFq=e!ILY%{RuDWMCX`@J7To& zeB$l)My6-r{a$OUF{*?^=$5^9^c@f#{Z1}ACA9=|L>2tdbAkh zXJf)a6`p6uC`x+PDZCUrXKA;f{AJ94Qh(E#hV%MKr!mE(yy7fYm{u?fc&95hO3FE@ z5Op6r^HS!x9zu_|df)Wa<{ofhTDyA;|9Wd7nLK!>3-bZuB<$_SCx=(L6Y9bO!hIl z1t(qpD7#pBHe8yETagJzy*UXsmuhaTOPnhsb~i;7U(Co`l54(@gWHm(1l)8;*CWdQ zKAwW|w$BL84vY%QA>YmLoLhWJ9`)XpYSkX|g)HFbBuFTo^%zn2vhPOEJUoAnTNZ-y z1lsKJ-DDNeBTIm$hQDTtzaZjPW*kZ^Apv)3sb=haWd1R)Dm)aUP^JIM6MsPxXgoi~ zJ7Pg;^nH6Cw`#Sih{g)R6`q@qL;{A82eMCV7=${+60W$&8KQ*pH`Lpr;D950DYR|2f`^ayZH# zkB6ZAr*XMTP(o1tfK%QF%0!p=x(jqGkQ_*lAZgpj1`i=dPVbBTGHJn^?6JX0E|Zth zQrpoCyz9pjjj=3r3A@t_b9-=~wq&M!D$`m&l(sxjiri1%mE0E#>OGH1|UIz+&O-p@1xQ(b|PQ zoWI(unu7Ts)1-du4$qA!)B*o5W28r~pcUb_0sjMz-#G?s?7#1z9bxPmQ=yfg-$&5* znOfYVz>|1>9?69=-oEEfE}R0Y`#IHz15_Ue)t_;y&j+aP2vD_;1#zm5j@LosZO|Zk z*XTUL>8uXWDF>Z;PRBuXFqY~7og6+Ucu5`aqP;gjhxBi1YiMJbrT$1bUlpsy_BVqU z&?)AW4P*ZGyq7m`Dsp$_qKMVP8 z=iA7el!_+u*2V`HdfB0NE8em&K^ezwa?Bg)&kJ&1)tFddv3y#`8R{aW(0CcJVqN-cA}|@je^f<9U|X zebRJm&oeytK~sFsc8>Lp6RYFk*q{ZT@lV{%;P-JpTHEO3o&)_~l^?i#Fypt2NQ$*h zTX~D)0lLe58$Aau*Jm8K7z17*7<$JThHemnNOc)fIGpqw!8 zYcgGY!dc6yy&k}0;}+m;0-jGVU2M-LywoPCKek-D9D|lWsVAy01hD_)o9D6dkxT=Q zSR!3s6Cqvsp5tr_;G7#3_HIdDIuQF-_Vm+jV#@B$)%mM)pYOy;%(SWibD}mb5ER`g z?TufL(9E32J8VJGj21x(Dh@x(;ipDu#=iCn$`DSYShpiX=PkT<))d;4!*icFv+>Mv z`(^(5__^~Y4u8kF6wk~6JZa?k`P(>r2IhJZaw&nDmq-72{y={;3+F_8O@ z(XlTL&;%b&+k(h8-4;j0u@TE(}Z@JNGj}|Mm)9F=*GKSwN|MwOAvaW zGOJw~UNL2>8TYGj*7m=DrE?RVnUuq>uSJ{y4K9r(^6WB1nRKUu@Xh6doQxb{@gMtz zAfflS<{+06g($|nC(T~Bf_J=3|Dt)y*~P$1%}L1-Zu<|MiiF++=;^Dgco+Cve!}K` zWCvLenBVDi*ja2;Y*&==(BHmh3wD@))u&Rw+Nra=V1Cr{YUeadX^*PZ^A{h;~n&T_lZ zFW{n#T70|nSk%wV+S6(HW)Wu>+>*u}`%;6&+p*B%hu!B}W*#89Ex3d|QL?ZqW?1M} z4#(Z(_~cFV?>Z}EH^sgYZJTb2-GL~Dpdrc4C^Z~Q-4|>;~k%Bm9ZW0Q}(;w9isT|6S3nB3#@;Dp47w4E zWIE_%T?c}|sbfeKX_&i#ichkMD5b$t6 z67lq7JgrC#xcjgJ_ZmX2vFn~XLSGFy`Bwu^nl-0anx8bQ&S>(@URme=PJsTa`8NaA z0Xp096v?YGhT3RVQ(2X-#?1>EH!o!4zL;z9*HK4f-csx=x)b#o>r|FWmM6`JJB0-3 zT6%1&dJ$I3#rK?u-ai-I_bA;OGXB=wb@6rQTJvws?9!{wJ25)slmkwORkp;e_6?51 z#+#H+culnx^>Wne;JzH`oOj@thrD+faWk(KsVNx|{(~`sp3Tl!ZS^LuxC@j_mv%Z^ z`?9BWcM{!uihr5&N$1xwQeUaC2XnjJo2WabVf`;S@3P*7+s%o%-Ar=5Blph2bKdyXk-Zt-$gY)nts~=?vWLTPgCB7@_?m{!2uo3ZQEs^1gx2LLtMR`e zcQ)|pTZrRjLW2KRzkWDuG<`L=>|*rI74C0$wK3&Cd}h28JMY7cGNxR_yNq7n56q$l{MWzl|dKoaq$%j@A9DuS|Vf16i$Ddinmh zaDRKENA$L<)b5D}y`OM;_k!N1uqUJ=)kptBfxMg1}`4=MwK;@XhU-)dcnP>H_U*-ZrE#W!+k?rD)f!L7Qma=HfWh zr>w@!Rm4JKR#7{`SI~~ehuHQyieVE>V~FhjAUj-zFKQCZ7nr2YKh1XGYyQoFTS6*p zRFxC=6T2=sY5&EF!Z{sxX6Wv}Z?Jhx*P23otfud=(xK5pUk<*k>)O7rZMQiAW#+=E zQ%||X+(aw86Iv^aIkvscHAHIpmX`%=Ss}6`ZiWSogX-vv2ULF|{T0h?bAo|DV3* zpj}HE!@X;_|Jx3tO}2FvXn5P_=0~g(Q&bjpkCY<1xwKY6CMlz?+1BK|-=o5z5#`bySVhGb$|d7jH@J{;_L#-9GxD+^k?FZJtTXbM zoo=+L^wSZ2j&wwK!U~>V25CeGR$!P$0{?? z`uwbedN>-BXWnCWo%+N>av*sXAWi7CgEe=T5at_O&s= zDW;3Fw$eM}KUxKQoPDb8@fMb9Qm)`#XybtotVfHE7Jmr4<=BR_OW1YX65cE9!=3jG zZE9%05US}HH0pj)E$q_vtF*!Ws^Fl0F^DOrntpGMj)o@4A6#k*m(uYbQxuX-7Y{qz ztp8ZYl9#ymA?hh6SGiQU;q+{ifd9SDg^fb817ALV>b`gQ(cu-?qr*p!YE1oqZ6fTD zR&{ch`+zm(9wGf$n>smW^^u-JNTg^iBp}JWv6phsc|UoXDR!LZnUXcOH*ar#@I6yk z@6BTg`Osm^h`iA8628d&$Ev45^9A6)2>cae6SFaEY$s%&JGO?;#wy6(JoYpoOUDe& zOi4z0;n$nl9OzcAA|RZA}Xs zpYaf0I7YK&;O@6*q%?}Y(TP!(H!LG5bc&`gf(^L!i2+qZ@+oKzi zzs&Q09ku0^@=*rGvjmJvx6qO5@k>zL=^N~Y)-N5%ev9}O_XHuo_^o?$rJaa&^Y(9! zQjO6_JIAXW@+;y+I*r@IBECxbU{u`AlzpSC(Br$K(jLsJ?ulRl_mB&kR$x^ z$`{Yiw|3(hWlw9)xBkwn>)IM4jEMc|+YgKgX=2~b@Umsji<6q3YdhyP{4&{T&Nb&5 zq2aCg;!n&H7Gmdnq-@y|EB#6aX0eNGO5BjDt2`NdUc#v|A)PQ2Aa7?Itw544$=2XB zU3%ZS)9kx)?oDA|lrzGrijT3A9B#^`JM8#gVsv75Ge>7(6nBsMXSZ^QDJ7${)>e$t z>@Gst$|aCE`u2I&`4#OUNLrjtXbpwH{*b*0L!z}t_NM{q3#=(K>d2n(b%(WfS75E# z@GJmMGoJgAUPqFV9>M)!6Q0Kl%XFWhp7t%WZ?s0MQKtPX4$tjK>#xdH*yopNOmmsl z$mRMnPVesjnywjk|}N+PKLkHPnvtG%;3yEkJAEf zMjRW~@b8&cKpr0+EI~pYIsEurJzK;2|B@ zK01fjPk(c<$FW@E^##`UiM0Rv=;Tj z@j-{T>xlYbtvo(>KO$mF2M)X$hqkLnNVDhSEYFmb5jFCNx8eRjja@&o<9sA=vN=v1 z$BE`R2H<3JoT(!x_-}ap^BjJJIV8Oxo7+h9i9~j{04WEF=5%6zC!Lv$-v&BfCm%8D zMQ_Mb`V|j+V_X=T{;LrdAy~S#tk0hhE3?isp!Mk|pM1g$ zj>G!XHx%F76Ek-><|CCqZcCE>L zs!o`B+5>(7p?*Apz8r_QwcJo7?7&R|m5{^|L>cF@TTdU6l0#jqTT9}4+ElaGv<=YL z`K!Wmr50)*Z84@Ti=*En2u|7Fd1r<(BW+dvYI__@I`8>K3f>n^{jTRuV0;T-FAVEV zYK%Ri>g9JdT4mgYrLii9rA7_^=3%E(w1~YpB`#fbh-!@~IqnjAQ^)Qy*jxwtjX3*g z40m=5={gHb3htez*ox=4iQ2FGjp~e6!uX<1lPdN7N08F9)jY|T;Lfzjz2=kzS7akg zwc*|AM_trbO*|9>U(Hf4xL)Zu2C4fVlY-}}@D0U3x-0QZK;O9+q<+&=t8B^6w1o1r zd|ApVa3iF%l-pdOkr>j;Qj0I-sJ=O!mO?yeJ9F?WO0mR+T9`xqhuJz^3Z%sJE8;?J zXFR(a#q>+9)c@38_1pvfrK)K?>eSb|?@XMgIEoMSsiZ%;r9SmEqQ+8w&PN=adZ0fm z$kT01{Kj)j;stz%Lj3#=^4zm$Pqcy?$^Ls7DogB<@LtT=(jRll&PfS%)9nEAkcxbd z;%x4_B?Mj)z4`V-vpH1I4Dh$<{iih}(%>yNs%M=~;;a&4S(;4mpm$iBEDL+&Lb*7{ zVoEi1ni5}Wd$ms$l4nV}2Uu^F`|bXvQ-p4M%RAdX&1$-`v@XQ7 zRWXXmHr!5`DdMKg5}W9%u1-)5oxHy~TJ`lwYN6_;)}OmvmQS#YPsQ&uF(m@ON+Qr# zv+#YH67~*Thx;+Om$cM8g_)ZpLWD)?l$-dkUECP1jf;~$Xr7WA67L)QW#{oWRm#-v zu)GhNZ^tb$q0u+^v(68igLAV{`y6uG+;HTc?!?Rl`a1gu*6FIl`!A$Mq<4{w?K@kh z=2lru3FCu#KGpQeF74?m%gb%JhoXEv9A=HPO~u`j5W2C>bDF{wyNRL=`V?MHu*6#k z_xSK-&wS|qH(K&*rxfTLBaTciOlg#kWOgJsPRg5QB0&?K2e=4ZB-*!2U>Y(2j9da*55b;C&= z=<8c``9eI?Pj#d?Cg%|+?+pj%n?O-->S{AMN^JgLYiRFGR9aMz4wzQ03P84Y5?$(t z`lG)7-s)|iTs);nZ3)Ay&$bxx7Gr2!nyxv!(EdftO*so&S?Wc+_4Iap?_Px8nD_=a z0Pgj%)UVu_L!4Y_>?8xpD%xXgTbr96-t)j-r(<~(V1l))EegM9@D=*v_x}TV)(*|K zvRx*9jD^J$|BnnyE%@$n1a~Zo=v^$m#h-z-7UW_HG#0hQ9X@PwM=jJlvuJeIJW$ zjlhV!XC}r$eCqJqS6f?R8|imD2xo08?iwY)atbmeQ#~#i2HhI^t%6qm-gbv?uzQ^C z_P@iW_7nQ>cB}4i7&PL?t&)Y}gKJt@JUxXpmOSj%H^#Qocb>k%rT8wCa?n_Q4kQ}h z_NXF?n)n7!jAt}nIx?*YoM?=e6wFXa{P^G)JVfcNDhIL3N4yHQvRa<2=XG5^o36CUEKE_{8G zC0y>x!tOVDQBH<4tnV3Vk`wn&EU$>_e&@1R+SHf3mf`NiXaF- z;1rE}hSl60<0M(pErl4zO<1>UoQPE?54o}%gHk+*i)l^pmpaUiLCId1HaWtT-Wri# z0-Olm_DkHd+}13n7&=A$-Enz3VfOcK!5-rL#uJvmt64~i#xJ}H@v*I{+z7jfzEsw` ziGF7{_?wRuMRzZ4%#@Bi@vO4$8iGAb5l>5;7tAfkB^=zJ=~UXYtXT!o_O;bdx19^x z*`m6jRz;qiHo$CIuG@+iJ$dv}aM1eJD9bzch55CYf?4L)=@erQ#oix!2$59Wx>U_L znE|;Ry_6Lpq^x#{DfuqChc%D)mmD%XO2Ej(v`7QD>*m zM=~Q>PRNkt`7GeZ!@2@!lceg~rhcROHSAo;mep|^b)l|(OuY5;yM(@FYH?ATS1iVF z1{NO#KV6LVJ5B6zm&y398CD3fbkH>(zTtmK=P18%<7Cq1u53TWw@quDqCJ<(YMWw| zjPFXe3Hp=r!6l=pY6Q(4b7JksS$5emcPf0jbL)pBvlJolhQPntC)#T8&c$)qbn$O9 z+svx&L-<8P$Gg74`R~CdkzdDcLQ1|7x5*-_brmJm_o%nE+=|~!TT`u5O*^@^Iw_xg zv>rCG`sn_Ji1cxD^poB8=i16H1q;zzS*vq-4BEI=K_?RjoU3XFoGTNRFx8rhNI=8Y z(ur_uTm{{j49~+w)ruV8Fu8Vsm1!M09Pc|%m^G{*%3;#$ouPToBv7b0S+S}Dch4;X z_T1C3N&khr%wah#9-3E@JIy1l<4r5!Ph0WjTAA+fQE#(M_aZtk)jlisJMpcBm>!+7%4uC5|#1Ybs-PxK{oI4h~FsgNs5 z8%pQO1(h|6S*qMnx}mCKG2y53ip9kD`nt+Wd1Gl+by;m=CGjtBtgNpu-B4LCSJlXt zJWH{xXO2zvcH(J5HW~BNAcN(V4V(@a8_TPysBDyR62#xiO*P7$;!o$OKq*ZaZ|ZHAi`9+uCl(Nw63A5W`mraRRqzql7>y| z*Mp9wwr(TQ%PPO0nKAY{$eK$8Fe+EnZmg;)t!W^f?3LNfP!AT%9+vBC*Ec*=T30z6 z@JPJljzdaBG9YCl#`=a@hrfO^@F4dFVz#ubp5uY`#!XQ)59X+-Azo^zql&r*8y{ zNDFRY+V>-v_A=_5rucDohT}Jv0iVD>i~3JdcdHKZSEMB5-w4pV8#L6wKN88b_u%Qq zvmfcxX-u1jL^S>l@Tr0POKAH5Xg`6na9tmTC|3n=Ci>-1L6nx!*yXb7+VcCcB1k8p zqjG6Q1tz*4ijh-XG;5Vyn6)Z9msFPBSy$E2P+22W`xSMy8%Vtg&c#<>wYd^)?l*^U zf`KC2R9{&~x^XX&MSaLsKvhNK56bnMQDh-lkX$dQ4tc)3MO3I54seVQT!*KOguh&# zBJreegC~*`78(_V$Ny15_UA!{(;|{4e-hW|xH$HdK@9($AE|C3-2?j@6SFPV~+tBXjUG#RT)%=f~= zaImGI_)daDA2(r!xGlehO!=L4wXi5$MP*pay2=edz)8!<0Mg3J(uxVA43g3w2 z<;eB++D+9Ja#^LEmNushwx(v&#rn+Dj<(rT=)$_i93d$6+Z zVSkmQ7FMmcMy^6V$D`Io#WKimz#^(imFvl9*VH!HVPsHQ=r_eO>{5MYg9;_fWSpuVgprZgS5;$Q=++S zMCry#Vw_p{0A%c?#5rSWkcknAwoN=3F$Qg`s7wXTdjB5DM?f$X^KxiUCdgt|Qnk@h z4OXjbYb$8m!?25sWb9rTEbp4nF$un*Rwk1@JA`2^K>QFOcMq_;L(5Pb*gWN`2IvY* z0;jnO_JP(;A#J$$3!%a)e}U&$T8vZ^$fr?0uco}NawAN4Y4!h(G0=yOakDg`0|i(M zbpa6gU0}SwjJ7pY_Cp|ukf;JKNj*HI`i6y&k32_aCGZVMYLyUJA@<2Sj27D|Uqc~S=v-dQYAWW` zgN1Ui3uMyb+M0z|{jQ2iKR$0is~%HCDqfC>_QTOXEvrgw2p|t9rnF(9Y{TrpVCUu7 zNJD5I)6&o%*rIvkro09UO#Pd)a1e>^0R7%MaPHv({8@0OxSEH`YGncgkpK$R-)?7_Gw6 znuk$EBa$ns;41n@$#Jd`2_OKSo8W7hvY~SBhPkw);DteXOvD35W?TpbfK7+u%|S27 zHJ}&h4d%VB784(kW!ge{EvZ%AgOwHcU_9ynRL)okceSR0rUrz#^}R~R!PiUadQum^ zhsN0ag)}a7IMFQ_xL#(mA#KhQBRGOTi9HOa%s6LB+HAJqpZdKy^%nH(chEqJdvSF# zxofh)2mlui`K0q8v{X3_pw(F`SEb77$d#huB@A9$yjK?`-^#no2nbI5-S}JjI(T0 zRdt0v?bdWmV7f7V!5m}y9OHrza`|bsly9t%*B0G_t~c;ylzJ7im^^d9{mW~ST!ehB zgQfxCDms;fBm)#!{It8u^_v{D7eikku53t^mtRM<UHdW3J;cIPz7Ww+~_-cZcCld4Of0PcK zigJ!2W4-&^$%dlE#<_DdW(StMUj)m^zo2c>ud{xfn`c9YbRMan1-4*-$Rorm;H-LUrfs|p%V&lg8 z*@RO?gfT0$J%9?dy`u8Ls&YQ&faT!zfjswc3^-cJX-44J&rZE&J+Q(nVAcHcs=}`4 z?~@b?+b;orunkUdFB|+un~Rg&lUcmoEGPq6A)Gn`0M4(2?^JW(K+ukrSAe7c{q-a?F6B~vW$Y6MWaQ&u@WN)zSDDywI=PU;}r?bCY3;RSuTIe6mbprRx z8~SxyCg;$xgA( zfRLcKvqJ*bC$Jd)UoB8b#ior=kUDTgIe!?zzxnbivK)b`2^+wdgufD}t*f>EqbizW zIc(VE-xfI*MnKGR@l!Z;iR z#|%|9%nrfkGBJHW*jD_e1hw4l3C!6KFedyV|Nh}$asG{iI5uG$_HQ1%giU332*o1; zl(7HO22Oq#7NXyt{fnvP4K`DY^)Tr2=E}O-Yi4*RRt2J17;YfgRv$vK7Mh(RGW@U- z%U9$T|8QFUyslVXg+mu@aVu6J%I9aZI0so62yS@OIjsP%oD4VTF!_OMJ3=aG?>DVD zx7EW1s&<4-L~$lY3Cj~$QQX|iwByxRme1yhv;ka?NM%e{UF}ByP~mw15%DD&ja-<$ zT3$s(gqf}a?x?5;xfV^DAa*sp#8)qD49KSc2>VI;k8TCUKy-<)$;tVjIJ_FfnIOw& zYhrsdq+xqX=LfX3c^T-Kn+!J z92&U?L>5Li+(zyR>}6?LH4ar6#VsgT)=-fj3$Y1L#AA4WHMOY6?EAILe_rQ&)}R~N zh5&&LO2MO)^~A7UK z^l}5aH*~NhGfd$KI5(UfV+h3&iT`r@gxXJ7r!s5}A^uR^Roc}Po-S640Ui)&BWPO# z8nX$NqIm(_>ZN{ekVnmAx&GLDW6xG^|5I50RE@-<=gxJyZ5el z_wK&GcSo98M+U)?(-)D#A9z(WkmlwZ3(8g%@OP_*n)O=6Emhq#da*F6NwdZlCd~uM zZM}|L8Qhzh3Bq^CZcWuX0J+QW1VPJs4^eFdkW>mmEZ!3x+1N8ki}1AS}Obr-CFGHEN|8Q2AT z;4L@;8aEj=8;;N$&fJ2myVIb~f)%T{>+|tLQc#>}7TlQ28mukN7-^;)q067aARCPj z6hMO$Enl=+G3kb2kPM4xpv1=R(xSk>dP05u>K(x$JF_D84srga? zo>KXv@lLr!{JojE$t6Arz&SmWo0-cZx8%x;q#qd>M&3fDtVZA{I2#{J+H9dXSw!~q zz0w0Y7Yp3CYwnUme{;#l1NrlisafLx-WERb3WehBvtC!D?gL#;ZnfI4p;6p_)+mY1>w@CflAG{I1&;7hDCh;<4^{Uu>PN^JRMq zCEKu7tJw|Ww(Ux6(F!&NWu1er%{jYfRV36&Q{f6^T!>}JAq-h>opuK@U1@OuURGjicv1^OL?=XX3e^mF3B@i(ZfS z-S@ID;@SHM^J5-dO-B!jy(~`q4HCeSG1&X)oUoiZz^(n4@4+GX2#&xpP=XWeFDUxWpr0EmsUccZ6<*x5vvbD8CTuMZ)kfeHboT=b=2IKZ~xLb4@J|q|x9kRAkfXu;b?1z&q++ dZ6PB9E;OGM(q*T714O!r`N8*G?O|C``~k6dc1-{P diff --git a/F3:F303/Multistepper/multistepper.creator.user b/F3:F303/Multistepper/multistepper.creator.user index 2b30f37..702d3dd 100644 --- a/F3:F303/Multistepper/multistepper.creator.user +++ b/F3:F303/Multistepper/multistepper.creator.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -33,6 +33,7 @@ false 4 false + 0 80 true true diff --git a/F3:F303/Multistepper/proto.c b/F3:F303/Multistepper/proto.c index 01eff68..6035741 100644 --- a/F3:F303/Multistepper/proto.c +++ b/F3:F303/Multistepper/proto.c @@ -40,6 +40,15 @@ uint8_t ShowMsgs = 1; static uint16_t Ignore_IDs[IGN_SIZE]; static uint8_t IgnSz = 0; +static const char* errtxt[ERR_AMOUNT] = { + [ERR_OK] = "OK", + [ERR_BADPAR] = "BADPAR", + [ERR_BADVAL] = "BADVAL", + [ERR_WRONGLEN] = "WRONGLEN", + [ERR_BADCMD] = "BADCMD", + [ERR_CANTRUN] = "CANTRUN", +}; + // parse `txt` to CAN_message static CAN_message *parseCANmsg(const char *txt){ static CAN_message canmsg; @@ -134,7 +143,7 @@ int fn_canignore(uint32_t _U_ hash, char *args){ int fn_canreinit(uint32_t _U_ hash, char _U_ *args){ CAN_reinit(0); - USND("OK"); + USND(errtxt[ERR_OK]); return RET_GOOD; } @@ -287,8 +296,10 @@ int fn_canfilter(uint32_t _U_ hash, char *args){ } int fn_canflood(uint32_t _U_ hash, char *args){ - CAN_flood(parseCANmsg(args), 0); - USB_sendstr("Simple flooding is ON (send with empty ID to stop)\n"); + if(CAN_flood(parseCANmsg(args), 0)) + USB_sendstr("Simple flooding is ON (send with empty ID to stop)\n"); + else + USB_sendstr("CAN flooding is OFF\n"); return RET_GOOD; } @@ -343,8 +354,8 @@ int fn_canspeed(uint32_t _U_ hash, char _U_ *args){ uint32_t N; const char *n = getnum(args, &N); if(args == n){ - USB_sendstr("No speed given"); - return RET_GOOD; + USB_sendstr("canspeed="); + goto rtn; } if(N < 50){ USND("Lower speed is 50kbps"); @@ -355,9 +366,10 @@ int fn_canspeed(uint32_t _U_ hash, char _U_ *args){ } CAN_reinit((uint16_t)N); uint32_t regval = 4500 / N; - the_conf.CANspeed = 4500 * regval; + the_conf.CANspeed = 4500 / regval; USB_sendstr("Reinit CAN bus with speed "); - printu(the_conf.CANspeed); USB_sendstr("kbps"); newline(); +rtn: + printu(the_conf.CANspeed); USND("kbps"); return RET_GOOD; } @@ -422,14 +434,6 @@ int fn_dumpmotflags(uint32_t _U_ hash, char _U_ *args){ // "dumpmotflags" (3615 return RET_GOOD; } -static const char* errtxt[ERR_AMOUNT] = { - [ERR_OK] = "OK", - [ERR_BADPAR] = "BADPAR", - [ERR_BADVAL] = "BADVAL", - [ERR_WRONGLEN] = "WRONGLEN", - [ERR_BADCMD] = "BADCMD", - [ERR_CANTRUN] = "CANTRUN", -}; int fn_dumperr(uint32_t _U_ hash, char _U_ *args){ // "dumperr" (1223989764) USND("Error codes:"); for(int i = 0; i < ERR_AMOUNT; ++i){ @@ -559,7 +563,7 @@ static int canusb_function(uint32_t hash, char *args){ break; case CMD_EMSTOP: e = cu_emstop(par, &val); - if(e == ERR_OK){ USND("OK"); return RET_GOOD;} + if(e == ERR_OK){ USND(errtxt[ERR_OK]); return RET_GOOD;} break; case CMD_ESWREACT: e = cu_eswreact(par, &val); @@ -608,6 +612,7 @@ static int canusb_function(uint32_t hash, char *args){ break; case CMD_MOTREINIT: e = cu_motreinit(par, &val); + if(e == ERR_OK){ USND(errtxt[ERR_OK]); return RET_GOOD;} break; case CMD_PDN: e = cu_pdn(par, &val); @@ -623,6 +628,7 @@ static int canusb_function(uint32_t hash, char *args){ break; case CMD_SAVECONF: e = cu_saveconf(par, &val); + if(e == ERR_OK){ USND(errtxt[ERR_OK]); return RET_GOOD;} break; case CMD_SCREEN: e = cu_screen(par, &val); @@ -635,6 +641,7 @@ static int canusb_function(uint32_t hash, char *args){ break; case CMD_STOP: e = cu_stop(par, &val); + if(e == ERR_OK){ USND(errtxt[ERR_OK]); return RET_GOOD;} break; case CMD_TIME: e = cu_time(par, &val); diff --git a/F3:F303/Multistepper/version.inc b/F3:F303/Multistepper/version.inc index 8027805..5630367 100644 --- a/F3:F303/Multistepper/version.inc +++ b/F3:F303/Multistepper/version.inc @@ -1,2 +1,2 @@ -#define BUILD_NUMBER "192" -#define BUILD_DATE "2025-02-05" +#define BUILD_NUMBER "200" +#define BUILD_DATE "2025-02-06"