From 7b3854e6ca2d65502a7c6e7dc0689ae84bfe049e Mon Sep 17 00:00:00 2001 From: Starbeamrainbowlabs Date: Thu, 15 Nov 2018 18:21:45 +0000 Subject: [PATCH] Initial commit. Code from Bnorman --- .gitignore | 151 +++++++++++++ README.md | 3 + decode_msg.py | 57 +++++ gateway_packages.db | Bin 0 -> 393216 bytes lora_single_chan_gateway/__init__.py | 0 lora_single_chan_gateway/board_config.py | 270 +++++++++++++++++++++++ lora_single_chan_gateway/gateway.py | 113 ++++++++++ lora_single_chan_gateway/package.py | 36 +++ plot_db.py | 78 +++++++ print_db.py | 36 +++ send_msg.py | 31 +++ 11 files changed, 775 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100755 decode_msg.py create mode 100644 gateway_packages.db create mode 100644 lora_single_chan_gateway/__init__.py create mode 100644 lora_single_chan_gateway/board_config.py create mode 100755 lora_single_chan_gateway/gateway.py create mode 100644 lora_single_chan_gateway/package.py create mode 100755 plot_db.py create mode 100755 print_db.py create mode 100755 send_msg.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6d910af --- /dev/null +++ b/.gitignore @@ -0,0 +1,151 @@ + +# Created by https://www.gitignore.io/api/python,git +# Edit at https://www.gitignore.io/?templates=python,git + +### Git ### +# Created by git for backups. To disable backups in Git: +# $ git config --global mergetool.keepBackup false +*.orig + +# Created by git when using merge tools for conflicts +*.BACKUP.* +*.BASE.* +*.LOCAL.* +*.REMOTE.* +*_BACKUP_*.txt +*_BASE_*.txt +*_LOCAL_*.txt +*_REMOTE_*.txt + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +### Python Patch ### +.venv/ + +### Python.VirtualEnv Stack ### +# Virtualenv +# http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ +[Bb]in +[Ii]nclude +[Ll]ib +[Ll]ib64 +[Ll]ocal +[Ss]cripts +pyvenv.cfg +pip-selfcheck.json + +# End of https://www.gitignore.io/api/python,git diff --git a/README.md b/README.md new file mode 100644 index 0000000..b9c126e --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# lora_single_chan_gateway + +Base on: https://github.com/tftelkamp/single_chan_pkt_fwd diff --git a/decode_msg.py b/decode_msg.py new file mode 100755 index 0000000..c935bb5 --- /dev/null +++ b/decode_msg.py @@ -0,0 +1,57 @@ +#!/usr/bin/env python3 + +import struct + +MSG_TYPES = {0x01: 'PING', + 0x02: 'PONG', + 0x10: 'Weather Report', + 0x11: 'Weather Report Request'} + +PAYLOAD_TYPES = {0x20: 'Outside Temperature', + 0x21: 'Outside Humidity', + 0x22: 'Outside Pressure', + 0x50: 'Inside Temperature', + 0x51: 'Inside Humidity', + 0x52: 'Inside Pressure', + 0x80: 'Battery Voltage', + 0x81: 'Battery Current', + 0x90: 'Solar Cell Voltage', + 0x91: 'Solar Cell Current'} + +def decode_msg(msg): + binary = bytes.fromhex(msg) + + if len(binary) < 5: + return {} + + decoded = { + 'to': binary[0], + 'from': binary[1], + 'id': binary[2], + 'flags': binary[3], + 'type': binary[4], + 'values': [] + } + + for i in range(5, len(binary), 5): + decoded['values'].append({'id': binary[i], + 'val': struct.unpack('f', binary[i+1:][:4])[0]}) + return decoded + + +def pretty_print_header(decoded): + type_msg = MSG_TYPES.get(decoded['type'], "") + return '0x{from:02x} -> 0x{to:02x} (ID={id}, FLAGS=0x{flags:02x}) TYPE(0x{type:02x})="{type_msg}" '.format(**decoded, type_msg=type_msg) + + +def pretty_print_payload(decoded): + values = [] + for val in decoded['values']: + values.append(' (0x{id:02x}) {type:20s} = {val:15.4f}'.format(type=PAYLOAD_TYPES.get(val['id'], ''), **val)) + return '\n'.join(values) + +if __name__ == "__main__": + decoded = decode_msg("ff100f0010203333c74122806ed247804c3751409000000000") + + print("####", pretty_print_header(decoded)) + print(pretty_print_payload(decoded)) diff --git a/gateway_packages.db b/gateway_packages.db new file mode 100644 index 0000000000000000000000000000000000000000..5b3e8b4fc90e1a02476690cfe720d48d2821c9ca GIT binary patch literal 393216 zcmeFacbuKok*9wpwZd&l-EF|+(Bv#`4kC(tK_nrPNFoW0$=QJ6Dt61*2Am1DamJXj zQ7}#z1I9#&>~S93<1qF(;hf#Sr_Ot;&h38R((deU|KPJ9v9ot)cH9qj&U@afI`uuL z-s6v({f4W~8(eVd6&Ig%)nGX{kQ+BHcfjCaF1Nu~a=F}m{;&Qsj{l}d{|EkG`Jew6 z|G=0r@xbZ)r^ff4nCrWjpY{K&pMmu=uzm*C&%pW_SU&^nXJGvdte=7PGq8RJ*3ZEI zLo;yf_(_}WzWcaSt~%@Ni_W|9@{8DFo_XbYmtTF}CFhL&A153%=a5-*4;h?0>%iHE z437EF?sCal7oWEWf4S?T6UI&6WQ#4vEgct_$Id$F$V28H-}!&Wk7CU4{Qu4$+@*K0 z>!10pgXa&nj-GqSVTa5aJo=cqgGZk*d-mY5b6Q8unsdtFk%yczIO~MD$Fz*MkDPnv@kh_`{$BpqbB;g0<^AtR{qJmOyG~@) zoi_d3vi9cp|GocD{jc`_cmI$3|D*q#{V(;e>3^dCk^V3CukQbJ|GoVm?!UYLJ^i=! zzomak|4seZ^pVXi0 z`&-{1`hMN_v%dfA`)=RA_r1{fOyA>u5BGh(Z)M;8eIM_;r|-_bclEu!Z@6z!-;I6O z^j+3>Vc)rZXY`%iH>YoQ-=Td6^v&$6^v&qorEj~wE&Dd^8|drp>zV$q>3^C2yXn82 z{?q9{NR0n~=;c{Il=U;Peg@Xh!1@_jKLhJ$VEqiNpMmu=uzm*C&%pnD2G0E0O#bMM zk4@tD^p76T?`a?1hTl^^@ckROOA$MNI@4=U0Z|z+d@>_jZjo-?< z#`9Z#=h6I@-nluy#dj>=xA2YFqMQ9p5IS+u>~o@w@%o`uW}Nt*7$4?OSDZgSTAG?>4v0;&;pWT5!p)Y8g_{nGg_{hEg&Plvg|8nH3pZLO7H+sqEZkt3 zSopf7V&TA2v9N!MSlG8jES$bXES$DjES$PnEbLt*7Uma;g;N%Zg_9SGg_9QU%7? zde_urr*78!pS_>zo!`4_{y*~X%%7Hj-IOP$+&bmpDbpuEHu;vx2Tc0oq=zRBP1LgGL7X16H?Q&+-?_N@?R<)`=s#uy)E|hBZhN4acb>|&l??!$6u9K4i zu36ctc&O6MYGX#d)-0Es32JcQ1huOD-#S1=O4P=iZd#udZAd;d6}cAb{h5Es_I_;V0c>fa}I*-PJ#3|Txnp0qH?Bb(X8}&-5T0YHj3OP$3JdHCdkOh7YhO^E+J|7S*0xUER>PK-NaJjvv(N9G@f!`A0rm z-C&)6R<70>Mf0}LMoqFJb1nPn!^@ec9ys~b#JxVhs@3PC3e_2fN}(F#$G(aR8S;zU9e==W z8!SF8K|Q;&HQhtiXI6RDnswHcKG1z^fD%^&>V}QZNKntLYEAP|<@yZL<8mC}-inF~ z{YM`=GeMEoPW4fx3b|;rqAqA;V5Xwl7VUrX!u){hWv+UC6nR*s)~M8MH_*HR@KNkA znzeeRVpf$vtzGj9TT6Kd1FGl5&HzD;_ffJRtd|K=x)_Rvl64hOI_*=}ex^0fM-d_L z4Ar77(So8vIv7y47@l4w`~PO{Lu2><4^6*(`cBh+Gwq|(E}pjC)Nf3E>(mpb_V#|I z_o~kR|L`gQoU(Gt`BS!>{Nm(glaHC)GwBPH7EP*8{N=>YPP}m9Ha$P-WL)lU}ckg2o ztDad^J>Q#`;>-$_g)%!nd*)h@czk7Rfp0+>hum~b+Im3aBMP|7gn^+ z^HHT5MXgG+W`nuWP?k8Yeo9fRtLOTIVcp{`s)f!g6d&?eR#ngO|Ex&JsZ@&lAAg_$L+s+Jp?SHuVU@aooSz6FvbHS4vaS#Ygd5L{`flm7a~ zP91|MbE=PGZB)xeLchLh*BI*ey3k+!#EHq1d0|C$oRn-ZO3|ytCxQDl5)!G%+lbpd|6)0+= zjY22L$0zf}m8}zf3n*6c&J@cwomZ*_A)tpKXN62M;S+pRiFc+#o?#iw6^d%hiVdiF z=XN$A&#!FF^-)xv*ff-4+4*us#l^3v-WOK3j`vXP9*Lnuj93i6Oi{7wq}!t27gx6C z_^3*eiX^*Z%cCw;R8E#&SjCFU^Wcy3QREgC_UDz(3o$ZqiJ@!_8H!@~u|A3yq9Kc@ zvm8eTE*^yn)84n|yyS&o(|(MP5?94yP**iFa1p2^St6N9< zC^okBa-m%5IFG@B3ltUhePP;FWRYs-5gv-o8rfm3($v^JGH|}3tdeJ5;Dwdd7O1R5 zvjnP>9*qsSQ$M$|b+~Tb)PI?PA0vKx&CF+#oLd4`fT6y`;1 zNO?B=hx(`@2{-{z)8CPSb3x^D-((A9AyDI1{@GR4L;QIWWu(!lG%Nwvtcrrz!M+7N zWOnwrRUOPZX$zXGJ0)wj00(&%RAonAZ{pO(RygyItZE(TS-_u_XB5iRMQsyuHWsX1 zBXeMmqN~!~n&qRYbeHQz%2*mX&jNMl9p6IBvr2`crau3v>H+>>STBtVGc$HN^Ca*4 z`xcNr)Juf!&R|9c=BowK7pn!m1e^VQ6#M@|qgHKLl6t1jOYp^Endy_szqGQoua9CM zP^naEG1EFjQE`e5_2R15J|3zvQ^cnNd8#H6@TV#&mZ%h!2i5dZl>8fnt+LhN<{8Qyg}vP`uay0N zE%&Kh|I_{N=s&f8hrVC+J=k}1UuF6~r#~_MhUo`S`|Gq%Pdj_s##5h}dehWW?@xR0 z>^-`7eEz}wh542J`+Cmk*$rn*f97BIfA&vnp@?T$yUq%mGBRiaP{S7P{R}&Kb^f9c zW8dEGlNieqS?DQhu*zj#L(U9XY3@_7!W*6Yo3cK7S;FdN+P?~`uJTt1iN})UeQ|UX=<=|w1p;X*X;VF+SNAJ+upnAfN+-KC0HV=WzH8;pJdi3 z5SA(3tE`-{?)&Xdo%v#nqO>`zveXyq)q=eUpHNo&pE|}fzPNM3S_{jQ-zschs_eze zm6!~E99DRaZF`Py`uQ$u*F_5ldvixE9N#k~b@&6A>{1(u932;Q^D#etu3a9!>lYhN zJ^Z0BUU1?&KmGkr9CG(t-+JQLuik6dGsgeszEAx4nq{R$FFp7C{P({4*wz!bx#gNg z(+hW9KK&bWWlH~WFQ$t|=S)Mf$V=R;#N_j1YI^R^It_cS+%+-%g~wV8J>jm*4n{O` zgk?+4K58s`JU48#n@&S(p(uA*cEO@vQDR05<`F((tiP*WZ{C0RgvAkdUR>Q;D0-e_7n)|XQY&c@Y-Hd=##N1QKDNZXF6N%K+=$u1`<0cmSL4n*_6%d3^c`HBC;q|W*aAvaA-c=E zmDQH#80?x|Pgr@Gdr|+KF-pa`R4K%hHg~~Fl0YkL9ewtUU{|lKFHaIIqabl?fDzWM zdVQy|qFcKA@r0EZ7bluvrd@1sQ1bEPQLVkhSmwqb{QX{uUF<6ticsjVsJPXdR733@ zdLOJ1>)W;_dQL3F^(E?|!@?`ES>l|P2K)CaEBJ{p_mdVD6BfJhg`T8XW;fBCK_Qt# zY07#JtfbibCw(8kf6SXhNa$s|w9wNOVIjxXk)*YnJ~HrbWyJ#J<@;8mU7n~2iydK+ zZMZ6=BLnX;mf5xAq-w%qN4U^a6=9)uvMp$6X=-HPoyv-9b^mHD+U3cLunHBn;*Bna z@*Tz!yTaTbIKQ5-*!wK>bj31>Kg9;Ngmrt4w;Rhg(D(hek+7cPee{GySQG%ORh+b? zFSn&x_is5fvOHxGR*82AnV@8A^;TF(UTQviqfhUhu+Z=pdeR~+Ie3QP8Q<-C0P>Zl(`2!P{_z6#7ESIHLT`9_8J@pgA#xfs0_eTdM ztY;Xbr!c}|--DlMM!9*&Shl`S>^mf3aiC^l&hv$3i9D4c-Xx->r!1IzwuYP@SV6jaEF$T(>-;k+1;twDwHX+ks($4>0&`FzhsJ(USRn{fApV<+^C|NQui#t)8rW!&(%eR8kzFZw_Dr?t>i zo2q5mU^npH`r3~Se4hoEWa~XIb*eDu?)`kSDV9t_F(~s&BQDMdAN|m2B20 zDC_RWU+AzNXf5w9L`h-PLzC%%+qW@48oLcx*^HY#mAv;AFV<;JO9 zFK+j89HXdEnPUtG9dNj&>W>V3M_KKO%4)8DrNbf$d(sqk$&Q!vURq%v8ThucayG`V zU-$LM^0cWc0zHmHG9b%Zz6C4U_>Wh+_U-*fXTFGbo;U@I9d8-uspptS2EJ*moU*?4 zT*4APVxgx_!IE7Ur+ifH9~t#hNIy|1KvZ};K@<^9Y^`u_tiA!jtso4<7wMk>f7_%owWqZ)1zQfMBs$j9kaeB3wwXRWC^e=zA z>DP%}Qq=XNs!FKp;9sh7zMh4ZtZ}P?ojves!jj5@XjPf>6{T4cw;m(f7-@qYqebdeZqPQmMB<`U8KPH7t&2-J*9TF%_ltjq2DGf zQs9N2tW}{BBX?vm6$q3aE?S+EPM=BQc<(@b^EV6cF8W%6TDy{ zW}wWMqN4YxvU0|U|QsJjn|dxmJkR7I6qa(RB>yOUAPK+N`HH zu}i9~RgXm_hIdFRwzj^$Xe^tr=l?u4j&cY>0;~6BSVf;j96~>7 z>P~cI;6a}y^6bKb$D$I$J5;DO;@p20RG|4og!-FSnzF*=;W2P z`_MB<{=r^pQMMWpSaQC$$muEbodd?Qz0$mMpX{(6Y%R)GBLYi~%FA^r8)Lt*CaYb` zXFVQRax-aBwi*#wa#p^~{@LE&KAo?2FRZ>jxeKxM7ms%ATG3jRtwzAYN7cE<)xEcz zZmel)*JeErCoJOWqHHxHu*g5SM9`&dOf%LLWj%1kLmj&qW40O*SR9invL@m|%BjlA z*?b-T!!Jg=vek&dBLAqMPidiYWS}?A+UV0?>e$5?v(*S#q1M9%Y&&N#f?(HKU(v4F z^)Gi=t6Ph*)ri27EA5lGH8EMo7}kAY z#r4G)v(<>el6`Qa*`?M`GM3G~t$Pk2F3MITV1>p3SXGXPhbJm4&es`Vd^(vgVP&fk zfkpmNW8v!oz>$F-WyN><$s?bQtZX$Ru*g5~6J2vZ!C3MR1>b2bj>Im^mLmd-`~yEx z)*BKd1LKvIvvqGihs&M|v-OC;BL9#rV(dIJ4ptJk%opn1_e!lt1c~(i2^O`U0)9d? z7mW`&V_E(0#J;a}=8G|As}zAn{vlVZ;~D7@V_7}JShCj_nZmJ)`~yExihJsR8Ozq! z!ykO2V;6b1XcrEPeQ=S}U~!-FPi5s~jA7mD`U>;q2^!UKfgOiaiaz=uu#&x)#SV=_ za?pLDC>m+I*icimky=u{7;DvkHU?-z`7>>YAjp#HutjbMG$dVvJY;=yB8w^e=(NLm--wo{I?d0N|MQ< zWzjjR=eah_(IWB92Wav z5>ieGD(jENvc3MVZ~UshL#Hpi9M*!2_BPdqoKcfXlHLmGoqNje_x<3$AJ4mb(l#4! zcGmLMv$p>I3-d1B?UqT6>AhF}Ytm!q_a1r9@3*g=e)Pv4J4H^V{qbJ%`pbM-Q3$CH3Ai#}sU@_d8|981TE7 z)DQ7&FZNlo&u*Zm*|YtvvfAcrN3kyQS;RRxcNgnRufj@vt@%gwwRsui8$A}MbEFGW z$?j{84E)AewtjamChuroPGVf>vxsx}p=QiGe{EwlUmNXW{l39xNxheIr19APuhgzM z_v$<37Rka3d=_!8ST8lAUB5Jz`Jw33SgYszEUEXF=-FgB>@SoR-_gCkm*o6;iJ1#L z78kvxRz=Sw%hUf`S#jN)E+}(pzv1GuHbqc`nZV=^iWWw+e)lsG0mwS#f>o z7=zC_&1Vtk*lZ!os$D-YmaVTYyAu8Xw*Sfg|9?mSADr;Ygy9MMjDL0fN5`K$e%iQ4 z#$7dTm)v)Aw{>m*GymJxqHKMGKp9Rba?=L|RmXNHV@uZibj|B}zp*NrbJ@pd>l=Y3 zZGos6$Lnv0q*>qi$m$M@{c^Ux5m@*@j=yslQ0+R{SbZtGWWSuPZv+-66lo|>j5_#1 z_WWe;9dcK*OX?ok`UWiO;?k~!JG~ZT4^&o8al=Z^3B_Wg&=nUCu=%nv8cXIYTi*yQa(#A^cGq`gV1Hv--Q)Ymd?B$* zSlRjptl$G1^f8LDY(Hg%JR;23{ab2%fi;n>Zv+-66icXj@s#hr#(JI3z10`Qu55iH zu<(JkLcJMt*L`3mHDjAEt1occaZ$Fu5m@-ZCO3`ZzF}{*E0?P6OqX{kTi*yQYEEUk zYet=Frn2IEt$s@DM6A_peFIkTfi!vJM1#IVO=C^f`C9nyuXLUxW6ah!0*e!ha_=+d zHw{=Jhs*UV%W7fr4rS{bfkn+pq|2h&Rad*>J7g@GuWWrIu*k*n6LmelH8N0ByV~{~ zbw87*Ro|j)eFGLXC*C2szhib)VI}ov$t}ZLwY(nvY*Dtp5m@BnQlg9Tr=qO3&Asl8 z^0HR5^^L$H7iYI@tqev6%IPs`E-w4!McMjBU~wn3Sf_!V<#44m%l4)69JBQeSfS=r zrLkXJUqxe?FEp0SSGK+pSmffA!Z>`PYqg-PocSEf#pQj>);9u+I7E8^`kN|iFJoCu zvps^$SGK+pSi~XxL^;-DW+dX%h(nylX~zA=w#KseQEQrcZu%_R%4ZRWsD*Xi z8XAO^)Hv*YG?wU2TY9We6QXfVBi3=YF_z^Mk;U9^;j@TC_=$Sd{I*tB&U~TO-(~JM z_gTat(bi&4zLl};eN>io%3QRW&ms%e-hdt_j9Sjm}L$#Vir_p^buvCkq7apvNfT5 z(4afL-e(bq(AH|PhPJ7)Le3QIiY(UZMm~!;#MQ4_te0$J^Ch*t;O})m8|>Q9V}<=t zky1j`WHvUI?2Q9!lwBM6EaDK_TGu)1*TYKoqV_&ojYHPN>wFe9AqqmZsQGQAtPqF7 zd>M=L%8L*fGiuXlGS!*HA^b$wImZokjG=}$cD`PF`~PgsgM*TsyQBt6*HyjG-PQ9e zXL~BU059)Ow&oF7_){(wcAam06Z4eZoU}bcWU)rGHIKmJ2CSR}iF@Pgl$CqEuB*s; zptUGl^MHjvr3T6!kGMa(R#|NuJOWF4 z&Q-~kEFZjDS?vvUjLHgo1kpUw`bl8nPvwGjj2Ty@S-1acNf={@i`n`Htl&?%E{w3F zzWGXH*>n8UE(t5-O4<5GU~yHdOqLq=>{q}__SrV~k;QwMt#1St{*-{xbrbM%WySg0 zbLG;`ewOu>t#1StH((2LywUc0mnkc^q0YUrB)`elHv)_LQn|^Ebc|L_;jlkmK7)!#M@Fh*M#?1ZSZd%rvFW&8JeIu~Q>*+gd zSHQZvWZ8VZ=b)j;%GNgm3xCRNq2%lOdZUi9ZR;ztSQFX$1}y4JoY!kqICP?{3t=T% z@_;@^9pf~~pR@Iiz#^}wQ!iCxWxYXJ(HELsvL>?ijld$Wr|#8^W4u7e80#fx4-Cio z%GNgmiyN@`iLSXnKW*2)Ug@wnueT^$-v})7dM+i9mFO53D64IL_1OpUByt%*^rY<(lJh(i+k<9X0?jb&?M!GgC0yQE{?qHKL5u!uwS>!n?x z+I5c4%FCL_);9u+IE0ALjVxuIZS!Sy=<&PX(wQ$<+4=^oP+!7Nbk%6jGP^7nzwn{A zc3AkYY<(lJh(k2WJT_nVY<_E;uX!FT)R*MCMBE#nu6D(DXv+P!#W9}Z zvxq~~$GiGnon|Z>qp_rpbF$AO4l(uhxF$|DmhFS~ufC%*U#y9fd=_~^|mHPv5xmy#39-~lAY)nPc)XjL*LusJ<+Z?K8rYnpXh2} zd;+YbrfqecA71~yWWL0&9_O&+qa1Xlp|TgXueoNIjq!+ScXn9J*Rei}I8;VZh;_o_ zjb&q8`To1&7?1H;#3B4dSF@}+%4(ZkTkQ4z$U53*5r?Gff9xc4oU-Ek_~7q5ESayP zd=_!2QX~1bb$=|ZF?zz##ve-NOY)rA9xK$B@DtTo+dIZsHea_~^pVaOvFk{mMI0L4 z`2T2FV``4KKK8MMC1X6oXAy_c(aIHDt4Ap-<~d&*yf?7IdFz(XqP|2vQI4JQW-BXa z{;N3U{>~Vgufsi7*bm_+x;`Utq_Sd-wtB{=BkM4qMI6FUAp7e3cm%AZ?q#)v=IRF` z>rkIXeF;B7ZzpB7lofR$V@XUq#AgwQ=p)TBEoB`JYmCpibc2qrExzzzj}`Vq2qqj? zQPyF`vfRWp@)tw@zY4Pa|KZu&YjQYm?X4fWamv&*2 zJ=J1Q-;i!?Gz{SYTFeJOrFO+VyN*%r2QBvW4Or6IhJ_XPdiN=-y|LP5Ed17DPv3wg zoozUN7PYuf!b-j~X!B)b6qcuNz>>~3RB__o6veG@_lwA{bEnw zfJGdlK8}2;tamFbK1XHoNs88DPv3w=9HJ0P(-~#GOIgw9=vtL7g^N9X0~T=zKhbqY z>z!$q&X?3)7WX^35-jq14hVO3n|ueXB%esnm-xayk41fn?;~;+H|7Ah8_V8DwJR_4 zHQi?shq#)?jm2daO`iqCrcSZu~Y_NzQ9=+r}vGcHUBetWyRvcsSW|o!afp6&9FN!e zxIiypQ937IBDA#?|5(^rgm1&%OA$fEaD=qkSGyJ(%huN@)|(xce1C^K zMkqJI47GYgY_?enj}{lBMgNWVGisb#)8W_zmtWNf({UtG*>p*e3{qxdaP-=KdQ z{!}u!cn;@>;rYD`YfEM68kKV;i#>e<7N64LyGmW(BKv{amELa%%hNYt(K$J^=d*X` z`^su>u6EfNIk&Xf(>Gw@PwO>KRM|WIAIgej9L4hV4Oo0=1=*z(`-6NBR`Rt=8>7C5 za>j14r*F_xjn2v8+e%hD`>wL$bBuG({@>F#q;DLW1nqmH5Bv_SGx8u~e;UtD?Rs;M|k>%^o`^01%4vd zyE8w?YMB&(_yV#!A22vL-xzL;A+?4oT8$e&R)CwYN(72^piO zZ@?n2moKnIKk)*r{tS^6Bq`ttM*=^Mv8#3#yPU$5ttl{1#jm%NXjz9D_%xW81d zcb)Bd&R90aXczP4=^L=f>+us*X?5MNg%$i)^o7wbSf0KCOTH^YfhoR2Ym}AYqs13` z`UZW_h(mmatyHv__N=m^T{^~I&i*a-^bJ_#^~`)%OnU}a5+76VW5~rleFGM82(^*_ z()oH?S?vrKc6s^+EaH&Vz2ctgDOlw)v9_HNx0!oS-+)D4FMcB42Yu4)O09`dS3Std zm85SR_m}ub@7|9LJYg&wV_XxA@j#zN9HKs6iZ$)88O!{HJx5s+vwRkDNWRk;^PI<( z71zWlyAJSK^2u`iL_9P3Rai;fwz)T!)Ft-!SfRco%6J^(W5%*E#@NAp?dP-Pqvccy zc+PWbW%ei#Wu$6UtG4`J#?7!>>x6u;#HseTn)wnW5VC1!Gyx zWOhlct@^C+B^i!6nvedxvf}$_YgNWr@ma(n(b3|a{m&W8=1W<@N0)t;d`YH4>vQwb z4;m}wzj|LFmn(U!uph!tbm{D$g_W!c%fHMn8Dr6B5r@P@$Fn`FmDRTOrR!eqsw^(} zEcud*^jouf$tq)|?Git+m(L;&;U_BbjKfM;NgkbH7pxgRi#UXi#%@&C*9v2$eWBzz zdwQ&}AEG|a0di$MkY5t#81>pHfe)BA=N*eI2YMhucoaXm;TrmSpQ2frUTi3RKq`9Z*(om$59l zo3$ic-v})FaPpZ2KHsi$-*2pxUDIUlv-OR@!k^aoR9@6d`iwO=)-L&Oz>;iz16J^- z++^d5klHm}S#4w8{rIbKt!C>Rfkl0ZFPU|nmzbukoQ?7O$NV#}q%N@}Ti*yQ{AsO8 zUrqC;Q`4+RpBZPh#wFSMMqtqgOUe@Q>_xA!w$=H1`kG0dS|fI4>l=Y3AM&NsS7ha3 zCGWP)*PVCdwQkv3lC5vR3jUOf@u+b+_fudcIj`Au;X~6RD_h?PEc!unTB6I(Pgc8f zX4jP$ye^J0Ti*yQ@_PJ4*K?edw(HYA;K&^^L$HujdxD^$i;tn5e9rjd6B; zvyNS>TT48BLwekC_ky}tJm1)(V~lHct9e@n)>LWjJH0vV~0h4ov=hByvAn{hd7MWRcrsNv25;N-0t{j*VR6YI3)G)cs~0t%F5Y%-S^vh zffd%oRURwUm&8xRo>zZXRvhEX_n#TZc%{!G4zXqL+GqbsS<$Y!KRPdt@d}?s9HKs6 zj^E?>qq1Us=})^{6j_)1Eb@A}QXPA}{lQqaR;y=R5m}e{EaDJ;0++9A;`hpm@Af^L zU)y2v4qfW8LVZa(FU0S0{0`QF1uvm7*>kjgkks}r@mb{c_z5yrwd=QPSDdfQ_q{&Y z6>9Al`z+!R5v}VE;H%0??-9Zt^dg@{974=4Mh)OM%8GW4+GoGfV^Lq?{t|t(;#&Rn zy5RxdV`b!;SoUiyC@i`axEaH&(iTG~+ z!dU5jqv(6*`z+#+bUBJ~=)aW}V~5%m{KNu}73xc(qs2V>=gNvT4rPTkah}g24v|lE z-R1lltfUTY=c;r~gc|L+K8rYnpD4t$Q2(W@^mCNE!i&%GS=5*C6J1}_{3)zN14zG* zQlmZFV}<>Y_=&g|{fV(swS@3Kp5?QML+EH-=V*Vdtc-ez=zH^h7WE~Xmy}{J)E_A; z)&sYD_sZ5cV1@Hbba7y}r*q$cmDK)izKkVyW$PP(MP5%Mfv&sWb!El* z`r-9+JM#rATi*yQ>Pw^~+%QqQYRbyVyB)?jij}Qz1QvNcU*@JUy|SvxYVV})_9#}i zz5$E+l6;vPiO}lx6%E8na9*6RY<(lJh(q{^W~^zK zl$EpRxZ|X=qMyjtHv)?|#4SQ@66$;vjb-ztcFDPfCE5B0#gb58sxJYD_h?PEaH&(iFgNaFJ;B`r7X!)m+YRID+LyDh|~X#s5j0~R@4BDC3WcCd=_yC zKS5Dj=W9=8MgMinMdwF9v8&G_uWzzLh;`^alok9$n6C?Nzc^uuUAuTJ>Py^T;zCYb z6T8Do>Z-OTj3sesXP-qJ!cS0b*D>y$8YM_z6x-C~F5}*>k*q%j-L9 z71p57A`X#HaFat>+rvtH;r9A&8%v(!HXe)fOWeIc{EFwQwo_L0(UHY`ZSAv&L!>6O zOi;VFg_XoKo3A_XSRU8JRz8b3BrWLT`M5!4wM{D=#oE$m5r?XBoZZ&yHaf<*CXB^? zcF7hVE7X_p6V+Iw-P%~$W8BuwWc*;+N$ z+Sj1|pRI2o28Hhk(|m>tLi$eM#MqKGTGM>+FUL zCM#Rt2rT)o1m|!{X4j22=am$TGj>a|^^L%i?@Dk&IMy0(P`lb`miYN>eFGN$lzM87 zX13;Qu2;L-=`o70$<{XlOTH_Cx)JliHyNv}WBmGc`DDF|UD^6ZVBt^ebR>%3dAUwm zIkQVyayEWRw!RTq^cvx#xLv&juQgU-tX+YXt#7~z^`(mFpq7(dqpY@!F~sX=7x5=s z-v})HX#-fSRb8#DTx!08UD^6ZV9{%YE@)lfmcB|^@i|7jnEPyfBe2NpX%1S9_0%hs zl}pXnG@1KseFIkTr%gHkZ+XNO%4*yDXm-gSAzR-FEPC1UnU}6}z`sUT8%8GLzSVn2Z@{9ygeHMF9%~$LfR*H_ zsr4n_URaW?Zv+;3eT7D7QNy`F?P}XQq;~bb@Tu04Y<(lJh(mOt?dsQie%h|hdNz(R zEnD9REaFg!Go0}|Aq$k%o-y_v%1do8Ti*yQ;t-|Ku5+sA8OwaMj#0jOwIo~LfEDUX zgxap}*`I5yy)x~});9u+I3$@;?9YCVvZDX8`I6^&rjsjS7jcNIP<+%z*Xr4@l0AZr zF|t_qXZS4gdTz$^d0J(irL4AS0HIc;tWYmG-D8FNQke$Y@!Z~gW##NS8cSmBX+DcM zgrDHDirRIiveIj!mv5>qIn`$ohd9;Se zM#)X)_$=ZOZF`IHUcw3MVliLG`7GiPAGDz*r_TLcWwkTxVvNUntWaM<<>27BvW{0) z)Bxfb*=HZ)vxq}9*(<~|rgN0lHa#J-7~|1Ci#UXw(2Tu3j)RrtU$R!iyWL#9OU%EH z@>#?obhIul=U8Rs>>W~;+$UTz+h-AnP}ymip!0Q%v21-s7Hi^2j}_`m^?H#it+I|D zHD6(jsvn2i@ew|YI7HoxQ7Y>wWktHjNm*mlh`z+#+ zyp8cW9tkU{_olRHYP8b-znuHv|L^{P6aPH%QxngexM9zeJva31HQ`4S-aFyQ@gw6` zjX!_<7UP~Dw|HDV_Y3|t|I>e3OFfA~+Q?DHY;g0)9>D_)H7OzQqps)UcRjw3TnCVH z^iofvpv4-W$}7q}IeW!Fqtliz>a(Jo~%Mo*%UHgZS-Y}Vp6ll#rCS<0HU@ZG^KS+Yw#i9*`Q zQO2aW8josy%2@l3Wy!0w)RQQrjT}+{r^sVUci%c#gtn!gL?LbDC}T?dOLG^WG?tC= z)lWPT=iZYjq>UV9Oup$9$9S)@+P1!wCD-?sdJ+XJ+!!5Xy4rGn0#;b7?Y(urB8xTQ zNfgpXjy6nuBO*#VA6L6_HuuVsmIq5ci9*`Q@eUO^kY+CNW6H`HqpS%}qJTxKDemPK zV!PvyDl4~tdW_iRNfgpXj(3PP5szzs#8`D@ZU3FW#>C z^?Tp^+pTB(Yu;f8=9UkCWd1#WJm9{wcHi%oov-=BUoXD;)*qbq)(;&s`-7z;FaPmz z)Bb$$vH7pP;o!cR`8{4ba)UFroqh6GpP2NPo%h}A+=)H&FTVDBr)?PWh(FxRBJlJL z`m^!*|RT#d_4rS%iEb2>3`+ODwk>iAPCRDp_w=vp$MZ1`<=^l&v67Nuf z@1R+dbeq|g!D6jW^H~H${6sA#Nw+F1)_XVWc~5+Yrur=Mdi+G!S%SA4%ihPAkNR+j zg0 zm~St3=AQYQ=&+=p9ru@N<*t50!^W~P8jJIUOM844aR@)b$xt2Rkg|ft6zWUH;tt@_ z2|kNBRIk(V#pY|7vZ9{w!|Pv3#wfmUyw4&Ip`)=oP`j2I%iis~AOAsTO)$oBK8rX6 zsVfm&Vk}FN)UL2G%XzF&UqVOYLbTeoSXt4pUU2)bY>Z28_F2RsioKjfQ`RD7MgJ99 z)Dmv;S;Qfl>~(!RW}&j8PD@hRSzpv%-t4oeFQKD#`H8l&qFxnQ?Ekax6H*@!8#9jM z&@@TMc(bvrrmY$|XRBXx-~U_cX%f;mj@o}w8ZYbEe$3bwEO?IlR7Y#()>rSd*yU*w^i-pu#8(`;dK`R5S-F&5lb&Y2JWWFS#_`>Fc0n=c z{Wh#z?uE?t^)z;QnuPR?qi)IfCFA*$Z>e1w&r!zcX%f;mj(4cQ!32vL-&DKWsWIlC zCAai63F#Y0-LhKmDo%X^*4i~P#?;*BpWr!qnuPR?;~gqitMRP&zZ)yVF4n!LNl4!~ z?g`cD32A%1uPdv4cxrvEh2?1y(l?HKLVR;H_BeQD9jrC12~U%NMbB9I>T+bgY^)w%I#`l-d76aujpLpWsb#E7Jg2O7 z+Aew$E%h`BSj3?ULRCD2zE9Q;Jr{n=-Xb%6YPr(X)wVh&x+RGt6i#UYPi)ycSJ!!1NQe%|8%fUX2{24z{i1&n^ zurXTEf7BQc@>pewL%5tSjqq#A%4N(wYvMqkMI0hAX+&-OabuBb7LLv14pG6$PPjsEne#}@V-q?J}`r6-Pg*pxeajuxCU5^?oHD7X0 zXz6}Fi#SxMam&H{>Laj{qHJn?g}w2Lp)+mFRletbKeIafp)_oV3?5 zKD;g#^R>6nA`XdLjT-cqm6cv!d71l}9xK#w5YE`Pt6dKnEBzeh-ER6U;t&@v_}II$ zzGSSlj~4&c@L9wmcIKP zq8iUbe_mO+v|ZwJsy>T2L_-^@96H9&8O!X7V`RQ6K8rX+p^A-~vK~}cw`loz5N5-= zFZ(R&I0$F8cvt1K#xhaK?2`Afu%V!aX@Dp@k(lM@3Rul(qjL*OJ?*A{# z)Fes;=|Lyof?&DFynfR#wx{SLJU10Ho?O{lmZ?c3EP8qrqde8p!s@Aeh zO(J2*w;*U-8d)1FD|cMVF7mErnVLkxl5asEg*VLyz8==vHH*p;bC2n&Bo z-IC*Hab0bstoDg1yV&b3%hV(i7CmFxBG710*VTrw?!4n^=007Q5LTupk+ATmlr6iy z*Rz4Lawm+ntM^&Pn5ju5EP8ryJg7_adL66<3!cfctCw2BvP?}vSfRcoZK`5F=mBM= zpJOlk>}8pnM8d+KQsJmIZNB=Am7cGsR!ep?xps!%+n<3gN8q)?p2SX^E6m%*JQI~zC29=7WE|> z#&mr@d#bV0@8h!%w3d0A1T6e1U!UnZ&)y5`&O6p-u8C)vdry;qMQ4i&h=X?etWSjqZI*_B^Q-sNc$ zu*mBXH#jw;>ua2`j!nIfPm%L_nglH3kkq~6VV<0hv7KV|KEeLX(Eum-wf#(qsG@c3tnY zh(qKPh`l<-e;6z6SD%3OCZ9zd!cVZml=XL5i8hgn+hI*y=dnV42|qz28fE>>SQ+mS zIq$VTi#QbggyrIYRaSaU3vl(pD(wa+3BRag^o5Bg_g zrJtkJ60Y)Cp}vHl==u)YpNy4$A7zYJ`Yhs5k+zpHKK>C_qUEG=lf2Z&ukcyKA?jXy z$w8mvAJndlxtIOfefDKOi#WvBgln;%(C>_un)|ROF7;TU zzQlsy_OjabTVti;_E#C>B|eM#68S{e-Q`!6)lRb>VSQcfvxr0Z2`ZRs*Kc4YK03|% z3apEK7I6qa!BJ3U{aRVM)O__m4(p8`i~17pP=RmInP2@CtdKJ~W4zF35r;%ai~aw8 zsdlB;SMMXNi8uHx;t*dj;{v9R@fXTUzuWo8c#aqNEaH&(iP)?1zm=8N(em;f&-Yox zA#^l8f30@?99H62Q@*hGaqL>)u|j=``Z$|DW&I46r_+iicb?B84&f)btfH*{GFHm2 z{FChe&-GcvA=+NjY)4r?HCAeUP}Wa$zS5c;In!%S|6i7=Z?Jcv zpB+6t*fr8{Ovg4m%+pucyPT2Am7XMj&eS&&mV65WX*_BrM;hz26iag6OnoC^;ZHHE z>)z54%4(lFmenh@giL)ySol-wsU(-N-ql(M>ltbZnfgY;l5at9u{WNbIUH6l_ekb^ z$v!(%-$+>aQzYoFL+6JX>-4c>%*);-Q{PBf^z@*8Hq~r>j)%g!^NvTe>WmXgmK$G$kT zl$A?8$KJ0o#!P)fSfRc|;|0R3+I4`k+9#*R_$YQ|>Kh3Qe_H2UTs-@?zp`@kQ!MiO zWtsX$!lJhneggNbcI{`Z)cYv;&9Y2=BVm!(bM2C50?OLgSo2bL$vc#(ZwM>YmoN); zNm=_CEA79emXN7$BrJNy;wOr+&;H)9)~=B?kshPe2{ZMLghgI2M{#4_YbLBa@Aw*P zHO-QGNv6J$u*mBvaL@={$JkU>J3U{rzB2Ux(`6vP^v=VG)P;I1W1wo%@Qi+G*BTu`5&G5Ek_%-XRV{#dCyZ9b@j4v3B)7 z$~%;)ZzL?@Q211Z?So3N!uravi?epiGWCswMI2(K7UG`02rI1nTzc*~C$wxvR<4w= zh(px9XicE=RZv#OJMAt}i{zbKJpWh5C{lU5>SvonVEv zn%0=|?Ae!X@3V+Q904rEi?chfgC%*+c0P+ZMBR%66S^jLfR()4=`lX}sn)V>eHL-3 zPIJ$gV{X4L7IqDKEb2>Wg^=R<+Rj+1=a^@oy=)twMI4f&cJW-ow#G`mkNL;3YiplH z970Fqw4Kh^pt3U7m-xc1d=_y?bhLQxWgBIsHMy`Rw)9!VA@LKje!2BJSnU6oZQ-#( zeF;B7kweG06|5w7r04!obfL|C7I8>)wD=sigq7qI>3XlQHuG7;p(?$JqW-c4tPr=; zT25Zp{iZ&P`Vya2K`zuWZf>k}tx9~(CLSy7htSa)QRmnURxT$RdHNjfv#-7L|I0G< z4dONZ?BrVzWY2NW-ezoT*F417WRFl^PXGTL|Ah1ZlGkVI8wm@4%A)G(KYO#Xa%YWY z^>P+>S*E@rEc_|;RCfRI?95GJ&c&{C#*VT=%7A*K8tg}-r(d;wzjf6$d*phsJ#@6T!#!8P-_CcBYhOmM^ zt?|+8c%JHdW2MK)x$$M0`bNT{XDpM|h`oQ`WUSP4412vyeIsE}Un|&lAg@1f?A-Ut7&G;aghfvex1kM#3Vm$4_+i{=GuSnDGwDej`)g5LWP~_zBV_wd-jfeazH15*9sUOGt$Ae#vDv#`HTR`~OURBVm!(R~x0S^Rt)!FIbuSM#3Vm$4}r5 zb&QuNEBJ}gb1(bL^yPj4@N+5LT!!QTHNKRl6=SR(ef{ zzt7Y+5*EFs@DpA7*&B_Os(a_m`wsviax>jFt8i64NsEjf6!U!cXvd51sq-VTITc{MVT0 z$lPb@8wrazgrBI!^XvQTk=IlA>iSmYd}Rf{I{G<^&T+cO3iT!Y1Z|UbzRrY| z%Sq0ZUiUJ_(|i_j2x)?LmC8B;R>%u8=3dVBoa(cPL)6DPnxL%HVcmJhmpl2_=rPhu zaM?VcMI0iZ=<4frnz7Pjr1#>oQ#@9vFX1P;zHxZ!I#{w+Pxe{FA^Zg5rH*l)&R52B z6u)|s&ms=tC%W!Ao?Xnc5F?K(kO89qmJv^hSDI7Hox zl8LhB!V2$DhMy1(;5eT}9KuhqTTs^V%1XbFy<*p~9xK$BnrN$0|DR*5^n6ME@)(~* z9HKssDyMcGr}LFD_p&!W+Gi1mazJ7n9raW`{S)WwQ?QbE zI<^0obM`}?zCk-S^7<-$FQPxaPg(6WOV+)oZ@|Kzviq;ZF@6%(f&~xr9M4b97y0v$ zr*FWbXDltRD1+*nxEEI912gL-L!Q0?3xCQ{wyyJMpDeaRR-eSKN`}j@b zkHbppgz0@Yy()%0eFGNtrIIv4v$*&%W2NS68h(Dr(>Gv|*V9<48qb7$6jl-zrRq3&YC=Pvz5$E+l5`1)J;FY$thU6TQ9eiZXG5O8K~FVw zWBdfWcD3t6#!AmUdFqg-Z%E%b?p|hm+#`HIS(edaT*Ay40cMI53@ z2ugy^{oTsSrQ)O1_J%xt0~UF`+&GGQ_Fc+K*R(?%^7IW@#38;0-L-GL6IQ5&X3Uq^ z<>?!+h(pxJyK<#Fl$9Q1SgRX5xl%dQm&hk*p{?`vK4m#}z20XLhwu|L6HwNBVTHPC zdcH&h7~05Z5r^;-m7?W??=e=&=Y%nC=(C7J_=&EZ_ua5^IjQ%i{VI1=hBok6p}xee zmvXf0U9igK&t=7qFvi#UEaDKUNiptS-l?oy>fM$a+R%W{A`amvy4LDDjFl0G9%v2q z`z+!RU(jI2^f}&ctPEeseDygj=^Mx03$FIW^GmlGD?LWZC#L%>;t+mPeHL*D zKY^E4)^b>hE|juM?!FF9@>#?ox;Pf&x$$9GNsTsbm#`*!tgs)VLkq4#?HYoW=#FWY zNrCad=_!2Ug9d0#k8fcJk3|)_IRH~9HQ>kj5X~g z%F3nJm&BoQK8rYnpJ2D3^R*aOtP_sOnXoJ8u|jN4Qv9z-7(!72a=A3h??Muj0XV<&*e>pckrXmA|Q;{Mpim}1G@_#scoyN0l|7on${$K9(4te^9^s}R$N;8|d2mPV3Qe(`26<_1&8?fj#LN-{4cmIB1 ztkiSNe~owA(>LhPMqbYeC=UPWJN*qw8^s#!w>S?vf-&IySHTP0uAM*4KSoFLq z6zOJTy32QzmCIOP%$KKcNIyIJLD3N+?p?mEtnfaLo-g`d4te^9^s}R$TE;Aki{DaK zE?wJ`cgWK>q@NvkFZj}X%;CPNtn_^4#V$|ZkbZXDU*cwIJahC7Sjlp5ek-))Jtp1x6`zQj9JzBDZBDA#)EwpaR@)b z*UOakgt9W8qu6zj&mynKPvCWw^)+Q>_#9cQ2YM{(OWa=~(neqSxUzy@9UX^ce>Tf! z5r_DC2{+o+uCE$P_Wz?<4`bH>K8yMiexhscA2U|Ez9e?-@3V+Qd|k3DXL@v9EbQ9P zV}<$>buVs1=@=h@mFRovSSzt(U!O%BDsTia-c9_9vNG}sVeR9yh(q{^M$B^_HdcDR zWdFan&ms=ta!50Ej9)fZYK(Gba%iT{A`VGD5p~Chl$CxTd+C`p)O1+%#v=~lC%7%F zc6~`%x%3!i-8Xy|aY+0`?3wgMWu@&3IY8ZK5r^;-UH1vU04vD>Qg+FC!l9baA`YRW zagtWY_<5fd^u4Ob3iT!V;z-mcK4+{{tv%>_6`w^MDoGzLI}7!o%~xtogt}MRXAy^_ zB}BaQ{aItBW9?I~z4QOW+4@E?^s_^gAdQG?bW6sT+-JYL5m@vZkrTr4 z?#vcGOU{A}XX_h*CEtQ5(Tm&i!OdZXo_+0l=ZEKjm+5J{!I3b!`b>qVA0E#5ZiT*@b${dWz0RSY<(lJ@TVOA=ajJehmBw* zcY0FwCFyZ6?CBfQ&kjwZ#FrZ_=iTss!SeJC>1Rhhm2WM^p8XrFgT?-A*wZ(ppB?p7 zU~!-QI%Q?d7x%M=J$*y^*-=mBqlU4*G+?aD$F8qD{n>{-eM9=$QBS2T5&dbuveLCZ z@u$O{z9IeWc!y}05cAZ&b+F_)disX+v!k9`6R)FdV!E-!H;-QTVwb0Hz#^|_2U?7^ zs%fy2`)BF3iWWEQ=^ONCqrODw@6ykvs$IFuQg)Hw414+pEPB~8S;ct9q1RaHb95(?+}}WIA0Tum706$Uo!0J8?cB& zWtM8ZE7_y0^cZDNHSFmdu!uu-`Ou~L!U@Jo*%jVLPv59gU*hgXlcJElL*rp3J#Eu0 z+3R`w1}x$bexhqlj8j&qp^bhYWuJYMlPkd@4mBv;$9t+dW#ux~>PK2bZ}wTlp(1M{ zYL_F%O1;}bo4CK$;-h=+9vf638q*isk&msum6j(LM>tRT9tKwwa+3B;Z*4gp?3Wl zR`7+n^qLU6uJT#LA-WvXp-owTGFB=tlw5A;N{6`!G3)~}5vd-l=mUe@XxeHL-3%IAb)E#X(jl704QmaNqaJyxhM zk($)wIs0E4E3KIb>kU4OIE0_*y36?sSV_;MbbVar{sNyx9Kugf<p#jpxRXF;;q?ExA&*z7bgX(>BN*FV1kbz5xq=NG_hqOSZldSo9hx&{!hY*pGx2&W-1;N!i6W z4u-S!jliOpE!{3SQl;zt2xX<`D=(~UeIu~&r#Sg8ztu8U>N$$v8qU@?U=^jOI^9$_ zPM~%jZmes^jxprV+4@Fck=OI73Mx6uIt*5F{y)7xll7IYZv+%jZ zF=p!d zz7bgD^<0hb`c}mO%4%PgUSHUit#44P3iT!YL|1>K{gstVuL<&q;cR^)u*mCcl=kAi zxc!Wk@?W9um91|C7Co=<6Eua;`Pz3~EbPkGHv)_L5?9c>^3;8dmGK;z`)qv!R;Vx0 z4Z7=_S9>d~o!aXKKas6(1Qu~f{6suEHq%(C=NMSo`bJ<8hiE~MqtN+k8Y^X2nEPyf zBd~}=Z2zm#uQrsGv7Z&cnyqiZqQ1oaCHzF(&(@XIPWi7;m&n#P0*g3AgYbI1zf@CJ zF7+HGzZuTfHv)^ip87ZyIi0VnvNHCKQpYJ}=1PG@9FlTeJR@9zl?!*r(qj}2py;!R zL-+|cdumr%S?%-~B@PulR;VxGCul^gtP-r`u3c(nf9Y7ueTm^+d=_zt=1X1uOLj9>s+J&{>hR7Ui~17xmyjD{&a^A6q?cgE zJA_?3`7Gj)=xFi#lDilyJw|!Acl24*m+%u^{r`7{mGs9=tyTFR$M6n5i#Q}F0ONVp zos5)RgNz)G~jRNYI?3J-7Tvxq~5CLi0e*s-;- zQhRo(9S?8evxq~~$GO#}Yho){Nu4mYR@sZb=Fa~w&(=4J(q|8UTBD;{%x{*2=O=fU z#m~?G$+2Di|9F1Ov-OR@qSpvr_PNcb^R(Dl;%i2+YwomtZ(s-v})7dS0Ebd-gXPOMLSvyTW^zt#1St{E7X@bMOcpa#;;OV*q@DJiB2_~t#1St zc|CrjtKZm_J}dw1XIjJA`bJ>U%Qm#evpxG2#!C4wxi>zXt#1Stc|DnUCF**YD=WRe z!oD$E-+&eBOI+9EP@?*r%Z!!w_u?lmcH$x|daC0mx}M{u#!C77pl4_68^JE(5PpIi zp=#G9#!9`9a@Kn|Ti*yQ@_PIPA68Y?#mY+i!r*hV^^L$H4w2P!gGpHzDJwnqp+26i zZ&0fW^(C5dP{~o&8;zBEhr)S@Y<(lJ$m{VFU3X|MR94X9My>m>pUu`c0*g4rDIwZ8 zt6gt^75r+(7^Rl5z*!TFkvK%lK5myP>jIw@e9n0ui~17xm+%wuUc&jxN{=x-$8&ua zaj4uRJF)e(z*re;l`)>rq1gjw7I)VV*$SgCiYSN!UHpG6$PPta{wS!esKP(wS@XAy_+6Eu!f)>+C*`)E14 zJbZ@FA`Zz3z^IMSS5`)?U2>DteHM8=>I>C&wd+h}g;+aEBg}JeZ}>EiRTG^9KS9E( ztTT+2USE>So$9lQL!9jCIyZj0vO-OJ^qP=b`#hgTeMvg)#CqIm#!9UTxidL@iq9er z1wUc=>Z!^K_3=@5^-3-DWRDf_q2lp0YA>0GY3od=_ztqw%D3$~whZsk|`w z!V`TKaY$M@$8QOotgNtSA3a8?6Q1C+h(q;Cr4ZNZNybX$0O73NT%Sc8Dsm?z#*PzV zB|WB6HICp{kM~$%KU85&#QSk4C@X8-vnJ;FEaFf@KAL3yey*`(?nk{t(sN|^IG;rv zD%Ryhp+3jsjg{If1V3@C&msYzbS#y+?u1oZ;g( zW&WQ0-29X&4^6pj$_|siIr*)V5190aN%u}VZPLKR$0uGlagUxK^t`L*@CpBz@W6y~ zCu}-?&G`2C%DA76yL;TR<9c$R&;4Ker?uSEL8QMNJ(Vj(QVyMi2bqJYy?)~(-E{)q z*X5oLBK_s$OcIyz%vXLER-zHeni+<5iLY$hT3!JwsZ&diFp3rI@^ldCFUKBQT2R{Q&uj$ zzQit12Z1GfXugjT*Zuv<%2*Tf96cQbmh7R~L`T2-DV?vN|Baq|S*xB70!#MLWG*ot z+-I!xd{NU{?&%=XUyl5ruOP)7;gdcqtS?Uok^XYh14KS*p?>0CV`Z#W)|aP)NPju$ z0U{rcQr0J6CHK@)th~IBo(=*__RzElj@|LZmauBq z$6zIQD*r#`-ZMPU;^^O&ZP}LOCVD5PcTg|%4x)wLLhmhv7J3osl3XO)DUe1wsX!nJ zA)y9BLLj|DdT*o`l92d+&fcEc>(b7M<9Uzw0~~zS>D|5enwg#7>})x%hwm90iF6QH za)!oE;C5Lj}CCSuQe>3d)`>{mIiNA4UNiF6QHa)uu0?#*@Y?^c$x zUh)k^ItZ+EhVH1mRsSwn4f|E>)wV~OW2A#fe>v#^LVb+YXWj;@are4lweqIrNTh?n zk~1{oShn}?G?wJY>U%=`P^5#vN@r-Q)oonwfYq>Ha<;Fr(l-?8Ah6^N%`M1$R(-pT zOU@FLSd1&uLAuHJ@D0&5I``0jo3c_oJBh`5MLGy9IYZO@CeQJ$$|~*G+()rF>jyCv zEIC6XFy|QHR#?HFNWbHHF$+J$lLNiE|LQHuDs6PK6YB;n=`TkQ5IRR@d;gZHSgidz zF-y+Sl!axR^JZg}`5v)fYsV}(L(`Zn=f2+rtKn;lZ(H6=A6YAA$r-u}UDD3uZ&X(L z9qVTt8P}RIOU}^p0Jz!c6|e%oo%a125sQ3}^Z=ousKq(UmF4(t@oB5aEc_5P&KNMY z(aUU(5&JLh`~R3nCWz z9=;*YOM35cVf#{Jl{p9W_>uWBiyr4(+Tp1HU9Tmu8a}N&LqB;}@5nq@Yd5z}n>MYB zn?pNv^zG0&a5M?|F7B(Lp;O4Mc2)N2YVv+q%cFPpj?A6n@5JBJlWCP-wZCf>t#D2} zcD@aCv`YN4n6Wo%d;E21i&=ad z3l|e~j&Fd~$Q_q!FXzIUF^g|QbhKQj{d!}S->iHa%@Hf*m-rR?avb_PSdH51a$H~f z@X*MNm_>}%O;$C>XsW66qVT*b6iospM0Ct*n#-ox~!Rjr0xrp!G_v z5qhJ=>%TIVXkK-e?Dt6DfW=f@4F zHqtj>QF}pm5W1@AcldK<4a;4EI!opl=^L}c7v;PBFjsCM@=WFAVn*EVT-+;wCFI2O01x@$Y_m$=BdtpWT1}x%rRM5_x7k>s; zqd$8&F3E#L`UZW_h}XqV(B_=o_l)JNJ$oY3H((Ky z&<(0GuJ6KX^k;Wi{Em^n0gIRf4X4tt=R3-B;$m5^NZ)`(OoE-L-1qwSR4nEg=^N5F zj@}-`pSf=QTgEE(eLBNM`iAt4qh3#1C0ktlO<0XRQP{6GbeEAx-++Z5l9zw8zy5}@ z(w?ZDdF3wdNThGT!VjV0(1cF+{nwS1;=wvg>}sTM^pH2=8=~z}wmDxjmh6c-OXe8q z8?f+0+=aq*>$twEtfq49c`JD&(l=n?hX&|Voxkm`C@a+f*1sV+D;*ZZO0e)l*olt3 z_Fq<3nQv%)9KU^N%)$@xxMZbI^;5=@Io8)pV%|d{R>~Wp;UJ;udObM>OXAdnV-|jh zc%n0(2ft*j;w&z;DkBHQEc{UKpj>>>aXn$Ia*oszj10vr@>#Bc8(v+zR*szqNydCR%@ zhNOmOWWSh&AHq)X3Z0JYF~-$+J4Vh3~WpkCE-s-|<0M4Q<^29e0meayBL{nPZa& zj3s`kHb<#B8rdyorL!?k&A#pXmF4&$@!Pw`taLW!YPHp>d{$Y*<^B>sv`fTFc_Y%L zgSp4lXOvai=r)Pvc8*zcHs)@1{)X;TmXmvxcy%yl;fKUdr=2A+IP9X9!vNCcWt_Jvi^V1yz|iizZ&TO z=e2gUJlFD(mMdCzZE2qU(xZhqr#DZfYVdoU~%WG zi|fK_cNVtKFqX|n*M_?9-cixW-1!hoqfb&)sCk9&o=V8`C^swmfHAKVb-!z9G}5$syQRMu ziM=k(2`_A)&RR9{akf^QJ#)?OY28217(~;G#=xC#A||aBZeO^rj-5G+eii&3aR>&% z&erV<*U`1QduTM$su;WEv(ehMPHdq+isivCXOplFZ3D#mGFxTgLc|DNbg(cjV6 zl_*Q=#M>9Hp?`O0@2F@?(cf{WQd$JB^6TvjS6}sa@;!@=6#X4}53V4qR@T07wZ`AI ze1^Xh%_#ai&OseLR_oEeuzl6v-N)aFJ{0{OHXQ*{`y#h5T(D}K_p*mX3yS`ZS_!%H zzRDN0FPy*X?>^1niS85p9dGVP9f|so_J#BG-@|4`8V`F9pUCq~6xlR<57V=~XL*F% z*59e|-N@b(jVBrdc?9w z-!VVYT7tjh{w-FBXW4X|&5gfnd6a)obd~7uh^y#Bt+hhgxA1n$Xr!U=`w{QUeTCdx zbEWM)v)K}BB%A#>V-O7`8Uy`lFxr}1%YI7MYWfs^$6b5MobsMkKP7)RZHm7mAI{Bz z{C%qi`8oVl6Mwh6qg^s*^lY{|$FIg3uWbL{lye>$xhZ0i@4;4(Im$VQ|H8`mD(ZO^ z(GqWrS)5Dw?O8z`*Yn0QJCJ`1V&fZP7UvS~Rgj8O)_;`MbhY|3V@WRL`k2MJgcBhR z)0FjZV>#nuj@Lyj?sCb!3LeO`9P_`FmHn)ZOY&pa#w^Yy+^fLi>bRa$R?3;y*Iu;5 zYho5QSX%q%GvPmtWihagOMb_zW0uraVS)2G?jNukaZr)xY?WNwRWVCy0LfqI+AnPX zd(3L%dl|VBmiv9Cdtq`vCi^x0UgRwK%4iJy9r-KL$+_3c-*gNqA5&jvna>q5i#<2`!bS=s(4WjQ%o$xFN< zW|3bK9WB3c@JD4e73-XIp^IY{`6YC;N>A=T7_0m?WG}ruX0gt+9jBduuGh1$CY=xM z_m??d6tnm?_-4Cv{_^+Aa`aGH`wJsh$}gd#*|)K>{dce$XW%l|-njqY-SpPU=YOgH zZ<+hqxtGk{e9m|0ESj@t+uz!5Z#${2z4g)7t6R5k`EkpNmIG%$Kl{$vXU$%B)|0b_ zXZ6hd^~{&eT+sZv=Bt{woAIL=%V!)g{Xf(1n11H;b*6o3+D+5Cn|{SV^MCnoXw;X# zsL@1v6uD6Lg)aYqEt#Y_nwn~*0Ju?K{z@!)T9r;T*_8JyE45awvDzNunC;77i6u{~ zO80)-7Jaqlud_&NkNWagV#(90ysVndZ?Cda+Ofuxtv~9^Ux`JF+^!xTwz0H!kIvCy zajk9Cm%m^kV~SkJ{V|(k_f#y_%a^|rOP*Hk>!KTg{*GO+a+rwfgofxV+joG~C?Av5eVxTs z+EHKrN-SFBVh;OroBZuz?W$HXozD{FPYpv?{G8@_KCpt5J4X*c@6-+}t`k)Yf$9&AS%CdxJ*M z*G0qdRlD_sz1Mo+HUD}1=KX)Q+Q3OCJ$Bi%?-)IE#-7_eKX&WDIv2m|>u)@H{J#$! z^_`BVKY!Lq@7eT@-L|~_nQM3d@>Sc8?7wOA26z7It|^wyay#lOV9f&+qc$M?UMAJeK=bhtJt8e53mt@{VcI~Zyck=6IyC$ zwoq1zv1{XMdzcT$*Uu7*90Tp_*`vzZ+*rjNrN_ajub(9r??H8U%A+I7+RRvmp=m{v z81?ltSj4w-=I-Ufl(II3)!3lLxTMFysIQ+T7EZB)Cl0fN-Naa;#nskJYFB<6pYaw7PLT~!xg)TVjjMD%VzeUtOx}Bux?X8$r*quU##ORpPel3|ESw@CMCCo< z4Rl;77O&6oA;uNyXRvUJM9&;AbX@BzEA=L>v#7rujr22l??tprlFK&7^=yuEuCKA$ z9%St!{R|dPu}dyY*;#yDWuyHjj#QQhSrb+x zh>){hZCuHIb;m56BEe0?@vmX5Vz0`b>d~&4g&z_-k?%pQuB>zps*NkzoX(hqAHq&x zrFE~a2CEUknGVv#e<>d*d!i#^QO_=Yv}hJ)d$rwIH?Usyyn)!lonjV#h?+@WztV9n zP?qyM%D8rnS(57}BFX-7KCBcxCq28qUYtQkcZgZ|A+{G0ua0XTtj2k^$c?peKVx+J zh?Nd!+-L92x!AeNN^`8OSKEWkal4qs`G0`Ke7(svC`p; z_7au%&}Q2lZM~j5YDPl?f8xbg|34<$PMPnfSP#2J|Nma39kW{(F}LpSFHuh=cOYx~ zz3tI^hQ{W`EbLaFJh^BIgbS6G?y|1=v6ohQ39{y6q5%ctlJ``3z#$*hFEEz8ol$3T z-)&5Ep@1dtsd5!8$Is`(I_I1xc;i6kIElr$L@RPx$!_)Wgj3FUo~Nwz&R%`JxT7{E z`cc55FD~ah9y!$gey*{k-(`&@_ZG)QQwmt*JG%#aNH!|#9Ainp%Nk4W;f;yT6tLty zRW1_ex}~#~mF_LoSgq(OW1>9;ENUcBQ+PmI$90ynQr%LWMSgh9*Q2DcG`*)PTf*w8 z&Qw-mcqrR4vSkyqU zBf4`uc*;~Pl1jdol~}~jsF=Kjrt5XGvdZM3^m-WewXDP4eJ zhvNIu^MaM~IM|6!)$mrf9|o(@Te|oiQ_SmYUWr8>2RmVPWGmYbHC8#U z``KT<=9O6ZA?ySVv~`Y$C@a+n*Y;QI!_4ub=y&XpcW9-|I$y#wyqAL0IRo$>PB!~+2e@FVIjGi5{@I&-ft@J_LS6O9z-%1~}(X(O}c^t&E!Q5AAA6Si^ z9fkc$dBQVe7Jdlvj7M#Bj(fvOc~$4zmT{dCv+zUQ8?U^hwU@F|Ka1KoByX6Ho*uDM z9!GBf=X1xNuo|LEu_xNT%=dU&%)$>Lo{^B#Iqm_gAqJIxNaCDRV-|jhL)u`DF?Uy1 z8T(5AztK}-7Ji70N&u$g+6`7CS5=%l2aQ$QuY2!# z(cS+ai!=%P-C$3tx<$m%y>MHa+f$rf7Y?rkAqbp{#V5tu`+4i(`={(Ut5ek6l*c`nMZP_QE6FSl2<8@qbQdWw)>MU}gW4-5{w69oM+A$~>X4d`$vY$}jcPz$EvdTBX3ymNzcuxI^H}m?LpLmk?-6 zq^w28D%YOEtTA7cU|i&vD7WC|MgF$Oj3seIeU8*hj`^BIV&R9d6IK(yvVBxp>7D92 z3w>kE*CY~)xE?z}qdJ}Ah_Nmx#)a=6^EHXY!Vh65IE5!(ReY_lNhB6=JzbY7G4Jb?)g<}e+IqFzk007H+7sMwk~(#|+SnXltE}O2 zy~J;C5wq|^eUzSMoAVlFr8u=Vu4KP9k6HL3@?L}adwjLA3vJqrb@7ZxpleL%mc~ z=bYp9#wzBRe#Z@C7I8ggRh1&u>tH?g$?uIiLspX5OZvgS@+VitZ#OmyzGbFs3LPpf@HN!Okqv&b)DCn`Ga%V8yr+{wK>n(qJiG>!lNQ~&=q zZv8hm-`jjq^THY5obiSkyH5Yp^!H9be)`;L4^6vb+SX0q=O223|AxjQeWQnVo#a#L z5thHhZ>G6@1sf?xro)<*Z$ z*OirO>}unZds1VOzR`m{B^QJcn)Sx7*&L;=q+~_<1}x%ws^X|J)^UARS?Mi^8jCwu zLt~M?0SkM|^D}fYP}WzBRi0;Mj*-3ri{3vH!sS@}%gP#-oN;YjtrCkz`iAtfA)iVU zr<_Z8%2>soNO5YUZ@|Ky4)$|#$#VZsDl1s8NZ)`(eyN)(!ki!clCqp!g5+KzeFGNu z6k|$be_i`0l$GiT>+2=IW2A3%V^7Ja(llDj&R4d7F=oj-2xF1H0gL=n53i|YU-kuM zIp=>FSEO&i!k+fi<|U8oab*SHW2A4u;w~_DqH;#~ys}bV+@$qlj*-3ri?|*;VP*O& z+aFU_xhF)68;kUf?v!7`PE>m1J*upfGoCaqSdqQ~i~EOc2wtJkJ@L7zSj;ifH((Lh zlU1#p8y_)Nk$XvYBGNZt5!VlPRCTI{mF2`FvR;wC!5b&sv6X7$oO^jlSTZ^%0?Tw3CqQO-*|0IR9#tF9lCm?Y9SVBv>oc`=yZ zLAzgB>9R|0Ty4}ij79neEc}pkrO20qKC7(K=A_>-(l>Z71wVu#v>q2L+dpHhG8U&U zVJy-&6L^**gE=X(^^2|=s`3qRD^S=C+c zRhDBX;y}f1J>9FHRF;?TWn9O`Ec_65qH<69 z6R^6wiJ83bk@Y$zX5oi;?6oiJp!dYAIpRBxj#w$bMBb}X({{JAyl3jLp&u? zc}wKu%4#al|MEK?8ME+1T;r&`O?;QK${4d%SVzPx;(GGqmA>A0PQj9R_3)U5A0nRU z&$X|2D9igD`5s>yu~L2sJHaJk-CrM@f+gS3VKECogq z5O#uMC}n+6S>+t1)^2PlX5oj>(JJr8->$4wGg+Ub?5_i37Ji8QIF|r*Tpxgy&O_es z$hZ!OS@J&?~r`SJ~4~@5_X~|=Z@cPtRntOXPCVMmb?kWJ)y1v>m{+W z{avtby#e%_t)&YHLG+$ZM_&+VD>>p5?m zbNHO*wtL$yYFpU)&DJ-x?%MLFmiM+C-!gahL$j}#z4ff`&l;b#FJ1pWGV`>VYc_wO z`TFLL89$%#mKlf4XqtY{^z)`~IPI&`UNdc=>G%9I|L6aP7DXCGZ|Ye?i$0$8(BEJd za}DA!soz@^X%w)eXANECbN${-WqCgL<3o!gjRF>SY_Pw2CT&)h<3nUzkwyVade(4N zE8Eu@#&T>AB=f&P03R%iZlvX^sMRV<%nf@xoNPTdQxKG@>?R# zUleH+u%u@VskE$bHyNwUdGK8>iZlvX*fFw&ow@F7rLvr}GWK;*q*1`4mnO2P^&o5X zS8B|$9GA>7(kOaUUZ+Q%hqGMFe|22t*-z~LqDZ5Fg&mWgW4R9Vd1VE^W28~QqNg+Y zCax*!H}oH4mG)KkM5Ix`BA({q`Y=DIEN`ze$4H}qMLbOz=0MJQ{L@%Y9*l8C8U-xkX#}u=oWK7^%#vKp zqDZ6Q4HEJ?JoJGZ(Y61(u}V83-%zAcz#^U|phLu0*58a(?g`nekwyWFo;z|&F8kcS zD$DyG?;KhbX%w)?>-4ZEa_!1rl;zk}nPa3;z#^We8>;ncTiO0+WjQelG4P^Dqu>n^ z`byEftDboL?Esw_hzW3qM39b0yCIrLvqDSjIIwX5okU8R;6UbNq#| zoVABFD`w$`DC6tRH8nq1mb3O^S7%17l-D6IO#!lw>u1Jt)*e=K%)$?0CwlXJ?VlQ} zoTIGQjF^QV>fwN!dwu*wS&l8_{IO_y%)$?mm+sB19~;Zx6VoCVc^x!5>FZ$U$RAC` zVq8rz3qORNAiJPz|3g@f+*N4{c_Vi0rkF)u2Rl)@C;9_px$)}QjWG*9gq`TgF~IkY zRoWc(*Vqj)3qOQ@Rhi>6%5uIT(Za5eSShbFNU=}O&pmA{XO4{Px|oF@!cJ6v$L}f2 ziNCO`W7ozk{1EyTi9`JzziX^=Tyj>vCT8J>I4O7Kn&$5q%h?l*>*|P=&O_J`r1Zwe}CH!fBoc!mww>yKj}LAqQ9QE z_|==Owfr-$8occLPhYfT+e6p?#Gm(S-f)fE_TFKS=bo5<-}&oYe%eO6+;Mx$?b7$+ zZy!ka|GS%B{r^?}KW_G%Sr5*-eAZSopP9LI=045;Z2oZbsm*K5czninGj^K(v*~Z1 ze(zQRA_{WrA8mk#J}OACBbf;4~4tv3c()<#;&`MEJCzH}hHa?`UX zIQLxg-*2pP8;V=-rGvzxEd}Q(vD- znR2IOR#GCqbdXq>CK_2+uCI0KxPrC!rGvzhXHO``($>o>+dFhz4olpqFC8Qnrm3$B z(_|^Zos{LQy&Nfg=>S$TP1IR-=9Ke}#`5>QFC8S7JbOax?_7$ogR;CivL}4$Ah8IM z`v%FN+V8l%vYhmyd_%r;kXZ8UNv}MHt$SiSWqIYdjLVk}5{p!g*ohn>Z)+?+wDP3` zSSeLQw9SI)xVABtv+wyHed!>vcz%n*pn?27Zmq0Rl1+BPmktt(5V?nvv-~}7^#Uwk zI!G)+WbT{Mq+92>rLuw$Ig$>f^%>U(IF#pppj#-*+Y|hbk#r!f&v<%+GQ>Q`&6VZs zRk5p)bRezINUL|yBi2Iq&5Y%LLy>eKtD0&1{_mN;xp3`|KL3RkPyc<%Q{!Jc<>yDV^&Efw zasRsinTai~zvQTOw>|jRx9tD(KmPOF4;-*!tp%4{bMWS$ef92J9rTvu`{@a}DAFXP zKN}x9FKA}Xev>ICObzFvNRyEMZ1gvhJ~S3*EmW3c7>VN-?G?mXuyB^-!+9J}H||T6 z<#;mX@+MP*#&;82KG{jafKLj9KM(Tz?9dto<%A z3ulQjLqgMWtp}@7f9c*;S+sM+O8F#=S#LIG>rOE)`5gyimh|H1<(gc(ypD~_Suf@| z5VLTW>{L#QI>)t@E7C9h~x)TZmTnzEdIFXQTp zSvX5{vz~1H+m+?4z3i{fh($h$dqTudx!2ADWqA$`R!7XjSz;$BAJaL`H&*#O%AVLM zX5lQc6Et5?);wc5HV4*@F$-sjo!~NovgRr)_#JnMSn1G)ZpPQGtU1Oi=P2LM_Av`T z#08q39H_J@%h4iaPiz;n@I%-MQY1RAR%Q9M7mK!yS@ zx>@C3=xkUix9)zAFS`5xi+v4(2Y#q;Bv08xEw1VP7uh+H|b zaRuw;YY>S=4^-YbtJIdBt*qfP$R|!+>}wE-C2yc0?dH2iXBn&f4rPwM1_2AZMV^xS zvwR>uQ`almz)9&z6Oz4WMZ)sBU>ve*%(%Mhj z_sr4PAQFrCc~Bg-#m~npD~+qJIm_Dn8bo4|Y@%eQQm=QMvYZ-Wi6eXsBC+s8*a%#;RenRl@-+xpB%8R8(<_0OvW_v9qZ_bZz6Oz4_#x~><$QLuvYhpjIQ2?5jz}#0 z5F3@&mpZPaj8(>6vR7Xjv+zS?w~@n@b)>S&xGUAUToJIOKO1)mXpNuW2tPtu-kFNM zdU?#k4-HUIlJ)+>mF4&$`5iBdS@@w&I$q^IXfK7;NN|_7P?GqU#w`30c7jqWU9ZEY z8W(GSNyJKd9GbIL-j+JlSpNQcMa;qvku0ZqjE?INWjS_2_SeNR3qM3WLAG332P?}t zpUK+4JZ2F;V<$*wD(fI+dHbF{aZ${|4`C;IvMn4^RynS;S1*iMDUXAlz!B-V4m4I7 zo5&n5h*|id4k`!o{p(;P`D>`?F#een{S^$~niqUVwFG%)$@#@*qckqh(K>V^e9PWn5=Otdz$go}dA< z?$tev<=ctVV-|i0J5jmIxx2AS|0sU@w3vk-!cKJMdfwfX<@}B!s+}6M$m3uqDt(T2 zh1H1V3L7o=mlmB8vC?@6QH?H|x?a23xcqPXSIsjI=!8h<<;}DUMIyY{1A4+ zq=l93gT^Y?{*f17|Nq6lCcy*E*i-VBG+oTKYqv4CMm>=1(Yk$LFD&*oiNwO5_E86y z>+0XBEXQsM%hx0l3wz3I!Klc(7v3=ii|=r;uSp~py;*s@VIcPif4j1hZLZBx-W6T! zYZ9=MJw=eHJk<9#Wet~S1nOlM`F@X!SdC&6XT8Yd z_?iT)lwab##maf(&BiM1X^X7AuSp~p_LPvfFZX7Bld+s}v0lC=ky!L*C0&no);YdW zSt%Buv|fzM*CY~)xSrsdTl>mdp{$f&sedL67Fer^%}xOEWUz#^{4PIPBG@!A?| z(i|DrRxt}dgq`5ljLz{j%1V2+mS379@9qhik0bddb@hi#Lr~ z_#s{h>&nGBH|ZRmJPv&?7H<->@I%;%Nqyk5-057Dl=a^Lbwn`61ZM1NT~X5ojh6SSDrwST3t%5$UW zFY83ClwYC&P)ClVuTYlbYeoB7J7(dB$a`^ZS;uv`vYfb(nxn;Q#Vq^~c7m(3%DT*0 za#yTwqj__5@tQFUKSXQ%%3i%xS*49`eTaR(M#M_zA!+%Z`x0DYtYWW9KhDLg$1MDi zs2sUhv`O`@^3rUJLRpUQ zm-UMD4OrOIJ|xwwNqkXR>8cq zE2;F@dDK{rZRQ(_^bP6HMt>vf;_}6n&l#&6m+Xm1-;n-nXcE$6#MbMPDOlncBYguF zaXof|jES!O!^#S5VWe+Je>N^NQ7f7C|A&m_e2>gA(l@%vFYygw@N++j2bJZ;O0Xh* z0~US=E76_f)CXWSYN3i;LM!#`iz9sl7I8gxqATYw?^l-NhvWo0H(=q1IIvgt>Zgt6 ztUYslSr9A1!Vl5#x+B;1-fJvpy;%DbV-|jh?bVfQv_7S*bl#}jRayHJB38;TVJ9km zRX+)9DxKr_n1vt0PH>Y$zsFA~%dxBUL0f!W%)$?0Cpz=DeUGvnpC;%3V`CP6h>}-c z(bRF>t*l^N$3(1@UmBn~JF`9>v(g##=$M5c!cNeIPRDhZvC2KcTh5D*idp!fUTG?2 zbsTpZtF-sLjkoy7m_=Mq-mCJ?-W|p&_r0)=h*|g{>;#=ubdDc0Ryi*D9S@IKDZhlB zsPsAhsIrm8OtDy~+yg*ZwgJKSbV(OIpf$kFm-#jO_dUVita=w~xE4wqEa6R%r{< z+V2~)$S)0&mdF=}-!%p6b1%OB|4Sl$gMMuC<^lRgQ~X(2_{skUnwbQ%SMs`)4zaRmMs( zu1MdIK5^tz=@651LCsUK?jBka=^N4~j(loY4;EGT`wV3bOOt|{otNC%l1Sf>K5^tz zX<(P{W=)6Hc*~}+r>zg&H?$6J-`Ba`j&F98xHm<9Sad8e>66qVTu%~pwBV(d- zY*JQ}KgUSlkUnwbQ+s)X&TR8aonyd?^bP3~M?SR^i)wj^|0!#@oTIFLq;J5YmlPd| zDgV(9y>_U9Ps8?f+0*aDvEESDZJt)juf9v0pN-NZ){k zAHq)1>O;r%tg(u3s7?0Qf*@9cg&*qduGXpk-dN?HkneGR#7g<4p241u9H;)ySjD(n zWlzkDS@m&z*V*d}vqiCOp|>;#d$&hZz@ zN?KgqKgzgf$1LJ{X$rXftD$|BdsX)R%!rlpOH>l@ z;Fz+0s^fBgM~S1GV-|jhuAl?iPW;4J#kg8z-_M9y_#t#O0#+T@kCj#C64Ey`J!avD z$a_`ZXZw+^S9xx175gxGrYlhX~|IkSpuE$|}#(FQs!F8q$N zy!f8Azb0mpU*fUXN-xiEE6b@Tl(oM)V4+2G9wJ5CpZC|dj8(=H55M^8|Cc!W#^BL( z<)VQfalMp`<$f2t>fD?&yVxy9-%u9zl<1iUj&v{VVyxnumba3YIQm9|g*_z~L?uYR zueYJaSbZV@fk8lN8eBuJv}-)Xd-9!VZd1KceupSH zSZ7Wt(fl(?LK?lG1>M@QdK7WTA%fci809lMp~#S!c;N8eBuJv}<9*USBl zx{OuYd5LcveWSrj`6V*hwDQ*V>NHkqA0&=&^bKWUPX~HAao9K1VJv4{?0ZMwP!>I6 z*{PM?dxvWV-k6P10xqp_TE!HV<^TD4(M<&>SZk{ygyd_yVk73mwW z=n;#Z=*VZi?Um)7^;oY+-+)D2j|AP(Yv=6kj8*zY`5hyD0~WodI3ZNt+1plGo-czH z=^L=fFJULRf~Nax8)Z2@R({7w-;lm>d_yF1vi;iHSkBt>4MqBf^o^7IOH@^xo!H7) zj-7xN=^L={L$sHmd5q3+OJy}V`wLd2Z@|J2VJ9l@pl@NU@_Ur^iu8?M@=M%bLJ-Qm zDmGV^v%kbfNBRaV{7?_CZ{#|m&8A?(YTn<&e(t9(QI1hGFs{907ID42+MDwdFHx4WCuHsSidpy} zT88o%s_w6imF3J)a@u>wEc_4!ZIw5|H!@baS7ls##4O@^wnYD+eM1`>%U`eEBUZ{U z5#&_*s%)UF^30y%iQQrreyE>BPM77h*Ed#aCuF^Ljam4i4$@xPr>$qKa*ncBcZpf} zA$cw_*N&~LtkM>?NL;vc#7g-kZiNoy_-mb*C2xc+8H`!@A?yUN5$XO~dny*=8i-l= zA?!qDf30OKCuU+?{V|LD5_W5Pw*JMj%$vw96P}oW`~HC&O_J<9&S)po3RT2m~x@p z$1MDi+#b*8|5jr;<9hL(|Cc)YMvCj{*+;LD4tg8rJ7bqHw}x(9oEybwEOqpa1`B&i zKDCdS*M7fO7^~dx)Fdu-^bKXn+Yi+1(vAqSr_lr|kS4o~tZJHx`zoZ!}mbza(Aba-R1bWepcviTM7dj=rHR>?!5hq#Jd; z&W6?0^d#>#I(vfka`X*lkzbNyP|kaurK~dMZKLLOsiSWw3wtV+1i5DaOk)-MOWqD# z>gXE{7WR~HsG|o5q;ot&*ULH2%D5bTLs{gPuoDBhw&!#km%m<)zM(AQdJ?l#IO@1g z({VZ9wv5ZsHs z$0hNNqi-mSxSqTh-IA1boU%Nh#_#Cp8_L2DVJ8p?m36GLhRgGrte2y2C<{L%9U=NG z=Xi{=yciDFRb{NyV3A+q8$#*L-_X&* zon7e(`BGy!`<}JGG-lz4Xn4&LO~-YZvHX31NzB3zVJG@>AM`_&xGRzEoR|| zy3kg0t?+Kfa_s7h@ci%S8_8cwKRfcNwc4!rGPlOr<-#Jil=G~kZzv0UN@PivO4s~7 z#&Y%oEJxo^mb?YQ_1PTPzgt;OU4ool9DPGs@)iW8Y}szTYbqA8xT9|<3wt`iE0Q_B zxeZo#_m}qCwCRFky|^E=)X_H@tX_HJnkPLf`I2`kYxp9U<>(vA!k!`#(m-3+{vFCn zy}0XnOYT4|b@UBoVNVCC&C0&)?aE3I3r=G3J39J?vdAyd(vAqSpwwLAidRtXpBFeecx8$?xds8_FWTM8=qFP|CVx zDi-5%^bKWUPbtT#=s|B$R(b=aTzf~~P!>I}I{HOi(s8|6S&qM!J>lpZ4OYr8(ZHE3 znzG(xtkOghiD2uqhm)9k7J?OZx$~jWQxzy1<o-W*xlEk^Mp&4y1CJ+WO7E72PdKSYxdJh!smpe)bcGskUX7Ji8QIB$?D>-EMe$0a%1ZDJOF2s=@E zwqQw?D&RA0Oa%RYnA29QO31Z%p$JGc=hy}7WW!h(Y-xkZ5gxhLtPwb zvz>Ugviv;G(k)^Zeh523FsEz(DxIUVUXoYcJZ2Hs^Jyc;DeGn(mlun(CpL>%DZhlB zp!z~t!&9+XuT5hXeuxIZT&h;qO*Thoe=)92Vita=gTr3VU*4$WD))q(*_SSiS@p90NE4k#Vqnm*om&(d*MoDIe7_TtsArOL)ZyUv^vLE8q3MOuwLuL zEc_650$EO3R~W0jM=LSF+7T<|m-w_hvxa%OvC7|3_Uc+O3qOSVQhDtAGG%#d&m7l` zS@#i4F|G%Y?z9IeW=m*tD*`=MSzRTPi=YQv$X3ZmgL;Bf~PvsSk ze6ROA#wx#QIa5XY1}yApFYYJX`ES=)yR}u{5f)aYZ%98o@~LFIa@_STWhK8jiN#)s z^bP4}M=nTeIL$tM(^#@zbryZ9mPY!9^t0oQ3R(%~xa%9R^4X=vYLhcnq;E(+JMyX2 z>*bjD>ozX2TQ!#SW?35P8`95?d@9Y}a$nr9Da-NK@*PI{2L0K{FL61j@+QPrZH~^K zU|f;D0gGNEG;pfC|MwMRmG(jA80j0Zi0gakE|KG#FDuLOi?Y8WeFGNuRF2vCy|Jg1 z<=7fwMfwITdW{gl(f&v6>66L|#ue!s^m-$%m(EgIBm9!FN?#`H73mw&&yL6KDVNAT z;|XPXF$t_l-;jQGd_zctIiLDPWjR`joM$6_L;Bfqe@Py4F#GidWjSY1S^G%ekbZXD zUy{dv?F{-jtcER={Z;>l#Fs_-hV--J?ge`y$4Z~Cv1)moRL2qN8`95?`%Bd8ueS?@R)5D& zDJxj76Ji#A2s^>&t*lQP%h~tDImbt=lwTsVhY+f)PZ-Ph+sDN${16waEAQFeW2`b> zm9;-MX5oj3Cwj77z54}N$HXlB5O$(+U-je4D)WTW&u;0_0ZaPXarZ*{<5)iKE@gSY zBXc||X5ojh6P0)4?=+U9F)^+qV-|jh1R5>c^mn{NS&p3$8+}B~BEK}ii%I#c@G)h1 zb7WkH$1MC1cA`7i3V&2to{q-2UK+8|c}QC0=YAX?F_yDe8P{Pki~JJOS66<+?8D0P z=E%4Xjam31>;#YP>e_!OW=YS!rH8~U{1BD#m74DlD$CRNU>zK>(s_s`AsvHu{=Z#W z&KxD4I4EY}hcGx)3h5j_psezDOnLjEn1vt0PSEvDS?@Pi`8!H}>A;wUAHq&l=J-Bk zd2>wX|L&$+n-*NQV9WVW&tEcs?|J{2_n~>G%v*i#=jUEKcgHzDo%5zS2etjL?c;6d zw5{Lz<~+ZjKc zv24cv)BipFW7E%=zV@^yrrkKLtLc~gGyjMGhQ=dxf(~+Y_n@@8(&eB{XPK&w>JbGQ zrtwIfpd%Vx%)6DB-UL+W6OJ0Q__mWRnEyj|FqQ;WU>UgA1z@ocH z2NiPpb@kb>Qno#vJZdbd-XD+D30U$f1bO@1@nx2>hMgV8xFU4|78Y!PCgwR4FjHAc zjV{L(sT0ycjt)#zP38V2eE_rfn5L|B3$Pqlq)tc&IWm~MDww;gH7Uzm`@4t6 zBXvSL$kD}&#`gKdy;51uxMYrzIw2k8_=f0do2#_`XDnyE*sGB`Asyt%U{W=iPelJ! zmXlS$8jeTm1Rc?MO@q7py*X-n-dM8l>uWFHP^3=4BBMh|8_g4RPyEMNPBx8kMd}1B zB5CXdb%4tHx3awGgtd><30QQQ!cO$&4jBKcvFdXq(ixA`30OqZ*abRaWmNQ3K zkvc(lH8MJswO4+}e=5uQ9*Hu?BXvSL$Z=z+m)&Y>{|{w3_Dkj%sT0ycj&F!p1+)6~ zcV(shRbMYokmHd$AsytnF(e_rWflHrtkSN^93yq2hl~y?0C9A-g@096iYV&iB5E3s z)CpMlA?!q@Bkf<5<=F{Xkvaj3NSZTp<>iDwD=VEA>f@5{F;XXB;fK0A2%2nv{YhD= z@@o={ajg+VI-Kfr1zY305b)@m^eKZKni zMWNr&v&Jf70LgBTx5q5}5O$&~-?;z1vK;>?tOYR(KP0tBIivGCWqIEttoacuWpr5h zu3S0sTVs{$g|aX{FJ|F~uoFDRtn2j~WBE3EZp^|DVR85%mGx_7rR?^k{ly&T#4P*} z>6}W|{a4Cra2Gl^X|>9)22<6j-ESo^zG1@>f2a-Xtbs4RxSA(&(GiHujk)z@*O*T zcc<^KHE_q%dr$x6C+EKA$A6r&=o5dQ_OT0pd(?A3d*!^dF52XaCp`4#r)Rz5_5Fw4 z@}p;-fBVR%k94d7H2KwoP`w?)L9|>%iaj{_&!{zjx4j-+1@J zzuo@g>;FIQYZ5fs$BL4-cZW+_x1e#c0Ypbr{Wl+Hhu({-=1 z(w)~yYtI}bO#&7@J!s?Do$GpglogCC(j;J!RiZS$D|?-8SdBW4a^H(*jWh{ZSWynd zJmjDrtV>zJxFSsg7QLl9q%O`Pw@zg_k(=y^NRyDhaoiK4E-v4L?l4vnQML&y(j=sB z9N!Sv^>QDFos{L&PXjXM`bxD78zHhNl4!~z9G8o=iX&IC@Xo^ zN&Aa^A88WOH;#Kk{TMKd0=J)v#lDX;30U+l=U1eSrp|FYW0jGJtXHH-NZ&Z_I1F-+ z&@`NFmF4XT<``)b(l?HKLe$0OH+HsBR;o!X*DKN_q;DMG5S=Qs=C!r5oXi=K$athl zz`_spaicodgKlLk-xfxi1T6fJC|)@Ox}~w?K6`zR5}ihx1T6fJ*oj<2vxTzK>8H+; zy&7o}u<%3DqBWlkHaAxBJxVX`@dJWrtCy@2cN_-LaBNR(W~_3(WRCmCEc}qziJZya z)L72AnB#si3qM3`T6ybz6IhK5g3sDFX5ohr&!~jfZ)l;7%b6qVwNJ!KSta6$$~z7( znQC0@)xBdD(L8p7SLk$H8!IdIIH>OlS^K?W7JdjjQ8_JcWUOMnl8xRoX5ojh6P5S> zHjLM+MfTSoF^l+{E@+irP8;aB9G~_8dt m9k27Xzj?F>iWhie@A+>j_($;@I%-M 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 literal 0 HcmV?d00001 diff --git a/lora_single_chan_gateway/__init__.py b/lora_single_chan_gateway/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lora_single_chan_gateway/board_config.py b/lora_single_chan_gateway/board_config.py new file mode 100644 index 0000000..d96bc7d --- /dev/null +++ b/lora_single_chan_gateway/board_config.py @@ -0,0 +1,270 @@ + +import datetime +import logging +import time + +import RPi.GPIO as GPIO +import spidev + + +class LoraBoardDraguino(): + def __init__(self, frequency, sf): + assert 7 <= sf <= 12 + + self.frequency = frequency + self.sf = sf + + # pin are given in BCM schema + self._pin_ss = 25 # GPIO 6 + self._pin_dio0 = 4 # GPIO 7 + self._pin_rst = 17 # GPIO 0 + + self._spi_bus = 0 + self._spi_cs = 0 # TODO: Draguino has it's own non-standard CS pin + + self.spi = None + self._is_sx1272 = None # is set in setup + + def __enter__(self): + self.setup_device() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.teardown_device() + + def _init_pins(self): + GPIO.setmode(GPIO.BCM) + + GPIO.setup(self._pin_ss, GPIO.OUT) + GPIO.setup(self._pin_dio0, GPIO.IN) + GPIO.setup(self._pin_rst, GPIO.OUT) + + # save default values + #GPIO.output(self._pin_ss, 1) + #GPIO.output(self._pin_rst, 0) + + def _init_spi(self): + self.spi = spidev.SpiDev() + self.spi.open(self._spi_bus, self._spi_cs) + self.spi.max_speed_hz = 5000000 # TODO: what value works good? + + def setup_device(self): + self._init_pins() + self._init_spi() + + GPIO.output(self._pin_rst, 1) + time.sleep(0.10) + GPIO.output(self._pin_rst, 0) + time.sleep(0.10) + + version = self.read_register(SX127x.REG_VERSION) + + if version == 0x22: + logging.info("SX1272 detected, starting...") + self._is_sx1272 = True + else: + # sx1276? + GPIO.output(self._pin_rst, 0) + time.sleep(0.10) + GPIO.output(self._pin_rst, 1) + time.sleep(0.10) + + version = self.read_register(SX127x.REG_VERSION) + + if version == 0x12: + logging.info("SX1276 detected, starting...") + self._is_sx1272 = False + else: + logging.critical("Unrecognized transceiver") + raise RuntimeError("Unrecognized transceiver") + + self.write_register(SX127x.REG_OPMODE, SX127x.SX72_MODE_LONG_RANGE | SX127x.SX72_MODE_SLEEP) + + frf = int((self.frequency << 19) / 32000000) + self.write_register(SX127x.REG_FRF_MSB, (frf >> 16) & 0xFF) + self.write_register(SX127x.REG_FRF_MID, (frf >> 8) & 0xFF) + self.write_register(SX127x.REG_FRF_LSB, frf & 0xFF) + + #self.write_register(SX127x.REG_SYNC_WORD, 0x34); # LoRaWAN public sync word + + if self._is_sx1272: + if self.sf == 11 or self.sf == 12: + self.write_register(SX127x.REG_MODEM_CONFIG, 0x0B) + else: + self.write_register(SX127x.REG_MODEM_CONFIG, 0x0A) + self.write_register(SX127x.REG_MODEM_CONFIG2, (self.sf << 4) | 0x04) + else: + if self.sf == 11 or self.sf == 12: + self.write_register(SX127x.REG_MODEM_CONFIG3, 0x0C) + else: + self.write_register(SX127x.REG_MODEM_CONFIG3, 0x04) + self.write_register(SX127x.REG_MODEM_CONFIG, 0x72) # 125kHz 4/5 + self.write_register(SX127x.REG_MODEM_CONFIG2, (self.sf << 4) | 0x04) # enable CTC + + if self.sf == 10 or self.sf == 11 or self.sf == 12: + self.write_register(SX127x.REG_SYMB_TIMEOUT_LSB, 0x05) + else: + self.write_register(SX127x.REG_SYMB_TIMEOUT_LSB, 0x08) + + self.write_register(SX127x.REG_MAX_PAYLOAD_LENGTH, 0x80) + self.write_register(SX127x.REG_PAYLOAD_LENGTH, 0x80) + #self.write_register(SX127x.REG_HOP_PERIOD, 0xFF) + self.write_register(SX127x.REG_FIFO_ADDR_PTR, self.read_register(SX127x.REG_FIFO_RX_BASE_AD)) + + self.write_register(SX127x.REG_PA_CONFIG, 0) # set to a very low value + + # Set Continuous Receive Mode + self.write_register(SX127x.REG_LNA, SX127x.LNA_MAX_GAIN) + self.write_register(SX127x.REG_OPMODE, SX127x.SX72_MODE_LONG_RANGE | SX127x.SX72_MODE_RX_CONTINUOS) + + def teardown_device(self): + logging.info("tear down transceiver...") + GPIO.cleanup() + self.spi.close() + + def read_register(self, register): + GPIO.output(self._pin_ss, 0) + + value = self.spi.xfer([register & 0x7F, 0])[1] + + GPIO.output(self._pin_ss, 1) + + return value + + def write_register(self, register, value): + GPIO.output(self._pin_ss, 0) + + self.spi.xfer([register | 0x80, value]) + + GPIO.output(self._pin_ss, 1) + + def write_bulk_register(self, register, values): + GPIO.output(self._pin_ss, 0) + + self.spi.xfer([register | 0x80] + list(values)) + + GPIO.output(self._pin_ss, 1) + + def set_mode_rx(self): + self.write_register(SX127x.REG_OPMODE, SX127x.SX72_MODE_LONG_RANGE | SX127x.SX72_MODE_RX_CONTINUOS) + + def receive_package(self): + self.write_register(SX127x.REG_IRQ_FLAGS, 0x40) # clear rxDone + + irqflags = self.read_register(SX127x.REG_IRQ_FLAGS) + if irqflags & 0x20: + logging.warning("CRC error") + self.write_register(SX127x.REG_IRQ_FLAGS, 0x20) + crc = False + #return {'datetime': datetime.datetime.now(), + # 'crc': False} # TODO: still get payload? + else: + crc = True + + current_addr = self.read_register(SX127x.REG_FIFO_RX_CURRENT_ADDR) + received_count = self.read_register(SX127x.REG_RX_NB_BYTES) + + self.write_register(SX127x.REG_FIFO_ADDR_PTR, current_addr) + + payload = bytearray() + for _ in range(received_count): + payload.append(self.read_register(SX127x.REG_FIFO)) + + return {'datetime': datetime.datetime.utcnow().replace(tzinfo=datetime.timezone.utc), + 'crc': crc, + 'pkt_snr': self.pkt_snr, + 'pkt_rssi': self.pkt_rssi, + 'rssi': self.rssi, + 'payload': bytes(payload)} + + def send_package(self, msg): + assert type(msg) == bytes + assert len(msg) <= 255 + + # TODO: wait until send (done at end) + + self.write_register(SX127x.REG_OPMODE, SX127x.SX72_MODE_STANDBY) + + self.write_register(SX127x.REG_FIFO_ADDR_PTR, self.read_register(SX127x.REG_FIFO_TX_BASE_AD)) + + self.write_register(SX127x.REG_PAYLOAD_LENGTH, len(msg)) + + self.write_bulk_register(SX127x.REG_FIFO, msg) + + self.write_register(SX127x.REG_OPMODE, SX127x.SX72_MODE_TX) + + self.wait_until_send() + + def wait_until_send(self): + while self.read_register(SX127x.REG_IRQ_FLAGS) & 0x08 == 0: + pass # busy waiting + + self.write_register(SX127x.REG_IRQ_FLAGS, 0x08) # Clear TX DONE + + @property + def pkt_snr(self): + snr_value = self.read_register(SX127x.REG_PKT_SNR_VALUE) + if snr_value & 0x80: + snr_value = ((~snr_value + 1) & 0xFF) >> 2 + return -snr_value + else: + return (snr_value & 0xFF) >> 2 + + @property + def pkt_rssi(self): + if self._is_sx1272: + rssicorr = 139 + else: + rssicorr = 157 + return self.read_register(0x1A) - rssicorr + + @property + def rssi(self): + if self._is_sx1272: + rssicorr = 139 + else: + rssicorr = 157 + return self.read_register(0x1B) - rssicorr + + +class SX127x: + REG_FIFO = 0x00 + REG_FRF_MSB = 0x06 + REG_FRF_MID = 0x07 + REG_FRF_LSB = 0x08 + REG_PA_CONFIG = 0x09 + REG_LNA = 0x0C + REG_FIFO_ADDR_PTR = 0x0D + REG_FIFO_TX_BASE_AD = 0x0E + REG_FIFO_RX_BASE_AD = 0x0F + REG_RX_NB_BYTES = 0x13 + REG_OPMODE = 0x01 + REG_FIFO_RX_CURRENT_ADDR = 0x10 + REG_IRQ_FLAGS = 0x12 + REG_DIO_MAPPING_1 = 0x40 + REG_DIO_MAPPING_2 = 0x41 + REG_MODEM_CONFIG = 0x1D + REG_MODEM_CONFIG2 = 0x1E + REG_MODEM_CONFIG3 = 0x26 + REG_SYMB_TIMEOUT_LSB = 0x1F + REG_PKT_SNR_VALUE = 0x19 + REG_PAYLOAD_LENGTH = 0x22 + REG_IRQ_FLAGS_MASK = 0x11 + REG_MAX_PAYLOAD_LENGTH = 0x23 + REG_HOP_PERIOD = 0x24 + REG_SYNC_WORD = 0x39 + REG_VERSION = 0x42 + + SX72_MODE_LONG_RANGE = 0x80 + + SX72_MODE_SLEEP = 0x00 + SX72_MODE_STANDBY = 0x01 + SX72_MODE_FSTX = 0x02 + SX72_MODE_TX = 0x03 + SX72_MODE_FSRX = 0x04 + SX72_MODE_RX_CONTINUOS = 0x05 + SX72_MODE_RX_SINGLE = 0x06 + + LNA_MAX_GAIN = 0x23 + LNA_OFF_GAIN = 0x00 + LNA_LOW_GAIN = 0x20 \ No newline at end of file diff --git a/lora_single_chan_gateway/gateway.py b/lora_single_chan_gateway/gateway.py new file mode 100755 index 0000000..24d304d --- /dev/null +++ b/lora_single_chan_gateway/gateway.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python3 + +import base64 +import json +import logging +from random import randint +import socket +import sqlite3 + +from board_config import LoraBoardDraguino +import RPi.GPIO as GPIO + + +logging.basicConfig(level=logging.DEBUG) + + +GATEWAY_HOST = "router.eu.thethings.network" +GATEWAY_PORT = 1700 + + +class LoRaPacketsDB(object): + def __init__(self): + self.conn = sqlite3.connect('gateway_packages.db') # we only need the db at runtime + self.c = self.conn.cursor() + + self._init_db() + + def _init_db(self): + create_table = """CREATE TABLE IF NOT EXISTS `PACKETS` ( + `ID` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, + `DATETIME` TEXT NOT NULL, + `DATA` BLOB, + `FREQUENCY` NUMERIC, + `IS_CRC_OK` INTEGER, + `PKT_SNR` NUMERIC, + `PKT_RSSI` NUMERIC, + `RSSI` NUMERIC + )""" + self.conn.execute(create_table) + + def log_pkg(self, board, packet): + query = """INSERT INTO `PACKETS` ( + `DATETIME`, + `DATA`, + `FREQUENCY`, + `IS_CRC_OK`, + `PKT_SNR`, + `PKT_RSSI`, + `RSSI` + ) VALUES (?, ?, ?, ?, ?, ?, ?) + """ + try: + self.c.execute(query, (payload['datetime'].isoformat(), + payload.get('payload'), + board.frequency, + payload.get('crc'), + payload.get('pkt_snr'), + payload.get('pkt_rssi'), + payload.get('rssi'))) + self.conn.commit() + except sqlite3.IntegrityError as e: + logging.exception("SQL ERROR: ", e) + + +def construct_semtec_udp(board, payload): + # https://github.com/Lora-net/packet_forwarder/blob/d0226eae6e7b6bbaec6117d0d2372bf17819c438/PROTOCOL.TXT#L99 + frame = bytearray() + frame.append(2) # Protocol version = 2 + frame.extend([randint(0, 255), randint(0, 255)]) # Random numbers + frame.extend([0x80, 0xFA, 0x5C, 0xFF, 0xFF, 0x69, 0x33, 0xBB]) # TODO: construct from hardware + + data = { + "rxpk": + { + "time": payload['datetime'].isoformat(), + "freq": board.frequency / 1000 / 1000, + "stat": 1 if payload['crc'] is True else -1, + "modu": "LORA", + "datr": "SF7BW125", # TODO: configurable + "codr": "4/5", + "rssi": payload['pkt_rssi'], + "lsnr": payload['pkt_snr'], + "size": len(payload['payload']), + "data": base64.standard_b64encode(payload['payload']).decode("utf-8") + } + } + + frame.extend(map(ord, json.dumps(data))) + + return bytes(frame) + + +if __name__ == "__main__": + # sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP + + db = LoRaPacketsDB() + + with LoraBoardDraguino(433300000, 7) as board: + board.set_mode_rx() + logging.info("Listening at SF{} on {} MHz".format(board.sf, board.frequency/1000000)) + + while True: + if GPIO.input(board._pin_dio0) == 1: + payload = board.receive_package() + + # semtec_udp = construct_semtec_udp(board, payload) + # sock.sendto(semtec_udp, (GATEWAY_HOST, GATEWAY_PORT)) + # logging.info(semtec_udp) + + # logging.info("Received: {}".format(payload)) + logging.info("Received at {}: {} = {}".format(payload['datetime'].isoformat(), payload['payload'].hex(), payload['payload'][4:])) + + db.log_pkg(board, payload) diff --git a/lora_single_chan_gateway/package.py b/lora_single_chan_gateway/package.py new file mode 100644 index 0000000..cb35b41 --- /dev/null +++ b/lora_single_chan_gateway/package.py @@ -0,0 +1,36 @@ + +import datetime + + +class ReceivedPackage(object): + def __init__(self, payload=None, frequency=None): + self.datetime = datetime.datetime.now() + + self.modulation = None + + self.frequency = frequency # given in MHz + + self.snr = None + self.rssi = None + + self.payload = payload + + def __str__(self): + ret_str = "" + + ret_str += self.modulation + " " + + +class LoraReceivedPackage(ReceivedPackage): + def __init__(self, payload=None, frequency=None, datarate = None, codingrate = None, crc = None): + super(LoraReceivedPackage).__init__(self, payload=payload, frequency=frequency) + + self.modulation = "LORA" + + self.datarate = datarate + self.codingrate = codingrate + + self.crc = crc + + def __str__(self): + return "LORA:" \ No newline at end of file diff --git a/plot_db.py b/plot_db.py new file mode 100755 index 0000000..f5188f1 --- /dev/null +++ b/plot_db.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 + +import dateutil.parser +import sqlite3 + +import matplotlib.dates +import matplotlib.pyplot +import matplotlib.pyplot as plt + +from decode_msg import decode_msg + + +if __name__ == "__main__": + conn = sqlite3.connect('gateway_packages.db') + c = conn.cursor() + + c.execute('SELECT * FROM `PACKETS`') + + dates = [] + values_temp = [] + values_press = [] + values_bat_val = [] + values_cell_val = [] + + for line in c.fetchall(): + try: + line = list(line) + + msg = {'id': line[0], + 'datetime': line[1], + 'data': bytes(line[2]).hex(), + 'frequency': line[3], + 'crc': line[4], + 'pkt_snr': line[5], + 'pkt_rssi': line[6], + 'rssi': line[7]} + + if not msg['crc']: + continue + + decoded = decode_msg(msg['data']) + + # weather report + if decoded['type'] == 0x10: + datetime = dateutil.parser.parse(msg['datetime']) + temperatur = None + pressure = None + battery_voltage = None + solar_voltage = None + for val in decoded['values']: + if val['id'] == 0x20: + temperatur = val['val'] + elif val['id'] == 0x22: + pressure = val['val'] + elif val['id'] == 0x80: + battery_voltage = val['val'] + elif val['id'] == 0x90: + solar_voltage = val['val'] + + dates.append(datetime) + values_temp.append(temperatur) + values_press.append(pressure) + values_bat_val.append(battery_voltage) + values_cell_val.append(solar_voltage) + except: + print("ERROR in: ", line) + print('plot!') + + fig, ax1 = plt.subplots() + + ax1.set_xlabel('time') + ax1.set_ylabel('voltage') + + ax1.plot_date(dates, values_bat_val, linestyle='solid', marker='None', label='Battery Voltage') + ax1.plot_date(dates, values_cell_val, linestyle='solid', marker='None', label='Solar Cell Voltage') + ax1.plot_date(dates, values_press, linestyle='solid', marker='None', label='Temperatur') + plt.legend() + matplotlib.pyplot.show() diff --git a/print_db.py b/print_db.py new file mode 100755 index 0000000..3a07411 --- /dev/null +++ b/print_db.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 + +from decode_msg import decode_msg, pretty_print_header, pretty_print_payload, MSG_TYPES + +import sqlite3 + +if __name__ == "__main__": + conn = sqlite3.connect('gateway_packages.db') + c = conn.cursor() + + c.execute('SELECT * FROM `PACKETS`') + + for line in c.fetchall(): + try: + line = list(line) + + msg = {'id': line[0], + 'datetime': line[1], + 'data': bytes(line[2]).hex(), + 'frequency': line[3], + 'crc': line[4], + 'pkt_snr': line[5], + 'pkt_rssi': line[6], + 'rssi': line[7]} + + decoded = decode_msg(msg['data']) + + color = '\033[92m' if msg['crc'] else '\033[91m' + + print(color, '### {id:04d} ({datetime}): {header}\033[0m (PKT_SNR={pkt_snr}, PKT_RSSI={pkt_rssi}, RSSI={rssi}) '.format(**msg, header=pretty_print_header(decoded))) + + # weather report + if decoded['type'] == 0x10: + print(pretty_print_payload(decoded)) + except: + print("ERROR in: ", line) diff --git a/send_msg.py b/send_msg.py new file mode 100755 index 0000000..18421ce --- /dev/null +++ b/send_msg.py @@ -0,0 +1,31 @@ +#!/usr/bin/env python3 + +import argparse +import logging + +from lora_single_chan_gateway.board_config import LoraBoardDraguino + + +logging.basicConfig(level=logging.DEBUG) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument('message', type=str, help='message to send') + + # http://www.airspayce.com/mikem/arduino/RadioHead/classRH__RF95.html "packet format" + parser.add_argument('--from', type=int, default=0xFF) + parser.add_argument('--to', type=int, default=0xFF) + parser.add_argument('--id', type=int, default=0x00) + parser.add_argument('--flags', type=int, default=0x00) + + args = parser.parse_args() + + GATEWAY_HEADER = bytes([args.to, args.__dict__['from'], args.id, args.flags]) + + with LoraBoardDraguino(433300000, 7) as board: + msg = GATEWAY_HEADER + args.message.encode('utf-8') + print(msg) + + board.send_package(msg) \ No newline at end of file