From bf3fab9045c9019455bedffdeac515e6175c9790 Mon Sep 17 00:00:00 2001 From: kerem Date: Fri, 16 Aug 2024 17:25:52 +0200 Subject: [PATCH] Htmx Is working for evey Select field that is so configured in forms.py with render_kw and getting updated with form.populate_for_updating() or similar. --- web/init/static/csv/.~lock.nbiotDevice.csv# | 1 + web/init/static/csv/nbiotDevice.csv | 5 +- web/init/static/csv/nbiotDeviceType.csv | 4 +- web/instance/test.db | Bin 19292160 -> 19292160 bytes web/minibase/__pycache__/app.cpython-311.pyc | Bin 2650 -> 3238 bytes web/minibase/app.py | 16 +++- .../company/__pycache__/forms.cpython-311.pyc | Bin 11158 -> 11557 bytes .../__pycache__/routes.cpython-311.pyc | Bin 4512 -> 4512 bytes web/minibase/blueprints/company/forms.py | 17 ++-- .../__pycache__/routes.cpython-311.pyc | Bin 0 -> 2197 bytes .../__pycache__/utils.cpython-311.pyc | Bin 2842 -> 2842 bytes web/minibase/blueprints/database/routes.py | 31 +++++++ .../templates/database/search_results.html | 12 +++ .../sensor/__pycache__/forms.cpython-311.pyc | Bin 12224 -> 13119 bytes .../sensor/__pycache__/models.cpython-311.pyc | Bin 6254 -> 6357 bytes .../sensor/__pycache__/routes.cpython-311.pyc | Bin 7988 -> 6721 bytes web/minibase/blueprints/sensor/forms.py | 83 ++++++++++-------- web/minibase/blueprints/sensor/models.py | 1 + web/minibase/blueprints/sensor/routes.py | 29 ++---- .../sensor/manufacturer_options.html | 3 - .../sensor/manufacturer_search_results.html | 7 -- .../user/__pycache__/models.cpython-311.pyc | Bin 4538 -> 5433 bytes web/minibase/blueprints/user/models.py | 26 ++++-- web/minibase/templates/edit.html | 2 +- web/minibase/templates/editModal.html | 21 ----- .../templates/form/allFieldsModal.html | 7 -- web/minibase/templates/form/selectField.html | 10 ++- .../templates/form/selectFieldModal.html | 33 ------- web/minibase/templates/formModal.html | 18 ---- web/minibase/templates/htmx/popup.html | 28 ++++++ web/prepare_db.py | 8 +- 31 files changed, 180 insertions(+), 182 deletions(-) create mode 100644 web/init/static/csv/.~lock.nbiotDevice.csv# create mode 100644 web/minibase/blueprints/database/__pycache__/routes.cpython-311.pyc create mode 100644 web/minibase/blueprints/database/routes.py create mode 100644 web/minibase/blueprints/database/templates/database/search_results.html delete mode 100644 web/minibase/blueprints/sensor/templates/sensor/manufacturer_options.html delete mode 100644 web/minibase/blueprints/sensor/templates/sensor/manufacturer_search_results.html delete mode 100644 web/minibase/templates/editModal.html delete mode 100644 web/minibase/templates/form/allFieldsModal.html delete mode 100644 web/minibase/templates/form/selectFieldModal.html delete mode 100644 web/minibase/templates/formModal.html create mode 100644 web/minibase/templates/htmx/popup.html diff --git a/web/init/static/csv/.~lock.nbiotDevice.csv# b/web/init/static/csv/.~lock.nbiotDevice.csv# new file mode 100644 index 00000000..fbdda0be --- /dev/null +++ b/web/init/static/csv/.~lock.nbiotDevice.csv# @@ -0,0 +1 @@ +,key,devbian,16.08.2024 16:53,file:///home/key/.config/libreoffice/4; \ No newline at end of file diff --git a/web/init/static/csv/nbiotDevice.csv b/web/init/static/csv/nbiotDevice.csv index e45ca2a1..80770a60 100644 --- a/web/init/static/csv/nbiotDevice.csv +++ b/web/init/static/csv/nbiotDevice.csv @@ -1,2 +1,3 @@ -name,device_id,serial_no,imsi,iccid,ip,port,device_user_id,device_owner_id,company_manufacturer_id,status_id,type_id,area_id,company_owner_id -miniUni,24070580,24070576,901405710203483,898822800001074,10.128.24.42,50000,1,1,1,1,1,1,3 +name,model,device_id,serial_no,imsi,iccid,ip,port,device_user_id,device_owner_id,company_manufacturer_id,status_id,type_id,area_id,company_owner_id +miniUni,NB-MU-CON-IP65,24070580,24070576,901405710203483,89882280000107407542,10.128.24.42,50000,1,1,1,1,1,1,1 +miniUni,NB-MU-CON-IP65,24070578,24070574,901405710203484,89882280000107407559,10.128.24.43,50000,1,1,1,1,1,1,1 diff --git a/web/init/static/csv/nbiotDeviceType.csv b/web/init/static/csv/nbiotDeviceType.csv index 4ef5686b..c623ecdc 100644 --- a/web/init/static/csv/nbiotDeviceType.csv +++ b/web/init/static/csv/nbiotDeviceType.csv @@ -1,2 +1,4 @@ name,description -WaterDetector,Sensor for detection water levels. +Water,Sensor for detection water levels. +Humidity,Sensor for detection humidity levels. +Pressure,Sensor for detection pressure levels. diff --git a/web/instance/test.db b/web/instance/test.db index e118a4ab1399345d8c8e770bffddd257a370c591..e6b860de416d944b1e33c753d0e1d34ce02e6a56 100644 GIT binary patch delta 65756 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

6+FH&D{%$R61v+Czm+|d$)>?KQ=$y5b%XQvb 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 delta 67370 zcmeFa2Xqw2)-60e)6+9U(2Ry?V?ZQh8v`Ri5@2JCoQ(jJoR9#KOc2R9k1B}_A`Tgm zLM&t}4XAn7q$Qj-~jRW_7m%HwJ>-}&2>wS;qI=i~MyXu5}YN~pARC5L|^5{v1=H6j( z?+C=CZ~Q6{m%g#?e|r(1=Ob@9O}7+p+$^SNZ1-xhJ!4zU3>Vs(#0)xZZWkcW575xmmj^t-op){?_sS%^52zqh+<^2@N$haaC^9xkHzj zHi3FWw8F17sot(jy=FgDYZBM0b-l)o+cs@i@8@2n8#M0NwqA=b!W!2q+q+5WdhIK; zZre1fMwh4_4eEAmUAJS+w`x-Mt!KirAoXqT6BhR)_Z7e&{{kJ-H#YijpZezX7oR60 zTQ*z%zc?PaJV`6)SZr}$bEmrl4Wrw&`hR}fSa)cYGw*x0O4`55^uW#qT3EKfKXts> z=u_tpuX*&mIlb;&;9b5fbjio=AV}|5so6p_-R<|bU_EfyoOOY0!a6`UWwDT7vX+pI zS#!untPx~GRu3|Y)qwn(MOrLDhu9~mmuBIRJ{D%NcviD=Xn)E|K~7`%XbhUn3PC2Z ze2|k^PRNN28U#&X$c!NWc%}o!{SGmW)LG9LJWrnLBpUx z&`=sbu_DAEd=Oh?NvIH89HLDKMC<$zt@1#`cp##)LwrY>_>LpH`>`e1+SlR^c5lpn zzd-gn**a%kndL^7a93~VGRHGVq)}M^QvcBQ(%RSk_&@r@NsEfK@gBjc3#w^7H0y_+ zz^}2|2e#l3-Bc-DD706P*zP?%qHd5QPo6wlLa&}Ntvbb;jizu1D!0-;3(T%#_XKve z(&`3ww$>g7n#5|wQVZA6&bZ#qTFYX$jz)~e+UxZ7)awLGaGwAYSl@ABL^OdVxb zQ^%fN+jQ+=irfKN-~P&$(B7L`t+LkMX0=!XQPGPknqw4$Dt$}jcH}8oP)jUk-ieQ- zxR@>-Vtf2mDHyo_y%riss;^}axT|Zyf&QJe1p#*(t!8S4&e~S%lqiqMV3F+(y7LC5 zX7g#6v-!QAnMBFpnbjb@GYdi%o$&*tV@3m97d4{uH}uwwgvs5i^z6aM4piTT9ESlp5bn!HAY`r(i^j|LZ9j z((=vZpCG@Q+yt`4zoK4Z60QusI0;!0d})%y zVsYo37!B#2SOI4fCb}Wjgm!2No&a^-o(WLJ?H=C=GH5&oc4r^|9%MHExSoKl8e@^xZu=M-Kp%rtblb*cg|v=t4XKU(6w)#p0|dPabcTEx zs1ErefB}M@kLm&WY!vzrdNK+ISlCDy;LSA>26)Sj^kV>T$VeMx!4Y3W78n6XdEXlW zXL|DwkA=)P92R)r9Zt#i&M;)JH}5cX=gl(=ya?Jn)Q{ow48<%G{Ag%t$j3twte`82 zF=)@5i21`3l89ghT^!O8^1_hHkmrZcY;kUIH{2X_c5rRTjKQ!z=**yAkf#Sx%c(&H zAWsgY3FE{-vf%hYnsAN{gt|dT2Yd^8ctBYUlWzd!e`tR=+}ogkB;=?4--WE$58m~D z(hrl0w?aRtHz~4vqe4T_2H65~y#!-|(jL2Cs~Tx$kn_HUdWMDg%2x~xuUMvRsWPEu!ovPul$vMCMN|w8Emgj} zuYB1GcB`)2gWOfzby%KUP@+;k%~~kzZzW=Sw84LWD)IUVk`yV`y=P3Dwhb#cuKsiG z+%YjR{+O6H_}4q8YSjaNMpsd9G3i_l+~=o;UAZ#;XkYO&#lm(%9VL@A5^Mm z_s+2$y2rG}G6}wl>Cqz=yO&toH??A8+JrRh71JF%%pRuS8vUi*8yg&7`EsG*zQ4{u zxrmBBU&XQ!rNS$O!*#mVrt9^8ddY%w=CBkhT@YR))m)^S%N0mIsMW0h*WLfrZ-sxk zrJ@lll(pGxEO(AKx_r$BO$$^!q}6<@sue=tI#{S(x8k2}XI}3=^y|Vu^m_pPe(~13 z|8~JY8{yM!Hl5`T{)awaYa3{P_}}PSzQWr^D_;SLWi=pJ4$qtYzILk?(2i&|8@%=I z@^3$5wc4##=5@c(=^uT%0s(aTRtJ>-ms?AURrv@Vxx;b=z0oJkhfCqqkB@3K8@^SY zu(zHGw}SvSo1Nv({*T?7jty)=w{PV@`EqaVHq4{|NWeVV-t3ns01^bgJ*L&H_tv}r zo<9DG1LZ+imOJa4J(_yL0h#FW?V7%ot>w#Dbz*>SWjV6E(Jy5cx^@Nn9sf5BhQ*~*JKyZ}PqHpTuWu!5 z#J_xaLcEHIKw=@YypA_J{nM}2PHI)(>eq<3k~Jb6E~Qz(#)6E0=+`8G7C44}-V+qPxv z!28Fw;Lrae_v-}!RtI6F%9IHW#p2=5r+fc=rmWL$HF9MgSZSTbvMer}?n%`%wTz$= zZGLFyhhFRp>=9(HrC z0qP!h4zB*{ZZx2ux=W3H)m`jqTz%9XY-n8x>JBziE~V}S1Ek7q4-hI7mbtjf#5Tjl z)a~y9@#=OJfM5A3`NjJv*8=fA_w()E=(kKL@R zg*s0TZm!O?0yIMZuru0|@O6QH5Ws0xTu8Serb zs59LFU#K(K$+_yQGuWNF>Z#M%u)6B1)Aa#$)ajyt+UnFV*jc)2sZ$McSW}()08m4n zB6?O=C$ZmjRZ}O)imK`)rUO?Mb%K0ZS)Cv&BGm~O;B$4nHQ+OKoWfj59S4D3pQ>XN z&`;Dc>_uG_)iD~df;##;pu9Rt4vJ7m%izg|D_k9=kc6otZ2{%f5psT6b%c0PMjh?} z2vvtkZ=X6`98g*vCO?-_hsdQR)gf|T33Vt4sq#!6q!50j4ps(ys1D`>e4q}H^~Kcz zN{9E=0is7SbwCIBi>m$K0*k2q#OK0lzXxBVwNU#y;;4|?R}B!N_K_0{s&t}W0hLZc z&#%%y2E3=zDZcsC-tPeKs=XAnchufsKwhmIeKAz+@`1R^=_s*NDG z^N!jG4V{^4Bc25~Z>x50US~*A^-=~3S!^^wVb@RUoHOxuum-y2BfQ0sOH?OQc1NvDm6D?w_4U2 z`RClFmQ};yPPGjA>)fH1l7qLarI>G=+tgB0c&l2{6R<@sA+K*%OF#kVCbgJm`4b5P z;Y-)?gn>}aemG$uWz(^Q0noyAG+_W7y z%F&exf--$Y0w;DZPvAuI)C3L+xt1kx%DANo>^s1c1bW`@TAaYL0~RI3#{w26#FG{& z3Gt-G0`=;9z)pJURtt!1i_`)l+d{Q~ z$d;n!BM+Pl)ci_-`D#AG?3}0O!CvQFHIHaDN6jk$n62ji2$-ej!ZPPfHJ8XeL(TOY zz+^QC(~fhxno|)lP0fMZoKw~8j({m@c4fe1H9IdLNzKAsH|v)%(tP&0c1 z#;ciNkaL`xSqLyz&7c9tD0)Ed9Ia-MF9Ir=d@)KTlP^Z9sQ^^+t)ztEU0cxrn&|ggoxRm~nnZf3@#N>8YP=25Lycid8c9xwRwF5(E!D_(0RHdP z2(tHEH3I4A{6>uk0er27Q}Di0!;y{77HT-M(b-%L`wh@c4Wr;SRl|tLP1G{GI3N5v9ooxZX8zy6Bo|BnxI zheieY#d~^gODz2>QK)j|${(5!-e8y|^#8~||NoIu-ag2?|9tAN9avbv^HR^P<6Vt6 zYt>%r#r)(Iw)lhmaTmfz^|M$-GwO9W>6QT21Yi>&e`u9&>{cFVk>5Bh<`i}p- zH@MC2{sTwVGu=@pqGH+5QlVkx{|o*8K2xEL&U$FME&1~2FA-KO&!6dyr#~(YukLhc z(xpRS!wbEhHMHDcWPh_pWUv0_1A%hk6#74(a^OrTy~9+-S1P=$FSJ5<7AsAOPRA)r zkjV0h>$vL&m)kkrS;ukeKl=LS|KlkV?`#B;YuHOzz1af?YS>$82Ls_X?J?Sc!04Lx z4%+^JwU)h&Rxhxlmc3vgp_aX>_8!$gaaGUj$Wx?5RNJ0UD-!5ZQ+p>+wYI%N z>e$-$eYSUg&SQSTuNs?Q(|76GGq#5*3Z+i?!rod-PSZTe8JcIB)q@3s`41oCUhEFM zSOR+Snd-%Q$qV0^ZTN5`48DeP73IVq_pjtlKOd^^#je05B1>R199D~1zlJP1Y^Au+#_{FH|y70YP%lRFEv+>KU#YQ z(t278n%Do9dZnkeuI8szpc@9dVIaM7=B9p5rmp_kx=iz%8j_}@F=nlJwdG*+Wo|N5OR#+-t#l&lrpl#VDJP}-xkL%|Bl5{uFX1xqXo)-o0>J1x;DV4DRC9?Q2VU!!1+YWWJK z1xj<2W++WjV1UsBSOSV(M7acma-w(&Ub79|7a3<|;(bPDAp z3Su6F*av|FK}S)D7c^EV*1cZD-1{j?MU+oaDxj1{i9iWQ2}3E1n;rslpulZGTT!5p z1#!S&6a&WjRVJ$}*It6n_xL`xQzHl;$YSP!KO~ zQxuTT+ZY98^nz?&aK!sHZaf4mjp742X@I9F(@-X(B%w?~nTRq0Wjx9_l(8sdP)4H! zP)4DQ^h1n58ICdxWhhD_${<)L;quEEBo?I&N^2C5&l`ghjnWe3JCtuxzQMH!jrj&R zw^*`IM<0Vx2BHi=>5tM6r7ub!6mZU44)jxW8}4_P zK|#FSu-ILCXyv@4;;nkB9%6l7aDGaD%+iroyuD%9J?r#1d=2eMHR5hPbuWv%V|dmX z(Z#fv?iqUIEj+#V-LiUS7$LVHJhwd44XR|`#Pu0BU%FHE^qX`#jT%zWFhfs5RZlcq z<8R_r9G!}~iN2HW=$?6c5e-9T6vdDWj1)RB5{qar3$D}Si=b_t5r-r9Iz5_>QjJ98 zrF(%Mh3iuFq^r-}ORP_9Z#*PPr22|zBam$+3LCT+?^bG z111L3MZVzY?qwln)e~%m6~X8`(?j}Zcsw)obP{PET$$pbVUx^LiPRcTB925fi6|10 zBzz=7NO(wOx*;-1q-T<#nr}Wt3OuT3hG>7PISgvPR(O%s$UjZ@B&X>iuN$oPKTq8? zjNg*euX~c?9GZnY<4z98cwakk;`;-p7EB$MPO>#_>qr1G^m$HsqR@=hV(ZJF5{a7$)lesJ8BnZ*D%}PRMKI_2cpyyzV$Auadn-6LIaOs3}q43&E+T#0fo^*u!H%?}tX z_mI~H$vq7K1LdA#fB|wh#h}03-4xJI?k)}JD|eGEedI2(B|+{YTa?_D9pIO8CkAu~ zxswLuawiSQ~&c)5e<;g>sTz~ANep8&tf?Oy_ZmD@`Jev#W}@4CU=nh~ z$PKvw(Q-Y7sij*$W=a$Q|OGr5lZ z+*Gau=bS&twci55mBAGL?FXl&KVh&t)ok^fS4vC7E4GE+czCmCHPUPvp|} zfQoWyRX_zvUqv{|%Oym%2)X17K)75&HigN>xZPP#4S}DWb=BYwc+U4!4aRKitfK}a zKF-=|P!~WgH3&p<)>MPu1=LXV+N`s>8dwYY=d7j%7Q|syH2_06tEd48rL(dcfWSB- zRsUZApR4|j0H3M;h_ADf>IafLKUMueMCT`}-$#H7svqWMXPD~S6i`m}{TNVI(RUZl zGOAAtK&a~D1Nc-QSnn*Y=uKL`vy@6Ghr^O8Aq(JRrD6ajlqwJSNGUhqLnVj0)BE9Q{r<#Q6&%qXA#8_NoQfj;XG#{#mU|f#mL@*iq!%XP>jsYuj0vE z|9dK)?9Hd*$=-M6E3)?;`3ec(%qw3N2jr12$==-ZCE1%xzC>0ybIO-wZw~o_?DfhQ zWN)yfFD)G9gASm+5vLOIaL5TlI+;pnlXuPKa2a>{3bhjL18zymqCs~>n@ zPKNW1dvbDNz+IVyXd8EAQe!}-OezJqEt3quEjg(r;HI1eb{aS2q+q~xIT5BA*W^Ux zm~mB3Bt@^t39!t#Bqx9g#zi>+4l*vt33S7GIsSXVIXS*M^3OOc$A{oBLyn_6&d70~ zo^e`^BhyaFaqzQoQjUe6jT3S#2xT0XW3vE`$uX?~N97n~g>giV!Q^KgmZQN0wPi+J{jpU0F$~HdnNtM#@HiAk=u65Q3#i@OO8Zx89OC? zYhmn=Bl7{a%Mm>R+vJG)fUR=G`+zNSIQek198MZ;lEXs*8|82(V1pb+?piO0QP*j5 zSkT(^{8$aI(<4L7?LuT>?WsFC-r-4(zT-(wbol1S6~gW&4GmFFPjZsolbnuvCS8Ez zc&9Hp4VdYSo9`=z7ubC++B&py8TpsR8wQsCaoBNSt#4rE9z`OOgpWiBPU{}S>RD=- z*JRppoMET^Lb@IMo7Y`&myvy0nz^w`D}+V=AI-yDMx{Th=V-9k7jMXdi(gmoX2FU- zGxJZ4x@W~jX_-34P07SKNtxz$D3kVF@n${FtVf&mD6<}E)_rC@1a<7#GO^de?MCKp zx-sK6HKyOD9oucRrkJfsXkBVJ$?W*so&|a&9JoODVb8Td&qN*DwL+$^(+k1Zf7+83 zo2?YuY~il!P%!Q~^&O3>5p|t5ZRtg+gLpW3o$kZCli1rOh5X&Y6zU)`#EfNJ0rPYm zZ9B1fyi3=nhu{GBhfpuk1vQKlZ6}S)Zj;b$sve1L<~k#zF!qlN^pvdBln7%|4d1n= z?j_gEm(Q+}S{YZ#?yESHc9rZ*!Lgo5BA!GXiD>h1EBc5s?}?<#edgsMbjowpvsA|! zIP(grnRdk-34Vji-X|-gUz_23-`v4^-q)-l^9(v;WRhiY3AA3ICz>wtZWc8$GO}g^TJ;O-60{!Dj#F2<55p@L}rxbz&Op9M{MiueIw%#O{ z?{y-FP`uaa9y*$5AnNd1L9;1?o=<=fbhJQEGjC0ST&E|!K9fjiVD2qAAq5+1s6P#7 zJ+B`jc)*2aacG8j51S6TLdqkCNNG4y_gsPUW-v1^n+~~*OVcltwrOTV%4O=3L?VfJ zIv$G+=9NA=A40-&*)v_IO6Dbqj7!wzC9}&*G)4-wCXq;_Q)y<{<8cZ- z<1+M&W+M^}>-4m&<}`B2B*`UoOLt^mq|P!f(jDn$Jq>kqe33dPkw_w*L>!4|5>X@~ zFXDcmc~6LWzX$cDhIxDD1zeCpBK-pCb%91nxj;Q9QEMW##-nwH5r<<%-J${Ao~Ld}#FL045lteBL?kZMedhfk=H;IA z2$p%Ad5&(+IEM?;&(Q#BW<$z3+?GTlkwiS5k2B9lo9CmbHIjsnPKB7KJUBI7r{m1C z)K$h=>O1``u1X`3LL!MoB8m93)Tw!8w0UI|wMLTgkqDvl9-NON)8c8^nswbi$)rdDQi=)e; zNkox|G!G}Ema-Khi9{j^ADu`V8G?9iq`RY%Xpj(U^_+r%RLMMv(K1fbXz3>*(r|2~ zoTLkraI7bih$j(8S4NvxM$tu)=0!d_6+*&u5?#_YnI~wlj1wl2QAejIC=@5qnq;;n znpeb|^*Hm2XgV2XHbj~yeP%txtb0(OuA>h<^EgBXiF6VvB$7xZl88T!(c_N)@%(S4 z9m_n6HD_wJ#9>|Serpak7;7x6mkoXg5X1(>0bFblmZVlE8-(?n)xie#1{iE0R=s$i zeIS;G_+7_94Pavfu<*hUT?SxjXw}#NEWE51);}7L8eg&gl7&Hsq?#ez|L!1`jrsNH9Mv3k|+u|7QjcUd3oxwSj2546xSSpqfQW(iPD zyTuX;0B$mcHKBHc(a#^X>r52_Tw@aJP3>yMFEQ zb1ZSSr_Z`UK73XaGX2?mkb9p}%busyvim9dVb_x%Aa_2&c1YXt1WzNh?T>$j-1Zoo z7;Wq0;*eV&VGp5ge)J{erbi_pH$EckH#|hJwDk|k_OyptvH#W9J;2^pTl;{5vgQHy ztJ>=OM5eQa>F<@dgZOuZKhx$GX|tS!Au4q9?I0&?+P^2DM$WcR{5 zWKzl{*{Q%L{p+a&?BZrdSe-ueb|#x3kswB%dRPMdxc zTMTX5P3$$bsW*cmr`%`+I{Z~L~ZN!xiActSEKn}Z1dJVlyY9(GKwT4_GwFX}*13BoD z6LR21Y+1Ac7l|zWFA`V!T_8{Ny$}xB=K>KW;XJ9X&J#`Kc@LyGN2>F4#1eLnRF6OF zC*A#L$@#z2>)qOK8RWoUGsv1>GIB%yd_e|#FvnrPLzQB{)Ckx(ee0KkR6Vb zeeI9CAln@yYuX;8xW*m}f^2g%7P9qG(!JGD(mmz~DH?r*)M|Nz)cWo)x&7P2C4`L?KnjIu=H9c62_}}EfFF5$}Kx4?p2S~3*2Z*Z;_fw)q z?I*4_*iUZ%VqZ(h`uoBl>+K`A*G;FEI_cC>J3Sj@t-Y-vYwoQ8S%Y54)~fFzw^!Rk zjH$XO2V|AqPa{Efse3ge<>< zTpFSJq*$;4^D6 zSa8N#3>JKLExHaqw+8eKKEEas^1_-t_y)1a>MoG)uZCB=#aF{~-Vav6bKVbEfqLGL zRu#mRr&oe{mK!VULS9~381mwZA0aQSXaISB1w3atxBNHAv&;QW02#|ahCH(zlZ@qb zD#)1aRw^c$Y`5t#Wwy*^n3{vyF2k%~@h^kxf^RI1fxNjCo(sOU6!rz*UINbrXD)#; z!FQIBF?Sb}>h~7IPr>&WL-pVXi#kI-TvQc`Iu{|J!PggdNBk@e=-HR0?!p3)wNps< zS}FA)Yo?IyH5QQW)fbTN)fND*?JpUf=@S#d6SV5u&79*-ooRuLlzoKUKu_`KCegL>YYqhX)7MxZxjtpJSi)((_{tP?;Wymd!G zb?@i?QKb8jQ3mAvk)-L|k)-LIky#;Uk02#xjVKQ}a|D#I%oyGZGI==EvP>UNEz^d@ zLQWk9r@K#aoR2I)b;v5I&Vvu^D-ym&$nnPOY zC4bG*hpc&(@IB?>McR zL(Gk?2lb`8S~cduA$GYqAcS2)ZrKVl z`U#n>0K4=7z@ML8{2llnyZ9v_AG?Sd#P%+`r~%$#7n%X`vI`{vdDsOTAU8V?_S$l> z^FBaMcHRNV!OnrdHZMCD1_);7z+jt)odscSZgv*@v<0!V$QxUBmI12Svat*h(w5cF zGQ7Yn>_m6K3wELw;5j=1I$EExb2U*8A*eQ@}k&U*lTuvZKgg>m7FFYd|JDQU-9F9dQC~vBPkJ^(H$E z23v2i!&v~=*`a8_HAdg!TCcK0*#TGB!PbDw?4Z8_@De)+wp%Z<18o2o*a7&bvN4yCRul}onVr6C))`oS$D7<=q!67wxbD-wzC}|l64!~0U}wqvh5&} zbqm{0KHSWuR=zoVbc@2ED8+*=F+L3bvVixSVZ@1*Eb~n98in*rs5>QnrzNxP)yaA1-DaK{@Lp zwxK;f1FQ?#25`=r!Zv_&)&*=mIA@*D)>j71W9#z(=CZWTfH^D;oU_hmY2?{ijJ}(- z&SdL|b2HdF;#@LYi)6M=XKTsb)7V;a_f)oq+&zV@K{8t>vo%D-B(}OIz(0wtCU;L{ zs|x`puvNVQCeHO?i^($yY%zI8u|?z=$rh0l1X~mW;A|lg ziLr%bL_AwaMDjC#%5MnsOqTK`4u5AU9|3-2DMXrI*@EVPpV@-axFn7(AS-@i^NAk4 z+59lT4{Sa$p%vg^AVLj?KaciM1`8NsX~=CN;KUGwI6KYz76b z6`O$%Icp4?Q4kQ#k|~>7vSe!fjwO>5zGc&Cpl=v0i>zO>>F-huzhcum0$Q+Xl+DfA zG*Z7An@U7(%IFVtS(~t_Wc`FfUwHz;Z2N^L=zyQO!u)Fci7Qxd`;n_GfZklj z0Dj;y9MFqP#NO7E3&h^mgNq7)?p$Efv~}YgT(!k$6g^$wzljQXl;vSFUe1B*vo2w*6d{-Kr3cG zTG7}GG+MK>7c>iGV|cn^v1Vn@$@wwtIgJ#}o?#}owPer8&EK(SV2SNpKYL0p{f0el z0Qj0cB|m?~o={^8_JsW0oIL@{Y|YqX(y1wXOgc4TkHK8qm+TQ(W^2qIfn~Nv>=9UI zYsemgWwt2xkYd+>J*3;eU=OIz`s@J>RF6G)A5fS1?_(yn)nWG=0cx}Rn8|Im*uCEY zHQBwUfEw&xDL{30&km@@?qU|PRb_X}0;;gPE?Xya z47&l(+Cte4ik6SvfV=TW|9si={OezICAy3HZAp9>&24bm9;P%o&!*b4Wn^G*f5%_3bJ9~tF-_d z`XeAe8yW?8j|~N1toc}?AMh?qYz}ybCHeq)St2<-5BqpXG%zV)q5oGiPH# zoiwb7&9C3(FENIGhrh%awqyJy#?W)}7wvI$fWP=0aFoBujmAv=91+rQ^XG7;ev8wC zPyHr;1}f+`_%kGtew{xn1h~eZ{sg$npTbi83V&K0aG5`WrTQiQ1eu{<M3^>T|{R}w3?==MM_w##*g1(R6CEe2bUD9nY zzl)hy-^1_P0K55}uK>IFolw9|euq@s!87qus&D6+m}B*AJTog`E5F?eu!Y|S74*&g zHmSCW-y+pE@>`z)Ht<`y0PFcpTiI>{3;lwFXHt2slJe31zGhJ zPJc5)U%;=>u=Dv9e}3RRe)&hhTz(l7nLdYKE(Ms)FXMAVpT#e=0nFr=Nc|c7QeHqZ zzequ!&M(#jOyd_ZAL>*21sZn>zwjksGQR+N>PejTJ^Cbmo_siwpC=zq;I!}2$MbXF zlGn%abEM)}P8%P645y8cKAN8;CkFW0V8AGzf%S+!l4nE$M(_;G82WI221%w5<7beZ z`cQrbQ?T$kz)t&Q$+#&`APbN8hSr|vM~<(@{^=+ zAAXYfn7~gE9~D1Ae3YF2c7`taaY_}=k4FF)KaN>hkLSlIzJ7j;RQsJDBM1G)kH!Ih zN9qH9%9&-WJq zwB!4Fdw{ae0=%>IV&Ap(ERcN2lX;=73#E%@%@faZKRb={2bY6fV^ca;J(;k(GqU;6n@ zvam7VNyKQxcM>rg@*TwWD87RRY`}LAFTUX0i5KpH^)w}w z<+K^n%kVUcNGMMu%KCU3Eur<&d>zrV6kkUnDaqFr2Yk%e{thU?*V2^q5nl_pWxL7O zA|lzY@ilNzw(EQi9F#SYuc3+YL%uo|@Bv@_DWEuCofGgrU-dnp7+*yRUzD#RUlidh zy8#OGm9&M`3-OiYj1W!_d-Z~R1!+-$uOKb*^W}8Odwe-*k&n{@U;Q0UPki;foF4hw zPV;FP*LI3egY~wPd>Z&@JHcrMZadDWA~3cid@7=4JItrF103Y^GM#NdpW>k<^gccr zjG`E?J|Bgd#Ws)A15BHLE+6Fp&fz0l0%mi1h-sU}N0O#9 z`3TZ<1|JatNapnSb8XW(tv77b`0$E=seCwjb_%D5nf6j5u@|7ENTmFGS0om}(Z^y4 zyk;*UhBO3xB!(d0?H`K4V3+*^zZeX??Zw4lsAzv*3`St>#l#>4)?QQ$g4^sx#2_c2 zuowsp?S;fZC}R&10}*C>K`{UkwHFWr5K()6F(4NpujtzLXL- zh%ceU&CZup0c7J#-T`Fgi@O4{@Wsdq-NhHvC!UipqDj}m7s0c-!50+;*!e=lSJ(MM zgjcumh16)}DL()-oYZQEl$kCOTkpG)j~$mfOu9`LzY0r&YFgu-@@&w+)uyL?U%;0~Wnon`Xbu*G(p z&!%L)#b?34?QA#sEI8P9gU|W^aGlShbh^f8QjT5aGpX?kp9weHF7p}90hjm;%CU=l zh7P#ElPR6f^JGf#b3B={=`5cPme?}*bjqePe0uiOJHvaI@hT&uamG7tad-eiP5&QR7$f z3^o|Qh-V;)@w0gPE8r*b6r?tO6i=zKw|Mdk;0N)98heQ+#Q{CVV?@cg>=%z=t}#PA z{s=HjJchYOH}MFwhtX9$LTVaa1ic4fbQTXmGNY4tSQ_xXcnD*Rj^Y7)U~~`cMA?8M7aVsyNk+|6f&`{h&`WaDzR=q|8al;RH8()YUx%33 z0d>T65ZI_Ku8|XKiEE7jHN~|L0X4)ma#wY6mE2WLTm?Ifs^TixVN?-U$TOA26>>tP zxPk?g@wvE6=6)tFgQG?zaXCA((D+o)Lf802T>1o1QCuR^Du|060OiHSNI- zXA?&#pjpL{B7iJ{*13jD9Hy?F;xPHbA?VjyhTjl}S^@3i5Lu{;LwS&Rr^G=r#wHHd z16ajDN*PTY!~|hj!~q1>{z@DO1H2Rm;3xYFu^)c2KNtHELi;nZKN#>->;pUPPsBd3 z)Bae{<9_=ikq!;*4@ElsWPjin>BwgLeX+L};GWnEN7?U+y>OKMj@Sc7*)zo+ILdxo z?D+t2OYE@%Zi?OC0B(rg^l5Zm>_!Of*TgQ^V!tYO!6o)9Vi##~S?mOn?3cvO%7BYv zCmDD_?C1(OFZ??&``FKk9q$3oitPxOJwt4V+4eJHdr`n?u?^m{pA_3LQP@w2Z65)S zi*4|Q{g|LX2WLMjwqj1O9}!!T{`Ny+3+QD(D7KJl2gDX|&c0u4rrY<4&16Kn*hH4? z6`TBD0QZPZT~V|TzVv9ShVr`VVeutRL<4A?F>KrJ$v)eT7&>jmyOQcotrCB`b5Na?Ur4xve8g&cwr zjOB7jE{i2giX8ksj#A}dXzw?c%E2_XERpoHD`T;wpIsS?B>n8lSSaadS4N5)2(lUr zBt2s`=1Y3UY|N7bV5l)y4hR9vmi>PKB+LGkG1F!L!hmVA-;aQ)vLB*sOp*P-Cu6eg z+XIj!`+|9ff0FD=!%vibNT~_350o;-%RX?aF-|7HrN&s9K*Nub^i{GkTB_cFfK z2&~axvPeKb$v^?4ucSxKMjshp6_6m~$umm4BGsgLMOFwwe=E-5f*v*7r;DYv0n^0N z5WrNi1WvF|5lb2XCJXu~e-7tlw{D+EXobKzjS5_9VVq?k)Y7Ge%%EEjXg3MS?h1H_Bj zzX1GVc0<7LVm9UWZ(^1o@T-{B6!43f^)cXQF^eqwNz6oi>_3W`r2xIfOoJ}{LChf2 zdWjk30X@YGH=u_|ZVTuxk})say9xRqq}byG{lLoJRZJ(-x`^pyT4ynhOzR}3AwKr+ z#Wc#sj$$gYY^@whp6MW_k}d58y{uwyC#KM_ZN-#klz*{eN;w?15mT}QT8qi80j6B9|9 zreXrp$lgRus0sK|OrY7Wu^8VI`Dbq=#uHl_itz;jQDPiLq=6WRJhFcwXisRbFKAC_ zuP4SLkL-2DSmcqtju`VZptcx;Jh0aiV~PW6iqXWY8e()~Ky@+tBS1AV+5)I50(4~+ z5uiRRi&1oY=SVS%g7>)?MZx<_&>x(zR}v#Bc%O=qB>|s^kvgEF7(pL76~u_LfbwEQ z7C?j;9s>v$!zp%QVmQUFoES#2D=UVPyF$e9MwF> z@M{3`(Q)Qc^L^)|^omCMQM{s&Mk3`X-qT3JsToEhszyA{8iiJLjQR}2NB4!8 z4W1)^{mg0uepR&Oh>kll4*%7-KWmok(ETv=ZvFx!5mh7lFm)DXHu$I^1PyrE`!L>I zMv&tvmRpJ;yH-1%;U@h=2!=CclrUkJM92O3W+2%8i_cMj&TZ4@y&X)S&uU7 zk>)Kvx;lh}=KwULO6Gou3=-)i(nzF`NZL=G?l(K#Z+2?dqfy8EI&?)OUEwoZL(D5Y zudl$j38_ZLKK!O8{VmqKd#mz%?6*@ z;Asr6g;1*ptmKuD$f0;Bv4_T-2@y@Ts6BMU9@8m%XwVSU!L2=rw|Sho+ca^vX(H-i*KU}VvKv|@ znXQTD74fK}cbqfg##8SkqSm0tcsOZ>9!+;ek%**QedgsMbh&3Yyh)YJUAQ`9mud7a zT$qMqJ!Kb-oP<{V00VUxO_#-)mqpVRQD$o-?l63GD#X0jgVv>nS&G&t^%z-tf;FPJjP}SE?tfkuvx%@ zzdlA!_yVB%0^F4sn6C_OmcY&83p`$dexLp<{FtL+&Cu!+9J*{NYQ2D76?e$5w^Rug zeigC&JTqsZn%?tFnxV^;@4(P+!;d<_)esXkd`_DB91{@A&mpSx9HWZjD$wfFnuQfT z2-VEMg>@-mj)d8auwZB~g@@0gSoK*LE6++}p_-*p})JQ%(ugaO(LD1n>Btupb&>eHGfc!Ui7F8oLe9y)@hjei8uMb0nu9dogj`?{(cb01poGiXcchRpEx@B7gx=Rqk@01 z)l3{2{Bt415y3y$L?;dp{>GLqaaiy-_R9%7_?wk!8SKWTbmGupH+E-v!C(7A zG!J&LYIVU5R?P}_uxhozpV(t2(!rnD-zQSRpV;{&lEEL?`6Uv;AK3UM;z90@V=pce9E2JC-V~x~z#DprSnwNmeu*Z*Z`k=IqQQ0#!U(pX3K0pmr*Uoh zZ}97F5dQ?fo(b`H@M{Z*-N7$+LF@{CIU8bU@XP)Xe+A)v5Ice}cOK-QL3jwnAHmP4 zaQye+XH+=;Tkta~9N!-NglmuZufb2)zs7$Ferg2~20uOt@pJIwRS-V~KjJbY{$ucC z6yk?~&rgbfAN=4zd>8y+LVO#1-vi>C;Ct-$<6j5gCm_BGzPmXG`DO4OIynAC@Etlh z{(0~%CSv@v;9E?@_@}|Qn27Oe@C_zn{FC6D&JZ65->?-Q1^m&6_=myQxU7o*FZdd> zGyXyFRTkp?;H&c?wgq2dyB~iq_>wJqH~5k*dnfpkEqgoo;!#|J#NP_OxD@ow;ESUm z-UxU@FJ1{g#{k7&4?bsmUkg6NM2^22e1^Fbe56E=5C@Cllmi*F7-W_!!Q$87JW;A6IT zWAG8%yCL8wcH>V6AK{8IzCQR6_Z;Huf)8=c5?>qehF*M4z#Dq;)d6ql#a9LYV|^Qf z57@CQgAZ^e5nmB}fGdgk^56qjZCUU>=2LCE;C)mrnQIZe&$=xQwy|zY0^ZPzFAlb0 z8O9d{?_sXT7Y6*bhxmfvJuJic{NP>o`n-VO8;Z{j-o;#x&k5dn5TZVKhgF*$yu)6f z6}-(}pBcQ(p_mc8&B$W#78@}=c&jVKv|R8O7EpX@z$Y%nrvz_22{Ac%;}nReg36T; zlY-Z=n&T6L*Ev2Dg4Z|(;{!f8DLyWE^%#h;!7Hrjn1Jst$43V*V-?3o1uvnY@j~#@ zUJxUL7daFo0zUXCK0J7V-8?MFJ@yCPBIQzu=1!dOvv7mev zMBkvy74v9N&auLMf=$;$JQ8d=0pj6c6P9@Vp;-`1uMC#t_)UO193&bN8%)ISL511^itz^vc64?g)ecd8jE30+@i+f43oH7 zjlqgb+@!`}m=m5FgFa03RHJW#xKWMn0MSG7>mG?4)Tmw%*Q-%yVf`hpQ=|3l z;u6=W0_vUUt_nDrB(7E?G3be_)JTkP;z~6V`Yv$hNGVnm#E>a@5O2u>wA$J#`<2UhG7{dE>J@;=80TaHS~DM^VLwy(!_ac z2wTxb4Ph(JRYR~g6X&Qr)@Gu!%44o3&Q^K!bHY^`qm}5SG^R(QqtaNLiL;ct58_Ov zu(%RuD23_KY`Y5jK&(^2CFs%fRe;WKcDfq;7(!0Zslj|9I!z5m=O;R-L6{JUQ`MlW zAx=^Jq2$ELYETo1lhi;=n#74}AnF_M7Odc^x;$8p`o=TC@)IF03znnTEdERnn9C}*3+AweZG$;H z`?Lw_dGc!=)bq4)Y`|YXh#wQo?gr5+n2nhbKRTH81jJDRzo8XBGML4=enc=6-5ozX z;Fq-GhXpfRL)gL0DA!-hUHGrn3wTXFoh$U3?|YZSfVw*2V=2BYkmvHVzg_v2V-$wuK6_> z^8myz!5B2VCJe@)*)=~0qtV?pKLw-F?3y0~{s=$HMFw8Zr4Y&`0cr$z&?&{O*t;*B%6mijFmSDg|46p181fP(78ZB7} zC4(|C7tyOtM@rgK(s~+~gi17v=+r$SPz#^$P#RVwI0PKFkFX& zR0$PAnNT7W359h?Kt?ozL#RA}q87p%Ood{$w~fSO^0bYz31g^rGFKvYQ# zMR68H_r;lQKpu|~8CcO1;HCp^+Tynw&=ZUaR|2Yp3ZcA`NmsH+5vo~ODRqSb<0HB! z&J2Q0mk|!E7#|k4Rw5}Age#b!x&lyHftd0NW+}nC+ANB0kHlgr43)()o56*F@D!3y(D_E)Wlj{Qz-4?tbhf18SWtjv!aAVF2Nz#@WdF{3Nsu`;2w7)6SUS`qgbo{sHO&2xG>c2=ocJv|AL*3(Xf zNa?A4Ad-5j1Ch{E?t+NxDIFnd^pxfh&GckkP^I?Lld-o>nR+rdi^$Q(vNOGO}7hA~WTE*K?$u)}Kb4spO|MZ4f zrT9IkWP{@8$&xG8-&u$i>hJR)mMebGDY;DT#(pJPQoFIqOfFTsv0q6pQM+(SkzA~H zT>-I3?ZO5rxiF`A8!EX#?PM+HtDR^}a-Q0WO`Y<_J{ZR|?l;W2v zl9N>KcOGz}`h6dW3F%So*b*TW6zl!qqcX27_GLqgczlM#TGDG zP`|QjBh{}*LX1$qJPt8j{c+VxZ!;o{|F;KVFvXuYSA_!dE}CpL6QRLm-}1KRg8Sg!kNS?i_K5nf9mK=xyC#@y$%oXptlNX?Th{FX z^)2gmzxsyVmQ~+i%bL7TeSgicj-S-lM+89yxip`ik|vOMTS|;!gF| zz7Th)FFAv5S6{L#d#NwkmA5H=x-5CC`hs0~i~6D^_U6f()#vQXo7Cs*OHc7>-pQVd zPxDURs6JyWdMMtFO5UJ8V=Jy#yc?CgPVsJ3@><2aQORpm^#+LUs(K>C)vAgeZ}KYj z3H$d-^+^YaD-`cWCA%r!j7navcrz-O%&3o9;mg!V?BGikKVFu+M15pKT&zCCic4Ok zKD-p-LiOQM5Em#uv?keA@u@Y*^A#UklRQuTFAC8`eQ+(rx#|Nf(d0SmgS{X+tM_k& zI9t7sYsI9i-p9gAysEa{0+#Efww(dlQEh7uah7_IeR-yOk7Iv^;xlZLr>l3l#!gf3 zvfDbScMpX)RlUPrJ4L<2s-3LfX$5hTdYc1!qI&ykh!fP?9OmQI+gu!u;>XI8?bTZx z<>S;_9OZU7^(Ke8t$LHIqm6o#!`xcE!C^jDy>TYQG3pHtb1PNB`6hX^s<3KDsS2xh zql#b{NE=>eWXf4pFaWAP!c%r$zUt*35c{Z?*=>8PmwCQwu3lod)v1@*YnFP6y;iGUWUr;w zi!MY;y|^DlQoYa{BB5UB0ufg)91KyTo@dpXspl_%*h@X1<1m}*ISzAE^&I;$rk>*r zY@(jU^;KfHdiHXN5sIHHi{GW5L46b3)HCehsCuR?grT0{5|5~@82iM(YAeP*@sHYy zMkM}LThNHaZnXu|GOq#@Q$Fr{cHC6Mravfg zFd)8DPhSJ^t$LbO`$j$84B~6G-oyG!e5KZ7>=R$A^%(oa7it~GKJmF)hp|t5rq=QG z;14|xSBJ^p^*HwIZ<^Pr$?bY9yZcwo?+T`_(0mF>>PkK46o{)d?@gty)_mA)s=FSI z)~Bw~qcP`F*J}PkU+OwN>LjkeZ}ccw#I7j4TJ^WaRkMyu7AwJZ@x(|I=gU7hD#e@E-PA>P)y6U19u zTM%z*bt}XhTCv&{t+>=)*Zk^o@--bC2l1*7Fb2t2^x*CgFYCc=AYRggSi=`{dJwDl zf*y1<#PfO}=3MeQ&EFnPKCAiLqseD9e|t2!RS#ebx99;_)QL~kT2v-cRcleh#3yPk zYMA&~t-)$ce5BT#2l0VggSI5zSF0a{cu%cn1K&}r(d@+AY87UD;w_b1h0aL4saA0c zy`dU7g(|Ay3W(QL1E<#1>FNs>D`oP)pg0 zr`1xnV!c|5b4p^JTEbSWRlHx8SfiF44zXJCepzCb;{CEjgW~1rULN3vzYM}$ML@nHl>u<4Ia3jPbwE(j$u~6}OM~MZB4?IfDSMzbA zNz7C8TR_ZJ^Dy%hbJV zP1Uo1r>c7P?-W&kEZ5&;RUZL;O3lXjCMK!b9N&p*HfB;{f|_*$#CSF9M2K-}7OOT^ z&1BWasF|ljj8-$TYeL?92wzQQg>z~uC&ZI#Y82uLHHCfoxSGPg z?5C#iobs6BowY88cCI8lZRCjW>o^Ub5EOtTmYvU%p7=8~xMFZ%Kw9Xy)R>R!7p4m5A+$P=p2|EHD~n!&j%!Og3u4HM z(}Rx7ta&(+ODNq9u&G(|aA7Hh!nw>iw<#W{T$zgtNV7bb*-LXJ<6NXIFv5ow*F@kk zkB}j_1cy-NJ(059kQ)fCco)E?!s)Wi+gqCN@ z0M2CgB6L&>=9n*rtQb5RGBYvgHSWy6@eFN;rEP*W6H|>!I0H~cgUkx*k5+=mN`xX? znUSWs;&N!PVL4AmzC1MsULr3} zW%5i9=>|q+Y4!G4rL0SXBL-Ux)>KSV;o+1f7`y5eJpVjanS#P)LWxkEf>MPkOzuu$ za)$6RpPr*}p3ZC*)tVRh|v={nZvjCsz6S4>}Jt>f30ha|FDPW7$dJ3lw8pBB}S)Bx^ zOhTc`P#(n{i9*?-Jjzg+4D^=>MM8m*{v;kbi}E;>=o!i7GQuI)1ZxuNPbHiPs7~ZD zCh{0%sIk&SrZ3V}pv#8~NyX~XnxWMdt0PvMR%;^Wmt+Yipr%zqWdf@^f%!_{W|2@J z_=GIMBV-V0x)XRH2jMtNiEcq}Fhvc=(_9_TYKHG3ZDl;>SL4qm;Df%a{4}RpVLV*E z#AYSd8xL!SR#&W!SZ!LZ@#t_WAx~)4afm65V_kiyW_BD8<ox{al`%5x zP|ea995*kfqBLS4Lbetq!4t4lw<9S*k4EU`tr}YNoWtpdBn5j%MAfqj|8= zaJz5#1Kug5D4lH7rQt0uvL;gc6}hC=`&)FYsVliS%gA z(CUiSffe-?-GW{pqc0rE5>>PqX}Rjkgc6}Z@CjLhM<~h+8;Ktos3h@l{w3u&eoDj| z8N=in$!sIolhqM`$_V5wk6_*sc&tb$5PU+G;1MzijJYU?ZoK@TPB{6{Y7?vx$V+!P zTxvO7YB?O9GND8$5()&LkR6V2Pr@@2?$Y24=NZx-&Qq#297$;mhe>6Jv9iNh*OJkr@=&Fq{P_@y(#Cg(oh5x2|mFiWC$*y@;JbuR@BI0 zOF;_-QTy|lr1UsPUd-VTnyW)-u0TighoE3-2nrU(S`e#GYnI>g?ODXTs4AvV^pq8#L@2^&7U0KZhYK~6*fP7*V*yw3 zRH^vhku3q%o@5LN1J*2H+Cb8Rnw(LzD?6LUAxc3-F^K!ObkeBV^z)T`A)*(q^QE$a<6Ra1c`tVoJLi+?7Fq zGND8$Tt=Yg6S9bod4pJujFfR{bqF@W8icW7OgK=gI#8-Q5QefCN@6I|;KP7398`RF zR}RljzcmmE=ne-+f&pxI1v?8`02vtZY!Mc9#AVZ9!O&m| z5Bq~x`!k@@pJmH5l*CXJL!m$N__StWMJIxr8F14TzeB%Gu==B}3=DndtNP4WeSpH7iz6(qtr!3vm6$A&Y>RN5~Ld z`W-26vy_FPhM4dWOUx`13XiimPGD&2<2;l{Ylc==td3Z1TCK;?e=yFCh5eAf+7J0F z{aC0BZk7l|LV@5DvWPLgeoUW1B$7f$@4*+d306Psr6ouB7~Ivzr1u_^-h+mK6l^fz#t=Qq9Mwk=UwM@AWvH4QXN7|^;th$@1|3gYtV%8JXQD?@PUcf@al zn^qsRo=S){WmX?yq6*ejtjsl5e1!EZh}EYxD0IJ|hjKdh4U_FekmD1rutX%aW znH115(;fnp2*rnZ5OMhumKEI-JtMj+x+A(Rx&^%S0Wuo+KjXi*;68vw&ROcn zdCo?-8Q#K@s_I(h*irYF&vEbGrAj)d6~W|VO=eJd4}+@ru!0rQ%c7S=FG9!ZhKe6olUmbXAozr=gtNaqM53GT#+8wCw+Yp{ zTjJYb<}p)v7yZ?{WT2oU>s^4-U9c8l#WIB&b0y4?Fk8Z`yU=WghIaz0gvy;LRKAm` zN_WaIK}WUVi}{2s0%9Iq7=0FSS-_D3wiK|SH^f8@?_k;L9Vk{Il<(j6>Y1UCx= zpO7VZgbZR#7X>jZ5xLs5MYo_gn36BN9jU4|Kec!*lXgJT>g`NgfyXT0jzXo|nV<+O zx&S&V&r(@}N5~LdgvJ~x>S1n~9(&A32Q|cQ$F!{W;;y#Ri!-L&i!-Lw3jxJm(j!n~ zelH#%3j_K@^o;1P=#J>N=oa+)ST7tjybVyjjhSzgu>vqWO)yG&eyctlv88MZcrA|=I(#8f;y~*hCCKj*W6op=aj-kH^0VOdM#aR&D7iab+r0@tCg3H)K+bBEH zVTB!}$v8~upcD)UFfA0Vk1;;<098VTP$rZ-ytK5*)g0DR13~-iFN#S^X-Z z(u3K0uxiB~tXiQ5GyCwxvV@8a@Tj>6jX6Dd3|oS%9+*!whBweyy@4ewHz2fp1FR*n z7GcHMi0(^7mJuE!3O37y*RovoS{AvMhKv+(rHCWC4SlX@-GJ(&uo+&@>R*r0%JnQ; z29K4%W5w%b{OI!GLZ67iV}T68B{&3|U|o-tRKn{3RYHYOCX@(8LV@5DvIOrs*77O6P=5SAc;`DkFwdVfP7lbB!#m08{`qluyEg6T z$Krk3bS}@waHOBi^D!Lh|L>K}kGcru9?p-#JKyPt@&(rE!F&N9rb$1LFC2|`zSH;T zN8;_}bT&T{Zvm(8%a3dW(K|m9Z!f3s&5yVS;-377_7HdHN8m#U>AUj$>QQQOemLHU zPT!dy#zx$cABK1O)3@h`vG{HIp~z`%$PdNmD$=*+haLlQbAAX9bW?r^>*VE!;2rN= zx@TVFg9_;z^ZEpc9(lbN#0`0ccihw0=lQ$r>Fe?e9h|;4A6yS{O+KKpdp@A?>O7xC zpS~(T_;`pb^MhIZiu|A+5Z&^F*m;-d2h~7i@&kK9T$Ue*cg53}<_EGzbC=}#UE%b_ z`2qOwMEasUf8Q^CVZJ}hUy$$5q+Rp^*?y4J?-j$&VcBo|7i}9aJSc%42||IImdMo#a>X9LowYyQ+<`ZUc) zUZ*=~KJq$!s@}zpIz{ioC!x|O>z(}|PSQKsr6=m0?9vl7A9)+U2hw0xKY3tt@*-~$3yjfd#%35bLBuUuFM>0gh4I8gt> z6?K5-!~W9yYd-8Ry`K(qwC<}zTKCZ*t$XXAZ-r=~f98s8u7Bp>)oK0$VA|3@u`#v! zCleyAf8^Mw^pBi6N&O>7B%yy`v*Y>)d_*Q)qkmwto9XXq+)IDY;->zd9n@5R*PXo= z)88?)iT;kWJF36sL^kxdoX8RV4MI}?>TfUOrc_Msqgfs=%CcM`cs^;Qs3w*x-#{( zuAT+)m9Fj$@umLcZip}RCuc)^uK62*sn7JsS%^>d$6c}hQdRx24f=`Z6RcAo>yIvj z_(*?rG{lGc!zUpAr$1yZKF}Yc_fqfc4>8G8+w}kLfOt>;k4<}5|BpTMj{cwz#M}A< zWQm*lgJZzn(jVYll6q6~>%gfuG=DrWRnhNT5V_a&wmTtT)7v^jysEch0i<5h?>z+Z zvVM=1c}c&=E_qSE$22eKcQNRx=QV%FC-t0u7c(LCtbT`|YI#P#gJqc7s^7s3Ol{F` z0ijtI3gZ)zTH6QGknx|j!Am-{<*h6#lE42`_^~X$gM)AdUn*lGGj4(wF@BI`Rvzj!#rWc>n88>y%C3z*fZNt(Yrm>REN zV6RQo&*#`}5clZkc)&6GIUev1{VWeST0hGJj?&NafCc@` zeGnt{Gnh%K5&D^y5X1G>M<9mjt(QOy)mx8*7^1hZ7J0pe9i;UZc97CrF#jW|KyPLb z4c436K@8HHu{cu$br~x*H9(hf3QqOc_PwGvq?-P0>>-)Ig$Pw+Q z`TK;a$MgmcXkWd7v-45C;XsH!`e_d6Bl>C9_hJ1sKlz+`NUvvwAJqI+pVR|-JxBC@ zy^bTA)$6W+xKFQZ4RNntXF%Mo*Iom0mtNZ*;!eGmeR;cH!x8PJ*Wg@~x>c`XeQ(jL z*}pgI)tr_$>D62~o?gX;-czqa|K?IR>Q$_858c2D-=G^f1FzQ&tZ+BI@&Sm;^-7Lt zMz7?EUZz*{g}79&$Ut18R~!Rzv0l!uyhtx+S6-->bC@sC%Q@M)>SaA3&e!~wZ0bDC zXUe6z=+Ye!xpQ@i2RuiY4u-AOOyMDD1Uu-RwnC2aPYdI??> zQ)lSKY~ks8F-PPyy_mT>=tUfnQ}rT_$SHae8+fu_$OfLI7oH1oqF%`3osiQD9)vtz zFSroG(F@qZ_If^Bc$}Wk7Piy#kA`Tg=RE<@M$hAjwAS-DBFE}^QHW#oT%HqJ>A9RN zN9(!l{G;?7R_#bVhs{1h&tcUL*Y)iD3A+9ah?e@A`Z|2lw5^`a&Nx)hb|DVYv-g8I zSkJl_;vhYXQ|LfFi|2#`^h{3q{q@ZAA@x z(9ya4EXEv_pLrL=k@=aJEVW1EXJR$g9-g0ZF~ni{891fX+W8{Jr?zFjh>@&4G+&HB z9Fm{Tkc0EnF$A>-=BHtHB@f6?bI_xI<)=P|s_mPfdLBe9KeahTll&A6ee-C33eGdl zjeOh5m}Jc(`N>^S;@|va3~${(`KM5sy1(=Mrg7cw{8MR&UHM7g9Q!J~>3)@oi#A+C znBkRx>Xo>iRt%mvGorhqJEGeXXm!ICnDFp&xdOXfuD~uw#mbi>T~@4~STnS` z1cxqLTozmnrl?_tWvdzZDjC+I3^i5~YcT^?f#B1hg@1L-g9}&H66?Yja|kv|S#UL& z;tBa)ZS^u3E0^&AWpJ}ZD8gv^m+??p`aSVyXf2yOfGY-vu{OcF3}Y^Z&Z65v@4<5x zD

SQdX#XDV-JQIM}6t5}`;a5PU+G;1Mzem*5a=f^{hlL?yfgP$g6dY5OOTYt@M1Q(dNI4?VrD6ep+rMb3$1e<;f{(2MC3@<{e>P6D{izKb+CFp4WMSudqCu9j8A;VIxL^@K+7TtngZ!#dn zT@SO0w^Yo^h0I;Pkhx2u7oj69oxT{d;`Bt%h|^_phY{5a*zC#$sC4-PmMcLui()O% z>Wejd0bCv-LvR`7NRZ7S3qkcJJz-ZS?J7y3#>!nKX;-+4gaW}QWCl86lwC}`jsdhrnN+%w!3^i7Q z70Xi$1seQLyq%ft#724y&cKJvQrhW+6gI6EtPL?ShN!Gr?Z}iB-i0g^N`xYzK=27! zw#w_sYGlAom*B9py{Gh92r3gwgd$G)vBFubpC>2&40IHL&$Q0MM4%F$38)e(gz}k) zE}h957tdsL8LzSUU1u7yV(=J|fdT!E5;1#k0yXPQ3=v{5WzV3ydIpS@Gf;{08MKyQ zMOx7dqWjRXmJw%qgbcwYI0Tzuoq?KC2~P)92^B(_P$Cowh0}2a|8yQV3pM7Q&O>Iz z;L_lT!4`vs60zcun4wg{)8MY2#(_SJ<;&zHaE$9|oUw(|IG8@>qM0Rl2rx6J$*@Y8 zBf1S8^*s%Fz>!zp#q63;tB|H^SB~%DyLWxi$ z6bL>cOYjI8f=h5t#bNAIc}VM2whb!kbP5_=B~%FIQ`po~q^YOSU!c_|Wa;w6l@XUq zt3#^|D{6TPl3LPXHnZ50#pY&?k>SZOR!^4JpN#M_p#-B@JXwxJzc2nQt=`G(>deXV z?m1#(4#6f^Cu3qE5)&_mEs&l3Ozf=|dI%Jjsakyuv>J1lIA!GfV7CS}9pQKEW0N>q;LAD!M0O89H4tIAXAAuwZB~B{+0gu$6;B@f}!4IK-iW6)wax1X$vT~ zg|#HsBCHMOn=IwS70VJlLWbZXGUgx#>lE>rlx;E3g@G|R3mrWGvuVLlA7fP58c=PG&`N8%%iv}S+$^@{ z@d|YLaN$Zp3?2()2rj`P*aWLJmJg%DW0|OWETBRt6H3Q2<*||yJmwR!1dos*xCDn_ zBRXawPlG8%!ed~p9>ZE5BeeuKeZK1W9sX&L`A)xooR1kotss<;C3q~DK|w6gW26&l zwF#E^_dy?vJ8VU_$Lq~%D-_D!#X=QWG2ll@r;BbwN1G607FuBx!d@opB0jGbK5>z0 z#bI$7GxOVFd{rss&XVM;B#J7sg((ZBT*m! zNY*!tAgof+Gg821gu@6MRcEP=6WxMdZ_*da>wNVvl&uiTgwkQG?_rEDh~K9*OYrE*z=hKbRMSHZ(G_&r1dHI? zfGoiyWC$+7A=m`V#-?=VIqjZfb0%u?|I2hK7eocON4461@x^ z^Xd>lkx)1UVLn`FDtOEzWC$)iF-MBp;tp2M0ZdsvfEBHXUKYJ{052kn2QX(r>^|)1#RE{tg8`HL0Dwzy2sXhw z00T)S+#gUSR0w54iBKdI2tFZ8@b*U?GW#>X3m$X8WA^^6nFVV@Ow@2c22}S$K!s4= z4^bsq#zk>u@F|H{K@3?jl)p!q$Jh+PCD;UOKb(URhK1?egIVpq3O5m~LK1@}B6=_A!N<@_> zuL_}DhpmMRhi}>8?4PDJjZtfAr~gHAD{WW}O+^h; zY*aPH>ZIUnT6yi?_UM$aP_DYy?%Iu|Lyee=9Q*v2Ia+I`mV}4mYg2pnKFw>*cK>(f z3fCOB?*BXwwEFLwcIN-9zS-tKYxCRxQ%@NApE`4cdB~j7YyX$!*Ejz2eD=+M>fzu0 zr*?)qCv0M^sy2zSr<$;*2zc<=+*pxNz%q#WO=PH=u;V;hGX$3|M_e{s=pE6mi#$n9H8Rf-Urwk3Q7#uO! z471`mi%}^^C!1_Y4G(GKkel#|hvTm*{=j<~C;Z6I9akCR{Rpf7Q;F_~Y~bO)U>GvL z?2fM9-T9Z;Ay9Wk)vo2+@&6nCf5-nH`2Q3CJMjM({&%k4wS1R#ukps}q`kXsG*@ZX zB-$i3)@Xec-fwxmksP`Vc~;0^<0w|)86g9W1NmOmRv`n7 zTD+ZCyG2OOsH+3nEaV9zjrVnG%R>4YEjNQ~Y9vX#$632k$YaJ~CxUF)Lvlv*NnlS4 z>uWS;Ro4r7)Hu8k$ht<79t^Tp$a%&Lyt7xkMo2PxVMmbFB*|6L?tDvYm5{*LbuLJQ zklT$*n0n=2O`_4npJ&a0zJhu#@#@XnK$eT+<$KmcU$#f@Q3Jgs`il<_fxcAq7qX0B zBKou0W1uegm5oD;4mXYVa2N}{V z$D_84@Rtc|^K4zS&n~_Lx)%Mdi#hI!MVh@7JsLE1xc*a+K|*Fl zyC*>g3K?kBp9(TS$nD0Q0!V)$mqcEVgZMdN=SM1d-@SGZaU!pd19?(vP#0&|6QWyj z5BlSxr_w#4_Y*x4$J_L^kBJ^na1HjAtj&zw%=#!DdwpYY2J{jAt7E4_e}sB&uP>eL zAP1FgE4sxrITa4T&wAjF83AmRy;a?IDrRxkfG}$(i$`hjYSSBCh$- zgE-$VZX|mj0CLeD68V{9cVQ#>l56P#A#)?!F9Yc+WKQ%54$=9IWIs-{^Y)NP_&i9L zM)E}$kaK1InG+-7@nGkOYh-kPE|bneMnn(V59DkiLG-9=L0ln&qldG*JMAHnpA<+( zA%66bYe3H8#4>Z|a|xU&`lDT2LEl&O2fEfm-)AqZ|EPKQxo?BCkkY-3Zu9YhkKcvd zW?YT|PX8w47NffjvR%l{#+C1b{3@iUarF|AUxf59E?)`~3c1e6{0#E5knYB{Z-V?J z>#vclN*EXZ3zmKon*+|q9fDH&f}iTR&?L)cQ|r|aR8?MTz5#@Zr? zY)6_dG0G!BWINJyk?|L1OIo%gAl308vK;|=mbqm+(sZHm1I8^a+Yyj8n0#s3jx?Pg zZO=BycBJWCBlj)NAZgiwfHgb_A}`oYXB)rw1z9PTn`L~A51FJ_2$^AgcL2!pMzVY% z$TA^CW78Orl8`CJ=NEx2Z6sSNAWMWiW$auFvX~^-bdvGeLtu-oL7h$T(xo z|3DT98Do^+0hupkwDJC{AoGNbGJgLDWNssQ_dbw0jbv3@ka{5_4E_{%dR8OZb}Pt8 zng2~k7#q;{DO+5_jaN>`XKrLFG#zHVjoFy^P&`A8_d0|8Pe|VQ3sbY1OwFcwgbg%aL7znS94Ke}bsC6l z>zd|_&#^ipvaJJoZ5D{^hrI?}_Hj+GFgo=Gk$qg#i;XUIAbY08MMmdSK=w?F zuEs^ZK=w?FvyBUQ%stb>HM&j$*)uIV8eMjR?3os)85e#8B7@(wgOS4=iA0K0>kh_Q zJnD2I$3;8PCHtbLZKJ1s3^GMLt)rbcflL;1q|vE6$WuZNH9C$1k)2WO-{{GgfymA% zwj+8XJrmf{*stf{WFC=?Q7rem@ej@&k#S5AYlwEkW-KyR$jS(x&=?sbq!bzT9LQ)P z^CCm*K}HFg6B%#}NI}T-=#_Va3>Pvf(*IWw+400CL$~C9c7dv137eA^jqGcH@&m9*YdIL7ouODe}q7Add?xaDR>%dB-3NeNE~HcB&m%zOg|ErUksVm~ zxyU7SMZbu=%VV|`vMus1T#?ost!U1ufqpD?<6WB_+KNF&N24uXry@rSIm~GD0mxA# zk>?_Rp96BpUQLW94;szhjDqyxJ}zQiRJ*)5t(H?WhZCqJFRCp%L_1-| zSn{IU;-u(VyFkv8uoI(aunK3AG~X3Hz6Zz|jimjzAg2rYE86Z6kkcATTl9m~LCEjX z)_p)u6|y~gEPpV`I;D}dV!clm@?oR_wX;rYB=y)@SSL1;Nsoe@AmsfBe@xgqUdY># z(hnd`BbmuwY%k=^$g;0NjuY}qWG&9QRy!fNS0b|wFd6>l&qqpofwU3V^O31Vkk&$; ziSXf=*0DmiL>dkOIi``!!u+vhYBb*zS#c1EObrnJf{Z0oqxr_j8thuEBc;s7Na-q& zBV-lA#ot%94j0$ck@dfT9M(wY<3wQDLe@vtUJBB(ku0i!9NI{xF~K21CK`P(g{^~y zj5qGN3FIIlV~s49hjpNkQAWS^Ah`pCjWizX54OLM;YPM6$bLeG8of^k*;h#3xDRJ3 zYab!n=s6!`Zy|wkGfs_G3n7Dyo;Z0}&4mmw?z|eLPDsvpl&!ObJZbdmi&p`wR#-oy z&z&G?A$^UzaGJ7GLi!jFeFTye@{sW;b~RQ)$b-hsHb`8^{l;CBL29^en%{TiI_S+r zzxK$j(D#y{%Z(++gP1}tH5TSR2Wu+qTw~ELkeHB;#^U!tnn;4kwVj|xsn_ke`VZ)a z=$~Bk0rUt9)QvHkcEDEhUm=Dup$hU3iPhSev<2jE7OCCY7e#7!(^30Q=SjbWkI{wZW#H131^A!Jq5#mhnM?~SC%OCY}q zSr%<-f@~MEBx>+DzY3X`i=K@al-ghRuxL}9Olw0S!y|vs1^HRX?a}lNAU_GYFGPtE29?<1CdQj?IqDP_N=wCf359uZ~*-~X?B-=e}n$*9=&b|^lwBzC)fNGkgtVw zZgD^KuS7rlK%9YUzucoY9{~Le(cS&A9jyIa^iBtLhW^zL0K_HyS{;u?Fc*P1itwPxRAbr$T?1dg|wX9PxKpAoaFUTn6%{koCrt+40pz zb?0AEwX^eX{Qr&rfAIhB(4C!)k@zP>jZHf{H!n)_ANn_= zbq|gFb5j!o5F<1tn1sEIO@D4`X4HhMsv&QB7kcAaZ>1Uozm>G-&b_}M?p?caCVXXUML^WxQsHX6r#(ypTE&SKvzd8O} z;D2vpV|5=Rkue_FlyvqrI!AN&bF?F`M=!-|MxE?UBCkir;q+E_-yTn7%p8#3jbtQ@8GpMxuA%3{!V|BU4x;b-fzN z;6)&}HIhM1LFB#(DmQ=`ZfW%NZvt{Nr*h==99~)KZrYt&s$`f?VE628AG*Ml$em zkjom$fMy_R;dKNv{-C>^{X^5V&5bT0IE~DQ$AYB_t z-&a6ngBNKq9=!rYHh3V9dW&vuGOjZ~oJMjD=TG}a(jA-qy5kzjRa`dh_K=)$C0_CC+BUknVOv=z8@x!# zxcmYT+2Da(_BM!Y@FGj1ox6a@1`p&kyfW0u1`p)aKS5-J2Xe|iAhN*&ISH>Vb+W+& z;mz?nZ1AGFCXpq^#XG=cg9mcaAQ0K$fm~>T*iyMAM%O7IEgQ-Ctw0WKBwbd3$OaE( z&g}$paHFR)uEy#PY9wcO2RX2jbow0RfLtT%*c(hXc*t<(P7vAPMHU-pU?W&38@$Lu z<4msoeWc6+<21aC)yW1gGS|3t28e9%BK5|pTvE*?tll`8OR7%D45J+@XEl;GFXI)q zu2$GI<5ZsK(n6*fC$aBSjpT%PK$4B*_?tjvgBO`%99II74PIn|(d=}P8VM^H=5HX) zgp7zD*Ahgwc##p&wp?ugPkU$oS4EY_@i{ZY4FS1lkOfW9E8xSnnKx^#)?P(f)~=a| z51F}!xjvy5VVrc2+N6PoJ77wDhY}3*OK}-HmOKc*fmBfb~b;cN%Kj}sHj)1gi>4>`v zlG8k_7M%*=G!OEtW(cQwkjU8(PV*ogT##nH0S9ATa+-%FvNMF!JV-dsw)~FoGr`(Z zwtq{1C={uRys0JR8ORNm1tJ(jPkzfXSG1b~xlTW3XA65K_!@D#5NKkFBo9AwjkeQZ zBzeM06ULvxNb-a=-DsTvMv^CdkQO?ABzd&p4uXwDl1Kc*8ZeSPVNEldi@`|pi2oY} zMv^D2sb-JiU?h3O3FY96isO;v$tK0!7J@G*?uytbzf#-o~Gj5!K zoKOqCeGL4C;%n5E>J?u_+?I8UuVAFgV~W4Qz>u|yFFg)Es`y_BN%9DBs?kK-IZQmo zxIo)EL_EnHO#P(Br)1D{$U((VjsYJ~>@EdY6Hhe0x&Yp<_&l}oKE;iB-~jOiGZFDY zRw=&k32>$2P})wp;t<;L9>u{vTqq>&`q777d%(EqM;zn^mnpW;PO_BQ_?m{tF2xr& zf$`*4SmTYxa4??S5}$n=j0d;Gr_X`$;8s}UjFY%rNj$g}))?d1N-!SW`h+#ws6Pt9 zlUrepFzToYwkkfJ3*O?ggqfV)8@QQ~uC=m|aR#kW!1yNh^nAuN1Z@=a(8peX9=M5d z8l9SrjHz^>d5pfv)TcHuPr4uIXPiLeBbRafdf5=C(`n`2=0M_^E+1Cu{o*k2+q6pW7x0}VZfXkaescgF+YFlB^Jxma zZ!tbar}s_9CsTlFgmFEnKfJ-1K>gu$!mj<1&dBMEk9`lE#`tI-;8ezbzRBQJ=7%=` zr!e+C3!KdOAZ>UOV;|b^M8@9K(IzndhC1_~7=KN@V?1LoYRA_IV?4BrafDIv3xFw% z-KfXB%E#ZK+f(4NG}|4%ANWVcuomDL#?ZdNR~Xw(1&(IChoaoegyCHyfuk5>2LoSX z>^vVhlCe`2a0FvCb*15qQ4dld9>yG*3QT5O z6;VqqUZ@uxSq&-Bau~7J$=6a-0{K+S!N(z+v{WC4Y}B%UI3!O?pb4@;3str_ek~P0 zQi7eUZ7+JQvtCQNgsju@c@88;%kEx~wOUGdLe^;6l?Yj_WydkdCt9|n&pWGFE*nR; zLO#~wJMsu@rM5!|_09?{HA5iFwH#=KEYng=jl5LLK5FD_EdgreC0eSek+ZZ^P#b@w zWiPeyViG*a6eVS_MZD;eC>{X$P)kuAWTBRAuRuP~vhEUO0n0^Ecn30HOFnh=_qA+{ zfy`rR6#oA}=4#2E37Ml3>_(AO0DDg_TKf^fwo zmgHHG8Cr%0Ri;FVR&z;fa+JU%nkF4-(upSbimKM+&LaH084-&6S1}^p?TZNEuXwo~ z(v*mH%ol^xu}x(CIHX#O4g*;~xb&Xaz{sn?n51nXeN9)* zlwwz6cY!o7BqzYAW1|6GBu6N)2~beKgp_JHbF)Op+W!9lX3U4rGPi83^O>QXfx4Fn}rQ-078p zCRFC<``gP(zluNE9DhoJuvQZy6kb!fg~6VLH!?6M5kU}T|J}K~-!qAZw?srNvMH9? zX+d7ZD+iHFa-n~F8tfcA{rDVqW#esE;kW4xh)jNy!On4+5igbHO|-{$DowI!ULwL& qsh81XQcvY)JKGXTn=m^$sF9|S zgEuX6u!>?&5s8T4RTTdKA(eu%Q1C1ig1v}de6waFe&wX+Gn>TNEo*i%KktgA> zhQOj1-YjOc^+*zbSs&lk>gZ~chA$x_B9fTz_ee>{6qvm*_UZul5Xa)JXa5xLurO6| z16Iv$1S2l>9jgMr=@Dz*_*?@*O*f7xYJjZSmBQh8&hXkwnH5&J?O!r^o^xg^7H5UB z;jz7?`D-?jF-z7buKT7|RZ!(*i1kBg7>0EMpoVrx;P&WRww|qJr8~AZTc54X?gV3Z zPi~OM+5_!==wWD+ZUr;j!Ay%B-Gg0dL4s=p99i7nF+h25mq3WS|L5f^EN~yiR4pc! zlehdBRnevnmmSbC4Ls8tAZ)r~)MXQi;D5OR-Ah9~SVF@+ScOJVt7WSaFz)YD?W;hO!Lolp&;GS z>IX9Po(w&@xJA<2B;6uuh=!uIEQ>?RIYSp$)Q#W>_-sro`?BMb0j##&7EMa*0-o<_wzwwQOZ8g2m;)=ZqImwowF_wsfc ze_~q0$Wp_wKz#B?R$*y|8pafkHJr5o?78Dfm0+kf;fe3yO0n$+<2qJ`l zL@_&%Pym6+u}u16T**bLi6yD=Abn~;85xk0p2=G|K1|-uIfMTL8v_r2gV$%ED1#r+ zUAA}J6dJ=uU;!vv(|7JG4OadBpT9@vnT3`Oc7c~v0si^C>2KczG$)vm|{ a$YliL;{ObjCvv}%QDx-+z<^1B^#TBm-f)rt diff --git a/web/minibase/app.py b/web/minibase/app.py index 57ffcadd..efb63720 100644 --- a/web/minibase/app.py +++ b/web/minibase/app.py @@ -24,6 +24,11 @@ mail = Mail() # So that we can send mails # (SESSION) Starts the curren flask session session = Session() +# Definition of custom filter for Jinja2 +def get_attr(obj, attr): + print(obj) + print(attr) + return(getattr(obj, attr.strip(), None) ) def create_app(): # (APP) Definition @@ -39,10 +44,10 @@ def create_app(): # (EMAIL AGENT) Initialisation mail.init_app(app) # Session for variable manipulation on server side - + # (DATABASE) Linking the app and the Database Migrate(app, db) - + # (BLUEPRINTS) Importing the blueprints. # Include are made here to awoid the Circular import issues from minibase.blueprints.main.routes import main @@ -51,7 +56,8 @@ def create_app(): from minibase.blueprints.company.routes import company from minibase.blueprints.geography.routes import geography from minibase.blueprints.sensor.routes import sensor - + from minibase.blueprints.database.routes import database + # (BLUEPRINTS) Registering the blueprints. # Giving them theie ulr_prefixes that will define their links on the webBrowser. app.register_blueprint(main, url_prefix='/') @@ -60,6 +66,10 @@ def create_app(): app.register_blueprint(company, url_prefix='/company') app.register_blueprint(geography, url_prefix='/geography') app.register_blueprint(sensor, url_prefix='/sensor') + app.register_blueprint(database, url_prefix='/database') + + # Addinf the custom get_attr() filter to Jinja2 template engine + app.add_template_filter(get_attr) # (APP) Returning the initialised app return app diff --git a/web/minibase/blueprints/company/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/company/__pycache__/forms.cpython-311.pyc index 2f1c87a7f38f8f7c771ccb117ca00134be0c2072..00a63282a2d7b7e9884bfc9b36527631155ba8f7 100644 GIT binary patch delta 2353 zcmaJ?ZD?Cn7(ORW(wooTbWNJ1>6+S)G;7zb%rSHm9b;Wr+qBr#)}hPpc5l0zC22jm z6*8k8!yo-IWOBwF)X4-lf5<>72!7xOilu)vErE`df&S5d5}gWu{O~>Z?%tc0>Lq#a zx$pbD&-r@ZbFNL?I_dqu<8dN*&YrnDHR%7?E8FLLtq8r13b=rhETTS2jov~?#08wP z=--RzhUGR!=tKBx4@RP;fKoYV~#jWBO6ByN}ZyNr&D7 zQp1~4N6jKc60MAkUI{k3s^YZ85vLnLXP=QT+O~9R3}7=e%WU%My_)@Jr$oEj(;cqS zNg27hi=pxb<9@;Ym8^pWF*|CXWMn;*<|JSOFYhL+cCZROZk` zCxhvJSkFei4Ou}oE2w*_vRqrTLOKSr!fIAn_f%!Mw`4Wx7|4pStawECRAr$t6!#=9 zc+SpbW`%6NH!EbMr|7J+f@4&0t>A9j?Owq>^mnkm^sZ+E@1cv{4I1&e>7}|a>5o1y zP4M61eYDxPf*+?p`8M!=`c?g&NORdUL*!{WE2M{KL@8ai%@R4QkUkj2(!=^Ame^^K z>qT_GxqZP};=&I&Ptn_Refpg=yx_OW?JjY zeaR7|3!&By|29z$R->9Hp!W5T!)X?}=%7BQ%HT58o8;)b;XC*c9co&(KLfnv33@N` z9zIMzkKD%n^i1iyGmTB#O=KA<`+i3f9%xKAFY#kp2?1h_921{Ci4`0XwUW%KhMyJOeyw9FnF0q z`c30VH=_t`!Wvh_Oi`nBkkcws&d$y$IX2N~lOJSz4bgm;~dAi>A8uV0UyLQ+F@Ko8J8XFtUww5+@eNry~U)eUN z$myI`PHof|Z=jW~Ca7U|d>0<02jbs2uK|o5)Va5oYIh~@vxhNey#M{W68}Yu{`Nm0 H!iwx)S!BMG delta 2006 zcma)6UuauZ7{4cJ{@tW$dfS>Nwe_}jovG7K<`k4R&aPp@*=;7BU74nr<+e?h+|+Y# z3LP0OBCKE^CI>fs5qz*Rrr;>};+Uvl$%|}|hmtbE7vIGA2YmJWPI_-{YXvX#>zD8M zJHPLo@BHrlbmr!p!OvP-MFE~}$Njm5&bz^^JMo885N-(>QWkQE@Fz#iEbTC}jN?7Q z@R+{@A=hH&Ws-9-;)^9+W+m-5Gf=gvIcqglGtPZ#-h)@5Zp3F|P2Efju4mtNhy6Bv zWV1j-JZ|;Z<}$8*odTvB?Auc2XE@=Fjan63FZVu$R-1y~mb(}zVE;C&f5roAds(kH zOhSBj^@vE^Y{z@?aFgQ$&Y-CSlkGHf*i{!_wH_7yO}@xJiFUUD80KJY59nvVHNXgh z(TJ&KJCBeQVu4BawOA*I*ysKViLs?Xg$%P-S}WuT6N5YC8TJdr5%yhMg&bw;p&jxZ zTWGJa_d`JzmwqJ2Sg>P+L^m&Xj62+MFv+U0`F+>4V@&#=b}9?APHrh{;BaskyBm!q zt%Ig5!+?#fYRltpm)po%13PG5=bnyy&L4Zk*R36C-SYzU zI6#xvEtA=Lp%Ht`>wsQCJnf-2vtnbS;rh)wFxxp(GAlMF+RM)D;7rRvHl}wUvx_qy zJ3tfdXx9uQll|lqiH9BQ`GUN}e(u>KW9;_h8zj!o^=^=p?C;(!GQqy-+ad{e{fRAh zzc0XM$H|B=@u=Cv=pLU96h7XEBOh{$Qrvk7Z3|_EVaC-HpHi!a&M@4 z#mE-51~7v_h_jQ1VwCho*?kG>^ey((z{KEjNcCCxM6L?k{X=Ul>;9@YQuX$22SRIS z>uzB%O*TIqm?kUmDhT-Z=Q#+s1Ot|sPxA{~CL2({V`0}EWe06Dtgo5?-{!rHcS#1{ zV8`Uuqp1bOkW0EsH5i$k)n!AuqH6MDUR88;MZUaHEb6MPXhmZ|rE*bIW6s8`8Yg^} zk0_C)Fi!L#pl`#!THtcAu&8LuX_TdDDCu|(S(YgtzSg;<jz&Gn}z$%!~YwS(i0*zX+q>pyV%A_)Bh8GM3r diff --git a/web/minibase/blueprints/company/__pycache__/routes.cpython-311.pyc b/web/minibase/blueprints/company/__pycache__/routes.cpython-311.pyc index 5a8b19049fcc9ea2ea549e908d010318e44d4332..5e1cbd05cf5eb6cbe8df85edcc4f32b47e77e702 100644 GIT binary patch delta 20 acmZ3Wyg-?IIWI340}urI@88HhRS*C)`~@BW delta 20 acmZ3Wyg-?IIWI340}wnvws#}. This is how Flask-WTF knows which field the validator is associated with. + def validate_name(self, input): + if input.data != self.originalModel.name: + if (Companies.query.filter(Companies.name.ilike(f'%{input.data}%')).first()): + raise ValidationError('This Company already registered') + diff --git a/web/minibase/blueprints/database/__pycache__/routes.cpython-311.pyc b/web/minibase/blueprints/database/__pycache__/routes.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b08b6cbeab6c3ddcc9012549e64db63e3fb7842a GIT binary patch literal 2197 zcmb7F&2Jk;6rbI-y=$+%29Z`(8zQ%;1XsmYsSs^RETwHQNJ&cDAet?bwegOVP4*+5 zT{pzCk%f>zs1m&(B2d8MkOrlP9($vI!aA}@w5LcY2X02a^~9UqtXq zGkBS2=o(fRjJO5 z3T=Y89V(EV`cH(!OA*8u5F|Bu6J=9>QOqpwr3p4wOiB(mR&>R|Ui`9N#VbTJ9gipY zP8HjZ7p>@uz32%9s~W*&n5h!IRI!N1FWHu6;fWzk5x3Rt0hx0a3MbiwmJ?6%Xlpm33dX}y9whqYPk&~p`<&hcLQ9|tN~`zCp@#M>tyK^k~R0+g07MbBm6lXE`s?XCURh zKj$TYaaCeYI1b5*ggVNLC}hF*xCQL^NA-A+6qxs-wnMZPFA5Pu*1T9n(;W<2P1lyO z$0@o_C@HgXGDKk#eU5uVNO2lq0mD5WbW_waK7H-#pe$g^;9&Gaqnv*v)Q=?IsU&ZtN!F(9scE0x}#Hu>j&aJF@Vi1ufrRrE@6woP| z>;q_;=s-GhPv4bBcBGN@#@2jWI@giTHH+OCiVuB1*X7t(W6h7c0!khIZu;Bl^)v0{ z=}z)=b8?SQHXD2C3$28kz7W*MZ@B4kR~SD?4c-4_{li~oew=9!pY05v-BR1B^PSZB z<_G(Hs`44?e$qVJ?jdyuyuOq-tw-L*^x4>qYs9E9o{k@jc%Fr z*FHJkIXT{z3LUAiD_!1^F1Mwt9qDSbcpx5kPh5PmqjiN5e4o? zW@_m%YsJwlGjmq~r;MMfiKjBb&R8wf;$!(>y6_vyashARz5P9DaC@8X223DtLhmI5 zn3B(G@;0bmhtEC%O%v^lQ|oiCI0f}lA?RrvnIdn&{7g0-B>ZKcv4qB}&wWCvKxj%K zG=C7vJ?~UVvRt26xw8LHu$F_+#=0E@ics=%cd0}~Y8Uk>=QGSd9yvoH>Hhu&o(W@M zT-9-byaPI#Q|(=7x*WqWd+3(?|LY#Q;11S(ap;?i_vO~H$M3shu`L!mVzDXgGx4uS zz8rC1`N*A}b8pJckv4O?!`$w&uQ8u9T}0czImCX(^p$53n+S}G?u}2~>$j-UT!)$K VvJ5i~Mzp0yG8hdggDL;w{{SuPK|cTh literal 0 HcmV?d00001 diff --git a/web/minibase/blueprints/database/__pycache__/utils.cpython-311.pyc b/web/minibase/blueprints/database/__pycache__/utils.cpython-311.pyc index c988bdbb39df26c748fd60e40f605c128f7a05d2..766b0cf5c5062f03997ddda8cf9583b0fbbfbd79 100644 GIT binary patch delta 20 acmbOwHcO0qIWI340}!l^+rN>UpBn%)0tD3n delta 20 acmbOwHcO0qIWI340}!mT-nNmOpBn%&`~;`~ diff --git a/web/minibase/blueprints/database/routes.py b/web/minibase/blueprints/database/routes.py new file mode 100644 index 00000000..85dc49b9 --- /dev/null +++ b/web/minibase/blueprints/database/routes.py @@ -0,0 +1,31 @@ +from flask import render_template, Blueprint, request, flash, redirect, url_for, jsonify +from minibase.blueprints.company.models import Companies + +database = Blueprint('database', __name__, template_folder='templates') + +@database.route('/search////', methods=['GET']) +def search_auto(field_name, table_name, key_name, ret_name): + keyLike = request.args.get('modalReqArg', '') + + MODEL_MAP = { + 'Companies': Companies, + } + + table = MODEL_MAP.get(table_name) + if table is None: + return f"Error: Table '{table_name}' not found.", 400 + + column = getattr(table, key_name.strip(), None) + + if column is None: + return f"Error: Column '{key_name}' not found in table '{table_name}'.", 400 + + # Proceed with filtering if the column is found + results = table.query.filter(column.ilike(f'%{keyLike}%')).all() + + return render_template('database/search_results.html', field_name=field_name, results=results, returnAttr=ret_name) + + +@database.route('/select///', methods=['GET']) +def select_field(field_name, result_id, result_content): + return f'' diff --git a/web/minibase/blueprints/database/templates/database/search_results.html b/web/minibase/blueprints/database/templates/database/search_results.html new file mode 100644 index 00000000..96b4aa6b --- /dev/null +++ b/web/minibase/blueprints/database/templates/database/search_results.html @@ -0,0 +1,12 @@ +

diff --git a/web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/forms.cpython-311.pyc index aa521cc72d5894d211cd1967e89722964ddc3a33..3394b3eb8df7f1ffa3b789ced4ce76a5e7484b95 100644 GIT binary patch literal 13119 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 literal 12224 zcmeHNOH3Tcy6$-ZGxPuh*bO!q2C%WoF>tUQ=V52U%RKBDFi$gpCu6#Sfu2Wtda#** zgO0M`NLl!-V(A`Tc@g50a&od6IEu>td%{}8F#pC(^2kUeUi}ji-!eSIn?xpH z@|aARHjCzf#bXIrJyx2xh#7%QPi7#?lNGReYyrE+9?14&2UrgqaCjV4#wz9nay_|$ zJWpQ0>2cDs3^6}Y;3=T#OtCO>$Go}xr~aiaW0qWol{yd+UxnkYX-%d^C? zK)I*f#F&|OhPQpq@OHuU#KJJ&!@qubTzqC9Q zg2-zuCYwYtbWh-GvNX0&mi)oV#I?TY-GE=#Gmhp^NECcQJ!c!}{VY-58I*-dLDF;f zR-c^I+$V^_xL&))qB-D-uUGgY>X!sw%lu3TPRdhS-k?wP^FG-h3SN_>kOY>p!MpyD z+$zla$AvD)Tj8=Wp6C|+u_ZFE>a6HEf$^Al#$z@!f`vB$TAzTx_eKpU$>7brWySi$ z4CU~zACu;ljPw#uCe?xX_Byht4#c_Q1+}Is6tXCmeVIlexK;-iU#fqQp}#H-^s_aIs*~Et1I*ppE@yH=lHmv z$1IOoduP~n&L5t=RP!ANzD=tPL3PV730yck(sRT zHFWWoeKaSZKL=~J@1ofXnvW;T8D^SIrom=MGJT-UIZ4SBn=|&&oST$CP_q$VQ#5CS z=8B{SusJ`O2Ad0#=>s(zk|~YW*<_@jdkWA6c zKpe4mX_@-HJ#O5XpcHRF?82+}0KR1=nR#Z+xnP1OA+H~hHfl_m|6=|ozmIv!JT+@( zm~OTxOw=F*BFxwQQL{*)dl9_fU9Ml<^;4mMP(LHg)ld56dI(PbyS|7}e^0o(ow+MU zg)mS!IZ_{?bFLm^N2D%1_iOf55n{}EC=hnXKH3ok>%yUMRD_x81#xc_CoRyxx~pPn z+$TodkVsZN3&y;{dts3w~*7gs(cm6!A)z;~fH=Tmx9E)#mLMiTL% zn7A(JMS$-@Z)oIc!Fw2|e@&5=8KG-pEkpF(6-3P{3-@Ksj!}C+_KOki#1~OPnnSvU zbTTsJm#12F(x&C|bWQ6;VWd`BMq+#_1dH8>mY0wSA!$Pqn~`#0-1Y_M^j413R$gnN zC?VwC$>Q>M7C4iVMg!T&5@?pyA02vICA2M_I=)spV@@Su&Jv%OLT5 zUB(BcAOjCRYeWzyv`l?4Qlq_geAmZR?98E_W@o^Ik!E=IE;8|onkDNutZF-<+REbe zG4{MhZ5GIcs7`#TG|#Ke^Y9!~$`{n~1(0;8w$eC#I6VJIZJ8jG0d;agX?dWwJb*`o z;`&N;eFb7Us_oR4c{|`f7uB{Y;t%}-l*!a#{+VIgO`T@Q;g23}p$y_P6ag+-p&8Y7 zI!*)H^HQ~Gobb~s|E1D2uQts?I8!PY)JilcPqmfDX{310s*RImDyUA~R~qNk#yN-+ zN<~bqh=Eux?Hk0o0H%?8syP_rSKqS?Mfv#|mI&F~6YKMvGvNTz7UbwhTSW@+O2BO{Xg z5v&jP4U0aW--F^KbBq}D@jMMx2CiRR?pqmL?R$2coOeSEGcM@qBYvpwL;BygcerAZ zE+ZT%qu+0R^0uZ@D?d7VQ}-d|Z)+-!rS!==Vd{ry<)`n2snqvP?}Vuzqm?c1gsJrQ zH%zT5mad`MZ3yiMy#RFE$tQJVz6aqmgbsvGgzE@55N;xLA>2afL+D2sKo~?ALb#1E zjNm~SK^O%{Be;cW1XmByv8qGFaeSK)`Huv-tp-k)Ah$oUc`943vZuEglN}Ts!!b3gq*YsN*vZ)43C z@EZQV`Uk+b3@{A%)em61;7$FQK^eIFWMtWiW1BrcPAN@ZWzux5n9}*mW8>ZUwmh@r zz4(H8-Yn(I#(QQ4w#3u5{0Vkl`(UdaSd9fXYNe~7EOxPf$|t+@rJE}VOJJ8j;*xzc zLeLe4?c<2xg2iqKetf}@JS9l3P*AAJlCa-Yf#iggmO^@zfas@y1Xj&5Z!jw(>IWyOoS$m?sT-_u>7*%R+D{Cun-^FBrr){Wt$x`0jMY<@ci!yl zbiI+o@1tLF>L1eK+tZsiyZ7|Q%lN?F;pVrR-ov_^hZOF%%H1Z;+o{ugn7VoR_wMEl zKkjMA{;2!8rKPj=%^dyZ8#+4InAv*6WqZzQdcFH~SD)NuAp}>Y&FG9Dv+0a(QMr~E zT<0d&sc<(`?uId=J-VxJE8MWk4HM@uy81Mz!5QtLuJ-)iU2XP zxk2I_ME6#J8g%avb?=bw-maRnn$1f|gx9NOd%b}W9~A{iJG|a6qCOGnh1V1n-zIc=HU8I&Fhj`zdmM^7z3*yDE zC$zln&pPyid_Lt%4_YMQ%SC+|LRTep$w5~ebfJMu8hurQWKlx?r)B#C@R^1eIF=yc zhY$KP$cw2Ngb2bc!W_ap!dD2j2z0@J2~&khz^+8bfz2!$e{q&uy7F*g_5AAjAL^df ztyiyCZ`>mNgQR&#X&zFWhe*S1!VW9!u*wcEw#J<$57|fEYo%+Ye=qy7Y=hh2NdEvC z86%x{l+HV9=NlMhdjk_+qXI=eAI`iD2Vl*SRYafEz2O7h2) z{4q6uZ1MU}ImJsOe;)g0Y_V<2YRia1cu2ux4qB3erPd7O`YGtJW*`epK`24Okb+Qx z&y^H}5)4JVqdxy|>eW=hItf4S_1=>wBwR~qxkkQ@&hG6wp9M1bJ%}E!=&Z-DnIzl* zk#Ofjk4G3xw1R|eT_QTer*A0{4w<-Ck^BgyZu`5FI(_r74g#ehM)dXEu5yVD$GRxp zIL+SHfJ-{M*{NmFYxFIQR<>JPxP_WfV8t|jL!-HN6HS<L!-p6c zhxK@t9^-zsUDe~hTY3Z{xG;~50B%`KCR3a#C+TOLX&}3uab}vl`59+g$=+w2`G};S uappsE&>3egkb}-RbD11;#+ef&{oJy4nM`=!?)~%7|FeGemwklj4gP;E3Sis- diff --git a/web/minibase/blueprints/sensor/__pycache__/models.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/models.cpython-311.pyc index c427c599d13cb280b71ca1b838c29fec65a0acb5..bcb4bb72697b252b7ced99e7c19ddbfb9d4c2526 100644 GIT binary patch delta 904 zcmah_O=uHA6yDjLoyKUB>^49BL6c3bTM5-FNGXkNieiMIh3cWGIfU+5TM`Uw6g+zI z4uI=@Ca_ePjw77HIw-4s}`j}nZ%)~En10wlW$iPhw|h`3M@KO96nAJc+e5>o$xkQ zln>(i=iUgsplLD+?`RH&^^9P9f;p1S>N#?{({JfT(QD~8Oi zQ=J$;vql_a$K2M$HgP-K#`|<>XtKoI*`9iwXM{h|=bz})S?DL{yorI!gxIhWdcgGB zV~1BgFXR!j0&C$Cm?tyd=kUJDu8JHk^Y#ozU^nvGo)Pc%fWx1yukt5u9=lR9kE{@Y z4UeL)d~ZQ`O#-KkJq)PrMN8@Jp&E&r99ds*h5O|wP!fxsd#nk@* D|8~3U delta 864 zcmca=_|AZDIWI340}%W=wm0np??yg#My3y}lkfazN|Q~P z;=p1Cq98H($x6&ZljGoQMV3^SEP=_A%+kVwObkFaE67w3fQe6D#4N-JRx$YkGsp;I zMG;Ju5IqbGDJ-d?Sz?nDStM=638{kV0qKCT*KjRkVPIIzGP#gNdh!Gz&dK{(Ss5iK zKV;Enl$v~yMIOl3W!0X{!>RyeRRUQNU=}Z%`s5{W)*CQuE>O&b4WtgpvQ_}QMiFLD zia@GtI%A698lh#(K>L6g0-}^K)X7c$&n9ZEj3zFUDi72zilJWxL!AOhKcnjARCXgq zMzzT^IAS*c=Ger@Xfb&mm-l8#?vG4tHbBdZ*fu8$urW>+ zvIfb5mDqw<_Ao+i@_GIqh+cc3UJXV|2apsSkhsNCQdy8%r{IVjd14X^3fwMX8B|O!EUN2N59G7x{n)u%rDp9}x~=(o_Qq z+~O?B%uNk0Nz5%kcS|5hJ&3TI>?rmH;;X>P*5cZFVE=-h3bp~P5Y;2UIBatBQ%ZAE o?TTV1PZ2jaQDDqr{J?;noS-yC<0Dw^3$hBA$^XSKv49*505lt}761SM diff --git a/web/minibase/blueprints/sensor/__pycache__/routes.cpython-311.pyc b/web/minibase/blueprints/sensor/__pycache__/routes.cpython-311.pyc index d83ead7120e77e72b775dd6bf007a0c2ee1d33e9..587e7cbfcef5497f8ebb2175f52d3a33914ef44f 100644 GIT binary patch delta 339 zcmdmDchH1yIWI340}$-;+n=TBtlk;;667wqK^UL#6i*E6xq?TnSr$Tug zrNya5d5O8HMIMu{3TRK}6x_+!GWoDzkf^~G8PgkLGFQYjuZS7l5SN`&dqrGxvYL>M zO#KypHLl2;Zb;dZf5pt}qP+JNdGF12LJG``5u4|W@-i}MYHU6zwSsYS zv5cf}1<=uqKwPZP#K7=@nURt4#^jAM%9A(92yMP1^O}*5L6A}X1BfWn0xAOl$vs+& delta 1348 zcmZuwQE1yn7`~J3$gw3mmJ%mv)Yy#Hwz{>BA|*nN#{sSTM3tp>^4Y2UsR)12HGbno_Ik}?9s+2Bd^72#` zcB;m28c%#o@OKy*cj&PR2};y)PH(~zkX&mH$7n(C=_aqbJGQaGhmBuphFLxOyh9r) zrr#%Fvc3V5`&*asPe7n{yqKHU`fpM?-^m3)@|36&FgE%J$~K!{mon=6MHy{Qqnr(p zjN@Lw(_3*(E@o8D;b9e{&*dR`SNn{KadU-#6a4|(vP&^rW1 z2@vhjdl>AV6-C7|phZx|E03ZoYqIUis461Nh%S`xgd!DN8u3P>QIx=Mn`zhJY=u6= zu1`r!5kmz$XZYK54MwOl!q@4&9CF)$_hvD-6 zXhXbE7cU&Bzn?x($x{~c~U|aPur~5B5 zePt{h>6rGAs1mjBI^HgeKmzy*xvx0NZAD)t+xmvCtQXpPLEGCZRhC3|SCy7X{}I6M zMRJ+wj4MYPuHYpd$a&K(9SHq*NX#^b3TS$Pm+Ml_3)^ou_*k8f?QGWgl*OlRc@Kl5 zW@P%wtQlOY1(&SglIdM)dVn{MHF78w&)A;oba)q@B_boT0}2r!d^^4H!aIq(x2Vcf z=yU8N*G#)t^$m$sF$O5_7s4lk89239+{;yj8l14;M3d@)1=s`x|8fE9t*(zd${0T= c9yl2@7My8P9(WaJ5F{Cw;QyShPfk()0w6|YX#fBK diff --git a/web/minibase/blueprints/sensor/forms.py b/web/minibase/blueprints/sensor/forms.py index aaaeec6d..135ba538 100644 --- a/web/minibase/blueprints/sensor/forms.py +++ b/web/minibase/blueprints/sensor/forms.py @@ -10,6 +10,7 @@ from datetime import date class nbiotDeviceForm(FlaskForm): # Defines the self class to be used for the user update name = StringField('Device Name', validators=[DataRequired(), Length(min=3, max=50)]) + model = StringField('Device Model', validators=[DataRequired(), Length(min=3, max=50)]) serial_no = StringField('Serial Number', validators=[DataRequired(), Length(min=3, max=50)]) device_id = StringField('Device Id', validators=[DataRequired(), Length(min=3, max=50)]) imsi = StringField('Imsi No', validators=[DataRequired(), Length(min=10, max=50)]) @@ -19,71 +20,75 @@ class nbiotDeviceForm(FlaskForm): # Defines the self class to be used for the u registration_date = DateField('Registration Date', format='%Y-%m-%d', default=date.today, validators=[DataRequired()]) activation_date = DateField('Activation Date', format='%Y-%m-%d', default=date.today, validators=[DataRequired()]) deactivation_date = DateField('Deactivation Date', format='%Y-%m-%d', default=date.today, validators=[DataRequired()]) - owner_id = SelectField('Owner', validators=[DataRequired()]) - user_id = SelectField('User') + device_owner_id = SelectField('Owner', validators=[DataRequired()]) + device_user_id = SelectField('User') status_id = SelectField('Status', validators=[DataRequired()]) type_id = SelectField('Type', validators=[DataRequired()]) area_id = SelectField('Area', validators=[DataRequired()]) - manufacturer_id = SelectField('Manufacturer', validators=[DataRequired()], - render_kw={ - 'hx-target': '#manufacturer_id', # Target div or modal for the popup - 'hx-swap': 'outerHTML' # Swap the outer HTML of the target element - }) - company_id = SelectField('Managed By', validators=[DataRequired()]) + company_manufacturer_id = SelectField( 'Manufacturer', validators=[DataRequired()], + render_kw={"custom_option": "search_field", + "query_table": "Companies", + "query_key": "name", + "query_return": "name" + }) + company_owner_id = SelectField('Managed By', validators=[DataRequired()], + render_kw={"custom_option": "search_field", + "query_table": "Companies", + "query_key": "name", + "query_return": "name" + }) image_file = FileField('Update Sensor Picture', validators=[FileAllowed(['jpg', 'png'])]) submit = SubmitField() def populate_for_updating(self, device): + self.originalModel = device self.submit.label.text = "Update" - self.user_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_user_id)] - self.owner_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_owner_id)] - self.manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_manufacturer_id)] - self.company_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_owner_id)] + self.device_user_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_user_id)] + self.device_owner_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_owner_id)] + self.company_manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_manufacturer_id)] + self.company_owner_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_owner_id)] self.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusNamesWithDefault(device.status_id)] self.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeNamesWithDefault(device.type_id)] self.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaNamesWithDefault(device.area_id)] def populate_for_adding(self, device): + self.originalModel = device self.submit.label.text = "Add" - if self.manufacturer_id.data: - self.manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(self.manufacturer_id.data)] + if self.company_manufacturer_id.data: + self.company_manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(self.company_manufacturer_id.data)] - self.user_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_user_id)] - self.owner_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_owner_id)] - self.manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_manufacturer_id)] - self.company_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_owner_id)] + self.device_user_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_user_id)] + self.device_owner_id.choices = [(row.id, row.username) for row in userUtils.queryUserNamesWithDefault(device.device_owner_id)] + self.company_manufacturer_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_manufacturer_id)] + self.company_owner_id.choices = [(row.id, row.name) for row in companyUtils.queryNamesWithDefault(device.company_owner_id)] self.status_id.choices = [(row.id, row.name) for row in sensorUtils.queryStatusNamesWithDefault(device.status_id)] self.type_id.choices = [(row.id, row.name) for row in sensorUtils.queryTypeNamesWithDefault(device.type_id)] self.area_id.choices = [(row.id, row.name) for row in sensorUtils.queryAreaNamesWithDefault(device.area_id)] + #custom validators specific naming convention: validate_. This is how Flask-WTF knows which field the validator is associated with. def validate_name(self, input): - if input.data != self.name: - content = nbiotDevice.query.filter_by(name=input.data).first() - if content: - raise ValidationError('That device name is taken please choose another one') + if input.data != self.originalModel.name: + if (nbiotDevice.query.filter(nbiotDevice.name.ilike(f'%{input.data}%')).first()): + raise ValidationError('This Name already exists. Please choose a different one.') - def validate_device_id(self, input): - if input.data != self.device_id: - content = nbiotDevice.query.filter_by(device_id=input.data).first() - if content: - raise ValidationError('That device id is taken please choose another one') + def validate_serial_no(self, input): + if input.data != self.originalModel.serial_no: + if (nbiotDevice.query.filter(nbiotDevice.serial_no.ilike(f'%{input.data}%')).first()): + raise ValidationError('This Serial Number is already registered.') def validate_imsi(self, input): - if input.data != self.imsi: - content = nbiotDevice.query.filter_by(imsi=input.data).first() - if content: - raise ValidationError('That IMSI id is taken please choose another one') + if input.data != self.originalModel.imsi: + if (nbiotDevice.query.filter(nbiotDevice.imsi.ilike(f'%{input.data}%')).first()): + raise ValidationError('This IMSI no is already registered.') def validate_iccid(self, input): - if input.data != self.iccid: - content = nbiotDevice.query.filter_by(iccid=input.data).first() - if content: - raise ValidationError('That ICCID id is taken please choose another one') + if input.data != self.originalModel.iccid: + if (nbiotDevice.query.filter(nbiotDevice.iccid.ilike(f'%{input.data}%')).first()): + raise ValidationError('This ICCID no is already registered.') def validate_ip(self, input): - if input.data != self.ip: - content = nbiotDevice.query.filter_by(ip=input.data).first() - if content: - raise ValidationError('That IP id is taken please choose another one') + if input.data != self.originalModel.ip: + if (nbiotDevice.query.filter(nbiotDevice.ip.ilike(f'%{input.data}%')).first()): + raise ValidationError('A devie already has this IP') diff --git a/web/minibase/blueprints/sensor/models.py b/web/minibase/blueprints/sensor/models.py index b43d65e0..4fe4aa32 100644 --- a/web/minibase/blueprints/sensor/models.py +++ b/web/minibase/blueprints/sensor/models.py @@ -6,6 +6,7 @@ class nbiotDevice(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50), nullable=False) + model = db.Column(db.String(50), nullable=False) serial_no = db.Column(db.String(50), nullable=False) device_id = db.Column(db.String(30), nullable=False) imsi = db.Column(db.String(30), nullable=False) diff --git a/web/minibase/blueprints/sensor/routes.py b/web/minibase/blueprints/sensor/routes.py index a427686c..910c785d 100644 --- a/web/minibase/blueprints/sensor/routes.py +++ b/web/minibase/blueprints/sensor/routes.py @@ -80,15 +80,15 @@ def edit(deviceId): form.populate_for_updating(device) _accountInfo = mainUtils.accountInfo( title=device.name, - description=device.legal_entity.name, - short=device.website, - status=device.type.name, + description=device.company_owner.name, + short=device.device_owner.username, + status=device.status.name, image_file=mainUtils.imageFileLink(device.image_file) ) if form.validate_on_submit(): - if form.picture.data: - picture_file = mainUtils.save_picture(form.picture.data) + if form.image_file.data: + picture_file = mainUtils.save_picture(form.image_file.data) device.image_file = picture_file mainUtils.fill_model(device, form) @@ -127,22 +127,3 @@ def add(): return render_template('edit.html', theme=theme, form=form) - -@sensor.route('/search/', methods=['GET']) -def search_field(field_name): - query = request.args.get('modalQueryArg', '') - # Assuming field_name corresponds to a model field, you would add conditional logic here to query the correct model. - if field_name == 'manufacturer_id': - results = Companies.query.filter(Companies.name.ilike(f'%{query}%')).all() - # Add more conditions for other fields as needed - return render_template('sensor/manufacturer_search_results.html', results=results, field_name=field_name) - - -@sensor.route('/select//', methods=['GET']) -def select_field(field_name, result_id): - # Return the selected option - # This is a simplified example, you'll need to adapt this to your specific model fields and logic. - if field_name == 'manufacturer_id': - selected = Companies.query.get(result_id) - return render_template("sensor/manufacturer_options.html", selected=selected) - diff --git a/web/minibase/blueprints/sensor/templates/sensor/manufacturer_options.html b/web/minibase/blueprints/sensor/templates/sensor/manufacturer_options.html deleted file mode 100644 index fb4d2fab..00000000 --- a/web/minibase/blueprints/sensor/templates/sensor/manufacturer_options.html +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/web/minibase/blueprints/sensor/templates/sensor/manufacturer_search_results.html b/web/minibase/blueprints/sensor/templates/sensor/manufacturer_search_results.html deleted file mode 100644 index 636c830c..00000000 --- a/web/minibase/blueprints/sensor/templates/sensor/manufacturer_search_results.html +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/web/minibase/blueprints/user/__pycache__/models.cpython-311.pyc b/web/minibase/blueprints/user/__pycache__/models.cpython-311.pyc index eca98c8f0b66d8a9721c64c4e6ec277dc421381e..df776b20ce40be1ffd3670cf1fe4149d10c4969b 100644 GIT binary patch delta 1957 zcma)6OKcle6rJ%mW5>UIZvI~fD!FwLPI2pTwvF6Nu_nv$2 zx$n*Rhw%5$_`mh}JRG@Nlpo)J-2BA=BDcwnz9T z{KOx|2ljqqy=f2QzpK{g_EteCdUhQo(}B-9I&s_{2zz&VvL?5Ap_AIoBL;BZ*3(+= z4?e{oBK~eX;B@jW*yrd8xp(cP1G&vhY-RE1T9^;{8mKs%)yA^=YFYmJEc}b39lvDn z91U1wC|C?xlmMQ#_vKrxOt!mBo!DXHB*!f$TNAsJ*~lq%-Rfqmx(+@6otZb2&y;C3 z4~dl(d#h#o*c!E=b_B%^%Q*cOR%b)jfJGAi%;u%1m9Onp!R z?UJsKSZ7WgLy@<*i3#j>^$qqDcj7x+#g$9TALgV=Q#!Y~xwgJ3P4H?LiQ%YgaO#-o z;qD3>a#ofyQ!=_MWU^~n(`?>Qa_OvU29Dck%BpJ^f9$&1G)fkv%*g&& zQpKIg;gB~n=gMSNNy=7;9QsV9m5Q*XWU{FZ1xXc8LQy68MtVWIQ*jgRcTzH{G*y*T z%VP?sUVOnTd)%tBDUpRbf)BhyZ7-A7m1fG8H*QPWn+j52!M}O?^OHnt;pBJJ)>B9x z!NC3XFXgXoJD##bgQyNs1EPgl<`+mr*c;yV?f6RQa7lv&9Tp5&D9klrl${#Hbch)c zE4)@8&-+djE}tcYxBWZ*Qua{NU{Qxf0~TxIOc5p{cbL;4sYB9$WZ_Dq8kBMET@6-s zST$g^rX+u=PPtu!xDIgx;)MjOLN=j9Mx4=M#(6yD*Nfd$sPEI-y5$A*NIs16j>v7FX!OR+_HDMY@cRTKG;syQyw9uTKi?IpKX>K~99$i}g)&T78h_ue<} zefwtS=S#l?9rx{aD?>*6(XU_5Ssy#rbU=?wy6?aUeoqJjD}Jo^Vwv z+_tm~4D--{@9Qt(s4!|YLTj7Ff9aqaSVlNtFq2P7V)(mVIT)bA>S5G6?2`SG0-_=;g`k< zJZy)67AH|16|*=Sw+}5QMlJj2`m*uVg z2r3oi8+nKVIO>?%zCzaYZ5x&KO8(XzxsoeEbd|UsFo>QcL=P9Dhk5{1$VP}LslIu7 zqObaS&m!yyyHYJyzk2Y#Vu^MwQPmQy#(SK12kmY(q=wLx_G5egrvISwL{_*&mrJNz zqMF?9iT+x={#hg6xY^7f==X}vVrTVeQ4v#JF{O$rlAIr_33aJ4*N8Re_A`46&4tc| zqYDb3?D9#KPgYYsR@{m0&eg8f()DYNjc>2luOBQvS$uItVbfhUt+MHA;$)We-h6Yu zGo!?FX@$>p`HaeENS?EDJ1&Kr?Q*j!H(O2i1Ya#s4>#h?Wun0Q{G1}JbcGdFSg9`e zJd-t4-`W>`@^v6Nv0uaJK2=0QLv~da1EAa9KfiJ== z`hdLAhZN>1EKs0V6@5hEV+t_}pAhI9itBgeJ`3fITPR{{ title }}
- {% include 'formModal.html' %} + {% include 'form.html' %} {% if extraButtons %}
diff --git a/web/minibase/templates/editModal.html b/web/minibase/templates/editModal.html deleted file mode 100644 index bdef555a..00000000 --- a/web/minibase/templates/editModal.html +++ /dev/null @@ -1,21 +0,0 @@ -{% extends "base.html" %} -{% block title %}{{ title }}{% endblock %} -{% block content %} -
-

{{ title }}

-
-
- {% include 'form.html' %} - {% if extraButtons %} -
-
-
-
- {% for button in extraButtons %} -
  • {{ button.name }} - {% endfor %} -
    -
  • - {% endif %} -
    -{% endblock content %} diff --git a/web/minibase/templates/form/allFieldsModal.html b/web/minibase/templates/form/allFieldsModal.html deleted file mode 100644 index 342a5ecb..00000000 --- a/web/minibase/templates/form/allFieldsModal.html +++ /dev/null @@ -1,7 +0,0 @@ -{% include 'form/stringField.html' %} -{% include 'form/selectFieldModal.html' %} -{% include 'form/dateField.html' %} -{% include 'form/boolField.html' %} -{% include 'form/fileField.html' %} -{% include 'form/urlField.html' %} -{% include 'form/integerField.html' %} diff --git a/web/minibase/templates/form/selectField.html b/web/minibase/templates/form/selectField.html index c73e3524..360ed9d8 100644 --- a/web/minibase/templates/form/selectField.html +++ b/web/minibase/templates/form/selectField.html @@ -1,6 +1,12 @@ {% if item.type in ['SelectField'] %} -
    {{ item.label(class=theme.form.select_label_class, style=theme.form.select_label_style) }} -
    + {% if item.render_kw['custom_option'] == 'search_field' %} +
    + {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style)}} + +
    + {% include 'htmx/popup.html' %} + {% else %} {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style)}} {% endif %} +{% endif %} diff --git a/web/minibase/templates/form/selectFieldModal.html b/web/minibase/templates/form/selectFieldModal.html deleted file mode 100644 index 22e34208..00000000 --- a/web/minibase/templates/form/selectFieldModal.html +++ /dev/null @@ -1,33 +0,0 @@ -{% if item.type in ['SelectField'] %} -
    - {{ item.label(class=theme.form.select_label_class, style=theme.form.select_label_style) }} -
    -
    - {{ item(class=theme.form.select_class, type=theme.form.select_type, style=theme.form.select_style)}} - -
    - -{% endif %} diff --git a/web/minibase/templates/formModal.html b/web/minibase/templates/formModal.html deleted file mode 100644 index 433d0856..00000000 --- a/web/minibase/templates/formModal.html +++ /dev/null @@ -1,18 +0,0 @@ -
    - {{ form.hidden_tag() }} -
    - {% for item in form %} - {% if item.id == 'submit' %} - {% elif item.id == 'csrf_token' %} - {% else %} - {% include 'form/allFieldsModal.html' %} - {% if item.errors %} - {% include 'form/formError.html' %} - {% endif %} - {% endif %} - {% endfor %} -
    -
    - {% include 'form/submitField.html' %} -
    -
    diff --git a/web/minibase/templates/htmx/popup.html b/web/minibase/templates/htmx/popup.html new file mode 100644 index 00000000..f922159b --- /dev/null +++ b/web/minibase/templates/htmx/popup.html @@ -0,0 +1,28 @@ + diff --git a/web/prepare_db.py b/web/prepare_db.py index 5c1c3d04..603b410c 100644 --- a/web/prepare_db.py +++ b/web/prepare_db.py @@ -53,13 +53,11 @@ def initDatabase(): uploadCsvOnlyName(nbiotDevice) hashed_pw = bcrypt.generate_password_hash('pass').decode('utf-8') - user = Users(username="Admin", email_account="admin@kynsight.com", email_comm="admin@kynsight.com", password=hashed_pw, role_id=1) + user = Users(username="Admin", name="Kerem", surname="Yollu", email_account="admin@kynsight.com", email_comm="admin@kynsight.com", password=hashed_pw, role_id=1, street="Meierackerstrasse", street_no="10", city_id="1", post_code="6810", state_id="1", country_id="1") db.session.add(user) - hashed_pw = bcrypt.generate_password_hash('pass').decode('utf-8') - user = Users(username="KeremYollu", email_account="kerem.yollu@gmail.com", email_comm="kerem.yollu@gmail.com", password=hashed_pw, role_id=2) + user = Users(username="KeremYollu", name="Kerem", surname="Yollu", email_account="kerem.yollu@gmail.com", email_comm="kerem.yollu@gmail.com", password=hashed_pw, role_id=2, street="Meierackerstrasse", street_no="10", post_code="8610", city_id="1", state_id="1", country_id="1") db.session.add(user) - hashed_pw = bcrypt.generate_password_hash('pass').decode('utf-8') - user = Users(username="Kynsight", email_account="kerem.yollu@kynsight.com", email_comm="kerem.yollu@kynsight.com", password=hashed_pw, role_id=3) + user = Users(username="Dadasli", name="Suleyman", surname="Yozgat", email_account="suleyman.yozgat@gmail.com", email_comm="suleyman.yozgat@gmail.com", password=hashed_pw, role_id=3, street="Kuskonmaz Sok.", street_no="11a", post_code="3451", city_id="1", state_id="1", country_id="1") db.session.add(user) db.session.commit()