From 9e49ece90f0cd433e48ca8d431f41ca2923da566 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <67171972+IoTManagerProject@users.noreply.github.com> Date: Fri, 9 Jun 2023 01:11:15 +0200 Subject: [PATCH 1/2] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D0=BF=D0=B8=D1=81=D0=BA=D0=B0=20=D1=83?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2,=20=D0=BD?= =?UTF-8?q?=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=B2=D0=B5=D0=B1=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_svelte/build/bundle.css.gz | Bin 5498 -> 5516 bytes data_svelte/build/bundle.js.gz | Bin 48822 -> 49944 bytes data_svelte/index.html | 6 +- data_svelte/items.json | 186 +++++++++++++++----------------- data_svelte/myProfile.json | 4 +- data_svelte/settings.json | 3 +- data_svelte_lite/settings.json | 3 +- include/Const.h | 24 ++--- include/DeviceList.h | 5 +- include/EspFileSystem.h | 4 +- include/Global.h | 6 +- include/WsServer.h | 4 +- myProfile.json | 4 +- platformio.ini | 5 +- src/DeviceList.cpp | 120 +++++++++++++-------- src/EspFileSystem.cpp | 42 ++++++-- src/Main.cpp | 78 ++++++-------- src/MqttClient.cpp | 45 ++++---- src/WsServer.cpp | 28 ++++- src/modules/API.cpp | 6 +- src/utils/TimeUtils.cpp | 2 +- 21 files changed, 315 insertions(+), 260 deletions(-) diff --git a/data_svelte/build/bundle.css.gz b/data_svelte/build/bundle.css.gz index ebccf5889e9dbbee35014ad028c67a80d4e1905a..8c7bb6f3ef7dcca2b9354d4151f3c835b1bb9e25 100644 GIT binary patch literal 5516 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 QuSd-7b-|>FJq(Qh0ZrDX9RL6T literal 5498 zcmZvcWmFXG)`sb!MMP4O?vfcm8YG8qq`OPH5k$JXOBi|_dL#v;V+aWWL53Q@0i;3d zyz89vuJ4?)zMuQr*S`0&o*(-~0zSSDZJrGdhPAJ|t*afMjkh<(f!SX2R}k4fiRNP& zd_pjI*4rfF6%H1`73OO!%=ayxD>8iPnQk>>&A?4&#Qee%q!7=q#sPgC;F<#4gL~vA z492^rC-wq7bW_nSDx?PVx0C}bgIuE_=|(c5NAVmIM%pI@`T^Wq8G`{%tn-<-BVIAG zYW2?v+B&U~#6_dCK`eD8k^NjFWu>CLQx8rh*o$ozk}&dzfcP#~x&fjBh%ngn4IMvW z|0a|44sKk1sAbPpKT&p0C1WG?Bxo(@>lMdHDGh-6XO&a>({^q2`yX!(h?q49HhUh#ZQWtwzRz6T$gr3mG-!d7oD!ea|Vnf0z@E7RW*2b~;2OhOkp$s&dEF)_c z*W_>$AEgV7CO#_Ps=|m;PAl|VvtxJ13~nEqNMKltNZmj~4VK^vS|7GQhb_ZEF)AyM%81+}Z;#$+zK-RCE6R7{$tfz!W5+x*-$~K=Vihpm z>6u=&mT#%sbGr*vHnvDTkUA5r2uU3XBo7jG+pX%07holxP%?R-iIa2g)0rlBv5f3z zoDogw5|98dKkJbE8Hu=Qd0nJ#ZZ_MfYs{y965b}l%s6+=ZFH|9h%TEx>9?fgH!#;| zz*iB6_ELab8qj6p5h~gNX%)FcEQzzJh1HDM4d#g_*RNpy)6S2qt%0%MLao@G8Yk03 zonK4Zn&rM(8;>;$W%^u#-TX*>W{lTY?Yuu)kHOM;kl z1Bf-SH)P|4j0DyK8%r~MGU_iyK?2bPlO{P-!>L*|<8!B>xj#!~mD^Y@G}BY2PFXSH2v2Ph47PtrrRQE^V|2MHBS%z*R7&aqT?k)%CS&SnD3{iAOJ$02;T zO_GilnP&M%%nf(PTYx~?pkW2-t?5K8#X&B$1?h(-O+xEGWqUU}h?oAK+UfE-8`}$V zJ8Rm2>DLIb3tmGaYA5h7q7=RHioj2jE|Z6dwDFN zOC*6%{e`JG^LguJo~frnv`?YpSGS%=&;Oh{to>2VzsHx)9UAYC>~^J{V8w!-#SWot zHN)k)nFOQ&J;$ticrDIF{O})}<4I#Bj>62iH`^;(zJBl{6vJ}y@_Pj2bOisL+`6`?28IMu zIJ?ky_0x@p2*+Z+gUNKA}7MH_23jwF+=p^#Jx)^!DNvKpD#1B@w-9n zM90V<`9ibM#qLd;?wl^&$xGqI_F}2_LOL_%kB!7t0s_uNo7)OAjy!RACP#1YP8WVZ zc!h$@-RqNIeUetbFp?3>l}$sg{3i30t#Tg8U zWXx+$kIedN$IP4JmG@rCQH%~oSco zCSBBq{eq|qx#lgPGj8(%hh+QT53fjdR<9*}iV`cQvW&BRgMEru;HQqfp>~kZKE4>Vc&m7B6B`!iZF`er=XZ3|BOV# z1Ag?2WxzZ`Ne4Tu?A}CQSi3dmFI}VufjY#%hHs7|k|nX#iyGr7ZKWFYtpzOSgTiE8 zAQH87i~HtTly#{l#Bk1j(<0&edK#ZWcyB2Inq9ar;%ZwotR&LHA%TCTXydR#-Hp7O zZ2=+8+7RN_zvbDN&D6G^BTpVJn-91?@dSk0&&-pLN!y!uP~`Eb@ftMjKDbKui#1c2 zQKze8CV4u!)ZTH`yo0Plv);AzA4o$7b>I?WcLYL(F|x*%;wxX(&_B23O(R=ni9V@> zJ{(lWKu&sWh{O7yryMVyjrGWJz)Kx$w%sPbM#gDSLc|GY+kZeajYMze=Z6kv2Zk(! z`c_oA>Jo~3?^SO*7&{KaXi>cWUM}>O&vmcz#FM~p8yVMC8pzT1k@Rti`$l=*P}}B+ z=9l&zUAgfFnfr*{S7;7_0>sVJ-mF#!0{=B#PSeM*tkN?Ht|PLDFc&Pl;umP|k^O1T zYs1Mpi4IiP81s1_OagYY>we0Waz7TBrF5BRI32HJmgNLVf8n721?#Y@MDbPCCyLT7 zo(tSn=#l^2&VqMU_J(#~jf7wpK(gi5y__Dp{GF%eg7AI7mn95i312bd1nf0H@OHaE ztP`c*l1|=C3+v4reMy#~ zBUJZ=4!qSLNMgpG(~=%krTVl{f8DK?5fam!)8DjyW<=?Fwt>KZCwa>`{$6e|?`6l~ zG43L-m}TQvdoCCuB2sQ%@3GnQU#Cl3VV7J~C^Ex}ww<5!9RelA=G3SKpi1Yd14pvA zM(dftqs1(sxWA!)apc2H-iOMrMZMQc4~gyaLVJ>IR)Uh{AVejK!XGs?^Bk4ob!2}-LsW2975|TiF3cXPn%Wp{Znt7SVtVAZK%`c zN(<@q?WkwWRQN!^;R}MMy>N67s;rhq701kI8^Ohwcm`@cOyA|mLsV%%$FVeu(##O+q`LZ7JZEO0eN!R$DS~AFsMMMDO z2!~m@E#2i+{<7542Dck*;()ev;sWP!0h?baghT(AuYUtYFd1FEbmJQ(=#2n-6#>Q5 z>*yyV0YEvESwcS>7q2Fhd_A!hFLoH|n4u;=DHH9o%~RPAfLjvfUeLe?==;`IrZ2LE zQ@<|Wx-VDSh(+2Rkvr&h(Gx6p29e>8yOiuJ5TG61N`K+eHVF=V%&62q#~O{!p!J2~BW^`|D z`!Cs;2HV)vN8#y7HfpS2)3S1$_{v5sPa;}N=(#=V#}cA$b>3jNl+X`YiO&XJYBfQt zi)=u34g_#0Pb;xc!raIS#>2XOy6&p(rVzMk$ampQ(>`&PPPCN2&j5W64HrM7go(Iw z_e9rZS2^yX#kHs5-N9$$$dxL*LH3p)l5!~_jy1+CA=~Mh45_DyGH9P{N}()}k> zjz_|CZ>!>qJN}^^-eOdmaQ^0$P@@ugfByF=3LkfYnBZ2_Z*oY^)(i#fx4sZ{!SnDt z9O>zHPj8L#^)Ow{J<)L0!})jRG^EG^MSJ>|#ksmah=h-On zfSn$^h-bqa&)!k&mxiuiz~uLgq78NZMxPi1qxeeJ8CvQ1D!aqt?GE@DB?Rpz+0>WL ztaEmZz737We_sJWieqZ*#$gr^0L$n1T8HtvUC+@^^oemzw@0Y*Lrtd+TY%y`zh;{B zH*^Kczp-QC5`EscV$2Pl82lS*dE?ppfxt z#tBOmAl7E2GDUJA93zmvwJXs_!?rjauB&jhc7bR9=X6Npq6C5V_PQ zd4XZ@7%>5+U@(?RlH^_DT_85%nLd~!4E+k1O1ZdbNye2m;cLe|=(Cq7b+pA#-toBu zn@Gf&6O?=fc^4HmQH0p#$hSY-d9VH8e(eB{;!==TiF*WR6$Acw-n({;jF#_kPw^n~ z8TNL)jJ?-MtFcrKbnS5hw~gzQiw!}qa9Z^n*j(T08%y_1QjTEviO^|A)jIC4*Muc6 zcZdWN_)BpKvVRtOw&c?sqP;VCgohHJilGx-X-G13y+TRYQv5bcB7Q4p_xZOC-MN#? zqk~b5VNOInTy=`wawtMaFOZT%2vuBl^`V{IsBhUERP&IZku$lo8wuMD`A%^h0-Zh#5`z|H}amI$3&gyE9Ejz@@2!4D_2*7Ii_%} z+cC7A-@D}vB#&cp8?S>wTUbXp1S9>oMV~X=TkB+*1j+%^0-)CyU^Z3VfzS@c(0ZnM zt3_HDH?QEc`9uzbiEK_t2EP-WzqpPS&>BD1eDL|5nNOD2kPpRq{Q&`Q-I^zd!O)+r zjez=|;prN>=@{#Q##$CkAx>7BUEDL)a_%nn9DW#IPnW^?buekjh8mg!w(!Hq<#f)2 z7OiMnarJ=lia;iqi~;Q+14Lf*cExyAWO?j^{AEis1L6l&LaJx16SplsjYz9wvVOb0 zW|kq|LZtNu`cJQC#SYxO2;)dU5JuyZWMPV*7bcu1*S}-CKax|7iaqnUyiQorR@@}O zqp8WFbYUUlHEXk78uQvE4+c*}LQ8eLUft1d^>N`hUZ2@02N0vrKc-O)%#Ucb_yq0l zV+XNklt3<8@ux{`6YM0{{W)Jdt+ICCahCg--42))nhmiwPbGz?MDI-ynOXZ4e8x1L zOHOj{qbQql`{~dl==`~q|=~+OeKWg-Qxg79w6CQxos!0@*l4NUI`cPf*?Qcn&WB2F z-paLV_IbR92eqnE6>KIBW6$UU8}=bi_Kk?_zTfl6)uG?N_F>u%?_QdU-~q0i9!c$Q zAF&EB4QUMZ02odB{y5xEkd}eK2Ht{>R@wIcRX%KUTmA8#RPD!7SZ_e7AvA2WUHM-~ zM2)^#F3egQ2f@<{ZP4EB8Ma(1KZ%uVs}R+e=&m3D1Nrv2FHWn=&w{uf6L}>U^Sh>q zmG|pq6~OTy_hHyJ>;8nbyi_nOR)13q0~Lee98zjIWC9=;dcKXV=pJjDjYN(3+me5L!5M5d}5`DtNKDY<(;o_mF} z@faV6Bu<*7XG9} z6muU-u^YKk9o|Ml(|!4bn_|DsZuCymG{gKxYLgL7`&7m~g%F%m{{AnQixde|!X?~2 zc1&3cmVz}iO~Q};BATL$oAp9u&pOjqR#{oAR=Lwz#TBPZRz(;#msYU_gD%K2175Ss z))e32uzvE(61;7`zrp)+M7R6Jqx7LC;{PcmuIU^wwAXMbYStcvzi?ftRWmEJ&Xpxo zydR7Trd)n-!LH$3TbR}0F$sKfugB{jnD-6QbDLtWC8L^!NK}Pj|BNcXlyrU_h@n$b zWE?Zky?ZRU@h5r2l-5!OTg@q)lSBZ5SqbXR#LJz<(A~#Se0X-t@^3cxWbO3t&R=>B z*8jPJLVr)RI{r__e*`}xEyt|9=ZpaV2g9tKLq>sm=cEuySX6X=q=`VLLdk z6O$B{MF8&$Z8Go>)4epBhjf2|vu^8uV$j>@f71VQi=TmyqSEjXSN;-Y7G2Om4ZZOG z@EZty`>~*s?L!HM!@oXa+h!wb^RnAnF3${ucDn1=E{&!PLW=}@c7%pjRF2ufaf>*q zuq+J-@`_eOXeruXp)lnBX2rittNz`Y9-&cr`Zxc}t@(Qbrtm)*f0=&=ZwF8(6&`EG zsr~n|EW1?QUKi zZVh_9-d1^X=!Gt{^Q)n~5og@#TJ8Iq6H-yH<$pOzXSF0Z<#ctXc9ZG!(FrPhnwFKw zM4>oTNQ|RWcwU#mLcO8KRr0EAq>FuBRp2;_N&wAK)jbrI8?%9|G^(W=O>ivacMh+{ z^aKZ{Dxyt?qdt`bE@IEy6k*k!CRGB+pch{TVt0sNXc|39W(yH3<~s7cNZ3qoES7AK z%75y7rpfMQk{s~1g<#N?frdPW)m&q6n3Nqu=~Wqg7q?X2J4~E>}caHZ^4)PGjAJ{teDH~eXHGbB0*|K<~NA-pC@HDT^ANkkWn zd*M&`S1k$PYpL&r^~B+?rjlQ~^L*|He$WtR-|HNeGq*(iJ*3<4o9ZP-X!OM zx0r)#k?vChBl|2N-^#dPXeOrA5r*nF9(VeCp#{@!+wbmNN`KHFawG?pC=@tDsow$X z67rvGgZ-l&>c3#9e~d4Rs25Hm(C9q+(NQ!0N~zuA^0M@Q>`sF4$N0zY+$R4+P9knr z3cmd3?oyym7aKV?Tj)lzB z?;}K`8BnD;34SrdN(4C&?JPZ1{f6<%Nk0c~FUOecl9giA2s9_{gUd`w)yu++V+h>{ zyS*aSL1AFx)>a}OeJ#RV)pw!CElNUnu%g+L8!}AV?WB9`qf8Lymw%Vv$xd4iRbzd} z$s8T+9;7os@>A%D^<~GXTC)t1tBHto=dcD2%!#l!vxMU=tEyF2IaCCmIh5&d*hN8I z4<$DEy=9+e{Gij1X?CO}rd~ke1tTF_SYkDxztEzr&UAf>`#u)5m~e4O1dutsrGmC$ z_Pfhd-_7atfOUqD*MA~tu!Df2g4|DOD8nS2g_Cf>(^B_w3YPfVH*aF-~k<369Om0yI2BF7=irBX5P+FpCuQ0E}q< zKLgdIS|oxSPDfKKBMBVPYlI-Tgt<_(2+Mcr{H<&t*k6(7RezLrtE4y-fWts2ZaJK^ z+Y^7z0V&%KNVZ{)&l#`9s32U*Nq2d9u?&5lCLqkx5_=kJO=(nOO&VodAz&bwCK4K0 zd#FF+G$0C`cWp!4?YW%6NOr$5Tf&2OyS{>z1WEni9-~%(d!!|1NOIPu(zKiTy}*qd zi>>YcWpD2??tkCEFaEUMU!tQGkuYW!55498z)24jJ8uX9WHGe3v5~jix$I{UYE;WL zV)y8LTA+XxxTY^w{rS2m5;PS021yB8P0>OF%Dr!Z4d>1zvESVp_1KzNjubz=BKHI` zF~v--3bgniJ`ul3#Jr@rqie)Rl1+~C0w0q_S>?xAPJhXKKY(|>_NUNIW=UDL^6KJ- zqIyzADye9J(bI2NCqV(d!8VmlDxWDB+p0N*iZrylJ<$HTXv}+SY>|VX$@P*!b!nIu z>@uA`33p%vT+o5A3 z77K&MW`A9tz7h2av2!cnXB8nRMswJVq0o{VeZa9`N%|_7a8+B&z*5;pVwT(1;8V5O ztitA;AWWoE&U0!g?M-zx4H>MSHVBdm6OznM^s(6o_L0HpWJ_g>xIn+7Tr*9V*wJQI zGD2env&lu6#6}R!;xWR;NRzUL0X>tZecCP4_kXmkEaS}2p(O&vK!O_hR4E;lyXWLC zsQ@W+u{3btf7XJMu=3(l?Z9t}X@?&Enx`2< z+oa5yW9V|UMyfuI$0GD-`QL$AU=J&)=>k~wL9`@6RGx-O!rC}VWmIc@H#wv+q`@7D zC|w5OMqiiMz&JB@QeYkbAhnR_*v8O4*?%$-8?3ZF)kzmsu?Ou%wbyi?OJ*>Y_IT;P zVaGrrd&3vnyw}ITi?I$u1JURun|pR>t(<5wv8l;y0Y>S2p%*Z5m$D@s5roEaK=!f` z{fVL4M)aW-u&@FuE|vy)ifM@q^#QP0=?#pv)DtrO_V-M)M-+;_-P!A&HrIr!C=$l%N0Jtn+ z+w5X!#$nh2$*d4XE|3_OGKN;>7ZN#$lBgku>^lfQapoz=F2kR=){d)2 ze6yKQV&OkIl1+TgGtX~kAv7y?Pm>lb&2&kISZs8U*&wp@Pk;Q+(N}w$fj^3V9w9*A z!H7a%`CahMMvKKS2=iW zOGiBLqF+=LwLbPJH+?O=2fr*^FcM}rtJc1NQIM^KAc#)_CKwoF8GjHlwX35RcZhTR z0^%AS12n5ZvLwnb3aX-rK)?)&mOy}ps7$WzjzyJFs@%rFz-WMx zttAAnOba1PAEZTD@$gexO03Vx z(Tq1FlIuzaEi6<&;(tj+14rS4HGKW0GcW;}vHFFI>JG(~`9!Sk8scpLDYlzPu>quT z4w}n_I7~}IwN$+heBBH!7FC#}6svHl*3xXe*4I*Mqa3;J0`kBKpepc6kpnHHk?Vpdy$Bsf zP^hV&FJsk7(tYa-+$v_JbfX6qkv;`J^;8(|f!aa7DJ?aM*eZ998dFzWBMm%wNlIVoD`>~;B( z9q`Zuy-GDINPkJjfP5^lm>@+%&exP?W^!CcC4FEm0YyZ$x);(eNx&0t>6`hW)-Sa| zgn`ZyeY=fB%_`Lgvd9lCnv&Bbt;keAl#8DQq5SIUyCt6YxSk|zT(ni%c4 zkmD|iK##sA9Rgh$24%Zsr(7AWwuE6ff?cPG!WYEZcz;i!6IIC%XZeME`g>WM^8l@@ zSb;4G>4L;<=4t;JQcV8h*w#;{=C5Gqhqyh+VYnV}+M z<~YifR4D{415(p8y%(`kL@@Kyu)crCBTvTk@VT^$r(G>8fae;gkCEHZpzMW7Wi3I< zFsDc{Lmd9vD4tPzm()hntV1mQgvtVLrdPXd<$oA8Xh;hjwAk6$uk4b;DqT!dyc#-d zE-EhUw5pb*jvUKs-J|Hc@B+Ev3(!&gPOQaM4JE@AT{F>^M>kiK<*L28_By?i@U;L@ zrpp@@ttR~o)x$wsb#bRn?EhUol}wH@nLNUlPJK`9>Skzmt;YAD8A^fxy(b{%3V%*$ zclQ9+Abf&$vhf5T(8OqKLPf}Lvg!4p<|B}*ggGe!;L?NJgEs9!Ec`Mwpv7o{diXO9 zZ&X1v^(jDI0etpXB)^S+piCu!BRc0bR%PP)%Mis>b@b(08eiD1qFOA*dFKKMSlcOr zcP6`Ldmz6<_Ti$B%=8h;bZ|isM}OtWM^_~d`fYFnYBChQ2xcX&ER^77bVxvjz3TR%Bx=PGrm~MncFS_=46j^QLml6c@0a&+@8_ zSkFaZlF!M~2OEOar;C^tL>xA2w;VNbj9IxQI>uSQ&2*fzikonsD0V@L?0=Lho#T(9 z#)BB^Z>OG6EkDq2=%WkSWx0^Baec%oJ*1+@0U%an6e0L?HIIM+>(0p=20UjjJnE#E zB9d%A+pOeMR1liAuSwkrb4PhV4&8l|V>e8kH6Le8?tm=;dAtax;oRBh zO~Z0eZAg8M33di%KIOeB9>!upu2W2hi#e$wVWIY^s_;z}zNi36HeuV^19og{cHP$8 zc3X1?t#KT;uyT-791~o&&Yjv>eByiLbckt3pR+WRlG%RWz=ZS8`hT$d_V4Q8IR$T< z#DN<+AK0vgDtTLmbU~BmX04ZmHKwCzAMl+(B%l$ud6>`gqMq0}O{dinvJ4vW zgq=w;M@m6^Xlqhw^?z!T72BL)ON$sGKENa~B=|8-8-5a>BB15H@91;zhM|ovvbxF- z@}`}gONxQg#eShB>y9~d0Ly}5BL-iD5|HB`b3W#G8RzVWiC<%UFKdjCTLQKxnJow_ z7Hb&<=QES8N1~+5aWpZ^Gcs1QhW+jiq6xnLT`P^k@H8y63tc=fjsxac4<6#gc^fVM2 zQw9a-J$1g6onJe1YHfPEN{B=4g+G2?g%9CpGOO*WAAi;kkVu_tgY?l+FOne+^dorD z|I5!}G|wa{QqfRm%y6VaF<`=TJ^hScBZ&lOwF~)FgPL)TK%ytP*FQdu)hfDgNZmv#0UR`-p3Ct74ZW zqivdpEB4$vPP5KY2di))Xs^Gs)0&^rpZ(6D$LfsESRP0FupGRjk9nu(J*d@@p26{* zj(^5fonCAIuyY9Ktj;cf=JRBdR_C2NyRE87u<1n|(y?AEDbl0^OXO5!u?K_+K;8oA z2d$s87XG)=72VoKPij)9-n!#XvZ!(u$7dd5Z$B@lqUgXZ(V37+6>;0-iq6voPYDS} z^hagi(I5LbG(bw84#V3W-Uh5kLHj$vjDKq-S$YgDy;IK9O!sN^@6DPJP>6ir>Gupa zVQeW5X8CF7oV%grHRElT>EdH7q`jxf7vmgMtR0o|1K3`gNzw z-X&bg-r;|nM`UkwSVT-+VWe&5+qM*KKY`SpnlyFG-z0Yp8PQ_L61LE z>hcCLt;Ie^zEa_ac%`T{5_GUeg1V-MzkeDdd0d6R)#N63qhDhx-?_9x`fihU(YX1d zYOG#hMCE-`3?+`hK^PXzGC5r`IbB{L7q^Q%o)(B8N4+8*pHgY*>*OKB4rU-lsh)+r z@_|{_F11UVYb8bmyE^`Vw6E=U4Xr`Q^}h23A7141leR}lX?C%}qjX{_R4VH`GXCo8h^|$F_z!_!N-!UtyhobVDG9yyt^`p_x?D8xI^{o9(>d= z{qzSPrYb!azhlbvdn?1$@BeYetKa_2+4X~KlB%Ec!p;hrqDZyIqH1J6>Dc!sTrLk| zEt%q&Qwi1W_IKLJ*+xYprKP%sHtW* zrA6V^Hb*Acn@3fytgaNN)p2KDW~*ziRf8yoN=D}LCsBPnM$LLvf`OD>Y{X7vPaCld z*{)Pcb z5|HRw0MHo#ok>7vrbX#-9nk6M)Brk-e_}wAcq~Q%>lCm~C4a0_hPB>As|ItbNpz}- zbE?U5THp8hn^E(tO(^W@(iS?cPIoFe$6Nl)8F6Gb{!xB~<>sb508U5V^#LSvdL_%j zhjRn?ZtBAw>wvf*{!&}gV1tVs_Df#1oR%*a zaOy~7UuH2TLVqv>&vTA@sjcNw@yhsb746`4yl?<2?s}Uh+;4>8;YLCN>%h|z#bF~# zC-~JYcil=!wy?3iBqKpdvdMO}#0w%Bxo*R^U)%2WbyOS9TDm zhfKKN2=}o1x%LA&{SJ>j?nZ4^!5V%b-_ zShmS%jnoPgcg*|YJrhjM5bXB`I}JmY*%nXvrzxoA&rF({Kuq#u!OAG$3Rf9Dgfeqk=bXC`zJO$22nSkal_q0$!2hXC%kZK7T@vry+)Wz$Q4d5%Op=gm(l18>ohC zbctCA8nDX3?-SRh{do16t-Ku8T7 zA%BHb^g|`dmh(MSpCY_+EpTu+{y!%^G#3`)lelmt!hfvg!h;a)k-XR=(menLPQ49% z5cP1D?WLBqD`o4exlhq^4G3l^2nW^eMjZ3Zs4n4a4N$Rcr20TBIs5Ykg*YJ##Uu9$T% zm{2FCaX8}OfUZbm6Ti(`etf4}+~Ef?&Opc(%TF|0hlgnbYQ=W=htv3-)jsACWFV@Mz|eN7vu(kBAj9i@0Y%ae-tKBm-f zM&;(ZlvmU~gNs_-ovd+bX_(0dlyUQ3!V`S^9&K;)XX(i+tSECzcXHB!@U)^ddG-tc z4*;zkr|`$XA6q}}mzk4KqRi`F2Y;A5!>@KaB%U|v{7V66dFD6>sjhL*mQS4WrUZ|; zEh59V%&bwy)?z}6P#V?Rpvll^Gio{n3zR`ye5Q3twkfI37_p{0*$ zPum~3mr70RV{Nw!W>(CPD*hx82Z?_Rg}nB-Mrv_E+}ifPgrpynh5l-W21r zJWclbG`76o#<_QP#Fqx)SOoJo{hbDlD?;sU7o-fS+HMJ(>%h%*aTalk-7Kz~3f#@`NpY^h`02U%s9>5o!<@VzPI-cUh*BZ>1Z-Swkt z!hmtuXQuilJ*Io?+^cR$=d_&}IdU@M?OAk1b8d6h1apcKRiaf)4d^=mBL8T-M<<)B zfULPCjx^v;eC!a1GrT7>ys~?%z0#H4$E}>8O3|s126DnT^f!D%tA80oLECdqsXOpi zhkUSh$On5PHxQZYGOC7YC40~tRq>Q}vLk^Hc3>EzMyCb)vIW4e#g?vLj4E@6RCKn< zNYd?kku&Mf>|ooW)kZ<9Py`T>Lp~RWM{x> zGZu7NCH=q+llUMtAJqs!-X2MZ>AkN!dBG7mM8}yv#?GldO-wATzsuOc=g;M>z%LH>FOSMu;3uPC?C&AYAOAee}b8qirdkNb~2)9dQ=EIg!Eb33^NZJ=(KD}{=?{lx? zHp(!IIR!3_iEl7dmbZ;~G!KFof6#1dSDj~pWzPvSHOgqFH{~A|j+0aE5_D<(%4z@$ zc@ElRXUmd-jm%y3t^iM)0z4%@a`*DMR9(^F9{tVa&DDG@BK|DNJ4>2=o+rn$lkAMH z%t4si#y3{BCF|05(?cA+CYwSUW%aAP!4Rwo#aW_!UE@1%}&k6Ms)Qq~2;J&h1;JXKp@V4+-;q7F_m?zBf(b$xNqTzR}2Q0y%O6(!I+g!Gu@mI%>@5koyKU6rkT___Ru9; zWAxG5@yHE;TNyzj&xpv@f0JT{9vynMO|0j&{_^=k7j2*4hH$D!6(@e=S*++Y@gz@* zg|wQ9K6(u`asnDe<0#oGu${HQb_kdaz-Qg1gSVRcG&A~4s4zFK7TsN2beD?S0Oni{ zxp#(j>sgrK>l|O_;f&)1;wBV_uX8Q4pLv@|W3fyr-p|?3)z8&ae{VDAxJ1W%O|l(P z@^25n1&91}gqa@bY~JRKqbK^5oA_wCI&lSfQ)3sv)@ZZW?U>jzyGZDdb{m} zXnn@Qq(fZ0bEs4Yf4b|F_vn3GF*qaXD+;LB>cj(Y%zn+gj~Iz@KkVKPyMsOF&QBlF z-5o@RT2294VQGRs_?b@|ptr6HT z{dj_Ew`+ag2hFE&-cnZ=x!Cojsa%l}>FW5`AR})uKU2z9NrUsomriTp8aQ-+FCE{a z3>M(@Jc0=X6P*BI+Z^+rZm#m8e%Fa-?@)P2+cx z&l#CeVNsAo3&??IFV0A6Yc(@~1xB-;lq149X7ax}sM8$1o6sOkXcUSl`+cK$7U{8? zp5t?C`wusuleED5Egv4zzkeYb&a2=onn97H=G(VwW; z8U(9Ig}62|5S8KQ8uBs`b^IcMf?sp!@={^jV!6Jk{qBqPA5R36&LtOUcl48Ku&War zrh|-32W3-y>1rT=YIH2=G|`*@NewVez-@m(h`RR^(iy+jg#CaEe!8$B2dj6 z^%TPmr=yb^Sy*3u99>L^FeWfblF{KxV#piA zK9SV05^c#L`FL{ZHHe{;{Z4Y2{SI>Y47RDV=FZu`FQl}DpG`pi=4H~Q zM=Z@75l8pucm`cmsGfH#EyV`YRf_Mb+#Xjx&L@+y^azQr(*|)P5yd(sjyN(YRk; z?og=xi*$*)!y`07HL2X=hH;bj-1mOJ5V!5o6}{w7_n90QC#W1PAtx=NAT1$@bJ7xK z`04K%PSU}P3Q~~sv(y<-M?7(pZYmZC)fnFkP_z5IlZ+}F0j`s$Dj^ItXL)?ej8TiN zv3i@6)G8X6(nDT2-~lqfswd-U$~ zM+ zl&F+;Va6JVTXo#2*ngK+Z`Pz7muqA5_v@l_C(=0|r5a#eDJcNY8ymmrxI&OvE#Sn&XEYy(I&oOR9h67sPV9CvQ^J zPpv2`HC?2sSYO(hRrc&rvnM2Y<=uup{nSBbL|F2=MWQk421Usid7L9&?%TJ-12V-J zG|K{3DS7DPNxrhHUXNAv2{7XtiIw!Uqdb^{1KHGWdy@A9u*xPZe*7{#0FvBSdq3sBzLm>yxiIudMBA^O%gOS>4$j3lsV12BS&MEdxbe z0cBpnZVpIlFG+S^IJWG=9zV0^zo?VX(hNN;aj5ms27(TPa$w&B-7k1Ifo>piPXtzt zbHWTAsFR^*7y^GhsI}SGIzGof#`%Dspc){bpFOxY^2i?viaeBQ;RMB=(zZJ83A`h& z@w(%5Ht%6=ww)nVKj1VG>C8XI*$`yf+IN>O$F-8D;?|ko@%QIMi5&C#s05 z!0kWu2H^zT?HU?vx{Yz4di~wUCNUZ}=rn;D@=<0~=xD2cm|NE441;}0 zTSzeyzkq0=SFRiWVBjEl7Y*(<@;-$GxWh_9HYg$UR!Hc0Dr)Cu-=Sqv3OOe-vF?=5 zf$Q_BD*k`s7(mmqOrp;1JG;Bv_wMcN^n1IzcXoC{y3in_$7k=|87zltLOtm58wC84 zr9I8M3T|h&x4nDs-tEDi?K{1ld$(_i2D~cP2MAI8x`T!UUC&i<%deV81+mt0jyin~ zY1YpR&?yKr73Ik;+b((KAGZF<`v&?65J8&1pZ01igd z$_z0uLhS_V)qgfg?Gg~F@T>J2Ewp>X+5NZ}&TuF(QBS9D=C@|n!NWNl^<{eeu997S zMXYB)og{)pFDM7Sn>wnW(JTVqmUvpB$Ei83c^hT}+sLM#WoN*xI;h$ayf@q-6BNy} zn=gM*VJq$vVJX}>$APqE-~3BBOYH!g9TZ)(f5B9;+Ie1$~;<+(BWYj144Nv3)OO*&m{+@hYzw* zX%wjp_8d~*JGu+B$E7L&Y&p|SI2~49UZp5MJtq`PJq1TIUa_4IUNYwUs%~Ksa9_SA zYv%8mV?!0YH&h>NYz#S#57IBWF6S(fWdSQ=k~za5%rMZ~<1$~Q3)Bp>dK7;nGoV)@ zTD~Cd8QW7<17t81IoP81FD;uof0h*Qq+?^L1BNyrM7e!*QgYA1Fz40*%FUQUZXl^q z#+i%1{(fCxOse^Y|Iu6r+o}z=Q*D_mN2LhyG3)iRvE2G|WvoMdX@r{iS8)w-wGyFf zA?nA(b9AZDRQNDhs4DWvn>mHIm1~&JnLMn0{vKs&Z2XKC3vCPmESn_B!#nllv) znkg@ZdJ*Lzt-eMS#a|pNt=qKJ$YC55MFE!X{h$wvx0t|N1d;aNaXx>4qmET`#9Xis z@5NH9_4@Ss*A{|X2# zBHZi2a2D-D_|-I_|JFd$=Smh>ua+&|@Ux{34i1Ly5wmFUK?t;^CVN08&|%&GI_fvT z&Cjj@$e=zVKjnj$LcW-Pf!YacUFi;g(cIR?GqT%P3`mE{wXpRmCh0*skv=aMjt@)3 za_aih=k!}Ih53JQeVMb>GSXLOO|dmci4?Kjp4_>8w~d`H&hq0Mg89VY-oIXqW%Cud0)g=_jd11lii_g?hH1ZNWPLb zq!)W>3?aqYA+#6Lf8D#mP(4UMr&DqD>h}Ds(X3WJ3mbnii`j*0ONTFK>;4@cB0u)b#ZFOVNVL#lq4ps_v(&Ub&A3IiE->Dy8_SzgM|c8l zODhxB$LRI>@qRvox=`{*GohQJX9@238LiO{RnC8E8LdkM%&V)by3Xyj&|q2M4rT*&l| z9$$Y)yxGJv^i*cu|PnJ*8caGy(g=DyY*^ms!_x z(13}l*$3UgG_u!c+R<4zW}}Kco?fk=)T^!-8$Et=$S$I*;@nL7oP3GK4feQ)&94nC z!m$C7bTe^A8>ZbU7&yHjt$i!>E#QCDa_zdnbTpJ#*DWV>fiGKk5GIewB_=z1eSSd= z*uZp6y0Y`;3q3KJXzNL#yfEw_TgMl8eCl_Gioo70iNr?#TB+VJb22J#i?y@hy9}KL z?ve`YqB)kdd21?|Qc+ZpQv==%k~C_VwihrL`o^WD)s`a8a$phD#)^!$FThy{d*`H} zJ16miKwRO^u!$21nEayXF1(?hWww61`*_uoS2S*HR{0CMp1FBR9YzO-JnNn(YcHuw zwZ(?=5A!Q8sVn(a`MSUP$|ZH_`b+AH<|TCnT~haa3jgFC1LOlna9 z$TIw^+AeIxa; zQu$IXyBr7>?z*ZaGomsZ*13|H+-NCL%uyi~p@Q93!n>~`JZgl+dSu;WQXe(gY-JH~lL z<T!Lz582h(wI`}!Of2Y;*6W~uz$8@ zaBT9LIo=RU?nx8HJjNw_qrs_R3Zmn2%$d66giHDeOx;dkNE#J3dmyyBXW?uDj>$of z7D+(ETD7GESIAx8S~}lTXNIH{ijte-fALvf2_q-K#~(iX@Wy!W^N(%7VXYyrvu=i; z6`8H(*oxpTwSca)fEH^dIRP+%%gdg_Ra?F_Ay&jz&Z6w6I-BX-llhbOB@paaFhCI(jHlSNQ`0&(N%6ED2tQn?E@&Ze-uV= zSKQt?fbJ-@T}t2C7GeOVDy9e>9PHlRz3YWi`{jtF*Mm|kwP1=6;@}SQv;K?l;BInf zXSbmiBmUmq>D^tZrcysf#QyFs*R1qp342>0hS@s8+qe7uoretioC-{*+v0XzpQcj1 zgPnsrHO-nb-<=F56K@#`5wBV=f45+b9w&Pjc!X^EGhMqLws0MLuyvRo>zmU@TR(rh z>Hj>v6*PWjE^#I%$aVG3IL{_A(l12R@0CXbJ+SZ<=c3vj?U1y55;v-7Id*vo6&_D! z-G*0wyh9IY^>@Ppe{nzr0!VG!d0~Qp+7a}y9+C?T4S(h3i`B!2(hhjdf1$mwYM%5| zd(^eFBG$Sm>60~Jw5-Sf!$$hbOzQ4t8BAX0j9+Q};n(cOl-3`8lZ#1!_XBVy;1DUk-N@Lf+*3e-l~G#QZJCRY|L<}1`+R=>?{V~hkE2iWI9l;9y4G(f|D@a>tyuYWPN*Q&8uQ&Q+4%0v2eq;g=?NYWMNg?uda`e z+IfDSw|1&ez2uj=j123mO0N z&6qM8jYlm1*htulXLMpz8956KWzZiMTf{GfMFTkh@ z3_m_4P&%~Hh`GG%FJ+64p&u;@Sopqw{o;9-*K0n1N_t2S&i$XNKS6PyG0Pt&dQ@?a{Z)#Yj5H;49JxBTf@Qz3JVA ziR-3^gIMe#m9(T!2@`(zrd%ADb~{9}#>Q&08601`6@tScb*hkrXvsm_rjJypGxKYN zt44I6l!9-;TpnjG>$IdTpRRv@JQ|_N{hQ zf764mx?-qO-9uIQp=wqnaJ^zF{%hTo0+|7pjqUR5$iTttnrvE3$P97n4vnh(lvC;% zJCla^FxAzD>52+zrPcHdsolGzGf5q*YUo%xHGb(gW)iM(Bfo-3?WcS9XG;e~pfhYknVocYu>bYI=( z|IwR9%^aXi#S?QCyU!{N&=iH1P)d3gH zY6r)zbZn%OT1i!nQG8j(eW2pCc-Dj9x{1_q&!twg)Ua}OpRO)zyWvVc+KN{fe@jvG zLmB}~@{KI(R8T7m^m7*%>Y2Qy0n^}RS8lwU94uCzCG$o@)@jYqcFh@Hv+N{J^l$dA zv^S2X2>%sl1ZFmFJG(x@n{_6uT%5Te=5zuY?~d&u>lrgM>)6f8CnO(05mw*@If1R$ryQ{0KtE;N%s426p1k=uZ^0?>H)kH-m$^g%e`t+chD8Je zY{7-ur&BKeu^j)<;hsK3f^xSC7X@c+o6eSdp(5I4kh8`}%|IyXnCXSrF*NY@P#xua zYki4(*?p46y+1kO9Gtf!*50XOA0)fjk|BGlMZcw^KXllPyrCmMNQB>y$Gq$Kd-==E zk3P3f8JmYMbYO%$fv9n1e`Q!%obB+%JtREp)RRyNqH+K=K+3=RzMW9uE|wAobxH)y ze8-u62TLyIndV4H{hc!zW8$nt&K%85#?vuRx(^-Bk%;DQj$|6SW~IVB-_tstv(ibz zH&;^J4bPPhtM%@rz}lWKxtw20S|&3Sl7G6Qn!5N$mBXq|WWb1D?@IO)x_?d`tHE~S zs&Dx+X+td?x%7M0XP8(MwzIQoHi#WI6O=iqKqHp>2#MvehimcNY|#>0_Ab}@a-Oy z$|d6_YCGd6fw$2}e9TmWV4rAFS2~<5Nl)4AUm4p@0r{t>118A2O!-x2>tSkHdG;yL zd<`aG3suE> z)N?0+9p7;h^^!I5GKt>04h~zqErHh4`{E3mR-|b6u4JcBpMP*4Hr&VW?ZYA+bC{s- zn`8<9j87wK#6=_I2vbNahAp&~z$ zjOcrRLd_^rDm1Q;{6YI|Yt17z_@tz`OY+;g5nd3G37$@1T+r7|@sKDLIT9Jqw<1PJ z@dyG-mrnuO6@Qc%Mu|Fq8W=43YP*nEpR(bz6+}4$YUM^_hUt2vn1g;z(NN#Og~{lSvzd87$Nz1XR)dke4OW*>nB&Ri&QmVga#r*y%pDky5$NBP$ClYvpDjN}3F% zf-tkW21{l=SXNXB);oq)stG?#leSR<_@6UoC|Hh|86`V#|FL6a%*^k^g*Q-tHg0(b zk^X44lLa$y$J!#X)tFNydk;cgp|}^a=@iahwSrpZm4gqxhdp`U3@@^EE*vp%>c)-x zb9DUV_HpX<_hbQ@ii3a*E>7tY<-Q9ifI#6jAj19&)oye>>iptC zQ5~|K5Y}NY*bR4^aMGl;2%Wrth)%*%xKEyKmh#E7L_T>&mBmPuip;)JW8b`xkJV)I zu^M;ZIyE)-OCc*`ul-Yz-^vB_!*)cu9Hc*P&i(N}YwkbBb5F7k~2U7MNBiIft^E^7ow5r)o#PK;Rq&&qTGPPEATG00nAX z)BdG>Tq_v-kHWPNhsx1^H;_iU`Nl^R*)$r?K)Oqikbe?d$;SV~kV+2=W7WLq7tf1+ zwz1=Rvp5afbWt^)fvP%Be@y5lEA7Wq&^Fg-%VR!tP8qY&co+@!b!bAUOz1E1nQD^v zqQi4(qjoPph|{cw)D8W{fD$f`IOT%;Sq_$J0s&>We?HGD0Cv@X^U?z)GCwed^`WIk zN`U|_U=(whBP0##ST7_-P?}?iF+PvCv?>L}8{PUiB}E#Kk!SRDvLpK|B@I+l*|z2M zq<`zWR1``rs_$go1~M*|dyryQVM%&@kj{VT@DM{7)7u@6KFbY0(Kc(5yegYZ>*Ixb zvzkw?SkEW;@8Q9Jy^)Y$I?6JfLTpthbo!G3`zXflGhu)LHEk$z5er$oAm3zdqo6vL zcFu=OQNdUN+2MF8O6hy**j(r5wpnCuUuh|t<`LPpY`;qso&5d=Z;SG1uPJrhdaf8^7b=MHoY2-Y zln+}@B;z^JjOPf6a$-CWDba`$<JD^jov8PRwUywm1G98b^}F_1box`+x9I`30Z|@*s+95r!bqh)36S~{t%K~YV9cy) z@x8n%(c;UKrH{6fCEhJ<&k}VlN@^PNerr%E5OVZ`00lD7TsI`Q<7bRSYy;r5eYr-r1aPy=dxDcGq| zz9i4Mh(D67?9!$0))dVT#mwr9sZ6T@8pV(7V&#j>Q~XHm;ZoWEIpWVi7-x~9bo4_q z)(@fI?TamxES5J_vq5f^@4{&Gj7IAB?Citnnbkfn zI0w9wvhHPj6ifb+Jn;8&_3nolEH5@@0yv@R3B@+d)m(jBKYyz}v6)&xpme ztk;j1EjkyCO~zeXHFCnIV}i+#HWQL_M;Q;Vh)&TR4yV51{kGNzxy=i?AO@^oaPx#{9En93vH; zOBf#Qpwode%>;SKc0Q)RVg&Jwb%rS=t&593$We`ML~Z9#5SQb(GS-j|t8QTL%Pf*` z#I?*tgNoJpjcY{gr4u2ah8w9#3wzz})x(Z?3blul-_G`BoRuw}*|JM3fMn-?;R!JP z_P=?nNP!`B>)@^mN4Oo5r-GmR47%A)FX3~A+FFpva z1l*SsI6GVE)eTK5vVO|;#wgMW7|)MGa#!$?v_!P|<|j7(;|M8zDn86L0lH=N+Xjy2 z+sbj@4V@_Dw1sG1*Y;WzT05D(dY(t{|GnHk1+xjgh&!iB zc?{&JPUf$!fsvR*!&@kP(Cc?WZPLN=us;N0$d{rK&fUA=n3&`}d>qopK~(W7SzIjO zjZqv$YU?~vADc3I5FSMbg99a4)k6J!BqJyo84K(5k(OeVDcnwkRzYfiHyqpxkHm?n z)M(pdPbwyz{wHTd)`wQ@S38~N_^PN=znN|W_Y{_5`O}#7-2oJK7W!k#B|i^E%)cWe z(ov+P`{o>(R*?WR*2Yb_{qEOv2>x?8C?ns!bHd{_oAcHan?)Xp5+#t*B|l4O4E`TqUEbOVmU-}Hdo?3}6KFx-C+fS~2~7LAd>-Ovvv9Tof=R)sep8~R!Yg08?wry| zT26aQcSAd;K0Z6W(+3e5Uk5bmvhNp&|3`(_A$VSivVaC zaURPTd~&SV2p{aR60Ol_Vc+S125OFC5-~?$Q&`%>$*!3gcOAKZ`~xGQ$9F&`r}&Pc znv{uVGmzNhG}zNK&wxAm(g9H?uvv@`cyGXq^EtWH%W$LhJ-Q?2%PU>i``fr(OuE2X zOGq)YYW?^eupuax`7Kq#NkPU&M>3ijdXct8@q4zGMNT^AxfR1ACu&yh;(`=MTAH^M z7$ss_3!*~!1!0GO6<5G_sEPN+%2DIAz?Ql6OKmn_dZW;f8gKh>wgHT>e9^q^8`{5Y zYNl4bITG+YW|OR9{y)l`069nEN>i!!j4LMAeC7{&nA|z)WRkL)%c9P}hxBz3hP(C> z@aWV|N(|ER~(5Az-zQ#eGplPQP#EKS z13Vs_IZ?%E2Uh@3Q(eHK5{eJ*v{n)N#`?3YdQWbcC-OU%Sv4sE7-*!)|iH+yZZrjl-63Qv%WT&Q|vV0xKTGz8muS?!j-V$V| zaa($64U&x14>zr&AMa7S^K=OWd=ATsf2c2i4QfpI2Ckm$!udOeznDi?>^qYdDh4=> z5=Z)5+DS?cYn#^Px2{@GN966%JlGw+gR4TI3?1O0b7W{eDdl3*05i*)YqqOY*d6e2 z#GBk5r|8B9rH{2?lunJCM5bWfn<+A9NPUJWmW6#Yrr$dk+t1sj#`Al&u*h&Z)k+6kWStYpuG`X%cviZl4J?bH6ML zWt9xHWvRDuHKhjix+I*KVTM^4_bX|CYp<5xxv{jyU3-W%(B8FKy-MvY**&r`NA{Ue zU$o`0P&kjUgS1wziZ1aJc}<_tHGN81(F!*s1N>}Qw8*xcE%la&k4=$z8B>vy;5DxC z6Jt>C@y%j$tRIgaMqDCMgDXd*cECYJ3?|Wb>{cFo6>kosohoGYg9%$>=Thi@XxRz7 zVWH?DIe{dtg&xs|p=PskGrC@usmG)F-PaA=KtBjD!rS$U@W&Fgk`=7*)1#3+#^}*d zYSu&0j^2mT;3m3~(BLMpl-sEor$x`c&l(fMRpCrHJvtf&iZb+2w8c7*PJEEY0$}v9q&7EX3Us|Fu01Z&+7~?2FQovhLsn1C1 zO?(snW@l%qGq0$eE@j4p*bG>-i?TZX*bF(&@-+la(EvF{u`#tR>~L^@hWXGFHL-en z8~<$|20qm->nFlYSRWnfN_TRu`1O-?H)ltz#`lB$bM4Qc{JX9n9mSEvQydXM4{Y}) z+JtO8%Xt#*=bGY!OW#_~cFJ3y4Wu=G3nGw@u-)5S)UA7!_5~@}5j%5u`~7F%n({jb zdU$on4zKT)B{Bdvl{*4|Y?k&gA0_qDEF6=>hC;PmCsT5r%*=KC-tuWuq>0yZ3&)ah zGickwk5Q@8z|hayOhJWAcU|+*#)x?Fv%KE;S!emX@wFL|*$2%jaZ>BxUNyg!_!Oy= z|Cmz*?nq-h}%8g*GcquO4u(qeOLIRHV|VB&?3p8k=4xJC?33BPRpS zL6uz0(W$HlyO6bhoMpp32~CMh*;S`ZKF`>`H^+7Qj=4p5T7NHBw;R(F^t9o+zIvVz zX9hmwA^l#>MC!&@F5hNox#{ewCv%U674W3X)m64gEYaQM;e-}Ej;cjJvr4n+x%IuN zoR;xIC!Devc>lO6l7plURMvbBMtOzId%fP`KG}B4k9o?s7IHjzPAv*bwr#ePD_9zT z;-dUr0r45fI67Xtd3Nh;@!Fnf8T(+7JgW?X#rWWGGw265Rd8HUXmJleG%=EG&jkCl zh4MYsWxkDyv#a==&@t9+Z9jE`NZ3#4Oz588-6@=BN<39th7MmOqXC9p7Zcf0->!U~ zg}8jLQK8K%rGK~SC8p3L2OatPJH0}G)DgDWCNd1524dLGz^O@gq~0V0 zjT#AOG|4CvQIk~2Z4ww!6N&G+TWbd1-OHwqyfBuJ!I4ZzVu2}`+Brosca=zg$&-tD zc2rtX5Q-mj5ECOPO6mzA|5nsxvm#_GBhEWjuukTsO610pqB#he&5a5?i*Fw*l?S{F z@z5!hn?D_?F2o-crD~O8A}v&sUh%>zGB2cPF@Hr8{;c*DQ;0yiY`*szRr8DuH6w z+Rrr|oyu>wo>?^AA2oKj5wMj+aKVtMQtG9XFtND+%NhP8*}N3&t+PKeXLH$Nm`!e$ z1BseX05zYG$oo8f@f2ulT--gWDB+6V@}lp!+YyQ&0oJ5a!arQ~t7#{HF~@QhN?!Be zh)C=f%`K5crL7r7BZl8k`(RwL3i5`?UFQ61*jr}R`}|s%LVGnc&J)Lx!X&ea%^)z# z`L$IdTPZe&aWtNua4Ei8S_}RQd51thW7a;Bv?1d9W^qx?9Z;c#eHkP*jEGHh{Bx!p`xYjyjmmhRXHm0-_ZAv?|jK12H+pK7FYcLz1 z*Y0h}AftUdWnTeBZ2Tqec3=TaMPc#L0hWEv~IRqch&Pv#UJi}hsAb_Jf&+!SsR^E z&X-kZXX_s3vYa0IvCYI`Rc1K?uIiipR9Ay(q|tc0FvofJpWaXS z9IradX2tb&fDA1J%P3^`%R$NRdCyt1#T^smR5BWrTek=6XM>D$iDRzMUzEtI*IzF5 zNfpWTCnZ3I|1$jzD^N$9`Z$ zo5Fm_=9)|1i##jGqBNB^B2SclM(J4)s%`}!kEN!_S*zy#8#w-E#ZI%DT;XPTfj97r zmtYxvnvD{FG7)qGfv=i_RJ97HxYVAdQc+&!;SGNwu$7c!8Pu=6K>F?pkPbXz6E^Gp z&PpfUOs2iUBj4|D78|wiN>dr<(~6~p##@I_rS;WTLhw?>m*-Tc@pA3#s6+Xn1!FR1 zdP+<*O-8cZYw5}iMv)t{UA0t!U0fFujgxJ8#rm9oHmoW7bS63Dfd8tB+ng3$_}9(! zoUgce$f=5KkZ7gIR`Q$Bf$(1cbGy#Oa;~>woT}$TLCh!5WP3!j$wTN@y>J_A@WEHo zvk$YU%!bg?Z+UeESfONO9ZLo6ZZv-rFpc%Be{X|$s^@;$#~JZ|)Z!UBOGea|#+*<8 zP(#{(x;Bj@VCB#ITF_;SUg~w`eVgZ!H?H2rZhQ42X$siX@wHN(1?w#8c4ZhgLmp>I z(K#*UqS?9B>q2e(OjsE`Q^a>}qVJ)6!TVNJZ>RIXWFy8>a|~HyTkv-SQMgZdiaJr^ z7K4@&k&sSYtn+?6})U45;KJu05%`xu0ZShdK z8D|W5XU;di-c%8^+j8@?o#+dtsG5lne(PG*8ZI6i#z}c^nwW}b;-j|2WHrC1|1LFA zKS~qHHyQr#XXM}DXN05OCoiJP4V|5>UE(FQH>BSGELSAUejl%`*1eOoB>2C>l7FVd zl21+XN#Yy!}o#pVs2Vcf^+f7BvL%rZjmIPNy1Y$ z-0VL}#1m7q1Z@G7s&7>M9@`X>Jun;%#_GCefa(dpT76; zqkhm^xqrU08k~FXdE>H7_p3xyV zDR7)r3ru{q)Mpry{@?*{H$4ha^Z`8pfl~|-X?);d-g}E>)TG#$MlZw6lZ7C`JD(#u zy3$4VLkN&k{LArg#K*72Mcm1na$w)bX?r5&yMG+hyc|fv!_Q4D#VJ+NPmLBh7(sP@ z!}lp890AXtJFohfS64XZ9Eh(jL5nB|ILH?YdBpe35~8%xVwewg8K4|e_s8fE0~~9X z{xCX~_@VC=QaEO9tMtq=56FY?4Ag6 z6o1js+SxvFw2I8STv=I3c+)-VsHlozm?3@-B|4AneDw~kg^nUDfwS3Raw6~!yT zg-t@yFS!uPudpyA=-YHAbC~Yfv+N_8;q-_Zr8HUL#St1T5NaBQoIjx_O_<3NdOSsK zx`aDVqBcRopBd4d0#O@$;f%WESKS@rZhzQWdE47o^6ZnNgf_nurH9%%x1GZjF`J8o zYy|=+FQy>nmmssSM|*;Ljx*p+o2XTO?}lNB!$8=mHC9?vCqX$jCT?BCh?79XssS_6 z8?4Btpon)y&!o97hIOMZq{F!S$==Ct2HOZ_r{gDki{A&P7@JN_g`f0>IJ72RHh;C8 zYCC4I(nKWed;&pc^zO%Lz-}0B@4ZWIs-R7d~^=hlK zx9TiQOomIc`n`3bNR$O_2uYRX-rT#6mAr=?$Ia&{W?|}v)$w+3{W+)9C4bINyde|Y zx~3((j-ATVZ93J+Eil3UYj7mum)BQ7S%$^He)fX^hXvyrO&Y1k;8zZD5Gwm}rs#Qg zo+Ny&J+F;?h5H1aB@0-8u4gh>?Lw15S=si3?%{E84n~GKhQx3Tf|&>2q!B3TF%{A< z-T~@hYzpe;ZV~U1z!#eUaeohtd4a$RqNXhGkT_x?tzt~!0{-k}%Q$T zkTWlcSw##6uT1zRSfqp%Xi@m_`jCoBwj4=v=C-QV_};n0jDe2vZ;E;1?$`LRVPcLu z*5yGjS-V=9-J0*T8IG>61WRG!*!wT_BrvJFbFdXm45No#KQ2$QA(JWX3TT|~g#k=T zFr}=tzF^K+3pjCLdVfa&I~h@2B1D#`r=JoJR9I#a=Tnzoln35aPMIVrDiH`G1_+#E zj8WA7As}8XBdGC2Bmtl`{y~CL@A8+*K7)I_(XA_cHNIc zX3X*{sFTn169^Tq#EXlpd5v9&e?uMDk*Q5u!7sbhE_9a$Nq@6RQ^dT@={6 z{@x+$h?bIBa@97CWs$g?;{2G@lXS$8 z8nx}#cY=3b>VLyHzGw)CG<@gE%4;*GwOKRzNSQW}BE9-{FNgLN+Ted6 zKL+3PLOd2*;;w}90lMsxogrq`0=b_O?$c#!u(O99c9JY#$7bF~i1$$r zVf+?eLVv2cu)lnLp&<8O$!K{O6nmlEk4O2-R$DJ`(VY;S?(sHk-vm9Ez-wNIaW^-pZ4i$q$BFnlNi5RyPV^u})JuozWx zP--q>h((_ltm}jz7csU;cgM-`!lx!>mF}J_1Ap0RXfQ_}&oV4V%V~A6d{}0h%P6(5 zq?GJMN4RU@U*e^aFIKAK*Ow0P%rmD?H7~h}}&w^hib?%b&;cXA4eczyv&v zwqG(X>_beSkO*cS?1Bf{cn-t1C(IjIwx&nS#$94)?#{u`|a9R+Rq%~&Ad%@SuCyoRalDFxXVPf<{`D_p*Lt2Z9C`f zk}}L0IEwITjV;@C#bcVZmP*33w>QSc6`i?KEg*VXKEWXnf-fu1fh{tkEX$FDX7a(1 zhX{y57|Z~@ucw2chvDi5h|#(Ovp1vCZhuB1a2n?uf3XP+nuQ;N(b3Rfjq4bYY3ciBe9f8LUo6@0a_R+b?$^ zwXW@#!ky5bP&2t&+eY_XVeXWT^rd()d-D{JWxO6T=Ub=PQYqqHkj#PooW1>)?te~f zcUFEa9!oXneKWR+#%`h^5`o-}IMJRPbA*`SuRjQ+1agb_)EWD2>Fu{3#h*l+B_36j z!)}=Bu$d$ooi+pNDP`O<8DCy5WBd=;V-mf`B>D)8pR%^qWVNj(wp$H{M)GHmet;eF z=eV{rSXw>D&QKVV`tnZ78L^&tt^V# zPq*e{v88H$Nm*WAvSw%Q+lh9KR38{p?VVAroWEb-n-Aue9LG$KdkmeE+NLhG<$^sT z%CI?Ts5wUJ4+nN7qEMM=-7=sN2B#xbTf1zSZqKEBzQ{$Pso~M(sNq2(_J8Wsko(|~ zzY{aWTp%eMse_tTk0TLWl(5Yy-B3kXHMW4Axe9p87H|Wf_+9OK1s%JDSZB>5b_-t_ zIh+)g2Cu&T>Zh-M@%po`zwqieuYUjPr?`8uA~n+acSSdL>6eHR_>z}w>W+fL9{4&qexARX;XzZRX4}F zO%=BZbx^L&8pYiM#qB}l+*?qx>*d4AxJ>M+%_du;WWMb2;ADAyhJVnJn|go>sdExq z%AfS&)-Ep6Ut~`?J4VI`D&<`s&CDPl^sWZWdY0SR+0M{byO7j$L*12xID?S>uF!6kpd}naV>*5M zV)VdJ&?j1I;~C_1x_@(y+PS@1WUIw!xh)ums1waTSK?A~q>Gzu^xhxkxHifkXGBy3 zYnM$Fck) z`su=}zkrzh>D8}Z{o(c37eG<|^7^v?{QT7)Ui}K--@g9l0)IeXc>TH8pMUjJv4Ds_ zA>&t&1PK;i{qohHU;T{Izy3NB{AvNQe@5VI_&g;*={u=TwfLi?-p)bDr zE$G)5s3zq4Gk$+{rAEP$77A7}1xo~di423R<|kw7mH5;tt5dILe2sb~-dMhva(|+v zIAj?}bX{$m;C~H}o+eryR+=;(z0EqFS+}32`LnLv~++1vT6? zKokj*#+H7?4*iPj^lQqj4#pr$UJJ&GDn)X_<%lyF0iv943o;}f+ZK%7U98@MX=pPT z4#J_=grRK0Fp?N0XIX*;%}MDtp+wT5ZNkuL!m!?icDx)+2I0hOz(h7+5=oSmc*S4@ zh#I>MNPm%ZVjD1V8ZfChpdIlCqd_?G8ZeR#7)87$gv4YC7KCes+kgT|N45bYrvW3k z0rl&%m}iy8mHWo!H!jg)Ij?ePW&dO)&UKnvRrDn^mFFd8A(>iF7E-FkWFe_qNfuJn zDB6QMMY9Knl%Jj0zWy9UkO#JNPN|AW^Ue%Z@_z#aa3kGtQ_e{&&tJ$BLk-*!ax40P z*@_Af{7*^k79Q>dWLTd+2rXuB2btLpGQ-fyX9%jOR2*VK*QdS3l$#`b!)>A)R1M{B z0lER;m27cQCa2v)v~@##P&Ssf4{BnfAi3&y8#lo54u-ZG!_OD)vt;82D12TI|UqRbc+sCl7pN zYP@(Dr&KX02jF;R8nL#R5r0@p{;-U=c7Gx3V=w}3$Ar@Iho!?GmOg)I&!eS(0%eFD zGwzSe^SPt<)E_;5z@{lED{F$XlmulMcos^Qj-aeig0i$OC`+dZ%Icztv?iKJwcv}+ zl=fg=Z&uo9*5V@lU6H9b<@}Z2{6WqFIgt`~=iF27xq3jxb~bn9L`9@}3*k(9JzIb$sj=(2(!p1YGIq_Crlt;FD^v`Wc5#|kfQRa_g>4}O`mhWVa zs3?un3xq_eCnVB^Sftv6psO9D?p{JRWY>H(2!l#_O?FE5 zi2dAEYlvs4HH52kp0Nwh5jdgN=X)gWKb1F%(F^FvL;&oQt;{Q3Psg zHb6W5a+(dY2SRlKljU5)jeo^jvL=-n)b)QV%%H^T%dsJ#&6tbN^6HZbo@E`|Yd=zR zHX)2N4*|;l#~1j9+5f}Zqc1t{UG9?elZkjlmz*y8cZEdxo?vue)n}Bo+QsL6_qx$) zebn_Zj=}&&&8&xk&%?Od$9F;B!?b`lE<$-N6x)#2oRH?bfe5lZGk?Gl!VkL(-Tl?| zqt*5IbU$Ns9*+^TVL~Se^;UJTpb!UgN@?TrdeYoY8tbGtbkI#2tE9f_1Zj-D#6RaE zf4$rFH2-ua_I80xtLqYCOs8DXQJTEGlT%B&3(KnutLqCoPLI*DDW?txM0u3L<9)fQ zm0V`qVRg$PjqqW7h<`}dIBSXh6gps{)%G&csv#3cH6&~5gp5JUhityt<|!^^HJ^~w z9ps08rvM0RUjt&Bx3QyAm|^3>p5Lky!6|!USU2YwyG-{l4WX2!DKLu7YmJf-v+bW4)_F zJr4B{qTf}o;5)GaV!r8~6KZM>{@pUpb1Cut~O ztWMXeU~1pg)PL~EUxE*^c0VBwf^UEf$| z;&`@teYLlaZ>&#}-}on+#GGtOWx%D+^C`=Nx~m&)<)qWgDP%dRE+?mQ);3n#ipi%J zGnU2Vn!O)Nfrr0hU}Dw;jeXFtw(gpx09G_%t>yTt5`QU*|u+Vq?LalYh)c=u|1Ca_S|P*lAF+88ZgtWAy>4jqBnfO(~x+>)<;xC635|HgYhthwnnA z;%_a0EM!_2h@SGea1OUxNFmD=hO^x9gGTN+L*PjA!5+<-q$joFQeNpCpUU`tI!H|o zX~ex0vLk7W-oZ36BzMU`e4W$}wPWDgbLn;H?|(+YHHk2PKMt<@IB47CBH_A=gl^4m zf`uP;2Ss~)!BCR{Tv!ozhh8^@w^>a}T9Rbt<4O3LL@8)HC^}o1Shk2{GhZZIHY&r! zTXE86onoa@8oSnAOfg)tZv{7hTK@{vQrIpPj)*poRG*5@COyb7pg+LWoMlP~aKAyD z8Gk+u`D3au7PXYMS~xL#snYOBH{;xhMawB-(RWYd+pHXDSd-w%y%NYWR;!Z!Ld3?9 zD_1IF!KDW@yb}aF=3uAF0y^ys-k5zlw>lS4 zzXdm;C&qQ$c>grqh}24)?3C<@F@Id|)X-!YxxZ<_?1I#^4 z#~^saukuWx(HLlCv@5MTr7vt+TPP3uBy&0#@y~dVe~!oevnqdqBk`ol7qr1+4+1IW z`hx9&YBs7nc`-6S(nxU)>DiN7UzY&C9CPBVPcz#6V2m9FPjx&h=z|pI;(waRXb9j` zgc=hB*j8VXhBBD-%mdIawa zTiWx2cqBe4?uq;2Q{sK%J>oOs)8btcC05ih)F|^uLaoZdYbCC)5`U`kgAw~1y3=H- zKUm{(?+{Ck6AKGCKgcY#Jvqu+Zm3!&^;+zCM=sp1O7>z(vJcB-J(cXqlw|L&Z91!F z({U3&VzJx%jCPTdD!-fLYWF$rY30S~@@u89p>$ayaCiz6SJ$R}>(Q;xiA>17o@ zs>=vJ$tmu+Del)(e2Pc4(h=YDW@rjS2(mQsKBsh4ZN;O{SM*U!cOI zStF14h99Gh!>L8Sm|i3zn~gh~TGEqQB|T}D^l)lPcc;eOYk!TId4f^Cy$;gRXq?FX zs}%d#zwndb!(~mH=NR7Wu(!oRj%&)Cux4qDM~#aS7jh(NPd8Eabhq*4&K11h$}&|A zNAv^2NVUIEDT%Dh*e&_5+7eky?P zpu77Dzj>%6@PB>u@gC9{{0z4BPm?E**zD^cAuk{k>jmUv6nW(V2BOlpyz0Du|8w#oKo#SJXLB>XxRqr z?UdOEHfd)V;13%VGP|hv3T)mCABOy4Cs>Og65xWj$$u#EgN8@C`g7eOA2n=OU(~v) zbt3BsVpBh{sV!z8xrZv7u2z-G8kX{+GkSMNJkp9%!fptIj}AU+c;}BsygLX<5D9JG z=W-421J?j_3O`EyMm%#3`ZC}>d>QblDfz$egWgk<{5P`z*38qC^6!OrC?-V-{P(`% zS3ae1-hXm1@9O|f*(b`UYrITy0WWhx-lQUSdibEpbG)db!vn%2h^6^%^ab-Al=QJQ zc-?Ade_YGHMcKhy@wM?|M}_mDQsLaHt8i}3Y3n>?KYmanYY+5(Y(yV6qsVKr+`RU% zC5%a5e+_1!zoJ`4HUlLqQUpJTf1eLrKUo#~Mt{}(0tvGzu##q3QoLvD;e+TMH>+ZS zDSzaPu5R6|_DvLai+zAz{RsD(f4O-L-tiZnWec_cT9UtaG}Qt-q!&Tqe`+ zVfFe`WW-hV{Mo*TEWd$mEi7?S>#yd_hzxTi1zstQ08OW=QF#p^MCAggb#Zs`TRN|`s{iLfYVX4>z3RIMHNf5 zqqKyubave|Qj`#C-w&W-Gr%9(byJkt4-sH$iGg7FFys$CXm-~vF}`l;NThaM4Ucs7 z=Vxh6utYFSxpxv~u;(wDn zW8)cQXT)_xV5`Mcx-EFv;)vkLzYBWoDVEdBW5ON9@~vpgQ!Jm2K~-f7X>PU;%uPzH ze#ZpfBJhdaU5{(KYgXG`%f>E68wq#|BR((kmsopjdgLwb!((X9>1Djp)zZyXSIkL5 zP3>vT@%Q^qK+$vZK)hU$Omks3AAe5DKC~uTf=X(13Z#gE4yv-#Y?SWhsI{w4K};A@ z`NlyiZ-XDRxe>LSbk9qO$`ZpQgFSsGMc73JJ{dY3>xw~Z_PwWKOsU>nWOB4?gI#79 zy2YH~>e33YQ*VF&AvBV{1mcYSiD)%EMUYa_g7gak_@7_>j=r#i{VFix0)JazlVSKi zll@;|)3eH5TyR^Nf3_@yTjtm+^Cz!~*v|%44jJ7qkzh z<~|_VUVV$Vq1*-CV9?kBt#zCJDc5=oo4CnVY5zJ_OU+j&J(la{MQz~}*;KoZ_a@>a z7ut2K{}b&x(*HKA4y6~6Va@&+>;HGJ{s3}99%H^qerNC({2!M7H-8tf);JpL?vK-# zpED~N`lJb9R4uP;EIowU`U<^jl^=wit6{Q?H@S>@Do65efmT~&7-yd6HTfza>DMdo zYw{dlGNfP#U%zoU=Wsbpvbad|t>da6Tl14KeGa28f-xRH=W_cKS8-VYsdnO2mtsShy5IB^u0u~fHkvLi4kkA3Gkduxg`m+?1 z!Zes?%&s(cO*+b{C4Sx#M;zJ^2lRV`y4cy=!M6UwU1j@WHQiPajb^zKng!(2&&wvF z*Ith<-j=?H5jlkK@&aCB)4Vze#G!i6F-kY(FomQBUKJ;}sDC1|x+3ou;YKm!AioZc zHZqeY);s4Q!9(=aE_AiRQBJi|B!}Y|O}w^vZBGP?@xkF{(6P{)3>{ZB;4KF35zv8# zLHO+1WIJB|%+n;#$EO_3ziX`RLerIs@Y$t?1dUCcK zkIUqY*~w=+XMf9sXQQQX(0{h_Y;?6Vz}I$i|M~XPv*qU$(;0M7v-4n}?Gir@A9}-a z2zdhfxD-6go@E-Bqg%mJEL0h0jU2^=Qf|I8&UZrKmwF#5J7+|DnPTz1T*>&UjVdoz z4$7y%{l|F4BgrUB=fV`sY;Pv$uj0z9Xp|4xm|$fHEPtqy`{RT{VL*Q2O&pzSVS#{B zMtAqqG02d8SV2|#p$|S#MaZRsa9E=6EBi&V8{zPhZ!kFg98;5{a+8Bob3>J(Qb zNBIj|91+A?i_~*Rx<$Cy>4GX^I0O00$I7QbMm#2fLGt?RfC+l@r6yoM7Knm7Rf15d z(YbT--hWZ(@CxdH9RyVF=|Mi4j4|jVQW4OGakK3yEM4>*^V*1x2pnSRJLk1ANM}f> z_aKphBaJ1it^>;$shk+!mTp~)tu39UyUyc96U5sHq%t(vdA(?aLEm2#e`&>|J?t8!;9CDu2dPiajW8eB@}rWODRKN!rpRO-t!? z9DC!qalEcq&QaPKZkS;P7~l^EhWiix<-U)v0N;q;dy-aK?K)W}DKNk^^=hA_r>A3| zo}Qkb5MZ$uM`xfO>!TY~2F3ImsM`k)?X7-A=hG~gU3Uh0JT`m55K=*3sUhP_?2_}O zbAKVA?PhCvF->-Xr9+V@Oho76`f#9mdlu3(N@f-xa5xk*YL_o-er%aneCYv1rBaZi z0fr5Wk7}#t2~0Udo;MbCCLX@S!xGjhq?{rjcJaa|TMYTf*A_q3XCa1{G{3-t=GU=H zJOF-+WGXj%$om_XDxWWW=pUcWzpnaFk$-Gd)d%(*BCi_vMf8M%4fRK7Vj!<4F40i2 z1vL)a7%dBa3z3ZIaFBNue|(}KIy2Sexf#6nQ(#HDi$7eUBUDYj=cNumg4QEY3h@KI$O>~wa`ZA`h7=YOZo zm`f4B+cWtwC?gUy2PF%hM{1`A=Is2WjNlFQHE>F#gJ6I*5<$XhN>I_s=A=a(;los& zpPH*f0EcI8E*`F4Ev>J{w^PiStZ|bf7M2Gr%eKEveLiDc) zSM09}EArQbEACILqqlY8i1;(YN`LjU!kud8-m$b9+XFiS?WmvQfL*obp82cRoil$H zQ@j7)cH(Z(zxau}AA+x9g9b~@ufdZkvv%Use=O{D?{u@y$aN+?cQ>|#jZbWCWtDJp z@l$xm|38Iyfm3*uTD@ACo13p)4=!@}PUXIZ6L=Rma;I|7&%o94|KLfxy?^wV+h7~) zi=G}r)=M26icbwOD*wDtd{~HMFLO?4->G;WHvCNz`@lxPK3G2%yJr49`D%s?`qjVx zf!#N=pa@Xry^21=w%?`y4W^rnS-Lu?p}G21adbO!yc1@fJjNJe{cQ76u>(7wW${dG zizni)cq#&kc0hGdo_~Nz-+z%P)210+nXt_mk|5Q<=;dj-D`Vr1P&O*c`1+;^r>Gzp5t$+Kst!=n8J>u9+ z8@u8JC!@*lt>f-qx1fw0{{DMK%L6X$r7dFh3}c;PJRGGOj>aD2He-2ZvD|lplhN$7 zqoVL0<9=fizII#d4#)1;*vC$AvXXzy8-l;2-vaxT$1>UVLa)eK<^rGD0n|P#!BVze za-MK(2;LG(-e$S0OnaSOL%e^Tx3yVJN;J5>>*j3Mv8`cW?=aJCU*mR*a~$c)xXq`g zOAIn^^Wmsg7KKL_rSK?CVLKOvz3~(tWKp==-(Vq|NSibUtf%VWK6g4n_LvW8c%=W<17ldFG}Hd zn!;zfDBKxO;ZuLJ{7jQ_YqRAYpqy66$n%fM-mFv`GKT+8s@TkW+ zKa{OFjPk**8^o$Vlq(fFH_I93oSm`30h}RHkIB#)u6eZ-~R5O%-_C zl>ADS42euV?y1KcdO&|bBf?+1SS;~(42m6v0)m`+EUU*edO)rt6x#{~<(1E zC&;I#0N338t_eJ)K)}}&_9a>AK=5ce99SRvH3!!A% zI53WB#Du)#%KD?&Hp6S%3^rajMS9TcOxre-J0g)KJxIN!!eS^FtNO|%sqS2o4O%@2 zEyHNI;PHIdHN}6pOZP8H=K?0_T7JkZ-^2k8dBVuwfV*0YVg3ruxAo)aseYd5=Og{x zBwN6tG&X|P7+*i{=;w}pK8e3oYa()2KcCXtRoUu9N!{O}T_gHyEIz>>cp}~p{_zz^ z;J=_{N-^WM|6$N(!@fOanA#0{ZCuwnUr;x_=CU(X7J+}>xmwQ`&>4Dxqe-iS-6WW% zn}tP2mH2#jW}P_ZUs0*k2`lAkOvhL4H0brh%@ zs-2vvf$1c4FiYoXVb+Wu<|Fp3tZO+}3}%XkA0EDza&fo6Pz)-yB=EGq5R2CqdemPy z?6XD0-3EV<(mL;MNnX9y<;O~gfZwkhJ^tVP-n1)JU-QC;s50-WwZX~gNoj#TYnRSO z$ze@gxr}TBR~vik1Sccrhsriqm3jia2`$cg`XKL;t9Y@&2}|X3BG`f_i(f7~Q*mR< zPAgiR;ACaPBAD;QQ(6-A#9yf|Xr~|VdJv>FGA@5HX`PA_oQxP>Uz66zthpsW=GbLN zAA+|F>qExqFf`9m%P)Oecefb@WN5FLQglcTPfYNz%|T8B*C)=)NzZwyCf?ZgZ|WEv zFgj0D(#xW~ebF^&JG}-S~;F}>zRKe zfitb!Ol~(Li{JA)!%CdN>sDk*_qEP+-)3?<5?TDd)fv_@N?}Dox-Y#oH8q&OQ?8#K z{XEjoE&W{5&jV9Vq6p7)ZIoP6<059=Wf8hVS3HIoMyz7?EjXi0L(fR-nDeJ5t!UoVR(WfTdi~@jzT%~v zm2HxOjP}+`@0Zl`OR_Ur-jd8jHc@(>#U{zI9Zg6P+UlITx3r1w$eP@)PiAs^&==Rp zwRO{ej1LU zVSi{e>!44BhK)jAb^Z}zG=oM(~) z=tpDxh&K^vB7U=MRP}Lu8{m~#M<0Vv0Db`FI)fj^;4Of$6kKBP>hehR>b3Z-lkog_qTUYF;~_opfvdMA)p^z}zSwa2cTu@!%~+9i~2;*^g>&uuPxgNEmDkh3e8b0V>y4qh&yF3I%(swX4<%Hq(RoW z>?onptOm#F0`~o+j@>&pawrc>$^Q z+iWBb(Nu3zE;yjG^pgHZ#0pP)!pL^JueT(YkM71Jz7eHw)t7;5yvG;*B$^i%Uiy^L zr7K_#C*^-}o4=CtFwMg}h8(2j&g*p@GA^&KA3H8gpJ^AS%Sjie%dQJkLb}Z@gqaQq z$fo}T@nQv&THhDET&JRa*Qsd#5>7?)9kj{ib`w5F9~H_~aKI7EzWC z=3>bFC>+a`iTsMPVZrZ_VN!|Lvrj6y)-Aq4%M&=b z2LgM>$o%?%feAo3)`!Yl#$5_Q~kiw_tN#H zw`zakx2;^E{p`DElimPejbD7p!S~lX%=FjlFBA)hyHnGifDp@uY$dlpHGN~o*vc7^ zVGGI4Mb7g13=V;Q(3cvt;AzMLsss{^w+$~M3rJ(UPWl!oAg|7_lT06g>ps+5Gd*-Q zH}_Kf`Aj62M zNg_PG`fGN z=(d04rNS_%a%;HgeM_4|IaSYVfpIQ(jqfWM>Vq7-hE=RKhMswR1ww-Yw_VE&X047$KIc_=W;L5n2v%P|Bmp`P3-p%!(6w;>QpV_U@!uo-?}xjAq67;qJ3gK7 z_>LSOdp@0)*=OS&$EWjhW7+fRd^QJ=GDebpfr4fP?b4V7AMMyIg+F*C^z2eLV0EgN zaBGPr$OF4ama;V&q|8h{1Q~zD-)tyMCFHRJKYmB&A7VeD2#%3#L;cEYrvTY0-Uq?EtrlF0-6;J1N8T2Rsj*iC z#7R?Cmrzz%16WN-(H2emq;^TEDj#tM^9BxqyNK1h?KBRwlC5`z`khafB z^!>~6W;siJv30Il&iiz#``>Jqv+A1Vu#Js2$7u&g*xp|6M$(w$Aa0H1b8U}<4V_g^ zvp|k&0P=R@n+(FvJxMGJJ$`Gp+sL!lXSA)fjSj;{V{Cfb<7{^ZUIxfhTj5f#r^t&I z_Mo$kO?$4u!R)l?dJcc{FhaEahp9k<$t%ye?ZVzLJjBaUp@*6kV?VSR_C>xM%E(&# z*sh4)nvhhF&e2x zaGx5S3HOdrF4FOof<88giGXJ+(lHtKPG^|d&k)TH|M(&war!;YsF=^v+6_KTSq3vA zQM(-5{M??*=4XGkFJ7|EkM@}7FsNx^nNvkr##9vvj#Lwd8_kFWCz=&8^O>`TLGz9^ z&@GYTDwXMkh0v=!7DBZ-*8yK`UcXi7tv>CU4BgLzu^!tTr4iiAgWwF3ET%XAb=FI- z&$g^M*Dv6YNrK{&Tz@7}kv@mtv#VEVT>(;#Uca7YbM$|7QU`%g?h9LIxK7(Q<^%ir-4_xpWLVR6X~?=44zv)U=n+CHx;@Us>lWW{^tLivo5v0u zKKBb)SJi)S-J18&-pY<%QETvl(c5dWOjC;{=JdShBFlFASX;+0}pAN9+-GUQ4l(1m=F-`0lPDQ$MD5 zLzFSJ6&gCqwy>dV1bu1reE4D!KeW^fdBKJkt~I_!hPO&O;9r`pHEbv)N|b`c+V6;g zHw+o?bjNnU4YDuP-pShP#?*abub8#@OL)bss7u`Ko;A=VJ!8fxx|Bi{cq#9gYZH1@ z_zQm@#LwqeA?@LVz}{W>@lM%9-Vz>9PWC@O2Xzg(kH-r%E_t1jTp7vB6O#N_)wJxK z9%TPc?HK-xiGDUA(GI1#y@*^HvD=doi^UcsOcJ2}J>))_j9h0xoKHD#yuL5O?@mnk z=kUEjJxns|zk%MT=NkE)klFWy&TT&~J|TZT36a9}aw~>XgiaYVgxO%6ay*t zAf`&uk>XH_BPmX$*p=c$ieo9R;S7!x>ryEchx+|kzlZu=b|EQ+#{_C>&}bm(wP#-s>Ahv&Ir&Jx!!l?oZ z;AH}z28~)0{EWc6L8G1oZxi?=Xv}{k!A}T$95iN=;JcUcJUppIiDxK<3E6N10Kt6E z@sHEo$h7Mw+O->$vn+LN@I8=84$FU`v?iZp_!pFZ(fB1=WqN;ZTOwW= zitm#o8(hda&cqb6E)!mS#$UEG#+lAzL+vuC4FeppSLSMt;h7V>5^A>x#P`O#`Zhj} zZMh#eM1BH9Hpz;BQ%Gr(1c~sK()n51c~#$3fsT$UBKwkQh@5h}($G1SAhZWULzSxO zr0Tih_eUxD=GLCG6b&P%+;)FV>3}G0k(XDMYTrrKal=EFK#l^{edWBbeZlXz! zAjb-_t{@K`O19ka6}8L{xJ|I@&L#nmmo`*8EJ?)@rNa|t%oM5jM#O&=RjLQlVTNw_ zz0kM^B>S2RO2r1H!v|%|2#LxzaY9Z75zAqKZup9*{4N<8O!4sI{T((VAg;~a(IFdR zp5liN5oyZU2 z_fv(G7b*j(yVUxQ&|UB6b?yE9NO?c+HM)+brCe*6k(eVUin?cB5mGK+uMuDk+jBbk?6DRa}? z%cQq`74(jB)7#8XZ%1bGwmd~CN>8FIcT~BbpZqPE$r)};|+&0hhw~Y)g?AFpf=WmZhaG-^N zJ`}-^Hb2yne<*TeWsyA@v81nEh_A~yF}MyCE@*z$V@o|Yyz>#9b_HpTZ%TVc0*_UG zD9@C)W6zWmxuN8%HlSNpX`h))+bR>(&FXPiJ)Y77+Gl@yKn1PRe$r%;QsrW`v<~!5 zAmRWisyV>wYLzXN20>FJU=_9wv`k>c0a9vnfK}Tn+g^-dUn5|3w+$ns$mk&% z8)L9aJYFjMQM)o;Gy72|GG09UQO7b~Mf*|LWW1dAqYh-euC`HJvGur$4|Nq;VXp&A zCa}Q)QsIAdfED?A49R#9X#}j?*MU_NxXl4l_j7=i{(3ygctB|cyb+)ScT8Z11GF{3 z0p1|c-b`Zz&olzwG|+)3CUBPnw2i<4-b~QrEJh&t^9=%6dh`Q2oO$*QMkQ@;b?Aq`)jnz-WaZ8v)sVzC_3E_qk>9O&nY=UCWxDEv%6xApUr`YELjgeHH` zG=V)6*tfH6+bW>jR`cApD(AMe`pF&pkDt3^4<8!#DwKcK#%s6QDr~N-7dnG(_?~Wjy$D6COO~Sa<*yx= zq9cwywXr8o@X9EHf|!k}$?{|D1+afh4qZ8vx5iKZ{?wfNjpn=ov_CrB4TkSancK>u zy>mI*J6W{1^U~hSP5Vg}?Ms)VeJP9ft-Q3K=A(VG#iY8ZPk9)_Cp^)OksZq3iL>K- zvj_1xaH_I{C#lCeKg^AhOO$;{WyjZXXBc1^NUqBs`F9{z)#3Osaq3;2j_-fC$!-~t zO;(#`*pid1R?#3gS(SwF4c|)=Pr?T!eZ^rJld;oQ*RQ7<&t~cPS-5?W#cwd1Wyxl7 z+XQ+1R?2fH-jTf{@LoN>Mv`Co^%}ia=>3!Z z%Up>z;f(wDpV4f~d!sN@QODrF{*TZ8X9y@T0K?ETreD9Jk*NJ@f!;GD7CWLlscR*_ ztWH7c5u282)}7$hRN`CwjrpRM~ z46{Vv=Un$3>jwthv49;0tW9zi{iM}mlLN9GVDXPj?oT<_$4zXuJr{%e4k&WNS7mddnKdjf$m+rKAOUuyzjQ^-(4iodwx+&; zms8g)>#KnR?Kz-*1v-C`SRzWLC(?FEfE+W#SVUa|nLq+H3|e$+0|;NQW#`yS93ob3VaUJQQY_z2>u7zi)zA_yhidA|5}g{4Uh+>^>Y>cw73t2&7lh zg?sP03!8FGABNI&B5I-``8#o#X9Jy6_H%BWUr?z*8%%G)elV$8!`EVX>I;4>nOhuD z+=eRdSZ94?vTlE>tXPw&#{+(Negy3v`K#C=oMGb}b6+L6ryj4>%K6)%{@t{!f4&X-Qa^Zi6fE&TfgeRML)?^c7B( zSx@0)Jv4UG9vV0NTPy+c9W(;=Dgmoxz^V+pn}F3aV0DJ|WCA#o1w=hwpprTDTIO@P zem&z0GTAm_N9uaaBeneiY`RiG_yyTKEviY)ike}avLEFsdrTPF;Ef$U4 zs<+eZf-#7jtplSyjm*L2$V~CzTS}`6CoV(l3>UI?ip>GfrXm z-Hv~2kf++5E>S?(ea|I|-@zZrL5r?Jnj1dG1nz$aj}w3Alut6ziHc@?3mH{zvzbIBHmOZ}gpcQNk}I zh<9guHsecEo^w)u%)bC}LDU+G)-a5s%=mv+v)>9J%l5)3SQuvbx*F#7b>+D@GoD=B z@nL-&d;1-bzrEYf*oljEa*7we1kH8tG_Sq3l)CXvfZ6p2ZYM3bMPqzhlm+=}vgx^L z8VZN?-xQ7UB^AZ~oBH0Jecfy~alUKRbbR*3ZSF|wCPz}Es7}H`f$N;OTp-t<&rN@& zKV0k=U!)yPXto}C{pMKyyNa;0_^!1@vCVS&i3p$p~fWDR78IX95?<2%%7IS~V?9$xbq-$iHD&w4W&Q_aP2F^q+s zu)%c}syU2PEVhBpPL(g)|99EsKLYtRXl_7lHo>c z0mK*&%aP+=IdXj~8&=R)uG~Ou;^SvX{JC@W;)eA{f75H&l>abV`gMI#z;}OG)+JE@ zeZeck6FE-#>8jEkY@qvQFFhXjYvX2cf|A@BY`iL2pH_8+3b(xORpPi915F$Z?0>+7H7BOOYok zYGJ6L;V{?;qNv#kqJ?mrQ}jqShjM$+ZpvVxH^$p}D+zDWKwA$x(ZYXdoE!AE8=>7K z4>*WcYaT|+LC{}e?NfVU5A8xx`*;F53ua5b=J0T#<2p;v@>9-@<9P>XZ{;?kEQ)T6 zIbO}XNasc&rPq*-i}N88d$CCGHnHP+JVatQYMdwYN|q;cr$Zb^HVzRuD&xuyj z3whj6j-&DslEm;ap2~mQzNd2Zp6i`_VBNu|deb^{XD8;Vc;s<<*kY}S4w5@jzb@u&f``?G@~l{4cT50a<@xkabta>P`3-}7UW)Y9cd;Dn!R8_ZerKnRucQ%g|RcqXkP9P z7!;1XGcj4-`~`o@!(iv@WMDn^d2QsQy3XF%`PuXsO_qJ@;$_D+H@~M_Vf1A#cp*<# z>Fa2a9uEI+lBF23abywYSEescKzz>*8A6$osNH`}MS0#>%?FaKe&ynf=B#f6W$XSx zn|LK&l-+#i%!Wn7(??Wr+c%~HUzAUU%o4O!~88vEiHn*kf0RwTbKV#U(cSZnWxCdj2d9dao_{P6VG2o2wxu=>0d7Rst z{=$qKaWEc3kSa-S#y6yX@kU%L7SCUuRjXH+>CYRqblZ`2#AIB5n)%|-G=4w~i2Q;Y zN_ZjsT*rUEa&P|;-MlnxkGlP^K(YlY_S5vmyyl`QRE1kx8HVyW1$tF$?m$qa8-(w5 zqHKB+LFvkvlydVGRhmrx{RNRjHkIUMDBVici?@=K*!2PR`mHCbtja#gMf+Q}z zb~UA^3M`;oeva!9{>0NS8kTuHw=&>=<`0m#5s!bpm_ee)kd#01WIM^jGrtk#7*G+A zpJuca2GtjNII!DcbyEarNMfW4JlJ}aWL@~U5}$G6&X{3igKtVv7ZeTgAaPq?@X{-J z_raK*}H)jBv(V$ADP~ERIYXIPXoNjJ^s#5ii33eN_hgUep|Kf*9 z^~}-nRhY$jlYT$wcJ`$UIqC+-%P@Nr!v$Dc`uo(&IzDTA?^gady9 zn=n$MtPsmGkx*#$5Y-1u@bL7y{h-wxAd+nrGGbqa-M)?X@BL$=qxil6=wNVT!1ciF z6T8j9&JC_#Pc#>fmV4LXbG@ZoZ{+bBh!jH$QiNyRH#kTre3*S}UC+rvw=vD3(}f{I zW7Hs=#VRXU1Hv$@woe>wLl^K9z)pXiRr(OHQ(A2Eh&12m-elkCAQEl*Mm6!%;soE= z=|VMeE7g9K;|i!sWyV}0Wpj31MWjg^@W$wUY>YbhIRzQ_IYpotF+y6MvenEda|r3{ z>9gY9yPN`VqxUd<2CKm)VWOE<(1!_4c#{;4M^TB}DIC97FZzymXJ6mjOz3}mn|9~E zKY?q+q&viF#r20+pVs~m`{lB?F*Z1vs>~DyusSt%n4z)54E0{v`Q*Z%hcXA~>kFTk z5Mml$k7X)7PnifWI99`n77VZcCx)w{9yUppOHO$(Q zaGA?nPNOq#UK4|lC@!;P%`a$PUMSwox+?5sjQK<~1_y@KUbmBl>3Dw(rr~%@{eY{K zh3(oHY|Sy)=zh>FJO^X&w8r3xP9xZ6XJJ~;#`F>DiB4n7TT3|YPLxP}T>&)^#I z6>hb9W&YL}WTWxOnhM#-AZxS1P<^gauhz4XwZ|iCDP(Q4pEt-B5-xE$TPqDB?|bJ+ z9hbbdt(AsxsVP}Tm;>f`kK*?(zYpX0kl&l}dyn5+@%uZ6~ zbc88>pMJsmh!svuT`}{*Y9;6${bV&0c!$(_7`8{f;2}xx1et&F&Wr{n$A6$<94nNX znhev-bddXG2&f5*7CS9|%UMYr z+(i*0&6(q@Z^oHt{}EgBm~qxsBV}mEnXW2XdDfkHrvq4wMBT`=$R?ovh@+-A~OO*#n;EHO;AqY>pyF&%<6?aC%JBEU*Lk9$0!`1KugmK|2?U4qBB$WJg1~PNv zyTyN8-8bK&h6ZY$4*BWz>rbJhG|H4N#lX2O1ju5-+f{&dTp*Fss8O1UV?e#6=A^|*MwF!Aq$GcB z*Go=^V~<>yI!BI&pW;WOL9_p{kKW`*QJf;V_OCgjvhgtGw_45ff4Hp1Fq43AXr*F$E zn#%{{+^;w{1$x*iQy4m&ivHhggJ~CbPYbJuT{%20EQiA`gn|ROVnreF z$pp_6&i+CV{wm1%6Ynu(xhnF@c6~#{WCnWYu>#2M&gKKbmp&alTD`EY-uITL-T zvbSAlA#{RzT7iwjm!Lm-`BH|RPA@PKzSj`<%BnaETp^hV>=$HVTKBV1HBHR^FxW%H zO@3b*n{vsdG-_yuZjMdAY13PY+4H31=Xq)KkZk4oDDqRkvZ*ou8R&_h-n82&+4H_1 zBJ^U5dap2$=p5`!)zu9tK01H;9=xlX9;;zJRq;=^76w3tll31^Vg<2bOtN6|hdp%u z0zGQ8#j@v}22NJ&n6jH}{9eO*e9}JCr500yX$9jeYSAXHdpl8lJwD2sc7B4n z(eQMn8pf$GW2#4!)zdxEbP%-EV?+;3sNm|xl!aS?p&b=@q#md0aYBC&OuY2K?5o}$ z^27Re<+lxf*gHe`ZACpE*!x28w#pCd3x(hAD+=$a#~bIa5KQT1!E+(%d&jBNvU)s& zH#?GMoOQPS`-)GH$!=zmh_Lu{v1TNsPvU}+3N{6wHdt&>Gpzy& z-90#7^fW$3h8TN1<*9#rHbvjv5XeRJ7?%dL5JOl15qf6Uof!fr^)2GnVLqf&d#J9+ z3026*mO_l@VnCl zu`nan7T4m;o`8cy=7i3gsNgN`ZNN$&*na!Arb&HF+lQC_#Ib+rm|z)3yhTAJ^fS@X zOY8a9FxZlUE>hyxPYM{P^^XJV&%0eR-!KQeK%mDszdupiz;{VRRvo_;0mOZ>#Gz(% z+HVzN33J1>Ke1*RBxdW4Xc7>c$IUKcS>}L60j6sl+ag=X#{JEQ59p*v6wsLHt01j- zT6Eh0kxyjccp871-IaS;P!NLf; z5U?OpZAyQLUvTw!UW~5#esXwHj-E zxQ6kYNy0-m&djvNZ)_rH-rk9qMDHp!@$JU6ctwQYPb~26krJU)t&1(37p1Lp$F)cq z(hy3=(AvTYVT@m)QhvBmd<#yT{I0t6U5z3LJ^X)ZbT;2;$|_vG(LP>~SO}+ASx+Ya|!|SpJAH z;3I!DhZ@BoNQ8K!lgjj6-k~Pnp`W!xOFxdSfbe^Vjg3eTHQa&)atL$;!d%4>r8PVn ztI##wz|BLY@)Uu~o&ndoHQ@Sic^!<6D&A;-H*@tEGC)T*2pMYo5mW1+2fnwHEJ0B5 z4Gc^}PRX&)T?XkNsGx?TQVnWOXDq8aIX!<6(NXl6kW!?3p%I8k5i>0eY%$fqi0Tf6 z6q=`DB#~KV5i{=jN%!_Rtz%a#X=GRC@y$Nc=ahMX(D?X3gE`qd8W>MY94vF6#zVu_ z@mZ|iX>60;MV`804nDL1Py3Ruk!-8Rs{mzXW*!Oja-nK+*dd+m;^i>~y zB~gz)T7(2Q1iAxmiNIodqE3i&6%y@0fE&=W-#!A1C-xLzkxuqoLBA;M=)q(%rWUR6 zaL@~q^*}rDV4KFr#UKB)FucRz8?1ko0_Tto<`Li-MD!Sf4wX95rAd8;#fbSFP}0&k z+$#jw8kWuSr;9fwqPQ#tg5aizdZ*qo^P&s-Ey}cvjzZ&UQjDBnhaj*V~C4f&53!CSH-S_T;;R4Er3z$EnUWoo4h|!iaCo6YSE)=m|RBfv!=R8!_#j&N*>c1_W7GxWN=K5YY5BeE#%|(xV7B#=R zXq8Nm2koplaL{r-OS1)7)Zl+;z3%y_mo!!&O~^37>z?&!FP0RGZ7dmPit+M&7p8vD9E8TG#2EzY&iVzSa)MdL|5?cxa zgt!lJNE||_hv^2|1QIWIUjiZVhlc>f6Y(T`Gqz(V@h*!11T=9Rdu)G?XFku^6No}3 z@Sik7pY!a^39Tk3YYnff6|7cg@$L+bHPleAG%*)ZbunT6&}O8cUp|4A@Xkxfpahh+ z8t+&iXuHY!K7(SBtjOnekxJ1r#)&&8RocB#b>&KDsYLn8fLtj|#?qH7dK9SE%nda? zaih(f!}UXDMtr!}k=B2Xw{pt^DJ*qw5iC)~i)=~|L0?%#jYp$96=xADC4)?zj=7Xm zZz6HXF_5snOjLL{Vh<8WF}rK1ae9Z3*SIRwxC)Ki+wE}It{m;kPf6RZ9POg@7NgE# z4LCs8bWCH~Ch-UeR16cYF+CA^`=A4{{5J$LBq2T!6?d;8Un76}-H@-xM!!rHoum~D zX2czV|7f3~PD@35*m%MI2(5h##nuXJb09gS zTQ4axY_qD=WkmXXa}!NkLkv)?cM*R~p!u{pnaxh?@9O+{-=E2f_y2>#rkn>EoD<5Yo3lT&~PM#>vQEc>a-NQ$C~QY zEEpUSPMLqVNZCc@R8p{7df+P5_9$DWYuonKwFCgGMuf;=I~J_|c&CJM7-$94-3WA- z*o)V)LM_*D!;>W*HmKh!7o_!uKF)Y5St5w{WVzcQJOaz{QmV}Y#;=PP?#9>*AP*PM z&uA*lTY4^%B}k_(A3ewCogdTfNz8TJfP`k>u}pu`G86vJWSLSZGo4-Aby{7`T_qyB zIfNI^JS|E&mDwwFd2PzM3jvsVGWM@ZZN8w~Ozjk+dp%laRmCgR)wbNC*&xU-`jO)p zFy-#pr8ReXmhXabQGSpPq%#q|vEV*+=B>k3QF>;d=DrUd-V~^Zf6w&SH%!uLlf?T# zm`{IBur(J)=SnyV;aDh^iN)+*(k(b#-V=dz@BtV;#UE#x@QEN77njP=ep5K5*Wxu- zUiz3N`{vF~qTFZ^{cwZ$>aRyA1W`0lV~dP1Ktv~f z=nDC(i3-9U_{A35A`*?M)2i4^XABw|i`M;w@;b1IR$-F-V-}3DAGu z1WKNd-Wfg2yQNzNy=||I$Y%N$FY*yYU3A$knsV@BtzZozqsetLur&n zp`b7b&1Uc==h-6O%a#(QHyT2IYkWrH$m~yt={BB>OJqa}S;s7DGhP$kR7J+)Sm^vF z31->s9iCT99MY|WffS{7U!x#Ao6&!3D<~VEd>JOU7xy{4kget!+OcG&edY%C^ZxuS z#2!|ZYhoRnP(Wa8c2)mG_O-@W`Qxi-TzT(>cZ!}225u47j&ABWO%a34B%a7<0<_AT zHCK3B7;XmZ=Ebzj&6BjwQe+qeIjxWh8zb16)9|}IOteWsS&n-yaX$5RYH5E6$S7Y= zMLHYxCwY)hA3u|LMgd{Yu(%d-1a;R%rJYN361v2c^A@9JU@?l#2H8`xxl%}k(TD?f zLX2h3G;obRsuqiTa1@CcOiP@~6U!Q%>Yl0Qd8U-Cy50Ahu*>T##}1jpE;rfGPftihW9HxsRRi$xgh?KHYsU;QQYPz-~_Zi+H zCbVMQ%E2lNNI~VJ1F4+Y%nM7pBnj@_>M+B9VCy5LZ zOKvs7mH5C%M7g4BYdV$K;)BXtCWKaQC^UY<=c$DvY}s~>o2GxVZ%tCu6g9(a)tTy$ zE?4Xf9<2}1!B?PfvZu!Ve^gvy^mj$PN5uf!m^4>*R-fp8z-sIT@naMRH2wQWY3kkbf=OUd@T5ja!{!E$W|*ua)-tq1U%y}&4K9XRmYcd;{g z4(IH`6k^NpD0+XPy0-6Y0jNk`c|vcw@sUG#j&iHETyam8zYpRW)dp4P56z1dIv2}5?!cGfz6*3)kPBn>aYtmQ^OuypIp|RPSI67Cz{e_O>y0qq6W_PFY| zB7GgY+eTgnkzO_Ph`7FL-eYk6?d4mYtF&zTHf<0t>do_6_P#c$<_} zcNgwz#m>*L#^qnB%*C>i*>-c&_cIwOgP2f*|KJTCX#9i+t~6ZC?Zrd$o3|2NR#qL* zE3A+>MQxi`n!K;-yqHZ*VoRp!Bn3BnT)QgdYd#e6XMw|>RN^KF4r@fs6LsvouN0I*53wEzGB delta 47767 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 diff --git a/data_svelte/index.html b/data_svelte/index.html index 9d22217b..ffbfd6f5 100644 --- a/data_svelte/index.html +++ b/data_svelte/index.html @@ -4,12 +4,12 @@ - IoT Manager 4.4.4 + IoT Manager 4.4.5 - + - + diff --git a/data_svelte/items.json b/data_svelte/items.json index f8cc2674..72366d57 100644 --- a/data_svelte/items.json +++ b/data_svelte/items.json @@ -192,19 +192,7 @@ "header": "Сенсоры" }, { - "name": "13. A02 Дальность", - "type": "Reading", - "subtype": "A02Distance", - "id": "dist", - "widget": "anydataCm", - "page": "Сенсоры", - "descr": "Дальность", - "int": 5, - "round": 1, - "num": 13 - }, - { - "name": "14. Acs712 Ток", + "name": "13. Acs712 Ток", "type": "Reading", "subtype": "Acs712", "id": "amp", @@ -219,11 +207,11 @@ "sens": 100, "adczero": 512, "btn-setZero": "nil", - "num": 14 + "num": 13 }, { "global": 0, - "name": "15. AHTXX Температура", + "name": "14. AHTXX Температура", "type": "Reading", "subtype": "AhtXXt", "id": "Temp20", @@ -234,11 +222,11 @@ "addr": "0x38", "shtType": 1, "round": 1, - "num": 15 + "num": 14 }, { "global": 0, - "name": "16. AHTXX Влажность", + "name": "15. AHTXX Влажность", "type": "Reading", "subtype": "AhtXXh", "id": "Hum20", @@ -249,11 +237,11 @@ "addr": "0x38", "shtType": 1, "round": 1, - "num": 16 + "num": 15 }, { "global": 0, - "name": "17. Аналоговый сенсор", + "name": "16. Аналоговый сенсор", "type": "Reading", "subtype": "AnalogAdc", "id": "t", @@ -267,11 +255,11 @@ "pin": 0, "int": 15, "avgSteps": 1, - "num": 17 + "num": 16 }, { "global": 0, - "name": "18. BME280 Температура", + "name": "17. BME280 Температура", "type": "Reading", "subtype": "Bme280t", "id": "Tmp3", @@ -281,11 +269,11 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 18 + "num": 17 }, { "global": 0, - "name": "19. BME280 Давление", + "name": "18. BME280 Давление", "type": "Reading", "subtype": "Bme280p", "id": "Press3", @@ -295,11 +283,11 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 19 + "num": 18 }, { "global": 0, - "name": "20. BME280 Влажность", + "name": "19. BME280 Влажность", "type": "Reading", "subtype": "Bme280h", "id": "Hum3", @@ -309,11 +297,11 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 20 + "num": 19 }, { "global": 0, - "name": "21. BME280 Tочка росы", + "name": "20. BME280 Tочка росы", "type": "Reading", "subtype": "Bme280dp", "id": "Dew3", @@ -323,11 +311,11 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 21 + "num": 20 }, { "global": 0, - "name": "22. BMP280 Температура", + "name": "21. BMP280 Температура", "type": "Reading", "subtype": "Bmp280t", "id": "tmp3", @@ -337,11 +325,11 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 22 + "num": 21 }, { "global": 0, - "name": "23. BMP280 Давление", + "name": "22. BMP280 Давление", "type": "Reading", "subtype": "Bmp280p", "id": "Press3", @@ -351,11 +339,11 @@ "int": 15, "addr": "0x77", "round": 1, - "num": 23 + "num": 22 }, { "global": 0, - "name": "24. DHT11 Температура", + "name": "23. DHT11 Температура", "type": "Reading", "subtype": "Dht1122t", "id": "tmp3", @@ -365,11 +353,11 @@ "int": 15, "pin": 0, "senstype": "dht11", - "num": 24 + "num": 23 }, { "global": 0, - "name": "25. DHT11 Влажность", + "name": "24. DHT11 Влажность", "type": "Reading", "subtype": "Dht1122h", "id": "Hum3", @@ -379,11 +367,11 @@ "int": 15, "pin": 0, "senstype": "dht11", - "num": 25 + "num": 24 }, { "global": 0, - "name": "26. DS18B20 Температура", + "name": "25. DS18B20 Температура", "type": "Reading", "subtype": "Ds18b20", "id": "dstmp", @@ -395,11 +383,11 @@ "index": 0, "addr": "", "round": 1, - "num": 26 + "num": 25 }, { "global": 0, - "name": "27. Аналоговый счетчик импульсов", + "name": "26. Аналоговый счетчик импульсов", "type": "Writing", "subtype": "Impulse", "id": "impulse", @@ -412,11 +400,11 @@ "pinMode": "INPUT", "debounceDelay": 3, "multiply": 1, - "num": 27 + "num": 26 }, { "global": 0, - "name": "28. PZEM 004t Напряжение", + "name": "27. PZEM 004t Напряжение", "type": "Reading", "subtype": "Pzem004v", "id": "v", @@ -426,11 +414,11 @@ "int": 15, "addr": "0xF8", "round": 1, - "num": 28 + "num": 27 }, { "global": 0, - "name": "29. PZEM 004t Сила тока", + "name": "28. PZEM 004t Сила тока", "type": "Reading", "subtype": "Pzem004a", "id": "a", @@ -440,11 +428,11 @@ "int": 15, "addr": "0xF8", "round": 1, - "num": 29 + "num": 28 }, { "global": 0, - "name": "30. PZEM 004t Мощность", + "name": "29. PZEM 004t Мощность", "type": "Reading", "subtype": "Pzem004w", "id": "w", @@ -454,11 +442,11 @@ "int": 15, "addr": "0xF8", "round": 1, - "num": 30 + "num": 29 }, { "global": 0, - "name": "31. PZEM 004t Энергия", + "name": "30. PZEM 004t Энергия", "type": "Reading", "subtype": "Pzem004wh", "id": "wh", @@ -468,11 +456,11 @@ "int": 15, "addr": "0xF8", "round": 1, - "num": 31 + "num": 30 }, { "global": 0, - "name": "32. PZEM 004t Частота", + "name": "31. PZEM 004t Частота", "type": "Reading", "subtype": "Pzem004hz", "id": "hz", @@ -482,11 +470,11 @@ "int": 15, "addr": "0xF8", "round": 1, - "num": 32 + "num": 31 }, { "global": 0, - "name": "33. PZEM 004t Косинус", + "name": "32. PZEM 004t Косинус", "type": "Reading", "subtype": "Pzem004pf", "id": "pf", @@ -496,11 +484,11 @@ "int": 15, "addr": "0xF8", "round": 1, - "num": 33 + "num": 32 }, { "global": 0, - "name": "34. PZEM настройка", + "name": "33. PZEM настройка", "type": "Reading", "subtype": "Pzem004cmd", "id": "set", @@ -512,11 +500,11 @@ "changeaddr": 0, "setaddr": "0x01", "reset": 0, - "num": 34 + "num": 33 }, { "global": 0, - "name": "35. Часы реального времени", + "name": "34. Часы реального времени", "type": "Reading", "subtype": "RTC", "id": "rtc", @@ -532,11 +520,11 @@ "int": 5, "btn-setUTime": "0", "btn-setSysTime": "nil", - "num": 35 + "num": 34 }, { - "name": "36. (S8) Cенсор качества воздуха", - "num": 36, + "name": "35. (S8) Cенсор качества воздуха", + "num": 35, "type": "Reading", "subtype": "S8co", "id": "s8co", @@ -550,7 +538,7 @@ }, { "global": 0, - "name": "37. Sht20 Температура", + "name": "36. Sht20 Температура", "type": "Reading", "subtype": "Sht20t", "id": "tmp2", @@ -559,11 +547,11 @@ "descr": "Температура", "int": 15, "round": 1, - "num": 37 + "num": 36 }, { "global": 0, - "name": "38. Sht20 Влажность", + "name": "37. Sht20 Влажность", "type": "Reading", "subtype": "Sht20h", "id": "Hum2", @@ -572,11 +560,11 @@ "descr": "Влажность", "int": 15, "round": 1, - "num": 38 + "num": 37 }, { "global": 0, - "name": "39. Sht30 Температура", + "name": "38. Sht30 Температура", "type": "Reading", "subtype": "Sht30t", "id": "tmp30", @@ -585,11 +573,11 @@ "descr": "SHT30 Температура", "int": 15, "round": 1, - "num": 39 + "num": 38 }, { "global": 0, - "name": "40. Sht30 Влажность", + "name": "39. Sht30 Влажность", "type": "Reading", "subtype": "Sht30h", "id": "Hum30", @@ -598,12 +586,12 @@ "descr": "SHT30 Влажность", "int": 15, "round": 1, - "num": 40 + "num": 39 }, { "global": 0, - "name": "41. HC-SR04 Ультразвуковой дальномер", - "num": 41, + "name": "40. HC-SR04 Ультразвуковой дальномер", + "num": 40, "type": "Reading", "subtype": "Sonar", "id": "sonar", @@ -615,7 +603,7 @@ "int": 5 }, { - "name": "42. UART", + "name": "41. UART", "type": "Reading", "subtype": "UART", "page": "", @@ -627,14 +615,14 @@ "line": 2, "speed": 9600, "eventFormat": 0, - "num": 42 + "num": 41 }, { "header": "Исполнительные устройства" }, { "global": 0, - "name": "43. Кнопка подключенная к пину", + "name": "42. Кнопка подключенная к пину", "type": "Writing", "subtype": "ButtonIn", "id": "btn", @@ -649,11 +637,11 @@ "debounceDelay": 50, "fixState": 0, "inv": 0, - "num": 43 + "num": 42 }, { "global": 0, - "name": "44. Управление пином", + "name": "43. Управление пином", "type": "Writing", "subtype": "ButtonOut", "needSave": 0, @@ -664,11 +652,11 @@ "int": 0, "inv": 0, "pin": 2, - "num": 44 + "num": 43 }, { "global": 0, - "name": "45. Пассивный звуковой извещатель", + "name": "44. Пассивный звуковой извещатель", "type": "Writing", "subtype": "Buzzer", "id": "buzzer", @@ -687,11 +675,11 @@ "cycle": 0, "indication": 1, "val": 0, - "num": 45 + "num": 44 }, { "global": 0, - "name": "46. Энкодер", + "name": "45. Энкодер", "type": "Writing", "subtype": "Encoder", "id": "enc", @@ -704,11 +692,11 @@ "step": 1, "stepOnPress": 5, "pins": "4,5,2", - "num": 46 + "num": 45 }, { "global": 0, - "name": "47. Сервопривод", + "name": "46. Сервопривод", "type": "Writing", "subtype": "IoTServo", "id": "servo", @@ -719,11 +707,11 @@ "pin": 12, "apin": -1, "amap": "0, 4096, 0, 180", - "num": 47 + "num": 46 }, { "global": 0, - "name": "48. Расширитель портов Mcp23017", + "name": "47. Расширитель портов Mcp23017", "type": "Reading", "subtype": "Mcp23017", "id": "Mcp", @@ -733,11 +721,11 @@ "int": "0", "addr": "0x20", "index": 1, - "num": 48 + "num": 47 }, { "global": 0, - "name": "49. MP3 плеер", + "name": "48. MP3 плеер", "type": "Reading", "subtype": "Mp3", "id": "mp3", @@ -747,11 +735,11 @@ "int": 1, "pins": "14,12", "volume": 20, - "num": 49 + "num": 48 }, { "global": 0, - "name": "50. Сенсорная кнопка", + "name": "49. Сенсорная кнопка", "type": "Writing", "subtype": "Multitouch", "id": "impulse", @@ -765,11 +753,11 @@ "pinMode": "INPUT", "debounceDelay": 50, "PWMDelay": 500, - "num": 50 + "num": 49 }, { "global": 0, - "name": "51. Расширитель портов Pcf8574", + "name": "50. Расширитель портов Pcf8574", "type": "Reading", "subtype": "Pcf8574", "id": "Pcf", @@ -779,27 +767,29 @@ "int": "0", "addr": "0x20", "index": 1, - "num": 51 + "num": 50 }, { "global": 0, - "name": "52. PWM ESP8266", + "name": "51. PWM ESP32", "type": "Writing", - "subtype": "Pwm8266", + "subtype": "Pwm32", "id": "pwm", "widget": "range", "page": "Кнопки", "descr": "PWM", "int": 0, - "pin": 15, + "pin": 2, "freq": 5000, + "ledChannel": 2, + "PWM_resolution": 10, "val": 0, "apin": -1, - "num": 52 + "num": 51 }, { "global": 0, - "name": "53. Телеграм-Лайт", + "name": "52. Телеграм-Лайт", "type": "Writing", "subtype": "TelegramLT", "id": "tg", @@ -808,14 +798,14 @@ "descr": "", "token": "", "chatID": "", - "num": 53 + "num": 52 }, { "header": "Экраны" }, { "global": 0, - "name": "54. LCD экран 2004", + "name": "53. LCD экран 2004", "type": "Reading", "subtype": "Lcd2004", "id": "Lcd", @@ -827,10 +817,10 @@ "size": "20,4", "coord": "0,0", "id2show": "id датчика", - "num": 54 + "num": 53 }, { - "name": "55. LCD экран 1602", + "name": "54. LCD экран 1602", "type": "Reading", "subtype": "Lcd2004", "id": "Lcd", @@ -842,6 +832,6 @@ "size": "16,2", "coord": "0,0", "id2show": "id датчика", - "num": 55 + "num": 54 } ] \ No newline at end of file diff --git a/data_svelte/myProfile.json b/data_svelte/myProfile.json index 7432922b..b0ce54f5 100644 --- a/data_svelte/myProfile.json +++ b/data_svelte/myProfile.json @@ -3,7 +3,7 @@ "name": "IoTmanagerVer4", "apssid": "IoTmanager", "appass": "", - "routerssid": "rise", + "routerssid": "iot", "routerpass": "hostel3333", "timezone": 2, "ntp": "pool.ntp.org", @@ -24,7 +24,7 @@ }, "projectProp": { "platformio": { - "default_envs": "esp8266_4mb", + "default_envs": "esp32_4mb", "comments_default_envs": "choose from: esp8266_4mb or esp32_4mb or esp8266_1mb or esp8266_1mb_ota or esp8285_1mb or esp8285_1mb_ota" } }, diff --git a/data_svelte/settings.json b/data_svelte/settings.json index 793904a6..297019c9 100644 --- a/data_svelte/settings.json +++ b/data_svelte/settings.json @@ -2,7 +2,7 @@ "name": "IoTmanagerVer4", "apssid": "IoTmanager", "appass": "", - "routerssid": "rise", + "routerssid": "iot", "routerpass": "hostel3333", "timezone": 2, "ntp": "pool.ntp.org", @@ -21,5 +21,6 @@ "pinSDA": 0, "i2cFreq": 100000, "wg": "group1", + "udps": 1, "settings_": "" } \ No newline at end of file diff --git a/data_svelte_lite/settings.json b/data_svelte_lite/settings.json index f6913b49..cf3a7ac8 100644 --- a/data_svelte_lite/settings.json +++ b/data_svelte_lite/settings.json @@ -20,5 +20,6 @@ "pinSDA": 0, "i2cFreq": 100000, "settings_": "", - "wg": "group1" + "wg": "group1", + "udps": 1 } \ No newline at end of file diff --git a/include/Const.h b/include/Const.h index 20cf9a1f..a9e1d9fc 100644 --- a/include/Const.h +++ b/include/Const.h @@ -1,7 +1,7 @@ #pragma once -//Версия прошивки -#define FIRMWARE_VERSION 435 +// Версия прошивки +#define FIRMWARE_VERSION 436 #ifdef esp8266_1mb_ota #define FIRMWARE_NAME "esp8266_1mb_ota" @@ -27,21 +27,21 @@ #define FIRMWARE_NAME "esp32_4mb" #endif -//Размер буфера json -#define JSON_BUFFER_SIZE 2048 //держим 2 кб не меняем +// Размер буфера json +#define JSON_BUFFER_SIZE 2048 // держим 2 кб не меняем #define WEB_SOCKETS_FRAME_SIZE 2048 -//#define LOOP_DEBUG +// #define LOOP_DEBUG -//выбор сервера -//#define ASYNC_WEB_SERVER -//#define ASYNC_WEB_SOCKETS +// выбор сервера +// #define ASYNC_WEB_SERVER +// #define ASYNC_WEB_SOCKETS #define STANDARD_WEB_SERVER #define STANDARD_WEB_SOCKETS #define UDP_ENABLED -//#define REST_FILE_OPERATIONS +// #define REST_FILE_OPERATIONS #define MQTT_RECONNECT_INTERVAL 20000 @@ -54,7 +54,7 @@ #define MIN_DATETIME 1575158400 #define LEAP_YEAR(Y) (((1970 + Y) > 0) && !((1970 + Y) % 4) && (((1970 + Y) % 100) || !((1970 + Y) % 400))) -//задачи таскера +// задачи таскера enum TimerTask_t { WIFI_SCAN, WIFI_MQTT_CONNECTION_CHECK, TIME, @@ -66,14 +66,14 @@ enum TimerTask_t { WIFI_SCAN, ST, END }; -//задачи которые надо протащить через loop +// задачи которые надо протащить через loop enum NotAsyncActions { do_ZERO, do_MQTTPARAMSCHANGED, do_LAST, }; -//состояния обновления +// состояния обновления enum UpdateStates { NOT_STARTED, UPDATE_FS_IN_PROGRESS, UPDATE_FS_COMPLETED, diff --git a/include/DeviceList.h b/include/DeviceList.h index 5f376a29..773492f9 100644 --- a/include/DeviceList.h +++ b/include/DeviceList.h @@ -2,7 +2,7 @@ #include "Global.h" #ifdef ESP8266 -//эта библиотека встроена в ядро +// эта библиотека встроена в ядро #include "ESPAsyncUDP.h" #else #include "AsyncUDP.h" @@ -11,7 +11,8 @@ extern AsyncUDP asyncUdp; extern const String getThisDevice(); extern void addThisDeviceToList(); -extern void asyncUdpInit(); +extern void udpListningInit(); +extern void udpBroadcastInit(); extern String uint8tToString(uint8_t* data, size_t len); extern void udpPacketParse(String& data); extern void jsonMergeArrays(String& existJson, String& incJson); \ No newline at end of file diff --git a/include/EspFileSystem.h b/include/EspFileSystem.h index b77439ba..078f0f8d 100644 --- a/include/EspFileSystem.h +++ b/include/EspFileSystem.h @@ -1,6 +1,7 @@ #pragma once #include "Global.h" #ifdef ESP32 +#include #if USE_LITTLEFS #include #define FileFS LittleFS @@ -35,7 +36,7 @@ extern FS* filesystem; extern bool fileSystemInit(); extern void globalVarsSync(); -//extern String getParamsJson(); +// extern String getParamsJson(); extern void syncSettingsFlashJson(); extern void syncValuesFlashJson(); @@ -47,3 +48,4 @@ extern uint32_t ESP_getChipId(void); extern uint32_t ESP_getFlashChipId(void); extern const String getMacAddress(); extern const String getWebVersion(); +extern uint32_t getFlashChipIdNew(); diff --git a/include/Global.h b/include/Global.h index 91cd2047..285e08ba 100644 --- a/include/Global.h +++ b/include/Global.h @@ -1,8 +1,8 @@ #pragma once -//константы +// константы #include "Const.h" -//внешние глобальные директории +// внешние глобальные директории #include #include #include @@ -43,7 +43,7 @@ #include -//внутренние глобальные директории проекта +// внутренние глобальные директории проекта #include "utils/FileUtils.h" #include "utils/JsonUtils.h" #include "utils/SerialPrint.h" diff --git a/include/WsServer.h b/include/WsServer.h index 0fc6b884..c9de7fe2 100644 --- a/include/WsServer.h +++ b/include/WsServer.h @@ -18,4 +18,6 @@ void publishJsonWs(const String& topic, String& json); void periodicWsSend(); void sendFileToWsByFrames(const String& filename, const String& header, const String& json, int client_id, size_t frameSize); -void sendStringToWs(const String& header, String& payload, int client_id); \ No newline at end of file +void sendStringToWs(const String& header, String& payload, int client_id); + +void sendDeviceList(uint8_t num); \ No newline at end of file diff --git a/myProfile.json b/myProfile.json index 7432922b..b0ce54f5 100644 --- a/myProfile.json +++ b/myProfile.json @@ -3,7 +3,7 @@ "name": "IoTmanagerVer4", "apssid": "IoTmanager", "appass": "", - "routerssid": "rise", + "routerssid": "iot", "routerpass": "hostel3333", "timezone": 2, "ntp": "pool.ntp.org", @@ -24,7 +24,7 @@ }, "projectProp": { "platformio": { - "default_envs": "esp8266_4mb", + "default_envs": "esp32_4mb", "comments_default_envs": "choose from: esp8266_4mb or esp32_4mb or esp8266_1mb or esp8266_1mb_ota or esp8285_1mb or esp8285_1mb_ota" } }, diff --git a/platformio.ini b/platformio.ini index 7f1d6593..a13d7021 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1,5 +1,5 @@ [platformio] -default_envs = esp8266_4mb +default_envs = esp32_4mb data_dir = data_svelte [common_env_data] @@ -430,6 +430,7 @@ lib_deps = robtillaart/SHT2x@^0.1.1 WEMOS SHT3x@1.0.0 plerup/EspSoftwareSerial + gyverlibs/EncButton @ ^2.0 https://github.com/RoboticsBrno/ServoESP32 adafruit/Adafruit MCP23017 Arduino Library@^2.1.0 adafruit/Adafruit BusIO @ ^1.13.2 @@ -462,6 +463,8 @@ build_src_filter = + + + + + + + + + + diff --git a/src/DeviceList.cpp b/src/DeviceList.cpp index 9a0c42b4..250af529 100644 --- a/src/DeviceList.cpp +++ b/src/DeviceList.cpp @@ -1,9 +1,13 @@ #include "DeviceList.h" +// данная функция не записывает поле status из этого следует что поле равно false и поэтому весь список устройств отдаваемый мк +// уходит со статусом для всех устройств - offline +// приложение svelte хранит свой список и в нем поддерживает корректные статусы, а при получении этого списка +// лишь изменяет в своем те элементы массива которые добавились новые, не трогая остальные const String getThisDevice() { String thisDevice = "{}"; - jsonWriteStr_(thisDevice, F("devicelist_"), ""); //метка для парсинга - jsonWriteStr_(thisDevice, F("wg"), jsonReadStr(settingsFlashJson, F("wg"))); //рабочая группа + // jsonWriteStr_(thisDevice, F("devicelist_"), ""); // метка для парсинга - она не нужна теперь + jsonWriteStr_(thisDevice, F("wg"), jsonReadStr(settingsFlashJson, F("wg"))); // рабочая группа jsonWriteStr_(thisDevice, F("ip"), jsonReadStr(settingsFlashJson, F("ip"))); jsonWriteStr_(thisDevice, F("id"), jsonReadStr(settingsFlashJson, F("id"))); jsonWriteStr_(thisDevice, F("name"), jsonReadStr(settingsFlashJson, F("name"))); @@ -12,54 +16,76 @@ const String getThisDevice() { } void addThisDeviceToList() { - devListHeapJson = getThisDevice(); - SerialPrint("i", "List", "Add this dev to list"); + if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { + // если включен автопоиск то записываем это устройство в оперативную память + devListHeapJson = getThisDevice(); + } else { + // если выключен автопоиск то записываем это устройство в флешь память + // если файла не было никогда + String list = readFile("/devlist.json", 2048); + if (list == "failed") { + writeFile("/devlist.json", getThisDevice()); + } else { + // если файл был то перепишем в нем первое устройство - to do + } + } + + SerialPrint("i", F("List"), F("This dev added to list")); } #ifdef UDP_ENABLED AsyncUDP asyncUdp; -void asyncUdpInit() { - if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210)) { - asyncUdp.onPacket([](AsyncUDPPacket packet) { - // Serial.print("UDP Packet Type: "); - // Serial.println(packet.isBroadcast() ? "Broadcast" : packet.isMulticast() ? "Multicast" : "Unicast"); - // Serial.print("From: "); - // Serial.print(packet.remoteIP()); - // Serial.print(":"); - // Serial.println(packet.remotePort()); - // Serial.print("To: "); - // Serial.print(packet.localIP()); - // Serial.print(":"); - // Serial.println(packet.localPort()); - // Serial.print(", Length: "); - // Serial.print(packet.length()); - // Serial.print(", Data: "); - // Serial.write(packet.data(), packet.length()); - - //String data = {packet.data(), packet.length()}; // для ESP32 подходит как замена uint8tToString, но 8266 не переваривает - String data = uint8tToString(packet.data(), packet.length()); - String remoteWorkgroup = ""; - data.replace("[", ""); - data.replace("]", ""); - if (jsonRead(data, F("wg"), remoteWorkgroup)) { // проверяем чтоб полученный формат был Json и заодно вытягиваем имя группы - String loacalWorkgroup = ""; - jsonRead(settingsFlashJson, F("wg"), loacalWorkgroup); - if (remoteWorkgroup == loacalWorkgroup) { - SerialPrint("i", F("UDP"), "IP: " + packet.remoteIP().toString() + ":" + String(packet.remotePort())); - jsonMergeArrays(devListHeapJson, data); - } - } else { - SerialPrint("E", F("UDP"), F("Udp packet invalid")); - } - // reply to the client - // String ip = WiFi.localIP().toString(); - // asyncUdp.broadcastTo(ip.c_str(), packet.remotePort()); - // packet.printf(ip.c_str(), packet.length()); - }); - } +void udpListningInit() { + // если был включен автоматический поиск устройств + if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { + if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210)) { + asyncUdp.onPacket([](AsyncUDPPacket packet) { + // Serial.print("UDP Packet Type: "); + // Serial.println(packet.isBroadcast() ? "Broadcast" : packet.isMulticast() ? "Multicast" : "Unicast"); + // Serial.print("From: "); + // Serial.print(packet.remoteIP()); + // Serial.print(":"); + // Serial.println(packet.remotePort()); + // Serial.print("To: "); + // Serial.print(packet.localIP()); + // Serial.print(":"); + // Serial.println(packet.localPort()); + // Serial.print(", Length: "); + // Serial.print(packet.length()); + // Serial.print(", Data: "); + // Serial.write(packet.data(), packet.length()); - //будем отправлять каждые 60 секунд презентацию данного устройства + // String data = {packet.data(), packet.length()}; // для ESP32 подходит как замена uint8tToString, но 8266 не переваривает + String data = uint8tToString(packet.data(), packet.length()); + String remoteWorkgroup = ""; + data.replace("[", ""); + data.replace("]", ""); + if (jsonRead(data, F("wg"), remoteWorkgroup)) { // проверяем чтоб полученный формат был Json и заодно вытягиваем имя группы + String loacalWorkgroup = ""; + jsonRead(settingsFlashJson, F("wg"), loacalWorkgroup); + if (remoteWorkgroup == loacalWorkgroup) { + SerialPrint("i", F("UDP"), "IP: " + packet.remoteIP().toString() + ":" + String(packet.remotePort())); + jsonMergeArrays(devListHeapJson, data); + } + } else { + SerialPrint("E", F("UDP"), F("Udp packet invalid")); + } + // reply to the client + // String ip = WiFi.localIP().toString(); + // asyncUdp.broadcastTo(ip.c_str(), packet.remotePort()); + // packet.printf(ip.c_str(), packet.length()); + }); + } + + SerialPrint("i", F("UDP"), F("Udp listning inited")); + } else { + devListHeapJson = ""; + } +} + +void udpBroadcastInit() { + // будем отправлять каждые 60 секунд презентацию данного устройства ts.add( UDP, 60000, [&](void*) { // UDPP if (isNetworkActive()) { @@ -71,11 +97,11 @@ void asyncUdpInit() { }, nullptr, true); - SerialPrint("i", F("UDP"), F("Udp Init")); + SerialPrint("i", F("UDP"), F("Udp broadcast inited")); } void jsonMergeArrays(String& existJson, String& incJson) { - DynamicJsonDocument incJsonDoc(1024); + DynamicJsonDocument incJsonDoc(4096); DeserializationError incJsonError = deserializeJson(incJsonDoc, incJson); // if (incJsonError) { // upd: devlist заведомо верный, зачем проверять еще раз? // SerialPrint("E", F("UDP"), "Invailed json in incomming udp packet " + String(incJsonError.f_str())); @@ -83,7 +109,7 @@ void jsonMergeArrays(String& existJson, String& incJson) { // return; // } - DynamicJsonDocument existJsonDoc(1024); + DynamicJsonDocument existJsonDoc(4096); DeserializationError existJsonError = deserializeJson(existJsonDoc, existJson); // if (existJsonError) { // upd: полученный json уже проверен на целостность // SerialPrint("E", F("UDP"), "Invailed json in existing udp dev list " + String(incJsonError.f_str())); diff --git a/src/EspFileSystem.cpp b/src/EspFileSystem.cpp index 21d6f11f..e284d0ed 100644 --- a/src/EspFileSystem.cpp +++ b/src/EspFileSystem.cpp @@ -26,13 +26,13 @@ void globalVarsSync() { // jsonWriteStr_(ssidListHeapJson, "ssids_", ""); //метка для парсинга удалить } -//к удалению. не используется -// String getParamsJson() { -// String json; -// serializeJson(*getLocalItemsAsJSON(), json); -// jsonWriteStr_(json, "params", ""); -// return json; -// } +// к удалению. не используется +// String getParamsJson() { +// String json; +// serializeJson(*getLocalItemsAsJSON(), json); +// jsonWriteStr_(json, "params", ""); +// return json; +// } void syncSettingsFlashJson() { writeFile(F("settings.json"), settingsFlashJson); @@ -43,7 +43,7 @@ void syncValuesFlashJson() { } const String getChipId() { - return String(ESP_getChipId()) + "-" + String(ESP_getFlashChipId()); + return String(ESP_getChipId()) + "-" + String(getFlashChipIdNew()); // + "v" + String(FIRMWARE_VERSION); } void setChipId() { @@ -76,6 +76,7 @@ uint32_t ESP_getChipId(void) { #endif } +// устарела используем новую функцию ниже uint32_t ESP_getFlashChipId(void) { #ifdef ESP32 // Нет аналогичной (без доп.кода) функций в 32 @@ -86,6 +87,31 @@ uint32_t ESP_getFlashChipId(void) { #endif } +// https://github.com/espressif/arduino-esp32/issues/6945#issuecomment-1199900892 +// получение flash ch id из проекта esp easy + +uint32_t getFlashChipIdNew() { + // Cache since size does not change + static uint32_t flashChipId = 0; + + if (flashChipId == 0) { +#ifdef ESP32 + uint32_t tmp = g_rom_flashchip.device_id; + + for (int i = 0; i < 3; ++i) { + flashChipId = flashChipId << 8; + flashChipId |= (tmp & 0xFF); + tmp = tmp >> 8; + } + + // esp_flash_read_id(nullptr, &flashChipId); +#elif defined(ESP8266) + flashChipId = ESP.getFlashChipId(); +#endif // ifdef ESP32 + } + return flashChipId; +} + const String getMacAddress() { uint8_t mac[6]; char buf[13] = {0}; diff --git a/src/Main.cpp b/src/Main.cpp index 0e621c25..95216a1f 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -10,8 +10,6 @@ String volStrForSave = ""; unsigned long currentMillis; unsigned long prevMillis; - - void elementsLoop() { // передаем управление каждому элементу конфигурации для выполнения своих функций for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { @@ -29,69 +27,62 @@ void elementsLoop() { handleEvent(); } +#define SETUPBASE_ERRORMARKER 0 +#define SETUPCONF_ERRORMARKER 1 +#define SETUPSCEN_ERRORMARKER 2 +#define SETUPINET_ERRORMARKER 3 +#define SETUPLAST_ERRORMARKER 4 +#define TICKER_ERRORMARKER 5 +#define HTTP_ERRORMARKER 6 +#define SOCKETS_ERRORMARKER 7 +#define MQTT_ERRORMARKER 8 +#define MODULES_ERRORMARKER 9 - - - -#define SETUPBASE_ERRORMARKER 0 -#define SETUPCONF_ERRORMARKER 1 -#define SETUPSCEN_ERRORMARKER 2 -#define SETUPINET_ERRORMARKER 3 -#define SETUPLAST_ERRORMARKER 4 -#define TICKER_ERRORMARKER 5 -#define HTTP_ERRORMARKER 6 -#define SOCKETS_ERRORMARKER 7 -#define MQTT_ERRORMARKER 8 -#define MODULES_ERRORMARKER 9 - -#define COUNTER_ERRORMARKER 4 // количество шагов счетчика -#define STEPPER_ERRORMARKER 100000 // размер шага счетчика интервала доверия выполнения блока кода мкс +#define COUNTER_ERRORMARKER 4 // количество шагов счетчика +#define STEPPER_ERRORMARKER 100000 // размер шага счетчика интервала доверия выполнения блока кода мкс #ifdef esp32_4mb -static int IRAM_ATTR initErrorMarkerId = 0; // ИД маркера +static int IRAM_ATTR initErrorMarkerId = 0; // ИД маркера static int IRAM_ATTR errorMarkerId = 0; static int IRAM_ATTR errorMarkerCounter = 0; hw_timer_t *My_timer = NULL; -void IRAM_ATTR onTimer(){ +void IRAM_ATTR onTimer() { if (errorMarkerCounter >= 0) { if (errorMarkerCounter >= COUNTER_ERRORMARKER) { errorMarkerId = initErrorMarkerId; errorMarkerCounter = -1; - } else + } else errorMarkerCounter++; - } + } } #endif void initErrorMarker(int id) { -#ifdef esp32_4mb +#ifdef esp32_4mb initErrorMarkerId = id; errorMarkerCounter = 0; #endif } void stopErrorMarker(int id) { -#ifdef esp32_4mb +#ifdef esp32_4mb errorMarkerCounter = -1; - if (errorMarkerId) - SerialPrint("I", "WARNING!", "A lazy (freezing loop more than " + (String)(COUNTER_ERRORMARKER * STEPPER_ERRORMARKER / 1000) + " ms) section has been found! With ID=" + (String)errorMarkerId); + if (errorMarkerId) + SerialPrint("I", "WARNING!", "A lazy (freezing loop more than " + (String)(COUNTER_ERRORMARKER * STEPPER_ERRORMARKER / 1000) + " ms) section has been found! With ID=" + (String)errorMarkerId); errorMarkerId = 0; initErrorMarkerId = 0; #endif } - - void setup() { - -#ifdef esp32_4mb +#ifdef esp32_4mb My_timer = timerBegin(0, 80, true); timerAttachInterrupt(My_timer, &onTimer, true); timerAlarmWrite(My_timer, STEPPER_ERRORMARKER, true); timerAlarmEnable(My_timer); - //timerAlarmDisable(My_timer); + // timerAlarmDisable(My_timer); initErrorMarker(SETUPBASE_ERRORMARKER); #endif @@ -141,23 +132,19 @@ void setup() { // настраиваем микроконтроллер configure("/config.json"); - + stopErrorMarker(SETUPCONF_ERRORMARKER); - - initErrorMarker(SETUPSCEN_ERRORMARKER); - + // подготавливаем сценарии iotScen.loadScenario("/scenario.txt"); // создаем событие завершения инициализации основных моментов для возможности выполнения блока кода при загрузке createItemFromNet("onInit", "1", 1); elementsLoop(); - - stopErrorMarker(SETUPSCEN_ERRORMARKER); - - + stopErrorMarker(SETUPSCEN_ERRORMARKER); + initErrorMarker(SETUPINET_ERRORMARKER); // подключаемся к роутеру @@ -181,8 +168,6 @@ void setup() { stopErrorMarker(SETUPINET_ERRORMARKER); - - initErrorMarker(SETUPLAST_ERRORMARKER); // NTP @@ -191,11 +176,10 @@ void setup() { // инициализация задач переодического выполнения periodicTasksInit(); - // синхронизация списка устройств - addThisDeviceToList(); - // запуск работы udp - asyncUdpInit(); + addThisDeviceToList(); + udpListningInit(); + udpBroadcastInit(); // создаем событие завершения конфигурирования для возможности выполнения блока кода при загрузке createItemFromNet("onStart", "1", 1); @@ -227,8 +211,6 @@ void setup() { stopErrorMarker(SETUPLAST_ERRORMARKER); } - - void loop() { #ifdef LOOP_DEBUG unsigned long st = millis(); @@ -253,7 +235,7 @@ void loop() { initErrorMarker(MQTT_ERRORMARKER); mqttLoop(); stopErrorMarker(MQTT_ERRORMARKER); - + initErrorMarker(MODULES_ERRORMARKER); elementsLoop(); stopErrorMarker(MODULES_ERRORMARKER); diff --git a/src/MqttClient.cpp b/src/MqttClient.cpp index c2480941..4324e7c1 100644 --- a/src/MqttClient.cpp +++ b/src/MqttClient.cpp @@ -6,7 +6,7 @@ void mqttInit() { WIFI_MQTT_CONNECTION_CHECK, MQTT_RECONNECT_INTERVAL, [&](void*) { if (WiFi.status() == WL_CONNECTED) { - SerialPrint("i", F("WIFI"), "OK: " + jsonReadStr(settingsFlashJson, F("ip"))); + SerialPrint("i", F("WIFI"), "http://" + jsonReadStr(settingsFlashJson, F("ip"))); wifiUptimeCalc(); if (mqtt.connected()) { SerialPrint("i", F("MQTT"), "OK"); @@ -133,10 +133,10 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) { if (payloadStr.startsWith("HELLO")) { SerialPrint("i", F("MQTT"), F("Full update")); - //публикация всех виджетов + // публикация всех виджетов publishWidgets(); - //публикация всех статус сообщений при подключении приложения и генерация события подключения приложения в модулях + // публикация всех статус сообщений при подключении приложения и генерация события подключения приложения в модулях for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { if ((*it)->iAmLocal) { publishStatusMqtt((*it)->getID(), (*it)->getValue()); @@ -144,7 +144,7 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) { } } - //отправка данных графиков - данный код будет оптимизирован после завершения написания приложения с новыми графиками + // отправка данных графиков - данный код будет оптимизирован после завершения написания приложения с новыми графиками for (std::list::iterator it = IoTItems.begin(); it != IoTItems.end(); ++it) { if ((*it)->getSubtype() == "Loging" || "LogingDaily") { (*it)->setPublishDestination(TO_MQTT); @@ -162,16 +162,17 @@ void mqttCallback(char* topic, uint8_t* payload, size_t length) { else if (topicStr.indexOf(F("control")) != -1) { String key = selectFromMarkerToMarker(topicStr, "/", 3); - - String valueIfJson = ""; // проверяем формат, если json то берем статус, иначе - как есть + + String valueIfJson = ""; // проверяем формат, если json то берем статус, иначе - как есть if (!jsonRead(payloadStr, F("status"), valueIfJson, false)) generateOrder(key, payloadStr); - else generateOrder(key, valueIfJson); + else + generateOrder(key, valueIfJson); SerialPrint("i", F("=>MQTT"), "Msg from iotmanager app: " + key + " " + payloadStr); } - //здесь мы получаем события с других устройств, которые потом проверяются в сценариях этого устройства + // здесь мы получаем события с других устройств, которые потом проверяются в сценариях этого устройства else if (topicStr.indexOf("event") != -1) { if (!jsonReadBool(settingsFlashJson, "mqttin")) { return; @@ -251,7 +252,7 @@ void publishWidgets() { DeserializationError error = deserializeJson(doc, file); if (error) { SerialPrint("E", F("MQTT"), error.f_str()); - jsonWriteInt(errorsHeapJson, F("jse3"), 1); //Ошибка чтения json файла с виджетами при отправки в mqtt + jsonWriteInt(errorsHeapJson, F("jse3"), 1); // Ошибка чтения json файла с виджетами при отправки в mqtt } JsonArray arr = doc.as(); for (JsonVariant value : arr) { @@ -292,43 +293,43 @@ void handleMqttStatus(bool send, int state) { const String getStateStr(int e) { switch (e) { - case -4: //Нет ответа от сервера + case -4: // Нет ответа от сервера return F("e1"); break; - case -3: //Соединение было разорвано + case -3: // Соединение было разорвано return F("e2"); break; - case -2: //Ошибка соединения. Обычно возникает когда неверно указано название сервера MQTT + case -2: // Ошибка соединения. Обычно возникает когда неверно указано название сервера MQTT return F("e3"); break; - case -1: //Клиент был отключен + case -1: // Клиент был отключен return F("e4"); break; - case 0: //подключено + case 0: // подключено return F("e5"); break; - case 1: //Ошибка версии + case 1: // Ошибка версии return F("e6"); break; - case 2: //Отклонен идентификатор + case 2: // Отклонен идентификатор return F("e7"); break; - case 3: //Не могу установить соединение + case 3: // Не могу установить соединение return F("e8"); break; - case 4: //Неправильное имя пользователя/пароль + case 4: // Неправильное имя пользователя/пароль return F("e9"); break; - case 5: //Не авторизован для подключения + case 5: // Не авторизован для подключения return F("e10"); break; - case 6: //Название сервера пустое + case 6: // Название сервера пустое return F("e11"); break; - case 7: //Имя пользователя или пароль пустые + case 7: // Имя пользователя или пароль пустые return F("e12"); break; - case 8: //Подключение в процессе + case 8: // Подключение в процессе return F("e13"); break; default: diff --git a/src/WsServer.cpp b/src/WsServer.cpp index 6eec69aa..aa7cd24f 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -135,11 +135,12 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) // RouterFind(jsonReadStr(settingsFlashJson, F("routerssid"))); } - // обработка кнопки сохранить настройки wifi + // обработка кнопки сохранить settings.json if (headerStr == "/sgnittes|") { writeUint8tToString(payload, length, headerLenth, settingsFlashJson); writeFileUint8tByFrames("settings.json", payload, length, headerLenth, 256); sendStringToWs("errors", errorsHeapJson, num); + // если не было создано приема данных по udp - то создадим его addThisDeviceToList(); } @@ -164,7 +165,14 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t* payload, size_t length) // отвечаем данными на запрос страницы if (headerStr == "/list|") { - sendStringToWs("devlis", devListHeapJson, num); + sendStringToWs("settin", settingsFlashJson, num); + // отправим список устройств в зависимости от того что выбрал user + sendDeviceList(num); + } + + // сохраняем данные листа + if (headerStr == "/tsil|") { + writeFileUint8tByFrames("devlist.json", payload, length, headerLenth, 256); } //----------------------------------------------------------------------// @@ -307,7 +315,10 @@ void publishJsonWs(const String& topic, String& json) { void periodicWsSend() { sendStringToWs("ssidli", ssidListHeapJson, -1); sendStringToWs("errors", errorsHeapJson, -1); - sendStringToWs("devlis", devListHeapJson, -1); + // отправляем переодичестки только в авто режиме + if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { + sendStringToWs("devlis", devListHeapJson, -1); + } } #ifdef ESP32 @@ -413,3 +424,14 @@ void sendStringToWs(const String& header, String& payload, int client_id) { standWebSocket.sendBIN(client_id, (uint8_t*)dataArray, totalSize); } } + +void sendDeviceList(uint8_t num) { + if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { + // если включен автопоиск то отдаем список из оперативной памяти + SerialPrint("E", "FS", devListHeapJson); + sendStringToWs("devlis", devListHeapJson, num); + } else { + // если выключен автопоиск то отдаем список из флешь памяти + sendFileToWsByFrames("/devlist.json", "devlis", "", num, WEB_SOCKETS_FRAME_SIZE); + } +} diff --git a/src/modules/API.cpp b/src/modules/API.cpp index e4f040c1..71529d10 100644 --- a/src/modules/API.cpp +++ b/src/modules/API.cpp @@ -7,7 +7,6 @@ void* getAPI_Timer(String subtype, String params); void* getAPI_Variable(String subtype, String params); void* getAPI_VariableColor(String subtype, String params); void* getAPI_VButton(String subtype, String params); -void* getAPI_A02Distance(String subtype, String params); void* getAPI_Acs712(String subtype, String params); void* getAPI_AhtXX(String subtype, String params); void* getAPI_AnalogAdc(String subtype, String params); @@ -32,7 +31,7 @@ void* getAPI_Mcp23017(String subtype, String params); void* getAPI_Mp3(String subtype, String params); void* getAPI_Multitouch(String subtype, String params); void* getAPI_Pcf8574(String subtype, String params); -void* getAPI_Pwm8266(String subtype, String params); +void* getAPI_Pwm32(String subtype, String params); void* getAPI_TelegramLT(String subtype, String params); void* getAPI_Lcd2004(String subtype, String params); @@ -45,7 +44,6 @@ if ((tmpAPI = getAPI_Timer(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Variable(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_VariableColor(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_VButton(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_A02Distance(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Acs712(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_AhtXX(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_AnalogAdc(subtype, params)) != nullptr) return tmpAPI; @@ -70,7 +68,7 @@ if ((tmpAPI = getAPI_Mcp23017(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Mp3(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Multitouch(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Pcf8574(subtype, params)) != nullptr) return tmpAPI; -if ((tmpAPI = getAPI_Pwm8266(subtype, params)) != nullptr) return tmpAPI; +if ((tmpAPI = getAPI_Pwm32(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_TelegramLT(subtype, params)) != nullptr) return tmpAPI; if ((tmpAPI = getAPI_Lcd2004(subtype, params)) != nullptr) return tmpAPI; return nullptr; diff --git a/src/utils/TimeUtils.cpp b/src/utils/TimeUtils.cpp index ef850250..aa8588f5 100644 --- a/src/utils/TimeUtils.cpp +++ b/src/utils/TimeUtils.cpp @@ -2,7 +2,7 @@ #include "Global.h" #include "utils/StringUtils.h" -static const char* TIME_FORMAT PROGMEM = "%02d:%02d:%02d"; +static const char* TIME_FORMAT PROGMEM = "%02d:%02d"; //:%02d"; static const char* TIME_FORMAT_WITH_DAYS PROGMEM = "%dd %02d:%02d"; const String prettySeconds(unsigned long time_s) { From 57a5bb6df2f5dff9d08dafc8353e913472bd4d58 Mon Sep 17 00:00:00 2001 From: Dmitry Borisenko <67171972+IoTManagerProject@users.noreply.github.com> Date: Sun, 11 Jun 2023 17:07:04 +0200 Subject: [PATCH 2/2] =?UTF-8?q?=D1=81=D0=BF=D0=B8=D1=81=D0=BE=D0=BA=20?= =?UTF-8?q?=D1=83=D1=81=D1=82=D1=80=D0=BE=D0=B9=D1=81=D1=82=D0=B2=20=D0=B8?= =?UTF-8?q?=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data_svelte/build/bundle.css.gz | Bin 5516 -> 5526 bytes data_svelte/build/bundle.js.gz | Bin 49944 -> 50209 bytes data_svelte/index.html | 6 +++--- src/DeviceList.cpp | 24 ++++++++++++++---------- src/WsServer.cpp | 3 ++- 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/data_svelte/build/bundle.css.gz b/data_svelte/build/bundle.css.gz index 8c7bb6f3ef7dcca2b9354d4151f3c835b1bb9e25..910785a1961592fb22edcd1f1c0d73e9a5abc6cf 100644 GIT binary patch delta 5373 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 IyJ%?t1@tvSLjV8( delta 5362 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 Rj?V+;=Bhwa)D8y5KL9{aR4V`g diff --git a/data_svelte/build/bundle.js.gz b/data_svelte/build/bundle.js.gz index 0db852d11880042d513c3d4ba5856840b33f2f9a..2d726583509573b39afe48474a192feead8250e2 100644 GIT binary patch delta 17379 zcmV)EK)}D4h6AC90|y_A2ncH8g|P?GfPeXKTTc=HSBwS05t|YpNz;Ida<$)-q%BR- zv_Mrk_DkZ{@pJvwISQ4yK|%rq2q6&n5B$n~AO8aU3;ZQ~X7+sho|ES^1q7(6ci-$a zd(Y0!&cMTDEuPMRJ=RAzs03=!Yoc!NI(An5%HGtRp7zxl=<(RpeZ_{fMt|(m z`=nwuyqG1qz{;^m6(*8P^Lk&T*Y>zQf}R&MCy4A{}=2;FC{={QWCSAMY~}!$+E*<3RH( zs}c`@-yoVw%^LFlilfSBOYi;rr+nS4| zDzv1=VF#mSF>E2C5xo`Ubu}EHD2U!nwRmsFTKjP3bH}li1g@^AR~zsp(JYA8cTfCSOzsS4t10t zw(8>8TwexIc;=_#;TojU;{d{(>~^#Z3eV5xL}f##;UqWxdBti|Z}%s9)Yt2aA^uXN ze^vNoe@!@&zb<@oe^x!cZGQ-l#Gez6s-GABR(ta`Q=3*E*du61{Q?i{YIXn3U#;Q2 z`ExmS`u}Y&?gssT~4;Hdc(Xfoxco!03;l=ix}yLoTq4kvwgH@1YWkL>K^ zm2h_TS9quYe}#92S9sNWqgK6nbD=&JUFGqeN_`72@UHOWPNiO$gMX^!|G}4b2ick1 zWEt$Mz8*r-H+nc^Uk!0q;d>$bScpU4>FS||Ue&K_MRy}7cwu%}L>NPCUMyZJ_8{l8 zBA$p{@krbek3}TW4u7Z)$_pPbX&Z?$E1J=jDcOu65mHTzUf!0w(h7IPvRPFs$B0Hu z5_)8azAm7AzMm3&7?=xt-vmiX4$(9q*|SmtdB+6E91L)^ZzVXmr114h)^3^SoeZTP z;{fwTA`(~?IHLm<;*5rqFmSn__-LGmhR|Mk-pSDTftv&+w10!b>36v}ZHCs?wtSo( zaOk!RUG=<^;S~1PY4@O8Qo;>?`<=q&9+&pa6|r`Ku+Gp9N2!LRk;ho)T%NmJ?t0$I zaQ50!VfYT`{mNzd(r>NX9J=R1A9~)&O8yaF2>yb8ORQ5K$7Ej%y+UV&3w+{A+4a$R z#Gx_PmRRyN%YPju+UwmK;_I@j&2pNef%&fY&*wec8us-KGg2`cUDDysGZF-tYdR7Sk?eX~E&BOoY)$m8cY<~;CDum(l@fbeL!*KVi817~< zd{PL*z3~`64lm0u6e)KyTfqa$S@n#(s0bGv5HpncL?vzwXt1bM=O+1?N)CcYIh*V# zS#i)mlzhu1C&ELedSH@otK^`Olyi?AB`FS)smT5U(pV}{vNa>b24675AsU#6jJjgAEYVSmUGPh3Pd#t=0ebR2ohMRp?!k;5U@ zNSpE*M^I~<%ral5&XCZ35Xq9H>W0!u)h$-&i%D&ir$X8lGf8eFsP|vmf_5FxR?JQkGr|$$uFtiNN4pZJ-P20=~e>q}9P~5=7I@!6K(h z{JuN4P8{;DsMPs{l?phfGezrTzY5IjYvv!1Mm1C9fUyq`!FFXMc%^ zJ56Lt=e#==dHr0MA1NLJe!pt?_=H%C%MNyp!RR;R1cy9i0u6!-=?Z z8TkUPF7({; za4iqRyH~~VZWhDmg)n?J9>bS;7;an@!;LJ4dxbE3H6Fv2EAv9=jquQWavme5Wra99 z;w@uG+`SFBU+M4(iTCtvJ|(G?hbD^?l?BKS<(#pjcp{)eD2q*(#e;Y#Rk|IM!LrH# zw2E>bC}-O+N07m)mjUEHyMJdYAZo685}Kuxb+o-HIgHzSfEExAOxDaj~g+o?ZpHa(y^`aiiY$NN%UKYOf67cr8=QE>A4FXt{vu0cTplMOI zH3>!CT>xTn^|EsA1{?~e*L@=|wgEi3^%jCH9C1urIMH<$ZGSgl#4xSm$*s2$!+>)| z+i$Y`yM?ncgy7)sNnIw)Vh$xZlUza1MDv)7$0n|5(b$f8YlM2k=oL2cGM$%fl7bBP zHi#dV)C)^;J6X|^%tkg*eBQ+-NwJ$uh!NWAlDfCGi0;UV+-^=La{Hn$-c2I6>2+jQ zcxy;i*!82Pgnw-7!mS$(VV8vHvt(Uc5XVH5)i>e`rKS&Zf@a9!nd5bQLh!2y)}m03ro+&R}htrFA|GQ+pP^IS-zr%Q?S_Yr&;Vx z)*1=JZ||!@N>x1LZ)<8ntm*IWfWFqvSBJiy^OrFRyHt)@b1-@_J~&_>Sd8?Bk| zOijIWqdi{NWhtxmaab^3Ta@YfY*}=g>g$vp z!xX!(zLo=}lKi!;dfsW^7pwl3QF+%Y>1-r}825j4A zh<|Go(JfOZ+DNRqXy6f1tlW`<*#6*3<-Ja++@fdlJ`?MyXwNCyrK=$)y)T~oXzftS zYZ_k2KQ(AmDBh)lE?kaHksr5#hkoD*2cGM|v46{0D7u^Ov*Vc}BDz6t?aOj&XLIX~&F%2A z+zu}i&JA-rpIoDEVJ?5#WQ3aP`Rf(pv{jt$Kn0CFWw;nS6ys3GunKb7IrlUK#aSu2 zwhx+P&|$y~*Q$T)lC}^C&1uvD3~Is=+v$ib#pNoaBOL~jAXVqrCzxBg8i%&8%72Lc zCX2^|CVyM(*Xqp)*{`bw-|XBkA}>M`9z~VAgOcV${6kMu>JzOgbtSDSb;Z||N}2A` z9zaTUkpVp&c$YmAO-;Q^1#S03dd^p2+V@qM_OGhKRH^0s$LGFPP>pBdXFvsW+jvkS zb)`!2X5mzjg5Y;)^pr)(VHmTO#ecK#KL1?boK8IPnd(jcUlTk2usUjV{q4u7f~TH0NE zprl?_8S8rvzh}O3zcmM6cLao1{O>=OdIf-!#tBJ^P=V|)SAlGJL@gcf&&&p5B91U* zqdYUSH|C7+o;g!|AGbBcUUV~w0 zxk?E)Luha;yYF+7+~e;>_J7yOABuO7B!Vh&T`Mo7#0p>uo%T`Gez6~)DX>eN3}-;A zp9jJn?=;K%y}12?DR765k#?O&tru`}uUEB}XmjL_s}6k&R9)OWp`5 zwf2*^H-e%xlGK=~mSjA@F9bV~XCs}b9JcyNmv%~*eJHasjCw8EJ%5Re5DAte-7=wA ziErmA&m#G~3#CA+y6qnXu`mp3+!}uNq3F-CoM{v#7B5{;tpSChep$lQrCMDr^uqTv zATJcSWU0bID>r25q376bO?L4;Bg0KP$|k;Wk)@p0ny@#fq;C$igJU;YSeKP zfrFl_7D!@($%lcm=@nKcdD~Mqz0zC>luci}5=dz?$+zsF7lck_%uAGx zm6zd(kBEW5%zqZdVb%F-BXwxG=gwc5v)3SV?0PR~mGBazGy~ad?+%2W-_pYjtH2cA zF%*s{0rnSUgzJ$DRD_kYD#B8QmP>#CBBKSBV_z;2G?Yx{BtZF>h(uuuof2p$dq0D3 zS1sr|yHWbv4}+^4Q{$irkd>yYKB9Cq(E2HSWCcp4CVz4@_i^|&p6lDAE#7_G(+#(% z17xYe8}HTErRHE8WlyfDzJE4eUTC>5b}p3{n*G1L(3Rwc)_i#(7XHz4LY?RY_wJkB zL>f6Egl!O=t_6i~rL@Lz7Df>0lTiziF{_@&>pu#J#a*P3k+Y{pR? zM8$9k^I@st(vB)x(q+<|Y@)?fZj6U#N@JhJVlyW;2)*sf_@`$}avGJ9fdxAjvH9^C@|; z=SAej>NkCLjP(WmRi&@SY#=~(w@8kSD(8`#!8=7VxBw-W)2shFS+~+=ETZzCK%fSE3<< zC`mDQ5_4}Br4GR9!jiBsbZX*`$RBVD3-|!boGEa{y4I50kg*?AyCKRLx_=4{JyvJj z)HMRLI{Db}=@NeEd>!*C86RA0%tnT{E7}v9P}lrTl#--ML1e9k#=x5fjn}$k53w5L zn^)h<(~*j;`^q{}>kDt7Bekkb`a3wD#@O2)Gp%k$cEfA6t)R7p0H7>GaS>USeN3t6nCX~M~YWc zyp-a$6nj!^;1W@a6)B!bu`9(RDeg$|Sc(rz@ewIL3K|D{C+dxjCQ?Fl`+a(4&^2Fp zG)Lb<{e7yxWBo0=pnsI&Qv$U#Xf%-Y*>j)A^xbyf9DSs}A-Of6?~eXHKwqz%%P1k> zzyN#nb)dh7372q0pAGDGOkRmY5HiiCiIH^iGMx0cf&WuYgC7$3Bx=^u;1vR&N6mT~ z{Di>!QL~W-?-KYdYR;v>j|hAkHRsddJ8zZfo^J^pe@iZ zNtAO=8+qRALG_zXF|;|cvH~UAiZ!BIZtF16UTw59V-#RYM?@HA6(8OAyw`*9*9~^y zL*%#XPDXUgwCgt7wHr<6iAg!{TR@Z4*Z*8`O+Lf$&jA3IqtQ~e#`vr|B%T|L?-C^& zT}f5a#27QH6My#=<4rG(QLXgQV7mfrV_^G4i3fUuexCPQu-zTdx;I|&yU}><%KflG z@*_a9MKT;5LrNDVO8Ku9&rj2Jx0+KWdPuC0>`TTW@yhK=gXd5J(H;tlt_ ziH`#bt*gcAT!kJ3a;zZxIzAvLdO=f=b3o1&z?!$L*M^aa6CXJ zM|u^MYJVA&-a07lLP%J4XeH!WAhEm!(Dz>xmfxWZ*BKsOeEq}MskCbI>gb^jGEc3C z9ugZC?T3W+Ai~n9Vm$5yupI-y6 z>qT+BR~XlqdAL5j23+@w;`*vEu8;C?{qQy5`nV{ryM=L$WFE3zc@5YmvM9Pz7RI-i zi+^wDI`AD8#?kiS*g-!cn-#;*x*_9jWh-{tvn#zv zhL$@q1jIl2$%|vIpS2@>0kxFk`c{>jgYkivye;}r)PmL`Li&VX6i+S4|k5qpTK%^qfLt7Hc@gCm^*v%9tD*mzE)Jt3oq zq!q?smbg7Che7+&o|(g-GieXcVbH0xr|2-~-O?VX!=M+^o~vCDS8UT(@xHDiGwiiz z*?6|tLo9suFe6`&A!!GZ&VZTw+JCcVJnQTsc0YTV>95C=v;#_Kz!w49bK7|K*h5zX z?BNRnt=raS@I+_8mj>GN$awCshprLW!M0B6+ZYa#9cS|IZdP=l(6yeW47sAzmx)jiyVSmm~FVZT2D1Yj;5u!3! zRB!6i%$hJQO!-|dKe!WN47No#a`A>7&)t={cz4Cnix+de;10z^T@kStwZ&1ryA>1d zBckO+>v6Q;&V}O*F;%^YZH^dR#&E;|rZOU??ogHvsS9zl!dEGpb7iLIxkOvid_@G+ zmWQ@2Q<)r7Cb);;ixnVg$U8mUb7DHGfX@fDEf!kJ~{-INKf zD~O;n**BTYr7}6AOmKh17e<j?NBmEc#yT0mpWicP1LHA_rcy1CHk1 z>X~@Bojma3eMC~c|6poqYAT@Xg6rl$Ld?=3ol0Q9>4kPz12xm3dg&+H-PP_#wJW9e z#KzMyo&)1Ka=UEDF@K;tj`Q4cEa#5nHFq47xnsG@t_GVX`}@+=L7GZPQwwRTVLU6+ zR7jed7>|r-15r-~`{^6|4_|s?4^=15FwVc~;i7{n}8O_CpD%>gfacoksY8mkRQGdKM?T7S?UY=3mT9}V9YGq;_G z`{A46ewc@Qrzq~d!nmL1;lBK4xG(47zEc$U^J2J9c9>KesH&{n4O4g``=LsSmQ9ZN z=CmNN=UgSnnxvdfc8vYdWlFxRl4Ew<9!59@Zed@45USp)DRUBWO69;pM)y|jmI1kF z^;w23d(rAu4S({Z)rbh+O3~moy$QdlXx&}Y*o?ilnwrWqo=b8VCgJu$lCZ&Cl4X~~ zZxf^mTd9bJ#1m&JaZBwb4^msnN3N>=E8jj-$kZsc`rTtJd^3YlFNun3{;Jm})cp0) zYpVssL~`%#uD_0r3F|16%QyXrY~fv_pdPBxbi;LOihl_d94NGIvybrSyXmt^-yiM2 ziGjQccig}Ily+Ob8~uyc=Y&VWpZ?DvP#^$?p=U(Den}%y>oEhq7f>v2L?331jDAtQ zg3=>4OVez6-s`EvH+YWx75}n=OQsrGvwMC^XU*n$-s?f~>qa8qO!Pm}BQ!=X$1a~! z+!acOIe(<@D*eTt^aBHKJHQ?THhftv=e?e4vB&{Qj`4GJQoli6&l)fAgq=I)m#FdQ z$9Bw$l8o?#A#B~#qGNabx~q+d!WSkUzf~QKCy?)gC=b&xFe241i7@V(u?i~w$iN!}I%a z!vutd7qPQ(p+^J6bz$D#PNpU7q&VN020ws>_j{Lb*!)KOp4!Nr$yrZ0#%DJsd z*fT|KsG@MlQ_hNVo{)nxpLb=B(;sL$SCm_IIPkHG^I_$DR5?;#bVl}~v#)PT`Q)fQ zUE>+Dht87h;S;61J;(oa=@?_-jk@s+jOReQdvr@|@t{!fL%}nIrYS%<8Z)1#VAUL0jbV3EuzC)x!LXi80q637q>Ubx zEXda~(`9NZX9k&MTUPbF9`lIpCV-1q$&O|h_zKA@Z-s6_Kl`MShfnU1ci|r)l-|~M z46OW3-@__rF1XMR-~YXx?FA^M_kXZykz(d7ok{#z!2ZC& zrXjMvy_Ndfl{KB7O8nUj!6Z`bA$>&RX?vW?@R%~BDUHbb9@k}9MUL;5__H~J&%_KS zp^sQR;ZIUIo=}do7$7p|h)A5{q&!u2A82=5yL;N*&~7BPr|+&H?b_vZ6n`E{yKp(+ zv9zm}0|I@_X2s6kPiq^Bl0ahvJrSh=oE+kEc`VNj5A)JTzQm==zd`=k`ct}QzAV|}+-kot+|$H7Tu#guk9A9NRiVUX=yW`I^>dmaP!}63p;-U6+Mwh7 zM!nz_cHi%~Cg}+-s1gN;-G2>KqJ$m%fkN6*QYZeSnT6R>3;~`4dg6aR(;CS*`>Oo% zoY4XJbyl8y^(pA1P<@K3`Nir|?p~%YB}zhdDGq@*P?O^H0VjcquOyswAFx5gif`X} z?r8>7r@yCZ#Egjrnz&FOZ8kjLUY|dby6KVBEUTArVBmT$E*D7= z>&Hx`-&gLJpJo+J=znEB3Hr^G{P!7Q7p=Qa7SS!J#W7P$@`X#^Fv(~c%I#HoCRz1D zZXh_E*b*qGY+HmniDF0~^3u=+^L4TYa>JY($SF@A>TEd@1F0TC^BLVm7uC;cGa6IP zrFbc}#7^AgItx`FD!%IzI$h8?K&uifDkmOK<^sFg60ZEgQ5vq6w z<0D6n)*_HGYONDbr*+~hv^GmYU#W5fvZ=|>5IfzudbVN1(ccOhHlsg`j(**c6bKcT zb%_)}AF*=K#DB9xHPm*fx@kL9^rnt zWoomv271jB1ToilOnbyAD|Sr~dj!I;soMZ*`??>CVLF0-F)oIpkB;Xr9un+Bo6))e zFIUZlGblSeoE3?<>550KeN2XxSXq(qj2QGU)=`IY*?;~(-!o#+ZFVm-Vi5L^lrEF1 z)$P_5`Qxsaj8#7WvM*j;s(ilsHnq=p|7&&6w-aCYyfZ4VHPD0NP7p2ebkMht;yA%k z!xjX2zWVF~Dqhh|DhPP>;ZN`U5sFU8=ukZK) zS~>E7y?{88oD)yL^bqK`7$;P3-9mj}h4q8mEH1nx}%?>kv=bcMlQ0kUZt# zH$^+GJKXk@jk3TR$SoXkY?s+Mw^#+ag=;nJzJIdwfz#uj=}k{l`vIb5!jZ=7VP7}; zA)f$Gu>R*Idi_zl?5fch63miUTgrpAP z0wfe7e~;A}vUu$;$cr@ep|q=fieZowC<}$qB2C<=cEz$FK?Y%iUy;fOD|A3o7$ja& zqJLt@XaHQLj_NPzLhDy7)QgNt1sFi*5o{fNpO8>?4UD-H1W^iZ9C#r8f>dZ4B-3qz z$dD7^NWWG1A~dZ{D`>>h)<<@B(v@mlu~Ofm(}c3-s9TVG%~zzEE@=LW1^JPEbzAA& zZ(ccfpiI4QOi}!9oQ=wKc?(x84}+a;_*{4&nVa8{ zg$!*$2Op%#Dr*A>@nKZs{Uj-dWE@yV`PJF0BVdgiksy?_&|&R&gxXknf~2coz4}6P z(cD1Uxda!&3r*Au764w z@micFw2J4quhGn=?7HwmjoMti+EVq91Fc?v!mzg{R{$}q2j^nfV7-Q5j(?d#urfmD zo@x@L@l0g>nHO$^L3j*aswA};TcrK`4O=TF&!1mZtLND1FB`OEV#+CEGO9n#e(@(7 zKWqvE3kDA*d{F*e$G>oI{{h{+Jb&zry8XCBv;`{mldJ(|W8Di?;nr4yp*&8Jy{a{L zATZJm!p5{HnchTDx)LU()NB__qshNNCv-@rlC%tETd8*SR`MeII-q{{ezG)X<}qjE z7c0OZv8C6qr}RvLC3MTrU=HDry#1nKd5z~*2K-Mv0ckbjv1b=Z^cbS@6n{^*lRUm~ zjwr=|3W4G{qopvYKF`B})eb955x^mxBURwu&V%&Qg~^qg#wlYk!{!#-M^T22hH!}7 z*0xr9mB2KMxjAmW;6(bWSulC5(=a(n2P*y=g*luaHeJdfVYMcXkTOVt3*^umOjuf& zM&IzJk`*coSEQ3CQV&JaO@C52;o9;Q66!Z2#ZuB|h0g4{t*X-=tiy1Q%K?&%{zz+K zXOv82VW*vlULuCVKMB`G>J;1%;R$$Fq)xwcX_Gru;h%cvooSt$!kujwggegO5`2Qi z*(ZB^tqK3gTCKk3TMhBCnW~tnKK0G=bduB?6fsP{LOH3FlM@oRN`J^ZXvrfbl_tt0 zeYSP8R9$E_Zp@b&HyWi`{Hx;s%&nu@)*L`{8dR;8YDd*p9RU2d@opZ?RBORA!ETf8 z@JgrnUw$94o;lbWA}ueN_(xIq@JRZQlWugn02^w0~roKrpm=2wihZ|W`mdLvEHK*ShYlp?;s$m1Zz@ZsfK^Low} zyUkhloi7gI8^Z?SB!QtdhT*h*78qDN1MEDor*>}5hM75fFn`$`9VDVdb5tWgE6y;- z&KGMbt5iox0TWQw>YOnmUF6DTEC9 z^m*aFEvG2B=snK9!D_Ndm}q4g^l^$4-XezMNmAic)P+Lu8A*KfZSWD+(CZ(~K?uUDZqrXK`xOc`+uR_LzK<^8~Wlc{y$7=kx*UiNofOG3%GVs*66x~llJdCJpq{7e63!e=gZGe z*6VX~jYhqOuX?UvO5X~mM0rNes&kEnh5W4I@qbw*d8W>))y6_~3|hVMc@0%wJ(Jgn zO}Nz?)rDJQG8>K0tfev=nanyYFx0qNZPXh1nRUiz)>fHy%zfS_m9= z%YS=EdNZ%;4>0UGIU$&uXbF!(Ef!Kqw4~WpFtHOanSPtZ=GpiLU5jjk^3hd(>?WuT z=tLL2)_FXVd=BP^31UD;WccTwf*1Q>lpMj|n0tCHty!%txb`GOnii31fis9 z*3?fX=Dkoxvq@eBALyI1dirrpMS#RQp6fuWiX{|HNECn`@O(v_%M=*=>ZV7 z^n}TN&pu^-#41Oou0X#yt^~e8r8>?8zR`upac9(v?i2M+kXuh*o6(@?_;)ppVueae zqhXqvo|5>H>MBwKp|;kr8}FP+h9Z_4Sna+USgqIe5NUt`qs|5qHDTH1PKV#=yniTO z-enOZ&V}QwZ^l_5|6!$h%sA_+kur4SOjnhpJR4rP*8xmMqHZKw18N|94s<&z;S;EOOZEMpdoX!sKVOpppx>%evC;YJqwsu zIhxP6yA-)p&LhApj zVY8Xu@Z5ISRr}ifO}noR{e4ZH^TJ7d*#Mfa`2z^wb$_43H=_HTbwIFq_KMK-5;IWo>03Y>Rw9`N{J8KUwBNpzgW4IBO(t z_nH)))C|S)V|$QlrC$PsoaM(;Q;)&9G%S`bg+S#k$jWj`2UdjBT_h3HFjrcs$3eX` zKc&r4Miiyrq9`3-cYn?yho1O~c1}FKKjjZ5gI51TAACPMWpR$^TI=SB;=bU7U8A+C zMV>(6)lafof6C&%Q>V$Pmrd&BAoX|XdYr|wAU=hBtZ3F2=kUPhux)bK4sysnKbDP= zL!15?rzcN{f7XUx*_b4>sh@Ld@`MWPw6ZVU=PNB@WuunLnSU%iZgu;loyxSTuc2y# zy4lwOb$}%s0|H+u^-PGZ6*T3la%d}r%%^$^d6uO0IF&zy{V?i*Gt(*UpO@B-yK;D5 zT8W2UkP0uLpcREcQxo)2c()EcXt5xbP<-={r@$yI+t(Oj(TwzcV%LA+h?mi){2tm< zsNo(x@{>pNQh)kbCGYquMCe`htO6S~Fj0T>?3s)Y4||ab2z810hOBH7C`d8^xJAgz zX){bh)ifbT!{`73@8|F3u`!oTOv9XJ==Rw7+b+JNqXYdqVVY+y4bfJC=Atn6a~B)? zpMjo*@lCsp(mfw)Cqgf_srO0)iO#`&RYTcL3A3a55PukOdZ>o=Of`J-S{fiLytjXs zA}eSa#wLqJ{Tvl*j6yUk~VE4Hm|wa ztPT{luGy)*01jFBhx zEyC3kKg3fvt3JsI2Fct_k0xZArCFS2!EK76=|t6JlO7T3dZ*Rg`+%WG_K8r6q%srbfI99NO4 zC4a+^wP^23wlYMNIsLQ32z);Ui%^y*m{%huPaj26~M1_ak*Ve1}M6 z)$uzCK-?$G>}w_G{dUPxm|MP7iWAl#GFx9y6M@(|ZFLdKGza7iuwCOZ7fC=i?{43} zNAEw9h{i-;dFjN{CL08VKB0j}Yb1!V=@hS9U%RH zkTybAc_^EMpu)Sa@pgxXZFgwkS1#QHsuq0lP*y4?TAKFe3+oR?>@3Yx7Zu<`3cz$Y zP1qZwK4+KW7_TzE>fzr>Ygocr8=RVH`LVu|g0bR0F3G+8B=l}bj*>D)XdhG0=6^7q zlf|=i*M1D8UiVFd+CpLHz$kd@CY@e2#peFCq-cRa-uM#P@-N zoeis%IH7FL>1UsQ&YEQmlT!+LH-G)Spr1`TF5%}BgvVleW(EVPqus&c2v;2tQ&Me4 z89(Lf@j;NXd_X_jl+SAO6P6u}h(7n;)xdmtoLzjT7$Ep|Tuu19{q~w=B5@7vmxRd+uk%OdwG6<%m~ zE6Qn~<9LL_M2FSBR;Jac2STEUFM2*r^Yk`#(H{M5qk=*QDMKxll>_CAeahd7`y z*gMUAYKMla;}f@0?0*v5M?FTRK^`sT>}+a!muM!GPKR;-kkEgI#$|5NUbMd*gHn=} zG8U%yzrXxGNI)$vRGAyF-^HSGzJp^TtM}S3=SrME9fXRo<_xxDQ*bT zk`P%6Wme3qg?}s26jfv>DvH;&@otK0RYe@?h+PwrFz21>IU$&sJ^^vh5fwc*#I#(h z@GIVvX2gUV)TetFo~X=X>bv@yGFH1@k&ORY+qLe>5Cq}>o?^}rW^5nUHDN75#Qjd< z5|O<$hTR!vnmvns36c2YArMdGNqkj(or_}yf}QER+#%@2t!L$w`LiZ$q$Jhgb*fQSl-G%k4bQzQBXViZ;uB5Bju$ z3ZONe2Y+zG11Qr|_mcGZWiav-9oXd-jp}+4wK|`eHTe}Lcml1V0on5vQq|V^Dt!Cs ziIws51Vv9^zm~M8tdM%rR_#gK+6Ga*vSZQ~reYaPTC2FD*UZzAo_JDnIJkbO3^@lI z9<^qMl^cNuz)RWMJV+@o0Fq;(sdGWRkJPm4i`pq9zIlob?EM$3!(J z&5zF?dD?jWG>X|3Lxa;XJ;C6ruEA9p+(w(=eq1@mm7kDyTsg)?n;TZ?22Pp-ugQqs zX%oeRKv1y^zQXuKNI!4OS_*Jrx_`43y;;qBHy&2z#thB&k$Hu zsf)<%xpf^wf(^Kb?T6dLD;gXI(53dXS9KZ5c~{ENCmkJ zVy2j@hLT)73b|b5;dCr0DNXz^?&SgMeScw7>}?)EuF^*_8yIA0TgX#yP|&K(%DyL& znU}Sp`)M#(r*#7&M*c^;#$;W)hUF_=Jjg6(8Rt73+Wr-k%xI;+f7y!SP*YFw@jB}Y zT(6et?MjFVyq)sIiSlB>s$zS%FjxEie8hF9R)agR9ayGKT}%8ecy1FyHyfFbw|`Kv ziXG(zXtBk#e}TEK!uxM#Bcf+o^SU^cSOw_r)Jt)XLU(^2Zmmy?v45Nx zfyx@46Qs^=>4EQ18;5L{er&()u79xruxLb595yP!qK`Hu48PdxV7i+H-52)a{aK;r z`*FjQB_7nUe_hT<>J36YioGoF&zDJU-9CU#=^AH zbCJz5TsnXF0v~jKM7PH<*Kq?B>a^oENw1mkWhV2KOewm$Hk#C`n|UT88-Mu0yHcJO zrJTs@4M^_nBzLd?rokHfS5WH>l$)t-Ae!pYJgX|+{;ht=Et(BF`9(kS90R6Yk6jvb zmuLAJj0^akc%Yn-2zTQ5zTKj>{7p<%XN|5_$rbqM{t#{K>tV^L zV||lY>c;lgbZSE=n{>HXjN<$HLx&g4^{;| z+5e?(>UJGf$F7649j{0ZuT@-+w;pyk6=;}rTG3n%G9+r`H<1a_cOJFX(F`!siPmmJ(u&)l}Xf z+Q9tXyW{bwL`9U4113A$r6{$B9)R#{O3hY~ zxgq+p8{J;K$<>8y4A0;W%K-)0o81o|Ovt+U!%8%btmhNTgp7Dz^-mVR#`{&_`&IN_ zIlLrDA3$~!zke5Prgin4riekN5>I3_hSJXQs4KJ2QlIM-&mw5XPAe$&@SY5A*`~FWl)7$QWdP592^co=AUNt zw3B7P1ApsKcpCy+Di|=7{HNA;NqrkbI&=urHhSvY z{T{WmX?j+p<+~WEy0t}e=9Ii^VlOH-ABxIpFn_3|%7QpW2Bsm|Wz~|_s-;))V30Gn z#t1nG+?g{a4#-0~kI`gvQ%vac5M%+Q16%xNGTFo&KME)GUcBV~Cfs1S-kT<-2k^kwNBb^;*UZ{=oN>f=niZUINB6B+N{?zq2a=y$rFS9TDSB)`_Pm7d;@jTNn{tYCUmUOz@5kbxZmFUA(8KdV6BbuRQ^@T`G*?DNnJHrJO_XeuDmCl91YuZ{thVq`HKsHcsK& zO7$1U5f72}Q!ve%cubzbSP~!K(<^)N%9B*LcptAr$^(bw;pQT!+ei9*8pL8tllXsN zlLouQq2Hi}b4qBUGtwI`uzKDcDuABc8S0$R~= zDL4(z@qAU2x0NFX18C_-s9--r^iUt0%EU|YL_8Bu#axtpd}=JV#6s-iLsSURcE_gf zhz})=V_7)KCkmNn zdaI>56fW6e@(weSHsvlTbX-iALZ5^)J9vCLXEvo%ZYy}!cI@B36LzfE&^51)UQ#I7 a-CI|NV{DLTWC$m7<&K{wzb=x^*#ZE!DFRji delta 17112 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 z - IoT Manager 4.4.5 + IoT Manager 4.4.6 - + - + diff --git a/src/DeviceList.cpp b/src/DeviceList.cpp index 250af529..32620625 100644 --- a/src/DeviceList.cpp +++ b/src/DeviceList.cpp @@ -37,10 +37,10 @@ void addThisDeviceToList() { AsyncUDP asyncUdp; void udpListningInit() { - // если был включен автоматический поиск устройств - if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { - if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210)) { - asyncUdp.onPacket([](AsyncUDPPacket packet) { + if (asyncUdp.listenMulticast(IPAddress(239, 255, 255, 255), 4210)) { + asyncUdp.onPacket([](AsyncUDPPacket packet) { + // если был включен автоматический поиск устройств то начнем запись в оперативную память + if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { // Serial.print("UDP Packet Type: "); // Serial.println(packet.isBroadcast() ? "Broadcast" : packet.isMulticast() ? "Multicast" : "Unicast"); // Serial.print("From: "); @@ -55,8 +55,8 @@ void udpListningInit() { // Serial.print(packet.length()); // Serial.print(", Data: "); // Serial.write(packet.data(), packet.length()); - // String data = {packet.data(), packet.length()}; // для ESP32 подходит как замена uint8tToString, но 8266 не переваривает + String data = uint8tToString(packet.data(), packet.length()); String remoteWorkgroup = ""; data.replace("[", ""); @@ -67,21 +67,25 @@ void udpListningInit() { if (remoteWorkgroup == loacalWorkgroup) { SerialPrint("i", F("UDP"), "IP: " + packet.remoteIP().toString() + ":" + String(packet.remotePort())); jsonMergeArrays(devListHeapJson, data); + // эксперементальный вариант отправки нового списка сразу по приходу + // sendStringToWs("devlis", devListHeapJson, -1); } } else { SerialPrint("E", F("UDP"), F("Udp packet invalid")); } + // reply to the client // String ip = WiFi.localIP().toString(); // asyncUdp.broadcastTo(ip.c_str(), packet.remotePort()); // packet.printf(ip.c_str(), packet.length()); - }); - } - SerialPrint("i", F("UDP"), F("Udp listning inited")); - } else { - devListHeapJson = ""; + } else { + devListHeapJson = ""; + } + }); } + + SerialPrint("i", F("UDP"), F("Udp listning inited")); } void udpBroadcastInit() { diff --git a/src/WsServer.cpp b/src/WsServer.cpp index aa7cd24f..822dc881 100644 --- a/src/WsServer.cpp +++ b/src/WsServer.cpp @@ -428,10 +428,11 @@ void sendStringToWs(const String& header, String& payload, int client_id) { void sendDeviceList(uint8_t num) { if (jsonReadInt(settingsFlashJson, F("udps")) != 0) { // если включен автопоиск то отдаем список из оперативной памяти - SerialPrint("E", "FS", devListHeapJson); + SerialPrint("i", "FS", "heap list"); sendStringToWs("devlis", devListHeapJson, num); } else { // если выключен автопоиск то отдаем список из флешь памяти sendFileToWsByFrames("/devlist.json", "devlis", "", num, WEB_SOCKETS_FRAME_SIZE); + SerialPrint("i", "FS", "flash list"); } }