From 86112127f843b455aa7d7d81dad0491b5f793e23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Thu, 16 Apr 2026 12:43:43 +0200 Subject: [PATCH 1/5] Create Changelog for milesight-iot-em400-udl --- milesight-iot-em400-udl/CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 milesight-iot-em400-udl/CHANGELOG.md diff --git a/milesight-iot-em400-udl/CHANGELOG.md b/milesight-iot-em400-udl/CHANGELOG.md new file mode 100644 index 000000000..57140b7b5 --- /dev/null +++ b/milesight-iot-em400-udl/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## 1.0.0 - 2026-04-16 + +- First version of plugin \ No newline at end of file From f8d10607764933f81e3c83da21c6f91d00f7c848 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Thu, 16 Apr 2026 12:43:44 +0200 Subject: [PATCH 2/5] Create LICENSE for milesight-iot-em400-udl --- milesight-iot-em400-udl/LICENSE.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 milesight-iot-em400-udl/LICENSE.md diff --git a/milesight-iot-em400-udl/LICENSE.md b/milesight-iot-em400-udl/LICENSE.md new file mode 100644 index 000000000..bffeef341 --- /dev/null +++ b/milesight-iot-em400-udl/LICENSE.md @@ -0,0 +1,7 @@ +Copyright 2026 Thinger.io + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file From e6e59218e480dd9416adcd9f526b72e17a3da7ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Thu, 16 Apr 2026 12:44:07 +0200 Subject: [PATCH 3/5] Upload image milesight-iot-em400-udl --- milesight-iot-em400-udl/assets/em400-udl.png | Bin 0 -> 56455 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 milesight-iot-em400-udl/assets/em400-udl.png diff --git a/milesight-iot-em400-udl/assets/em400-udl.png b/milesight-iot-em400-udl/assets/em400-udl.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0b486fc0516e3a791ec9edfe5ba1deb05aa5f1 GIT binary patch literal 56455 zcmeFYbyQs4mM>bkdxAr72q8cL!5xBIaDr1+xEF=H1%g9xO-OKecX!ty2^QR4@+#kV z`t<47ecu~B?z`jt(~JS^syX*uYyI|I)7ISKYAUignBn7MF_~bPl%Ujr58Om@mWtL^j~+>t3~0hRfHOK{yt{N(Higa#C-XZSnV{L zhy7i4BVNYni#Of;WD%7yjYM*)Udz;ncEI73b|)cW!*lAeCJYhG=8_GzGDlBw=o=Mg zrc_ZolwG8wr}yBQS}QvM02g8fUzx75k|4;zj@=aOUe4d*5CQ)rLTBmX;wZ?$;pXPX?#9jT;B3JG6c7;L;N;@q;(86|cn$TicQJK; zZ4agYBjRrv(hw-f*~-zy%E6xIk4#fD2bhZp9UYub^KbLBbNr`pd+0wffTO|TZtBPZ zWas4gS7tEipS+GRXWPG~0S0kEY$0|Kdlx92ANU{m9W5PP9H5pC|BE61N&Zg*!7)@; z{^wZ#<-F|d{=-mEm$$C)rTqh@|MCu~CR}Yf)FDs@m@^3S))hWw`hQ)WiH3U@Jl=@kh^S)cy?{8ZIt&ZWIxbEw?$?}LuerE2fdYa+E!i}x=+Fi6nc!P(9fj;NKLsRe|?(ca=O!apCG zpp=8HgR`;&7(O@d{~JkON=of-OCdrBRhN~dk$)@23l!kxea*!V{I_{1D+|ioLtRYm zK@fRq5jyya*{!U=f;^_?TwLa+Jg<3yro69tAv~O~&43{I6)yw?G=o4)!C|Zp!{|DN?leFxu z;E;3uwZOk_({M0%aWi#>gZ!7iXn;%|A%9W-=-A)SKm%^3;Pk)8`s-^oD|d*kuCx^# z80g<~;r?6Xzf<-8g$fkl`^#j|2>-S11m&!ta9#EIV@3X9M>HT#e}DShtk_!pMWUhk zYtspug8p7H=#P>^z<*5-e&^prtN)#6{7)%vmJm3kfA4|+psoM12mZ+n{Rd_e7I4M* zf8A~z|5zu-9|QSs3l--0Pf!T|#qci{6@K5}-@z?4-0*Y!)AIiVD)@ZInJB4E=>xd8w)0C{N%P4|q0R{cnbyem~5-I&1j_NY#4RdI1q zbMabC;cgb1*8tgslq8SD6oXthC1D`VbS#Y=zS46r7gI3CO*-v^bbG<_pszv$K~&Lqq+o*BL}VVxV);&*S)toAaBX40O3_ z1L=InBFrkn+9j=5(NrCJ0K~@2LP8ZegZ3O6Z-U8d}fq+CE%AEw~|o z%RTTOGv{$>J31F(?k{!>wfTI@DEdURhy%c z@VAyWE^h?x*}l|1U&EqZ5TP{C)*(Ljv97Lct+j8_i6lTkpk7_IFfM6gFQ<|OP~zXk zu1W#AP6YRlE028EmSH;4SXSv1Xg5Phz?JHK!TYQgJdn`+3|b3b_L~cYlZqxQ)6C+g zDqc*}o0bpt^ABZDqoPm@g0r3Li6|4_*fB$@jA7xnf=o*C+ee$7{dE)_ks4)}B_@ z9#>iugMK#aK9wSllzVTz8gIM#8S#57K~?k?n#^vvbd~4^ln%z9fMxnb6A=-h67yPZ z089ub#j$%03p;L35DE?P9>(ulycr>OCyRVA9f z&VCH=8jLFpWF%`SZF@?(-*=Cb?AX6I>RR8V&rLO);G_lSe7SID2=)L%${}^NidaE)j(}i{k*+e z_3~+{O-l<0l(LrKI^k|&MH1(#~vf}>wuffq8gETkl7%a{R_L8#J>#8ingu+ z2(rgh{*nF6P}G^;b@t_;V;$HV;bBa*+VOpunsB~

Iq=k8hbL`_(eWetli|bvQ=Z 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χ60h}h!c^N=ZDwz5#$aWIXOo3Gw}A^lg(Ng zVt>3=8RA%i!Wy2?Cbh7;e{Jm>cvW%iYp~XOV{2>FqHU;<+Yxp&>n>7y3~kpNBv7_W zUiTzNeD)Nt`prWLl}v?hL)@=E@GZ9be5QRW%79aN%Ik@ILluz{xo$pE>uwpQpv|uc zsGOQqA9Fe}N|(P4cs8Vwg++Z92eVyl!;g6bN}0k*9eDy0vN#LPQDRk^YgW+g9W~=t zu6}XjgswVZ&XGSDrESi*Vz}CJRLP?#>dW=nyyIYNt?`rws`??v)+Qfj>`mbk5~HwA z7t44Ao_@P?tH$+b%S_%&+cqF`lZ<;j_i`1{!>9WRB(~nBlquEj$i8!$cUx5XMhY@t z^1HiK-Pp~~s@p$2I$9zi^>%19`1y;4>g4jBcznb*8p2L)%2w`z`O6@9S47IL&*{&% zwhj(2kSO09!`m_${=}sB&DYAjyG`%T%MvJSblKz2wTV3wJ1%^Nw22wkW?sfQYEUqp zkQ3YDoesoo4)EPh4*XTaP9ENRzjpb{%wqeS=fF}O)yS~|Vrm?sRZue2-vAyD%2m36 zp8-?x3=m%HCNp`5om_StDLFhlZm!Y_1W?h7r@7}LD9G5K&wN?1I6RXmXX2n_!{Xl` z%zTHc4$9%F6$`8lOiq=jMIa!{PdiB(kQCRZ;w#~JW5J!=n9a|GBTquUj7SzwG}6^c zgGGIBZ>wq_Rhr>`$>{9=h#i?$Ncpk<%ldfRbnrN8AEps~^LO}0+7Z1Lu(h|R>yyZD z@w&Dr?wYPEMPS@_j=z0m;q{pEVh-3q3)qoos<$5TS=)fu@&BA4xw^VmG&ZJ|2qgn- zpim-sXzF&nT5B0W`qQ5np_`ybPS(cKAdgEKX0|k^+@~?LjfLaF*H7R7{tW>3yf>aq zOpLIs7KHbRkpw>jzxDR*gr_RI{1j1Cxp|Jig6w+cz2g!UJ@xaVoJ<-`>j9k~awKSw z{dJ=RHPS~6S2mQk`@Dp94oV279T>uc&q3a1mZQiBu@_QYMJd9)dDYIBF4UDD^%x|= z274yuzX@RA1oyj6#8T}A^1hTD3X4KtZXyLKEh`x+tZW03*XR)^-%dvcZ2DJm#S@Q? z4*JqLrZIMw%;-toN+o1y`CK$M2y{JqOTmJj0huh)W|&|2~rvI*vsI4otmAk^nnEcqf`H~ zFBNlZ=8FLD%6QI+hlf`_MUlUR%&Eev!jpVP+J`@_f|RYo#Zy5ELW_bqt0#oDyAdy|^ea#-j@T zC@xQKHPjWqA48jPBQJ+Y7A?X`Y87IOW51v*jX#E)g+*A%iD+lll<>~6l4iYlwLm?B z-3Z*f!BGb|eIg$)zKY=z5p5rOVYmi~RDX>=cX+##-5V>mh|#GvF;; zE_4Z+d4)c;n9nZBd5>P0emQ@mh!GldXGntmq?y-NU;hE_`3?>a)_?X!@QPW63hkWq zj1m2b;Nkm}KN#@2`jciz7;1=1&W)6ag+G+W87R&q1XbdpHRtT*d%0cNWgBPQd0ut7C?f`|+sojs*tqodCQq zjwY1UR*bV=&e{_HCm^Gijx8`B6Q*-N+8`_}8#KV2DRMy($Q!HCDx=5hFl@C+R7_z{rii>(Z; z-EG568v@_Heu#mx|ocXx7IuFNg&uoa^D?1!hz z?x1eA&o6}%lsc5A`I+R__vpyF12)N+p&(2ARGqx(sDzM&xS2Jc=E<7<=2gNg^$%c? z86{3sjb8~x&9iO1c>K%=nXg+=VT#*GhINVnkh@~0%R6GE4Bs$@2?iR$msRe4r`cQk zpImH;JeB$eNksYW(v+HP$a-jLz^}_e>(uVU5K09@({lvKffi&M3 zMV3+zO>rp&t?s==VLoUiRDp{9(>%)D2cy@xQ4Up4wrQyK4r?-zr!c^Ce~nW>Cb^04 z@wM-<4aGhM$@SG$MO#~zN1$D@oS0{|AtFf?CC~+9?3O{1*p?hb z=|4IT`h|T40MVot*Oqgu!nE+Vt7Zu%UGF(h3#m`wO`u!IGo58@s@+^EKR?2>@!<}e zl-tqNa445r(|g?Id#t#8K*%A#H$p15D+D(`ON#1o^7$JIo1Ad zYdzIFrfTuPELqj!v`yme9$TS}<3vSM6-Hey)VPrQ4l&kZwg9eRlW<<1l+4pKc;vav z)c8?vkAKoGPS{%VI>v(56ES|vhH9BLs+aWiYT01}Zr$KTi~uNZ!eEc&Av|(*Wj{1= zbK~3HC*8>>0#ND|h<+H|0oFC7@@$XP-stakm+e%m)5KJRwLEBnMf70@Fw~w0C+}sQ|Rh<)8 zz@O{ufZ;9YZ)h#xxZZ90k5U%v*fQqGr#B6R{NvC2pHUoOnT?DXmLrwb1`=8-9j zUYvVAv{mUs9O~^?y38s&YHjAR3j$2Nx%1B9*(Ot|BRlukux7Ul-^lK-C3Ec4FN;{a zC+SMkmw2&%J=CEmmUXXqxm7k+?jEhQUUvhYyb-o-dGD=4pR*B1u%Rcu@_P{)(3go( zCo3Rxo>diu{?!~4fQqPuD^9fHqGK4GC-WpE1}Z|g)_mi-d9zJz|go-!7|D2HtoaT$5MW5#zlD>8$QoB5#$w#kyhOwasD)r ziQ^{GA|nmQ46!CE$4gLCQ@=MePQ-oYzmQ*Sgw&X7m^O>N{im7u_&B$SRViO%#GJdN zw3N&}X(VBO>TMPB0VzE^D~KuEKN;a3&naR}*RWeQgJ%p6A?FLN?KVES5kJC={ zv)QQ?zbdv6h0Pn<9iRRfO$%umRRVG3tLtkg7k3_8l$Gx{F@Oi849P;#8~PaIw%_;d zzZYw3YmLkImxOjI+S_Axmw0d*;`HJnu09_Ym)If*T*ma|BCNp~;%RmRN-AF&02d8Y zJs?UZ|ARYZK`si2`wYyIj&)(d1nV}Mn&PXoF7fDASeQIFLTow(xZS&brbg3COC$mq zZk-49k5e}PtR&9Fjep>-T!$l3?yX(5fj`AgBZ$yY8jVH27+?1p#}Z1u zw9{*cH=to_M?e=m%+NqP7P5*xq^D=Y92<9+`v8A94Q$c~KR;JVWCK(le9$uIlW=x( zBY|77zE-d6k&<~=j#L)Ey)VOetfc#o2&5;3q*Ca_N~#*|Em`jgyj9_KT#we$($~de zJBaQF{d@gDe~s_67?zZ}Gy4w;VzS{?bFG5ZC!wu-Qe zjstG;;oAf61S46)GzH$+?B@dlK0) z%h>=KFAp=BJ8nmfta(J`0?+1-A;&U=_#^mmXL>R})t5go)gwo0KsOgCh%j8HxVw1M z%=D;sWilRILz1%UuIwI=Ld=KMo{~a;KX%98!$#K`pF^`di}}FTlB_&bnO$zs7zpok zq3-BVadmS;z)raT(f#37J#Q9r{DZuVK=ybgJdRmeF{GrTLXh*%>*%+E>#41sovDot z791`3`dl?#tmvkn^$3p7$j>TVl6OoF#>U0%XU%FCB875ntKM!D`l zets_;+8=qde6I9BX)WXMbXXD_j#jtXz`{sucG_TN@v^nYi}!korO!nU!5CC;vA1)Wx*2cjJvZ+76{RKT7P`GE&^W=M@y68J5V9?@D zAS5Kz;Id0NH#fEYDgJWz9(e_xCc|?;i)@h5Fg!m_A(GK!4oILG!xWB&JO`z>EK%kV>w@)L>7N9B=yCDET!MIQHK;S_}y<~}$x^K35M zPF~f6BUv{gXqXiBxIAcvsX2x9`=Po{ysfmE@+@1et*V?|!K()A0ODZLF@a?n@&ssP zo{*kM=lcZoa{*=Yu)T5B|y@yqebl-N9Y;`|YC`)pvIag%`5i zj~aIzH~MgdFK0Ad`|$4l5<_+O!r2%Lc$I?=5AFUK`S~(Kctc&Mw`lz)4LE2_0Mxk` z4Az5XgRp2#ZiVaX>k$}i5J-vT1f4;VOfTUvu2&ckm&wD)1+DtsqAodKT+79jB0TV@ z1dakbJsNe{PUhxUxs($xGnJSr(C*Pbz-`)7`zc0}>N8Hi6Ewe*)X~w=-=?9k;Z#Zu4GCKMw?Ac?J|3wA8&%+YGfc3(l?+C*T@gH zjc&FPxACN66D{9*(=>fQw=K?ZQI)YUufjH1X(W`Q*6w-x1(^?UYvjrBW2KSS;d1~> zw%#U6TX~bEK%*s7+{*iH+O*}W?ob*fVr9ETKW=f-0L@f-KUUqntf$AvM_Ph1sQcMa zLf&UOMEGkQ`Hs6&jPM> z{K*$M+8?;avc~Z{ft-amtKteR{EF5ur7(RzJJ9~TIP63P4ScAkr!JwPlq!Kxi z*Bc!=X4@B@fBbZ}x&>NnHHj;ovJHwc%^@@M2G@8w#kD4sqw$v;IFle8NLCSvi**@T zeg678)3e>}U(Zf=zrIDRO?{M8O1Y-#cuyLw$`!Pdf2L=oIIHAgXRT(dKk6Vq!I-{( zFX~Yr7e65QY%m!#rBtfgx9>>6-5B7r>6|aM>qwVU915%UBhjfXs(z$eZrywES9nxJZ-QC??5)#rZ&HM15c|S6W02aR236_fawta!oq^X?(qB9ux@8Jp|ts@>1JeiTH_i8?i}E>kdeLeQ-L&>id$?! zEW{Q%-kHv4_n|*Datzbj#x|9wr!V1+X#`-~_H@0#k*dV$heYrNB?QF_`)pp@F4Zp2 z8D43j(CRYpE)h8Yr+&|0BJar(lrh--Hc@;xLmKMqpS4fh_IqhBsq?H3kpWJ=kxjEH z?%COW17*S;i?Bse0c)vw_J8zo1}k=T-YD zkP{oGA6kEcOJR4w!L4`siVNo7KkI(OwmFmid=(~s_lZ)|cdy5PL3U3lAl@Ot+coX4 z@o;mBU%~?gIeA*E!5tX#lg*WI4+fMSIFR4$H1nV0Rh`NKN-LRqm0sOL>2Y@ur~X5- zeveVppmGAspSnT|Ti~R=07yEFB-*<3wA%XviqWeKxwfh4?mYSJ(f@M+NM`>2hL3}# zrICpA%+xU+dY-we7JZeHpxh2noW-x>kRXIMJ{aQ@0Y-27O_oun@1kKl8~%81GDVUU zUvqx%Rm^tDu~oM1<91FVj$VmnM}g>4Kms_>NZM}*&nT8!ZFm!brUV`pUd9HgZ(x&j9CI>;gCjV5^!@@qQh%flt34)@dU5y}0)6kP z3|!d1HIijMENzf{&g@2=ZizbiD`y_IvHwk&gxY5V0+bgUFrST({VXpar}YV6!}s39 zF0N6Y6vOr6VN6S9F!F^e{Q*FNiv$!T=_J7D0Sw*(=3ZW2Ua#BqF=jWn#uCnA1^=}D zp;81p6AA_!S~*$WW|-zr3uEu>GlYZNyO)=Vv;4O1BE0P%;R9E1D(rmT038cw2#v#c zgQ2`8K3?8Zr~UCKWdEVzV6V}OF!oWtb@v@HAmZFcx51*04^q%X_PVt7^#_1{CAw&e zfQ@7u)SLk-O(bf$j7#Zhvi@*hB*=(?I+%N49pi5^^W56|8U505>mjr|cvxJQW92Rj z%Xy_kv|bfllt;^?ulY}|){OFp6}!~*GMIB{@w$}hBm<69Iu_olp0d+~GN*~&W@>8# z)tVZi$k+0oY#NKAR*~clIF4QerPd2cFPIfBSAyE;v@1)%2bh6IToR1$%&F_~sAi;w zU}0l(L1Uldt|5lO6u@c&kW8cBOZzoJz~kSd?0yovRzrV>xS@)jxB}x)ikp|bVOi6A zAi2E;m|OIA>6>!FKY1yIdfDkHyu7@}B58Z8$iqmc5TBk5Ng|vmo0r!D9l*LYN#KXN zEm!b6E`>Vc^D7*-_CHkQLyQ-cXI?J@pzjg&J}WRlZZQ9-CA!OvP2E|BVF_qFd-%q^SBN zjoolxvM%s#QUM_m5=S@lRip*^LEccjL3xH7%9D?o_6)#RsPC6Qznwl^v`}pAzZovpvxeXcE ztxZi~u1ke#X4LjLEKBDYsnt6s7J`vW0|8rJ;eFkXqV>8~%=-OIq%8FMyUbiLmk~YP zg<|hSq&3HPD_nPYGg3Ejf2<`Yxc7Yk&CFOr3mr%!qUdiJJk9J`N_kNDk6Me$XD#V; zek}YDx!{Q#-be@1&;e4F?gUWEXy<}4;c(%5^STX%(#`Lb5rIl@mT753KO@q}zkM%O zs-(|y@1~;mnc#E!PeGPA?oXDt`YP zX%^?d&TF&EbaEXnLn`Fe4nK-lg96KS`)%YQtffM!C2qyQ%*@P_$jHc!kmx4wa{oIC zu`3BN;qk3LW@cx zU80AXAyBWJ;D(xfnlWjY4}Io7EMCp~w^`ej#~DC7ANjYH(l^-U*JYT+nm-jFTj$;j zG+&XjnY_(Uy&zv*9x!kQ^~Xgb$rZYa=2ZpvecGWrS?(6Rvo4J<^{`p4m8T;ffEOz| zOn1x8Z?Lzt;WCOV-1Q5 zqx1WQi?(;9V%C~S`QFdq&XP^tbt^M76uZ{*V3A88=9QLqPff+16crs;qw~KPZn{Jj z=Pev*lm{*GJg^^hB(v#@wufr&!~5Na_@&75B*4qH zid=7N|GQ~16|T`#vJZA%{x{^9mM}+-l857GLN-{^7q>IL<%opG{2s}0P{#PPY~nt@J^7m%HQ*L-K(tJX zv4ofmn{yiGrGoBmpjooCijA2ZmZrUz&0cHAo#B=Ejt6=(l8Xe|TnyUuGIkRt4%`z` zzo|U6PDX}&1#2r|$3~G8`MT6oG6otveN%j7!PHY=F}AbA4)22(yMc%W1I;}|4#X1L z;(S#OFE8kkvaT>Q)CL5`q}_u+@p8nHce6@HDfBgi7cO^qwFx%rzDd`6K0qOQ{+fiLOV)$JG!y!F=s+#*SbzRWJj2JIE( zb*0&9PkXRjss-e%%4+SNFF*~};a0BF9(Yj$WatfVCm+tt$CJ|1j2hlf25t+%Iw3`9 zzbu6Li^!i@5=iNnxkQcuh^D^|deB@Hv1kmjen8U3TrkfU=HI+nAJU#mWxFHAMNLJk zN|}Ugzfaf+dG~{7J(5jWzxoFTk`)+I;;F)8#`8$cYo-}4BO}LgWLosv6weAnUG0ZH ztGf<`+TPXn(=y3 zPb+jl{9*l&CAR)+UM4S8xhUwe2VMG<=S4YfXmhX_IdfVd`N#VhDh>fwdclT3hX(X( zRZKdw9Y;=vK$9Z%_WyJ-S?T}|x<`be z?_}=M;OgmTBi7Tuf6A&Ii~pyp1y8#F+Up;mUfCzJs1AgS;;vi(IR6b_@TG3MH<1;T z2g?5+;eQA7W=C{=4y0%Mz)0XVBC6?UFNaR_bEw}@T}T~iXwl3J&AuW^iPF4(LRg|P zQ|#LB_QnA#mSp*gNjk2N#wUwY9>3OELG?y}RY;JiK{IcV@MP>4br(V62KKis`_vct zRW>W8zr^rIGzxZHhWux#D<=#Fj^y}pQey>!i$ypQ2dVT=Y86&KeEsTFaEUAvus0rQ zu@5U+GEbS^Kg&73qo z(FAg!6e{UyVXd;t4d7?%j&Ys5sO$Ok^~e1qSePNFKuWS%S&oG^@1Fl4&>Mt@){!}9 z9Nm5s*8+=%5+%K;KRxB=-rq7c6(TAk%>z+X7%&ntO;e`B%^G%Rc_OP)Y0sM2=NA_K z?I6S6e(@)9l+^BjV&T21fA_5EP@sQ;l9q>7|M;rOL~U_AN}t?M=2yB3t!X+(0HmbD z<6)67su2jno-ya0qwWH(mw0|+Cn=#!S$JBd&qAIpGBhJTgn4yq>sO6n;TnAp7nHR2 zkUGs@f&OibMkVJ|s5!l4ss4v64{|XcFM*oIchiVpKC0031;Hqi9gh8B~ahzzzC_y zCMH0p^dKo)Rxk|~v=I4d3Z+OP?qNbbyYZ$XTN4i<06{W@8x^X)nYs&%NymjwAIO2#b`?1sXtiCbYjlHU z-7zb~IWm6j<_4b=0lroa6NnTEsM2Sy@k4*S)Lkc~8GuVY-lUF3ye!}nPhsDSmRxb0 zR`J;vr*p@{h4%aJ<9t6cH-MC(l@rawrJ$9VB7BP5 zpN;Y0b%AUPWJ|zB>?sb#9i;Nbdq$|zko@sMQ%FD>P|Ua%&pv&O?cLP+>ktftLk_%cm*;g@bb5n&0UD*nGubP{mLX3;=- zXmL^3uNws+qC(VZw5M8G(TQ-g3cR@f+2nw+C>Qfl)9@~Wcs>s{W0mBm-{-Hs<~7Il z3e)e8XUZ!r#hO^^(8=GWIT`r*y)0gGNm8GS6Pc{kYt$ozpDbem*HmZDqd41{# z?s0!3kB7d`?pCu1na(${yopVVPU?irazeYx=}}TF+3@-`tI99kZIa*N6#vZ?uVl%hwL)T`Gx7vJRs9CR)Q3uVlnoQeHLi!{5dOV50RB+Nfi*^D`%4CejIP zKvrp;v@f0j{KnS&-+Rh$-wS+|Mwq^N#0^;+eiI#oGfAgFTo$aqb(-@TKFz**cr_8Q zk^1OVqd_`inh*P^Nmn&e(+W@ze%!$^T3}W%lRtFzrRNOxHDgFKuSj3ptS9f7^@f)X z2p&==MF$#Y9X+f^sa3y;HYiU0;SZ{}7zK0*G&VJ%fsj*vlMjdK!qY9$y1|vWzM8JZ_um5(aWsQt zuSCLc78S!ZBR`T)t;CK_>1!r0+Q8W@_FLaiQa&_te3nmLDSZd|jTAodH-jrapSLIlelLSV*N@ATf{dAC=}WS~Q)+`OFXLUY&%lwoTIa*}Ro&OVyiGe# zZI+BuipL3A6C`%*$u=eije6wJ5n~TdpL`>lacJ_ek!3Ef8ycsE1p7>*%&is(3{O(6 zLv2>@{7)pI2-aVx|MtYBMmT&Bkoiwc!4+c8dZJc4UNuemAulnU)~OFOn>Gd7o{G$k zQnz0~X^@#VSZ)1kq`ec~Ddqi}KQ#f~sPmUS!+Z;p>GE+V5!Xsy9_eh@%4TXr*# zsxtbI7OM7iad5x@bso+qrbyIf3Rh#V<;AhNpi%rHe@7H9s|y!bcGy^2xw}8IZ$G}Z zTxT`Ur?6DWQNjD?TkE_zlF3vOzode-LG@l^kGW{J+1E_g-@N#(k5P}$8MxrgxV;n$ z{kwtj*tG%{}Y*zTBseSB%<%n$(K6|4?&Ob4!^ZsV*Y?stm-?PeY@N zD#y;4v>$|KK-RulehuPFqJ%Ni3C3#vhm{Fbcr>Gb-^Fpmb;4hw@fw>Ve-ouRHjNq( zh6-sWlT~beMoFCfP%HnPmA;BjW;_mi#@p^N!XYkTCfA<7QcRnakqjwR^F`yKqHAO0_h8};c{y#z5V4Qf&bq>RLIUYW{4xCNk)dThz_KGx0U7397Z77^1eW{TW$5= zTInvr4R0piJ`gD4eT#6v+sI|M8a)Pw1L0N-$CY;bSsma~25GU5tgsierhCI)?du%l zOtm|UIBm?^HrMqV4_;Y!4lO?>gU2U1E^P969<95%jGVxzbG{#+Rm@`vv~BJi1l#cQ zn|wDAaRhvuUnKRcUnPEqRRqPDopR8xG)_;$_3~Dg3BK9ASVy4h(+no`2XT2Zn3yMd zR{p~m#?D7LUd37OtETqB-$TnOsVuAyXgwx0Qt@XG-bIoAu7$_ZAMvZ)C}}p!wte7_GK8 z*i3{g)GvF?G>q`G@kGJK+>w^Eq5{$Ub(T-^bSq<70fj##BfN7bX#jb&xzYhxI4(Q2 z{Yf;GKYART#m$xHy|~I6EM%8!4xLlhhz1;SycYd_KFJEI`x#^?T3G*i+K#Cn>mbvG z4k0L!u{S$FJC51*f394U8Bs)61QY+u!3ytlG~DY37)EDrI?mqk%ANvpmW~(fXVHE( z%ms--*B8Q0s?;4%HaZGZFE^iLMRa(N{%Ku~SjaROqENC5Xh3~9`)yd0M|7CZWXlRm z%DQ@M$Uya#mIzxo$W1-qyd^LX5y;Y~jxD{JgLiO(Yux#LnOe@@hxP7ZYeSULB`CVR zoU5jw!Icxb@cpBfUpwn5cwL=L;@+pNFe>2UUaJU9sU;e(7xET0qiAIJA|=Y>UC*D~ z`~kN~PStNE*Ll|{7}G!ZTqH?(sTaBU2?GpCN&*vyJU{fiE40l+5(bbJ*37Xna=J#T zt?`_`FxdC!|6OZxLIGya(1g1P6ldGP6x*fQviy;fyAc~z!LG%U(f)rK^5r&&wwxa? zF}xfc`8BT{R#%2TzgMv6ub@^rg#*mwy4aqk*_QlUeI9t9r^N21-B0(t zmV8>3)5>a4X>4Mx$Bf9Nqj^^{#kq9TbFBtG(?GmZAhh}J>LFWA!qY@TOn%iO9v6ik z9JJaA!*JH&#|g^Gu6_>Z=5&!rYe$O)jb9IDQf13WmaWGQd(Eam2l3BkJ@i4&N;miS zp6DrTau(f{@PbdI@}?YADAn=))hq=>y0x{nzO>axbt4mhkH8aLnMyVF^``VRF=Kv& zH|Q8Esw2E6?5%a-fs(_$DfcNtQT+e*F9qiL=D9*}I0+(kn_I}{} zh2{OSaCKS+cMylGW5(=MB(CD9POz*1|FO<;7jsps5$^es{)=b7ZHw)sVrpyNk&y7^ z71wQ_{-b1u5Z`BhAVT1F++q9SHf(fcX2Wo)EydC%MC%d*rf;ni%Q!pthV|ya=zAyA zpaOi$cvB2>HWMV1JAC!SnZGf_wI&#u_ecEZfGi_Cwb~fIBNB~29L5czAoH9jm%$Yd z+A>F~Gtwx+Mo5a#1HB79(|F?(y-Tw>HE{&3xX<_=T)Pb3Y&guK{latr#5|{bmNJmb z9Q5FHWn~2*Iz+_=a1xD{dR13PUi(C5t7(R1Pc`-IYqQ`dZP&a(Q{|SG17ms^*{G*v zkQh^0)3eA?6bSPgOqUn*zlCtqN%w1D(NuoO*i^W027rUuFHSs-j}+aIWk&Ec+JivfTH?O20?!nf}F{ z&^fOAWB(^--@D!9^GmUp%cRLI?TveU-%CC}Tma4i7(ddwbNB>}ZEZGs5|&AVF^P51 zF^`OoB7deNo!HNhlL7++@uoS_cHYKmGSK)q05faF8KCgqKyJt)P-~(JoVDg9xv?E^ z=4MxQO8re0ueu8&d35=)DD6~=*+cWUZ{BU^1Fr=gQ48YNBrl{muvk;eXL_6+0hb74 zh-=?NG<;e-q2bWCyR4`Y@M$uo&i6GYkS|`mP9KB%oCDCIzH$m+6a|J!VrZVrQ8eFZ z*nfM^$`vH!e*@;;<$|6)9=bCCI+=j~X5`*k9?_(WoBd zE026#nslDm2zO3BPXp;x`Td@S0Vu^xDZ;uA4<)E3DE93+B?l%Redw%Wgc%bU}O3A-tuvG5nNnuD{Sma_ZQJMO_{M}QZ)r1w8)HZ(=$8O0wE;A|53ZV_Ox zbli>EZI|gkl`39jKc!~(u|03IrS+b zlI(lN$Kk3+Ib|c`aKT#k#;@vba&wWTl;jg1cz3T^Aj4xs^ zmBk3w5A+<6w)qf~n)`KGmwU=!)J{?>ajjLn#Sz!3hh)%h1{YedfSK8>nG>GO!2UN0 z^3dz0=3Nm~s+^N$9LVEZpV7J7O8wJZ`{|1;>K0aqohbTV5GJGXKOlv3DR92O^nFv^ zM+k8~&u#~7SzneGI-aj}@6sM>C?0BFsx8u9MEl)iIg$Z^h_tkH(jmEjs)6gQWX)x- zm)*d>i*z6#S%X#-`{gAK*X?S&)3=7&px~o*^d^gb}AayyI+Cp z9{mUbA^K?fz<_!p|?&NHh2ZPM;-IuCz6}faqbPve^D{rZyV^iSAStzfrA6FMoDAL z?uQV4`F}2eq7gGhumb48uz)GJty~~V$U&|RA*xU38@5(|fQ&K0i)8Np9t1g?9~Z5$ z%VeNJZcOo~Z2lyAFlF{s9N%DU9PM~};Fm~vyAHHX=k@5tqNBnLOWH%5-#BW(o0r8_ zS!zYKB4VhE>T3}2*3^7!d+__eP6vMNMd9Qd&_)^Av^=y<9_XS`Q}qvrM$l$P%R>E$ z{zJt}b_*ZoG_%kMVz$#M%%{ojYiYjYP~0#HPJa-lD~S$H!iWicG=a4OiUhj?Ze&rQ zpR;>2#8;scQOqC|>m?O6#emSDnkvn_Weqv7MscUxB>4o@T18E>P8O^s*YY*BM5p6q z-D__^WWp=U>2f4t_$w`$4<1qKeUjIN$cR&x+sj3=7`D(wfHZ~Am7h(+%FDv-?d=Oj zC(nSwNZzVq3q4xU9D|XHSY72dH2Wod;svm*f$Q|U8_|Cr$z>2t+xIx*tWt(vM_vbE zp52qLN3awYIm_fasVQ&2wfYGK5i9fd^Ih_(e$tGzmr|Y79T>P(=Uhjj@WvSzXx$+@ z?KBg6&}9DWc`!-!cs%i3PWHjh?_uS9 z{$s9g3yZwGlVt4o;s=(}Euv0rv|}pF9PohjcV~-`(YY z{O8^<$!WOPzkrH&TMMV(*l9m7jn2QkX0KYdwAR&aT1&Jra9GmQf#a(T+4@pLZ;Joy z$D$!la5>Fo6F~)I|0$hkG`#$Y*=0+M?vc`Zi>@Ec67SbFbgX9OSZ_j71&`th2m_DFIMs;$9SP@Z|fl0k>F}tbY$!O=~6XnwfiyU6Mk%pc?x6e7r`is3sT!`GKXJigY7` z+I5xPU7GHc1k{((j@>_Vs~gSrq@fgV6Fw5lpbv@NZU%z<<&#;r<}0*suZqMlbM)}U z?&8J5C~luAIwi!OaYS!wqBSK)>9f7x{g2qI|GcZ;-`k7$%0sJVsIfPIJM}sB;t)_N zY7;!)L}U5*(a_6k#ox%$@txRXk648C`V*?}YvjWgKJ%}Ui<$!FIp?@y&$#Y?)}l9m zg^+iz9+M8&_C7ueuU`&&DJU;k*0FO41T?gtRJh-6g`7ix@fjfn#XuM?{n?}hc302N zx(d>?8sO#7iZ^Pf;8vn&Rd&+ZEmLKcK^z4^HCmeQrxjJumE@_v~0#pGR&oR@GJx}@4$>2Z~?CpKO z=lyf~>_^;;$8lMJz%>=^izjwLE%tq;NEyOTXyEFKFE1|-7<2ZdZ#P0c&zdzYSY6825#N2+x+qj)7Be&HLK)z*hU0x_E0>tziyXygYDL4S71tN zD)4>%{37D%mA4P3@&+%P?>Alx$j1S(m+1b{rN&Qbl(zzNM@EryemldMu}EsLVE>{D*obM6Z1X$1Wg30_IlUCL+w zClfpj97(}L)w>1`#a>Lms{<7;TU=?8v)83{pCLI~UMvqq0VxZgBZ^)ZW&fu+Yl2<8 z(d2&q;X-)eNDn3mc;OM5fQ`JpNu{GmyZGAAF@b#m>>bHYUnth2fk#L-`u@%o*{q5_ zpGWVUh+Vio?hN_$B1lto=0%JC+_@?%SV) z@1m8rd&6*npfh0iNYMcYatUZS8x_tG%uJ)LCZ@Zd5)N{=2b=uB$o-0ne}Sl0+|hsV zLre~FLtc2JYz?it_3IhY+(t_q^23yI+1OFX*J^V;=-oO4@9L~!En{bzD6z$`DCM&F zESU;5@|kboH#6yMedyZ^pYpfs3GOY3&|&r4^fcgLEoSPu5gzu8#YD=3!) zhQ#3o;a#qv5cp4g*cY07(H{tdUkTFmV~0ds4_dtwjWH*nr1a#%a5?yY*>szYQ-3De zvF^N}vmPaZ=@Yiq<Ql{V! ztA$EKOHcIh5PS#VK^WRMcAl2Rnn_#0xi$S!)ZFD2jZ1IYul0?V++%_oSV8^UZi3O| zX@L;cA|*Hw5Jb&9XJ60x`2dBq3Z9GcguOq@NHy?JOG_`M^xW^@hd68347`-|c_=?Ix1V?-Sp}zg0e~a|$ujzNK?)M{E&l7D%b%x*h0Oz$r$XT=8 z`6zaa-wLo#@!j6chG0Ui_1hhZUO(b}%TDh1c>bqa!1b6=Fca%Fx4E`N=1E6y1M#e| zufmB`IG6svJww>JVJJVph^UY0Sm+{j}hxIXrV!k>-z-4e=pN8>BT`zP+|F zu87D;AHvQenCG4}xyPSI*t3mu*-Y{87djC1ub{Y{*Z%6_=;$at=rMY+@9gpbxY(W+jaw=2o%9X%aNk{KmeG$ItrtyB z`VkeRz4aY2D+g`cyR21tb^_0iH045UedAyf=H0oyEAHb)nQW zH~-WwYp{R3bwH46bT`Q4cYqJ<0s#poML%U=bycUL=h}aS%rRM8_#sNoGne9KJsnYe z0_ECqlg>n^LvxhYGcT1V#A&oXouM*YwGh(Y*x1%?HT#hFd3*06F9Hjlsf7%rC{BV@ z=~jw8XLSIR5=nRB*p}L`Yu@5XE%a6DD1vcroQN9~qwf%BXJ@~@<-#G#Ve2I_QtNkj z)`R`h1+{Qef?_NElwJiR!2IYjrY8Pw+S+;u=@7S$%wp;LM@Wdk*4+ zMnZGOBEvxpv|3m0m~7Vn))$Cu_V)HRGvrq-M!|h>$yGZ2>J%@f0(+b%%QcVzmcIi4 zhr`!NG`3wpQk0aGG+N_l zX;~WO%>XIc#HCkym0>fKy&F&_m2Oz+o1Xq!s|h56s514c+?A8`PEMxoF z@U?9g&l^vS9kspVtxJ}vDiA}xXZmqMSE%}XexDGn)1ISM00(#f@I`q-A>EvOuZ2fI z;BM)E>lSnTZF5SRBJ-gWMf6NsQpG!=`IKd(+!imKaowinLBmm>>T+sp<)L_#0t1B= z*ef1BKG-w1-))bdCSG4S$W*&xo*J~i<@40n8wU25i$92~F&AWprx8=GH~Wwa`{tS) z5j#Fb7e!_AK`}6zLrGtMf3XHKKLGTUOMgmd8vD{ikhXPvhE-q!gc$ESTY>Bx+(Tu$ zZ(7sX7z!8)E#%&Wn^gnHH`?bIay#G9Zo<(PA0O|2k)72Gkb}=&DU|M;0Vu#n&`(9k zz0W?i0^mab>C5x!$_pFd#8lV7rqk#TYuy(C3W|n#+bteg2XeIEi9_p6T~!|t=a5fD z^kADuuh2ai#uJcz`JMJ6z-P|mTL=`lpi14g;DP67jt7?1ABiKytz=`w@B0;PJIZDa z5IcLl#}qd=bI-AA{F*;4NpUdES)9LMq?r4<@%dYQ-_(1tYhQm{J7#_;@#A~=^;|SI zu{tt;bRBnu%MP2?W-_=Cxb^rKviGZRA}yQ8KkOW>yu3Vzl+9+tOw%=I=I>)NtnJii zqq6jndAvyxRAtw&A{KA5^kG0cvTZf*MKSb`R(MF}D2~6SIAj*Vy& zM}&{3E?$NCWG=(1pUOJ~LdA7fS)K6Px^X^beGwi?TZ+Up7x*>iDd@~>S*PU=2;DeH zu^gW6U9>-ICUqtAtkAu&hPTs9xc%qW5k5CJ=Sd}K-~%Bm(&xua78o5L-F~$tNaZry zY#RV{UB3Hnz9^@j3oZ6Qy51U$r6$Bc*3i}EVS~>Z*BpK|d;33wv4XLo$&wU%(M$>K{=D;^gC$P2oS%iRn4mFIuy}UmF_+xy3F#V^ z=j=<#Z)meWW)7HKt5$45C8v>=ipawYQZ+N`j@fISF0(u?nXzAv``OdQ#yqda1xCE{ zEkLq5Y5(*zlMH=*$;-;hQqt3*->o%$K6F6WEIMXNlN_T%+8s~mrtDiHE}1Rde11ef z9!u-lkGBmqrTmbAQ=+ymhH?g{^x+n4oI)HOr?;g6x!}3a#*0r%c6xNu1t-2MP~|o{ z?*6pFK+?jTP+9o%HGzb^C)=l*983MY#I3X@f?1Cs42RHHtv)j@2g&#iS*1rHRRgoTS&bMpJSne#v)u6|Ix_ool_%is!TM4oUo(TZt9MoYD0*CPkb)c`{ zvs>@Ix#2A=Ec^m~k3}XJL~$EHu{b66o==)c5HBdL>crIii))z;Uww(q?5ECCo_*h0 z9&UDngyGyfU~@f?0l81{Wz)^WYv%#9r#4lkT7A8no&OQwh`@B-k+(HBTbk6@dDqqIL= zB`}#gO*Bo>bl(?aD3E@6f4u>GXWV#Po*4{Us_`%CF{D_BYSwttE;aE;m#IT> z@iqHltaEf|EZ)Jbi3sgjE7lDwNpn7?rpVYLS2#dH@z(nyKAXE=a?Lhtx5jR(`M4wO zD{FLnEP9fMDZUdl0|oM46A4Fkny6EdMnKs^ISMoV-n*6~*AnmS;8)3Uh?RfcP`W|{ zFfz?}F(pCzs(40gzhYSXMtimpwuXrTgCE+{C{}Z6X|JrPpzVcNTeC1qH71*n^V|Dk z6{iZz29|C(E0bac68MIgzInOyG=E_YERtt8L4?3 z4aa3f>^@KIXZC$b_J3e-lH4gk;2N&a}~@SKDB;t-wq{X%!(&KwPWKHHg)1^lWnS*lrYkkDKpOT?Z^X2zTE*o zXp(pB`4vD)1s^<}NcrtSz*$}FdJKchSfJaXWd`?q@|{$|agA`w!>}nig_DUi91#wT zNV5s~+6X|n$tnFqy!0-3hLCB0)oWTb)>aM$Egenn$OSr86%%$zEd-pS zOMU`q7qd2d47Q*mww-nOy>K*$=9eZDZxEizhx_T>VP4Rh_xDl*cES|-cn{{^hn`2Q zPJ3sk%+aq8-nl=X4=7@g0kKq1Z@r5N&mK*yaJx8H=$*d?CRZ`_tc%3b_jwLGa$&rd zOO}RZ*(3%kb|t;^Qrsl@FZ1Fx6+~D?o4+vPLxhQD4iA~4NCo1`?erjQIi%MfPuh}~ zdv$nt(sg?gkI+qFwS*6EdOUNmL z#-OXYg2h7CT5)5gOxu(=%9i)na6;D-TJH#ose=az8P`kQ2ekh77^V0-W-V-6g~jN{ zqwkE;P8d&6VKCe6B9j_N1J8#!|E#QF5v9*geG^$TL)V@NX3->d_R#u_5h|__EGz8* zG56<~0F(eD<@po6&n=v53CK~bwhR@z#tR`(j=fx-c`_`7W)BCam=bt+464aa=ep1^ z;uNm<(O(;<^cG7QWxCbeGqB?RQ&qNs1)zv~%`;@9l|vW5JKR1f9eMM1lra&s>Eo`Z z!S=lrGyfF(@}9084-_9ExEKVln*ovjC)s+Gu4NK6xeV}x&o5OKiqR)IiE>kVc!Q-T z)NXO^(u>L6cEdZHC^XCw8W-T)5ei6G<*z}T|KJl7;5XF73D2X_A^bs;2&Wg57D=`d zgwK~pktTQ-AWcx8sS(*4K0fCub4Uzry@?&YVBuWpJRB@m8{OwoY;{#JR1}jro$2iv z>#MqUE=Sb>slvl|j40Y*2t`m6F@M4f-FEz{%m`|W5pBUING&A}4x|e1vk&nl^ym1@ z$A{`^Nu$kt`d4Atz_6|foZC|O+-D>#Ste>t-ecS?bDrC zcL2GO`ia90A$4V~=+4dQBnrNB&u;y})nI5rI)L+K197uWO9f9uQ&Sep6n-x=^iL@{ zRi}-ORCtT-!d#Bbkla&Vlb(CdrO5r(p@xZOlA0kUl@SRAg|c^R$AYUe>B7p1E2gt1 zB2v5bHxuiD9v$4}llm#sH}SapPIT{W8DeGUxMlF+DF*+zkX3T?TvnC(WWwzoQGx=vx z;-JBxIms}VwM8v{M1aE>T~bmKYcPrUW^N$0svIViaea4J$gtLGcPXmaiC{p|$oQR^ zf!8l>VIIL#%}+|Cs&;g5W32t6p?TDSjrZfu@dQJs^|x^6aiF>H`7Z_~Fo0})RPqbn z4s!fD-I%pqC;$tcjAOOMU@^ITKh*2CN;a_&yC-(Kth<iIlBO)Au!SHwO>y1j1Vq zk^Z*vsk20>XGxNQ!C($d?Iir$51?tn{`2>5iv$3Y0RU!pUHj(1HHV+YbDc z_Spl(F=10NV4gY!TU?eVy9;5y;FA8ju`xxc4W6V5g8qA}6fQ%B+}t=b8mZq}AE{YD zMqtFxAK*T(_(!~~H>U}iyJ4nCs+7|n%P1uT1yI3bD}O{%swKDmCp-f5%@#izWsc?u zjS#k`FA!I~S0@!wwAQn6yU@OL$gGu{p2grMkH-7(z0oIs!uR+{9Hmwzi(eSbSgXEo z8Td|FO)ohd4DFb4>h!X^*FbWu$TcIGpf5z4m;pXX zJC=e=i}dQ*$s1Z$>nO`!I9kPGNn}}NY|+uwEb00fUg-iLiiI7dv~fo-1O5Hwr?V!2 ztVgmchBEW&!N=K47f;eqO86%AXh~S9)LiYihxoA*_!}LqqwaLE3@O8iqt8M>bC2tS z|I#U}>MN`>jJ9olc}`sIxztdGJ|aCfe%iwAgVivX>Y*!uN{)Ftq~V{b)(B1%Bq;~Z zUHsVr-rLkf=c1(B&6)Zx^eXR{RI&(&_~@ zZ#6Ov40rcP-*RElb+hpm-j-AXvp?d}XL4(E_iS^j}40Z(>va63s-(u&%wefo@O7NnJ7l4FD74 zF~ADxA!t0mzWVhcSt0tH)z4Hzo^quHh8Y=vdQ6m`UVzLvAV&JKB_(zRqpNqi6usw&oE*wLX3LCDLjd<|Z zyENTle91!5-q268G9}Ve9~0iZPJ1dPejq+|$TyzDroeMCmjRibGsAVuT@#N#RY{b3 zPh2G*+f0bR_jB;>AMCzPkE;PEAqFD(9POZ2sT%e8P!u;JM2Nviz0b zUT`TJ|6IJ*7Zo(rHNUm|nfyI*B}cyAInj&N!G*NAy=}BjGZGoUFR)xuuerTUdV$k+wr z!AROP6({OkXE`%`Yr!HIsXi1eO-3X|@0w^l$oZZ$&Cf|UGCEq@9!cNtypJIAZ=_Ll zUZ*Kr{lJEzt9y~y^2vrSYFvmY2I- z-B#3?o!LmSLVyOEE(-UoUl1ZoWK0={I+j>EG4h~|%t_gmWZQ65R(gMvh2VyAq6gZ; z)z;Sbxx~!JvSnA`&377K#7J+#2*rxSb@?;+cEx=*^Y=xPrY575_6;t-JmPYH~I2OO^C>$_O9=H)%~LI1jMijlz_OzQsp<86dBu?V)3(F{r!A7 z)cpUs0QZ2fA)GSH$@{lfp{@7$$nfw_IJymO4GkII+Niu|#rN2_b6CiAa;9EhB!B{R zog<{xSCwz@DDvGemyds6T=cH(o~F#!!>4!`tf3p86MH;&_W&*z0lbYJq|3^}l0s#} zwnn=#69M4aF03PfMiTqiAm|4T$Mp_q;HG$BNp}~4ut#uBVgtyW11KHe>8n%R8;R5?$F(hlz@Pgbf%`Hw zWjR)~kYSbp;^YGKOfy*;TrCuo$jN?nS!W}TS>Ap*f1|)fLJlUL)({hPnxjUd={Ole zd1)+48ix@`lr-m^*3GKsM=M<2^WJNkBM*uGF7vMhPC#x_!ogI>eQJ7oEk+v=l^SzS zYHCShDSYug@YbHKw9s;P#C#ZRM-ghmYssMEK006aD_X?rtduTLGv-GPcw7QT`>)=I zg(XKH6%>_}Oe`!0_O3mi6u2i6tO3ND({iG(+W62`OKVRLN_jJVd>bXnejvF&+vh|S zOuz8``nXU=PW9tu!`G_&zTrfA$C%8dFH>i7X{!~{6)JbnekyY?$RnW_pUq^opzbbI z5w#^G|CNdF2O?2~MH;>c>Q}US-0tmJL=E8((XsTSbx}v5*F%P2OF3umQ5d*H7B)g{ zonfZFX>J=nlG~qp2*SeW=_uug^6&W&kLEcS&qDgQK-0 zYG(iI5j5qFT=Le#b+{CNL%LIJn8q%aWgOX5G0 zr#+8>#65ZfTy_J9y@BMgM+j=k>avrO4#b_T3V6jdc>B97`cEVb z|Ef}?jQXP#xvEng;$EG(t)^`Q^E&K#xO8G-e@UC6k<{xw)G>3y5nxfUdUCeEPo}MB zBPBu3NzTcKb~PX%jpp_Fa4K{}m|kCB7a^^qah1Ny03-zq3pxps7C;yCspBT$)(6^t zVB6Z5QFS_(E;etT!nk|T@y#q*shZ54(*BKj0(6-P-PZp8{zz?humyitZ5k9U<^E}d z-Y`lS$zu=diidigbz`<_SWnJ6PGF&I<2kMhLxb~p(-I3O^^EaK{imDf*U?pn`?@ye zE+(sccs78Hgm$#JT#KS3!eJFWGN7bO=^Fdmtt`Yx^!8U*SNHVyOOXk)M9{0$Fce)bR?UpQF{*52xpUNQ_jY%F?rx-V+WPzo5TVxOm0VIaB45^th9DC6Iyx8IcE5v}KYtPmt@6dE_(S{q`wi3L z|Em6ct7PnZ=3GFT9GER@kU@Q}CUUxLpxZbtTvwb6eW~V#ac+7BdUdk(JwE^dkBTJv zw6v*R-`v#Vq3Euf6n;h_w$;H-jPCn;{T~*+O17dq)4Ew3eE*Qe$K_msM zr8g^5xALZI$hlWjjjc zZz8=gMnVger4D{8eekK7u8o%&RM3@&kpvw`^YZE3cHBOn-xC)=^PGM~DZ5uop29E8 zFr^V~%J{zPpjh`Y`4n+%9Pan9>h1k_2Jhv|_2fHHGB|6-!`Yc#uD*syC&u*W%k$1~ zB2SY|*~Yh)Gq0{>E$ib_1~f%QMW~jppPS0I_lBnxETz2DtN*&`#PjQ4PT*(!3%8Q* zF$uyG`wj;0uCKMamr=t})!8;J%aK;lCSuv}21Cl7{=MFB1I)!h`P@qssk_dY!fhZ# zMxId~^%p1%L`RK=fttcVExBxE^#KF($SFr>uI@k#6A8}D4EAbu3{1E+Sg++Bq^?_W zgr;;bI(d<#?W}t)0lHb!r-o%^lb%wgw>znb%1AK9*pD}pY8;Xn2hmTegKnm+il+Gm zzW9n9nJwO^RzL(`II7IT_2tv9tK$Kcp-qE77s(ia?|!SM?I8L-qv8f=lmJAxK@#sK z4WR4+D7YKA>!UyANV(7FORmvvSW`*|?v&)HMe*?Ke8XwNbA*Q(O-?2ddcB#sTgl7^ zh)WX>kGmLjVPBQ)drJ!o5VTSfs0%2g+)r1Go{4svT3W}fql}lXblUjf_&9`0FIe^( zgs(29bA9xMO#O;?GB8Cv%oG&A%pX~zcXMN}+u=O{^Gp7-mKWoI}LD8-{wSghnaB&}q%eTaY4J<_h$(mK} z@9mXK2K|kKg&7c^8TpF;Be2L76S!iQy18UvmK?ek;oJ5sJ#6z+_rHoQ8q_TTP}PMB zpq>E55uagF2!;Llf$)alsR=8&hrk{#ETkSX31-FcSL6u$cp%OEkck4Jy_zN?QiPeO zu6)|Y+t%r9A)8MdYgm-I${H4E2XcHDUT)qbsZ}e}pmmeBV&F9gyq5p`4+s7T5alS7 zzM>u~3?rS~KYP9&8^u08J~n&K3WK;4+kGEhSQsticXxD|Ps_R=+a1ehIWFt1Unlh0 za|&TX9vswu=576Ag}r@s!R93=u&v8Nb%jOEnS4Hw&qqs|$M_D#BU~^bP8!;wk}8H( zm`!pYP?r*wWy`w^K|+siPaM*99<^&Du8mKGxQt zQW-iG+^4q_g|&*;5(^hWnAeA4C}LXQuOwQh>%<_{t#KvAb5%%HROZQYMBCi6c& zUNQA~c1~g#cRk@Fe-%LW<4{#;iv<-)t8=XjH&Kb)16L|vC`jbi46>zQVgi$WYG$S) zdI387o_BoBJuvkAezWiRT2BVPQY;B0DT08Ao`G+G=ItUrEiLU?5lBHFl%n4on+?hS z254S&3=H6>bdXK5@TCGRbNm`DFyT=af6=*&4(H!u!%4k z=)@*+!2Nni?KE!`HYYMWPCWENA$+#RZX)R*hu?#_l74G6`-8zRdN@m>1}jV zakoy>x}JHN8z>KGH2I@gBvy%=4DT#|53wdcF80u~p>0Dgq5t(keXjfg>{XiXkwJ+8 zjr#)Eu(a~SKAFR6>kl9n6R$(Rg77KWpPCgH9_V+f8yi!|GRNoOQKL=htP&2ZSL$3b z>+0$R7k;h%Q(ihBp}q| zx98Q)FwwbHmywB20|;+)baa1jfA9Bq6O&CAZK}~o1xy?A8I_kll>#tAP)w9@OJ`>c zFolZf`S$juvHv3H{Iu^=hm*PxS4iq^rh?5fw(8itTVF@RWDyNPN)_`gl$;_SBaZz^vmXRMpuDXso2MAZ zTQe$S%g?LmYWDz$wuS99^{DjcybO$tfO7y;)zDb7$~5QdhuGLy`aJ$<0WQqN+L_?i zOH%Rw#u89ykSW9r1)qUDWI#k*RrV{!*jGuN4RVT*n%_An(L8M6xYizCoa0Xlq~taE zySxDMFHB02C_wdkHo~k$>)1J<=_q#U$}cR8@hc``t65;bd}JHYKkw}w!SJ-dAwJfjr9}Xo{l7EYv7&#&4UsNcm&*`SL2TUIw^$Y0$3~NY zH;{LABzYRO$`3jO&UKvnP4KFUX2UA zd#a+R&&~zTvrq>o0PBR;gi|d=;W;)InM)SQSqKrMN5#7;y+tqrZ8C68acP03kp!s++wW7evj^g7WY|PSW5dHyM%l}Ng$QlXn*1Cv zAOi!6!bWEAY}ps!TmuWsw*N#kBmmE+XiWW?^3J_&rt+BU$9HWEEhrc5$4m)aLL;vm zpVtQe-~Z|W!E*DlWOrM`7Xr2~U%t#+S_13FIXTbgmImzJBp!;7LN+x9!1i-$ge&Hz zAC8eorD&0?WSEr^tJ=-XDrtpB8eFd(fv7e-Uy^>XFp{e3#6@+b9juv)<2AD!BF=Y! z^zultUr9)`H6-c8tc~0yN}ogSg8dNU4ivdz5Pwfz?%mtLQET5pry7c4)QyTK=AIAE zq(p_15&1$8m&)(A^GYWE{ges^h(1@2-@xU5+!SdD8BsdYozd?zYok`dPlA3vm8N{xtF@3GVLdA`dH_ zerun4L$NY$b6mXyt9KkN+_zf!0l8x>GbedzJO$MI8c2QXc^1GKIXSWO;7y->L2QA75%ZAVB{F0DdYBOBF_GnW>pu8~5JA zFB|&)*r9}2X)zeGDwEyD0ma$gBejEUyJ@wu?jDGFe=9n5&?C)vkX4u>ng zd>7#9LW3WGCIUem%jK3br{L2&&I~99oM7>~ov!hux0cR&Out>Baz0 zwk}~ExTg`D$&R~?jl;Qbrn0lLq?(pjab(%$nH_6cBJQ}v*otZT*O|){5|}@I+6IW3 zw?JKzsG$Q7Tc3_W%L9+LH=!voYJGT@zf?-M4_zd)nUOTId87V?=~@UgGFKQ) z%9SJ9f{q|!YJlxyOPgk_)%D4nvL}&;rYim4|Qvh~_NGP%m;PiGgce#&{oJGS!v%ZCM}Jm zyrM#i@+(x1=b&R6fMtFTKT@D0{+k2xcMqWUK|GsIdd9l+1vp{&53sQ8NdQzuvqa~sYPtBCFlC3*>OnX9(Cf?$Qw~o zq;zTT84UFd#sbvqvO~vvY5Q1+FdSMR?Y_1*sj7zc&uEgE!rX!-e6cp95rYccseR8+DYIft~MOZ#JUwy+N& zkgU5}^V14DnmqP(zf~4j#nSoT1r<49!kL>(L0|>3C6n2js;zR6VMcZvUxY4%Hhv25 zx;t6?iA64ObGx{>_>D*^5KvDq!Q)*lWV-VC?Qu1>ExTV~{M09b3+3vTbTJK=m7%&` z%U`w0pFf{PlfIH`T&kdr52@k%WPHM*8TQ1zuYr^8ya>jDsV|pj%FWdsM9EZCC=!s1 zE(L#o;FpG4acDtka65hmuU0XjjfzysMK(ZLgW(nNaYsdAY9R#_0>&p9jHnU6gi`S@ zqWD8uIb`U_XHh&(kVfrF9xCGnxbW4QbRVdX4EyaN$xWu8_psIFw1(#P2(Oq2Z*JTY zh^QuAGXd!_(WkHFww4NiC+MtP>@TR)S9urrfCCI@{(xiq^x9dP48^VRukt=P6d}IV z|7~`?n`cC;%hdZ$OL9F@jc0L}!Ga%_Y;aDK3tA#goD;`QQoY_fjM!60Ck#OrWLR+& zqNoG;CTM5}spW9~Lc;KDkHX@MU?jhnWpc#R-I*6eVpKxO#Y+*6T5JA3>`5cUUk?^N zr5*deyg)@OIm$;jWeCS?_OX?NDJX?qu<5TGQj)p(i7N=%=!U<>_I)U^M!QNVV-=)K)jnB4NNX=S$?vwFgVfPL;b99!2v+VL)Mv106UGegkydl4@~ySm)Ac-TT$-t z>+*24o^bZ#a}orwQa1&xxLXhU2*b=0?93hq_9#UYQjIcQtRp>9S`+<$O6Y=qIB&Wp zNkR3?QY)otN2!vfI?8M8sQB?0+wTwD1PBQRoHd7y-Q5W$X5&T2(KX+kiVF+G0Hor< zrt~%EcSd<)m20^`))KO;6P@iIR<{P0VIy6b+RsUNqAcY>|AQk*c0XS7!U~$lRe1UR zqt6y*W@dNfba);Un?Qs7a8`OQ{ZF4rqfCv|*`Mp7j6FsjC8#Z<()w$L`uo6ySsdb8 zA$In_uT}d18o0iS=zpfW%-iLAw`iG@lb)`pYhWN$;=pT1R=t}sT6z$o(<>kmlE-MH zCT#v!`vNd)tw>4vurr_3vy9>n#U~jXdnrE&K>~YMvl#Sw@}aAnZgDvrimPw;(| z&WR<7>A3caK*neTT?uBJ8uS+VuNIKN6OhH)SDvEqwrY(ctNp1+tms~h)7Eh!mNZ=e^EXJ31^O|#rU zkns-ZJ0y1sq@HdZwlFGfENQa*O{Y}iU_RxsOi>=56j~UQ9H_iXLr|F@<;>k9)LubC z6Hoil^ogHm-{#P`oD=a2zs4TY5Qbw}KkmDCdqyY}D{i z#9Dk?``{4lF;uOss0p7qd%6&E>1%A-f)UzR&W04ew5*64i$@IlO9mWE9rS2x+w~i4 zYPj4H3C@~#o`2MG1pZKY&jb`+OEp?{<^{CS#HanC>XR7jod>O`g3Vba<|fKTH1;?= zzf86jg-N986)ujIiDS?7X2?^sv;HR`mR31R=D@n%S50hc;@=I5kE)nC+yJa+fG~|6 z$Iv}JzpHXF{dz95w@BXPQ(W6jj^HcnU}%b)|2I23bf704czPoYXnz-KgLYj{E+jX7 zhd66Bqw_E4&VA1;QkaA23gv_gf^$!`!b#REPMM4WX2qz1T3S})#?niBpUkb4xHRz> zbLAp(t#;jD_d?0+y@zwqVe99)V(!>k9n-&YVbn6&`%YTSdV3uzBmOoaZmi5^119eu z{`6Y1$2)JL`AGX%^!0UXX{Cwq$mzxBTR_4Nmle4;^8Uuz^O4Olw-8f*YauBu@of5` zuW8{tS<5Up2sSNH;pN*81iU0%DTiim1ka9}*)XbyriE%UBc@!Yb~@;04ypy62@sWC zpGJqiEa1kj?re;yWnkHkv3Nl|+Q9`HX#iA1l_r5eRfr%w&=eRiV2c8}9A^UtW+23Xqdn9&VE-{cbhzZT#u zuX}2@6jdsb#Pxf83DAWa^@}w6A&gyKUTT5d<&^rY-hrG7C4R4~FoPMDpCO3EhQFYn z60+hy#6-vH{{8H~PK=#*DNP@B5`rF=kp+Qi(3|NGPZ4bJPH^Xzph1zpz+r|^W1tk2 zsHK2$6(;(X=$-cswjBB_YoEpBkrT(`b9Z&A87*}YjlA)$KO*AsDY~JL#hTWUx{hhd zr*fGcKQgb)N@Fv9!by5=kBP`U!Ys_IPTAiLH0~lx2Y*9-8kPJsuEa7q(dp4z85o)m2q(X0*0S?;$&z!RE z0<^;GuV=ufv6eK?p9>FPK6{WpsgKLgYP#z*GVgErnit>H6iW6(_jFSVNg~=++@65< zk7;4Bu__=9tQ)I*u=!7|9z{BYwp%)N$K&g>x&^Dmp{X@ekd+#t+~O>7S_C3Et|9ev-9nd762hmy_E@6dey!jpfl>{M7r!=@rr;YfZ+cs?EA!9>fjVjn`dPc#YwEHh(F13Em+|T zZm{0KR=J{rb!DI7un~z#R^bu3jVl+B^GkqmK)EAc=i7g+Pzl6N%o5K3{pBbZnYNL- z4b}$B*6^K-vCFC91dz8oiCLDL4Iuc(P~gJH1AjEx3fNx&bd#Btm5$pH=>7pmO7F=D zGq4E(&}gwRjgB6lAIuAzr&i%JlkoSh#M=Sat&WaPb<6p!x944p7GL8edSlUYNAB#EiOugCo$} z?Gz`u#|9E}R|g!hQ6edd|NV_ikV7dko3XBji<2~szl5;r1{%26Gj2_@M0@K)#G1cC zZ{;|9fbTp#<9S;-0hss4CMWep>-qPYp9<%X0U0eEKo!vRn%@eJ|2~K3`%Uz#V3JM_ zWf`~-fl-xNDdWC@;053e`v6ISMD~etA=<=`il59W#3cQ-A5BV8e;}o`glK`U$ZyX! z_HU;)MOZ_mIPRaP@5tF^k){Yg-6~+Rn^#?-n5jAIxm!)}!%<{=+SFXH(NlBsX2F)E z+(9*x$Kt*5I2biNZNtn!Zg3A>e>`jHLg@P}uXLg7YW3QegaN`DGnTQTL7_5drk}A{ z@19J>)TD^8kNh4fu+Yp7%~!(Gpod7vRIolya5k+=*uFp{EEMM1N|sY4lv(>_+eBtv z;cE_3eho5Kb9;;+FIE_0+*EvyZoASSc|hzz<)8dW5APEO2QGWcD44?d8O@Cw0A6D z!jl`l5*B8Pi>ZxYd`2J&3d%zY1 z#H6o3lUXlfH{dbvs_m%2@$wdIy-_eZ2gSSI$o~gW*eBKK()^_5ZuYcMIRk=fyQ-pl z*ff%!L$v-4USo%ceu|iCkEnp3i0Er)0AT+m(-Si9Y6(Wk_2(II`=VutR5E|8OPH^g z2l?AUG`e&9n1Mv1F;J?eST+2&nv7M|vQ*S{PcaJwzlAp13!2vG!*q~~8^0|ciyaUE zN4?nNM!U-Kl_wBV6wy*?x^j0XtS>uypuBJ%vJG2V?YcV+aM|b89u%N=@pQ6_5vg!8 zy{h)hg#_ChusXQ*qg14MreuI>2Lz)MKjkyzBVv|~5tqmA!O0Aq1Qp_na6CJ8sfuQXb(yHSDkj<_vd-$O zK~=h#W4*AIev+Pi5 z2#k z2S9YZWeP3b+BSw<3x$4TCkkjywf?@KSz!S$Q;SvF*X>0Gvzfk2{1c3lR64QfW3-Qr zOz~k{WEu}X;B~F4@jRe(*L}Dd6rODHi1bs2h?GbQ7Az>RS^pQ}X$c~UB8SI~j@9-k z{XI;*NI#oJXS|VDSAPg3->LIEYE!aTH%M(s!ed`gv#MXsB03Mzi5G3WzrRr z1_buC}1q&^Sqz} z2JPrm>r=8yafHv{pr#q;&IIZ0*}gu>1f8F+oj~99wmPigwgEXr#QOtwIm04XTK?iY zNi2*$zYHyF3Xq@08NYlm?WZJGFHvp1Lbtxxez=^Yh82Wwog5#;fC@#xHp_voOSD3z z)YvsHot01}#P~&5C(n@A96l%*JiLjbh@HD&wUroYqFYo2Pu+~*QE2Kwe=eCb8Yfpw zmNKUj@wyVFx0aXOSS*hWl@2L zLxIOLHPi>S9N6o_X|gV)fg97)wf~3}z{Y?WkAT?Ubohu(pF?Q!WMz{|iT44ItOXmw zD4>@(?S0Ndn*@+Ym|86pmRlj3W*8*YX&tN^<_=dSVZ4KX$GWv91~MnD6#Kqdfu|oA zVc}Kv`}MtA!%?^tu?FY8WEmEo7@sU^KXsNHM(Ujk(57HMDg9&;j3UR?&W|~8gEN;J2>{ooi zmfL@I#o@5lZtWhUNv%MOL!`y}qSh#fqN-)qb?}D`V6+Vz)|VR~rB~HLSYKh;cKo&^ zgbOE-d#mGwke;D;hP3o;Z23yMFuL}Bvwf&wt+rcQLPtr^W*&DaKp55JI~F@^)Rshc zT2_o1;FQR)MD)-#OVd9(c;t`OZqyO^lFLzSf1P?! zGoZG2gxmhMlJ07R15#W2U#FYrxtjowwvzVHdVW{+BQJ*h8wn3IrNELjU}K93Rk>W! zM}H;_T09lh-Dyma4kk>@m$Fq3%d3$uB@rdxn>ujk8tCd5*+px!qh7zr!eUs}&(>H; z6Iz4D{2Tp{6zN8%s(FlN1;mWJfd3dBNn+W`oZFlPssgb>`47gv9~U8ADQk=Eyn^6g zz^`ERd(L1D0x5bi-@c$i9tpSan?O*4;?XiF?;J&}WCM&&A9k-rP@84R_6?1b@dv`h z65Yx|E88LJfAYREaB+WBKmXDaX2m9|3oHy%aAMOgE)TBMf+XfM1|Syy$9-gwOOgMz z$}+>zAX4AU+RBiW*T1Jl_w^)Tew1?xD(jJi$iq_d#lY zkOD;hQcj$~areN%EwP|`1h+W=KMGk0FlO^1Cz7t<3Y;pt?O>X=N@0R^S9EY2jHMao z!(uUvQy<4}LR*`Y-Irk9oF$em3q3HT>w26r zAJJx5-yIl=4;aM^oq)Z6Ul;(Y1f0j{(nn&lU-8<^l!|*L-Wm?t;FZ>*o0iC0S%WlW z*tfcNHpe|Zezj~o+Spk)WaTb=_{2LKc@`=}7dXehNxGkzMjBD+YC}9~x&fQE8S{rh zgw#c;HlJNn(obtp6MMVlzy&2p>9xdP`U5xa&sV$WlRFY!!xS*U8P}ycP#tMBlW?oh z+%mas)|~KnVLA=hj!7zH3C%nrc=SZuxAw(N>n{Gs3ejGxmD75q`d1Y~PY$9mR0=yM>Zk@-6Xm@OvGUFP(%z((8(f+bN&;RSx9#YxbTxNx*9hX0o`QO zeEX+-v6A9#ZuA9gS8dV~g*~@r*@oKIzZqf_Iv@NPqWigSmcl8RqVh@mH0$>SHigqz zjC8rNue})=81pqY8iwjFCW&jKTF4!=6e-HPwmH;9f7JYvA0Q^{4b=jcC?6+B)5J9+ zI4ko1Y|lAl?=|^Z5)pLHxVq{oc1Z!jDs)z{N9L;JhRL!`N6$t=yN|Ba*PqENv#d`e zUB9b4eI_5i89P@;OpnZzMm=iNJ58}Sc3-SP&@VirUh}CtfMqihVx?0!JI;Upk42;v zuHnz;tCJjoGFKDTb5rTy+WPW+CpIdzRf1VqMUGsvuEbgJ1iDZovBYlx>z6UF?Seo| zO@l)k)G*LNV_5NiRDwI#I~Bg6xw2Bt%#qWg>8oLiA579Q>6CrW6VdM>5=vJHaRs4D zGK1a_QB9)qE{S8Nz_j_9^%NWtzLpt+a70p4|9Z-z95f_lSdfVZr+*H!9t__o=P0{z zyrn7GGF`~tcgDZL?{`_aiFzh#oFc7Od7tbrg($*w z3dREgbnHU^NL|h!{TGsTcuP_qJyLUL_0i5CcB6b(c5s@5SRLI}{q=O1SWR5yOnHkC zTPm$iYN);Ze!}<|skjiAknfgA?+-^inbaU@Y&9Zzh4v#h-GJzK?{T8}zJt>fFat{E zJ;@2syrxS1Q@y4AzeK}mW;k{7i9p$1>o7wl%)ldD%zfNH-KULfhsANXo@e<6X=lUN z)Cb->+mGb`D~&k3`}C6YzVIpk*oY*f$R?0_u>?G!cu|P!`?h{f2XEV_n$yyZ>7~85zKT2J=Y6pBM zB_t5WZb=SE#I=y!+Zz#mTjw4O+>~bA2Oi~WS7%D-=6reF3wYf_!~V=U>K%b8D)xM* z)~~QP{Tfo!gK86k;cuj7pTc*yqA5;m#m(ch9nURD`**BqH0)N*))4a5uo;Nt~ zD>g0knrVI5O%7RL)JZYMwJ61q7!to8^+9CW56lDL0_{oofzn@_L0)7FGn($TJi!Ch!S)JV-i4)`9v|EXbP8w%ZSUi+I zk)*U!*$-|!ji0NvSeLGhjS#FQ?S#Pyn+VIm7$T8e9^snIro#S}%MbImivv-XZugI( zQpy-DnE)XpGZNE&jvwd8k$yY<6Vd2A11y(7$#l7!|2F-=V+J%YzYF(WOC^7m&p8mJ za?zaQax3pD^%otXvTziKeu7CqZiPS!7=Cd;f!aIDhTQ`7X*E4dughDUM}s-GpNivBLBmmxSaOgFvP zt3E!H?v>Zr$-C9{lS9F6{m4I8(XKVAMChKNm+(0n-7fu87Zfz{fqBU0Hy(2EZfdJ6 z)1iC=EG;Rb`k&^AGp?s{6ZJgIcvksMZr2LDZ(La_$*cifk?r9n>YiAv6aoWuUQ{)d zd867Pc7Fn^E&VXT-a_?S-zyqnDIi5T=%FEW@-W7Xq#dmDaq>w9GzQ-)JQ(;nnbi+1 zD3|>$4OEC}ZgKIe?6D7zV2uPDMo@MXoR>nvDC8&W++dQmNXSb*gwo+DUL?(!lZ{v? z4$?5gVD5=pJILoH?G?de-^S#@1&6X5j`I%F4tQYgd*D-ZPOr#a?LfM%0%%7Q_8|4m z_R+Cl;IP{H87;NA#&l|p2dV@eV^&Z*i}Xi51_-g9;M%aRoGx-B5cwn{`2x&Wlx)Q6 zue7y(442BaSpZ=WCnx2?wp-1VHvOui6TJ=0qffdeBc*+*L8*O(opP$jJ1jmT!oIiu z+EYve;*+FSMzFkZEE*Uf2gcNWWe=0={ubs*6e6T%q?=j46I>bm zvc_SW*wCm~@gQhNNYI_3E~a7B4;Nr6{BHkeM(hy**k#-+*SWXb#NT0Uzygq(Vlsji zU&_a$W#2P?o>3ZkBB<=`taA(x=3{da@|3;w1LFMncPSR$GrCS4$E(pyy)ii{;qHb83Dfe`g{iV;3^*Cst5Tlc zL|`?}R<=zqx82kP<|su6}Kw!%X6R+R4F4P^d>z}q7< zOWxC;e4Rxw$cOlEH7L@DS&`+g#k_8DUid%Rp;mXIvg)%UxM+P`?C{f5$lT7gjqtYA zzXwAzuDr>byshUa=T6;$*iay-s;Ia)Uj{wMG9pr1rjk>^{Xks{6NP{V<`g7tle}Kl z_)kFbfgG;a6S`yWJk2J?BQ61w`T~oZ!DzH6yL;wEAMfONk#Zv6&GB0zqQ{o(YiNbHfF2Kq`~e%PzJ}#w zwo)qZe&}SHDed$Gk7dS2z>j8yBEB}341!{~^A z5_>w#G&D6~b9m5FRjxu8v0oEKOEY{yBu;o(_}3vp^65vDk0Y=|6GqjSZ#w^Ic-kZC z0wj^=74#oFewrA`vfR%rcUhAVkx;yW|A;LDF)~_LZRpuo%|8Ok1VIc$4$Z7Yb?l2& zDH$bX3%|0QSc^_M47DUQYso@^`m}`OZuRn;e-$?V^hrl#zK?aW9Tna{)8>(TwLCO@ z+&7lqXDwn4@kOz1m8VhBj6n6+Z>hoq8vjUaX&;W?7xqW9GEt4~=s%>Chu zYvN~=8X#jQ^U5J(kJ=^IO2y>f>Ms;g@X?KMu-CZ`HliY`epFIF{HN$0reV0ypm5G00>XY=%$689o8#r_$jwlKF4;;v&RRDs1d z``)`Ze?aX1nP;^2AnJjiK-`Pc$g9rAJ8Tw*Z7-GKPpLdItK5pOSlD-#KQ8Z}!mVT7 zL~A#$217-`F0upS+ds7mcJnxXVW2BV4lkOzPIn+8GlqHS5%%rH(0?D2O9#Kd&5FF; z9A49W+4EH0mn1BfMmO@pXBfjyoTax_9~zUK)#ierBL=6xBK=!HqVNR0ic>O;G9BDM zznQrJ^F}ogBo`hY-j^KusKAdnUeGdRb#;Ko}miA3668u*_C z4;?AsE&LV8WsFy9D`DEbPwIBbnv#mXX5--r0Wv|%?fB`$PYG6S0KE~Du}9l##_DOM zQmXC&Y&AaM?00bE`$AVdQB`z56zr)kiJkYImUD7PH|9^IN#FaYNasI6l`3hJDqaZb zE4z)q3@Q2z=1LfZ{l>33j7r;b-3EU7xW%yL-BKS@)T)SE<@@ z9r@bu58%tyq;PA)c3CR|AU?W-{ZM%mQ7d-^&WP56PYU-QTz3x77^%fgjg9SSDv);_ z#B+HDmgR(tC-DDird_Xbbb;8mW9fpaX1JtNUTP#4QY8I`w!5X!j-EId}d;kf6#PN(HAqW|u~WvI-m~Z_{lj9lE3?9!~DP2rGbDcj_2mbe=%8;h0n4H>&CJ}t_6e0q@$GN#0FM3-F~%gwGt=hm zhZX!bZB|^rC?fo0R#t4%m`7V>wbn-P`ddkD?YhO7^F)s5J|gaWorW2G-g5VY^tw&t z5(ANO5dn%t@t(9 zlJ^6>QaR!kbr$8hYuaw(NArXGc?Xbqrc6q+dWw|Rn2e}bxV-f|3B%7OHZG`GooC|h z9uInUb`C(gmGKlMZHnn^@i`(QYW?p3IcyLJy+}?{T(d}__YBl~e*+@xA4~tYf2)*4 zblfB_HZF1$n5{GBcNA1GX}-poXQcIo66`bV?Fgd%4#;`ffFO-?eQzgxm#&BdrRp7u zA;atgIwh@b;WwKB;C?%n&`p+8o&mzIS&Z5|PW#F6E*KkMCqns80Egf#|9#}z{8++C zto-J9v{Jpk{Y>u(a?MqzatDDMjhA4PPz3(vFc04l7ZsZTQW&t888XvVS_ySisrA&M zA0itytY7JQFHrPM{3J(}M_DY8Hjjn39r!Jb&M6!X-$2nfaD(tOQ!{Dj5EO;3XcG18 zz2YPfpzq&34D8;gqmeB_fNjV4OM2IA*8kZ0&aQx5V1 z$?pqBemou18N06Bq@$KU`DgKTKi9z!F* z8Ta`+`yHX**5soZ!X|-aM;1pfg)tKl7XIO8Z9~JYkxI5uOO?Qw-=ubZN5^aF|AcD( z|xeWu3^SB;=}e<8Bn!(Gd#C&a)vaGgZ9w|GGV$~ zYE(4?jT6p8%dciOH)m%&oN^M;zyF%P-7v2iEwafK@B>n$ z68_>;rEq^?y1@do5Q)5j4pZKbTc7RT$LR+C7lmp|#G@ligh$gKLwN2--|v^hImv&% z+8lnzvyWr?`%IAYe2m|6Vm@=zLGd77L|PzO+;C3p_Aw6s>ff=yoojQXUHuJt7jA*l zGq&glIO8&h*$Bi@DF-@+sl1LGg|rsBFLYB`rWwQ}p^8jJv z9*rIKn(qkT?LAF5^p1bA{Q(gKb5ZD$;vNpJkY;5*BQbmGOxyhagRrC8K2ZFw#ewT& zy|5=-)#46?mkI6e2al|1iJxI$rzF*5PkCl`%!96`(JWIX+Wa4$t@vV@fp-s;=Px_t zC+FwOujgZ}Q_u0*Wmh!_(Q*D zn>l=%Vww0yT!o5GWcFY#C|!v)!zIjx+{@PJtbriG0tBU$u>ZcGEI_XgCG*dKyhT(o zJ9F2E{VaEX=-5t3Z&fB*M_t%;=@O*qL6xe_SySicOVxJaot${reSYMB?=lLF333Pv z+zKp24+mmyQ972}hxQ7Qs7}5mkc%yZXfDyIydQJl`9AaTMEc8uWLU6-#GyEZ_WzW2 zp6_h8Zx~P2E{+nL(AuMmre;xU6+x6LwMXn3v#DBDPnDDw)!4IA5)WE6N~l$}ORX41 z&Cps23F7yC{)XTE<~r_|_lx`0b)KKk_Jug&rMV-T`q+sz8Xj|2#vS<7{?9gGmHRK5 zG~co-hNyoh5^E6N-TI%;e2214jD1F&Sl=YhI}(^e0br~N4#-cb9(2r<o-TXQMs@Qqt;b7b+qGVe8Zdl{7EiUbu?K8o*T>yjThv;WZ&it zyDRW5Bji!004|Qz6pbykgz?USjK8Gv?`iqal+VW@go+t5-6tuPSvUN2Yp(nfRfoyu z^iOuwBqu`#R4jmLf-Jyxd(fnW{J=aN+ zOYQJE;telv{eYl9q*`&#_H=Y<*L!57?; z%FK!9uU=Znv<%oP;na7|RsJMNnUNU&o(XU7ZBJ}_KQ?l#zMR)fm3GHGU!c|o*c0fv z9Xa9J`R&}8MNzQI{1S1TUYX{n^Cv&rjIWbCrv7=iZ`D0Jex#lxQio91p&@70tOf7? z+K7^LY^qIadZ3+(#GN)Tl=^%Co(||@=ZOjN1ODsLl@lodyx@ckB%}$w{K1RbW=kvm zZ^gqM57TccMMg}Ne~E~QxRGzJlsmZf8$f=5u2$+Xlr$CbA*^o(zf|n%d*%f)PjnUU zVPseX>x1>OK|`-5d!(cg`|ET9x)iZIi+`+m=I?FDLB zs9b{@hNO<`m<&3Qkiw;u;mt2bXIQdr@~D^l>eG3-Oy=Ru+gS*j0rRSZ0p^zu-#?-k z26gpr*+DdKdEv8|x<*pMZ?NhSiYhd)OfGnZk6Y}Hu}Qwo)^{8-TR#_Bhl~)$%qE*g zB3CdQ!wu0cmAjkAYQkB_-4lhxk1*9AY76H;Xf#?(OjPsTFlVbFrSO%{X}cfpwy5Fw;(?Th*P#uf&o!(a@dC39`yB-M_goD`s%D zJ!m9orakn&7h{IEi0UYD4wyY?H4z8RhKx={Fuov~{9Bu^kcD`xyZq6L`!@cIqx|{B zmJJlU1jS2wV(G{_r#R;H)db_yn-p+0 zFnU*`3S1DIZMN;C>Dt}?G zXiksbTUlIOOlDzWsi~FrhXLgj;5r#Z-(Nkoag1>?!ScQiW7t0l8Q&X_l8+baCD4{=jhW zOiWeJr;*LZcZ7Fn&yL(Zv(JOozqvwXzLm$c8?WGS`lg_SU}sex;a$O_n_i3BA%# z^J35cO*{jqanssjQXb}}l6M`J0q)`SGsP_8g8OI?^ht&azt?vGHO~0Lm7~m!lHoz> z5N#o?*WGj)`-vKO%nWP!$3D|n_IsYlpr-2(43h(9hA*=TOC_Zrt3PCpD=gI&**ona zuoV07n`sd^KNo00CEBnSe8F4uU{%P5? zk|knn%<g^U+Y#!JcFlASgn>%xbE?3}qFg#(?2`FCU(&XLN&*n$V>9?MXDZew`Phr;PW&k=t2 zZb*ZOssK>Gicn!&las3SF;q=uN0A>HMJ9oZ{B1vY8)yXYJ3c3AM#;iuR08Hzq7uR7wHjRlV?2v%y!NY2;`L7k;p=51;R25+5IaNdj4sB=ga~rRnXug(SJ2UWmR?G3)Ij^<-Lya)fve(7; zkE4>U>}!9)+8#mtiqeW-%Ti|*S(Y@&8I5pVmytC zCzZ%~j+<*JiQBy54NX1oT1L1Vo{({Bb1= literal 0 HcmV?d00001 From 0ffa83ef939b2dd5cf1e39727164cb33fa81e1e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Thu, 16 Apr 2026 12:45:37 +0200 Subject: [PATCH 4/5] Create README for milesight-iot-em400-udl --- milesight-iot-em400-udl/README.md | 87 +++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 milesight-iot-em400-udl/README.md diff --git a/milesight-iot-em400-udl/README.md b/milesight-iot-em400-udl/README.md new file mode 100644 index 000000000..f3fe34762 --- /dev/null +++ b/milesight-iot-em400-udl/README.md @@ -0,0 +1,87 @@ +# EM400-UDL - Ultrasonic Distance Sensor + +The EM400-UDL is a non-contact ultrasonic distance sensor designed for outdoor applications such as monitoring water level, fill level of tanks and silos, presence of objects, or snow level. Equipped with replaceable batteries and IP67 waterproof enclosure, it provides reliable long-term operation in harsh environmental conditions. + +## Features + +- **Multiple Range Options**: Selective probes vary from 25 to 1000 cm for different applications + - Standard Version: C050 (25-500 cm), C100 (25-1000 cm) + - Pro Version: W050 (30-500 cm), W100 (50-1000 cm) +- **High Accuracy**: ± (1+0.3%*S) cm for standard version, ±1% FS for pro version +- **Long Battery Life**: Two built-in 9000 mAh replaceable ER26500 Li-SOCL2 batteries for up to 10 years operation +- **Built-in Sensors**: NTC temperature sensor (-40°C to 125°C) and 3-axis accelerometer for tilt detection +- **Durable Design**: Damp-proof coating and IP67 waterproof enclosure for outdoor use +- **NFC Configuration**: One-touch configuration via NFC, supports card emulation mode +- **LoRaWAN® Connectivity**: Ultra-wide-distance wireless transmission up to 15 km line of sight +- **LoRaWAN® Class A**: OTAA/ABP activation modes +- **Frequency Bands**: CN470/IN865/RU864/EU868/US915/AU915/KR920/AS923-1&2&3&4 +- **Advanced Features**: Calibration, threshold alarm, tilt & distance switch, cumulative report (NB version) + +## Use Cases + +- Water level monitoring in rivers, wells, and reservoirs +- Fill level monitoring in tanks and silos +- Snow level measurement +- Presence detection of objects +- Flood warning systems +- Waste management (bin level monitoring) +- Industrial liquid storage monitoring + +## Technical Specifications + +### Measurement +- **Distance Range**: 25 cm to 1000 cm (depending on probe model) +- **Resolution**: 1 mm +- **Temperature Range**: -40°C to 125°C +- **Temperature Resolution**: 0.1°C + +### LoRaWAN® +- **Frequency**: CN470/IN865/RU864/EU868/US915/AU915/KR920/AS923-1&2&3&4 +- **Tx Power**: 16 dBm (868 MHz), 20 dBm (915 MHz), 19 dBm (470 MHz) +- **Sensitivity**: -137 dBm @300 bps +- **Mode**: OTAA/ABP +- **Class**: A + +### Physical +- **Dimensions**: 65 x 80 x 118 mm +- **Enclosure**: IP67 +- **Operating Temperature**: -30°C to 70°C +- **Power Supply**: 2 x 9000 mAh ER26500 Li-SOCL2 batteries +- **Battery Life**: > 10 years (LoRaWAN® version) + +## Thinger.io Integration + +The EM400-UDL can be seamlessly integrated into Thinger.io through standard LoRaWAN® network servers, enabling remote monitoring and management of distance measurements, temperature data, and device status. + +## Requirements + +A LoRaWAN® server is required to communicate the Milesight EM400-UDL into Thinger.io, some options are: + +- [The Things Stack](https://www.thethingsindustries.com/stack/) +- [LORIOT](https://loriot.io/) +- [ChirpStack](https://www.chirpstack.io/) + +Alongside, the corresponding plugin for the selected LoRaWAN® server needs to be installed in your Thinger.io instance. + +## Get Started + +### Installation + +Look for the plugin in the [Thinger.io Plugin Store](https://marketplace.thinger.io/) and install it in your Thinger.io instance. Once the plugin is installed a new Product will be created for this device. + +### Configuration + +The Product is already preconfigured, check that the auto provision prefix matches the one selected in your LoRaWAN® server plugin in Thinger.io, or change it to your desire. + +### Usage + +Start sending uplinks for autoprovisioning devices and buckets. +This product also provides a predefined dashboard and downlinks for threshold alarm configuration and device management. + +## Additional Resources + +Milesight resources can be found at: + +- [EM400-UDL Datasheet](https://resource.milesight.com/milesight/iot/document/em400-udl-datasheet-en.pdf) +- [EM400-UDL User Guide](https://resource.milesight.com/milesight/iot/document/em400-udl-user-guide-en.pdf) +- [Thinger.io Documentation](https://docs.thinger.io) \ No newline at end of file From 6bbf22f00559fb02d2fee05342895eec446c0eea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Penas=20D=C3=ADaz?= Date: Thu, 16 Apr 2026 12:48:41 +0200 Subject: [PATCH 5/5] Create plugin.json for milesight-iot-em400-udl --- milesight-iot-em400-udl/plugin.json | 584 ++++++++++++++++++++++++++++ 1 file changed, 584 insertions(+) create mode 100644 milesight-iot-em400-udl/plugin.json diff --git a/milesight-iot-em400-udl/plugin.json b/milesight-iot-em400-udl/plugin.json new file mode 100644 index 000000000..05d4dfc87 --- /dev/null +++ b/milesight-iot-em400-udl/plugin.json @@ -0,0 +1,584 @@ +{ + "name": "milesight_iot_em400_udl", + "version": "1.0.0", + "description": "EM400-UDL is a non-contact ultrasonic distancesensordesigned for outdoor applications such as monitoringwaterlevel, fill level of tanks and silos, presence of objects, orsnowlevel", + "author": "Thinger.io", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/thinger-io/plugins.git", + "directory": "milesight-iot-em400-udl" + }, + "metadata": { + "name": "Milesight-Iot EM400-UDL", + "description": "EM400-UDL is a non-contact ultrasonic distancesensordesigned for outdoor applications such as monitoringwaterlevel, fill level of tanks and silos, presence of objects, orsnowlevel", + "image": "assets/em400-udl.png", + "category": "devices", + "vendor": "milesight-iot" + }, + "resources": { + "products": [ + { + "description": "EM400-UDL is a non-contact ultrasonic distancesensordesigned for outdoor applications such as monitoringwaterlevel, fill level of tanks and silos, presence of objects, orsnowlevel", + "enabled": true, + "name": "Milesight-Iot EM400-UDL", + "product": "milesight_iot_em400_udl", + "profile": { + "api": { + "downlink": { + "enabled": true, + "handle_connectivity": false, + "request": { + "data": { + "path": "/downlink", + "payload": "{\r\n \"data\" : \"{{payload.data=\"\"}}\",\r\n \"port\" : {{payload.port=2}},\r\n \"priority\": {{payload.priority=3}},\r\n \"confirmed\" : {{payload.confirmed=false}},\r\n \"uplink\" : {{property.uplink}} \r\n}", + "payload_function": "", + "payload_type": "", + "plugin": "{{property.uplink.source}}", + "target": "plugin_endpoint" + } + } + }, + "uplink": { + "enabled": true, + "handle_connectivity": true, + "request": { + "data": { + "payload": "{{payload}}", + "payload_function": "", + "payload_type": "source_payload", + "resource_stream": "uplink", + "target": "resource_stream" + } + } + } + }, + "autoprovisions": { + "device_autoprovisioning": { + "config": { + "mode": "pattern", + "pattern": "em400_udl_.*" + }, + "enabled": true + } + }, + "buckets": { + "milesight_em400_udl_data": { + "backend": "mongodb", + "data": { + "payload": "{{payload}}", + "payload_function": "", + "payload_type": "source_payload", + "resource_stream": "uplink_decoded", + "source": "resource_stream" + }, + "enabled": true, + "retention": { + "period": 3, + "unit": "months" + }, + "tags": [] + } + }, + "code": { + "code": "function decodeThingerUplink(thingerData) {\n // 0. If data has already been decoded, we will return it\n if (thingerData.decodedPayload) return thingerData.decodedPayload;\n \n // 1. Extract and Validate Input\n // We need 'payload' (hex string) and 'fPort' (integer)\n const hexPayload = thingerData.payload || \"\";\n const port = thingerData.fPort || 1;\n\n // 2. Convert Hex String to Byte Array\n const bytes = [];\n for (let i = 0; i < hexPayload.length; i += 2) {\n bytes.push(parseInt(hexPayload.substr(i, 2), 16));\n }\n\n // 3. Dynamic Function Detection and Execution\n \n // CASE A: (The Things Stack v3)\n if (typeof decodeUplink === 'function') {\n try {\n const input = {\n bytes: bytes,\n fPort: port\n };\n var result = decodeUplink(input);\n \n if (result.data) return result.data;\n\n return result; \n } catch (e) {\n console.error(\"Error inside decodeUplink:\", e);\n throw e;\n }\n }\n\n // CASE B: Legacy TTN (v2)\n else if (typeof Decoder === 'function') {\n try {\n return Decoder(bytes, port);\n } catch (e) {\n console.error(\"Error inside Decoder:\", e);\n throw e;\n }\n }\n\n // CASE C: No decoder found\n else {\n throw new Error(\"No compatible TTN decoder function (decodeUplink or Decoder) found in scope.\");\n }\n}\n\n\n// TTN decoder\nfunction decodeUplink(input) {\n var res = Decoder(input.bytes, input.fPort);\n if (res.error) {\n return {\n errors: [res.error],\n };\n }\n return {\n data: res,\n };\n}\n/**\n * Payload Decoder for The Things Network\n *\n * Copyright 2023 Milesight IoT\n *\n * @product EM400-TLD\n */\nfunction Decoder(bytes, port) {\n return milesight(bytes);\n}\n\nfunction milesight(bytes) {\n var decoded = {};\n\n for (var i = 0; i < bytes.length; ) {\n var channel_id = bytes[i++];\n var channel_type = bytes[i++];\n // BATTERY\n if (channel_id === 0x01 && channel_type === 0x75) {\n decoded.battery = bytes[i];\n i += 1;\n }\n // TEMPERATURE\n else if (channel_id === 0x03 && channel_type === 0x67) {\n decoded.temperature = readInt16LE(bytes.slice(i, i + 2)) / 10;\n i += 2;\n }\n // DISTANCE\n else if (channel_id === 0x04 && channel_type === 0x82) {\n decoded.distance = readUInt16LE(bytes.slice(i, i + 2));\n i += 2;\n }\n // POSITION\n else if (channel_id === 0x05 && channel_type === 0x00) {\n decoded.position = bytes[i] === 0 ? \"normal\" : \"tilt\";\n i += 1;\n }\n // TEMPERATURE WITH ABNORMAL\n else if (channel_id === 0x83 && channel_type === 0x67) {\n decoded.temperature = readInt16LE(bytes.slice(i, i + 2)) / 10;\n decoded.temperature_abnormal = bytes[i + 2] == 0 ? false : true;\n i += 3;\n }\n // DISTANCE WITH ALARMING\n else if (channel_id === 0x84 && channel_type === 0x82) {\n decoded.distance = readUInt16LE(bytes.slice(i, i + 2));\n decoded.distance_alarming = bytes[i + 2] == 0 ? false : true;\n i += 3;\n } else {\n break;\n }\n }\n\n return decoded;\n}\n\n/* ******************************************\n * bytes to number\n ********************************************/\nfunction readUInt16LE(bytes) {\n var value = (bytes[1] << 8) + bytes[0];\n return value & 0xffff;\n}\n\nfunction readInt16LE(bytes) {\n var ref = readUInt16LE(bytes);\n return ref > 0x7fff ? ref - 0x10000 : ref;\n}\n", + "environment": "javascript", + "storage": "", + "version": "1.0" + }, + "flows": { + "milesight_em400_udl_decoder": { + "data": { + "payload": "{{payload}}", + "payload_function": "decodeThingerUplink", + "payload_type": "source_payload", + "resource": "uplink", + "source": "resource", + "update": "events" + }, + "enabled": true, + "sink": { + "payload": "{{payload}}", + "payload_function": "", + "payload_type": "source_payload", + "resource_stream": "uplink_decoded", + "target": "resource_stream" + }, + "split_data": false + } + }, + "properties": { + "uplink": { + "data": { + "payload": "{{payload}}", + "payload_function": "", + "payload_type": "source_payload", + "resource": "uplink", + "source": "resource", + "update": "events" + }, + "default": { + "source": "value" + }, + "enabled": true + } + } + }, + "_resources": { + "properties": [ + { + "property": "dashboard", + "value": { + "tabs": [ + { + "name": "EM400-UDL Dashboard", + "widgets": [ + { + "layout": { + "col": 0, + "row": 0, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Distance" + }, + "properties": { + "decimalPlaces": 0, + "enableExtraTextColor": false, + "enableIconColor": false, + "enableIconSize": false, + "extraText": "", + "extraTextColor": "#1E313E", + "extraTextColorConditions": [], + "extraTextConditions": [], + "extraTextPosition": "above-value", + "extraTextSize": "20px", + "extraTextWeight": "font-light", + "icon": "", + "iconColor": "#1E313E", + "iconColorConditions": [], + "iconConditions": [], + "iconGap": "8px", + "iconPosition": "before-value", + "iconSize": "75px", + "iconVerticalOffset": "0px", + "link": "", + "textAlign": "center", + "textColor": "#1E313E", + "textColorConditions": [], + "textSize": "75px", + "textWeight": "font-light", + "unit": "mm", + "unitSize": "20px" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_em400_udl_data", + "mapping": "distance", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#1abc9c", + "name": "Distance", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "text" + }, + { + "layout": { + "col": 0, + "row": 5, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Temperature" + }, + "properties": { + "decimalPlaces": 2, + "enableExtraTextColor": false, + "enableIconColor": false, + "enableIconSize": false, + "extraText": "", + "extraTextColor": "#1E313E", + "extraTextColorConditions": [], + "extraTextConditions": [], + "extraTextPosition": "above-value", + "extraTextSize": "20px", + "extraTextWeight": "font-light", + "icon": "", + "iconColor": "#1E313E", + "iconColorConditions": [], + "iconConditions": [], + "iconGap": "8px", + "iconPosition": "before-value", + "iconSize": "75px", + "iconVerticalOffset": "0px", + "link": "", + "textAlign": "center", + "textColor": "#1E313E", + "textColorConditions": [], + "textSize": "75px", + "textWeight": "font-light", + "unit": "ºC", + "unitSize": "20px" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_em400_udl_data", + "mapping": "temperature", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#e74c3c", + "name": "Temperature", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "text" + }, + { + "layout": { + "col": 2, + "row": 0, + "sizeX": 4, + "sizeY": 10 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Distance & Temperature (24h)" + }, + "properties": { + "alignTimeSeries": false, + "dataAppend": false, + "options": "var options = {\n chart: {\n type: 'area',\n stacked: false\n },\n dataLabels: {\n enabled: false\n },\n stroke: {\n curve: 'smooth'\n },\n xaxis: {\n type: 'datetime',\n labels: {\n datetimeUTC: false\n },\n tooltip: {\n enabled: false\n }\n },\n yaxis: [\n {\n title: {\n text: 'Distance (mm)'\n },\n labels: {\n formatter: function (val) {\n if (val !== null && typeof val !== 'undefined')\n return val.toFixed(0);\n }\n }\n },\n {\n opposite: true,\n title: {\n text: 'Temperature (°C)'\n },\n labels: {\n formatter: function (val) {\n if (val !== null && typeof val !== 'undefined')\n return val.toFixed(2);\n }\n }\n }\n ],\n tooltip: {\n x: {\n format: 'dd/MM/yyyy HH:mm:ss'\n }\n }\n};\n", + "realTimeUpdate": true + }, + "sources": [ + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "milesight_em400_udl_data", + "mapping": "distance", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#3498db", + "name": "Distance", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + }, + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "milesight_em400_udl_data", + "mapping": "temperature", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#e74c3c", + "name": "Temperature", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + } + ], + "type": "apex_charts" + }, + { + "layout": { + "col": 0, + "row": 10, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Battery" + }, + "properties": { + "color": "#2ebd59", + "gradient": false, + "max": 100, + "min": 0, + "unit": "%" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_em400_udl_data", + "mapping": "battery", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#2ebd59", + "name": "Battery", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "gauge" + }, + { + "layout": { + "col": 2, + "row": 10, + "sizeX": 4, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Battery (24h)" + }, + "properties": { + "alignTimeSeries": false, + "dataAppend": false, + "options": "var options = {\n chart: {\n type: 'line'\n },\n dataLabels: {\n enabled: false\n },\n stroke: {\n curve: 'smooth'\n },\n xaxis: {\n type: 'datetime',\n labels: {\n datetimeUTC: false\n },\n tooltip: {\n enabled: false\n }\n },\n yaxis: {\n labels: {\n formatter: function (val) {\n if (val !== null && typeof val !== 'undefined')\n return val.toFixed(0);\n }\n }\n },\n tooltip: {\n x: {\n format: 'dd/MM/yyyy HH:mm:ss'\n }\n }\n};\n", + "realTimeUpdate": true + }, + "sources": [ + { + "aggregation": {}, + "bucket": { + "backend": "mongodb", + "id": "milesight_em400_udl_data", + "mapping": "battery", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#2ebd59", + "name": "Battery", + "source": "bucket", + "timespan": { + "magnitude": "hour", + "mode": "relative", + "period": "latest", + "value": 24 + } + } + ], + "type": "apex_charts" + }, + { + "layout": { + "col": 0, + "row": 15, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Position" + }, + "properties": { + "decimalPlaces": 0, + "enableExtraTextColor": false, + "enableIconColor": false, + "enableIconSize": false, + "extraText": "", + "extraTextColor": "#1E313E", + "extraTextColorConditions": [], + "extraTextConditions": [], + "extraTextPosition": "above-value", + "extraTextSize": "20px", + "extraTextWeight": "font-light", + "icon": "", + "iconColor": "#1E313E", + "iconColorConditions": [], + "iconConditions": [], + "iconGap": "8px", + "iconPosition": "before-value", + "iconSize": "75px", + "iconVerticalOffset": "0px", + "link": "", + "textAlign": "center", + "textColor": "#1E313E", + "textColorConditions": [ + { + "color": "#2ecc71", + "value": "normal" + }, + { + "color": "#e74c3c", + "value": "tilt" + } + ], + "textSize": "50px", + "textWeight": "font-bold", + "unit": "", + "unitSize": "20px" + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_em400_udl_data", + "mapping": "position", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#1abc9c", + "name": "Position", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "text" + }, + { + "layout": { + "col": 2, + "row": 15, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Distance Alarm Status" + }, + "properties": { + "showLegend": true + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_em400_udl_data", + "mapping": "distance_alarming", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#f39c12", + "name": "Distance Alarm", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "donutchart" + }, + { + "layout": { + "col": 4, + "row": 15, + "sizeX": 2, + "sizeY": 5 + }, + "panel": { + "color": "#ffffff", + "currentColor": "#ffffff", + "showOffline": { + "type": "none" + }, + "title": "Temperature Abnormal" + }, + "properties": { + "showLegend": true + }, + "sources": [ + { + "bucket": { + "backend": "mongodb", + "id": "milesight_em400_udl_data", + "mapping": "temperature_abnormal", + "tags": { + "device": [], + "group": [] + } + }, + "color": "#e74c3c", + "name": "Temp Abnormal", + "source": "bucket", + "timespan": { + "mode": "latest" + } + } + ], + "type": "donutchart" + } + ] + } + ] + } + } + ] + } + } + ] + } +} \ No newline at end of file