From f0f5af42811ad333e12784f1c6b4cbf26338de18 Mon Sep 17 00:00:00 2001 From: Mark Jessop Date: Sun, 28 Jul 2019 17:20:40 +0930 Subject: [PATCH] Updates to web interface, added headless RX script. --- rx/WenetPackets.py | 2 +- rx/rx_ssdv.py | 14 +- rx/ssdvuploader.py | 2 +- .../static/css/bootstrap.min.css | 0 rx/static/css/wenet.css | 85 ++++++++++ rx/static/horus.png | Bin 0 -> 117154 bytes .../static/js/jquery-3.3.1.min.js | 0 .../static/js/socket.io-1.4.5.js | 0 rx/templates/index.html | 123 ++++++++++++++ rx/web_viewer/templates/index.html | 65 ------- rx/{web_viewer/wenetgui.py => wenetserver.py} | 41 ++++- start_rx_headless.sh | 159 ++++++++++++++++++ 12 files changed, 419 insertions(+), 72 deletions(-) rename rx/{web_viewer => }/static/css/bootstrap.min.css (100%) create mode 100644 rx/static/css/wenet.css create mode 100644 rx/static/horus.png rename rx/{web_viewer => }/static/js/jquery-3.3.1.min.js (100%) rename rx/{web_viewer => }/static/js/socket.io-1.4.5.js (100%) create mode 100644 rx/templates/index.html delete mode 100644 rx/web_viewer/templates/index.html rename rx/{web_viewer/wenetgui.py => wenetserver.py} (74%) create mode 100755 start_rx_headless.sh diff --git a/rx/WenetPackets.py b/rx/WenetPackets.py index 4b1d2f2..83a569e 100644 --- a/rx/WenetPackets.py +++ b/rx/WenetPackets.py @@ -318,7 +318,7 @@ def orientation_telemetry_decoder(packet): # We need the packet as a string - convert to a string in case we were passed a list of bytes, # which occurs when we are decoding a packet that has arrived via a UDP-broadcast JSON blob. - packet = byts(bytearray(packet)) + packet = bytes(bytearray(packet)) # Some basic sanity checking of the packet before we attempt to decode. if len(packet) < WENET_PACKET_LENGTHS.ORIENTATION_TELEMETRY: diff --git a/rx/rx_ssdv.py b/rx/rx_ssdv.py index 12b475d..c0db2bd 100644 --- a/rx/rx_ssdv.py +++ b/rx/rx_ssdv.py @@ -29,6 +29,7 @@ parser = argparse.ArgumentParser() parser.add_argument("--hex", action="store_true", help="Take Hex strings as input instead of raw data.") parser.add_argument("--partialupdate", default=0, help="Push partial updates every N packets to GUI.") parser.add_argument("-v", "--verbose", action='store_true', default=False, help="Verbose output") +parser.add_argument("--headless", action='store_true', default=False, help="Headless mode - broadcasts additional data via UDP.") args = parser.parse_args() @@ -55,7 +56,7 @@ def trigger_gui_update(filename, text = "None"): # Telemetry packets are send via UDP broadcast in case there is other software on the local # network that wants them. -def broadcast_telemetry_packet(data): +def broadcast_telemetry_packet(data, headless=False): telemetry_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) # Set up the telemetry socket so it can be re-used. telemetry_socket.setsockopt(socket.SOL_SOCKET,socket.SO_BROADCAST,1) @@ -79,6 +80,13 @@ def broadcast_telemetry_packet(data): telemetry_socket.close() + if headless: + # In headless mode, we also send the above data via the image port. + gui_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) + gui_socket.sendto(json.dumps(data).encode('ascii'),("127.0.0.1",WENET_IMAGE_UDP_PORT)) + gui_socket.close() + + # State variables current_image = -1 current_callsign = "" @@ -113,7 +121,7 @@ while True: if packet_type == WENET_PACKET_TYPES.IDLE: continue elif packet_type == WENET_PACKET_TYPES.TEXT_MESSAGE: - broadcast_telemetry_packet(data) + broadcast_telemetry_packet(data, args.headless) logging.info(packet_to_string(data)) elif packet_type == WENET_PACKET_TYPES.SEC_PAYLOAD_TELEMETRY: @@ -121,7 +129,7 @@ while True: logging.info(packet_to_string(data)) elif packet_type == WENET_PACKET_TYPES.GPS_TELEMETRY: - broadcast_telemetry_packet(data) + broadcast_telemetry_packet(data, args.headless) logging.info(packet_to_string(data)) elif packet_type == WENET_PACKET_TYPES.ORIENTATION_TELEMETRY: diff --git a/rx/ssdvuploader.py b/rx/ssdvuploader.py index 4f15ac4..65eaff4 100644 --- a/rx/ssdvuploader.py +++ b/rx/ssdvuploader.py @@ -30,7 +30,7 @@ except ImportError: # Python 3 from queue import Queue -WENET_IMAGE_UDP_PORT = 7890 +from WenetPackets import WENET_IMAGE_UDP_PORT class SSDVUploader(object): diff --git a/rx/web_viewer/static/css/bootstrap.min.css b/rx/static/css/bootstrap.min.css similarity index 100% rename from rx/web_viewer/static/css/bootstrap.min.css rename to rx/static/css/bootstrap.min.css diff --git a/rx/static/css/wenet.css b/rx/static/css/wenet.css new file mode 100644 index 0000000..29abb1f --- /dev/null +++ b/rx/static/css/wenet.css @@ -0,0 +1,85 @@ +/* + * Globals + */ + +/* Links */ +a, +a:focus, +a:hover { + color: #fff; +} + + +/* + * Base structure + */ + +html, +body { + height: 100%; + background-color: #333; +} + +body { + display: -ms-flexbox; + display: -webkit-box; + display: flex; + -ms-flex-pack: center; + -webkit-box-pack: center; + justify-content: center; + color: #fff; + text-shadow: 0 .05rem .1rem rgba(0, 0, 0, .5); + box-shadow: inset 0 0 5rem rgba(0, 0, 0, .5); +} + +.cover-container { + max-width: 42em; +} + + +/* + * Header + */ + +.masthead-brand { + margin-bottom: 1; +} + + +.wenet-image { + max-width: 100%; + max-height: auto; +} + + +.snr-display { + padding: .25rem 0; + font-weight: 700; + color: rgba(255, 255, 255, .8); + background-color: transparent; + float: right; +} + +.gps-display { + padding: .25rem 0; + font-weight: 600; + color: rgba(255, 255, 255, .8); + background-color: transparent; + float: right; +} + +@media (min-width: 48em) { + .masthead-brand { + float: left; + } + .nav-masthead { + float: right; + } +} + +/* + * Footer + */ +.mastfoot { + color: rgba(255, 255, 255, .5); +} diff --git a/rx/static/horus.png b/rx/static/horus.png new file mode 100644 index 0000000000000000000000000000000000000000..f934d2aea4b53793f09bbb06444898242234eec0 GIT binary patch literal 117154 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%0D)}Urs`G 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∈u6WM1Dw~8D;yL^i7 zb=zoRdYfnHfC3SI(cjgc{$U5PS)E4*{-TyQp%tn;JF#C$RS_UoPUX|JxbU@KErE)fyYM0LhwD zkt81r#$+&=ewS&f0Dncy2#sZ8L(2rl#BT)~#LjDU7FsuywD&G$nL8@~%$c0;UvMv% zDD&Rny$&K0IDHl+sXWfHEPv5ONcnI;r(%Yt>w;-B-}d)S^HuK&gY*7rm|*V#MPUELqV`8EYykcEdLl- z8yJnMPK=}QXIriSNCB-y{sfZn~xfnHE}(Kt~riLr0+lYoAkHu78;+#!xnbtNwHdg%F}8a?nego;Vx<6dW830D94V zb^2LfLO(m&mO5z(WyDyd%2NEA$<(J~nX4-xWGctYjU^ZLG0zn3NCr!b6{{!ktC9yI zN8ltN*?3OvAvQBqpUW&Jj-7S)D2116Q!BEErID-yFHeF^ym^eCplhue$E->u>Q;t; zcG!&mW=!J=+l-&Fh%vsXuM=K9YDa$n2pvCYdGuhIY2I#>O*eC%@wcU?9YNHn>78u2 zQ!1xfE&N(f5G@1lSC;Q%Jv>zN*!qKoXqH*Hg5y|>MeJDq4ih?g<<;M}g%ki8W2?B8 z<=r%Xpw|-f1=|EW;0b_z$iuD_3^2i|ZTnH!8JX*hdZa6`8|5H77D43Fu#wd5E{rv? z#iVAkGr^}p_>W3-tp#an-TuaVu5>^)_OUXza)m!8Eth$df5joWrZgQ!=`c=u#m4~K zs}*G?FDo>{WI=EzfbjQ*mnfCtb_ClSW(7$({qh&Ju^y;I1-YLvR&9#M_Rn7iC`}`T~7J9?L%MF`YQ3abR)vhk& z0@FMfQ>X7k9$_jxbKLXbO0i<#z_lvdOa8PH-Y@y0kxyB!YiL{eBOkKI*d4-2_w0s; z0znPU!-e zJwNo(+`4|TT)0K7ex-VF)#R{?`X3$B6I=XG;iUNcCyVvu=91rD1DFC8m7^^n9&xs&H;VACGg>`BYwmV}lAWXFCj_43xnf=DTFK&T1)VKDg8{2cLvVtb@Ay zzLe+_L)_09Upc;h!L3@DY8kk)?5P66edkxOcKCWG%P{L+8689y6LRi=RVR14cNq zFf9Dh1E7Ov2}sS%v_Ede6Eu_zm)Yz;o5m_uJ=@>dRX6|IpjBJFP5v>C4eZRbpLga5 zqzF2rrIRu+^C{erH*7OlNv7(FnR$e5v!~bM=nZP~+?jLij)&syu7^%{E zWgAwEEq=`fMuKy;IdY-2J6pgFEHYk}j^{TcRA@Cpd*(4arPd?o1$rn5K83o9YbTyC z(}2)}Oz3^GyYSP7RIl^Yan=jm*JcIKO^6Z9rvz9}7UOU%5Ss+#Sh5#EdwN*y-5vX%daSpS72{{fZOst+vw}8cjOBoz@lNXiWC9q) z7Ks}>Ec(g$@S?y5aW&D%*$+d{!xBtHc4NJ6$ad=(zI#LdEQVQ3k>x`|JVuOSnG%4a zKuTyFz7ctS2n6eO;Yx@9$J3X9L)~}pYavfWi>;EVluAcbL=kq=1KKHrLeN-0KW=#rB z&e-R;9fZFb+zsj4wleTTq=D(<95_MA3UXPItwpxWr^LQ-*irGdz3?Gx$q#(Dwp)qU zf;OKV)Bb97vt#>p2eU;Pj-$ri&xRK)q2*&zhIqLzaj29^0$b1MrtA~yj;HlKjk)BZ zF<>n2pV@6ap)`;b-<&-mVmm6yb4z}D&#!y4sjOksOhKV>G{(l zb_n^g$kZ-n)A$ehT}Gjh6+3>=6EwpQI6yrOhh&5ruI_39OG{s=1 zz0{x8cmXz|5D$xN2WAl{(88<)*TdE92H-sbGU*ITU~s{`*BKVUxe&sUr(TnM0JAPQ zHyH#CWz1J>s>lAQ>vsc(Cb(8GsUP^PE7<2rvmI3Iq%B4w+u^63N-j@sV9Na8Z11i@Z#!7(;dBFo%Htbk`F0g z{;H#KA2EdBbaPt~#)%<`WCnJ-PP^9q!QPF{^sS3-x&<<-@k=#qk3v{$a6?tNl2%oEHl6qBcXx3OX^l*O-+2$^r}rp$?4zYvUJdVTQ{vOCQH??bpE1p_eX{=M&c#%m+g@SB{t4 z-*s#4f-MZt?W^V5nv7_qDo%CiD@%)PhqerSQ)tUjNSPqQ5>IrIlHPL;(e;vPf%l{& z`C{TSyMb;6zd?Xa5~KrMQ61{i?WrSBsQXm4Su-D9qkc2rfY!xxAgx_NA8K<`#yA(- zHqNN?Ivdsi^N%r1fzVCUw?O{~T6K8aHL~bUa`(KvK6pO9ODKU32yi;V7DE0NmP1K> zA2Lzp`CyqL2x8&Iw?Ru8KBx#sXf7eZ9#kjw!ZRB%z@~#Z7BW;$Z5(NyL8-+7Uk`mL z5aJrtw1k`TPZcDW(bLWf+d79QNX`a=&LxJk10)`|<(;U0rmGgz;Ix#J5*eknat7350U47}SmH9!7eVersg>KnzA)UXG5YGwn`lH*Yu#S;{W zIx?*2!&c>l2Dn8dBX$;MdL;#mK)mno9%Cvh`9_}&yOvFtscvMk~ zgA?PZU<$W0wvf(heV8(?EeWJ#Y1oJ~&*9wqE>Uho9)V8l2Mvm*o3%903S3KeQ)7yUGnV}t*9yitJsKr-;= z)g!bSY{HCNX;tn)_`xuqbMTr5?5zf`5WKv@ZQC07H|tCwK0$DqQEtPAb1qAD-v(_B z0K0%JGJa0$+W?=E3Y-_HtR%YieAFF3ob2{bo_8Xzf+dg!;-fQAMhpdgU#=J|uzRw4-$ z0ce8ElPJ)RFDI2{An6vSd4Y?d&V!uIl`g?|P8f6!kdH!wAhv;OJ>%3gltlnV-5De8 z_NQQlK+lo;`YE1y@sPe^;Aa<=*FocH+VUZEZy~TSK&B6dt!M#6EC0gyrdxinM+I3I zI<=sbE^Sh&8*VGI9VRp7Q@-`qkBrk=9?H0(@AmTo0gUZ2c=1sKI%XbH!v0BcbAvS8 zsXt!?d*^lMQ%PwCdCyvIyJT?yoFYwC@)_@Xcn-)di$I$!hYHJpy|>g7MUFva8IG@?abGV!GB0%yRIPVH+C!@o9`R zw3rYe6;lM36QIzrFv!LXHL5mDpaO6!yyaacAejc{R z9C>!>Cnj4~C?4iftu%$uRIV!GR*~%r`Xqm&pJ>F>2d-ymEtz%-mIDDHasGer@a8tn zX7ztitOC|_ZYYK@)?jPP$bpd{(7DA03|akfR475Mn6*1Y_*ENIVoI2{TM>QNQ=sC2 zyFeHThBgk!tGYiF)`Y;U;E_FuD7?mRabL;;^)rfn7037i!e42x&nIJdf2+O%G=tz&C~&Qx^M@Agm|qPO7T!+}CSz(^0q zv+(?>Fj@}@l30G`*(I1#Q3=QeH3qKD7YtiKC{`VY(Ai{KDL*nt{7mP67q}ilO4qI= zt$0f?V4eaxnxwuufEys}xhnQ?s0x+jYYB8yNoe=@hZ8v%!w%mXYqEgwPm?RZ$lI@wxa;&^J&$Hr+{oS7} z(`vIUd17#SIJAyI-gTWE%){N8i8E6R0Z^{s@7Dp<4y13lFb3?re5xP^s?yhXY0#_bK2;0pgeZ#uvFC_WGRHRYW&1h}=c za}Q8AD(+MnqsCvd5LJW>bzNvBhk+TA%`hlu3nkXs%kS3--m~_(L{c)Dun*o=hTB@8 z{8(TQY*0h~gVj}vW;4h)i~hU>pofef{Jx&G^25s0Jt2J9b;~dP2AgF)>C~STVIw$X zjVzmmo0>KCqh7~nfGn%AhCsbIcmw21@ONbva;3j$o<(8%I? z0DleWKy8xV4<+6dfNxwbrKUt}S~qJbscImR*L{$6O0(6J#f%wbBXAaDfU>yqvX=cs z^FqMi)!J)3qj;08B;1ygbobJ}f9SiC0NE|2X+RI`k|k_mnN9Rvv_TQ8JTp!`vRn`P#Ke&II+(S`-GBEj?0YJE7`_#j zP!s>0esV%DOC{LM4^Qg8n8r)c3zs&>2Jb(fs(wL*3*5E(kNc{*uP+ zM6)_*-pEK5NciE93r8$B<^w`)QWgTwFkr4e0)fq@_G;(Yt4F2W8<2OnMg|?S-?LZ> zyH>Ebg^{_dK&;g@CK`{@c-qhm>^?#GE)d;7#W|6oL!NR4QlJ{@(;B|_Ad zMSGw~M?6Rz#{oG4zu;_Ek91w}b1SFXZDsG)5al6Mbq>aDmhSvO`8W5;ontpGy%W{= zdTP>!1&T13{(W}ob58|O!#-^BySKtC?BUc%097nN(aOQ;_69OEy`T$O^{unz_I>!U zVR^NEm`;1mx79%+=MCT>Z%CRn#93L#o|*}~rX=_UChyVJ&}OaOJAw%Q-G-{63H~Lc z%I8~F@}8i8XAjiM7t7AP-@O&A4!#ZLQyXmcyMy*`=Q~%>e{?b+nCer7$hFvJ?1}}T zNGlACDG<(fO2v}EG85!Q;QK!nd^D?jK)5t9W2lHSuMB8OhS`dg{%yfr#-0pE0QVXG zpCt1g90nkO10gPY19rdm!zQR?8q#8x99>v;Dl^A3RWZ<~hZA*Txwa@dG>WcpN<}Dz zo;$VFL@ZSWa62&gy~|0E%1D zj5)~Gh%e3vypN4hnyWXbe_U^GWz(QmgN)cA(*YKX--Zb`!xu|~iin``;+rj2#NgAQ z6nF%BflJ3qx=)3p%`*S}P!FyionOw_M(lzY9aM;GeuUfdasA3b*g^%R`=!kC10WRF zj`-cbKc8Y6TvSACo^~>HcOaWJH)Me(-h9y=Se+O7BHIFePMJxATObTg_XV8X&&dYu zZM9u*!9FaYrnZ~I2oN{?UcRwf+l`?Mu!XLB{P9TO^^>sE6@FgOA}-4BzJts#XwH6G zs~$062Ur4EJQ6If)|M8_>p;g)QEs;c;VfR0QK~u8u1013yn(JO%Hp6%Wk2PRUMxQI zzFc<^C`)AeRb?YsB;wsdUkW@d`|>COE8vWHucODunRWGE1ihBLw6XNRRa7WvE`T* z(KY!Rn{}{9Dq&QxPSC3re5nrXa!kd0{)Zm!DQGknAMKMXwv(FiJVnPV-j_m*)z`cqfl3Lbj1G6~N6zdKc7Deh}pF&Bisf&L|5e z<+-wI4@&0M=rfhw|oaLYi+&z#Laz(lB2zMw=aVALs zOtE~!t9_G?3B}SnUT#i0s_NBl_kNxMOY0}lX$QkmFouMbO_qS%ammMfy$5?2&6CQ+ zuTPONv0(?xt|@Uph4uEf?f+D``AaK z%^-r|95z7D=vMCR>;}~IvArj(>#N$Ber(?;^BH&;7T}4|wn4YU9|Cm*7(M?Eq}mWe zZNzvM<(E{mI=~3;OL4|}6^LgdwBVn`l^RI8QONy<>H9}T@hQ+mt6Ra=eL5Pi_9??h ztHg2zU$ERwf%Rt4V?EK{5xn1l$^86Os@13efy|7RJDzYEVYYCd=h&eX2ByMrTiQ0Ca^MWv93J*^f z1REkKmZyF+8?vcZi|q>811ckEJAtz6^j}xcE!79uL6n2NhWGLSWt5C{$TAucBiC|n z-LZAc>aWA=A{xsrhVtEv=MG{8Z_*&tl)bo;<}WJ1nQbiIhsnN)WLrG7j{y1}N`+OH9b5wHf(gA)HJB5C4Q%Nf z`m6-sSCV5j8T@3 z+yp$^>6m^{$tsJ4D2j%i%1P?a+RDa9i&m{+Dj?suKMhFSWitUqG9+@;m5@J74SwcZGT0t8OvICi{I{W6tt!Al1mIJ?tf+aRDDCmPXM94+x)yfoR@Y|^XGQ-Z;#I?f92PF8*G z&~JMEFf^i}9(K$k4~+ZcAhD^+&Nu~K?z)*5GFt|}npjCE$CZSlBPr5rEHd3*D(Xfd ze*BwNNU4iDxHcgxjruD{!hyV|;=Dx4q9kY)dJ^Uesky0+wCa`onRiiCoh=Eq zSayK%(47w#?SmK-$WlRQZF*R=Sjt$zC@PZ=16Kjh9fKkzh#^GHRC?l-?&`wZRmi$u zxJkg0_GCZTw|mhC$G;CIS$a{J`;r!55PtRk&2<63D*C7X!)SjT&VYk8$PIb zQ=Q}IlX}?HQ2qTk*n&rQI)08hgk17NpP5`==b>8yUmnWqFqw&136hE+mn;1w$m0-` z@VQ#JtW|_2AHx~2rElfe8ip;v+@W;e z&?xSp;cWwQ(oaWwM$g6QQ~m_l0Dc2}x_G=)mS-od|ApOp>1qE#v4?aeocN}k0AeQU zqA3heSb-MhpGzRrIIW{|?H!Wm*g*+9B4zXO#{X#nM(j-EPnz8VH-D1(cVPyVE9$%{ z{!~JXQv24VM9aneAXVhUsoi8##<-vx1!DpHH2HV>NDsyh(F z4v>ONy{v6`y^SRMkcCHiZC}a>bs)umDZB!aO{V3+Kly@6{*GBOGP(caMOvF%T`a z#E%)QlmGg_RROS@4Z4guxqAA4@A{S`G;GAPExw_&ljmXMO+@>O_f``k?R?id+cIf$ zX4_4eZG#TFiAfm-gD~HT6Yzd8N6KCE{C9z}Fj2R*B@-r)L5rqZ^PU?9xlORO;ugU$ zt_!)}-D35u_qa)-=B4D1myLM>eQ zyOuj|90K12PC(VlcMT?n-dxLf`L<-aQM!BUn@)C+X4JN%b3Qx=-x>jTtSH!5h6r5r zNG+$rndCi=ZRp|dxYDpu&y0gGG6NL;n^`G74v4umCrJhn<3G4>5-pY6pu~an`6k&M zU`vKU)ivDDO}a(qG_&st`3=|Z46+9o#nRKYkN})|Z9zK&r+)G(SeOC|%p(P^+)%@M zEv(E+1@ct|Ur|z@W;RPZUHALu)$J64w;x0omQvmZ@8yx;)E4A$iVk zId27;?Nr(9Vwqo2OlyP4ZmD@3>B~Iyfir_(;K8w16$bo)>>QyC{<=GcjrCzd+J)uE zn~-)HMs!Bz5-^xb6C7Cl*eMD2hg3it){3?UCADOUX@TE@0YiWmAlP?V#$ILPmB?veAd zqN8k(MJw6Z2TZh@tp}wV4DdoHWGW0U3bfS$-1-KoN)gOm^Q<7FCAwNVoMG_$ofg|4 z)1;=%1zTHTHZ}-E4ocv8fZh8l1bT%YK|w+G{8jdk)yBRD-FaHdqDyMxYriGaB3EP}rV*iD&Vw5#CnKzkZ4Qov)C=t1}tS zsURGzzJT_Dp{^N+hzoiP%x}1!8c25snn;q*)nUsvr1=YCCG^4hWi^n8)yVK_H{4b7 zLaQ>tj^btjv^oOHRza>qHMWraKwne#t>3!HArP*_Iq}4MIhwO8>0mRTamooA9%8_Y zbd;O{BUfxszw#T=lq;~}dg-@-HFJdW#NR*?#~`R)?^R4P&gM_HNX64#8+b&v!z&1B zma#Vd7#U+hC{|=WuH{ltxg-bdfndy1Z8i?rY^)GLimBYdn7MY|$l%2tvQG%qsenCU zYKV~uj!W5=((ctnT)d%umtvZ}PLJ9&2rS=w9tQad^sv=9TBFX105r@fqTj0p9uk{E z0OA+!w9j1>(VHlrG&+w>u&ssFQCv}h&t4lMLC`cSaZ~7*tdsQ8`=4#D7}!4Gws(Wb zim5d526EU4{91WC8nx z7%8s$C}V5$t>PzI!wa4v#Wz4o0_Gn!@h2e>m=|USy6-+$uu{el3A3kU9)AG+ebDtS z9^(-3D?>dP)OLlK(KDhWeWx_g3M9ioswN6mF+HtSLo@`RT$J2~m^gT~Yz6<2F1>U% zBt8(p<-jFzE%A0=ABgvKhmpw-=?&1Vf-(U+3RA89%EBi>ss_WJ*+IE!po0O?i*G;* zOgXiVmN)?aPNg$o=(oRe>fS*RoI)=Pf^JcVPG3={EGN5&38`)!g>V`Gkf3Wti$;9> zP2JMLZU7lQpM}?f2aIXobUK!O9sM^eN%sf7%VKDb5Ags-O8wbq@j;(Usccs1yFt3a z0!C^TmasgTq+3m>1Mde|mWsjD;%t#j!@eD|?inEh)ebsHNVR4%rsP~TdjI1*?lja! z_NRc^GvwpR$L#D@F!ih^cz_BWS^Ew6rYZ>>qLCVoKe@#f=1^dCn^G_tlL?TSg)rLH zTg@&4dwMZjnbR{?U8T}Yf&SP%fyiI)@}y^~GRxdvNJ6v*-X8nvXFGQsCK~97v%A>Sc0|SQBODDni^t+>i4-C{vI-^$lxEnqKK7I4%jb}UubBS>9VX*{t9FcL+eP>YQ zxz|;>{q8~(3KH4I)2zVy}k>~2sWM|?EX^6#;RfUxW4XLlq&|eoie%D2#Y`y_Va6XgK~uv^t?6Jn)G!~AZc13 zEUs8e!X5&Ed92~1HNX~Bt;C9qGTp;LXp|9}OPT^nL#59oWH#WQVF=P9rG%-&fK@{S zv#gPDs_?3q5aK{wz|!Z^n_!2C+{eWKH}d}+&H&{1I(>B|A4(3&)WFLIVQtFw3XFCj zV8bb|J3QA3Ut$H=!eP`xHKV;w1SqB77GBh-g;Cb6$q(Mn&SE(L}Q+GzoJ{6@z!SK&jF_>k7#^@8Gy#EHskpO=oj?`-0*#H=! z0!D7k%D(uEMfEVtWXJsmi`M1i?u;4%Tg zwGV#T)W^pZ!}kCQMg}bgfbrtiGQx9%Jl7pUNYJeb8@;8aN|!R58*uyk{yP83(Hcu> zU+W7x5OXf51|8qj(ORYBsCYeI5EH&5tCz=Z9nk~frkuSiok>wE4y7ol2#$uWbx z4b4D0?kM4T&#oZtAsJMn_xN-Tw_UhGY{bKGxxH+5Gc1<`=67E5dwEHTo%`l2iyDiq zFsH1>e{z>z3a~reeQMi2JzZ&!G8sChVQ2Wy*q10OUnP+pK-@U-#Qu9v7WdKq4PkjQ>mG%%pSz&!H1H zBDhwqMESS0bg6sXn31aA{gy}v8D2*`-M31$2B0|mKG{go?cqK{0_8Ri-rJ$JM{1ohOPp4LwQ@w4{!{Is@6At9kf z4Hxp76=&nCmfP8dmF8apYC=+%8TZzHZ}9zc7ljq_CdKyp{DtiQP^kj==!%S1j)(;r*0I<$^L~fc_gWaIl!i6d6zm&`Re-!BmT-5y?_;P+Cs$&oj|-&I=u`^lzV`Luqw%IZUE z_hSEs6l=qg?bCF|ZGkVH6Map$w7?qrNNDI6fx*GSL)9l@PM`WBMvz~b8`Yz9^3cZN zJKf1TYEK1{O$t?iE7CPhZU@?|%SG{eKC*|+k1Nb)`<;q}YQ%ljifmPqDUXp)D9tS1M^$1XdnWC*QJgB$XX_UoqJOMxTl*R6;h zA(ZQ6UgMhS)lvE-D%sg{tXjz{C^dIE7ZYxX+8UEA3AKml<$KTS&huz{fjRD+Ctu+! zQY=b|sO%dUC{ad{OOq5+oioj(U5My(l zUam3Jc&LPSgk+h1&2m}J@p(!|SLpisdS;gbs`%_{|*>5lR$r&4!Oilw9PwkGD<+yN|9l#^El?m}@KM->b2= zV;-obXHKbsb$02Vun=xMAk^s!GdbK7q&U86761?Zi`X7rMyj?cTgo)6e`dFfBAARq zq@2i+YF92ak;qBxt+6iZ4#rVy-xKIqGR?P=>oJ!qa+2QJ#d9H?CBX6nMf{Mn%u%5v;sry2xjB_#!XAhacTW! zJ^Doev~p6eA6-dqsG9_V!2afU0dk-4uF=`=7Rqc;A6JrUq$x-&8mbh8CmcR{o_T)X zjf{9QgxEaWTj;@}iP&4YZloRmAX#LrnG;V-@x_=>Iq#pfSO5>O!~n4t<-A{a-??T~ z-8OfM9^Uw2dHE1jol#Lcbf5njZoCbTC7%+slu`$P2!%R<4WU2uW}#`NTSVcUt2Qi* zw}sx$KJ>3Pr9K_(WAj16aD?(a+J7n!#|mSEJ!AJh0V*p9a^>9bDv@+j$+%CMsq6dQ**XilYg~5_RGCn!8j@BN6c>aP?A>Q zWE?kVh?$kN=X7-RLcBQVc|edmI`(}La8*2r!d!W+K3nh98f@G|Vo2Lpg`fnw-wO9SJoYC21lhl2c#^07|4I6)5U8Yzw zgMn@lELbT|74gG)F2Jk*hp;o(sS9Ea_Ra|urFmrJXrT!pnO z?4dSn1684Mau;)*#2FzWdb?SCHQjy(k$erNLrgX2Tx>gWKEC$j1itxLx#*FXQ2RHn z#lbo|2x6W5eiz>PgoYN?JXhvCKfe6ll~zM@0`H~+C%@;sX|eDcEcG5d>SG28+|epW z(nT>Xrl4{MJm(Vo%n$g&@+v~DBOafv{?_Th&iiLCf5k(j?GWSZX%Rn9P|&wPZR~x9 zpCAKJ1Jvu=`*s z4Hw38fTomkMJzh|jaJRi!(-NUj(s$xxF71?rF}rPT&p!OVjcJ^XkJ7-p(9;=Voz@Q zAPusQSLlrO=h|{tv37ws$1Y3XTU3O{tJeu*5kMYO)Tr2;N1H0EWqjwIXQ2|a8<>iB`(=~ebf?*RKW60mw!jk4`U{f1p)Q|DY5{rIoE*aB0 zI_`xTO^4ggvpw9a-W-+KCGJ5e*^JR$nhA0jwT;A_3SG@i^2E`_7ZZ6mQ|DeaE#zn& z^PLXpK7YFqA=$3nhu6O;kg4tnceN zNAW^5yp~BhVWAnizFOfK_{H<_$V<@5V58QuZ<$qd&KNb4VSrbXkVi(->H7riZj%)4 z*J`(Ydm5y9gdHzQMOiE+OTE^1o{#?mPg_$XN~Uv1)_YqaxdP@nf2>ge`s&cdV&z)r z(-FjjC-Rn((9@dP2R=}jo|HRUuu4wf6vsFtK&}kKNA853nTwubau;t3Ja;7(7BxXR z@%(>iTxBy=e!uqoSVq5Q489&m%?yV9R6ci7&cHiXV0fd@r0W+8C0(rp$uLnjQK-&a z#ZLn+iJL!~NY5cC=Pd^rK*#lVl}V@kzvs{(;^yY=z!cgD+B|UfQ}U-c@3k>AYGV)Y%g^ zz-TdNOWD(7|G}7hKE|EsjZ_3w|5S>yx|&-0>bFMOw_qqAgLzemiH4wiQoq}@=iz;{ znU}AxP9`Pz9aRVV>gfGF-obY-=Dl0dUSh1@RqHrkUGSb3#J4f1u!~oF_Lup&x}eTK zqqHUg*!42@>z9_Z=u~aTA2`+ybFIU3Gc&J(zf3^H|4{>01AxxVKLLkff!gBP4sAnm zRs4~+Zr9Ng=FaYlX{B}BL6x?^STkTeDW9xC>Ji-jO`O1Yp{iQCr!Lp&8te*V93YfT z{&?QyZ8h3cSHgW!dw~W;iN=mHj5uJMuEf@amJ529Y61)3p$vsAzWi)@_zu#Wmr4!{ z1=2nFxIm=4OpVvz{{Lt}q9j#X8 zFSdvYrT9^!lm0>wYBQ=c|M(lw>2!0=eME03`IJjE5Bt)Txq5g+$Pa~>uz598Yt{ku z#-8Tl=O$Btf_l<_53cDZ7avE?(R72ZAc#PA7Jrxy^2Dlj%)j_XL|#FnW9o5GDWj*n zu$XM9xU6=4QO;|yeI@!&@A)5F;R@O*H`Nm}HBBB@z(nKE>?EB5iCkuaA$pFd_{-qJ zP9q*Cr)@*Ll=L~ZJhcw)_PwGjDt28Sf)DCuZa$vy?pEM7p~WPNXk26eCh#VtZsUhF z{VMzEw6+(K!SXO>1}jn$ngcYloU_ns2cEpOz9i2XVS-Ie5(lX3C@XL&s|sFSh`W3y z7D?I>4X?ZtT~l*)|MEuN{JES{s-R!?Efgspm%h$;A*c81Ab7ye9 zf=rW8k8?dYf#W_+hRJz2uWMSTDd}!*ZeKkFT`5q_c!h?Be$b8dGytRk8(Fl=LWbPR zb%@gDCgg#EpqDeI-x$2}T68N_0lPm+?NMpy)y`LIr7B5ib?2M4wCd#iM|B_O9n^$0 z10PdIY2fJ(mt8C+uiu^~Vt(T=sS5nWkdw3UQjI%*=FFLEfd!SgGGj~MK0-d1G-EA< zs`wpnm0+`O|5@Kb!sA)yi3xLWk%b2edkYo2DP17)^)cJFl2{Wg3j4lMmUChuKo^tn zxK`t{g(P3ssc59;t$n`OCj%fje+1B+brDo6mz=-Dvq6!!GM05S7En-|HfrOqzX5b# zHW=b!qv@J!?vPSob#wQD_vIiV61{v*+enR}?y~{j1^2Az+4q;+_uFx5y+4xcRI5^M z6H-Jdd8?qW`OVU{*<%c944&-`4P2nk{fJwS*jz?Q z#^6aR;<&&Xq2*c`-lXXLRe+7mngRtP!F1f*J7IV8DMCqUQ4zrPX|H1Q!WSPf%riCF z3_edG(W`3y*aZlozOv6H^PGZNc1;eZw-mZP&yRI+pWoF8)`KrhFWqZ*0;rA>koy8? z)p6H}Gikd3?j;BoeSQCbT7c%$>{}}#1icgnauR3@Lgx;U>vU2&vNW$ON$hi}z{MnW zM2oDVLaQN#3{od>l{kn}-1{be;`M!feGTbvl4X2kzliB~Cu9g1hjPL1ozM|`6qwmA zuGj1V-}h3mX(b6c`Vc>P=S6*eMPmT5UOiEWzT_(kdN4r&%2HB`2)ug}! z?C{&7en4CXBmh?=z*2kn-OE}NBO@b2eF;_J(O3LDPJZ5YM{a%=og-`)tJZOpgx_=N z)0ud=i%IBbBT7Z>zO#exsHr8ARqrr;cAxbWnm>D7iI0!xFST#>FsNN>M8YeSvuW+0C*IzFvaq z8%XvPmK)mj;(x!D1;6Ws8jt@iZEZ5NGNx)!zmT6nbQIBXn<1mB8Bmc$;PkmHw+ z^z1wp4GYLG^3T`6ibO!0rSregwkksLG8n4`xg)E*lr{pnNkM-u`0#wlX{}*ghg;Qr zFugN*zCa4JP$~@Q)X`T{8)eQc%?MBn&j`akmI=FZ9ByX z!M30L&8j|o>wATATz3E&$i+7MH@73bVVjpAEQxhSH}8SR7=E)^ObOqt8q{c;bAggl zBHwzzMX}J~qFB|ck#dIj%q!?_g>i&z z>%R9pPvcUJ+nV5mLDIK*z*PX%cZRnq)r z1)fqXuhEAW0t&0eU&viF;<;?ofr`ZbroheWl{whsUHIn)o7UO2kh<;~yx7hU;mFJO zbWN3o3%QN;PVhagh=mcb>OzdOv2@1`Z>w^*4at59?43eLRgfYE*Hgxv6Q4x)wa5@F zZb%xiVJ_4Ke8rUJ+~?PA4^? zEK3*yB$~5M0v;zg9eEG!rq*~5fyl1G%NGug_1wvE$W(C=3M;#f;lR6W#G z5QbW0V@*+QpBfvtL5Uutya@3HsZZ=A&Y?WqJ4X?M^}~I?iYp6}w%rN{4zMu=t{TWK zm)5I=>gW`OkNf;8pcV?K)V{M`j8^Eb)WVCh+Fh-AkDiCuJGm!vTi_>m|$+C(@0o zC78S~VQ4{#fa?*v@>PdYQ+q1kdtdDZ zAeGFN;GE41O$y_zc(gnEA7EAr(A#z}3mGR4I+NvydJ~$vS%UIb0t+|>ESk=?MPYVn zjQR3+n#d<|Fe)_irdrKv_zb_T=ANxPv}TO87<2s+=Z5ugi~CSzwY0+-J66}|WSeg^ zSij7wb@!e+T!+G{tZItKp(huwS?OLl!`Acql`Dxy+Xx%xU1okVtq7nUz@J`v`LWCG z)@xGJ39dG>yLl%z59!#VaoA0l~7neUVklQV{*&Y)Z7;oe{7WFW>=%vTA5H{ za*E_aO2VxAyF(A7OCfQk0#I2-zG_-q9Da=tHH6&ary*ZqOZm!?FhJXZfmrX{Iml~Q z1)DoQk*$~@w`z?1%e-jx!h^HxTcKjp+O0MiZ(VErEcav~ks5>B?qiiaJw46Uu6TUq zz-mS+5jXeJ@OVN(4-EMO!QYLCHC#E?wzm-KSQqQu)NzO_s&KlP8NhUVPfY8$T3`5+ z4!NwbIoeCv2Z=uGZ((MBWa)Pmk}z1tBALbV@FO6@)!za4yL-EC|1@$Rd0THO!fW38 z>8YZK3MC!nCd;)&tEKSzU*k2uwU{NXZFEWf1!P8;S(W}>1#kht$9m7~U~rf!B#vA- z#EO&FdwZ@H)2|j3n|;YYC-a@W z>Vl{C*+bjI@$>g!^=SGD|I0mf0Djlj)*5ze1=+Z{yUQ$^3xBfdJhF;TJo1T5h?*c1 zj{ogS%UzxbnVnScFzOx_B>hj+49VPnRPob58O=#)>`JOSVrzK0`@7_#Csrs=Fgd*2D zAKI=Aw>>65Hv@bv`%h127NvX2>nCUguN*r~HA|2pJag1o3_SXJ!No3Tcj6n-)^QVP}Uacmb<2D zgsvAz{?YVyIV>df4o7ux9tw73z|0PC%ymDV8v<&eb5wk0wM;T5TkM*N5%=KhtxI-y z1*5=IXJ~h#r-6r{MAkz8#UkPxfTDGk?T2U;aXXY)*bKHM@+I@-ut> z7bZc_(_Xm!P_uHN#Lr3`@SYz6mYNXIlE_+sTvW%q?OEnw7#z;3(BxX-c5Tt;INhE$ z`+3YxZ(xQ162vTVfpc+@tsboUlj^Qfq4(L{kMSox1KYYc76jGTy-98B6 zaBH(iQ1R5OChwp4shW&!a2-Kll27;=XcwDN%@reVn^A}bg}{&M8()5QU)qs)Us$+f z{_XkRY_S)?>sIs-($wOlNZCz+jNUH@=$5WLh+NGux6MqjxVvY+D{20*xCyU_eGE6f5^3nC&W1V?ZDn$~>Di`5luC#+XKU-t7&YePs}OfOl-y za6m=U7!X+vrv0I7-CJ3ypEjzXZ#X1FPWx%oQoVY@Je=V5&rjx7XwP3t*`P!1Xw?x5 z^);bDZ{!)A!cmvwX{Vs}u#81k3%(nL5BXt|Vs6odRc+cLt zz_<%WUVB7TKSU^gKMWAF<8Lo5gkPJzptApZ?``?l!tB;4*_e5`%X?G7cYb#8V?~9s zGRKYTM{kebwTo3R8%VBjz@`>g>G=fTdSaGzGH^>hea%EhO76=$j5stxCS8+)$+Um> z4%x-xNmBi1k+dbaN%7joXNwu&`v8IZZ56nE50eQgfD>3EY5@&d7Z-?bU(g+RNo zuuZ02IVJZp^m`|%gp%0j$DVP$Yw9;{E8?BskCu4Rq=xF5%5o^}YuOQ%z2d7RD4v$F zI!BR7)&o|2N4zK{J&2r_mX=o9k(snS89EzdQ>}ul;+||Ck%KH7!x#c0ZnH9IB!|=) z8u7f2{ul9yvRJHH1tyMO+@!*H=-5vCQqYZrJS(&X2e=06Aqt2+UfHbv=I`I;(kKg( zhR7hYrk~(`I|wU4>)lcA1=xL8=>?`lD*8S!V_ge?VW9Mx;=SjN%9y{GAa1?kle5l5cb>G8A zDcL}+!ney2QVht~K zL*2HrPcbE<%p7ffs6V$m+RtALebBLE-rS0VT4^HhK%}o3&`mqp4j?CJ-Pp|mU&8o5 zH{$RJF!|L-+8(o9XVsgFxetmC6R8hP=PxJzRtixZSs0G&lYK{~IXiC%Hp@Z#Vy0ot z?P1Au7#2#@pdd8?&b#gLY$7V6m**5t&5cI50kfedbaa*V`!}E)pIkKDLYnqPdFg%p zEPJVXX>KmyV-?LWDCkG8xxa7GUCgImSx(*O7c71PBm!2DexFn< zstlv3pYTc6rN;EC+>W1s=AHLZyBE$O^klvE#@c^T$ny+WfE*1@~| z?CA!1{lxv-!+(T;@rjeO#UbryKTex{xM9+VGp|-SUZrz=kgXC#J42d2gZ$Y3^D)74 z$PZrqGwt_o+nVpzp^@`%(y7dzVW8QY6w{u;&!*e|9Ay^T9lKpW{ z8b_qQDV@5oKyy^+vR+H0AZ^MB?qWzb2wjfNF2qcj*?u@E_ISqB+gpW2kWx9_u=~ch zkeUzCXW?xCTt1xM4G~r&3jnq`u|*&dQ=)==geN9cIV)J&h*3S#xxF?+QEAY$P91MmUcXW`BW_J$|_hv*x*b zd#lCPJSTBf+bsb$ZKJoMmb{*Ph8Z!nH0LzK>Z)GQXPG4(Dp)@h-`tA%P7)e9&y9a0 zR{5y)j-TesZL3r4_lJkeWG?T`r{>*(X9wL?gZMD8Oz;BR&~0UvDzcu{=wwg>B~=q@ z#CD>kl31Z1K|7SaQbibhCM`*r@UpqS=lx2pVcdvUW%5yGZ^G|?p(_qpFwG0s_LM|V z^eY;d1G+VXp#GC@veUUzD<({SuES7Z)^A6?7{>FaztbRxi#>{hJ0x}SS$q+s)F5{Z=X zYe$geyY;ojm${b{S{?{C`}3{Ke|g6Qn%{@6`IEgF$W>AXr*Nc8pH?IRs@H^@mMB#J zUp~NJz$j02eDNqydk2!RKb1J+cLaeqN^yy-FK-Iy7P-hMDn`yKZPdyaz46M&WLSvN99Cp1S6C z?JokLubC1V^{L9~b6J$Uzzf)%Ob6s>ZM<~+95tD;g^~{9kXgS1simlSEtXZ+y;{Sy z{8vA#*$&>EAk51~ADIgdrBw>pK{zdoGW%`rHyL;or{!tChhTK}B`Q4!JW*hN1d|;M zwv#|~@bl+N^Tjw!l{GEbBP5HT2k+dEt?DJ`6DJSPQ?IiL$%d1mVa`?v#$j6w zyBP^*`0b}F>2DDhKgAIte6=^#{6-P+8q6^c_V&opmX-6I0{%HzB;}~TgUkRddBe`K z!M^n5bKkZPTAiY#gE+~I4+J>b`ZH&uf#X}Nt4nmoZp+A}6hfrWS>i+YoX zAox4)z=ml@u_n64(81MMC*s@}fgC4H&Khp)-jVL`91O-GT~(Pa9DqMgFf zr}^q$&oC@Tg+Y=0G%jsiz>Qq3qgtC%D?QMT1Sq+X@FmN2uG=PnwKVnfD(iE3OU$c0 zeY&#<^TNO>_2NqS9BAU8X3s5=Q!S%H1(8G+A@s~ zsr~T&z|i4OWcREQr5!Ll?xYKRbat<*AeT+e+p>dSfmtn(nh}9MGX&nH5^lR#P(}f1 zELy-Pz3c^RQi`Lv zxLHiLV~>xau|nj{cW?h6RbK&C)z(FOKoA5KP)Y?%KpGSgkPsA+&O>)d9x3TmELugn z6r{Vm1Vp+!m2QykH#d6!_ulvUUC+Juu-SXUGm(Iach_i>oKL}TvBwmu zLliwb)5PN*uAX`)l01hw4q`k@zuz|H#l;<+(Q2TY0_~Iast~WfFOpF&PMx}x+T#uR zN^Z(SD@oC~k6Vt7s8s<3uz3<^v@~1i&PGm%SvTFzX7+&}a9NFky#+dk4qn23_Ol>% za7;-Pc+nEmHlvopX1_8}zje)*17Z_Lrd9BZLk|lFB+Bb&7_}~#udjD<@;e9RBt<^Y zW&IJ_$_I9YCW=$Oul=r*E&~R1I6=dnQa9a!=)HtzHftky-ZY z9vEvlmSe?-dw7vPP^>08iLL}U(-K_e2ke(!7CkWr^9 zzFmKaySfQdC{PlUMJl01)^|0U$_Dk#pcfL}u_I)_>J%%bY*3FBhh-U_(7EqnlO{7= z@smfezxcO?Mjyx=;5p(#K#fL1s%jq3ya2t@ImA{VvLs0}7ZpY1WqWtpo< zbK5)8rg8mXag4etM=gMZgsh5JOBmT$MUPLgit%~KT0#C2es9`wbf6{!iFQ3F5GbYb z)px!&_54ITDp35WuV3I@y}C=`g; zm)N*xPEt**fd|Nm`?!-sG|<|!1Ga%S(jd&XF76gkw+{)8a+@_w0n>G_AJhXd`mbTX zu$8Ml$HwD+gkNXyAb62M_0NXM=I65}xDAHvQu!^TXN)p)KxsTT8A;v+uul$!<>q{ez~zdin!*RAu2>3`Y~Jv@*g01 zl;8iba>*$#+~LFXd>L$GDG+njHOYeVG@=6edL#g3{tMob{kHIg;`i_fAdxaD9jVwG zhGax0M!+Qf+i8?7AYAbIqoJxypK9x_g39jBjsu4onT;J0nhii2+Vq!1B-;)8eKM_( z$=I+gT!eqwR_LHp*_52p%G_S0;wz{CVjT&ID~j%?d{FZy(XNp$&PuES5d{c8{mfL<|`lnj0C4$%yye&Y;6xB`wgxpuKfth_(;J;0tCoP?eBkpOzj#ozH0lGZg!6L4O>8k!an-f5XH-&gAo{@<^8LkvF)1|J zi60C(e`2mQfCk}hd3muXZ6*W7+LW_->fum95SrVY$1I146XgDTyTIY!8|&bdVp;ML z*&N8GAOv}F*M_7zQ8JCZD%t@!{bdG*2)c+kOnzlUM--S+k$-3AU3INz!LUho}T&kR)= zW6)G@zizleT}5u&02yDK*`ct$9H~)E3`mAv^lV6&gh!VPBdOMS=ZXLDNd3VRlA$va zpV9*P2jT(;%rQ(nB^Q1bFP`G6xB9G{{k(7}aNQkrHV54u~o z+$JbnMX)O6zp@~WdmQy?=Qxb|Y)5i4(wok5*RX%icLymmuzzk<(Kb zm@-nhvY);s1ac;@utcgNg;529^i6lt(>oDM#rijzDl+~3Ym8P21)&-u4Sn{-K^s{AT z>)3sjfGIiMjX9+Q8A#z!u6uZ!IOT*EM%6Y%I{c}*< zO?Q$#&{TJOup%XkK=3iPo&VYsF+RI9B^kX1b%05m=JW2fd0uP3^T08N+h4oIFACsRp0(siIz|{;SwJXZ z+>?~?fgK-v&K2;TM#gg2F^lp{%usv+q1?TZsl6z}ODAY_75cAQMLAt!3J=lzJa7&L z{m8=nBx}$GP3Z7!ZMVb<2e!4JEO*_2$~4#UIVh`{d&{XClDy^wADjJ z+-p;C1#m`rpUb!paGXVm`$wdxA^}}W$Qb(7*SKTa0<^XjNrX1D7e>Jq7YH=v0H}C% z81KCYTJ(zXkI;=Kg_P+SiXl-5sLI$3f|hyHI-|mfuF6o{WAMitv$>1`D;fz4H*QAEc#t zSNQ;agzG2f7Nrs1t+%P)IF3 z56yk&2cq|OPslKX)L{3r;mT61Uv{IoX-BfibSV3e&q~>Q6=U1+Bf^ z!k=#8T^$ApoSVutU7EZx$K@U&L^Hk|V7JAY+OWnah}p6iOV77G%k>Gxg*tSocJu7h zwTkMUQcN}M_@N>yVoQwUJmgY&>xXJmH#Gc9NY3#nY0{Ds!L@Ll2o*vIKTC$c z-lk`MPv<9ROQ6llXo^XAFVQW`kP>+wq=O=IdEv*YDSQ4ltoM#XX3eh14k-DqxGq!g zyRdyd%nfBLUZD(6NY3Zoo#G9=<(N+{cSxA!%py$2z6cp`W{CpG;2_0WZ$n4tLR3S& zR7LrKC-HDtI{zizjd&Y#?PV|N{Nu5xQ)wykc`ecJPXyx;3XA)03;ZYM!9%leiF5RE z+3XqQcGLgeZsU4c*QrXb^`VjrSe8QoV5?2qc1*tvH?~jm4h^GUpLumn)~;DABQs;c zGX{FS4nDi+vkomh7hRKvIM2P&O)5)qjsap5#$fPE17amnM1;Ef4g^(9=1}<%)5aF- z)V}Qs+~WA=PJ6x@E{EB6yDR9Vz}(oCqDQ^^fOvfMaDFC5OM57rGDTPtfR#2ZB@z_i zL&*_%GgLN6A?A3>Kl{)#^)ft#rxdDCOv7%goleES3sCfP9tL5hprACk=CfQLCuZ&$ znI55(N4*H1Hvvf@02FHX4m*Kz-#OIr?LfT9RvTiB7b%EVK+EY!lj4r`u+iYo^|p1b z7Hp8Cg42hl0su1x)Z?w-sRoOcZ@f4k8@{R1-gpAR6?T)`c+^GCJOb|sLN?AtAX9lG z>GpU(35onXzw%0t)Si6C@!_QyaB^9u>VBPuPt+)E zH6^Y-Ao-D;2DHASsVj!ba@5Co#(^2t+Y_$#^pk-FA!aSMI=LX6@%{XmYdujggP4)W*9;y?{CsQ9v zHwRX}Rt2d(O;mpAfcaS1*4}XjB{NsOUYuLd~d2a7Qs*~T7zOpZ>&T{t$WKzaqrG@y({w z;XEH{Ph|+P?5V2y8`!-exgH`wLx$)n0s?EHb9?aN0=|m<_O(ReM;vMo?`0G56mb2Z zG*pH9!>WwI#YeS{Nl*fizI{zZF0x$2wvU3HXGU!>;KVc3j@g_PM2%lAr$q@Aa<6cIqoIP}5BHjK%73L?V+=&U*=0kcZ8>L&(OSF^kQHlG@cIK7 z!j*w~r*od2s#F9s8eP;1k(-6-3D-C*2B*lpjSWzYK2QMD| zDi2K<08H3h=?7-!;>Bb$IlmJ&`^(hm`ID?YLoOst=SDl9y+?aNP_)DQq#G!5vI6-l zE!qWIimHBLP@X)KQgSapODmHoBLESYBf0KY`O~h?(6uSGO)?FJE*TTG1I`LT0(uTO z%bH)rJ(ZTk-?h1I+d!m;&i_kY4wOjeGr?=3Eq2J`-dkmG8_1V1;>sznHu(Jp#M=f)nT#!ge)dg&2$crXl{ESZ)N+2P7gYn3N!^2sg#gK zdHvaJ7+psfsE&>(Tz-4qRx%|;Ua7%!Xsd(WeJs1Qn_#?faTmEw0p7pf)fN$IVyh{N zM5;%iLf?NrU4>yxL}y62WF*pzdRJ+P%7z*abTE?spo9`YL#}LYw|6PIkad8PDjzfk zAVF}R=h6|4YKVoQZd-&kpY5@iZP^ywk*$_+L9jI<;A)$Im6lewS6(xF05|4oLeIgSgZh^u&%m9U1VtBoV( zKW?i;G#@-_E&jvR^t*aC`Q4~52dz!yHg&1O*O$$n>oyrHvJYD*OTpR0TgS*PIY#$3 znxJ;JUhD3>AiB6s)}f~=N;naMq`QYt!xILDO~WX{43^)`j604t@JB9c{pR=D>b@fg zIgMd`28M!y3|$b5UDPsD1DGC6JAp6?^Dm4lo`hHs)uiM}`S$vz>^lFXBdhB$bCdk# zJOGzfgQHw-8;4Ij8tN?daD=6rZ9AiS_RW3NPPt&8LQeyn zZ%o+Xp9fa6x_mPSHwFdktq$f(t9cS3HF?*y%As?_mNx|gz0;n`ealexb2{yNMgEyY zEnZ$w+y!WbhyALkW7lV@gMi=_LlndYq<=jT4i^-7^Wu*oB_5L;)`G@Ovr6bOZU@je_3mPX!CPEVC zQu9IDyIE9S@5!iR%!H2(xi32Z7sTaiv?T!xC5V<>{AYqmUY_bG|MPlAPPFns!N95a z8Pq9)5(DLt-XGA5Q-i0|89_(~^)3(4sMN@%lVfq_@3BD74Mw+GQPGlBVQ3<~-q|o> z`$?SlfDMwvEF*9hq#Eidmqi;x-;XQ%Y86D0>z-KbByyB*#kJVEr)BqNpe`=m^fD^L z6S@?rvp{`@6&2J}>QaK*X4IVyd%WQKfHOe2v!mZK%rIE1$?X>rb2QnbyPaU5h+?cyBS&kDAY_Mb2&On4K5^_JUT zmy(gcethE5zR_%>RiyILG+?bWyQy0nDUQ+5Eoia4UJ)ISaZNCxDR-Yu%Ax(VA{$$x z)(tV5KkE$xmL~az67wOTz~x9#K8G4Z3p|V`!R>!O1o~;Kx1Up zVB0Ny;H^?pz6C@~aEp7A%O&4bz)Dj?qec7Zo(;?sBoquSjcx*ne)f?e8zoiFfVmdG zBn0AcfIit=MZqu{sKCoyehEm=v)qmnuAu@DUMrjF`$Bt!!D*CF$LV)l=k#28pXD?v zqI_C!Fb0GyN=RY04J`P#hepkYmUBzlrPk5tBc81RWE=c zyAMYKCkotp3GSEqFZbGPk_mLEZS0zI_?%ifen2G_?6GY98Blp%Dup7yo;^@RXk{k4 za&fruC86H3LYN3>`@B;>r{5N;pR>hty8zBkzDICzVN{7=v`@3v!}{#NbW=<&y)#pG z+vjpSZ_5%)A~ky7n(P-R+*Xyyq2}qop`u9NmIVOt{P)32nXgJbheEmjndzUcSxH z=yUBgRc)q~>4NgLE+^^zipu+ELG>R!GnhgH4!K`M*p_J`#F;d#Tme8_qC2IFQG?43 zqr!@V1z&#`*^Y$RUpj^42&*6e1q*V0whMNivAB6D1Ujm**eW7q1`!hpCD- zYJ-=qre=}pCS)l6csHovW20sNGaRU!b!n=*Bk9Rl<0Vkxm$9&nITdxwt2f_k|L0e( zcHTi|pZ(`r7>}fgp6o3Lzs~nRIU){WOI>$MNxm4%J(-w z_$&O^IJfpN6N4MtNZy_^*zDt+T9T2>ERj6%4ES5ijEsdqvZ_d%WW0(QwV`ah&yY=- z88SbkUx7|ATOVx4T=e9^e7D-#aZ}vCg1F;0KK7ln6LaAi&aD~En`)cPLm~Bx{XUOl zgR>?d7BzNWBPw%Rkgfxs<>o9 z1(?)8K!VBJdu&+_zsMEj|8|B+V*mi|T6V7UO?}k`zdp0ukv~UpmuKd);XpOTjTcIE zJ}ba0wb9&w&LUP+fC?6c3Yi%npS9>&*o@A9Dexj)eo40eG>L_7@072iw0qWc<3PUdpyjoY8YMBG^uGX_+HP0o}XEYtF0>sYbz6C;hJPIm|42><8y{o z!5v5Yw)o$7F;^t*51rvYKq~X>7b4}W${&xED7-^Xsc%H2R#y_9@KI~%`DRU<`;pDw zjQf!hh>};-q)fx<4rfILp{XdydthClc)_%sUQKsd;IS>Ro+7En`Yww_a|E0s3oWjK z%C9?lUzx;a5((up4?Q^UD_9Ebk(()ClhyTw;(Rrxz+d{#ZDtSA=#9+dz08f3C|U13lZm zv)8^kJL;l&g82v@O$c^sANFXA9qx|p_>FyuIhdrUphg|T%G^Jki#cM5H*wk%dS%!V zbI=f@fksI_hSEK#uuEhVmh%fUyae1QX5kNC08CxFqB5V7L)M3>w>q!%^uAPFypvj4 znw|MrJmXK7V%AHscYVC`^Qk>!Q?Q|(1{}#r2@ke_h>B**g?zKH)!i6 zJ?Em-y4!$P4@i=xvTEsKNX*<Ypm+v{NoyNoY@u2Mt?6_}OGI6|L{coS&g300_&v(NI4+GH~?B#->5 z_#iF%Q+y-esoN^DJc?awl!=W4rBqxna`bA1&7Jy7Z>_qyTgDz5BKp{-rpVj6!0zk(B zowlKbq7Ye2`5ruLrqa$8%G&hl2sUzH#qrU;QS}nYcD0W;wG*!%t-ed|wM*g$utA)u z`PWdKO~yT!E1-3$w~E#rvmat!An*`rFIl0=Tu>YG)sw?=k&K?{=Je~_|Efy~&kKz5 zMjIL(zafIxVf!TEmD1GU;3ALxcHWG@%+T`EfI0O5fZAmP4Ssh{6fhf_V^>Su6rRWX-l#`AaPVjdmYvY z9-KPd)IPp<2;asV85^tIn>pF?$V`vJftbTfhkKdFCEdq>=W3&~FP%tJc4zR%&UduZ ztY7`b0)CtQEXaovZM-<1n1ss%h^j5W<{AULQ@uJW!6cQ0a%H#tfnBD)uL&Wb=s+L^ zWJvj1%jR=+gzqV$m>Ema=~87H*PIU(Im`+rP?8&|R_rBORfxZo-P@)(semmyt@-Rz zayZto9mbafgMMR&-S-mR2d^AmAUT9VJ&DLE{|Zf?6Hknnd_7B3jxw7W z@CEqT8b47FOQ8}&QxN)1fOfV*XS{?JHmm8m((9?`k7LT${R3j>kB*I;ot|O|pJTa3 zJpM5@c7yIIz0yN`c^uMYf*T^WuR>)>KW5z4`+6CRB)RkY21@KU1CFq;#|F&3b93K` za5*(_#~#`i)kJSEwh_o@p&NS}|(n(I7uB;aU@ahrH8#7GkfzT7Zi%#}FF zgYw-nnFy<>K$a%zPgOl$?YZ{r-PPdKx%nis{*pwEyu5xnnF4c#+oYdH9+}N07aOyv zyTC->(7Q(GJ3BiaG}k8^0v!%F`>f`>86w(}i)RgrHCV+C#eX-vl6Sk{U)9yswHPk1 zsCcUwWp3gt!GK~468B;2Y%sVZ_og|=%sc+`fc)T(-P0~VK87-UQN`6!s#H1~(KxDb z!Q;%UYxu7$DW0O}@Zr;U7UBz7&1ceE$?JW!wpg(^8JlSqz zlYA-tdQf{x*IZfxRfs%_m4QJ>Ow4P*swJ^?*`o6BEz)^VwY$=0=KK%eOP=qDuB!3< zFy@TS%K9*Wd_nr9#3?D_Es!HLiUa_KK}t?8PM4#W3MIwZ?Zlu&6 zS9AaS8^WEvh0JsT!s*yR7Lj2R9HIAq@xD0nPX@4$%T)}LCt+~X2T4>xP;b9l1CG)6 zGgSo#_}Tk@7LNF=UGG&~>vB%}kYF_r&_4dVqOU9?##p;?|L%xW8U)7VwHG{KRv@gc z;->!6uikWZhxL~GRrD$X{oS8jxYHCUgPod$;s!e^nR1h*)FeRRz9&Oy_h5^KvL!6dQP-e z&gJmIb+>d`6<46UZhK>dadgD7q>!!p`oY(4tnm8by;G0NKg=~JMRrUqXYtcB6$JxK zrhEJQaZmg%2Rs(CwC%{r$@$W^@G&N4L{tq1(err6Km#jJSTcK+}Y4T%k z78%E_C#F^sZ7=hmGMQm#!EBK?gcKhF1NB4B*{_V&{i=D_k!#du?asu?`nJJgDA{$z=|I`aPgA zIpOks^(!A?@Ec>0_zSH5;Gc{zU?A0~=?rP`Vh&v%qed2GJbk&Ftxh6>Y>4UpXsccQ}q*MG8nWC7WpMb zUEbC#s?y+1ibFSuIO!!EejT_$DVOukr9)qF~ji zIy&6{7#7CR{}$fO@6^nS@4xGOeyyyq%~H9jpW9(a>0C+ zd^Jpdd0aG}#Eheh%>Xo+PFGS+3h%=a;@gGc8^)aB)(i{OYo9*z!yJHI>?}#TT-Aut zFiSRl)fBSF3?cC%Zr%DL9cX_V<(nwkiEQqYeA>7?4@M2X5^T8v7i8^6Heh61NqucYOR z`ZmF1U%{iDN9}JpDL`j-Bz7I8e%S(6MG-p-U~=P#P+PB-5gTZ&t`r%}s21+<=R<=5 zDXt{9IWxb&eXAR(pF7_4PFt00v4yS1%O|IKhlAbUaGSuBwGndFT&T! z{tqE_le^1#pgPY>bm#dhssOWjW7)~%(t?udSx~Qe4 zHQSR)F_>@m4vZ!_2L}ha0--vLZPG& zvm2o@o{H}pYpviH()Pb5jPTa~-UyjTT@qIFWv^=mDD&m9;&YJNPj7>qYg4%$4tkrdG5OG=(h#_dNdDh*w!> z<2_D}&2O)FG9@}T@5!*5OC0H+8GKB?tq!#>uv*BD3gxk(gOZHU%xt?QwaKX|jv>Q^ zXlpr6J$b#-9x%>_S_&}F zwZ!|rrpFikqLkXw3QaohWG`LFIn8|$rs1Mdcx~Xh`-1!e7TLj%EIE6pt&?j_SnuWE%a$gv3cu))?)9?Z z;GAep58d=lS=gr?uWgjmu$a4LLKw+-PyF-i{&qH zoNwfcw@G0*3Z;Mxx0cJA$TWfs`6Zu=Ij5S8b5%Ve+vSG;w=6%4Z%acKm446$0KeoY zR>Y@0OZQQ(`(1j;e(@{f#5mWedEA&+71Ir99-OA5f&BI5^UwQ`z0{hA;xWw z;q7_q#vx<_=c`F!v;UG!I?w*=HZ-5_HnlCbl~3VpGVG(2SWoy|FrcRY?S13qzHo5p zZ%&^W`e&|sy-uZi1GKemahLzyXUqS+&zJOKC~^s6{Q+MVGliyLmbE`kY6|11MvYQk~_0;0pl|>MjTSPPvV4(jc;>VjQT>$ zA$7i1Fw%bE3aLG}`bo|U(FJy>+@KOjXcifof59t;OJ~L=C>FNY8|-mg1czNaMtspt zUp1gE$FC>x#y|fm?DYA6k&Q5ybL|B}mCp9;gpyo57^H?A;*Fm_owhKz5 zhZ#MlRuezYTWBfkhW)B#xiH|ix>W?Gx~UQYwHIDINtZiTrO4~?J=FF;ZwO> z#}e2eo2tZuOoOB3b6|hv>5172;~7$9B=fSv5h}U`GsPDrSYYf1%%{j%#2t2d&N>*P zj`uCAh3uxsu6MXzqQ|uQseTx@+H0X~sCrEgbvh;a|4?2L~=16)s_gm;x?7=u#|#ikQ1=Q(%Q%AuIGnF78R_ z1AEr#)+jUO82%$FOIHzi^|y_gN&IPKrl)ViWGb-J91|~df64DfNG4bpKm*c-T9XWz ze@8C=1QoHsL>^Pqk+tKbN01(@#hlewXggh$V{oPCUr0m!Kl_U-%;i)&cr8DFO=XLl z!))-+$SP-{+}z4az~1Jpyh-)kV@m ztd`t^r_wush%Oi-tkr#SBATGV_YuRFznMzJSk?cx=X_DqK1{HJ7d@cKwZi?QoqjsQ zZ|St(yv3*Yn!{1dw81w#;#0ng5#v~4p3e=MM-rJdT7ikJV0 zlH@)cCi$eJ@^uXitDTbXfk{eYH$5;dbMju=8O*3sH5_({y!6m}9;&?t$`l?9=Q#i7 zE*_ssJpQe%?fO{HYb8`Hfu75KJ{A#F?vwbejr%bIf#Q65&mulE7{h;q%Qh%HjJRU< zIV0rSd+%}OP<69!zU-eH3|2Qbn8~=ByftAb4P79PC-vZ|9v%*dAsdgieN=9E)KQsb z+(wnASje0_)-Qq&D9Mw+M7^qng!UQ4ZDbz1gND!VvOp>XQEyo$L_5T!q?7DJDmT$I z^!M*m3=9n1W@dJo4A;O+eED+CheT-$zY3P%XIq=7wDft9Ny0cqQUd66T~%L?=jP^C zRvE}7iV|dfY8jgs_rqC82#bJ_@MBcexpFP-Wg5%A_4Rd6@b=(a88=*v*eO?6e?5Zv z;FB{m>U`4aN;Pe5L=YdXLhbnPKCHnVcWd^`em|kf16=6OpFfRWFNWPiqL`wx-5RH? zZwED6_faSqu&}Z|QBoo&ARvITKrl1>Lqvp6cekR0vvZt$yf|EoF<*?)Y7mX9Q>@{S zM?~`_D~q_Uu5QX)KD7t`%o(A>y-iK)iVL}88gk&2v9CaKbrO5B{%^gm8Pq5=#=T9GfphO~***5_((0e~W5p#3q-@kub z?r$x1y1`SdZf}cvo<7%}f@V5P#r>h-nS^UlRFogws0NIE3}MwohWdQ`@WG?Gx!HOf zrc^=uyDu=;5dYk{It3a2H(6Qi-N_1gy1KeB#)Lc*BlbbZi_>~~eRs!xDloWfuwP1C z{5#Cy`ta$~tGh<6<6BEZMb=ZWCgrq;-Qt)2n6%+s;cM_8UUar($A4^78V@tEyXJO1DXo9~FM|2)P&}Q*rP- zN$6B^xIDF9U~%4&aFcYF_2Hf^SlCO6GBH0I0_i_~`h*=Nz5TS?;^|X-Xn58E>Jv_j zQ7Y5?LBpFKb#5dKkg(lV?mZN6UD= zfB!C9?qn;rFaAE0Ed7z4>^q@+KuOsT&(Klsj}rwo)&fcD_FS@ZbM6o&FW0Smljh~U6HcEuwlN! z>ju>%3&i&RFv_=M`QCsU!7QYp=3^DqCMG6a+79gtn@O6bTw0D(WRNfV)JF-r(*W*K zU+sx!wKRAyb*9XAfm}L9zz@)*ScoBHQ+ps;``Oe~lOPoV+tozD0Y(cY$;F)>by=4x z-D~Vsvw=usu|L~0WF@|Dp(9gUkkh2|^?>qFz8M76d&Ix8cnc7#;sY+9}i%}2kvrKy!A>Z!LYcl2({wn(g{s;N~@mrBaTVmn_oP+*6lZ(;L%RIhU1!<@s*pa$Ov*tubR7%n*%tZzV z26~b)DUCz-{j%4+aE@ZNE8WO($2S-HCJ<<1swpJQ+`KP?+QrpXqHhyYUKha6z{GjC z6!!wk2upjO#3Oz8ftZ*W0-&;0!oxAbR1sVl#6;q>eVl2HswuXa zS*^e7{>AOXCBA%THY-%*MSM&Y2J%v1 z#dqM$d9@{a&T{d${Vn|jvi zqan_6`xP2;HZ9-7{q4J6Eos{m5Wp3=9rD_(jQWk1J5P8L2|SGAwPhAKCEWEJ@Fh|* zvH{=d-&w(S-H{j<`G*h?q-m93)^08_pLbCGyPBRM(wsgzV5@Kiov#q_rp2aJb{IBa6VF4`4mH>NAY zf|P0bXKnC>!u@Gi(tw}Qb31R=o%FK3UH0eHpH4~Qw1wMEHm2#BY3b{yJzt7V8igGn z?ao|nj^@7t#^0{rp~PT^v3}AK0MLNnu+*hI4{P z5WD;X``*(>=X7wpkX$C4GuL4G6Pu=qvfNqKeJmovk-xdNRt?MF+WmHFG;|>oRtmW) z*kSTKlKy-%Wi76sQ`Rt80*{p7ljQny3<;-OBHn>z;ynxltdZO8fcsfn zwBJQ~Y3^GWKD~j2G9iRlgN$Kj1I|R*X0JNym1^dYCIo}q>u2-<)D$)Vhs7vgq=0KU zL-;Vw@@Tn_w%ac5{`N|JD2G0~&9r1f$b)A7W5XHFU@N0#6@V=6nf2=YuJwAQWoa&^Z@?d(QDaWMwrGAzekV>aCXsjU)6>!EO*e<_z?NKFDjXva zm(V1!L?0{slrR@|`x^oaDL(#Z?OtVhFcGHfRoUA}#>)#ODh*XS_tV>%Lt_t#1xADnX`0XIAVnKJlmW z3ek4Ebp87EsT+yk+y;KF?dwQsa8aH`*6|tO8dvT=f2wC8Cr487e8d|7+1hCP((C*U%ZN60T1%}(Yy02sG?O^u{ItiKiI*{^81z*N>(cd7DBdkCtltEX^u>{nBdb|#3B_j6t% z(Be##^gFojSLf|zl`I`BWH7sfqvJr246~}-Pqx1(&9&wurLX@%>clxh(mpnIfB+){EO|C8p1) zINUCtp zOHNHBn}Kl~Dn*vp>7>GMnS>A4GcYsPg3nmn?9+arSSAi83J%ID^j!4`=8C*lJH0$o z8p>^T11#>Myj>K(Gx^7lAK!aW`6;%sW&)smh{Y4RI@173B^Y)0KQK z-F-F=?8_&YHn0Qw-(Q~r7fL!Tz@CJ_96?FJ%hxu?(M?40MsY>BXf$>_v(bpf4t5Lhk^f zYsgp!_x$?J8?a)7w2zfI|E#ZPyB#`-VH|)QL4aOP%;4t(z597yf8Qwje|*xom>02S z?UN8-u0rGs77>6IGS-`1T;x_(RzK7(tgbaMY=%Uqk~P#EFc5-R9wG-p`k7uE5zMi<}#nPo`~FM)+izd ztS{Gj5wdG!jQrFe>vb%97T_$DQ@R19M(o+kmoF*rnUb#Wu(GoLX#e_1Q;Re;sYq`l z{DCzrKjP}%ou^JA-kP4A)B$^M+?_-Mk@$0~3hUP~Ulkdx)~BUh!2kYiZq8fK2x3xx zlB$$G%(`a}uM1ACk=9kn(q$nh5S{jcXB)0`zX~!(Wk$C!$+!1M9Zto#ZiV%P)KSf? zc+HIoFz7Lfocqh!{FgW5=)R=CmonZQb{FC?X_Ln=f$|abFodKS^7Id(q3>pUj| zjT^EmJ~T}sL^p@^1tqGyn^&)HK(nnCQk7-K+}*d#NRUl)ZMeHs>*r^ zF??3PAA|cHz`*R9`;eiHPfU0wMmrH)_Dje+CL_RwuY3U7>(wi4*ck(~DhcuNzjE6I z9>L-+ji%XgLgWTa#SZ|Oar$~UH#Q#2$`Y&P8NbvjclrwG9^R+Rpa0VWAh}w%>E_LP zh^K1n>n9F&*ZV8o1^uabUO{p~kaAB$MdiKMMfw|jd{hu@@~zkb@86XmRRb*B((;3R zwR14+1CWwyoSdZK^aA*5fK>z|@UyiQaT9KC6}L!UMP8F3(O7oa ztcI8U;?x!#T1Y7hiC~OA04JYzcw>7 zGqJNa(O+ysf1Zll1HM2=E(TGE4}=;79UUF9qZBr6x3?oxdQ2lB#ROaX@yl&)zbBrn ztCnZ43Q$4Pm!wr*(lf!&&yOGud6*$`vTM2>^0)rIR- zg@v&pWiZ*i1gMa(-{pJl0CYe$d6S#FsQWGWf5e|;XJ;cj{owFWPEk?OG=K@est)RZi@+km zxjG$Tq1X7CVRe1|qJa#+P|un}Um~$8JWPL8^ zNR$p^8Cbm~ilV=D>zbfoOkXxYko9oz0S$o;d@NgpA!llVv4(iB4)Q2}7;$*j{cw{4 z^b?STa{v_KaQ@E$E!HL#|$56?Ac8=G6xmkkKnJ;GsR>=V-W5NxDWv=}C^%90AP#`E4 z{9Uhp;7TPZC@2}tcL})>u#t|Uk->F3?1+PVg`+IWA7dEjE)&W967q5O7^9ulUx-N% zINH&#hDiA`r?CfM42XW^)p8sBqBYpAs{GJiTOYXhBB#xiYgcM&YO-}}PS@7f>TJw* z*u^VZ^rl@(kdE?(D~^L*uSF~$F|q8Pz510U2+AZQ)`X+4I8V!X?|kx)jHE*7V-T5q z{j$aHv{4n~e&hvl`yX=mtD<0*kt`8#C}amh7J|>)28fHe_8v!=Bs=BVfV3tJQybAv z2!@g04k5q8gx`JhRtqo;fc59?Fh9joHX0e2@Re!Ne_9?COhWP!e(xp3LD$r2S9EmhJsISE@M?&rG;%lMFZU1|EBqfP3d~ZPhMaM_@ox(V z2HA~Tsa~v%ju;~7IHjN)A0n&(D4kFs0BlW;VH3F1AH%&M!jK4NMzZVk!2Z8;$pjox z|IcKDaYrofjhi>amKuNltb!xs1uz9VXGVcF1o0%Gb!cWthjZySJ8KLqD$j5Q4Zl+r zIJldl{stFJp~q&n!a=)+qm%`B9&4SB~fW0 zdlf~cq)@U)R)n%5Dw2_w2$h``k?fF_Ss97Q&R!u!l8ns%_pH0;egE(C>GM3#eV6=P z*Lfc2aeUW#7iCWOWEI~R`54uE=20#zDY{v**gOPZF-A98aBG8>e4?Z}79#*vz=Q&l ze(0S@ns$uA{G%;fQfDya2wS&_ zvG2cfKVbogX*#ewAeb7Bb8jYZ>Iqa}rWwbI70Mdx%-;(nXNY+`_^EY!wszq)@p9iS z-nqH^x<-vnOwvuOSPFi=-!rg?i*?qnUw;#DgJ`>`O~*b=XjNt|Ci$*>yn&>GElw9N zo$V>P@hR7i3*v$3y7RoB!v*3TRRFZlL+Sx6H(PPa2hH0WL1}bR36Wt2z2Hh8+%pVGsmFqY-d@(DoQgHdO zQY-Tc9@D$Z%HF0yjLo02tv3TW7`Rk>4QH_H+~{7j{e&I2?Uk)lO`OAFh4%@l+&WL} zi}FvYo{yYe3Om7@kQpg>Gzy$d{I6P^{y@Ad8;?bw-YO-<2DjYhuX>HpMI>Ww1N9{M z{MZ$#h&A2UCsw1pEPGm~ZDS=F!wDeeKHyVP@8a+@w0~78qL@%G<>@gQzR_HHR{qzf z?lC+9LZ-yV#s<_pZB7-ODnR3*IQPCetBm>A@3tLNxlDckLqyeQ{uFxpY1?bd8Yx$r zjxX0*f5XMaMFq&g{mpyVkRed8c-{kWdv5qlJ3b+SYS*NHLl^j|z)4hXbDZiuh*7|U zoeo&tj!w?#?VZ)nwbD2mat}KF++n{gl`B#iV@7qg68k<|_pAF+^9j6x9(etSW&%H= zke=rKU99LlHKGGvBiK2}Z_EBW0P%jv_+iYzlO!5JMJI^2Orz;*0?$-9SKa!%{w6asn4cET&HX%vu=;Q;s|GN*d0(7qrzm^DbyP+;H9 zJD{7}6)Zf+)4@# zolzNu16icaP(9Gv>Il3bn{R-ax_p&Kx@XaF8crcPADnATSE z%ErrB=@}S4ckTi^OmrCxbVu^O7&_nn1_kJo%io$k+7H^O>BKU-^Zyp|_2RYed?k(n zETnu0NCz+#1_%Ymi%yLHq&HMitDdXuyXn7hbyq#KbQeP$ z$c4HBCwqtCdfJ=I8Oza)tlhBTHt41`U{5`Yi;ETgZV$XqkQ?9M>^d}_yAES*x)^neE>dS+QK~C*NL-SDn!K8Yezp1L>_qXNAUI? zbMhR=w=3X3OLIUdluL{Y$ z1ZpF+O)vk-YTVQ$$a>hqkD?c+uz_Kd$WhyX;>vRwGcgajN-sovK71XEh4%bRj=-3C zCz=+VB}5>X?zZF#IrN)`hRpEiyjP;qkG6YBrlofr6z1~R@r$4QCl~m)vRG_+%=G!& zf|6X`tLD^ntyVwvF$D}5SXITjQcxjiv%qWL&=ZhH@9H461;5dYMhgFW8#gySW;_h0 z*9tkLB2s@X<%@t2yQ(eL3Y-ko>zhV1oZ{pY-aq#A%LOAEYH9+%;YYc3bxRFy8{v|X ziPYK0;-wHLd+ZpUn$)>d&(9XJ`o@@61(5^d%J+`SZ=oGI7dh`Ra{8hOm7EvrBS&go z4S7(@IjW^QY|Bx9RrV$>%5~?YXPH&WD(3# z@wQE#UQNLEMLW>D<>9`wcDeLD6%_>-O$H;6)UaM!hW4QpWmZL7`(6IYzr_1TEFv^; zG=RX>}ID2*1Y?Y(8d|if4XaEOTEU_j|TJyqo`+VS3HjKOpb_R=jMEG+uF; zFHF<-MFRTrnfZy@-hlyHpJQs*Tp;uU5$<^Hnk)`u;LT`7Zh}_v;TGA*Fd(6!pC!P4 z_t?|J=rp%v_f7-N+l~f%dc5|)1cPpljXv7|uiTc8sAOC~3$R{?E?+k=-~g2_x86Na zVW)szZi$#Liok6kbH^p7m{-z@h=@3Hx}n?=!W$LD{Z#y0kTF#bg@9H|+S|i++3z3H zWx7$;57-+c=8(&Ev`8N_&6S@8O!_{FS?8FSc+zoCJrJJ$HMj zqM)f=_KAllOPkwinT z_v%6Y0S>8tSE;vxL0@;0wjaOJxBZi1mjqf;GU@$&Jt=D#7>fY5UWF;x4?*Fi0cQwo^_DhI7owhu2H0L?1tX98U|y5N#FF5mt`6 z4g_lbz&JC(l1Ahl{{A$|%C+^9N?!_wzkTy&6Sw$OcuHrzd)&1ZvS}@6BKo(O2ICwc zT#lzF{o!xcpxf|@+(D`*pUGKMD?QB)IGP}Pb+?WLv3@J{rChml(UMV}=C2_AjhFJV zzoOt$f8UR*mD86Q6=g$nfA`bpFDK;$G@_G!HmWI0@?H9gF0G(}o8}No(#Kr8et8L> zI8O@QqPN%2$;kni`A|{w2N4ncUe>^^TG9-!4zsRchune*6B#%dyrb%TeV`t_LqqcZ zdB^Sf&mP3=0NQTArQol|_B+!f70UF%ue^LIMm8v!Y{1ESVcTupySHW7rL0fuUT95-BGstE zM9OKZkY<`c>!5?`pLmrqK3-|Hkqjp#=AKH&;1U)2>QI0oe)S{&=Y*!ikV{YV`L^Gdnf-d{El9+>o8n6#gX_2GEDb?j;M zz3}HkD4-%f;}9v~#3<;l~&JC?lR(UPYkwBL?JB)Ix)+~#oqQu8?by1tiDO0L?dh?~VM;JL}Zei*EDTw0dKf1>RvQs9b9nYDYi<+)| zuAabzHThX&YOiJU{b@y3IXO9QUS3}Pstqe|8wtY&L`3CRT5W_j@)ZRPykA%1oBg4^ zeKT+`Qa-m#jcjJPQ}5X$X+OACK%k~~;hacl$ow)bCB+Y4+okOF^4jeGDAt#4+w~vW zJzn~@aI}_b%T`VGJxSKdn{Q4%InC|ZKKP#67N; z8FUWR?^U=g%|l=)f{}3519LdPJziL|clL2yF_bkx9!Er`AY6@@_CDg5)(=y~5A9X- z^e^_)itVO^ok<$?xs$crW^}zMZv&)YWW>ahR7o?Cz8kR@l2-sQUogvHBYp_jRLT+_ zRk8Px2A{D1#DsQ?RauC=PE1@`w$GopB5UzauR%}eVoKbgdRk)rz5*)7;Cfr5YUVMnq41bVf%Ic!Zs{Q%$d^1dHMQ}9V8gx-d%Hnh#k`&Mx|pIb+^{KgHq!VQB{TKm|2bF+ zIR5SmYA7uW4(|whUI`tZW}$wZYGu0wPXn8l7!KWY;{H6N+j?ujY z#^>r?^B=uby58^O2M&RZlF+b6vR3QWD1+PMt*w*uF0DK-|7Lc}$z5uB5*>r7(idcJ z$21IwPwAI^ZO85~g60PsMfLV(dyGK%OemjpYWdLneLVWz{rCM_SM8$AgN7QKB27_g z_GkPUANz`(qME!vyxVw`!<+xTMuIBsSi!^^%%eAf^=^m03n!hdjZLcl5Go#bm($P| zGUNg_*f2lxW0SMqj-(K3p;gA74YDrEiBx~ZmHCJM6AanhSi7zTGCtfB?(#OENg~~X z0$9(WP8PVhSXgX%LxcaYD@*}s3^-Tbj(Pcvb8l*F4KXqs@aXNsajL>AqS5(-K{$p3L+{O^|8C`&=g&Q-uL6gN^9T>v zv{Gr8f7$Ocj&>XmXl|Fy9nsS_R*VTlZ)j%r?90Ny=%^1SF*5z{bNI5B@ZJFBAso~H zAqf!9kl>=&bXO)>Id7;YsC(@?modw4oUGOSRbSD1^PlB(YtJDk<-g^RRQboIL4F&v zbakxPC%N*mQdPI?O8DC5bpmArYV?Y^834x}pj;lh1}IRPEwV_h80&xg<_(w|uE#D= zDE3|M0O}4&p?Y+M3Mko7-(uTdkM@Fdy(5x7Ywz~-7%f}Ad_rasfCmV|0>w`#d$!Pu zby@17&x8KKNF?-$YQl~U!MRK{gUuIi%WnIW{pO7<2zdJJq-2U!Wi~{YDs%54$x3TE z65l|CmWZv^&a&7*kZnAU{IAQ>bTa97D@QV01;;s`Pwg&!+%nTv>Qbse#b25e|36dA z=gGfom*vL>kt&-t<0s#m=Nu{Lrg#TZKTgVeU$M(lMP8W+3XOA2?*9J%(2cGHk&#C! zFsWDrLJbWe^qfE@Hhd@o^)cS|4&CX#DRR94A`gV#m`xrkP5CQVBu;+5B75OU z*;^oQSe%0{*RNfZBI=po7Yjdn-{v|^>>BH*foyZ*MtaE3!5|E86a}W(=*K^&lA!K! zTM)M?_w^aSzJk8y#?p43GT(54Juj)3;=TyN$NAqlN;WF=COgSq9<*m=VKIg>z+*lO zB_PSzsnt(4f%#~g7RavGXL6qW2O|EH)5EZJ?|Ls%Zr5*H$8Nl$M6Wn6Mqf1= zx?)V$&L)|$vCBX(Kozp5umYz%`Pp#Xj`g3(vY^GysC6TjP;QR7VgU$ZAkngOyHzpV_u>;w)CJtS?Qf(B4QdBuwI@;=Os1!I1?DQM2c zk8Tioy!T?w+%+PF3Ux@A#i`?n7aZD#m*TO@Zh7^ETaHA^nDA^2W!3h3hvW(Cn(AsI z8FDI)-+Qrv_?_!`7DWH< zd8c<1+sK}O!`~wjt4*trPHd#d?ZSd$_IWQI+>o90D{w74zXIlnEx2>Fz)$(qsd9*A zeZcR_8}O}7D!zY=iyUN-4Rl!(r7nOjl`%EkgFW^*8ndZobF$sN^M|*Av4?9UGT{Td zFuNZ;haXqpTlsdCV1YZp`w1BtK|w~$K>NYu?>w`I5PzROX?IyCYNmJrdwPP!29)a( zRfr;|m2ZaNw)EL8Xor<9q;neHv?^3G7YVhU{dK`?skAHW;h0piYQjfA@1&szh|<$k zZY0!$qyE&y{=CKtV|ZXgud_6do7PI7b15%N4*OH>mu(aOpFA+&r2LS@x)QzETS=|7 zPhJ+WbLPh$x8$S6yOq_}-l!G^IJO_7a9o{~aZ@mzJ8HEt$Sb9=k01z+5sk#CR+g?0 zq#!?KT)~R$gV+m20ED8E0*@|4BT%HMYuB}FG*ihQuxL)M3=rX*5v+FseDvs37=+_! z9z{O{5^p4?PS7XOnn|Nx8Ck3tRbfgK{+gb=PaoE=F2N4UAy-!!sA~DY+~!R^m6XNZ z3@}l+W#gLFtFyj^4jPnZ4D<)2oa~4_v7W$g1uYf8?1ft{=CB0L&q!}bvJtV2&5^grk7JWAZc=8y)F z_GDZGOxUln?x=(h__5Q^*KMzi6iruqDP^+diI1C|(`Z&pNd2MBI6dX$dSUL4Y17fu zyT4O0s0Y)rlD#IR4j5s9ke=7_(U*rFfiHE>%G-VG(m&#gZLsZ1Lw?@g>&2FTdhZC3 z`^ANZUAyYdtIhvu0jRW7G`V){DE+>eF}XcR@}W4Uc${#3JBxw>0)(0*%*OYZC7V|D zrP)5LL=}{^pfpJRHHH3P?ZE?jqtvd{OfK;}b*JmrOo}0cR{h%_Tgf@+TEOPpQA`*| z4EjbE>o;%q#+HYXek~=OLpTCs8)kkX`Gzc;PBw^qgFkN?t&dv;3Z^2TY!qRqpXW}L zH=#)svic-MKoDr2$U&>-46+9NYRHLOJiNTJ>gvqEUUz)G3I|1bvQ8%c^ox~+bZh$> zQqJrpGA$)*h&6}2;SE_;z_-ER#LXOX=sKHd7k9 zfU^qC;@ieuXyJ$l5a<`r`>WFSgA4?+z*(|gSok5!dXE)>3b#Q`3%8UPUjHpZs28-Q z`#Q^sYy-f*sRd+z#LV1?lS{oLK#DpfY01*YMPfG#$`~^h6;(kk(H#J=5ba*C$b);` zB~d?J=f~xraqCbVL8SDed&*7Q7u^)}?tS2EM|Pa0@keuiu8WIXEAsnUoPhJi2GSQ|BR)ySd&n9@bJ}q<5aq==Gc&1y zITmJSBSK=ny1d7}9fwC>la^uNh(UrnFKB6>6Yj`_cnyN|sJGXL%F5TbR;+(NIYy`; zJTt4Vg3#$aV3FepTELxgLal%@d~&+3RV8e<1+E&zf94L*6@o87OI*D@a!)GFtr_xi z$kbz>5Ak_42qDt*HCTm-n650E`@VmWwU8IK56nV=W<{rY10OXn4GhXEcEd>@xOqwW z;DT79R$7gN56%VXEh7?q;zqVcMn)3p_6y4vfx*SG=9JC$D=qC8y;3A040|j+i1V~s z+} zK1w(V6p)Y#KsolO?0SKl#(-vmDFQ2JlI;f!aP6i|_juHv^+2yvP}2^(2jGr7t&w0# z7&c2VKn%!#a?f{qn6A=MvmCy6Y$8HJsGuTYM3Y#EgInJOoR`P4dPoTRFt?VI;10BR zcUuD(Iy<0d#j93^gZ} z1qes5nQHn#OUU|Fcwoe#0TMl|MT?tR>EV06grG8J5gj#t@3WhS_NUKIsy@50`_HVg zcJt5c|6wkh6GHdcX3 zk?cIYMhgDgOsSexD_6b%YmGUr2l)vSwWBa)!f1>0;Z|!ZHo6fIb;9J^4pwhMySc*k z7~Uh1KQU~PVkS~(xPyj&sSn(mBmKwg$yXOUa&O@IS3{l&Z1ZK6FU$@j?KzB)jFdyS zMf>40o@U8|ZAUnCGR4_^V&6P6NXwbghnHSwTtE6Wkwtk#MR7J{0fZqtZyvxku`yk< zYL!X>6M~n6f=x6P0X%BUQe4n&%L6O6;vno8nvobNLmY8}lI{rl%XLscmtp3>DQQ&{ z@FVy6Mfmm_lnk>h4Z?mKULDS-o6XZByntP~})C9QCZjj*K2K;lo%pLe5iG z;Mf_^%nnE|)<9GSS_ylS8lo`}yY1`q=>k5C9P;#5h$B$x_(*2$N()l2A?A8QC~ORt z0{X8?kw}l{3sTE?er6oXqiAU0XpN5 zG%a*4C~#+?NP_8LD~1TuIyX!Q_(kOPME?cw$p~${N5(2N%%D|2CZ2cs*33^{Jeh2W z?Dx~BPx80kU@FgFG>6P}`imFG>SsUrP3yO|Rl@73U36U%TBp}lg7D~n`4~;p zFx`K~GAH@spj9q&7hh54MxG~oQa|Z)kX@j5)k_#G_cjy znHd>Bkh0VVr9ZUQH28PRkqdHPt5F+f}NBsbpDbJa771e_7!#bp&6+F^JxY#1cH~ zDyfK5FBaH*=%C;y^pT=rDfMZ#R^FX@3x@V4dMTP`nB!fpUnh$H@cma$Jy8B5Zo`ZI z@+qBbc52j{81JBCh`aK|K?+Cf|Vt|?`b^E0;mi;z0 zuD+1GxNFGL`ymQ3wRZKZ%D)o7RLVcA@bhDY4rJbw!slN}hJ~(4Q)}P~ zM9)z$`!y-9A9#*bVe!m?B#3K?0gS+Ps2i)Kl)-@)&Hq#+^fpjPz;|*3?*joU7s{7s zKrDbYMr@AYHlQTv2Pb#M%@3p$?osnLlBtRP1gP)wpKPP3vN1oJjCH&(1Drv-9KeuSHc$L^h?93h_} zW&B{)0SD+Cz=i4PW4eY!LzRe#hP-9ypQ1rtK<{10wJtj}G?cXd_^~Pu7{CO17nZnj znIfxKR%fo*yM}HI@SzMg#2dqW{z)Ud`yXchf12wX-ev<_=Pr4!qhgphJSkG7Vqx4` z*7^)|fVGlTW>>28bZ4u}z`($5#)I=~b#!!QP>Q!)s(~uv8FRcWNm4@fS(&G|=;>JU zD*fwyVT|3xVnR+g^dQ+uf{5EddAx<*h048^bvHZzwX0t~QsLzj-gZm^tF0UxNf@W| z>vfO()U>sa`ycF8ov;HtOf-mqDBo?X)mKq@_{8B29}(`36;5-&yXxiT#Syw$1Ii`i z@VMV8R$qH6dh0izk%bPgCR`Fayx_Or?><%G4csW@z)hk^GTj(q2Z!!1beYi_KqZiq z5DUl*YL&v0zCduhhAa^)DVZ|tEB38@MWRN2U%tLTRnx-qR^a=!4G^LLgA4xs(iGQWP$A|o%je9 z2GM_Yb#)DVodfuLqQS{tTpU;%L1(alUjTEK2D)>J^N&uDfE9Q?W;X55PHraP9ggW| zC&C=Jt0XmrNIOeBQwpW_IoAJkD%+}+3B?2oa>19nqg>+hdB18^y%gYrwOTL?RiXn0 zp?GV)duj15rj}R9`T5$pt6AwylrV|85jzM zZmX5=*+#y2it`F zl8gCzCn|~P4nD6t}^NjE^h_xvS z1V06DMgsXTeCu6u#kwU_7->cGOAWt=_8;wmmi=+Tz1>VuR}qsBk+#^{zNl)Q#_7ssGuKq2z5q8z#ZUqTL4S-U!J$G zmA(tbCMZ6ACg&rvvM+$QbWH`7bb)*v{?@d_E{pq2jiCAD5D)cV&im@kf5{~#)a&E9tPf49hrA<1HqQt$Ig*elbW9-@B~t5wP7uvF9GU_?v8ud* zW`3~a@qClCPtcG&%r+x<$qAs*BYDTr{B9@--jL^nv-EBRPS7Hv+aud2cqX#u`6$oe zfkO`sQ!Am{|EgM>b!=kkQ~tyk?!=d?dz8mor*Gfl=cC$TwAF+DEbD_8_qOuBON{yQ z#MjH$V->gW%^2S&H>;m-J+th#iUWmq6Eo{Fxx)|Sbi@x)uQ)eWSadKXG0op0KIw7n zD}Ptlq0f#xPE3!U(a5p+erC-1WbW_5Fyf9r&S?M1Dw}OC(;`b3TwC$j(wTPcl$Y!m zEi8C}y4*s0F}JW!?{bp{=?`By499$##zA}s010V>60`S04*lLk=GCX*X3n!iXJx@>WPd@~Wa5$}GOI@Xg`_86wP!0AfE_y~49TolF2Yug2>Y1)CHr$%t$M#hxQn6!WhHZSgLC#2;Kpc->7i|NAtJ z)0J;2ImRfXArjV)E0(J@eoWR8B_|=~$wwSrc2W^SVIRZ?*Pzj{3+;Y2=pc1AUAx1# z7sV)ESVUZW1Hj+cXv+Mso{O)i0_q}K=v){UU1k?Bc%m0xohW_4A3+yH%nkjlO!1u% zDn9d682&X@ob$S&xzk=PYnl=?SH|$?;T&V2tY5cI<@C7eSp^@8&=WqnnFkP z4)`A#cD1t@*UHCYx;qr^~dd?(N3|TGk&7+{nM~wTm)83y;Jf*PJwM$OFx(YU0TmQSD7nJ zuU6w)JNS6`%cx>Cg@u*j+x{2ZvQLg2x#+yU<*FOcLP4MKFZp9h4Z}yVuD=&doWimq zj6&ivB0;_7Co@Y=j1Yk9ho;PbT`LSY@%j6{S!Yh8bO!t+fq{YGM~Rw~G+AA)bJlQ9 zs02!sm6rC5xh?G{;&bT3)??m1Z9T#!WaJ(Y;TSi^;A{fUuZlmX2g{^_&;gi`by|Hd zrJc;WnVxD=d{8W)C$rek5Po;k&q5AK0xmS;Zn>h_BZEKQYy0S1cFm*>5@9Lj`*!5a zXFe)YZA-)TOZ^-veKX(p0LlPl*L!g3HzW9=+YcT*xF)@ZMAEq}%^4m5QHqQar-%YG zXavXmyakQn1Gzl)ICVN6`hP~aj}HM?Nc)mi`ukqa?+p~5Ila}!E6!tGinl#GSA4D| zTX-%QwccYjryJMy?J-aKEPtO9Zhs=f>ZjMfYsdw;knC%gqbtVXY8t$6D(+ld?(^L_ z)>rbk(A|tSm^}d%mz2~ih5Z&)r{NyZpl+}jYdJ5p@wAEx6^t<;Sr5#OWMTud5mpN$ zaWOZNH_MC@{9U20doA9gcN6~6Xg6ru@8AD5yB}A}m^=aZ(>&)SICNbc`_uQLoE$AC zZnDP7ro%gOL}T?M&23>-@xs*RWKGM61D=o*Lss{vZ3z{jm6Vi3Q~I;LD2m9D7pB^U z9e)@RO#oQ}YdB>XGFz|9&FOucyoQPx8y9yLf>-#VMWB1z5a`~7ya^m{4h}Dq$E&(= zuLPt$hmRlkOs-w2S7XKSOWG6pspNS`KS9##H}S2Xkfj5tZTZy>yXB<~3 z_rf_unpFaE63|b^dKE6CT?a=irdt!3LcgFuMCdK=D^#dSzv{9ztw^JLx~=^;ca6z6 zf9=4EPA5Tg-;+Qun3cq+zZn5wP+6PaY6YiqK!(%jwach5zhH1pXer~$?-a;7nF_!Z z3{@Z27>Ef4M@)r0Ml92g-%HrR`FKvFVISsJvn@nc{=KC?;#-TK0VK1a0GPY!?5@8T7tV0 z@4KPPO}bRQ`GB#p&o_Sazy?#LO~@SydG$JRei zJj~=jfYbNEy-hxBlZBkAXi7wgA2}{DLDn8tU2H@$${W7-k{Acz%ULLtULn zK?qJmv}gd06d2FmV?2;I6}@i>Kc_sn8=_Nz)1NfIm)iz2GDMhJS)HYommPKoY%DA5 z!F!__gg+i{<>D691X$v(@n?-VNZAe7?+geI-t)M^+d3)j?s~Klp496^|Fjd&JvUJl zSaiyi+GkyDPE}`UJj&uWGjE*kOUO+N>zGa)WBS;{Dua0>Su?4n=k`GbHf&}d=U1-) zu-|7BUkPKm`)eZ-ESqj#%RzDo31s!Ys;aZd48@of6R`E$MMc*`$uch4pjgdhA1wXV zcHjIX@ll0pt5l92*6D%dqL0alT0+DBYov93$pGyVr`tTqbbbwg?P(pI;c<2wcodnK zm>z%&gAZ!2r+Wm71?bc|w19u;P2#a5QA*(0ZTyn(n=o%+p_1Q+U%a_Jt2HEH6GdZ! zW0NNaP{P*${02uyup!b*k}Mt)wFFze!<;jubnw${g8R@Nlk`*2pV!r_FRoG>_)h=Zugzwb9iA=>l6PB1k!4dmy= zcLjt*WXgzVc#0!xa`u6?wLPJ*JFc`_le&mCNLFPJ);T=n;SNzqVS-W2Rx0A%yLX51 z14&&O(Y~m$D!`1AB>tVdlETvd?3htouPwJLr`eyDN5~jg7Cm9(`h@3*(m&C;0IP74Mqx@XaIO^S&sK%8PZ+oSkCh=@@Bd>zor%V@>{}j)S zlwIUdjS+jm!^HaKYi4qUW&39));EpXjnHRjbje%!qeDi*ujSIYbp6Fo%X70`T+0gC z7uKC8KU1g@N9NNHW};|@=GhLc&rDBT&YY~d2OXcH6q8B>Zb7rTnT&RIjIoT~gMxcB z?DX(vTsLR(v#fgm{=J3E`5I1>Y{#XvF2U4knZs*i7gCxmo_-P-cO4mZO)<+aT|P+7 zvyWfq_>*5Qjn(1!tlL*IU!RA#*we#T(EE^aW!@o+u-tQ5<5pP zjqcBCi*uNt9@1pN(>%KP=5H4*)yH9~!1|z(J7?r^Wn!#;q7wV$wbsMTSu`cODJ;lH zZssVylCM8G!fzMV*;XUzMyF%hzI@}ML+4r_D?MYIqtFE36ocN0Z}fOZ`3kxlC%(Hh z8K*byGc5I5vAC=2TVvOf)|&iIgKw7y)21pr&9%bsCdi$5qVcq@(Q+r-ReQyq15w}d zty2f00`Cv}?dV_px4eBfQZ(82X>dJp+Bt{5)aXd{frsrEEtZRwiBxq_&soqtOPbcV z9vijY*Mm}%aXg{P0{*765@DULh71|A{;!QtGZWVZtef^{xFs!l@3|dmx~EJxWV+Er ze=f-HdHD{{ZuG{+ahXAW%81_q%H!;RT7bE5$EB1MYl|T5R2i+6u?$9rQ%hJxiQ!lK ze#f1wNoum#^mjFuR(vKC+m{(tYTc)G&mUdbLl+--dJm2Eg+U}vcx5K1-Rj7`H&>DH zp*<#JD}9DY$TvmnokwUA7+&VPnru4%NR$Ijb68sOd!}SjoO|Aw_y+dk`;&|!A znzTC}osl_H&7mUtW&7?b%>%x;|7}w4x*ccFA$}TbF*a#4M{j55q&%VT35=`hj`)~h z(a^*wiLVpCj#k-vlS!cg=US8dxfQAT&Pm!IUKLadGOqebiC)Odl<1-3QE~JU2C*idV}z zl$4wHB&VckEB%Z1(L_O6=XP@~tKedh4f<7w@}1p;GpnL>0@{s3=gHCC|c%L zmbZtrgZ~QpqqNYK7R%NQ1nICOY&ySzb?ZR($Fs`JW&*5ZOQ~*I?eVeI8EiX)

s#oK8BBRiDwA>LO3p*8LgB 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 + + + + Wenet Web Interface + + + + + + + + +

+
+
+

Wenet Dashboard

+
+
+
+
+
+

SNR: 0 dB

+
+
+
+
+ +
+
+
+
+
No image data received yet.
+
+
+
No uploader status data received yet.
+
+
+
+
+
No log messages received yet.
+
+
+
+ + diff --git a/rx/web_viewer/templates/index.html b/rx/web_viewer/templates/index.html deleted file mode 100644 index a581b51..0000000 --- a/rx/web_viewer/templates/index.html +++ /dev/null @@ -1,65 +0,0 @@ - - - - Wenet Web Interface - - - - - - - -
-
-
- -
-
-
-
-
No image data received yet.
-
-
-
-
-
No uploader status data received yet.
-
-
-
- - diff --git a/rx/web_viewer/wenetgui.py b/rx/wenetserver.py similarity index 74% rename from rx/web_viewer/wenetgui.py rename to rx/wenetserver.py index ccee80d..8ae5c48 100644 --- a/rx/web_viewer/wenetgui.py +++ b/rx/wenetserver.py @@ -25,7 +25,7 @@ import datetime from threading import Thread, Lock from io import BytesIO -WENET_IMAGE_UDP_PORT = 7890 +from WenetPackets import * # Define Flask Application, and allow automatic reloading of templates for dev app = flask.Flask(__name__) @@ -102,6 +102,27 @@ def update_image(filename, description): logging.error("Error loading new image %s - %s" % (filename, str(e))) +def handle_telemetry(packet): + """ Handle GPS and Text message packets from the wenet receiver """ + + # Decode GPS and IMU packets, and pass onto their respective GUI update functions. + packet_type = decode_packet_type(packet) + + if packet_type == WENET_PACKET_TYPES.GPS_TELEMETRY: + # GPS data from the payload + gps_data = gps_telemetry_decoder(packet) + if gps_data['error'] == 'None': + flask_emit_event('gps_update', data=gps_data) + + elif packet_type == WENET_PACKET_TYPES.TEXT_MESSAGE: + # A text message from the payload. + text_data = decode_text_message(packet) + if text_data['error'] == 'None': + flask_emit_event('text_update', data=text_data) + else: + # Discard any other packet type. + pass + def process_udp(packet): @@ -115,6 +136,16 @@ def process_udp(packet): # Information from the uploader process. flask_emit_event('uploader_update', data=packet_dict) + elif 'snr' in packet_dict: + # Modem statistics packet + flask_emit_event('modem_stats', data=packet_dict) + + elif 'type' in packet_dict: + # Generic telemetry packet from the wenet RX. + # This could be GPS telemetry, text data, or something else.. + if packet_dict['type'] == 'WENET': + handle_telemetry(packet_dict['packet']) + udp_listener_running = False @@ -154,10 +185,16 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("-l", "--listen_port",default=5003,help="Port to run Web Server on. (Default: 5003)") + parser.add_argument("-v", "--verbose", action='store_true', help="Enable debug output.") args = parser.parse_args() - logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', level=logging.DEBUG) + if args.verbose: + log_level = logging.DEBUG + else: + log_level = logging.ERROR + + logging.basicConfig(format='%(asctime)s %(levelname)s: %(message)s', level=log_level) t = Thread(target=udp_rx_thread) diff --git a/start_rx_headless.sh b/start_rx_headless.sh new file mode 100755 index 0000000..cb1f504 --- /dev/null +++ b/start_rx_headless.sh @@ -0,0 +1,159 @@ +#!/bin/bash +# +# Wenet RX-side Initialisation Script - HEADLESS VERSION +# 2019 Mark Jessop +# +# This code mostly assumes an RTLSDR will be used for RX. +# For the lower rate variants (4800/9600), GQRX could be used. +# +# This version of the startup script is intended to be run on a headless +# Raspberry Pi 3B+ or newer. +# A display of imagery and telemetry can be accessed at http://:5003/ +# + + +# Set CHANGEME to your callsign. +MYCALL=CHANGEME + +# Wenet Transmission Centre Frequency: + +# Default Wenet Frequency, as used on most Project Horus flights. +RXFREQ=441200000 +# Secondary downlink frequency, used on dual-launch flights +#RXFREQ=443500000 + +# Receiver Gain. Set this to 0 to use automatic gain control, otherwise if running a +# preamplifier, you may want to experiment with different gain settings to optimize +# your receiver setup. +# You can find what gain range is valid for your RTLSDR by running: rtl_test +GAIN=0 + +# Bias Tee Enable (1) or Disable (0) +BIAS=0 +# Note that this will need the rtl_biast utility available, which means +# building the rtl-sdr utils from this repo: https://github.com/rtlsdrblog/rtl-sdr + + +# Change the following path as appropriate. +# If running this from a .desktop file, you may need to set an absolute path here +# i.e. /home/username/wenet/rx/ +cd ~/wenet/rx/ + + + +# Receive Flow Type: +# IQ = Pass complex samples into the fsk demodulator. (Default) +# This is suitable for use with RTLSDRs that do not have DC bias issues. +# Examples: RTLSDR-Blog v3 Dongles, most Nooelec dongles. (anything with a R820T or R820T2 tuner) +# +# SSB = Demodulate the IQ from the SDR as a very wide (400 kHz) USB signal, and +# pass that into the fsk demodulator. +# This is useful when the RTLSDR has a DC bias that may affect demodulation. +# i.e. RTLSDRs with Elonics E4000 or FitiPower FC0013 tuners. +# Note: This requires that the csdr utility be installed: https://github.com/simonyiszk/csdr.git +# +# GQRX = Take USB audio from GQRX, via a UDP stream on port 7355. +# This assumes that GQRX has been set into 'wide' (24 kHz BW) USB mode, and is +# streaming samples to UDP:localhost:7355. +# Note 1: This mode will only work for low baud rates (~4800-9600 baud), +# that can fit within a ~20 kHz passband. The baud rate must also be an integer divisor of 48 khz. +# Note 2: When in this mode, all the frequency/gain/bias commands above will be ignored, as GQRX +# has control over the SDR. +RX_FLOW=IQ + + + + +# +# Modem Settings - Don't adjust these unless you really need to! +# +BAUD_RATE=115177 # Baud rate, in symbols/second. +OVERSAMPLING=8 # FSK Demod Oversampling rate. Not used in GQRX mode. +# Known-Working Modem Settings: +# 115177 baud (Pi Zero W @ '115200' baud), 8x oversampling. +# 9600 baud, 100x oversampling. +# 4800 baud, 200x oversampling. +#BAUD_RATE=4800 +#OVERSAMPLING=200 + + +# +# Main Script Start... Don't edit anything below this unless you know what you're doing! +# + +# Do some checks if we are in GQRX mode. +if [ "$RX_FLOW" = "GQRX" ]; then + if (($BAUD_RATE > 10000)); then + echo "Baud rate too high for GQRX mode." + exit 1 + fi +fi + +# Start up the SSDV Uploader script and push it into the background. +python ssdvuploader.py $MYCALL & +SSDV_UPLOAD_PID=$! + +# Start the Web Interface Server +python wenetserver.py & +WEB_VIEWER_PID=$! + + + +# Do some checks if we are in GQRX mode. +if [ "$RX_FLOW" != "GQRX" ]; then + + # Calculate the SDR sample rate required. + SDR_RATE=$(($BAUD_RATE * $OVERSAMPLING)) + # Calculate the SDR centre frequency. + # The fsk_demod acquisition window is from Rs/2 to Fs/2 - Rs. + # Given Fs is Rs * Os (Os = oversampling), we can calculate the required tuning offset with the equation: + # Offset = Fcenter - Rs*(Os/4 - 0.25) + RX_SSB_FREQ=$(echo "$RXFREQ - $BAUD_RATE * ($OVERSAMPLING/4 - 0.25)" | bc) + + echo "Using SDR Sample Rate: $SDR_RATE Hz" + echo "Using SDR Centre Frequency: $RX_SSB_FREQ Hz" + + if [ "$BIAS" = "1" ]; then + echo "Enabling Bias Tee" + rtl_biast -b 1 + fi +fi + +# Start up the receive chain. +if [ "$RX_FLOW" = "IQ" ]; then + # If we have a RTLSDR that receives using a low-IF, then we have no DC spike issues, + # and can feed complex samples straight into the fsk demodulator. + echo "Using Complex Samples." + + rtl_sdr -s $SDR_RATE -f $RX_SSB_FREQ -g $GAIN - | \ + ./fsk_demod --cu8 -s --stats=100 2 $SDR_RATE $BAUD_RATE - - 2> >(python fskstatsudp.py --rate 1) | \ + ./drs232_ldpc - - -vv 2> /dev/null | \ + python rx_ssdv.py --partialupdate 16 --headless +elif [ "$RX_FLOW" = "GQRX" ]; then + # GQRX Mode - take 48kHz real samples from GQRX via UDP. + # TODO: Check the following netcat command works OK under all OSes... + # different netcat versions seem to have different command-line options. + # Might need to try: nc -l -u -p 7355 localhost + echo "Receiving samples from GQRX on UDP:localhost:7355" + nc -l -u localhost 7355 | \ + ./fsk_demod -s --stats=100 -b 1 -u 23500 2 48000 $BAUD_RATE - - 2> >(python fskstatsudp.py --rate 1) | \ + ./drs232_ldpc - - -vv 2> /dev/null | \ + python rx_ssdv.py --partialupdate 4 --headless +else + # If using a RTLSDR that has a DC spike (i.e. either has a FitiPower FC0012 or Elonics E4000 Tuner), + # we receive below the centre frequency, and perform USB demodulation. + echo "Using Real Samples and USB demodulation." + + rtl_sdr -s $SDR_RATE -f $RX_SSB_FREQ -g $GAIN - | csdr convert_u8_f | \ + csdr bandpass_fir_fft_cc 0.05 0.45 0.05 | csdr realpart_cf | \ + csdr gain_ff 0.5 | csdr convert_f_s16 | \ + ./fsk_demod -s --stats=100 2 $SDR_RATE $BAUD_RATE - - 2> >(python fskstatsudp.py --rate 1) | \ + ./drs232_ldpc - - -vv 2> /dev/null | \ + python rx_ssdv.py --partialupdate 16 --headless + +fi + + +# Kill off the SSDV Uploader and the GUIs +kill $SSDV_UPLOAD_PID +kill $WEB_VIEWER_PID