From c4791176e0a0685d7760307f10dfd56583a5691c Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Sun, 22 Nov 2009 18:03:07 +0100 Subject: [PATCH] Initial import. --- static/templates/template/images/de.gif | Bin 0 -> 1497 bytes static/templates/template/images/en.gif | Bin 0 -> 2528 bytes static/templates/template/images/icons.png | Bin 0 -> 8958 bytes static/templates/template/images/menu_tux.png | Bin 0 -> 19431 bytes static/templates/template/images/shadow-h.png | Bin 0 -> 1325 bytes static/templates/template/images/shadow-v.png | Bin 0 -> 311 bytes static/templates/template/images/sprite1.png | Bin 0 -> 6109 bytes static/templates/template/style.css | 474 ++++++++++++++++++ templates/login.html | 76 +++ templates/logout.html | 60 +++ templates/template.html | 80 +++ webapp.py | 62 +++ 12 files changed, 752 insertions(+) create mode 100644 static/templates/template/images/de.gif create mode 100644 static/templates/template/images/en.gif create mode 100644 static/templates/template/images/icons.png create mode 100644 static/templates/template/images/menu_tux.png create mode 100644 static/templates/template/images/shadow-h.png create mode 100644 static/templates/template/images/shadow-v.png create mode 100644 static/templates/template/images/sprite1.png create mode 100644 static/templates/template/style.css create mode 100644 templates/login.html create mode 100644 templates/logout.html create mode 100644 templates/template.html create mode 100644 webapp.py diff --git a/static/templates/template/images/de.gif b/static/templates/template/images/de.gif new file mode 100644 index 0000000000000000000000000000000000000000..8514a0a2507a5c8b93e4c7de0e73bfe68ceadd77 GIT binary patch literal 1497 zc-pno`9IWo9KiASXfWeDm@BLzCTeQtvE|_|cG+#w^(ZnLk;;)8HfP!?$~cC3Fz%4r zw&);7$V$plRG1|zMqA??gF)peQM*37{So{6;q@Opop(Cf*dDV3CVT?u2bvUUFM#?0 z$QMB~8nAvG{V&X5kZq^n`oH7HD@2(`fhZOOTH&K*SXqL_S&;QZRXLz#99qWEXEyr6 zjSPXM1(BE!f)GG&NNAdmUcyQbEdBwCMv&D)+byWggQ{$(%!0CXxEc@QC`dgGDUpyI z4hbO;?gQv04)tN^4I2&GBRLn19Yd3mXp+Au7ojd#>4eW6u-p!d&tbj==2~E?0hEtG z*#M*WK~@E_YIs!vy=BmK8#-@6M-j9YLfu8E$%3j3s1Ut&UR7(NK2s!RAt@WZ-ZtNDjRsxO&_OiJ zotOH2knukbC4L+hweKS)S*a<#ut_g$go_n@Pf&W3rhIkYp0S+EIkI%;!c1k_Nv5io zmYP@(%eOawoF#s3tSvRt{#6f)qZ0*m;%-cJ8xcRsAdfJ}gT~|mV{)H?c8h^l^IEOT zx>ziYc!5fcp%KqgiJ=t2;zru&ddeV!B3n<1TdjeZ^c5z(YOPj)Ho;GufHtj`v-O8q z`h!e;WM-ITNJo3^CtPgDoNeVl*`n}(nNz;XU|;1aUzDEkAw@7J63nFt$^(4aNF)>r~1L_`FS#|sP$^!E1Va=9E1$IZ=c-@bj0j*bov4)*r;wzjr5Ha6DQ)|Qr* zW@ct=Hk-v_nVOn17z{lyS65S0Q&CaD;c)Oj#QwUk790o& z+B0cMKkL`T6KI>g+bXaBnAnwXKpWqE?P-dhIZxJBC9eyS=1^8WYj<7m6iYQe)Lwm4 zlDE~b!{1YRU=ydpUvV~4l3RGFCQid(S55JsMJ|b>Dgm20tiy-gER3J5S5GVD-s25) z{9byn>~LeoPQN0}XQ9JAcMeNx%ir7&?T;$W4Ssbu?U#kAfhDuCwycc@y4LQgo9!sD zj;Qb6{{uc*+mNyQ>YfMH3Q4|cQ!K^LDQS%t*KQ{RpR9aYe4x~)v)*!Q-FJ;S*Q>^T zYlEcW(}SH4@4p{vK64=Gcv*i%LtA#l42zmSKhb?DJ+;+2`{vF|TTc#kH9Y+Eez+wB zy{GefOE{HKk_ns* zUH5YO4$?hNjBt*LIUWh_is6wYBO!A%*(8_1&^nSTaPssFu2j+3m~SLcwUC~Wi*3eT z{D>y0WEJ(}+}6F8Jv;oyGF>*5jAiYy5{;Ql=yFMzPE1Ru758|FBG)@gsmSx>Wp|pl z;ahe)$#0a57X;TT$1jIgD8)y*90MnOdiwYiS0#epwZFykasrJLW{im@@r1(3!c?oN z$)XIW`bpEm4|5&t^T7-kqm;kHl8vtkH%}Gc$mLCyTz4BKZYr*%VlguVjT>2emKFHv zvbuWr>F5pRdDC~3XU?)J>)v%Z;P50P2LOxdnS0$%thY72+k%>L1e0scDtZ=M1$c_X zY;)aMZqU02lebF0eL#0V`dC%Vzj-7h_;aggg_~_$ zcW7^)9G-0WVq08>m%)$$Y3A;r4ezw^Tz5jG<{}-G6ibDVZ literal 0 Hc-jL100001 diff --git a/static/templates/template/images/en.gif b/static/templates/template/images/en.gif new file mode 100644 index 0000000000000000000000000000000000000000..28f9b200f3c2031a13f252ab73099bc8ebf1dc0d GIT binary patch literal 2528 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 literal 0 Hc-jL100001 diff --git a/static/templates/template/images/icons.png b/static/templates/template/images/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..4f913fcd17e1320a1f9ba32ce6ea580ce62eedf2 GIT binary patch literal 8958 zc-pO6h9eAt5axB_S;!AV{s!Dc#-me1HGL zGjrzLJ9pm9oHH-x#UvW&spDZ&V*>zyr>UU=`VUC~04Wy}{Xa&aVn_5JAo+sSUjcRF zw0r+0=wNMi72xH6Uer~Q@t=a_rD5(105~N73nU;npYlHu!%tIJ6=NQUjGS0pjY9js zIwPQ|qGTMjaFiPeH~IVbrN_0<*W;5+mvAhXAnvE)N*e>OXEp(i!`$y!YBAbytuXs4Q@PnEYv+j z;|^DNa$r*>R~YiS5>6}cC5AWvhi1F?hfjZ1{3P#hWN#U9DfY6br5C@WO?C1h+pxx_0Ree_XG8%jkZ0%KQP@ZlyT;K-jOIr>mJUExL5 z_i@OI7=Q#)vZ6Jr4D-ynoN!x3t?yrFQFP_ZK^N_8upVzx~qo~O;=01UNjW;^{ z5^c-cVWlf^elFO7oQeC@-TP8@&jZ7*p5cs8qd*WetA-3p_>gDoE~PkgTu`=2X>uI& zJa5rVI{Oa0>tddBrQVOF^UCGVGTA|ZqfA`FMMJQCzLGE7a>TYX<|jOc`8)(f zW!kDBwt4-RyLO}dkc4|ym@xs?i-F+_f#nMEI_bPFKFyFe8n5qULpsbKV+QICAqae0 zsp0J?>K~PR^;X{f+zjZ}-qXI~fVVnur#yw52fimv%^i4&)*v)CafUv^zPO{uW+Cdi* zN+wLnzy^P?R|t))Me;>rYcrpb&5{he=Z^!hc7_|yZ(sV zG0&|0w&%KLrTI12BUZgNHPrJ1i*QV5(~sM6oM8E>a53q4hKSypU~FHRS0};1sN*j` zXjZknP(6KHkBK*V+79WqAd)*A!58>jUe9Zf1Cx%?(s}YWg*M;8bdHfiy$lFd$ z6I;h-ho-<}r(HZhz0|>B{_yqD2wNZHV>iSR;ivL&pZs%-HYoC@;|8$VGr@6-?|CBt z*o>i3EVTu0?s8l&&<>+WRyQDhwGQ)U0uC)3RffuX->2fqs3Sz$5Lp9C{T_ceDNa`f zy6w?`u*`ICw>tXU-4eT}%lTvpF;OQ6U$Ne=x|No{#xw!Q;)K*rsR;}BT%(kfo9{4x z@kMAx#cA$6i!YMR5zp7j#Bz0aR-aL5jz~Ms+SLXB8o_FWYhS|$ZGDA}*k#R;FwB8! z_0;uPk#Tq|L!a-3K&OA}@`!a7-i~#l@3q5fN844yP&Vz|t=-$_$BUhp!uRs`7ll|r zix9!`b>2a+`5Wm8tI?G%8tvFcx&#!X**F8pZc*j*V9L7Bh&!hsfr@rIXx%XQ=%bN$+*0OUa_izko zVE#u1U;8>4mVIA8H8G>SGtb1bh}|h9Aj|8;9?_QTureEzbwby@HaYU{yahH_HLB-` z1hl`571x+HJ#Qs&^z2MMMC`W;;vAb#=q=vGPraBQi^J;Mj<7t={EIdW=HU5a{>!N} z5M7QT>+*iNtx-dlbMdkH&#$)kZ)Gj*Mn_KBdu&4ZQU(45 zQg{s3k$fRu8q~fBkQX|NI=2t~a^m050_vKJq+3=E1A(;z`fj z2l=WO9{-XQcoOMM{YGJ$ZxNwB|LS0Cn<6ML5+id~udBB2FUF487&-*YHQoq8#y13R z5)YhO+P%-_b82AyrFG?{U8$NG1g$w=DsC5vFEH+`-$g%oy1r>9lPioy#>c+StxmOE zki`L@*_(;EI5epQm-E`b0;9U>dMOrhcG=l3`dPlh6Y6$F%AJdM;@-WAyuH=e zg`q*>0B*Q%!qn}D*B7@Vf^FC<6K#Ft_rCo&BI&ud8P8rSBsIQi{Ry`@It&6bf;Yo= zfFRhsp)zN-NRM*2>EkvbaA`Gt5he*r&nIP>U`6W zbI47O`#vmg{xMna<4WI{iprz1Qn0kKm=S0V7(yuWgp@*q|4pzgrL;38tqxVyG-3uk+rH$y`yi2j@aSFFUwMbR-DjiY@ zPsQ?!L*k2@+S+rU$Tt=CR}&KZ*Mm<;PkHy0*cIeD!877f;-dkp_4zuh;va~6Bu`>t z!7Mz%K1iml)XqHiEh6LjJA*JK`NHty=6)(ak9@E_Ia-Q{xx}S)!)W47hXX6E{nW10 zyS*v;mXSD*mr9J87I&v@Ar*VR`4w$bJv}F2a#j>g zNNtZ(w?!sEm6cW;Z=>lbXp>`P(l6FY0>i*r!b`0&My*^u%3k^XL;vlUahZQ3c-P#H z1u7~^j^rw(1AW(oFTSP%KAN9pf7_&L$Csm=&|jW?I#6y4jv3)edFLg0Xkaf`s^lfr zR@=lN;O@e3rmAa0BeFx14t6Bokd40nb9J%fk3_#U#VIfdEaJ) zDWwB~+)*=%=KWs5VhBV-N+K;0!sny=-L6P$-DK)`hHm}gRk^AsCubmEeN?+?TuC}< zY!EKLhS*v&Rza?-qJ*1s5*02+5f<24?-dkbHoMy&O^{m`e!CpQ!jNl0NkZ_{yqOhR z;lwzzF~lSDU=M>)7I?%s&JNqouK76saoJC(PZ3pS;lvC0l;DRfng>y83ase8v^zc59>-WMZ+`c4l(&AHqvtBk>vy9%wI!lt059O0I>6hwP>WUTi3TTn zB_WAm!)+Z9xZW27W0gPwvCDkH#5TE10hg9zXKRT>V=G&dQ4?-}q}bdcbq8KlYzb|U zPuzH*zD<33gD#1nC=mBSi5`lkbG6s)(c!$?mJO^$jq@ra)$jBP?V8k2DHZw3Uc*KGPwP1Xkw=jCigUaAPuQX@z9}>BQ=WKV(JoP zfS|;Ol(dDPwS3<|&9NIHYjwN*61SA4thT+;Qnj}!RSiZA2qy^piR>pEb%*_dNl4h{H9~snnqrbBS^mXZg)!LKGE5|52rW$>(SJ6n@#8A$Fudlo0}*1NB3%}Cumv2 z0fpyQ&sUE(!CP|HxK7)4*`GoVxEG}cRav)Yy`bu?6P9jA=`2EkWFng^4sCzY{tayqh#)V7L&%KBz z@sN6sPz4z>xJDUc8E0b!0pptCmM#E1>{DAGIi_;^qp)0akvnMdqhu?_f3Hy9*^%=O zP9{zfw@i{7CuqgG#VZzT7md>>&w);zu~qd3%O|-+`0yx_G^$vE+j6PfiYKe|(7HOE z7=TL=tJhx9P}I%GX|gndD}93zKi=;0tT+N+T~~`7Wd4IaT8+Cr+fiQjTW|15!+5xj z?qZYezt}Bhqaqw8x|(LzzTpNTRLW`Cq@T@vAJ8I-$^^GJ6KU=gm0`D+DX?LAyX*!;;`mjG-j_HAs?z&v3zKejBy1ikm&N=C2Wa08Lo?K z1}GgzC9ftRST}r8+MgMC-E!GqR+^x>eVsxW|0DQc$;3W|2vWvcx`fnZAI}YperBf7MFW5 zMo$CWzABe+6w(=Vdjrd2TgQ9z7J#2^(l6E+?(JLWhSdmC2~h#K^$25ZBJI9LQu{Gf z-aS+ZzjdZQyt#0-g`@ldS8%~G-4~O2&YNG4U}`jOnf|Ve=tZsb1G?{D=L#QgP7d3%*t6c z;xgB6#kLt%U-7KGYT;F3W2qFyR@c?Nyi#IYgdr)$F<+KEqzRq+C<&7FEzTtq^YL!$ zjmaBWFJGAgYc>P-Q+$UWH%I{W;v*+Wx9uSF(Lj>L?wO%Z!C`b!r5JjkK!#y0ssEJv zK7!EU!~_qDqMKpSE*jv?-c`|42|WdP+h ziJ}gGYQ$;7(pB6sIyNkf_Zk_6X%n?Qg&MB9&}y{b;mNK@L7f|NuOnxbO>Gi7!&NK_ zMhkQLFk-__I9JC;)bz^uJ|`ie`v_l9B!f|rlV3zn_>ziirw9JM<4^*v>~586!Bh8} zEB!w9%qzs<@OdU^_%eDIzUQ4mR#H}+%x;2|iQt>(J|Wn_=J(51_Q`b5g2p6tly>Su#WUf9W<^vZq`(Gk#H( zVthK)X3zoeXVu=WO)@xJ=#$NSi%gEB?aV;ljb~*pykug0N_b}|zpw~}U@{)nl!_W! z3i{3d{3>o$rjz*C$uz8?udWs%4fTn$(SPZv#0gKPBHQrVuEd&~Z$&Ts_Dr9Xvo}04 zrl$5r`urkJagf(-vH9r>S5{UBD)489{+KMf2dG)Of~{+wDUuAZV#XiPgrrKv=P$W^v=u=|k0yG_R`Z*x>=5F0MaI)E z#I7iK-%-({%yms$Ds#ROI8Z^z7Q93$1a3QkKTr#SQFRcn1WDuY(BFj6oSr=oNzKaB zU;H|@O_^WALHE*HamZ)ZIve;|9ppKRPHErEfZ69rDfx7{w|d{dSE1{x&SKas9;m?< zB@ysQ-(wNX!8d;oJig7if9%3UeN4DjvYzQm{MgD{Od%l1{i$1?Mn-FPUtH zp!Cp=`>T}eV`nwTcXEJpD}N^<;CRVAJ~ZWib63dDseAb}Ex72LIZcibbi{AEW!uDZ zjb1n1jFjOx6k7cz(7@N4Z}#TWK!3O1-0@Sn+|$6nmp5L^WS+d=w_3$NVT8;ac`x$1 z6mz^NA;tHQ7=cXUoHAIxK{q zE{)u^O~WCufB!sN9UoecnoMSAYu!AYKTWNYLD>BWiAq7IgCV^(ZI||#)98mz zh>Y2ltHnh}5<^_z(z>g=$7hvDU^{a1!;HIopkXImrUk#!v@k39Bi`a0QjM7>UbLk;bgg zZ+-v$k|F1|YCz^fw|^YQHG?wc6vK;28L85^yE|Y|CN^af+$z-X%ms{qW$@6Cp!uA# z=tfo^E~MAA8Q9riGuS)`QU>P}^BM=Y@W#QQy1(OID|iV<3V!;S63KF(YM~&m>zOhR z?bAw!5syJL!Dhtuq#0m(=b%m#kgyPCZZRT78pnkwuk+}~i0X6M*OwoLO|;t*-BaI_ zS_$3EA;xLgf@RTc7-QMA5*bL^TyyTo7zNPH$Dn0{_U5=%a5fRHGRj;%6L7+AD6ZF?xj=yv~d|^ zRNHG8!VS_tXn4Jhs*srOL&-8TOLed`G+|^qjsvC4Xh7*y)VR(jO~>iJL!i<37NYe9 zRw(UwbdB6E%P{_55zpto_N=vGCn*R&rm|=l_OIq%tv+LH!w*DFq?zD9ehx*wEf}7^ zyRi1aC}Y$Zj~G5h49A1N#=RHBEG8b{Nu@MMYp|i2sswVNip5w~D39}`Db z(9HRT(=$bT?eF@1+NDr0%re@eP5p(q>6m+zNrzklK>luDvGYe2sWO+UmS#POm91Zt z3|wkt9ZK42;#TUnh(GX7^pbw8Vsl$BY~hW@OZuhgq215ov6*)m5S(#Jsd^ClYbRMM zuy`3V6*YD0eUOKmKshJoexNfrz0Owzme9p_q2{n z@z)1`%8&6{SCRc5PJ|zXZOb5p)B>kaLTk%H-j!66&(;tov8YK;xa;E$I>@}(9qgxQ zLgXn=rQ5B~B={q=4YeD&{6M+rM;Kco%adZ5gh;4LI#Jz(Fkv!jCxKFS3t~$TgFh4i z8j1lgm%R|F$l#nxeG^4^mpmPy*M85?eD~M7F`{|!1KdRk;ZGPp+3ARr^eNdUCEA>c zFgcHmp#>=(Ct87Wuq}+D?rC1d9YMVItKF{t&IB^O-SgUI7HJnB^*SQ9cM5Yj8(Z8C z!d|q9CYlmRhL=Py#56}SaMzPx9(n%bua(LluSfMdi^gx=6*6ohp>-k0KR;;2ZFjdc z1c;^lnNN5j8m%E?C+RhU^AbN}-i?W;i8H4F1OfqbaW>Bp~@RZknaZ08>q=(ef@ zBAV@juVAI?gH^Il|3)a&Eg+=o*hG+S4TaejhQaes7G9ObsoN>vg#}&zsb-9G7aGe{ zD!H^eyj$Vu*sA@yD)X2(b0u?F$3OA8-B-wVn38=D;9>qi#{0S+hmLUU)dw3VSF$Jn zc^{R2^Jf=jy}Zj!lSt{z0E==ppniKT`#kg`|3X2bYe+=o6f%OPG3nTb1EYo?Hdd3) zI4E1s#eD8OZ<&^>A2IK;^0K~~eE)hq^7gSuufW_J#3$6WQ%7*@zC6{%yf=^bL5JtZ zPuo>J)G0JD9gNM{#(EH!5G#llJxochz!wz+TiSj)>GVj_lao1}V2Fx77~bty-7RSTNs|uD@;?=+#|^V=2Q=LSe-HkQ6?TW?sP)hj;5;r4by$| zulSEn5i0#n*c(!Y`h4MUdytySlZIwW@)+@3j#Ra{l^Z^@_W!h4{4%xa8E*{jZ=hs0 z%y6f+)gGmV8BAtxg=VMO`BSE_5zmwy1-=dYLQfg&M*{z8^X!^dH zboZbE$|MDP7q(5z>hFE* zw;$584~E8{ttit)@x|lmqWSQ|im8uPN$}AFg?QI4|7D!E{?czBlOV}zz`5-gnZ<{m zebnV?u({gGH=K-jacIX>dF({A;`yh)K^L8jJ^3`kS>>2lT<;Ue@x*%&(kZ!dcZ)31 zeG)w@Ui*94v=QI#(3YB? z1A5U@2ALD$HdLGN_^kis3Pk)YV2Z#M;QcpFIO#M`Sf6kdhj-=P1vd|)Z%(|>f9HJq z_jg4mXFHvyG3==K*S5gqpS`kRvWp@bX?NEbbkn+S%DSbu)P}~mk$;%6qHWNW5uEm_ zTuZQ5?UoIS7B4@)v!oYw25TR%=ZWBz8wI-DQQ?RAY~oyAer(lcFb|d19g11F!w$=4*i=Xx#>M_{tJz01WD86rJ9@2(K^ z{OzYFkOVff#UF!%%P0qII?AJtvgel_smK<%p7(-xbeNfYB=4?3?%=cc3r5r9`NrjX z*MVYraTB=8`$>(B#s$*t5Riylf*PAy6k~5Ll8OoHC*5*GZvFE@Sip8^;vmU8{fI8n zq7Ds|YvkOynK+aPshNe7myZ@#^iM(fVL|@V?B}{vI_y zTMWZ$r2y?k=%_FCzqxOD0fXC5fsy6!2)b(*Qjp^!YPd0^2nTvB*lBBgAV^Sk1wjDu zewYWs`L!({nc%r#gdD6D@KZpTB#+pBmI}IO*6vU=AZqZk9`zfCF#!vAD^)Q^lhs~Z zWY~_OQiU7#V8JNCfPNF3fYzJMnoZ2hHU~p}eKycsPS^Myt)3U`n6`*MKaJa$i{8R2 zNzGE-62ryDu+YXO7$_kUcn5$TwWIm4z>aYCntk$Z2)d8G68)YdoV*WYqpK)LDae-d z*WIQx?VvUAhyMh#a~6l8n?A`L12Z!Oj)Y+Kjl?mYQ>*Ks=zHpYf`nq`V8{U4#3Dn1 zNH*vseTN6}f2XklFM;n^_kTnPtKOlg>kwj2#T*$_scMAm-c0iRQW~MJ+_cy5#H1DL z>xC47+<0^`sF<#w_k`f;)QWL^niAFo?&tcF%{^qra(D)Ns)y|duXoXu;kqO%>MzjU zl;3VV6X-4jTHKf^C*)Yrb3z@GKQLC`0&35M zucH{hy{zl=wtANS(R7#u8RhV4GCEo}75b5*4(Na)80 zOd3CC54^Z^7e`T3@FO3ss+n)#KuXkYS{5}+on8gO5)+Gtq-AW;eyl+l+%z$jV;r

X!5)Lz$ItNBT@Kf7e30_`(yp{UA5%hfdS&#h$`xL#V%(2SUV5mlfP#MCw6}Ae zG`0#au@;0)gIiH!kdS;b%&Xn zofjE}&)|oNA`UK$WdEa@&%}Z`CY_Fb3Ga2j)V+&yA4d~izv@wHTAXb4RB-RPe?$2Y zVBn%kqy_aQ4BOFN2;Qhoo1$dH6X?H{uvQHPvD3L6A`ikd?J-9|g1m7GrZ@xTQ7fp=HYIn?=8oD7D~gxQv2p&=lllIB1S}EL z@&Jd(eSCbw(7a0Lm73XKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z002P}NklcerKOS>OM8*V^Uub8atlrx$6Y(MU7u#j-3{xdX9(F*vaaEf@l! zBqSsuknlhtko+JfV7kFL5Wu}xSw@mATfK~?_qj8-m(zAz@9&SjXXcI&{1hY^CE3rj zpL6fbz31$^zU%GZ_g$i@JfG{T%Y+x>5``bW9((&MsSZ}Dt}2y^QfZVBSEUzQ59b9# zK}j}RKildVU2oKB66s?}qL1}5nLgKboqdnG?wO~E>RQochwpFQkW@C0%kbck+gz#Z zm0sYsTaO_z1c<64nFtv|7sE7}|4=*ezWIR6myjY>Z9{)IA}T(2QB^QmH1319x!x)V0y6 zGsnC0K}zg7wA+=aQnP)(;^C>ZP&b8B4`IQHoOCjO$~6dj5NH240-|sNwCo@?l&T(80jo(Cgb@ugnqt&*W!H%-GLuxzep@!;#FUJ2 zJ5e_dGVU2R*^2D;OJ=^}%u$!gw6PKz>!z%iZ4|46i29<$D84Z|=#arUGRX|-%%^A5 z-t-FYiDg_Tc@cHhOCAu=1;AT{a!8;Fg9xEXsXIr@WDJrr=tV@v>5<6GPEyh(#Y`it zGicqRO^~vPI_tYpi)>Pr6#<9Qx>!m;s%Tps%c8pK9FeuutAR9Erj7aXFJ#%>Um|NS zerx{dmogxA#Oi5#u2#bmmDCz;J zC<&lqv?QViBdSPO9gC8&M5?O}+G=DDv@JeK{*h^KG?V(YE zb3!k07*f_5l~F-`Nu@@lgIEFrO14JFC3;E&^-vU05jCP%6)`weo%Rs=_yS6zPM0Ls zW%}CB9Bquui>GHZ&zy74tQbW5H^H|nR;pz0`!dS%S}XU$Yp|CNAnqA|UJ98a@d9qu zuo^g~O~Q)FSVtzqnrPkhXkhUq#JD~iBqi2Vt7^qlQ4v8SF@N@XVEKe!@F!4^JJIwufBc(6#YM2LbCi}e4uBcd<%Gk z=;udC{L?I4G05W$3t^^_b#kr54AQ0~7EkLy%BW>NR2K}KRKKYtz3e<=}t<})~rkr%_po0pQ! zut0cz?+HX@_|xCUJ@q90EMqQLiM4CGh%DpN#!5mUjusiCWDJSZiYOj}0R#nA zbtp(o*{tditBliUSRzWKIL)-{61oz(PL^t?yGmM#9h*jw%{B3S&ueZQ2^;U+YW(lM z#z?L5f2IwQixy+e7Y=&&=HI`%jJ$Chr4iT}^m)B)a~rE{ktGJ`VHrRGD~<{&L!=mS zTIC`j=T%~g12O{ogksgGM;n#p%xW)9q=(bUdBjtRlEd@Yz zc+`=_fm(TPb2aX@!c29|j{4sj5CJF;BGqMB$Zdy~fG)@+NCesq(0_I_c6W`Tfj(FI z5m(C+<1$CUVzCa@LdSUs;7dxC6iZgXBo|OtGCWBO+maxFs4s~M9jDU85oM}b3^t7j zZA8gSjl{kQN2+X+g!P$d&$F?(2ZiNn)Yuo^hW3ak-P6enFCE`1#hwp*+$Zd$1ztSpP&O;&Y?Wjt03z19Tk zK&|*I6m!9Kw#WtPPz1pf12}{pLJU+;71SW1h%`mOh#4z+V#I1mkusV3k~yo+IA=NS zS?l#@jeFvVxa>vpe4jrcL(g4Njb-r9hw!&YglU;COFuzqw>p~5>)2!~g7UD5{ zS#N6-B2#{xU1mGFNtS4^grQeRMg?dTuVo-W@Gg9vuayG?!D2~Ky1)`bnu8{Wl2{#3 zB@{qJOM+H$l*q6MsTx_$lye4I4lI>&sygM2K7QVhe#rsyZ=U-nUH%w${hWmLOe^sT zvMUEjy)AgPk{#%;WZ8iVopaj>H`JuOu4G19&TX~{m&qyNQYmjs`{GO^B`4= zuh+)W8PG;J2h0KGT#f{-0v4xYG6Hd0!r|dCxw9dCR1hP}9*hRKfz%T{U4zo9lI8L1 zOAL@-er`V&3cP!pXG-g}6n3)#+cPd~xKxa3C9zKUR!%o3b+KOdOiOID6{PEejBU2Z zW>#pih^1SA5w2PI${JwG7mWPHts4U?z&YSFuv`Q@F;-%#BwCRSLy9HAlH|WDK8_Gy zt$KnRvS`KPH=-ca!De5F&N*hCzVwW`Jco*n7FwjdPHd2A-Ops$I1`A~j7+D>YBmQI z@i$go+ho?Z>N-?W*=Q5pDjmjIq{Ir46bl}3F|79rU`j=pn-(7!7Lw5iR)M7gm`_s&w22WJ$r0OB!8Ix_;FuChLFYhbf#dnBMnyDQ1DOEX1Tt7i zloUYwK!%WD>1hsHosu!>u145--JY$r`qa?izK!Dx^MCM_I9ZHD`__?~mjEFD@;Pja zOkt`5C0t-5J7{BFFELYy3&k-YZ5=Za-A z;4#q0fvvzBLG}RSf;0q57JLCGaLge`9D3FvrxbkxvU@;Qz)S)=L8c13)Gbumav^bb zHDc0@p6$QdSZRz^tF^c7ntHS|KXdNS?^}t^7*u_E-pRq|4ag5Y2c2aAmm*Py@1?Y) zuM^T^gE(peCFy95l)#4W3JGYEf;b(Nj#lXwhBhlCBQ5T8px*=z0HYw^1H9Y777t8V zxKd?s70?hef$=04si`hu?2#lIXzYea;tiEACPw?D@Z`HwZ^cEq=dR85~j=`u{JHBo%J1oZL5 z=z#H^PfQ|ci9X?lK+Y9+oZA9DRj8&nfqbVAuPUMCI<7kiI*elobP&}hN(E8_aUYRY zBwa+7=MZlmDbFK!EhBeyk^5uZ?FYHMI7yS6`1a>&ciz8AfTMT17R;RhE|`jUEy%W0D0-dJdDF z!YrS}>M7*rS!DMr`o}T)euX0-w*cFKJ_hG1q8f^GEk9*I)npwPoE?zWg?})z&73?m zrL#Pu&!?*KEivi>ob94k&FQQe-GK8)aneL7qXdQ9Bo|#mKSNA{gb|XiV$ylM_%t>;g5Noa=Z;~% z>l`xBMt>_qzXTG3yd1&9f?7laqfs+VU9)9ul9gH?xa~EEkN)|YIGsIiF;-9qe-{qo z^9H2$+=_vmTtL%QV`ubyUBZwSX$)QCJ@ty$a83Cv0quZuAR7&OO@pMgj<~slXm}?{ zc`K=o-gs4~$Q+#svH*Ap*5g%*~;}2n(#MkwN-F*bhPZR7pj{K8(^!F3^cy3GN zmO@P$AVDNaHv0bRKNt?enT2%d&)#;|p_#jeGJflQu)G9W`u6}x=Q;k|fi~J*rsqm@ z5lIVgNiM9{+B8SBCMIy;dN~+wz#!X)iJP10PFzWUawk!916eSDb7B5_68|qmNargu zB}7NDwoKqRDR~2wqdKMC2a&g*MgBO#e5o+(d)H(EQbfFDgKaF|IavuGysBDW{LFGY zSzZ3Sf$=R33}=Cb4w0*w1!uCJMJ~$pnitVE?yUt)ay69(z}8{`lbu$*@zmahRi1K6Utf}dT&PNPK#s3y*3I16M%g|Zly$ePx($Dm zlsR`X^yqp*wtkAGsqHLJZD!RAIrPY*96oq}Ubjo&`&iE-O%u{IqtR@#b;o5)ZQO*l zUM?~Js}Jr%qF{nVI?!6h-?4;wxI@r}>SJdX;}5b(#zivnrR(%XC9ta z_nZ~_--CoG=wmCSPp`PsrMmg-NZss~1vf=<(MMb>CFj#qU0`*vK{B<8xrue0?6i5{ z{(I^7`)t{^jlrQovdodDxeiI9h;!3txbL33866#C_ugx%)*HC&Z(&G_T(W!ehfsRX z5SbywY@oSmn(UFo3@T)2K?cB#71er`7$mi!*p1&beD98)EG)cLe*O5Lx@UJPUK$lc zdAyCgZ=bG?Uf~W8mCPaIlh7p;xwsHgBxietLo)|N6XSFyCfUEb%-8nqV`OZM9hYCu zp~FY{{1?8AW+^JUO-j>@O0CNJ@iESxInDCY64%~vLk^0|E-5J)V?e;A8ChX>#0b`U zhzP2Ver9np2!rdewd0gmQv!wl8K?}SASo)bWL`E>@{JSUhDR6lJFlIy4<26^O*60d zr3gp}I@!eAngl zy#SkMZKwm?1teQ?o^7~>>1QKmHEM27y}B)Xt!h7R&83~y4}OTYNnQeg>;d`5f>{ZX zYd2GBtx)=lF1_tO;;R!irmI3y*i)nkKY9f=tH3E>e-a}zvv`9ozV_%-+yyZ=A zAaii~$bMFr78o3xq*`mDIMgXglovf-_S!e|?|$MqKlIc8k-60#_kR5$rso!^RV&Oc z9%Qg}jxF1^v18MAJTD+lGgenuIDPaWzxM|pU~*!N+i$snI7#`~SMFzByN@X(w*mMG zB(oaWp{!0n84LQ+2xownCGFl6YXO;eBf?9)7 za7FUu!j%@%krt(nGr)-`VJLI-=N2*6<89ye2Es~>TC+v9-ogt4I;%?nlqyx!De4?) z8WX#WSH0oQy#BLa;KN_Im&KJfN9Io z(Ca^UcFKze$isjJSl_3X#f)k|x8{=#hE%*hTePDaaF>35!7m^wO5ig<#~KDb!}Rn# zx88Ui8#ZmhFP90+Rs67o9|VZ8^!vHb?*}2yWoVWWM}54Y#9QC|dhUPVA+juE?~V<; z=X>A9&MSA}m#WOooTJ~57@nM>(HhS4bAzMY`R2EC?ajCGTmR*k_~4)X3AIL(d0@JD zu0GHLk`CyK1~MCOVs5ELM=eH{bfWyVr@GN{(kW7M^7jjf03;s9K&=!o)LwzH3PGjJ zHksqwrK5W#qJq0L33k^&bRd96cM=P#_I^mRXo3h7v#a9NM6lWRib|Pf-w?f z0A+b;k*!;|v1|KA+N*8e^PcZx+s-Q~SL>8(4T7+Qh_F0Ai)M~mYXD6gPL)b?h#&r! z|As7ydGGK1AyMIm&lb){6RQOaJzSOdbXCE}8@mldv;4&xUxylaxZ=Otvd@U{|!h2>R-1_#)(Z5!6hfiT9q z;4-V`Z=%i-_j`opDyNSf=H4%UhIQ*VlEpo?ZQjV>@G#AR0Xm%yqw6*jlqwi&F~$N) zzuU%GL#a~3Wf^G{fq1xQ>_s5`?5+r>~I^EsBC2peN9G z8S~4lgq13-!NCFyi=6ic)D@}V42r~J+-vi5|L))L-rxHG+jn0}YiNY2iBXo8m$~o$ z2N)b4V}9l=ei-H?-}4-N5qh0AaleN;hjSU-_6k|%xZ}2)v2u}7)G2J8Q0T9y_-3U1 z_=#5QBY&`v_M4O#q{N_HyoaR3u#~9cfhwx*lKVxoA-$V9?72>#0du4&8g*k?X zh6sazUKC%TcctgaDq3vq5pPB>+x#2vd$RrLy$4sRTfxX$Sr8PZ?HoN#c{ZBei)KSa z;fXqWonhtjm}S#por#!|godO9Ynwx44XYlO} zC4Va+rX)#%H3l(; zEKQ5_dWO0TcmB?DMRLuqE2x!%3*3lO=yT1k%kiynYHo??`6YbMTl0H)4C6F^kGLO^ z#0hDdlBH=5k}7HOZ2dL73ul4NwQsoVU;X|E=0`dwRy&lm!%biS@QqO z(0NgedM2yvobUyT=?;aq>7FIDSYsR?_D@Uf%_A}((&D++{AsH*-m069H9!^vaE z7@pXG^*pjHB~6o@S6zsjqPRF=U}%JmJFXy3Qr`9Lufe&DFF)`o?y-Hm^0ph9Q>_AAw;>hqxbFrxw?rvKAA!~(u zsT=Y2Z#>A=*WG{^gY|sUBt}GXxAnaGQ%7PfoA+FcW+@~49>*=raqqz+EFM3~z*RfA z_7!(hncBc|uScMTZ8CYRpqk;bj4Vw-6we4>`1}|6>O)Un@B}->bM^}r(@*dg4jl@w z?;NmyG^;kb3BGv-w|TJBUNU8JTJ8Dd;xmQ)Gk4$18{cpj>$Y5mh{0G(68EvzM~tAJPwFzv!w*pY#=YD) zdxo+F*J$z`KlUy%5z<}XJ4vp+9jyAE`xPLlyOWB4N=;93#%u;&gq$uzbsjT(gLr5~ln&VOg%>=D8%w&C4$4YFlBj7`Dt1hht>T!%P; z6NgCd{TwTQ^q-l#{ z;x$rcAy8sZ30;Ym5s#;9m+{CiRGI$ngJj2}Zv`*Q`|C86%)rQ%&>SXYg>`{rVrq)j znq@lli1aA;WlvI;m{-VZ&PX>|VIYg$*Zmt9Re${9&$4yPW?ufP*WmmTVhv7&Xm*6h0@R0*4VTfl=0@bP2kBk+O6tufyRN)~M-Ci^ z{B5%Ofv}J0EE}anA|6T!XFWCq6$Z6J{3CbpN$&<`|K+bC)dsxz&B&=3 z?)d{)%Lsn{ysTnp8^Du%hSB;fVedvt)-r5;CZ*3+3N;Ct(1ez;%xB}Ap-rX+aYeU4 zPxDObxdM=9vx3#oXyOs;47u_quX;+nH_M6>r0 z?tg;thMSNbyO7Qz+FXGCDlE;i__ezkddv5+?Xuli5pH|c>$&UoZ{X*D=~ub;;U}N9 zv~U(UQoIfV6?4Hg^zn<`y>=<#<<((+VsbjWD4-Hb|E-sk4C?Pa;mJPZ^J)BtyI!q)U0y?pRR=dA6F4 zC-B~1`A@w4o$q3GWtpY|WXva&eG!sI%>x%G1Hm^()OifyzH9LhZfKj+c)&n}RB z=2KLrPhhXU4qchYblP-2`XSElxR&8PH`A)t2uitan%Z^+SMIrvfAJGP!JmEN^E|Um za1MAHI0#Gtp#|&ZL~uDDT=fv?Q77UCvAl7U<=BsJ<={6m%;f= zM=o((Rtqp50oDU$0|O(1%<9DerAW|8#;`TKJob3-`s-PoG?ML`<}S=Tznj`Xpj%DE%?j6G7$GHOmQd#KsM42!b^U2J_E%(VaJ|q!BAmqW zXaUI5v)GS+{{8RfM}O*Pa?j3K!g3YQ4+$$Zs`VzdMw3RX&WZ2;A)b8SuXB}eVAB-+ z6Q?dR!X@w9={$Xu%IQT83~eX-{vT&_aF}wnhUW)}T$;S7w1)Zh_x(QYPM1IZ_~$O# z&O(wODXNEcgvz)_Wh_OX(42QsE}~rz5ueRL$epbL7KR2e)d93U&%8#k+RRV!w&Ik|Vc!0bw z^O@@EbuYVtU-*^(S~w1h7+VB$2J3nFK}cv5s?sM6COGzF zn2ML%yle%ImTIiL`(LnW{U)l_8lHD47#Gs}K)Er%Z~XS}a^y9y;ep4WzC=n60QUl| z3Q+ z^IN~H|n|w8Qs?S}aV8CQ{8}t@p00- z21&oSLN6old)x|)BW8pR-Uu(Vb#^6|$;?r1)@a>nDCV`e)y+38kZ3Dsb6~yfi?6?C6<2RpE9y% zFN2K%f^wy(81k&rvG%(5Wv}EXfA|M3&1x5_>we(=nV5so80V^2(thm~^!~|4W@kay zp=<(138`T;M4Y8juP{2+WaGLL!*72F-1V=({_M~G?DGO-bn-XttM-(Kv!r*cX!dPZ z^m!x1~-pP-anDeCpl~A3C+lk!Mj=Z+^us{QF<{CBjPW ze62RG5T0MO3!n(3ZDipIOkBd$n%MFvL4BB&UDwcm>IuyJ8KR*Qy|=%C*0opA9Na*u zHG%Jk&j2J(J6#0j(y3UxuiC{upZ_eU&dpwA%M{7RZZD-(t5KS|jEiF~F&Z z&fyQI-SQaw)No1zeDUxbbxMsEM_IAjk&;#uq+HPW#<-Npb5F5n}dTjqn0&hfP7b79u1szy2B|NYhf#AVmqbRm-rxa4^=U@=o>PA$+|j%ZFyp*n;a-+)`cQ$F{( zWxBnEqnoazCq82mFy`0UWgudw(XeeB%T)#`W}_0qvnng*aqI{mH1&B<2Mm0ni<7#evGMz zqDA{k&S=R?Q8`G$`t?(MY+qB%G~r8MK)~4?6?(UES@<0?vr?(r!j$#SK5bo7Rozw8 z7{u5@LFHiMT#<^%Z!rR52+L)>Eatk+P~(wDnGWZaTV8fMS6{xBho3%tk=OwYP;|V7@N_TXH~;*L>^m~e zyWjCvHfQS?-L{vZ@Q@eJ944H?8lO|m0pgWzKJVc92Zoj^!T_2R7c@nezbO*Dy@9qo z(gP(<9)eGP`V^mEh&W+jdlg<^g3}p1n&rXZ{F?g5>tFv`s*P5@Q~Rf3@gS5oLmb1g zk0bRb!1Lh9apc%%A?@cW*S&&{Y{m=@qvaTNEBO+o^T_)@iTwF~^tCUC?)rTEPiYD5 zEg*9bqn%UW)u1v7VF-SJ*r8lg+A2~W%tL-n5izuehPmricU%C(2Zn(?nzyw-WT5Qj zCn?`x4{_IUlP8zvA*j3%fEe+?l`wgQeEDgS z?1pi&p$5?rc;fR5-2M4E9?Xo?$qWmfwst8q%^ zlm{L;%3#%F&z>sf<|>Y?)$8MxDtt1vFNlQH`xu*P3hGc^7iV5KAo4|%>{c+@VDcskEUV@HnMm#~jc@XCQ z1oqFvKnmY$p?d>#HzD766ds?4g-_+5IrjT-%PZ0A-i}n(W8DblN}0X8ujGNppC%|; z6wXh2%KDMsbnW8t8?GI7_a5G`;gMsJ_tepo9G{uvzy9uiCZ>jX=XW;<>PxK7rtj|c z_`SsO%@+WW@s4T`r7`#oLvJzV;fIfK-%~xxo5tBTv4wgo>km~PGa1up$#fdO{yx&ru1d~%IgBcGuLD%(dFm#<#G_~p$TgM*u% zUbpLt%XYr~^mI1#;FAaWoe#`1v8lvsUss`8>6H!~Ony=W-toKvF>Ierld(4DEGoj; z*=3d@pDVB4&HPe5iTg+YXv^s{zh2$TV=L!ic${rBXF>g(*-#Rw74`JdW|i@Yaa`sw z@hY^^+*+D(=q33}r@&>MaV6FmtZ`yM!(AlieO`!S7|lV&Y8 ztlvN*u$1EL!jM!$?)r)_>?~88Hpch3p`-8D{l|Z~e{RE%e8=l{fB*EkcJ&hUJ z!(W3lXY%S`SfibV`8ex}mv7Jz*s^|t*1#YxNs#$N&`e+i)Zc>om0Z6KdN8^N_Pz{# z^DmX|y+w&OCrQ@Mp;4fxKwppF-0Z^;V%7!x%6wxcZG`_S?~Q zZ_ej;7fz8mVR&?eiNOKNMQy!&UUikgD^pfW z%LR<~6UNqUb;lmQ@7Rxj?CW2-X~U-F_pfhV8-M9DLwxX0687yk3uhNep0|Ybd*di3fT+}by zw4NXgNs|~(J`TYGG{BX{V00d{43q-0TYe6_NpLNQ5+r&Gk?CB42L@MOho%{_d=feF zHIVt-u9RnRaR*q!4isB?(IZQy(BTTKy9KlTJCMcqLI~!>ub{J^M!gy`*n$2Dq?eHm z?ts=cxcR54Rw|4Q4#3$t2DvykIB0@b$8&~?^{Cb?K|Dxl=vw;s-JL#h`Ie{O{fb*p z{5QL_3EiIQ`bNb|pucn>&B`^lOB4@Y12xp@J zrY-Tt5_2*@9EXJEG7PtK!@h283~PkUDXz60W41x1hn9z+v>jGPAPms-G{gxSub|#$ zy#B|bUeKinE+eb#M%6Jx|%Rt5>yP2ja|!tzzz zhdz$3w!060$E%|U2U;OP0GWFsyet9L6k`<6Bgyn)Vrq8j(&GIiJ#;!I+3InwJi%(R zpRiGd;W-#n7;aQSQ(W33x%!Qy?iD$uKpZ0DxT}8^(KARghqgOtKf?I~NNFc#@aw2) z5l{R)Sylq=L2Eninx8=y=CSdEWVJVuQYEXu3O2q06CEQC-;EBv8mA5yb-^!@UG^VH zS6_~|{9bJIP%)%SP;ZK~@g1bC?*PAk6l!3zK^{e0}1aGr~58@+un9#%b9OY}KNN#uo?i2gSRM9WqH^Y4o!yRW~ zeC$O6#9H|JL%9g9z3R)bu1Xv^7Ml~y%#U!nbcKPV%Ekm5u7hM<9F{ccV4Oo(MVLn9 zcuu^L(|P4YD$vVtaT%9ZaAqT_K16e14R`@qi)w_V4zdumou@Lz=PAwzWQHKfO` z#2q`1uC79_2cQ1*i^S~}^7iJ{XQ7RB3@lCHbb)qxh*^Ia=NzU!4jT`H*I&RSi)3m@ z;$?i_A-aH(b0BAOFytJfeR8FnAj>}53vh|zs!haN&QnVR>XkBX*D&cjZY2Ao4EOZD7ny7=KBPxs>k(M*KSOd>VDV8j-bz%pwCh{6 zA1_L!yjPeyqI8$eVw1D^q>6ZvyoF>QVFtCcVCE5)5c)Z}I_zP3iYzIt#%OaK^+HH< zvalN-!3_+95hU(omX|O~OL;G1qk(I+APm52E*YY^5uyg9>XQ-Rc>%4mA+mx@ju9Q*c42H3Cl0NZ z!8$~e{JaFuM@@j50C737%9uV#hGNm8S2*dnvATfQKgwjK&DbmQ3E5HwxeCaK`8z^H zLaLt6a43ki1Y={QGkZu!pCp@{C0U$CdoL&;nrEz+SK!khhkb`H9`406%ACCwY^hA3 z8NOdegH50Zl=`(o*6!fiM@dbKtQX({4_HP`8>Nqu6@AEA4oDbdMq<1(5zMtg=g7=J zo(xYNx-bWxB{df5_mR0-IDHyfT7tBXtAseMA~r@$44y&#GR`lf#zS0!*a)Nt;!w(D zDkwtMUnF3fQhJp7H3_A%;Fc7#2V@k*%jY;tKxjM$tz{iT-B?D#}ZsBwVo zL#N1!=~B-h5a0I+N+k{-5q|1l!`$58^0Q57Okw;I6;UcEHrNZm1)DU$vm zNjo4b)xlfEX%8nUDn;L_$c4^U8Hli>F--Sib`_Hh;Ix9Ok1o}bN)=bGK$;SqIgL4e z0<*k=lt9M@P}>39Lu?;>gO9j+rjG^TS=k-yO<}K+I z-2uG|LiA1;L@W|y$odp}b{Uz8uuDs1{VJJO(AogfXdu-p5=Yo$hwx6HK(YjBSCN$& z@Is8Yit&0#KyD+_N?ri73C2W-$#ABGs*q_JvQ_--5HBk8RZ+#uzBR7-$+fU_#KA$%rFWdb_7Q6YBoaW!gP5~Mz zjFho{g&NSn742*<1KkHk6rwhz>KW2bnWQbK=b<*nIfrv#L{MjQwIv=HhtwRhHO0*J zki{73bdk7SFK|YHIRBc@*k+^u3HTy@=T@ z@1mD|k<`5qHTBcoK1OoS@o#Hz%p6=(MrsX=l&ImTqgV`iTKzWA&w<^N;0H^D$vkN~ zfTM~^f=b@=r`F`Mt$7o^7$2;|3^`O1Yei2K@Uk%FoLrI8rVFJ@hq9CBF4wL6i1BD4CU|)fxm#w5_AE~%>`xDUbyqK zuMCEKen3g`8Qz%+AwrjcL;aY8BOVJcuaJEy%1_&PUe~69=h)a2!`4ZtHSzIjkWuCQ zkb?;1R?tJhLB*CL?C}{)w?kT0(t00LkI7mY(onQ%^46`Yhgctc2cg4`JDAE~Q87Km zc7$L>vE3!Sq=%PwpafZ%V9Y9hoM7Sz&+A~lK4LN?P+V%!)8OWntgB>+A&mo)?!#nB z4O8yoT{eqZALSF;E(b2>;;| z9r5uh7HJsFc!r!+Sk5q6gqJE_42A>~rfAi}lp=hyh?nJcdlST%YJ$ur@Z}7%FU2ip zNRWRXrF_?$1f*BO4;|)YoF}iU?xyHs8+S->B@Z)UV8FnzL*^YO$&hXgsY8rILWR1+lw-Ug|6W=d z(o5kp3G#536T)lx7+9$T+YG@C<1}|(i z>DqCt=7LTz2!RL^c*N5Nce3{a#UcOr-Om8X!0b6__i~~JnrAD9DsbIiuuxJM5<`h> zP3PoJfjc~?S0USg^sdGxTM_4jO^|vAS?@tw$DLZh?VBg-<@svuEACu^drXiagNzhG zTF)V>dGm^=dA+#iF!dN|rpSmQ`%?H!hOB@NfQ*1vz}3KeU77H$Q^?2;$abUgIy5OG zj6vl}XsyDI;}EyubOQSn9s;f`nnvK_Sy}Q7K6gI(eg#9@OUU$v0%ZM$zy5Di#r!)d z7x}vq)B_kF#RxP-m?FiyFivNa2VNO^O>|})?QMf-J>p7Oad}}S@bjaKJcGBcj;na+ z!{^944uX6!U0X5tWJp8MU4k?;ACBqrl#W&vsXG`@WGsV+6#0_NRpyrbX9#l@W#1Aa zZ)if|onoHdkTqrI{Kz@v56J$)$g9`U*?%~xh z1af)%+fIYr5W;Msek0IsjP~at?&s8RYmi_PLW@-DNOcqtr1W0Xk(@>+P@Kxf9#nMrhU7`jz7 zj=;_0Ts{m%y%;HHP_t;$N2&sGjH!Cqia|St>Z*ZGSL1T-qfUdNmcNWe3f(Y+W$-pZkId(gQCpAXWrlz;_uHETLQCRx`vkNM2#(oR53T;ts~> z@)AXQH_vj*+V+{84ydIRvy?(dU|f+}2F~T}&zeht)PXy*TDxMUmMUx&};$jCaslmS^?- ziz+K~EM*B#rzz87a>mo1n~^)-3QHe&aR3p(6QK-LGDl05ku;`N628Zl3A77t7C4mQ z_V;ne6=HM2@QHA7y4hM#tl}0O(vC4sVIYD`5f3B~pa=-GVs zxt?dVg&?(pyHf_|f%HG7dK=Ee9Y|4ujR;$P=5XEHU5i(f>iUlanfNO%R&kKJ#C{Q)I+6n~? z^6uF4fJhm%Q52Lsa0z6K8D_Qz(*`$_D3dYFEk()@KtFz$FM5vUB>1tV@u)~@3aXzpNC`` z($kOlI>rDJEb2^Mm=_`KHbb!%Oqi>RD2H^AXxtN;NQp7Yks{<-1(#U?(6O zGnksimId{S#UIRaHB~Nxz-rEJ)9T(^)+3#Yc^-9&`j-`H&nREnl~Rwv`V1qci|64x@@u&Es2F zeC-s`;-`W literal 0 Hc-jL100001 diff --git a/static/templates/template/images/shadow-h.png b/static/templates/template/images/shadow-h.png new file mode 100644 index 0000000000000000000000000000000000000000..361ba14a9654d6dadc3a60fc307e82bfa0a62f28 GIT binary patch literal 1325 zc-jFi1=9M7P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iXb^ z6&?ZVA?61F000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}000DtNkl;;#Oidw%tPmso zZ8ROY0>+_+DXzljiv8Y5aJ#|ljQ}&@Srr?AG(cQqY7`u)I-k$yt($;ZIlmY&UskZR zJPhk_gknC&_6RTvrmpq`bEh)QV-GX+z^nHF&+Wz4-lmq+8euEk)w!g#e5hhzZ=}Q4 z@$5@}FR$k6Z%;AK%=aPAm8}&E=oPGB1uIy=3RbX!6|7(dEBHpi{%Ej|{LUY3YM;Xb zCINc;im6I>6quXX2l(bTS0$59ZSMf!d+7H7@Bjcc06dajhkhTv_bvQie+G)x%%EZe z;Dez>kp8=#Oi3I1HS}gJI0iQYvPn!2`deQ5od1G7}jKm8qn*g!YmiqNKQw}zQLZ*c%vEO)X8 ztTi7qwM~4O-|`)sXl^N`@kEqoJD8_no1oIOcQp_CF*X>x!PFAKv&h7=G>5DAHbnVb z5;Z489)^A9aoWJtr;Sj@lywZ^SdvHKXhZI^CR=n&Wyj)ZBqr~O^A3_cJfF{-)6KfB zf07iXB~fO}2IQCpyiMF39zqyPvjvQVz5@?W1=l1ms#yHRJ)Sxw<^tOp=*YWM!H*#c zGeRoEoe%j2lG1*_zuSq(@~4&r_;g)oQCt(Xj(PQ!d>*~`bAUlez%2~#X|_BDPX(V? z@_m8v#n4g0mP7H0In|Y?uh-Uw#z zq$Oqn;CUg~F>tT?ohfgaa%nw-1%Ri8+akToLr-fjL^%cXD$HO2OTfIE#^<_W1887e z0^%FXYOrVP_R0o8drOv;#G&KM*@&Ikx_HMcFbAA4#&6ZMZOQ|jjwqFkXtrYlF3j9z4 zoOGW{Pxch7U7K= jrNB)oaQo%Jt_1iGEJIC_S0nJa00000NkvXXu0mjfNDN)2 literal 0 Hc-jL100001 diff --git a/static/templates/template/images/shadow-v.png b/static/templates/template/images/shadow-v.png new file mode 100644 index 0000000000000000000000000000000000000000..80dd357b8ae0f4751e25e13babaf442eac4ffe4c GIT binary patch literal 311 zc-rd>@N?(olHy`uVBq!ia0vp^HbAVx!3HF+Rz|h}DaPU;cPEB*=VV?2Ic!PZ?k)`f zL2$v|<&%LToCO|{#S9GG!XV7ZFl&wkP>{XE)7O>#CKs=$wWjJN!!JM~$r9Iy66gHf z+|;}h2Ir#G#FEq$h4Rdj39vd literal 0 Hc-jL100001 diff --git a/static/templates/template/images/sprite1.png b/static/templates/template/images/sprite1.png new file mode 100644 index 0000000000000000000000000000000000000000..237770641f8e89b2cdcae6c663cb7d74c8a23cfb GIT binary patch literal 6109 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 literal 0 Hc-jL100001 diff --git a/static/templates/template/style.css b/static/templates/template/style.css new file mode 100644 index 0000000..78acad9 --- /dev/null +++ b/static/templates/template/style.css @@ -0,0 +1,474 @@ +/* CSS-Style IPFire v3 */ + +/* Reset CSS-defaults */ +*, html, body, p, pre, span { + border: none; + margin: 0; + padding: 0; +} + +/* Set defaults */ +*, html, body, p, span { + font-family: verdana, arial, sans-serif; + font-size: 14px; + color: #333333; +} + +body { +} + +body, .topmenu, .sh-bl, .sh-btn, .sh-br, .sh-ul, .sh-top, .sh-ur, .sh-l, .sh-r { + background-color: #8a0400 !important; +} + +.main, .top-bgcolor { + /* Main BG-Color */ + background-color: #F5F5F5; +} + +/* CSS for Top-Menu and Main with shadows */ +.topmenu, .footer { + background:url(images/sprite1.png) repeat-x; +} + +.sh-bl, .sh-btn, .sh-br, .sh-ul, .sh-top, .sh-ur { + background: url(images/shadow-h.png) no-repeat; + height: 30px; +} + +.sh-l, .sh-r { + background: url(images/shadow-v.png) repeat-y; +} + +.topmenu, .topmenu-down { + background-position: 0 0; + color:#fff; + width:100%; + height:99px; + text-align: center; +} + +.wrapper { + margin:0 auto; + padding-left: 5px; + padding-right: 5px; + width: 1000px; + height: auto; +} + +.sh-ul { + background-position: left 0; +} + +.sh-top { + margin-right: 30px; + background-position: 0px -160px; + background-repeat:repeat-x; + height: 15px; +} + +.sh-ur { + margin-left: 30px; + background-position: right -80px; +} + +.top-bgcolor { + height: 15px; + margin-right: 15px; + margin-left: -15px; +} + +.sh-l { + background-position: left; +} + +.sh-r { + background-position: right; + margin-left: 15px; +} + +.main { + margin-right: 15px; + text-align: left; + padding-left: 1em; +} + +.footer, .sh-btn { + background-position: -10px -110px; + color:#fff; + height:36px; + text-align: center; +} + +.footer { + background-position: -10px -110px; + margin-right: 15px !important; + margin-right: 30px; + margin-left: -15px; +} + +.sh-btn { + margin-right: 30px; + background-position: 0 bottom !important; + background-position: 0 -205px; + background-repeat:repeat-x; + height: 15px; +} + +.sh-bl { + background-position: left -30px; + height: 50px; +} + +.sh-br { + margin-left: 30px !important; + background-position: right -110px; + height: 50px; +} + +.header_inner { + position: relative; + width: 980px; + height:102px; + margin: 0 auto; +} + +.logo { + position: absolute; + top: 0; + float: left; +} + +.topmenu h1 { + float: left; + margin-left: 105px; + color: #eee; + font-size: 1.8em; +} + +.topmenu h2 { + float: left; + margin-left: 105px; + color: #E5CCD0; + font-size: 1.0em; + vertical-align: bottom; +} + +/* Header Line's */ +.line1 { + height: 37px; +} + +.line2 { + height: 32px; + color: #CCC; +} + +.line3 { + height: 31px; +} + +/* Lang */ +.lang { + position: absolute; + right: 0em; + top: 0em; +} + +.lang img { + float: left; + border: none; + margin-right: 0.5em; + margin-bottom: 1.5em; + margin-top: 0.5em; + width: 30px; +} + +/* Menu */ + +.menu { + position: absolute; + left: 105px; + top: 0em; +} + +.menu li, .menu li a, .menu li a.active, .menu li a:hover { + background: url(images/sprite1.png) no-repeat; +} + +.menu ul { + list-style: none; +} + +.menu li { + font-size:16px; + float: left; +} + +.menu li { + vertical-align: middle; + background-position: 0 -470px; +} + +.menu li a { + margin-left: 1px; /*0.5em;*/ + margin-right: 1px; + display: block; + padding: 10px 5px 0 8px; + height: 26px; + background-position: 0 -430px; + background-repeat: repeat-x; + color: #ddd; + font-weight: bolder; + vertical-align: middle; + font-size: 0.8em; + text-decoration: none; +} + +.menu li a.active { + background-position: 0 -190px; + background-repeat: repeat-x; + color: #ddd; +} + +.menu li a:hover { + background-position: 0 -190px; + background-repeat: repeat-x; + color: #fff; +} + +img.symbol { + float: left; + margin-bottom: 0em; + border: 0; +} + +h1, h2, h3, h4 { + color: #8a0400; +} + +h1 { + font-size: 1.4em; +} + +div.container h1 { + font-size: 1.4em; + border-bottom: 1px solid #ddd; +} + +div.container h1 .help, div.container h1 .print { + margin: 2px; + height: 20px; + width: 20px; + float: right; + vertical-align: middle; + background-image: url(20x20-ic.png); + background-position: -53px -105px; +} + +div.container h1 .print { + background-position: -158px -158px; +} + +div.container h2 { + font-size: 1.1em; + margin-left: 3px; +} + +div.container h3 { + font-size: 1em; + margin-left: 6px; +} + +div.container h4 { + color: #666666; + font-size: 1em; + margin-left: 6px; +} + +div.container { + background-color: #f0f0f0; + border:1px solid #ddd; + padding: 0.25em; + margin-bottom: 15px; + margin-right: 1em; +} + +div.container p { + font-size: 14px; + margin-left: 12px; +} + +div.container fieldset { + border: 1px solid #999999; + margin-left: 12px; + margin-right: 5px; + padding: 5px; + padding-left: 12px; +} + +div.container fieldset legend { + color: #999999; +} + +input { + border: none; + padding: 1px; + overflow: visible; +} + +input[type="text"], input[type="submit"] { + border: 1px solid #ccc; +} + +input[type="text"]:hover, input[type="text"]:focus, input[type="submit"]:hover, input[type="submit"]:focus { + border: 1px solid #8a0400; +} + +input, label { + margin-bottom: 5px; + padding: 2px; + height: 16px; + vertical-align: middle; +} + +.w200px { + float: left; + width: 200px; +} + +div.container fieldset input[type="submit"] { + float: right; + margin-left: 5px; + padding-left: 22px; + font-weight: bold; + color: #000; + height: 22px; +} + +button { + border: 1px outset #ccc; + float: right; + margin-left: 5px; + padding-right: 2px; + height: 22px; +} + +button:hover { + border: 1px solid #C00; +} + +.bcancel, .byes, .bno { + background: url(20-x-ico.png) no-repeat; +} + +.bcancel { + background-position: 0 -40px; +} + +.byes { + background-position: 0 -20px; +} + +.bno { + background-position: 0 -0px; +} + +div.container .linecode, div.container .linecode ol, div.container .linecode ol li { + font-family:"Lucida Console", Monaco, monospace; + font-size: 14px; + line-height: 16px; +} + +div.container .linecode { + white-space: pre; + border: 1px solid #aaa; + background: #fafafa; + margin-top: 0.25em; + padding: 0.25em 0 0 4em; +} + +div.container .linecode ol { + white-space: nowrap; + padding-right: 0.25em; +} + +div.container .linecode ol li { + white-space: pre; +} + +.lbg1 { + background: #FAFAFA; +} + +.lbg2 { + background: #EEE; +} + +div.container .tblock { + display: block; + overflow: auto; +} + +div.container table .iptables { + border-collapse: inherit; +} + +div.container .iptables th, div.container .iptables td { + padding: 0 5px 0 5px; + border: 0px solid #aaa; + font-size: 12px; + white-space:nowrap; +} + +.lbg3 { + background: #CCC; +} + +.c-lo { + color: #F0F; +} + +.c-green { + color: #0C0; +} + +.c-orange { + color: #F90; +} + +.c-red { + color: #C00; +} + +.c-blue { + color: #33F; +} + +div.container .iptables .drop, div.container .iptables .accept, div.container .iptables .log, div.container .iptables .other { + padding-left: 15px; +} + +.drop, .accept, .log, .other { + background-image: url(images/icons.png); + background-repeat: no-repeat; + width: 15px; + height: 12px; + vertical-align: middle; +} + +.drop { + background-position: 0 -0px; +} + +.accept { + background-position: 0 -71px; +} + +.log { + background-position: 0 -58px; +} + +.other { + background-position: 0 -34px; +} diff --git a/templates/login.html b/templates/login.html new file mode 100644 index 0000000..a341946 --- /dev/null +++ b/templates/login.html @@ -0,0 +1,76 @@ + + + + + + + {{ _("Login") }} + + + +

+
+ +
+
+
+

{{ _("IPFire Webconsole") }}

+
+
+

{{ _("Please login") }}

+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+
+ {{ xsrf_form_html() }} + + + + + + + + + + + + +
{{ _("User") }}
{{ _("Password") }}
+ +
+
+
+
+
+
+ +
+
+ +
+
+
+
+
+ + diff --git a/templates/logout.html b/templates/logout.html new file mode 100644 index 0000000..d70689f --- /dev/null +++ b/templates/logout.html @@ -0,0 +1,60 @@ + + + + + + + {{ _("Logout") }} + + + +
+
+ +
+
+
+

{{ _("IPFire Webconsole") }}

+
+
+

{{ _("Logout") }}

+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+

{{ _("You have been sucessfully logged out.") }}

+
+

{{ _("Relogin" ) }}

+
+
+
+ +
+
+ +
+
+
+
+
+ + diff --git a/templates/template.html b/templates/template.html new file mode 100644 index 0000000..1d5c5a0 --- /dev/null +++ b/templates/template.html @@ -0,0 +1,80 @@ + + + + + + + {{ _("IPFire Webconsole") }} - {{ title }} + + + +
+
+ +
+ +
+ {{ _("Logged in as:") }} {{ user }} + + {{ _("Logout") }} +
+
+
+

{{ _("IPFire Webconsole") }}

+
+
+

{{ slogan }}

+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+ + diff --git a/webapp.py b/webapp.py new file mode 100644 index 0000000..ba72804 --- /dev/null +++ b/webapp.py @@ -0,0 +1,62 @@ +#!/usr/bin/python + +import os +import socket +import time + +import tornado.httpserver +import tornado.ioloop +import tornado.web + +BASEDIR = os.path.dirname(__file__) + +settings = { + "static_path" : os.path.join(BASEDIR, "static"), + "template_path" : os.path.join(BASEDIR, "templates"), + "login_url" : "/login", + "cookie_secret" : "123456789", + "xsrf_cookies" : True, +} + +class BaseHandler(tornado.web.RequestHandler): + def get_current_user(self): + return self.get_secure_cookie("user") + + def footer(self): + return "%s" % socket.gethostname() + + +class MainHandler(BaseHandler): + def get(self): + if not self.current_user: + self.redirect("/login") + return + + self.render("template.html", title="Testsite", slogan="Security now!", + footer=self.footer(), user=self.current_user) + + +class LoginHandler(BaseHandler): + def get(self): + self.render("login.html", footer=self.footer()) + + def post(self): + self.set_secure_cookie("user", self.get_argument("user")) + self.redirect("/") + +class LogoutHandler(BaseHandler): + def get(self): + self.clear_cookie("user") + self.render("logout.html", footer=self.footer()) + + +application = tornado.web.Application([ + (r"/", MainHandler), + (r"/login", LoginHandler), + (r"/logout", LogoutHandler), +], **settings) + +if __name__ == "__main__": + http_server = tornado.httpserver.HTTPServer(application) + http_server.listen(8080) + tornado.ioloop.IOLoop.instance().start() -- 2.47.3