From 5119d32714d3256440165a4e98c22798a7c1f9d4 Mon Sep 17 00:00:00 2001 From: jendib Date: Mon, 26 May 2014 22:22:13 +0200 Subject: [PATCH] Init login --- docs-android/app/app.iml | 3 + docs-android/app/build.gradle | 3 + .../app/libs/android-query.0.26.8.jar | Bin 0 -> 102762 bytes docs-android/app/src/main/AndroidManifest.xml | 20 +- .../com/sismics/docs/DocDetailActivity.java | 67 ------- .../com/sismics/docs/DocDetailFragment.java | 61 ------ .../com/sismics/docs/DocListActivity.java | 81 -------- .../com/sismics/docs/DocListFragment.java | 151 -------------- .../com/sismics/docs/MainApplication.java | 46 +++++ .../sismics/docs/activity/LoginActivity.java | 184 ++++++++++++++++++ .../sismics/docs/activity/MainActivity.java | 123 ++++++++++++ .../com/sismics/docs/dummy/DummyContent.java | 55 ------ .../docs/listener/CallbackListener.java | 10 + .../model/application/ApplicationContext.java | 99 ++++++++++ .../sismics/docs/resource/BaseResource.java | 137 +++++++++++++ .../sismics/docs/resource/UserResource.java | 55 ++++++ .../com/sismics/docs/ui/form/Validable.java | 42 ++++ .../com/sismics/docs/ui/form/Validator.java | 124 ++++++++++++ .../docs/ui/form/validator/Alphanumeric.java | 28 +++ .../sismics/docs/ui/form/validator/Email.java | 30 +++ .../docs/ui/form/validator/Length.java | 52 +++++ .../docs/ui/form/validator/Required.java | 24 +++ .../docs/ui/form/validator/ValidatorType.java | 25 +++ .../sismics/docs/util/ApplicationUtil.java | 43 ++++ .../com/sismics/docs/util/DialogUtil.java | 40 ++++ .../com/sismics/docs/util/PreferenceUtil.java | 162 +++++++++++++++ .../res/drawable-hdpi/drawer_shadow.9.png | Bin 0 -> 171 bytes .../src/main/res/drawable-hdpi/ic_drawer.png | Bin 0 -> 2842 bytes .../drawable-hdpi/list_background_holo.9.png | Bin 0 -> 970 bytes .../main/res/drawable-mdpi/ic_launcher.png | Bin 5237 -> 0 bytes .../res/drawable-xhdpi/drawer_shadow.9.png | Bin 0 -> 182 bytes .../src/main/res/drawable-xhdpi/ic_drawer.png | Bin 0 -> 1056 bytes .../drawable-xhdpi/list_background_holo.9.png | Bin 0 -> 969 bytes .../main/res/layout/activity_doc_detail.xml | 7 - .../src/main/res/layout/activity_doc_list.xml | 10 - .../main/res/layout/activity_doc_twopane.xml | 38 ---- .../main/res/layout/fragment_doc_detail.xml | 9 - .../src/main/res/layout/login_activity.xml | 117 +++++++++++ .../app/src/main/res/layout/main_activity.xml | 33 ++++ .../app/src/main/res/values-large/refs.xml | 10 - .../app/src/main/res/values-sw600dp/refs.xml | 10 - .../app/src/main/res/values/strings.xml | 24 ++- .../app/src/main/res/xml/preferences.xml | 3 + 43 files changed, 1418 insertions(+), 508 deletions(-) create mode 100644 docs-android/app/libs/android-query.0.26.8.jar delete mode 100644 docs-android/app/src/main/java/com/sismics/docs/DocDetailActivity.java delete mode 100644 docs-android/app/src/main/java/com/sismics/docs/DocDetailFragment.java delete mode 100644 docs-android/app/src/main/java/com/sismics/docs/DocListActivity.java delete mode 100644 docs-android/app/src/main/java/com/sismics/docs/DocListFragment.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/MainApplication.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/activity/LoginActivity.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/activity/MainActivity.java delete mode 100644 docs-android/app/src/main/java/com/sismics/docs/dummy/DummyContent.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/listener/CallbackListener.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/model/application/ApplicationContext.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/resource/BaseResource.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/resource/UserResource.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/ui/form/Validable.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/ui/form/Validator.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Alphanumeric.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Email.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Length.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Required.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/ValidatorType.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/util/ApplicationUtil.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/util/DialogUtil.java create mode 100644 docs-android/app/src/main/java/com/sismics/docs/util/PreferenceUtil.java create mode 100644 docs-android/app/src/main/res/drawable-hdpi/drawer_shadow.9.png create mode 100644 docs-android/app/src/main/res/drawable-hdpi/ic_drawer.png create mode 100644 docs-android/app/src/main/res/drawable-hdpi/list_background_holo.9.png delete mode 100644 docs-android/app/src/main/res/drawable-mdpi/ic_launcher.png create mode 100644 docs-android/app/src/main/res/drawable-xhdpi/drawer_shadow.9.png create mode 100644 docs-android/app/src/main/res/drawable-xhdpi/ic_drawer.png create mode 100644 docs-android/app/src/main/res/drawable-xhdpi/list_background_holo.9.png delete mode 100644 docs-android/app/src/main/res/layout/activity_doc_detail.xml delete mode 100644 docs-android/app/src/main/res/layout/activity_doc_list.xml delete mode 100644 docs-android/app/src/main/res/layout/activity_doc_twopane.xml delete mode 100644 docs-android/app/src/main/res/layout/fragment_doc_detail.xml create mode 100644 docs-android/app/src/main/res/layout/login_activity.xml create mode 100644 docs-android/app/src/main/res/layout/main_activity.xml delete mode 100644 docs-android/app/src/main/res/values-large/refs.xml delete mode 100644 docs-android/app/src/main/res/values-sw600dp/refs.xml create mode 100644 docs-android/app/src/main/res/xml/preferences.xml diff --git a/docs-android/app/app.iml b/docs-android/app/app.iml index 42f9493f..8e392ec5 100644 --- a/docs-android/app/app.iml +++ b/docs-android/app/app.iml @@ -70,7 +70,10 @@ + + + diff --git a/docs-android/app/build.gradle b/docs-android/app/build.gradle index d1e5d434..29fd4179 100644 --- a/docs-android/app/build.gradle +++ b/docs-android/app/build.gradle @@ -36,5 +36,8 @@ android { } dependencies { + compile fileTree(dir: 'libs', include: '*.jar') compile 'com.android.support:support-v4:19.1.0' + compile 'ch.acra:acra:4.5.0' + compile 'com.loopj.android:android-async-http:1.4.4' } diff --git a/docs-android/app/libs/android-query.0.26.8.jar b/docs-android/app/libs/android-query.0.26.8.jar new file mode 100644 index 0000000000000000000000000000000000000000..7fc26f17c8adf698794803621c6f0ffcbf21c792 GIT binary patch literal 102762 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�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

tdB9JL3J&d>Q%H3sS#AI2hdSB;au zwx4ceUw%_-v}GxLOdjXnGg_RBrl~;~aeLOfK8xnweyv^*>_ZGQPrp!Z$|(36-`l+s z^UF6;{sSMp#>(S3GdgMs;@x#4IuT8w_>(z3ad`L&2JN=|Jj6=K|-9NLJH2LV0cj*~ey1{h?6SYjg{JucPEC>I?XBfu3?w3(h(vt?7vw zP7Y->c}YH;CDd~JjA8j z?&_o3rl<}W$2e#P)DE7;24e(saQ8%65dEdD!y$HUqK9(xV zotZ__mz?EP3N=|yqnv2R!tt^c5DhkA)L6%o z>o}$|i(D&73t^qBX`w&*eu)L&Kj?&Px%=a5WYW5UD*5K917%eJ&>eZU!( zlg89@s~lCaBrmP3v`wp|P8oL^DG#xK#FnfM6Ls=FDxUmf+zF4BlAYSJZILZ_);sfX zSC#y7voV?XJ(wL9yNNg-Leka|f9o_){KKCVYCV9Q+a|hc7O8DK9YEj)ID^sNWN;-> zz$%>u1)xZA8Eolq?8}vQ88wn$iLv_Qi)CqS)|0Z!wf;ta&e(6QrE z;RUu-bN^X|$)RJ&75O*6Vbsnog7QZ|U%2fB6eagh`S}J?RQZj4`TdzD?3h6u;L%v2 z?_ua&ZVlLMhKo5JMC&M;pCIgsn5j7H>tJIQq2{`R?EKVTcJqLPo)J?=;@dRCO~de; zgb(>`TkGBCO^{S&W=U~pQsZh+$qVkdAt%$qnPk_#%(HciyKdK>)ouF8f~W$wUK+xO z?ZZV=uBLc|x6J{|U{hqtti0+P8gd8+Q`(yVl3gEfiF>KnyuaB9*bdn&j+DX zfP5DvfNAI*0rZ-i*EAHiPdd^X<)JdLC7Lh@$UYE9ntGu3q|0T(5@8hQY*S*!F{T?N z$=&z2*L9*&^`-%E4w)l_ej50-ya;(m*#03%qK0NX#oD}d%FHqr@Kw>`H<*)=JsitqVK-5-IQAJ)Kuqnq> zoji*yfy5cuLl}1HKb!t2Ak;3zv=LTqWI}T+nWt<#k_dEA*+d25UKRb^e}Dp}OV1V! z3u%e0CA=a~xoI9i4M1kza{|}@C0o^fos44||JGNG>iTethOhMf@NA9jjr|D@wcu zC8^jE5I8Hc23n=P=9(S_v0aqiO3kwEuEGN~#dO!$z#eTeOLT$>tmZxJc?%RLgkqxV z94&Cp408G881j8aIo}UiJi4e;Sx3L}k&e|D^9d}Y^HmtsnP7#QOX2lA?T z-O0^!$qX>LA-MWdC{e&ZGQJJ!E@Z6KAhI(c-2E6Loypk9G+$P3ORT$XqsuLbtY~pYqBGe0hV4t)L5N*FHEwW$Ol1tB1OL|5nEYfkN zI~ucG>vP%&Id!x(fnRbgEWb=cNza#zCY9!uNY~JnDHfGCG%O=JV5(Oka=(!TtoS%a z@x_FD^8|?sWM?Nj5?)frn^VMhG9;(V=Mc|Og!>K~{Nog(iVws~Vy1(7U4r!)r_{V= z5I`qlq_L*q$@jhpunN!WBwqvz5&uvWczbmEi`10lhHg-;pC|S&BWsx;GAI1gGza_T z$b|JT(JL0ZxA4^Q30V(KmZ44bx|WZSkK%(FdR>)-x=RIf2+ZWX{WhhfjJt|e2Bp@` zgx^NJY6sdLG4!otmsHj9Z^cnkyv~Y|x;m70Oh=EvPO9dknEE1LO&{Z6t1Xj>OyhPV zA1k;C+vX!+y^aIj%~M~gBW3*~{@61fnSQp2X4}HC{6r^KR?g<_{GSb8VrNRHcV&tw zqV_PNSHz&>uk=n|I0!1qr5NYo9_?()2p6qk*I1Xi#sEDg9=~l)Tq7HU@v_du+Q#8& z=G}(D`$t^@a5+AMYxk( z&8s+^Y|JAuoDBUdB@}-YEwy1X;l|9_0q-Gei?`Y*d1(2zRi#h;m$Zxvi5|di0`sAP z5+5V0Ce}dfjy!m_UEF36I>kFgP#{~*f{fGFIaxT&+lPedpJD1ZAMG4jgQPR#aH&p@ z%WG`O;16*T-mHGo@Mm(Z|LqMU-w`rb`fW3>M)J82M2l(h_!$O$Z>$et$#T>wNf%4$ zp!aPrGF!e!`19CHGV4)9Zf*(>g`p(GC-(z0%V_Kec2TFqY^8ViNiK~*$`{8GB|<|d z=}XH;Qmu=GE}mdUO&>Nf_4{V1Xq?#?qoOkALKvNpDjZ7vHlz;4 zZ(>uodh#E8z0+%Q>ryBc;}i2c1o=!+uIR-0jad;XUPsR@d{w=gwk~(N4*FK@m!~$(7X5Km9rXpUu&wH^Hpvw>lpWEK zH)H;i;SV{oI zw>{2b@|1#N191>Oxj%)r>4sI?HnMb%P(*BTWjqINkytbD!1`&x>MFL{x*C|shK}~p z+;pd&!+J`Gmtr~&Fv`ZYSH(ENCso9pWn6(x*gBrDq6D2$=Rz6M5tf~AUQN9G7Dj-Y zW*v2xZtI7fFV+%oZazhUM-)1@p;?)gq0=B~ML9_9C}oxEwpw1+i1TF;f*l(l*F`2X zNF?Hs>ZgJ-HbSJii5x5^+N@hEiabL(^@X&MSw?k9CAO!4+Ca+7UR9Cy>PDD~p*ptg{pfWuUVyW1%iW>)F zm8dDaY*{v6OGQ5BMm|$htFL~LWAR*$e}=&#-payt>?im=!cL8ABO4npo2*0PuDGYD zNCx8vh4s0&lz#(G3_HMuvU5ent@%|-JX2n9n4@bL5FuXC&9>(RoSxSHgB$WNME@pb z82N|K=&-Q8uSlD^{(0Z8&2juC|OUdX%TSInZiM6I4IFw0Q?E=mvR0L+rsrDaB0wuqe zCDt=dA#7bH&X1g@gXf_Z+;kSjGj47ETD@NlOPs-H`qi4=W=Gr||yC`I?XH?2nlkL;GSCPaW0U{+WtS zBbXtZM|hs^Db=5X*|TmNW{cK9$)W4jGhG_Fr6EvH(VgGg8UG(vY$`(8=~Vhmx<{}( z(Y5{|>9TS0mNzV07r@$a=sO*_D+oQ~WlH+k$ zPX{FJCM%~cF4Ouc`q)(tKykG&-0JqP9Ij`Q=Dw-PilN%VY{Z2Y$d9v!lIDk8rD8=M zlvMxq*F9f&F^@t(<(-;YIUJjjzuyZNiv+${%zJw>{pJ5o(*h)w^)ojH$~q~tr^Gqk z6wFO<%s-BBZ?ZurzXA(ex6A)f@nt6$uBL52*2naa-C@IC8*QxIx_tAY;E2A0S{?os z>2A4^CkN(U#0Ir79JgA@5oSaVCRn+tJBfaIOrl=r_h(QTH+CAcRH9TJde7VqyU>P| zGR44E1%uTQNIEkru3K1sJUBMtdj{cxt<1<86F7*)jKM@c3>>yFrn8bW&iYiDXUpbc z1vSLn4hOFePQ!&+ReVBINHL8U_)d+b1Q=RIPDoh-CVtU?!ts-{kcT5|;ZXm=H}3am zh~^wJ572=hr~s-)S(u1qmq11rqReuTdL@((qMpB*XdTW)d`!vE#_Z;qw1;J&gu6RD zX}!wkCR8!Zs$p01g?{~*ON${WV5aoNYSSht_&iZT5JHLaXi=;ftBS~gv%@|Stv0@X z(csB4!X6jV$tD2n_nY|E# zumzU(o3|LQoB*!7gT?_SmtxAaP^O8gXs#+8_X$a|rx$z{@6`jYu#t9!pLl|0V{B@a zc=NICbyP7ms8NHiJzM1upD5gD$qYxHXwl$=K7AM`arSVZh1M1CHo_S_PxiI^kI4(A zeD%Q4p67$#+i|D-&wYMA`MEtmPCmJOh?l$setsc3PC%bm7R7paT!-!7*9HF}z2WYh zVlAz$JaZ*=$kKSF`baI@J9ZA1(Z7FCo#)heZ2mTUa;^~*Rx~4h<|*E>Qn>kau=NL) zNl~A&{e~dhU!3@p*700E)cCKSl`nNHARu+ISeC6}OP_Oo{%m?R0wZKOAw8N>+ zcc(`ef~2!^Z;iZK_%)qVwmlpyMv5g$s$1OCvpm7%V zBKUu<74vR||0a#|`G(WyPl3k}D60KH&6rd)CELXab47WO2U7h@JG+jD>WgEyeNJuVa-c7THj19N{Xnd?GzG*LVL zxrNkEH}=C3{7x*0VA&NaAZib#OK-j8kOgu1=m!47#q1;%r-@o4=d_-4?AVeaV@op`*rF~;mM@NTpeR$YtqZ~H60S|zn| zBMx*R40Iq4cp?#uT?0rqLrX$!1~G8Q;hY&3zaM0coXnP*nbIRMXUrBmfD(h+`fF{t zB8Y@o?DPe$_6gf?wf>Qohcc{Zh6J(NaJ5I^b}RS;?rN?oC%BmCZ13;^m(vHAW3$kg zZ42&7IK)+8FZThbI|8?DzTjWzgz<@X{iJT3dR?}9amu&4l_R}vwIKP?rf|K<& zcfocpS<-vqx9ek0Ib-ARJ;>tjxd#~PsJYwss*kA|)iY@O6FB}xoz(tw?%$Y2x9NXY zQ>&Wcgg)Ck?2ow%xX=R30P7~s`viA9zsg8aBLf7AoRjim@DI=^6Y&UobS`r3>y{4OUq>(roi&I2Mk- zzpzFrtMohJ)0p@RMx3iOF}}o!YaYa{5Bp5il_dXPGd+hfeP@z&k@Vl92`)$VQ zqGZlCu``lv$IKkZjoDG0R?D;3-_D;w6|}%uW}8DdI2oY z4nX0|oruh{9}W^(fO>^^k|ck{`d4?{jC?Ccy3sxuZ@E~~xEY{AQ%=B*slD{dKBK^u zsS^eHA3&9p)~4nXH&m~16hX7Mu9ELz~|-BNji;qdrJlJ$36D52Um%J zbtv!?2;gqz(e?4YEY9b^PWCVrBqhDKd5?K;@S91f2?fK-4&a}^7roN#(K;j7MG7~EZwC3!)#@C21`VVHjJJn2Po{G8W|gXkj~(ouVXrW_w(ZM zy=Ipnocu5K+4_fk&$Dz@LcR;5vF7U>U4XoLz>iCU9sHE~-AFV(M5|t`4gHd{*f-$! z6+ub8d2p2ef{+4m04BI(=`8-~BpMKOlMHKX#vB;!?u==<;`U(!Wd9m+?E>*W*51lo z>8%aW`GX{qY$6H$qm=sC_dDLR7c7!flSh0GA51m6{OjXS%+X2UagrwXPU z?_l+B#j^TLA#SHQ0=4up_)*0UzCe7qWDd1lp__#61rP< zw(@=Ne0d&GFQx2GD<5a^4R(ydM(TyatK6R0>K^9$bpsVQtoS>cd1`}ocE(+HCpP^= z9y~6(jJ37aa4&UX`zS^&*b~(PceNDoY6XWk!F;-L8(yE{2JHN_eTbv>xRE-;{^H3V z@MH~J1dckV2PXbj$ihg|u>ZRp3u?npWq1)5zyazRyKaInBqw48UQEBFL&nNVPkqd0 zj0NeLBS{O~vj5uDZQ04mGi(E=x`_)8FE%FqqJ&nne{S907Fo2@f+yPKmdx*4ruew} z>;z_znNXVHnfC$KT(kXiopP_g?T6M}o6K7`f&9{^zYpO`OzI2l{nkZ+-JuV%6OFPJ z*l^bYBF#4k{Flg69o*Pw)HJrK@empLbP3q_oF*}B8Qj-KWY;B#Su95!67dZSX+VhV zJwf?L@X_d6l+CS5{uo!ksKfPRt&hUf0lVlpoaeDWr+bCcOBNliL1+jH)?prE$x(9^ z`gKs34jzN{GMVCIW8kt)=pV8NS_U9;8+@3QlDo`v%+BDaKvnqbQkcei!E6Gi`QmeD zUNDLr@2sDY#(VsEOm0wOcl>>B-!L-!GeU^Ia8j=ibpbs9m2Z*qLwW%WKh%r2YIEv6 zV5N8Ldqm%8Sm(c@*57QK!#ly;ub%e!KLDDq;~`fH|Z!@#ZY|>L49HniKtNcnN-%QRP(DsbCKBuOskghW3p)8>W!xp zvZ!CH8brO*s9$Suh6o)J#`V>P7#*@OX52#%F1Z+E*XV_-!bG9GbOD!sqegNOK+gpj z6Wb^UtNcUpm)?I-KIEg!aw8xw9T`O<&mT_X@)?FiP;az{M!FZJVlJ4(@1BfrEKMlp zdT~LC-J#Bth%hF+SNjF_9xY7F_a_hcHk7?Q5i{gZuHcfCJ*)(vsW#%d9^WZcLwxk; zng!H?v!iI|-Qa1sCsb;{I^gczfbu>pk@yQdTf)zoV0Oq6;PZY z=7c`v#MoN%alJL^+uR4Z7&yvegHCsc0tOM>7~Ru|kc|i*$F3r$KbN;@TAjSVrBUF! zP6~7ncxN#%jFbPt44OeB(qJKV)u(?b5>((DnkjvIi=xOyg)Ty-iB|^+QHS9jL>fhz z(63X6D-_|BL8C?rI4{S`P-1PrHonqV1N^Z zcY$D<6ht2KkGvP<5DXrlNj*mq z7r+(xNj~45G$8ektd=~PAgB=N?wq}SaF|bI(#P>Dyd$lUJNInLtzA5l^%QOygP+}1 z@G(rvZOV!YDP#>dJZyaQmsY@h7WFT_Fh-e@=9RNRlVuD`6bO@&KvtPms|vJMfORK= zF&Y|^n9`&`e6r741vn~z>?Z=k7Gch!W9t_+gx02$^{*T}%h->6L^@ZE-PihuMW|_e zlzd%qpgNP-E>#J%{#J+fU4ePQ!J#=50GQfwP8h$|Og1?}5f_?A&$K}}I=nL=4;C>P zXhyG#M_2At8lH5KML)X+w&?k649(=w2x8`VR+s}Y^ z7q#XfE8Z8N%8w^39)U?jikhGEy8X;gM?2tsmuV5aM*<;kFiICD0cIwB=9gAv_N_g_ z4yO|Wt`h>i<>|r00wcJfjx7wrlYXl^V%#%fS8qFlL13OQX z1~;ISC1x<`fyI>{F2qmhKc?tciWi_zR^flQ@P?_YJ1ZHF6P|G{1Ecu)dE(=vOWo6Z zC$;eSF!b6O2k0B+DE1^MR>VJlg0w57wrr8UC)UJwZ`z5lvq(4kG(GVR_;$1R>@rA#|f!>$G7Y8xFJfhZyg}9VcNN?%R-pp&EEaX@3P6 z>}nIqnF~J+VC|Fm#W-0aIAm>(dUhsqVVdtt_vJ6*w7o)EcwsD%oI{Km)EzL$Kw(m$ zhNXaqCkCDD15i2|bAaA(os4A+vt55RT!eJj?W0IM3#i_ae;OlYqB8|>gXF(0upgrZ zE8Ei8aR|N<{_@RwXsts&@Qnsq$b-wuOj<(f1KaoK-ZiMvw-V2|fLe2->{an~ATv>Z zxq&A?x1(Y9rh8S~f4X3-hQN9tV7qPh`mxcLG&bs}lg}RGufcmc06fM4$9D(j#p1w- zkLJhG$NCi-v&ke3~_m&ECs$l+ud!ftd|Ri$Fybn^~#CtMiLN^4-jyoHXPM6 zNKKzEU$dz}8o$O3oO#~U857#G6+bz$sLNGXv#|Gw5}p=bA#FIY0WpDpI@tE-eR098 z*Is#j{2guKO?{D4>uq$9wBd_MNvErU`gayk@IC$6>0;ZV4WW$(PU(O+Z$N1*^=M_{ z9w2Y*4wH72VRdgL-i&-!)oco*qxKl)LF8BK*7y${QnXPwz~Q&Jv;PP4=q6r_hU8h; z>|yUnkoLX}j@xG!!s`tXLcY)ETYV$*wK+Q=p;CU5nm|WY$X5fjtpRIz zjA1gK6_Q46-!Ks@k(-7unPk_m;sRlkPLL!A=PIiIII z*!O7i-FnIej`0Mh7e{+xhGi={iUu zm*wn09cx3bQWr(p=pM!Q*)q+vWfo|eBY<58Mg(UkYVEf-;76bdXo+tr8a2n#F`ce$R=(Xpg;OoC#(zJGI~Ksj97H^PK)N zyR7Cw(Au*RNkk!r?6)w2x{2UH6U_QrkdW}5xb_LSL7_B7hUcf;KDh%~h$Ed4!NiDz z4_s|{81NZbr0|vqegE$YZD8~l(At2o3HNoEfRAdFa_}S(5sH3zfn$j0uIFgLS#|qr zODC#$PuTPkOK`&rR(}6t?gdA1gDbM_2_!a3PAL8jNPCKJ5a5MHd(z0D#s?pH2wkV$ z9rpQ(bbl}*PpJ1NjGsyeib9=~?DVk(k~}Y=WGKk%F_8TH)#z7A%}NBQmTPKBdM6LA5VqHY1lqGa(wq$`6ot9V(x(A8)(u*t$gnfH1;8T z9U}18!jbDO^Bb>ro*Pg+y;JxmxReedY`=u-kZC!29QGCh+gyWon!q8A{7#>Y6pp-Q zojCU2!9Ar=gHfJ8GOk0%Y%7>Kl`laeLolvdVHDvFfUi6=Z8Y|5zDfI6e+N^6%ROwX zu93VlPnJh*S|&s>8H6(|_vRL{7Y65~FL zgri4>qBPP3s+N3|!`GC&$SyAy2=?T!L+52>X}M~;<~$sN;gDs7rQlIAoVI{ii3r^V zLvi3sf8x@y8HQT@C`ULqxMqEJp%2TPzWQg(IF9&JX_QPWGU52+uwSexx*#gh)v0hl z$73;`Lx7SYk(Ke&%HR8imf&Rv@0~3L`aeT-qG-$P*^OTf($&c+z8HbXBI;E8K^Zia z4b#u2YL#+je>zLui^WaOq!qDpfl2K zodJBH0x6^5m@hIFI8=d>QVv=tMjMp4L{z2}X^^N1R9aSS->eCSUU_7n&V^T_kPL~k zb8PWksr|A6o@({HC@D165H7v5VTe89RGnW_R}%P!8@1T~uA0}o7%gu#2vb4u7tXu4O}N z319IPKA}w>=cXOPe{26fQ2!>RLiKKfci+Ja<{DY+%veHe2^CP7mH5O~Y~4;0gPou` z((0h_F$m>75bv7e$aZ#B4aHz2HteEB5Nn%^*b$`gh1r(c#}gLs%O>_Z52FaO{pj54d5R6Lhu$Jr39* zZ=b_)#f$h&7Xv=ytdzD}Os|z>~ ztIKk(A^KE>>}R5S|<73)xCy1D^=~#!zH(b-9S%$dhas?dMh$e$gDw%`X_la z1@{d!i07l$J&)0hUQJ5UK1-!m+NMwMNz5CMN23cyX2Z^?sg!1FignWlnI zMm1_3h6yqG*K$>2*S@>2@ud$Ka0gGn&(Uvf)w=_tCKm>}OPHsIBlDO(fl)oQ#7)`} z1NT6$o#&pSe?yB^z8Dm|BfzeT+XuX3P%V<%lkw@5@rCM@|MYL2Te%6~28hqqe+2@1 zc*xF@OXS{{oKV_%%}CB6Xk>V+dc7V1C#Yz*2ge8*J0eR zS~&1f^-J^4d5mWcmp-yUwS0rrev4GeVbvskUeA@h4ukx~@O*BoJlN;GZ_n#_j^YH(5xq7hEKF932A3HDFh?47mGn zWby({ZXx$y&ZI`qeL zd88_wpryTk7BVsuYOBHYO-5&McqqJI3C6%FKAyYUvSBAS|Jh1|?^lON7sE8hj3gLQ zhf#_mmA9q|b}-^p#u^#WEW|mFLPky*XLkc?6Z}StnS*H(#1AI--|W3{LBG8?q-(<# zp9nZ}i0y<|$O$O^0X3|0Krud{v#n<%d38?rn{%wEe95@y>N5R4ThY%PEv0Qh<;p@z z`B=|JVxx*5Lw0?jYSY7?J9%{N;gSstt_tl0AX=xwr%38J>IOcY9rHGpF1YX8syhY{ zgY|ji*uF{x2a(zU=;Vb+?=Ya{YI_`~&t0s=!R3mk`#8im9LGAbbnCTGVqHY7*z{9v z1}t{wLpy6$7Op%>b?O<&?q+HNN|Eb$PZRUxGH6n_E1|A5Buc~fiOA^#C8#k~$(u=9&oe&^aM)H>_TOJLtf+8s!T0PK1Vwd#1D zaFrkY(Fl7!)^mH{!y;Os=O>tWKLHs@l|Oa#YC>=m%7o^hF*#1+OfNBcjf#>J$pYx%Nr8)rt2F$Ca>_Jc{YJ&D| zaUj(jYnsp{zdBG0j05Q5D1O)<11vRnl=XY0ivbs zV^Awl8yMHEhni&eY^z`d&FtErr=O=5iKP}+j6D8QDS71oh^Dey5CO$(l=dXJ{ntM7 zejd`B`D0$DjPl5zkM?}EpRfLo>=7F59fXPb19ZN8!Vs%cjo`sR1wn-w+M63teBPpo zrL%&QQq3mRM`ArYP5}erk&wuEUT!!4HBfJAswq2`W0`ml*emwrm4_NjevIi z1f|{H{t4UT-xxk8f;0* zJ^1j3(F|IP{HBcZ$~_3fNL=!?Y9b#VfDdL;6{=ha#;V5)!+@nsCQfa%uN%YkdlI_>8f-Izc0ipgW01q~kcuuFO1CChqkaDv%mfR5d< ziaKoT5?vpUMW7gRlicNp#b%4q@{feDy{+TVus(Uo#mTl5GEPdPF>z0Ub z);T4|w7vH<-0`V+p!aEd;O&!n2iP<4n)WmN%D!XdHIC21cMyxAcS{~k|F#qLbKeqe z_i8r$tNe49z1y_4mQ>JV5l(0tG0NyoG$VtmB%_6r*)>SRtTV~XERueP9(nie*2zD2 zNnJ7JQ?LvZ_UBljer2&Va@8C|CWGBnMTEsvrEYTVOUN|_y=IWk#)3q-(CSI93-AKq zhuy2}M)!ce5_v8IyDBWV;wo;;^j7SjRP`{xwX$vzts+zhM!+SDGt#R%^@nb$fwwjP z2imX^efg#2bNsfeeq-wDg~t*}bXUJ_Ft^23##bP3>6Y}m*86W@{MqoPzElNtyVwY# zN1|FGIj--+07fmC_v4MjRVytw7i6a#L9+`+7aqUzUs!SO4$Q|A7fv;M53HujKPX|c z9^mJ5-S^uW{rvBKF+GC;H)p2h3-p$>4AYt+;~N1qo3%Kz$7|_O_NEm|dS~{OF=m`l zr&9x`a+MD?27-U&|B9n60%tQJO})Uy)9;Oxs&AYzJUDf2g@CW7e9n~xkfZ6Bq}CmZ zRL}nuE)W)8fK7+69~XI#;g;AGyDES=0=@c5DJ_io+G*%FG%9riJ}@jM&fFq%0ag8_ z+*gv;5!ywF>ZP1AI19C~x%It?kC}hW<9rQAfdVLnFBZN$;F0k>{n~=9_)z8rmJ;0; z-sW2x%-g~gW5$MY1Sv`hKqvjaH*1>5tEiRmF3$)q0D z(`L?mKk9}7e>KlwG9W<@$P4O0BxV$sJwk+YfKVAeyO9O*HCbqo=MH0>sYEzJ69VK2 z7R7ER6wirWlHsV|&WUcC4$boHh=ag;X=YWwpe5c!aSltiFWa?|GEVhq>hOz#+NK=! z7v$2hacVdN*(grVB=TlJI-_9i7EU>ZamBPA^l?#Z)3pt+aNI&gclK{wpD&=xs7(cV z*f)rcIh+(_7}Sn(qx+LKhKNT;yop*ws9zEJ^sb0Aj97n&;BDOotSr}|g%5oyv*2B~ zbVq-7_$S}^R9k8tqKYox2>zVO$>aeHRJpRfb88smK_n_jt?-@$G9A`A9Wwy%SQEn_ zgfXB-a&I?xndwh&xiL`fB z;k;tCJ)vE*(2X-j206V;>ubCn672A8>7Ro07n=n9wHo)hOGklo8* zPhyD=@()G&yN#!Sy1S=<6&Hz-iR_KO)E@}; zmN~X@9`0`YP*PCWmafPAj6 zwAKdI3goDIP2{bk?fRrYm*M9~+YX;i17))$#n2}3Udw0w1ICwKP-TrXFZTyA$Fid_ z6CJZPPrW17J(k6n919ViJ)Jc?Euvd`=5;~~;WZ=gOFr#|Fzp_BUM(K>JszD|QU&LJ zj_wVjU-_cEDq#*u`N+g66qy5fPsdMsZT}%5oPaM0Kumu zja(J84MvyGCEwm!Js)NQ?@J#FPlP)Bca?I5=Z;*+ipOdk*C(>~g{?Y7pu*pm>dV;Y zP_#~jG})5%hUqBhq$%4z8YjY4exh?FML}Ulk6vGZ>$xGC$w1>j*J?W{3sbJN5?INp zamFtS+ruZMYf3;7?=DK`lo^$pu(GUKoqq)0V2Lf&PkS-S9~Xc>SUu+DhJ#SrjnUrK z4XC!BsGBqlG)*Hi!zAXy!>q?yK!Dj)PIn5JvXg|digD(h#`9A@91xC36)B5k{|cWg z3o#`NoonMNmdZ;+$3JXuHupJEfi75Jm@r2bBR^wy2Yj=q>FHnI;VDa&_$p z`95$bE!+^I<6bB>T}sn}RnkBvrvzwD_<>CXEzsb9PB!czRf209JOx=*>DmV-1GZ@S zteQN9fLHO|rY)gwH@x?$sp<_^`A;^1F>YW@zN-tb5m;ehTSV(0R4ZI^P>(L}IR~<4 z*wjOpH5>MpW<&@lY4>KG< zKmoXA#M9msDieZj3`8Re+^3Zf$V2OV2y(&vTm3sLUg?M8!l_*?Jcja2-6|8Bz}E~* zw@he8wE@V#g5O)eMr+>;N59ZiF$)zuq74Gxp5MFWLtb$6N9us!ktb>{|A>yB!wULb zRLR?F{6gjlV14CraUjX!swqU3R0Ac}X>Nk>u_7N1xKA){U4wSL8yTA6WUhHjw$eQm z@+k#>w1Kkdtn%I2UWooLd)ed51bMu#bSca_7+Z1qz2;(l(}0zD$L=r}9*q^~>ax^m zlPc+}DP&*tM;Bq|LJrwT`Pl5;zf+RQ@apl8)5PER7@wIJqBY}%2h#55ip_n!ouO+w z&;f043PvQ^u+ydR02qDQ@>OWVN1#KqA_C1Oh5JJf+ItkUZ>zktH9(}4_L zUb3%xss!1M>9lesc7Uz9%ooikag2lgYM#rOi^DVm`9op* zM;bC4&4`dodcnbn%^7fMELLMdC|z7HSTjdl>*6$`8JxateRoa``cq7!Q~zV{i{nao zzn~obw8~0>q&C$0Ld;fs^xpvtN_d ztelk9P`AmM6EkJ#YKuT1?4$-JNf_?U1tFRSNaBNd)+HrillG?$$=VpwAziNl6q>44 zt5mEMsz5I%#LH7G%V2A%mfy{*mtP!cecuM~zn^NYoKbtcucwTeUSh~1MW+w0zpm_V zyr;L#wm)u}6Rfk&{B7R1RU#Pn@EthAa|}dTIivmhT$Hs zGq>9a%mwX;mX{XRvrn_O`QWL?CiCC|3O(2=VU1L`82|K)FhxJ!(g~uL@R_I0qyFTX zS_F*4T@87SN(h>CR~s4^RI3Yb+F=&1>Y3l1&=8~AEYo}!q`k+Ln~5WY1=^FOGd;2h z6yjn!a#TcHj3M%J8EP0Q7&+0P{^J+Vd?KVxZFn}|r*lo4)1O|XAx;ES!9k~>D zvXN(R3`oIsIJ->TAwZQVVbWNw84D$y#{LE9{c%r>XRG23@XEKxcN<3hA$T+IkkYcy zB87Y}laem$3?R^6?#gv_sccG0p>(1*NZFs_xVw1Az-P+1o^60|J#hVr%^ z{(Ffzqxn0{CMb?p>R1N3?^3jeD_VJcR7&>h_n=k`JO69W71gwzjEy@xrF%RxLLBJ0 zQ<@G|oBgMUwSWByx3P`bzLIV6n9l?!+P;jIM=LIy5I$;+vM~}|*|Nxl$5XzTOOvdO znx(^$0h}0IWnCf@w53Y0wxih=f}->lFzi@oJSU$g1>v@0{Ekn(XDaZSxYFqgD7w9ywc*d_-TRE$tg@lGi?w- zv?;-vw3)0!EMrK>tY3WcVZE%)WO;}n=G-Ks@C+LFnt^e;nn^5UmKYhPeWi5X*pZoH zfvC-_j;9OgnTdyJzH|VZT;(uxIm$htS|gQrZZ|CR`)L~MbR6m<6%?P5O+!7KX?0Y& z+MLxRaj;L=%9J%#t`xG9XdKj!A=-4mz;pocQ;u`%D{PZ=K0dVO$^E2k&Xq>&)R}XJ z@)@ZM0f9z9Ha8I+@5$w5=J{-NV_2n9AxECwyd3KLm~uf_(m1co;*FuM`;vFyArCejGVe!`Bb)u;~%=N(pfvxXSeX;dAl>$ z)s@(jCgo-uj%bJ>R-a^==Y5B`KR>#~{0uxhuy0I5kaAXDO2PiS>uMw2E6^p8b7W$| z3w_1Co+!~tK*}-6{k7^9z3mP9xP$E#`qhTKwfemH7oeaQ!Rqu>>S{(hN_E}97ek;I znx7*FlGAs_2}aq>1^eTOCQ31G^kayyN-^dp4kG;V2VmgjhgAbH+Jl(bS@m;$;-#s? z8EH6k(hSRi*my3lp6se42&DduIBjAtB4~3RiA}_cU5*JEM0WEz-&RgLBtt~sk`dxH zN)sekJw*9jcdp4!^_icGK?v7k>W21ZppRODcRuI+YD-|Di(j9WKq2_{FuB17va`!; zSTQta;bIUnN@e17;Yg$uj|4znw{Lz$4a00F@_TDY>EtTv1m1^_%;LDHt?VzZuGd$GvMS3ubS>Wm>7 z_%J4|%h}Zvp{+6WiAj4?q!{>R8_Cskp=m(t=8*KA;a0^&mVv8wKwWV3O@GZ_V45@F z-2I2N^~nKT8bC1gq`Yy)`0JwF4qU_iLS=|D0|N8Sn)s0B`v2y6UCLA9f z`$1nm0B|b-MOncHidxJ<%eeaULe|kI0~`bloX|u88wWZIX4I}Lc2CB$oA>ZZ5_@&T zig_`A)qp`3)D}4KL|=HJo$67Skx1iG`(%|+Udn=dj=@;t8|f7*pg%JEy_4nTie~fa z0d$eTXXi75d&D9KI>hwdQHv6~!G+|~LkPO_fgB}?ZtWphPpfIhkZ+`eM~u`aq9QUA zoJ`z5G8MQ&2I*1~u+hs|b7tR5O}A2W)&{H{A&u?T45aIZC!Pbktb?)v)=`u8wmR2m z=8l;i*pB=OZu|&?wnoxdgU(XApXL?IbtWi4N}%wQ!0pNcuZw(|0y+}VeRIqi7mrA` zbEo3JF8`FMzu&+c2TDDU3cZgpJbK|x?h%l4qhSAoLisbL^cI;j?maaAbNl!vsjb^` z?^b`$|7#(mcPG!MQ}szNw=TEm(2;EPYx1n@v(Bs%8d>;-FL%^PL27&CPc+egQvT^| zIYXU#lq{}Gt*FYIJmZd+;D%^ZzpC_xo#TE@ThcYI^oF^}rS%4cG*Vma5%a9#;X+?= z^ekYbU)`-!uA-XjiI;pvrE}XO0Qh5quk;}K$mQc40ihBGmO+kHE@s_-^F~pPu2nQ- zQ#VXsUtS4stFGMqtXd>I9-M`S;br6AC%7(WV>$faftE4bx=1L%A*C_yK_6Ijamvvyx&$% zfbk;7vu=_@0aT{l+)Q?rwo^_Yx6P(s+U-@h$OX1ro8bhkhnC*~_lZT{;_!$4;~i6d zz)Fj5`b`x2G&t&{K zy{bc{Z!^q*o=^1u0RD%^)b?dU0sweo{9i5~_5bPeDLWY0I-1%!*qAu{7p9y0$!>)Y z3=E7I%+>{rObl%4@KgJ1ursOPb26!aez8F6>u@kDt7!1h`YWzruyeoZvtVgEH?Ge*3ML9>5{94`0!CUDjEx`{chtym7odTokB06)$>ysU zE%z5gh`O z5JnO}V}OK^E(`%}O30W5goFmHiGu{0Db9F*GH9scpJd{B;$F>aFm<-59zn$rI$3)vn&R3SJ<9YOqS4`Nn+6{vw zRE2eGgTDzS>HP{>JlpyL~73s#XVWYvuMC(-;B^`$xn&ZM_@I zDw>=g@#sQBLvy*s!}vNiNVp$CBb|Num+=~LC9oQel_lcgk^iAE9e>pyURD~b3Y)D? zgFpILOag0RWA(O|^7z&lFpyXqO|-4V>RagWt}3-K&vg5L2DCf_?z$<&(BW~N@j3!{ zwJNpt=j>;eMgL5@SG0%)c4hB1r#ZfgN&}8}k#;VvjX=FzLbwEPWQ(&;@1O%o2nJht z(!dXM+0fWxu4P)h^hsh1^<9;ROBT6=Y_x>zFZo~ZF3-N(o1YYvG#X${_m(1XgCrMU z;letfZY>9K3C+pNX+b!m#jx=~@xk!3<3$y?3b*oZLykMaH1JP8U=8RHtYUZu+81Ty z)=Sx*p&d?0`BcF@>wELyoFN{bM~4{Zx8`M0yzI(EZ^k@6H5nCj`3hqI==9|@PfMT_ z9N$9g%t`QIfJ1TSUvIzKem1{2yB@4;sc+O-I}Wt72Hc+$^VYl7k$3a0E}<)m6d)Z$ zZnXFF?!77sR(MT&2#R?Z@g5Qio@gWq)7k3i$6K_}HI4qE6TQdU9|1-4x#eiSM)J`% zj$g@X87$ClkZD(+ZAB#7FD_QLQox-8-Hv=Z?kwpm5W>327t^$zFAg9x%U_4VDJ1S( zDge*{Lt133*46EB_s=U|8@;4aKP)D*WV0yF+oxfs)fBDF2eX+&2(x(EV>t5f&Fsrb zOdj!SVns_{Ft)A!XAbwrG#c(DDC48OC8)qEP)pqfDuXEQ{;AJAE!Vj;6=mtZLN(Gf z&ZP4Iw^Z)oAQ^3{$U?Vi+jP#f9ZM$i<{C6A{m24IcLz0U$Zu7Drh;}u$mUM8(>_wv z2Bht;YiK*J4L#LPnu$ZGsFr&}DX?O-SqCLen45Kns18WFviBUFVB@%Wg)dlMl)V`T zn31PTMb0AIvXo$IvYFZ%ry2Mv34sz*g!8Rp(!08;D?`3mj`_5Q=_FkwnLMLxi!d<< zCAW`!?R~EX(HOV3U3{$eYQ8XbR`HQA?X;HPt8AoHnX-HyPbEYTXc@Z(OY+g?Khapn zl@3~}#^hbqNU}RZ2mKqMt4+s_UxM;U=lyU?-C8zUw(x@6)9>*83vG%lQp;6~CA;2U zH1KMVPa>$2cM;5r;xq!rp{tw@yAKPISfrrCtm@ok08gulvBOy(wSA_*`_Z7)%aeU0 zxoW2Fz}L9v<4iCSZ`4*7S0C-FG*rLTI_unJMEKvFIRf0#{QV#2wW~dQWwFM{*x5od zZxpeENqvn+#s+=z0p8T7p?z33-Af!J+jkBk6zqlabpe?xh=7PIU5_X{_Orx*k|+e| zt9VO#z0h2HoRKdS?~E=}bLkyb!A9mXH?rbTqGvEp0t$>V+Ngiv2ZA7gndiHuM9-8U zCQFTbO-6z+L+|Yfh=>0M32Sb%V;V8AV?aGTKK5y|`^vU}PrBy*sO!*)G(|rfxwV6jxgwx6;nMH=Tffc2FN8$}E=jO0g zUm`RI+NeQXAkdDLr6fVc)cy zXZLe#S7=-rs;}CRo>^#Fh4S@GLzQjMc;Y$WM)OYX2AAqRWMk`vNu9woB*hl0Z#Hj5 zZ(2UT1&;KQ;74Ndk^cfSgNR5m)8a{pwQ9=x+^Fay`GnLe&V{n%f#znQ8XY+Wjr5VF zw=6%879mtYUNES=iV|~S0%t+RFVxd~MEZhKw!VlM6qt_(M?j6K4p^}f#` z<`qYDRs}f;$#AD@=6O%_aL00}1>yOIgGP(_tQ3KJiQVZ(6a zmjdoK+7y%-%7dYa2W58^7ZY^Disf{o-@Gz!!ygh!LjUMQHLN0%g+ z7}v($27Z8%*TwMt8)2v^=7zB+F^_BKgV|Fl>ODc|+OnZZpM!1uQ8lgl? zQj`c9AchTYJ7qpNZn{?CEsaBS*GAGb^Po5NT;>zUPbsT(zbtq|EF_{m=8gDD!8v_7 zm|+YatyE6-x0b&<#LpS~WP;4oAPJpdH<1v z;J>B45_lftPNsj*)XPmsdzMk7oWSUL4I;fjABss~$LHttg}?o&$0u|^(wTm!qbCk=t@AL<|r8I>1-Dz)mZ~T;yOb$lgjPzF8 ztU~jxlp0@(U+ZY&B9CEkngF zUYdS^^D?$)@{Ppbtz`B{w|gV~t;4tL1X;NQn$2kn3KE<+(OV>I)ciy3X8FM=9LtjuU*JTX3@gUHPhIEpSDfSBUE#< z_ri*lE$%6mnTj17i;cwwF!|$_P1Zg|&pu?R=w90=hqOq1pySB6Q5_Z=yJ_1!)VQLJ zA&ZU7%GbQ3J=D5Hnsg;5aFfc%Jb41^)v`aMoWLRBFdW&DV>ZcO@lUXB2r64nbZk#x zU2_MQST2W%+Xr5~Nf@oo$FeQeHJdi;jtsg7lkE~agshW?GE|zD7Wc%hJiO4$+$3@| zQbDzagYd~qSr=0|V6Zwz$VuukRn}c!T*IxB6ZQh?d%#(dFtZ-`#+90Bt)W_pg~YM2 z7e}W4NMcH)=zG$vcpZBm=a%(=%9CxyO{9_CCf%C2hd7r7E?{s^Z9aK&x*(kU7bUs( zjwQWLBL1@4^C)Dv*e+n2WH1rxP?&Gw&>&Rt(^NEj@wDk2Mlt^#EZnT{XHNJLsJQnW z&JGmgy8TE5j|Lskf*Lz)9J{yCM3A>Idl;|zP;BclHhM5%>Emcp|CRC8L4_DIxL_K+ zYchE1FU$||xq}YfwuYcjtL-JO<-$H5jTJpc_fGY0C6v7RQKSSU8CwVM9LV!UDnsxu7@ zzRYEr4Pi;Z_yb<_aH1nJD^O!;I9hP%! zI#9y5q&u50R;G`Y_JI&vkHWJgx3aI5$lpYXL2syb_nxl0-TCs>M@_2zZ@dF*Z?um8 zzrAnQ?VQj3S?{)2X#LUo>Mrd&s8f{APs5SGakZ_*$J@^JAY93W;NZ0T-H}a#>Aiw| z??8KshqqXoPheNCH1&|G~&$~i`@taN)~@Z&-Kx>2=~`Y@X-F%M~KJhKj*T%{xHk<32VWCEizO{U1;bPPK! zi)u|cKIr;7{V~>xfhu*5Bh~mt4syQk4?k7C=LAjOAqy{shU0)yXgH2qYU#;?ow~wx zmdqtP!*2nV-0X9B2j2z@3C0t(l?xvPQG3<$%Zm$HSK?*w;q8?HMmN>Rid9wEgdB^W zx&t-LN}K@YdA4L4*oa5DR#H^nygz4Z(JLdoKPY{gEQ>w0P7j=H3M*Pwf9jALtKL5!{m&@u#cHvd2jchgLNs$wkp8A!lFG%W>1a-m0!b-(ZgJ3?t)Q9R%4DIypqvS;hJ-k&-9^-np{ zX}_~2Ox~#BH4wvr8c3W5b$yBTSr!1TP<{msL zxaQ3jT79^8EeVJmlD#{?Ki$%vdbR~Sbn2fT3s}xmyqM$`!0?qP;W+-G&Wg^ne!5yv zCGO(%|3cW-|&!W^N7JxdR~n}5(^q;Q-Jsj&4t`@D{SDJ0x6wD*mOR1?^Lb83v#wc z&B1IVpfdcImkLU1VG&!u#6Z|5N#YR4cQVvTZo2;X29wvK-npo=It>+FH%6>ys!M zb(2lNABwR~0i$X;B|R`|_nni#ACj^AEP18(sT5TG50rd8@x0)WU!YIW`2$-tz2B@@ zbVdD#=W4dkILjaKSwMDq)NtGyNAo`WtClm(93>QI1>!cu_(en7*O-gQ+*OJC6_FKp z{`~mCP&i27`~_aIFtXN@G{W8a5IG{OXKbP);0gp~hoCMX8HI@kZ;Z!S@zrB0l-4lN z(Eu_1$p*5g3d4xcvmtiTMjSnIh_U_ZZ-h5n$>Hr}MPAXU}gP zS4HnMh>Qb+!*;DhbCYd21+k(8QY4p1XjbvJ3Q5@_siKt0Vbv_U*}_g^oCqG!^95OJ zBxg#ZuVq?ltKNzNnmg~*ilXX!T$B}@2f(K#6@=}IDQ4G*sl`2vRTGV&Gxm3yA0)(d zDDOAJH^DUQ-Xr9PfDg;Hx$>+HD}*eU94zHnNxGbu=-xufDRh6oJ^Q%=0qAnBoPcYE zH#(9b_P<=s3^F8*I*v^Il0im_znL<|7yR4Pld}?-s~eMYEoiixavF= zvNbA2$liiWR&z2iumcIMBVyZ_*mJ}fhaoKhSjH-=15CD}9Hud57ByCtAx*>@#3fr( z$UTz0OGh_P{K;EIw117M*1k(5S=)GSONJF)q5Z_WNMFOe+5TdiPLLpqf?!|M9*P zEFZ&%`|fQ1Qfdi`zga00Liww05n(~9dxX79 z$+lca43lzQgb?W*_%~lxna}*I^#``A8azv>>vJu1h*z1E^xCJGHB;Ao4w z{-TzeaYfJ~zxnYdV6sMa=8@c>85v)VMSE6)Tt{OIdv z0T}`vT+!I-Ct&UUj2xULi@{CatNOc4F)mQ!cZhsXRbBR7y|(yKjLvtX;{Z**UA-fE ze5A`$@1#pzevQP_3`=yjyAR99O`J!d5^{ zwivJwNWfvM!aof1H7s>viOy1pY)`2~(UCh3k;337a3mx^$xh^0X#q9l0xcpC< z%lxTjJ7rz~xPWLGCkU(`n#)xv#e5XI$L>t;Y2&`lM8W1t z?KIOi8)UEMg&1F5k$FVNm=u1`N`~g4219uQAw3YwqW6Qg^MMvxt>63chqwEJ zuSM-Il{Ysl;K;IzRo#t*klQA_8RiK7v+jVJVM7{NC@A z;Wr+odc+fF^ANYa8>ZwYx>oM-C=0K?7JM_8hcvfgop3rOR6x_$7XR?&NG)!r*8fJ1 z2&QS+KV*Gh@)lTt^9o$`)R~VafI1u?Tf>5SkWL}F?BSDFWpbe5mk&uW0}&9}kKA(m z#L*#YXsJ49K|#y_R(i4|8fh!II`0X9o=L}CLeY}BG{pxun7k{Z1h9nGo&1SR7m9Jsm;(n*4kB761fC=L zdnAhf@+DAy@-w0oEI#R(Yo2|8t-^cCB{y=!#09pBoV9N9ntc%7u*rawntx)vIu0!h zO3%byqgxIykT_-}u8l8d!2%%bG;_{+^H2_dEkU@I!vAxKr~km`Xc0ZfwbF(YQ3w6Z zf}p039@S4iyo++M@@Z+kf;r6cs^lkTmO5uB-tQMc`(5xsrdAQciU9xY))dMMz(=2g zXVuadI&Mm(J`&HO;1D6MU+ti8b(h`OE|#Ko$+!F4$p#Fk*risMESNX;_75vL0O80z zgy_t}D9>%S9mRq)BX}#I9(CaC+!U;PX*r`K=`6v;okH7JjdElRTqNn8HD}{yk+9`D zhsuqvuy$m)zBlE-{^xvxEk$G3X;#PIC83SIpOX(fEB|`~oU@x{(CE`*sPlJVGAL(s zIN=vL&_*@{kwn}=VunQAOvJbtHc}@l;|<8KTihVYzTokW7{?Q{fJdX>?@)W&`N;A@ z;+$;Qd%Q55grGT~nR|EnFx-w9+%Jp@c!{BJX!|O>Q2*F`89$ic{ISOhzc29qeTU44 zvLQ7dBe@F`F$H}29Wr2|xH43~uO&LIj%sL~C17fzFM{p4fi@(YhrYaxpzINGNi4jw z%s?JDfhCY|G%QrUi7)}OLe;K;&RH^^~jI z9w5DS4Eo^nlMKicT{d7RVvuedgC7r_aEtTW#)^5gyZsnqm7-naDUIWZ28He%->^({ z=3O!<%3&$-K2Hx*z3a-+rP6YHdDyk!%F8}vIT5MuFL4p1*9RWXt`0aLOOjVi*6W}d zh8A}@h=2`u%{$6$jgWgafpt`HJQb4mI>tfDIJzxx>@U}Shs1hIC#Lf+seDjSr7{Q% z|4XAs`6J%?K)6h4P^$J|u>1?zkvh}dNk?VO$~A7N_MCfUqSV~O#oUBxWg}JK+BLJ_ zMbnS^JF#A+l!_tbHV5=xH){NM+0~9bpsC{snEJRY-d~XZuqa+P4+&NJDrzojQ8u`A zw!mMpvPo_RH zi=k9MJhs9m0NLrE=tOuN#FE1)OFJ33$UiuTdEbotZ?m1ctw7$8Z}W&dkUC|d&PTq8POHpp(N0|=XA2juO5#>S7h8GHLbAC!EP+CnLH>1u6r>}ifwSZ=1lQ0cw{?L> zT~f`qrPneIJv4*1b=~MgF^nTaZd@Y;5<_T{;fHv1n82AM?c@9e0Zw%p0H(PeDd>|? zsgAk8*-8`}4o>x`m=Fa5lT$D;^%|Rt&mU`%w;NDXl428=)8SN$+^-H^bS+_&!)Z40 zOhT{i8z3$7xcfUnV7Hd=Q92Q`>zkZlu_;pvueFLywJ0sZs}F7ot`_W%jUzL*y`1y}o^Wx~HWNX{1xDxUz;}R1?r79x%h~J{*SSPfqe{79|A!%t6q-GnHE`!`#ov=OJ1nznhdx>8~n-g-OGW$S!`>u)d65OWor z)mSQOj`KIEwDvpYDg}LS$dGoK@&Z!7n0;P2f#doB1|OdCGXen*r*C3^F(>&( zSiA}+l2#h#sA=H$+0TmJ2dykm-5a}^){ou{yC5Lzac%JKy05h z$<@7F`Kg4~YWxl|)%(uv%SQz1pW42i-wz~gX>-gd4?_8D@`B`qFIqWz7=UX4-1w5V zDcrb(4X+;|8tvI*PRTw0T)>y9Fn=H#3o+u5HFH&@P~R(2IQcU@^9sSF8ppufbtqd$ zsPsxLtJsdX^YS&L-)$-Q1%kDryK-_@w0h<1lKAsKQ{jK^%&v&NdOI@S%aG?g7yMl+ z*TudUew+0KB@!!sA1PiDaTVcIg#?9%7fLfp*|s00nh&Z`WD4i6t;+4>T%q0NPg8Ot z?XwHFKpi7+&Q_EP2WutDn+yUZ@ghQH^WP6t?^+EGBx)0Lg>y1n6|#N=3%c~rN`YS> z#@sT^SYa;Pmo397gv`g@Hlt}+drt(UkZqQK_Ih-3E_=u;IDJ2!F5hy<>!zHH0xO0+ zdWKu`cWY9yKErzrn|qHb1g8`hO`oZl53)I2Eq^%L<>c{=R90^0!N_zaP~8zOns%vj%g{VUw{AcWdpwWr+Nb{$V;l zsH)X{8R`rb$-BwBYn&_Ro6+;WQoVIcU3D(Ih)8?bUC$)%CNt^W+`s&b6jUkvsr}2Q ztX&_#YaB0^eAf8ko7gyF$JVKoRDNU7)>nFEjnryC|H4+dX6?8FAIu`=UJxIXVtpuVAf zUm+-8$I_H@5I<5)KB0d@nh+AkG&BX@)ssYa2ME8}sc z9*k4{HIbf4RPm|Qb3RHz;Lji_R}EZ6yD_12zFbB7_6pFc(b3;A-kDtSW(=p>F-AB& zUu|zNj>#JvnAY4G>zQ4nJ9*|be5_eL2dOI0c4aD7lyM{OCpdOrZ8j)wCsAte&}MjJ zuQ$=fsZ z{Wo&7S|C~B8(jY$J*(_50_;0tR`p-0$Cc{4goyhUn-&b&bxTQW4m3L!xF{U1Ws8n8 z?V%Ff*lpIar`Z%t-}0d?yslZQkE10v`2`CEy?r!aTWXy8C00E{zY{iY#G{;x(8Ijk zE)c~_RhXKgmN)*47f@5UxtW+otIo`0BBO50^Ip+}qwH~n4nppci{q|~vPp%A(~e1= zIlmk?LOFi=JW%LURt>cvhrjT=im8g|5p5KXI_q}zEWB85b7ovDQIuL6wV5|8C-y5DxOw zEF;dH^rpXr8b^@(VDa@l+6fzJ`Rj(N00HVXymeJNG@mP;Gocqj@1ss^h!(j9$o_;Y_P-IwX)E)BZac4os!*0+z@++|COVK zl47VTB&jhmTXiiIgdSA&rJAN)Ft(OFX7#o1{A z_xHp)-Xz~o_5OcPv4?Bk5))i|R$p%yB* z0(%q6x5EB}oo6QDB6d9cs>p;-tEmYEZHtum(s$jwwB~t7A+brmL}7w8#h__GT^OjKIx3gW|T{p+rMep9|C*Zsd1u-BwF z-tr%Dj12m}EgY0qG$@B;T!)%Gi}n>VuVN)d2`ER$@h%ydVM`uU%4^ zoec6Wxsq>Mg&;_Q-|;9Ejl!_X7xX>t4sItijQIw)gg_9SRt2Mu$mT53<%yG~Pr6X8 zEy8)Ez=(vkM$?$Zsg{BkXATqaC!GgIefmR&oXn}6Qw7iT6mTDu(IL?AGZ+_)SetpW zBYI4*ArGDjP+@iHiKihnS{G`HbA(4Zg{Rl-)iaJ=R?R*itzCZ>hVFg0$Vi-X(5cbd zn`m!pES^mM4q|7SaLIY^D)4&_>(%hGWQ2~T_6YMGTvY(M2fp7IFOkz7QVPX)q2d1v@n3NliO+N< z_!oB}kpC_2tp8Kooy`DlRwiZ)az+3fGZ&Tr%t-(91O2~%e5$66s;&n5-&sZmat^Sv z5Hw+2Wnf6G4B|jm;4Jn`(lEF2;u2!ANUzLJBYItP!;^omar`xiKK+Cx)+V*$#g%1t z5R1d?Y*tmiRyHgAHSzT6Zto)goi1#v9dn)T=2)G2aM7-(Io-EhpH~k4pI6O@3g54Z z62LVB`MM2EEuttSz+41!4PV6d{ zWEV4KMB6oqmQB8gf=;YpmH5iaO`>21-HhB^)^eHH>JRa-vLFh!E3<}h6s1xuxG7S! zp+h0$NmAOt^uqBmNLtuxC$q7)@qnal5=2XwV2+%K@lAcM$_IB9%Tsa|Fj!rlLrvyw zzF+(y5Lj;SgIt8K7gB8e>)7(7kf0)!qP&hKx3lJO>MSWb zzUg-e%gnS&Dq9i1Rbv=o*Iv7o6l%)A&=7qrT?zyDVPM@QEraq4Ihm?(@U5bap#3NjURsI zCa{)n3kxoj9P#T+8^jfU^NN4tlDr$>_uoW5i z<4$2PusZ*2e0Dk}LUFOJVWH`ujh+(5Ag$hqJ(!E2CcC)8a#7rj+!2OwAp8fgK5$>U z7G$Dg`J7~w4+ZV_!Iso@9a{Nd3O7RkIbIVXYL5Hd7a*E_S@eg1a!URlP2L;?HVXsE zeFO@^E0#g{^bu&Nqq1wOhv4q~hJp*%&M+yy(B-bbP)so{rU~bc(BHUlWwD<>M>^ zQ+To0*HHVk5{p%p9!Q?>%n;>V56hQVmuUyUbzSzMC&|;YNO>dkm6nruQaw@%*=~oU zCMNW&{8BvhBhwwCa1|DW-am3*JMZBFAMTKd^or0-zMrH{_i`egd|hTm)N$xmxEk&s46|!8Zg{i?N zC~!o1aun^dq|9_9FFZKkiqbbrtgybLvUBc%(9j*XV|1-A)W&Ve?xrp3;P!4*JhQUr z3QHZrNh>U7!)wgfCyxg31pqGo(atbaNwFE#@_WLELzJ0fW;oSlMgr&k z5vYC+dN{XN4c^%_*H&O!EiqiI&#e{x3MK9ywe z9A31p?z|n$t**`;bA)zlSvp#Ww9ac>N*4SPeE%5Y+?KU1@Fa-0%qe2B;Lyb`IAc}2 zlrb&1!#)3b%~Yo?MCTVw0xU(CXgPDbb^q=Q{%HzV9F$*xcYsj4V%6iHEy&C*rT$^M zGLBcN^vJ7fr(hhWKd^rxC5tR~%Hb2SI@97E&nteqjfUtyw+T`^MG6Aye@Os zkUoK0pFp8crqDx<#D)XY9C6X~{|s4C6=9O<(m75|!k}5dKx};)dasj! z8!iUHd4mO|yDB%QXAr<3?7;yrNrV5#+v=dbrqkW=#<@m+2HUV6wc39a<^^-Pq2CzP z8#H@k*D>H*#BkFRD`mumG5VY+PI->p3!)5tJ?a)J%{qc?HkM>6miV1siW302PNqEU z2)E19C?H%FRk5Stt4rJR`fxnuu;85ep>qzs*u1!{D*pJb^_6hYMy&8=BBGf`;bVz$ zju#4XQ+9co?E>5rVs}ONv=Ie%g)@{!d*!Psfx*1M6WnZinIZ}Oa`Et> zob&@0pT#L3fd<;*P52o7z0w50sm|_=&mZ-~{mAMSm~)YxV3M5qQy%L#J8rXAHhd`5 zC^x9QrL4Lx-7wh($FD<`Wou^HtOg~r6*JNl)^@1HO95v$#vtprdH)Z_1!_G6|B8Cc zL}4D@{X72Wyo2#Or6nKh3lrdc?+>lI zlUV-?`CnSbsewq^8VU%A5B0xmnWQ*1(SP#g|GWN24f#K6ng8qpQnjHC|JAJV|7+~P zAxj{GLKI2+D~t{r8*Ero6ATR66c|M4ASgK#5<6oWjwKmLo2s?Waz(qkNcnQHh`p_d z5qhy}8OF78QJU0bKy(!G1__-EGFfjoIa1}bE_`?k-!&-=ysCcEeE9902jLH4g| zF<#lkU&-t>OoZWI1HaqcNZOWgIgIgz`uA%eN7`^A#UJHKD3&7V`VjItj$j>L*jsFw zzM#p&75F9Aw4wA3STFRB6u@|bB6C+{x%%v6$y$A1G+VUkH49pe`Avs2%%AkkrligR z$sog>g%P`$%o#A&-kdhF!$JEqAo!1DF|LhBO9?NQL~L$$QNv$E`{v~CtQZ@3EC){8 zt3b2s$nc{_8!(FQSdAWxC>Ss#`wrkRZ_!~fA;`aV$Ilo8PV}2wD$5$n3iGVak|a6v z?m|)J`V_nO1EQcWFRU+cSI6O}W{S{HV#9*`3_!B~ znSF|hMl03i8n(No&h@XfZ#1l)$I{rS+u3S&iE{#$Oz%#&FzRC*;Khk|4qRJXW!Ac^ zaB5!u+!Fkm5&WBe9WxxVJ8jhyHtMPcMUDv-{d9EaVkT*}h@h40D#hYyT-cCj)+ zeDX{-H>y%l+~WMGNH=!Yocdzyji9Q?dVm%)=$+f@Xw{Nf<#^&fFdSq4*MQcv%fPY_ zx6<n%A2OV$O)AZWs)!@OoH>b8UE{AD7fdC|qd^9J)@_km}GxZ#>V(@tiOJLkHB080FBoVxe z^wTbzqKx13qhLXuvzVOYi6HyM&7wh;nlr zix<5NvXuy>Xro)gL1o%Evc_HqI z8myk3=$ozSRxi;#p;IX-Tj8)r%B-5FpIB#$9u)FDsY#`_GsQN+?vr!u1b*-32{~j( zg@z)T^v&;7F6p^&L_v_pF#dAvvO_qNsIlhog{NoTpk065d2(G|noy6-Wf0yiU-~{U zPvXv=_T=yd{VWuM#jbO7JE6MBhcKH-yy4O>2u5chx zW{V>1XGO!jG=7r7u!-|D)*G1N&>hnMs%rz3?YfZ6%_pWH;$IlSV5qz%i!b_yU=0c; zLez|koq$IU?6B0aar1G$iNnp(FQxgT;%JSQZ+-Z z4K`L5{Ihhf@nj=9S7tb_c@R8GnwI^k^^JQz<3~fIzFt>Rv@4_b4TNB*6N}k8j5?kH zU2T9FByjd5@qwDMAH12VzS#obmey#4)U>Cx^-b3n8^KqE$LsaX!Wgf{hlzkBP{_)PFYC>%AJaa~+6XTFp*&(7}-EYhV~rH>e%{>7h7{Fp_{g8m8#*I(NTT!q zmF}dAHDToPzRALcYlr0AM6xGL4wGR^OYk)ns6~mY#KMs|9>GrHO9)GoTvzjL#(Yq`Rv^(gl{1f zCw-o^jTBeoiEU)W;W}TK_~B$mM8p6#{t3L%RtGB{<=)9UFAB@tnkO&=D{hiFUQ@Pm zJzUvqY$_RGXF);74V7WhlZheG9cgRRx6nh~KP{bootaj0ptseN2i3BH-EXB?X zqs}f?Z2CsX_K@8Tj82a`1|dSr5;V%9Fs@_t(lKWro;y|<(x6Z96!!g>A=n``O=he? zb2f+ZZNLL;B!2!Z-Bq|35)WUQMV5KC<8{w4U3swXV{T&hzHR4a%{_p_A@Bt!^+gdo zhlve7nrE#-35|OD4+`{^3yUZzhlz>CuMDVtY8R;E)7Ml&KlY2X z=ld%jQ+?2DfS+1_5vjP=_f@Q5+Jpq-82uO$*Dt(l_aRh*Bvk*pFIe|*^8Q6!6aF!B zQw)x(B`s--ir`%ezfX2H-M%__ALCeG=Rss%xAqQUWDb^5$+5Xm79y*Ev>(g8n{v?d zXZ`AOUp4PvQ$QW8(`H@&X~je?bL)QZD&AMMT!+K0MC+oykbYOD?bBgj8*ZT22R)o! zXnkd#2w0DFicMke-I-6rLb*oC>}?i1f(m%arPS4yLT`aNNx@*Z__YuAa)an+ziq7N z&>?Xk-JPLV>lhJzB>}*t58-Zn2n_ft_C4o|3ck4i-{9GjsQ$u74$pp5h7{1UX0LX$ zG=9h>GwuXBprs}q4 z11qisJg(!83HXQga3~ha%EybCOp=jNuRSzM!zZwlws?o;tiOCy+6NZT zzCiutgDUxU(l*?JKwEZ$jW0811ya0HV8d--$wi47&c2GQp-YJs3l^1rBu~@LjPx1% z{`H|6)j?OV&nFDHU&NL@h5J~sQ71TmFCq(d3*)YX!>HAwrj?&8K3=heF)qunY(Sc+ zs?tem&PdA%q5SrzNdd|6RbE_vLdv5G>aA5#Dl>HU3bV+KiDAoRRy#qS zg%^<0vI|QA##bIEAOJvH+WXdC}7Fd2~^24KQVOk`3#GMMd`1Y&+rZIER0k%m< zF}V;61?w|U<%<28JmQFB$l2Y7c#N=lvg|SXNkpaKqC%dzF{3b zce@fCfv%e9S*StI6|VpiWlaJc$xy#@%lCOJuMr<9t?}aJ9CI&sAvD(wS%q|+s04Ol zfQZ!<*PIsDo{FuuYSz*WC;+?hiOs|g?5xLpI&~1{JNZ+4WB}1auSL3W*Oe<$-Koq` z>~oVH`ccabb;L~GYXxR{6RRQAv6<TiW z9)jaec0|u|iONiNSy?5i6BLCpBh~SX+DuI%EN+S{y9nAj^Yc%ocv(+KITsXJLuo-S zTn^ZRsx4Ai6|J}+)D|8uOX4;FS|*^_mcTD?hj2m3jbm#TLwZ}y;>$Q5 zE6!ns07?)UX%I_{^)wB}T^)$)Sje2XSAc-)3&14-|zaxBkPWMH;6A~8~h|l*W5o=erzH5q3rMjRa4N6bvz_M;$4<}V4bCT06 z(Q)B}uRT%HYRL8G5yuS)Pba1yV4TCI^|iwswn|veLBQFcmEm@utp;r+w_u`N(XEFg zLah@WdYf*Gy-vOXJAciP^6B11$ofDMN^vWOkNoXbCG|kZST|WMjv|=Jmi9o+cL*$O zx5Dog5%SV#IahtA#u#_Wr=+Zax!eDzxZGUn}~FHM@B(@W(#k?<HlEGXYint5*R{% zpr`Vnk-E(=(NuQ6q9|vP>SwhuCqMsw?wB3A9VPv~v8t+)TnxV?TjF7n{iN#rJ)tOW zFos}ltPy6lRxZ~)D(x;}1&(%y3H78Q1Lb_;kk(kPG;6_{jfd0N^ybt_@FTljX+aH1 zSh2kbt;HPd{AIZHU~&X-NpoKkxQLtoVMp^(UJ%P)NtaUq#5Fh1E>vEfmN@0W+Qlhp zEGdkUTt$Q{(JKoQoGw|?7clXn(1?2x`Ht?hfWrQxIH4NZLz&L5-^S( z-bl;8GYWIJOAVQGJ%nSQFPoXC7rE$SJSc`Jbz+NY>5rQfoHb(WYo@5%12ebX?H}#) z4uXYO+#I>|W?52fVP)%06-&*9{gOZNb+J-QvT%aJ!>$H0m!P#jMD)fjCnMD$t6$Z+!+~`k}7!_wc0mx zHk3Z+f?Ta0JZFTIs3o=fvk=7C!=x6~adtu#;E<0H@@UHhTkL#`%ug?wCf{Rps>n&$ zPVxzw)PWTs0AHpzgQv8v!pR>AdW+MJaC8=k%pcKKlRF;Rej1q^&1<-6S|=l}I%(np zrAK<3KdEf_HZ!L$(>&a{xz6`B*|<5mhKs=v_v&E6;5g`=`oj1ZUBULM8Y=D4r5q>d zNBdsXM-Vtu)s;cGR$TSP(Vda>`|!&HGj}=BXX1Ss_9rrD81}$HLhbkDUC|sgy$tCU zWxiIux1eE_ufCHYTo;ust_V*U279f)-HY&U_sC;(EjwA!N94_bHMbw3bF1#XzD}9M z#KgWbL-eRw2FPiJZc^$=X@^__*%4bLrs9*zuZZ&f(e^c0M`qj)U{LjPj$|$j3k8WC zggsVG*0sk6R7>pXj@Yrg8RO6%*s)KI@feQWux&EvCsKjH)cH*=kn$1VuAO%d4xPjC z_H%Ki!(8so$Zkk)sTY!b#3E&q{FCbGow9=YmS!%~lYAa^6(S{o9LzE=Pk55P*eXHD z@<;_5`Y7@k#QzeH@yue5~M7uMgkx^NgsAl?yd##>tUEI0#3w zzn5(r&{)r6pLcgU?dD5Q`+y> zHZl7%HJuI&eSskyCr=_iE+KGFOJuIT=9En@`y-;?udyimHyZ2yMXy#3G^X5T);hD$ z+D1Ts3X<~4$ahy{kAAgi;9L%xN@P%=O(<2zWR_(U|4Ndkn$5eiU~VIP@n;0J(!90T zCfq+Ed~|{ZB!N@ia8Pv9RH;(_2AiPyO70{5vUVeJaf6spcxQ_?ZCY75KByS1C%_6g zas8VKZ}Hf~^=O{(m9yJGypb`pk%>*}unF_1&OWgXm*jpG>Pe%MA)94z*Uiq_!jw&( z+-mUP?W-v=mr)zQ!7S-#CIU!UHBX+NCVF@6lDXWk>B-)mTLk(jC&=2}v|mc;ovDFK z+TBRJd*2{c!zS%lfHY;8Aj|1<8d{ITXiu{-2nM*M~O7x#zH9ZFzG z;*GFV#1X0|<|p#q|6czu;>l0+PD_aH)Gh-<`BMUQ9rvGFZLshoqQI*j2!qX7&A+>eH zL`PuIW&RIm=h&oK6m03LF56a@ZM)01ZMbJgcCD%+7OWXx!tRwH zmGz6*!aA4HM{PcI#)b5k{r#{|uuy3Z6;MYPS@LET@vnvh;K6E4Mo9e>CtM3RlKtji zP$$ok!IJ+$8`;`~Cth3ti7u428kSk~gUkG#7^4PyoOxMX_Ge`1wdT9+z4Jqqw41#$ zepqK5sAN=p+5b{B!lh~Q40oG*Ki^gHXTNhlg85XJmP-Yb^HYCKu*2XdZwU zz|e=6$n|06oOE#MbN;rSjQ9!7B;jvgN*r8x$hjZS@QgeO9X;vFFTQl3FFy&U>Np(j z;fvhGhO{2o7j0C-3hnn{OgH|8zEKXIVG*t?Rg3UVr{r@_jnp-~K-yt7T*leaU-H$z zmg;Y-tUHW&{{D-sg}#AJdm!nrH{^wVM9a+lNw?C|{~l(!&uxR3L0z(Uj65#p@;bQ3 zM@~pRVgnGjuG-g)FOI}sj<0vSA2*U)V5p5)x2bw9kF9IrQMYKT( zzsn~z^DJe|E9Oy;qA3ZX(RM`%r10k$qE@jD#EZytm_&ghlh6~oE9Qw zCdYZEaqL1(unk;C8H}&pkQZl zS55uAY9%JMtAkbyy@STFkP?taDMrYU*!;0zN>(6`wPgZ}^CUsMq_?x&F%iiP2Te*m z03DG(lxDY;B10a-kL@_GTAm~IO>ONdFW^jVZqI#GXnjo+wIRVhwFYUzeY`6_Zzmme z|7=ZL#ak6;9w8`_kTuRBI)26!ufhBm4BC;$k8#0%G;>^)y~UYLRLg^lt?9+7(K_7u zk)_Gm<_c1ua0S_=nH})VF)SZrgo9N=ZeupIdhfFkwzlS!iF_e=AR6Z2B6sOr zp1;hp2GxM;R2tm|30{X=V$Pvqu*YKMRM{&Tw3fJ*$ikFXYE2@o>7!U0>)WR&1XO{h ziZPNHeNzXz*aR}I&lI|VIB(Z3sG^|CWr3)gDz~;V8EJV}3@gJ3_e&8a-6E$X-eg5g zQAmTlr%7M{JE$#z9ik51%)C^Mqph_%gYN85pYy}1(x_6<@p9NZIt^(fV!Ui^4O5tQ zdfuK*w_3irPf}z04K{gpdN`dfu0?mGjU$E`s)2oDCX}Wz&*-;x45n~rUa`~w_&RUh zay`2ZJZEy2A)-iCVjC;>s%0^^aZ6wo9(%lw=z6@Z?R=EVzL<4M6ykA^h+}!U=D;r7 z$V#-Dza<*uNa)SBA*}m8)q7=En~p8aXSK3Vy`@G z^rm@2o01W=sopl|sJyfAQ)RFc^!@AW(A*m#L5D#nmD6~O#Tp@@KNM18oc@AW%L?I4 zdEm~I{&a~|1w?XJbBs8SkfF@K8NDPQ2U9{5yGbI#Z4Y4N1tRrxg1dw}TN$~k2P^LV z<_s9*D*ge7%9h3J^@x#8Vx@AW$?!axP+_Wo%;)p!YV%Ybm zu(t>A8H%&A%4{b!#|F=1H1TW)HpUV+GZuy+fz6rr zK}@A2ky!*DgtqoSkhE(K@LB~3DM-C5#c3#!XN{n63Oj7)=fYu*Ub&q&{k70cCHABB zj3;2G1{(kY%sY<$Tx0Yl*=kkJeWlRaE-s znhy1MJ#9sCt-~a%j8xaIrCXN4XxfkeY84y#2>SVT-xC@-xDT)#z0)Qa-KjX>+myS` z2ZGV_O;@wer`!R36|zzGg+wraWsuUl6Sp#4UZccA*e8beFzv+$5Zq`8iujva@VUR@ zE!smOG~E0K+NcU--Yr%T&a_h(lbtV5v@i`ZHdP)`NP{AqEUcp^TbPGaIG#t@E84R^ zUJO&RcxwM0y;l%FCRgtjs7nL#ud!6xA1ZYa$Ia=%l2|SBU`46FJ(W5;QR^6Z|W$_K<2zi zT^vBv(K`2V1Iz{gOa*Li7W+*>2Q^(%>%|Iv$k5V=@3-R#qjPY&Z`%t9GLb#1J zS~oCvnw?y2i{+77xE#_O>~7EYkbwzi(+9L=MKFf>QQ>o^Hs#TR@|Zp0s`-Y*g812Z zjpW&RG~SgL*i^=+xcO|Ni#B^Uy{mu&&5DZrl;Jh(L_}GYoXzNU|L7A5gVRbmw9b@j zCkS=rVr|#Pru0C9qM(PVs$_?&tb&zU+(hfD7L)$q8jOi*PM+O%1V-1{PNtF9GSc#= zWA&1Q)>++vr3lAOxOh0)%#s4vLA{q$NtuY#!6CTc^n)g-46Oo(wdqnKkX-s+K}-wu z&gl_F99^Vxn3MVS==UVvT0)yq5PLnr0cN5r>Bvwj#8{%Ft2JLw1$1|XI~B!I0&@hX zBXLoZ9V|hAd`TTu=0N?p3TGy^H*6EPg_wdXD7`19)V0X(@fye03&L!g10h2&Y`15$ zYT-FYINyu10W58;kR*2(OZIyupGUjAU{qAt2!NK7C zOGYCHW$gQ9YADs2HxmYqjm`DzzNiWWAMrs=Vs%k2Dj(7L6C)STOhH!=ZJaeKq-_CA zAc^gNk%baT*OgDOJk~+YN2m?lxIlBW6H@NbeR867<-$I+VgD}liyPv0@0C%Ql}tKN@+{x_nj#E_v{pr{F2m>G|Y`O!%cOsQpq}L2iX%Vy&yiVm^^04 z9H_7j_|gB?Qgv{E@)+x+rq6Pjho!l*?z@`F9U%bzo*z% zn-Fq^nfl4Y(@_f{aVY}565F2r-4TZ08N}BL_W@nYx9i><7E>p7 zmm1;>HjYl?4gZAwT$4#%&Bb-h1^v`a#c$bErka)}HkE zwldNpsx;5xRYHOHp3)sf=*Tp9k5;<-OI@yorEV!le9TlXM}q^S$1Y+}^80HZt_``( zj2F+b552mw!DMw zdtm6F{vMrwU&15e3+|CSOqUvnTv;a9Wu5pLn`BkKlZQ8gkq2(C5LCnO5tTLg99v~D z!ve`1MXZ?EF@@zQF^#quv_DEGTkH)Q1!VO>vxzfsrEM13B?D!+BLDhxJt1UiE#pUG zHav=9zUTFTB?J0})-Tu?_AjG~K*KL7qy@DK2R zm_Xb{9Jx-Q|7Cli|8K&X=zkQ>Lble{wl@DIn~OC6;fjx%_|1|x#}3H?O@5*L0)~y1 zMkc1{Bl}Bcz=-$<4jf7oi!6bGDGiD_p;ozqXt~NM&qhHjm#$PsiyF~i71+8ie3@?f z`lf4LEyvp1+r@i5-ue)bBFV%!OPX{ZJ;EFIDhTaG0I9> z#LwI;iGLnFB6yw68Nx`bq8%mAPDQA(ff;*lv@g-Os%JzG?OBYgT(!D~4O84aafn5B ziVV>4$>>Xjy)Zh&VjBB>e=R=P!-u;#I>oY-sJMgzZBuR0S7dBbNQet>uP`% z1;D;e&@8T;);APtv_9Q97N$Wxi*4D@pXOLtZAwG$SpV9)_3+gvMrmPMJII4)kR-K+ z{5Y_eH)a1v-~1MKr5QbxAWl8e`n?IOf}ID;&eWEnR@Lb>#~Oi?fzEiuCQN)6$RBTh z7t#^n@+U6M0XrRisj9U&uX-n0`8UAOa0HJt`C_`k#^cdUP@|p+?$MGVZB40Q%H4S#cZJ zTdA;U&g>aaI;>8*VBBu__4HHUDisu>y(Y^pLd&ZWp*tHnUKkunn{zN%uHYqD>cI8+!Jw=hL>du9j)aYm>wPR9v;0qUrI=eX>Nsu==y2a0pv*JsHRKryxRGTdhm*xojw$5C;@wZxDJUVhz> z6HlSd)Eg!TQDx$+V-{e6ddT}7pwv=I5`z||XV9WR5%~+&@Ze|RzZ9DhadjA2GHk9S zO&9l>tx(H2xf)?!-9)XwRz|otKPJV(${MwS3eQ_X5y6zw>?p zt6noyU1FubRHE-gb`>o6F66{I2-+9b)ag+w*AFb?dZc{k&*h{^P7ix=eI`}L~K~M2Jzw>he%yZ3Q;jkrf zeoW8?x5;BM{SB1Y9H)syWBq;wd#E3nrQ5qe3S%LZ`4d9|$H0S#PXD!n7-B<=dIU9s zGBWb`B_oY2%P@62PWpBjsI5B?0 z7MCs&dMKBXVMesuhKfbl;1eHr5}GsNT%Aj<;1p*Pf^)Y2UoE?{6MTGPM>Jxk4OIDuyGPG(--0q_LE+h%2mjpbY$y5i^Sk z0UB-EW$~Rqs%095hGAxw0d2SX30F2mX<;tWk#oRw0;ZUWT1r#SyL8pVT18_kS}5=d zX+M^~4sV|w%U>bvd>=;HKUW;^EaD}H$8WcYbmVq>Xk0bMnZVGyvn2lLE-)iQ2HGUR z&E?^fDHofQ6|wyN$0dGYfTPXLTxE@0Ul}?OktG#E6C5%&_hUsk6Am zI4u5QbL3bNC$5oZpGVkdzKZLOLh%>N-VE z@Y@HbHb}O-sDysFMzMr5sT0YKodTxWCE3PgRP_oX1ZEr3~le)#>xlT^(t7OHo?Ry-J-uOW&8hjF8MRbHR0sop`?Sr842O zyz4$uj+{CnwsgGuWDy|x<06t^jee#$e}_*>g>-H949U1`7d+^GQx*Sp@a5pE93}C* zR@L~bosJphB)HNiUjLJt$BZf8*ZwD&~&eIen;9Po#)AJ`4%}pu}l=hQok!5Kkz& zBY?{E9X|v`o#+^W1eP~x(kBZ6in@vx^#*q60GnVqjVeh;=Qq;1AIc_A@673^wZ!Ox zQYFF*T-{pkhVhUi7eO2vN^mu%q!WKVo(HcMh9<7qiiaSDBnQEhcK1miv)|tRs;ZgSx)5u@X8$`$v~HX)_PD{bZoZY#&XmK z>&qu%mOw9gt_$ERSSn@F0Z1n(kM`pV5SE+=5Ab?ESFW_xvnGoi%0 zxx>p1K5+7RbAU}IAWzve)^5qa7jbx3RfY!sM(4ECP-Og*vc%CDO@3EfnX){31*P~N zA5Y4S@&?vF!uLT@mFx!+!1~pwIxOqR^JnF<019C22Mk?*xmfMe4&*{=0Zvo{M5aZN zqdG8NRlBFDenWNnj;-#AH$}>C4&p@GwBWobz%Czpoi9VV-8xb~$?K*DYTe*hXPIOI zy%!O68;jTI0&R4dD=QyeP?>NzN8u2^iM_T{;!nvuY(T15epccsP`0P5y)BnF&THxnItoSN8az+wqzoH+iS__r|XNG976OVeG*frh!bOn1MVh|?DV{CGt+gMW*< zDl2=`*13gXU1SqDn#6_F3%uE13ZJ4sGhsFhIoLH~tHJR}I?PD8$ zP^@VoUDV;nrb?_ZS}giPM0aK3M1XtJ%NB2n@&1t%hMx;T`_x^z=!rNE<>X~1k04qx zc5fQC7ku^xdB|7(sGZAp-thRS;qgwx>z$mWr87bVW(g@WY+o58~*1jiSnV>jHjlpiV<^)3z{ zdUTGA%nfoS54gp7lu^o|Dk31v5Xj(zsnM{wmxn&jqIBMqaJ>5^A5lqD1`z`*_Q9$@}sVm)Z5nO5v ze4-St9A3&$<1buN>7WB4uO*fWY4Y17yga{|^{K#Y*xSi_cp-QSM&HWO$f-CzmE)TN zm;Z^;2ZdJGYc#Mw4+v<;nTRL!uVMk9xtQPI&X7JJ_TNgzgE_!({2|ai`4;cal9@A2 zYz!;wz1of-S>rL!W7BhPZt!Gk>Fd>jLie}l;%})bgQ;JSOf)?Ne6QUc`yos4F-D47 zO(+KhOU7#zP2P`h4l!&19sVxH6_s7=Ts`HEqi5SCPW%@T)S(HVcbTZ`rIF4>xgH^z zim|6-{1S9qx^OK&m@wZo@{#6{&TX2Qj?IJX5`K@T`+-M(S$_<(@k;WM1mc&0M^_xq z_2<~*RWbMuB2WGZRT$gr5(F3X%Q>Fu5IJW!%}Own*i-i2J=?mvoje&&n5%(}&_Mp& zBM*qH#T;|^E*PmVtm!Xm9YJ5QyB`S2V^7F^U&Vj%^R$n7xU^+4SE22$r<~Jjs@r~@ zP)ZuAe81Y2#>d5^sbfT7ePsFuBN`2R3sYSJ3PG21WV-4y@c(6G?xzc}1Mz6> zp13y#Wu-a_)yQN9DZsN>8o`B$h4`q|M>OR5xjE3c$r@18McuwbrtUw}6=wd@xt^5> z+1#EtkLrAi{#>Su@q(TdBeADI4mPLNX}m&xHeokY;o``SgwRD`K241vQy8|%rIFvB z;WTX}R~UX*m}d85le2S~&`$XiKC;-_Wdowf(@Zv!;i!$MyxTr?LB~Id46-_d)fF#Ej6~*0Xf~fu8uFmbpopH>5iZt5xJ=Ro|{*>f+BarIPEIgOm#_iTEwU z!<&FxG8=<+yj?Rn^|s4FKD7NI5@z-G%WAy?%zsPKzBBqD@xU3@&c5bRD@hFC8`a=I zBX@IxB?f3j9mFU*#oA{LX@!-OMHPRB@`I)7l2y-~;g#gJWT|n<9CqIeE7zT0+Nu+C zlMM`^Qn7Kwkj33ybJRgI(v6R-h3U3~U0(NiEFD}*oNxr7zFQ&8l$3cPP3=Y)1ag%h zd$fmQ%rWT-`g8~W>Wt)Sg*w)g-Rg|DIW#>Au29z9ftMv6hui3zIX!8i23c1w>dK&3 zrnKkw{Y9GxB9W)mHW9Ynhj50*u+1b9tqsHO)O#3=GkAzXL7l>%ONFUgFh>q37v-M& z9pyrSGsEoY1>0G8cCU(i@OC;5JwZ(c@tWWLi4djmwY#i>cS0?3z`FXb*#wtUmx__T zaZ7b%f}>m1DKiyz|7`q(Uvx;%bkySS_wSybQqyJZjR--rgD+HOOEHu!*M)Lab?nEsDTa6>Yk*4`Vwk2`-po&T8Urd(k!)f8+#Wl`bcu036Aq~qMY0%hf1zfrz*Y@U^v z3_*!u(zm6WWmMyW;j!sCrgS>y9x6&$gj(MJP1|2kYNt8Bh9!iuySX1O4bcWy64iKz%TW3 ze*&QQjl*8$c40)d>#iwC`1EPaXdUT{g0c zD$JO0kFA0ve-C#BbTzTp6DRjf1=9q?m({C@3S(u?{Zm4P4wT~Pa1z+##FB@gl{YA% zwfdfYX7LrD(A6Fh%h zzF1h%e;+7YmM01Y>@fVP&hhoqxv%J_JmVk)hZKaUv!J7HpJ=#`)n7`juax>XKv8=E zl*zc3VFVSkzmqSqd|vlmr@k+H)8O^GK{kt`kvCOz8OwU@Q`yasJjP)>0a|UsXR2X} zoIv(Vg?&r&{m*k=XH#yTGXG*54|LV4JRK*4ZA#{5 z_lV}oZi>BXj{7VV_c9cMU0bp6GA(b)PKJ=-O~Q(5!R{7Vf_kEuUTE^KDW(oi08qXm zbS5kzpF~90q!uS?l#?}t=RSWnUd2M&SNxXQPX)fgc%$FGK20SX@oH(@dbvvQYNr7Z zm5%Gc51GxNouupavn0AxIeS`28dr_lZ7V^?wqfBNR*4Tm_2CKq%|ELiK0GyP3%D5pB%@Z4P7VPOIqhO>$eam>U(0c1H2sdty)B6#ll3G$~;m)ix{fc(ka~mLnHl}&w{!DcPvweas`ntj0yrt@Iw*`(|%my@| zrz#ZOD&bUP!`Ndx*r?Q+Dyw!%9AK`yXLK%9A6Y0}i+v@=*_>y;{#Un9g27=f@a3TipTRTyN$dqkdVY9s^%;5DAL5VJ7h{{? z;TVh0)sIA8&K`KUD{51Z3YM9gHU~`|9lstQALmz$U#jacy_b+Oz!wP8v)_n$QY<)5 zYd}vi4TlA9TAy6k1xWq;eY`0xcQ~yv{a+=mF+*Qw8f*UrmeKr(ZTi6g0pT(o? z9vv{Q>HfSQD_1IOZ51~+I}f>J%}vXkYYIxLS*o0KnN+(hsdStb>ts1PUstvN`uP5S zIcz&X)?JSAc_n$-{CWH7>3O-ic|n-T^4X^ZQX6GO=kZ_TP5VA}YiG}pc)rGyHV#RL zcomg8xn z&6YWLHJeM>$(n>Zw&BV-A4I5>E>3t;@yB{Xv6!u;1*I=uFYRaXYw0$~=#`8-!z`NMW> znEhLvzX|RLg=JW6r?!ArSZ}eMD+T)ViF;i+lRagooM8CO(15VOEIA>~G)N<1YB*$l z0VKfPMq=*9ch@VbE@B>uQ6W0LH>C$+<<{Wfc~8uOmpf?Q`%#-@s2)Qb;p(wIvaFxJDHV>9z&@n zZ5-5;QU489;2*@USG&8_>AF#E7bJTF>=#oH&;|16;y=h{0QJS}8>)``yKEfpeURc$ zT5UB8vpMwf(UA{OHEHFRlag?TW}}cGS7f(e*|m3cpYR|$Bu&~Iv&(LJW}P{jV&tf5 z&Ao%X&}U;Cvs8=^VbLcy z=jQpL)8M>kP(4#9rR4O(`z+dd&_)%+|;e z)Z2>-p|af6Ln#K$26Xre<+bOkYPz_tx55yZ#4$@+s=&!CWI7yhhKr;9@Z$8u@c)K- zGM@iH)(C#tdP2GRh9k||ZQd#W3)4Q{Pd=hP)5%b!D;InVC9RU7SOX*EA0c z;sVI_njSv66E|pdYID`}9&l@NzI^wO;#cYV71kASrz{KHZGHfWkG9%z(8gN%b~xSV zwU4W`&HdDyv*89C^8iGejH~W;?LnhM)KCZrOw*qj$SX|ch+Qe=%^O;+l9OBKC7#u78BUh}V6d*zail$V53%rCgVj`b ztb@3bWui0@Y=^8g;D%4H{tADx{?NDjs?}*;IcbYO=?J6`KrLzcgS0K5a_trAJ5FIENxJR^ z{M@xtr{cqGZ)82j*Ra^Vf#}sNYOccnIqbl}=ch@|iB#d>duVv(5gA3c&~rpuDdk(+ z@i-1qcc4e>bqF&klh0aqUc^jhyeYfIIG#c&*Pi(bZ&aNklK zv6;g-3lV&n$AbEVUKq&rrWzYq!{W<@K|+MT$&+nAGj87-y)Z;r$Pwwbqf7_}!_sX4mZESH)6|apvUEzDjhU{eAq?sm`YuTJq;zSxlUN%{zc~MHpK$F6ozr#!Ow`aP9 ze@if$L6{$-g;Vu8%2l1Qy@rtDV=c=VvKF0MiaNGk_H0v8GtB~PS9b=ed`si1LlO-+ z^-x6D{#4A$$qOo6cm=oWYQ4jx&d{DjlZMHJg|yl64nZ23L{`zPy8_k-F=~;C}L z)rxR*2kmpYl5<$j_mMF$`nC@wqX)#)9**j5gU+g#M4IhS=RQXWyIo62PTnbGc|qL> zlEiq$YjKY z`A{?RE;L5#uM`765U(?i-6yZ*ucWzy(hYo^zI>#`lz<(eE+q6mYMooj!P(QlVk3S( zu`VBPZPMNjurhd2Vs(uTVPx7%=Ml@VqIasmysVLcs%`^mn1MiT4tGDI=Bcwt;6#mx zl-oPm2s&lhB%5bQuFW4*+usePX4?;sYBeN|R?qN%#uOmzTJC`M+N8Jz zsn+_`_QuW8zuMk9e`tOUQNW0Ll@Y-?xBNUG?V@g2C}Q!G|`#{B7j+-hOgj z7X`DAzv(>+UuGNo2T~V+JtXHIbc;9CgMUWy@r|RQ3U}78s>=XVr&$Co0nK+NR%D#2 z29ipxu_y`e951E}Zr^rk)C6Zxuo)=Z7S!fKU7fJOG21yh_7nD#KPd@M@e}p4CrLXJvw{WB&sl@r(_iC$%vJqEziqevz~d%sR1|bVo7u>4 z0ee#1?^dVt_+klqj8|fu?J;%6i9cZKTvzWt z94`@cutk(chO~}mBvHm1RI2=M3XhvETc_xLR&@-on~0aueY%OiEFm^IyH7l<(b|6s zN^A-4YshG%0U=SB&Lww)xjaut!wX|szKAN>sXtPbZg9`QbFVR(GNaHiV-&{YUvv-F zIG!>~7L%0t&BZQyVT|rBKT#RwqqkctjoHo4kb|XyS1S$Ht(h&9T?MO>N>pJK+^eA$ zw?hXjrK)Y#G8n7&b5-pbsb1sW3SE9f9v27ye$ z`C`M?p-E*iRd_{#98V~XFJaKiHl_3elevclc~Gg0tEp4W>9ctQe;#+ljJMrK=L~z9 zXt7V>iRm~3Bb$zJQ|*p8IrMx@?hH&h{BYCIC9};Mytp^YjL%^p_n}fcG$ZRJFfqqU zssnl$%fsdaa9WU;vK^hWT53k~Szt2p_QsG^#x~VQn7E#MWZmCDaXtLXiT^?kQ3hZ2)(dbX%P0d_9bBu z#u~@8A3Cd7%v~tRQaZnWfd0eccNqIeQy2jVXp!)Ldy`ZCj}|{g11Es3u!DiCf#Lr} zy=JLLsiCf*{Y)`+G|&u$oPw(f7=1$0>|<91hMMP7#(~fN23A;Ls0X3xr@N;6Eum#S zuUKWB-k82ff_N2@zKq@U3oscXgDsP=p8cGe{rpIO7P9nxondkZQYrR4Ihplx?fK$* z^R?wF#^3Y29Rj4fD+jKPjov)uA*jlN8za)+@p1X8UrLX42G6QKCVqL>%Bp{L*$j7z z9j+w#k5sX=fd!BX>@Pc;eHX7EInSD1-i@BHfYWRWj%?kk&MR%6IByZ$Qf(w2^pkI} zzOty@xN60-ZlGp0wh40*t}@oktRQGhxK3Y(!UT!43(10AdQ``AQ5wWA)t>O~RBf%G zk82!Y>5fv13I20s-Fs1K%u^q7z7AA_4Tn#?zKj*2q>d6M8gI$Uf>DyvG?XvFolcT0 zT-ql)_`YxLl7IiKlSQE{i%{F%UMLaJO^Dv?J=*I{cCV0|cb_ej#DWEBp6dB;+{}RE zI3%A3?t2Fpx7FA%VI$=bA#I*&*8f+n@I$6`59tgTg;`iLkQ5yK!JDfG-5Su)el^^u zyD=C*VTyQxZ)sJ!R&FrYSeL4;bS8u-1(#@%%A3_3#zeEAPj+eikD3G#abxNkHs=5b zwh-GJf~YF))h%3(p27l^u0l3`R~wAGuB63Pjtw1Aaui=l;w)1sT68NhCqFQ-V3f&M zwGl|x))ZH&v$N8$5Y5h|lB9=IpeCcrLv&Lnz`KSeVXm(2iD9B$Rvx$h@Pn|&(&{3s z!$}#a9QtUP%G~8hBLdGN);}hz`h%A*uSiT-!+3|rBT>VtVF@?<9-mRwx|9%0lTwKB z;wT`l%8L~9^hDRLP{)MgylR}AO}?&Enz0(mgRczoOCE?NwR9ML2pH@XfFg6BE%Ya& z%8mp1s|6(% zO(y0TKa{rfxv}g>sh+y20Vp)>bjSwcQTT0XM~YEq&#c^-G=)S^(IJgDZDLrxX7Vuu zGd8VrEbXbzm}!|fA%HA9K|-KqF8T1|mep&Zccp|2fZHN{ImDMNqUBoH;-@jMkGgVO zW1R8&;U9)^M_XdSrWHp~aw45X%&JDY9Q<$D|AX~4kR8RnDuYO`<+(`ffFTR1gw<%bbrb?hP$DYv zCPoG~uKdxdSP**D&b zM(@Pzk9H@o0TB)-QI|ClhWk604;9qA5}8lXLL^&WiDDGOy$%G>>oWp7c!Po-W;BN#bmwU`F=e&3 zG7%aS=1Bz^7K;&fC#|r+EQVVMxEC2btMcv430@lZW2uJAA>@Prd2-XY=;20T>J&MOL_uq6(-qvto?=>bv+u z{`HRP9KrE0kWG;Xc}v;#f6ZX215BithZXEqueyU@NTG)u)-?#Xav&}wCyjRWBB5yp zh`lNfYr^^U3yd%<37rtn6nI3HiK<4xuPNpaUhD5&qwZDJ;$QcUeK^O3!ayU)j%F0P z!&CvHDrcB%%PBhkEtfnN70@AjN25wALByl9g^QTSRh-%?ZsF%x(BB}i@R0o?58yH< z_6Hi9T)ljnf#eGQ9$>tusp3NPDhy)`7PVmIi8TFeRwv!u9RF-GKlR{ni|&qP!|3sX zAMot)RpU+VyY8qug3&y~x0fQICdNL?d&CUMx}vJJPPo?Ou{gK^Iy2ggVsQAx#AhRJ@p|F(SN z@o2!l`C+>X?Zo6~h1D*AzmVBz@Psne^eo#lVnlVPs*dn`GWK3PMHxC+hy#q|-gpi8 zo?o~273)_D9jQ|n;VB;Eo1`Txz<8WVK*O~KS>eloBgDo!&StgJvld8 zPf!;rhdhRf)r+@azLNXR6(ZuZeP_xz#WP$q_GU#a_R2Lz92j<>D$Aa2R1v2$=(`fy zR#n85!MQnl-z{!uL8AXOYvhmpXw8D-zzu%>gQ%M4H+?%*CwZ+roSk50)IkawpO}g= zw3p6itSWTmFC*9+iaD)V&R{)uhzL=8MFUxgIw+s*7-nPgv+Iq?Tgpi@GhP3M$y+RZ z{}Z?BNT!|x;~87T5ip*Zm$3!}bs~a2#E)YJ?lDR)$tbB;(44!MAjv_;ats{_@_os4 zYc)kHN2Qli$w9Am?&8&EP;zC5&BmYN{e%#7GdovK2YAM==*A=okCgb7Rgcg~p>4PZ z^__x4r88}a1F9cRUpN5+ooVOf=o>P!ei1tDlB&cWVZRMr+*S_GB@10@Xk5Q!G6+qzx(6gsfE7SH)DDh z_Ix+(IOyd*g9HR{ zpZ^&FaKW$J-vb2%l#TqqslxwxWBMQd-^{_p(eb}`@>Ky=$}4E!+cfx|Zfv^xw+zFW zAf`NQn2>?`IEElW?M)g{z}$H}Gd!0N2kfTDQ5uTr!HG0ek^n#!Xj#&Fd&D9e6 zfJ&vhy(}VeUiCcxSxiMlr?6ZKk@9QWbLN22WuCzC#`|USDD&oHy6qw0XWI*}*Fzhw zw;-1*8{1-jQkctxMAqc#ajm%0ge2p+SP2Bcn*h~YlKU9Qmd{Gc>X-|V`+?%M0h7U1n+eF0Afl-mJ+jU*N4hYmCF3t=a@^G&)68N*vbA1&27oxL|5BvG%g+(%Mi$ zPN^^Aw?rZh{EL^d9h{Y;E*)Jv>L?3=i}I^apnE99Xi2~Rl>VDynrb4Jpij_sK zt0?Dci*BeS=4lHMx>`G`(=koDX%Y~PI9$@9-J}>%J2Y^LPLJPpoEi$sX=3aAAIjb_ zx|40&|Bh{R>~w6~>DabyTOFrkvt!%n*tTuk&Xax4x%ce7&)(;MpBl*+Rc}6P)?BDn z^_%lM#quPz?j4I4Be)%nI-UEB8wJ0(*d>pr+Ft>pLRZlZPVu91vk4h}4IhmrpdXWs zprp`XPU)I8TbeH2<`DvN746DVlWn|+ldj+_*%o9g`24-9p-@tSS8(ZD&K>*EfYEea zs-}Sig4ZFMaDR%{l#3RL?*qSz9r^&OW!ShVJ?qD@iA7c$uR(rFe55~h_ed5LFeyse z=uW)&1s!rreqk_-LhUUsk-;sNn7H!ddBTVaezCqNi}Ls?Tig7KGg??Qec3k3bR42sfxdk<<8o{q*i^3=et$9Qh+m*ovlUNv5)KjP)HY#H}Kpl$12XRD=X6(EQ3HowekMEi7;S=eV zT3?^!Afjfac+_!=!<;9EO&+LhohO!cAIiX;b++y$74Bo538?fnhAPw2AF4k1PC2?^ zH~8ns#PwlqvdppP44N_-na?H1*vtp2zB5v;rl9T=VF|LEa zy$5dYNZlY5;QgouK`bMNm%_FZU|z09!71u9_sBnkoS%g9sQYqqc;Fs6vh|A+8b}t1 z3)jf#Yh9Idlbz;{cHo=eBD125ezxN}q-AuwrP2`y?q<E;VkuOkr5q#FU8!P0+I7Nkp7S+)3mqw<7Cb*Di>`2R27~~4tXd(iyt{d?S!|u4! z9JcFM^u#zm8X}075nUoa&K%ZZ`OXFTJ^bFmj2gI{_OMoM?FK^LBj|+pCPM8Yz)5wm zHA{)B@=6Wn?+1vwzl85qVrq^;(#}v8C4%ndEZ4%X@tfHsVcaoX@N{Z}P2G}nbITS6 z=wM*KY?sLmoE;j#1b6M`@X8>H-~MuYSC8acRoaRKiFrXVoL5;(c+Fu#H7iA#=mIb| z9-SlmS;DEB2VyhB9Jrl4eKu2Jt%378tod3(I(bB=bs`DnSdYATaw$0*mQMu1*j>4Q z)G5{=w%;hTn(VulQI(19yb>Rv=ZIiJLOO2}^lL!ca02UPh!zIq zCVE_p9`=g?>*Zoy)Q@I7bfXs}FV7U*4goJMBe!=;Z5HKy&mu>!=rpg(_(6wBMyJY} zABADwv>l|2Xg6K=ExH~b@QZU=5gUTpzN>R=p|BBq`yfA8+ftnzm{oWf!;I49v2hE` z=Rma4h2;#)wqVqq8TouM!fEMRX=~nnQoi0%!d#WUYP>Qh7FX61djWe~N|9VLADg8^ zdiaOBBm28X96eK0TsR>;SjFCHVHLp6()EmYIW7f~$LE${!P`4Qiuj{+8W{&HfPE&M zCI(SlWU=`k;siW4tnQEOc9D_;fzST>EcED9s)uC5VY3#(EPSoY@{$yu zLvu>WiUldSNU9I>LVDF)r4#17sFSKYhTHR1P2e&Wx*If3wg)tV#rwce9Uz`tP_F~_ zC+_{yVMKNms}@Ed$GT(w5@~Nx3SK5b`F-10y$(-OxCp%r#@0c-j2l(jgvOR7w0mlT zC1;OVjWA2Jo3H^;3fxB?)LTLGtAVl?UIH#&1F1*$lfyL61|R+^o9g|ySla%|D%6gB z!Aq=moDQSCN1TuB4_x3!V8~}8$Y*4l?TOK<#-j5M*(sl|Yd$+f4=(aA@bXVGt$sdw zNFV)Cmn`04D_n0CQu}r@J-f9>mBO1iR74L{D^749AN+TmMev*A0A4mksv~JS4L>$0 z|EX|vK2VnN{Hdf)gYe(>Qlx+Tg-yWB(Mr!&P|v{hU!|1tm8}$zRZzUGk&v{%fPjSI zmtPQL5ti3efL(&}=K|Kt$!e5K)JT1am0Go=T3o>BaC}C7Rx)|r2InM_eaYS_bT078 z`N%cU`RP$BM3$W)J#>1$$tU{l$ zw-siw7d)YE-9;vaew2(zV zq*vH)J~T(m8FnRu`5LtraE_N?Qk5=|Bn)+BuO)yFS*KD}!nmDk^4pX86!Y~-n68-? zdcEZcP9cIcF;a}0U#Aeg0hn|KSn8HYQV`Ce@_w;K%n}Jg^*4zh@y=$GCGs6X%5@N@ zy0H6_`E)iM3*k?#1!@6Z@{i}_z}DmX*Kb2Udt@}5lzDp*;g8T2tw|JAb`F){lb3zRz0&J2bjba0sXk$i0Yl%ohy`FxfHb3Iq`#gh2#3j-b;w|#f z*rjkU_y?#^E)+uMy53}npXhV8(4}L`T7GIMrgbgE!ydJovGt-yjt&HRm-PZVfoOcKz|NBj$rc-eAM? zz_p;zgTYl~RkhNtu%KdA(HR|vG!h3nhF4AT=VokC^q5jg5qvId93bQGKAQxq2SKkc z@S*x*=OEx9sS15zaV&*YOELGboQrx#eQy-aW8XeDd?8FBS6DJaTjgld_7K_^nP!eR zO=Us#X{Vmtn3%GnRHAJN+Mgx|e_%DmGG8nmbFa)QoI7z&j(dP_oD+27RY};`oSwpz z=@qVbe8=^AfO5a{L%sDX)O5L72X@01M#mqP6q>K#$WZ-N6+9FW zdoO=YZie@jw|;k4;)DCmaJDIVDtO-ZQZ$0Kx_QyaK;W#B4@~kOlb# z5@$GTpov3J;}m1<4Qi7|86MlH#sI_(JA;kimI%F9OdwJrRZ%xeSz*4jU#)iq$`bqH zGUVZk^}7rC6UG6=LLDhEa+nB&%1IfRI$MuB{P1ZCO4IoTx{8;S zOQ)S>#Z|0P_qb~7Voi0Y`Xq_*{w%bkk`g@AsP}NNkC{UX=^KtD5A~jnveQO(Cl|%C zpU2Ob=gxgOvZhPt_+tkad@8M%1}%mM?9aG6MeSkGw9zP{JY8v1Xs$ZCkx^JcCqHlr z9zigjRvX*jZdBAX_&!s}!hD%H4Rf&6;PQk~pxHvWJk;@R)a-YxJK6WQPL2CqE)n(C z?jDQGVc?s=J}7U4qK{vs>?7TbuLyD%8I;K3+vLG?axD$W@f1$oBx7u;{gf6REX9XD z>cCn!0N^1G2|6MxA@9>*0l+PU;JW$UfICb2?*PCyPt2@&iDay!Rs?agvc@BqCd`2m z6x#*%vNCvHKl*P%tA*{k)b9=@6oc4WOCJq2RA{u6r-7qFWv)_EA^6962a>u9I{xwV ziH4UPSqLZq06Fx3Tiid3>HUp-ovgi)p^>qfwUMC!zl_2^Uza1IbtDAn(fc!>8gG-0 zJ{XAzsM-$s8Uv&G@m0SBv1*Swkd)6FSddo9%!rUde5ZK@@G3f7i_iK6w({#??dJX7 zQfDI*89-!FjIg`v02DY0-V0Uqg8;?+G)Vn^jqnGcw_MKx7G)FBlg)+nE4lO8{jRE0T~M{4CbR%SD+&v^ z`RXo&vmovu(L!TSYj)LMB*B9GW*46>5k|pcWdsVDbcr~skG79VPpGhf@a}Mkv%~5- z67o`c-0b9{U0%8e;|Ybj0!yc)c;P&=Mi!+m{(gBRRlY>@QS{X63hK1F1eaaY3TbUR zlWmJV;Iv9dr213PlRTj^uj6vncE+>xs~hDJ7}phbir0ViU&cP(^>3x}Q2tP|?ayUS zzW#0h3EEgYIO}yTx(F@f#447#iT7>h;*Y0b+Rg`%$6snJ6-Oo(FKq|=`@5@gw;O0aAA&*}Or_Hn zP+GY8;1T#3GBc*0Z19C55pG}lV5y~y)uIiP>#`=Fy)QK;L;MY=tAby)$P|i}4Ii#kCS#+F38ft0)nZ{LFT9Jx<1a!d{uqJ-G7 z>G`(ZUdrBJ_B^_31gt_8Irx=bpUG>ify>&hFQjym-R*lHU|=F_sZCRV!w@CymAq-T zk;c;lTGMt#kJdRPw@6>A-aF~Mj7RY_+7g?O(qJo-T*{5*2Ih5m=*zb|eqskf8-|u8(DhuB)kvir_ z>J?FAO3lFTuv#up6m7}G;|-q~5;FAiw2w$xoyO<}u3O9F36mi@)Kmn8{;L*Za6%oZooXWPfm{!)9yBj^Bxk{psotn!iQEv7o8W0`#Kb3 z9h#{h+T@uJ5>KA8VLqy1I^=sEO4lNn%tH%XSh2i8yfLrjo(lFj)}rm88;Px;8!?_} z?W9jUuPM9Wmj|&OzIfBQ3Ofw=a*CZ z)HyYCbo(EL(+GJh8DxG0??g^_d+a)8OF+3^W$J+u;SO_2m@Zv;<`8`#ywUp>Gqg$% zS6Zn@H4-LF-hb9pttXo%u^l=cJ?FX^J>z=0S$Mz$z%`iZ0_hP)e*mgj7Nc6pbcjg@ zaU;pyd^-2AXW%U6wbx~gk95rhM^wq!lsXX&Nbv^}eA+l#(Ij6F1L<+h6uG03`$kA0 zdZWLG45lLJPI%IP_JQc3MyM2w5cw^yM)0V|;i){N@Cc)eUdENysL774LS(C0k-?*X z(lWe2L?hA}qo<{1Lf59xiXPPbq^pY=XYG~_R7FGye&*7#Zc`7emWFEeTDBL-e{OQG zuRw9zY26}pcP-N`A zw-WDHvD0+OyDM=64z{M{tp1XAv;#3RZBehTrH+r<;%ug5E7Wgx;!@fv!CQJbUom^_ z(v4x(CGv&zpF>ex%sRg;5ueJdl>$VQ!iJNAh8I4~2xj6_<_I00pqx#5$G+xtu<$ME z;OUNUpl5B-kQ%Hx)XqSX^rtPdu#Ve?y@MlcN;(Dmnos{Oy# zbp5{!BZhx{lvmV}ndL*_c2R3Mo!&D5JiltyJdc)wYO89Q2o(fG(y!x$Ig@Trn4kfESPxS&%r6#B|vWIHZQ~cs z8eib4wfj_s`EpYP&Cdm8z4%*_MJ#!DcWMN^!$2~|eYp0QSrrD>2AL2G$1{6T{F_twCT6MQYrQtu z^*Azgq||mT7&l~}e2=dnLp2#PVh$ zwFEy*=kbmNeA@x{0pJ~G^Y|jX3__EVv6Nx*vpK_L!sqP~aub7vT9S_HMXzyOi4w}_ zM1ms6n_J3Ic4Pg6PnzWI*a4bE@G9WJm3y;9%V&WL(OaKjK=#?iJ({8~%}+P^_$q6e zV3Up&wRyjrG`BO|R@imFRkyP2;0D2r*?ZXSGCnB&1}OJDKBi-*!q_1IKJ zVhDUN`-hxYRe1bw)X5Qzq=dtRnT-4`k&LVJ@&N|p5K>4n7-R@1Ej|~(EYZUil+S%a z?CbYmEPO*+c)Igz=vk-ZX~3h+8&#LgrOh&>8FR7yqdmZ3*kQ#;60{bbqypEwfl0EKv>0yA57 z=6d*C0ek-I3i$V1_5Xd4{&OUiYkum{&CT&1j9(j*&=M1aNdoDi#)|2KAjV`N;m7DA z#aE$Ec1Lr?#tccOr&Kj9m`ah#~)Ml2~jht@3mBCq>U-X?TQ?`?@S_9TsatHJY>mjfX^I%8L zF$ECS>|bE0G6B$-S^4$;nBh7k_ti0_-3s`{Im-xqty4RRI}v{cq?@vU3n|hwG?T2k zhe}!9L^rSZ)HP{G;x=e8>3GS)_p&XU1APrU$y7o|E*h88dcy?3u3#h&m%_lYo=12+ zdVgBY$HkWv-Q}Sr%TRcFex7|P%RY82zcyDODRagoA1d;fpRS^<(w+^ zm*+}#8YS>>g>(X*(9Gr}DSI%qOaIPGIIwLLD($*dy(iUU3Qra=ktfzx2MKjv$52N6 z^=BAjBwRjl7_M`vkj%$C`3kNGM67a+P<2`P?DmM~~d>)1>nz?Sa~ z7`LJPT^o^WBwAuBU4j|W#xlky^FPbSvP+LJ{dqvwBRN2m9jU!A>5EuBGRReVQ2Iiq z+oic4YW>s6f#Yi$V7_eoLT^Llh_I+Z*a=ogr4JDAqQIK)XPtg&nai4hN3uGZ7n(k1 zG2>hVn^(vYJ~V|BAw;@Gs7nMngln0}qQ&Qj8Mh)?6Lul$wTgYMa|A}`;~N?GVRxim zGnquoZs9MU$)lZ0^2;hji?JP_dK$4UUQdAO3W5!FxkIAwhv|8X4f`t4zaZ)E+a5_| z3tV6(0zo|XRDZ2IY#gx<&SEI)i4;eIKBHSLde`JqEC%6W$h=&5!=@vm*!vHZM1I<=*C7rX zrQs;aXZkh}1>edOu~2DL!Cr(cylELJ_Y`k1-v0UcyaRY-;UFk_WbM^u1VCYC77zgM zKyR~2+UOLKWrOL;!v#7)jRDC*7^3dngl>z&Vz2@Y{qnXmEtbUa-JLV%CQ6JH>sb%c zy(th+;9`KU8g4Di8z>Dd3uV0`)D#*IN2Uk8WZpK@8n+Ev&-23WEdoU8W|K-Cp1~wR zY9g?RHBk z7c;zhg^#4NiL6Yb=AN1FR?|L3aH|ra8(1D;@qt<%A)^_u0NL2q!NBW)wHw^%~OIm#?nhXU$5fQJiEr| zH00oq#DHN}I?J-%4JFx=YwxNG{hqA>#1&fj9gjy^1x&DbMtKQYVzGb+zsjg>%Cx1x zpn}egD+#hrJg(4gF67tLcJp?d+|g~Y8jrq7v|I)K1cD+&os@{v{-HkCqSo_NX9P;T z3Z^Gg%MKCKfPx8#>z7Qbl4SDM48qpz1DCJe8TL~Eu(MwqzOBIW+>!Z?!CZ3jX!%O9 zHd)K+wIG=Q9qygLYJ*T4nrimw;EG!^HTzBQjhP;eAh_xnJyqE`H`PwteZ2}`kEr7@ zzNGG%|2Zqw6RRg48J{vD_0FaPcmY!`6T*Q5R69ODJa0u3 z_$Utf9?`Ro-h?DZj=?D)W-3(<|HB6cT5UO4kjzH^8kz1{g3$ z$T?1KPC_{?6p$v}lYkq471)StiH=5=m_g_>Za2No@Z8{2XQN1tAkqx_i5lf3@B=c# zRFN&U{dDj=9#4QX519}?Pj!{_vvr{L4RowGfQkb7#pok43`ND!1>LQV8yUi7T)U?sy z!ds2SEBfk0|5D#i>a{-aR(UTTqWuxIyNG^^xOC+Zr?aI4ff%FOjoFk6co@jAGpnLc zmQ!$-jgE_)3iqSkIa-(+$I*)gK)a)(%6|##70Z7^sQG8J@wJVUYGXqH@=$=~bK8*3 zkRnYT*n&+p%LotN2Oyv;@HgbMr%)_`t&pyZf@KcybzQ)=o(nM{;V3$eAH)QQIPX7H zSMnL$@sOs~zo1NBgT?TDO3!CmI6UgSws(CzX7M4FRE`wJ@+>kMf(tx&BC6#sB)Ae zPHI_7)y$#P-(!5j_t7O|V%-U9{0J1C4Y3%8CsOiGu$VqEN0}+R?$?uO?Ex&lEA>>; zEt(=v8Z=g*5myoF5mP{=s1r1HFi=o1uz2gvr~aWn6T~&0y^PKL4acIWy2$UHk~_IX zH9^$ZVLoLXr+t+J=$)vzBU?q=O+2q*cT9h2%gBgyGw^63uq)e1>zG=vL|W7g%{hOv zFG04t$hD@pzm)vByjK*UX8Z*u^%p>DGf27`_$uqHBU=`QNouT-SWkocA|8`cek8;i z7H9WWfF@i&;g)lr`rJAJ$b7OR6@((=Y-o^x%x8_%?SN;s5R5&+kaX(G`nt_ijUYg^ zW{zFPM$Wpa={Q&p^mJRpX>c1p^w6N)avg7RWQMix|g;F=sKBIR&o_^-+go5Z7tT67f025vb|sxFUy&h7=2nnw>#P zl0+?>Ow*woDndjId*l_yR2+ogP14L$G(la7lWk-#9HyrE7Nu0pBAo(Q1M)*-&?={Y93~SX%!>zY51knb}10htmX4ZDV zATTghQ>*D?Srj?_sRd25Nn)S{4sEFD z!t&k5GEd5OHWpHEld4eQxXmvvb}r?X%)J%vCN!)!6=2nh8^OYYgKo(IT<-ohLGp4w zR|(33oWuEj67%&~uYN){sxubOzf&=47*!}skWAcKYZlp=HeEDt!>cfmYYT$#%UgjV z^Ly1PzOd7+XvjAqnKvO)B6EH&W+w!>CT^!YY}uDN7Z@je!8)}x$-6RlI6qwXkz^@B zTAY49dHGn)C#^Vfv-DNm+grnTO|mqUm5Gcv9*&Jd?Yg)?MrJ$4>#<%_8)78gj#s1s z6X6vDoO#Qpnu+tt+l%mSiM{+1&Q(MH()Pt1S%$pe^JH%_xiZeO4Y*R(D9Lnuylc+< zs#iX85*>qU=7Nr&rm`5O7IP(4aaTpRO3PQQX^wHd)P&(vzoLRr+{5^iEA6&lqgjlj5bo9nfHa zRZ_$7?b0p)l5>$v$ z*`SZ>^RHH(iFZ>uIJ*|b=ea>8h0f89$Hg{h-CI|D92w)CH?FCGe2l*K-_(`j>g#F! z=2-c|sTZAC?rC%F&GRWdGlff;)C`#PNT*U3MO2*>7?riucfam3U&D3L$FFpvU^xbP z#PCaeL@;`HN`$`ad!l_K^-nn4T}U?#S{_FMdp1>*J%oc=gZimd!krJ}EuUE60web1 zg8OPm?Of(>Qy%zHS13$+i!Ep!2RB5^hGUN{&Q;f)ZJ0m0qgFzWp;2XzmjUcn0e3%@ z%A>v_b5;sg<`xf!m@z4jrpnDL*prVkznzx*U=L}VE`!Br3n6UepM@s$Os39`E>(c& zBnUhO6Pm zzt)m=*7WB4Tf8ZSsv0}GgdfYwSZ56=y(4A2PP|_+!hJ2q1h(q>m$CwSRDhX4Gsy)G z7-f(?MJO61#W%+x>lRDih&~fuFRn*AuW8|`R}#9H6fL$xzdp(A6KsxQU%x|!QET7> zl`amR&^wFHt@^5+69&@~ThmmiVP261PNt{9J@$#LlU4jvuoikwB#?(mqb2cHKmcoO z6v%5whN~VgYkPq7NbZ^-S#`(?>+`}DyaEqRrd~qpK!S}#KuadqwGuzC!1iN+6L7kz z6-~f^o{1I}>r1pLn*eZ^O;@w~*>QT=2%J9xHL>$8DPtgGx-AN5($Jf6)q#>-5b zDKqGay$;xo(gsPmV|>dx(u24}4AI9U?8~KV8DJh8 zu{<pXi;+NwvOeU{R)wB4K(;8fi5L;^zMs?f8S4@XLe#b zYtAupXS^&scQuv*XWi3SZujiP3@?OOdq6MH>&sG6$}xz=NwkxCzK3?Hxx0El_6Smi=>QWt(h1BkX5>C~Lo+j!g8D_-%f4dQUv~k zvmG_7uHlm7Hm+Zp2Zq3z-v!#mf#H`|W;$=MH_@*&*%GE5wiRjU4p#=+J>Qpz787%ZelEE^2Cc~;yLO$^wAVXQ~!aCMelmG#Dgsyjn5 z0sZK+qgH~FH=7rIw1W_U;7~9!N^dykpA6tyok;hU&$d#;0#Xxx|w?= zPp1j|UfERweb{)Z4F2{h8B9yQYw_~LD3yS}(?879p5JV4;($t+t^kJ8Db#3^2-u3T zyd*$^AF&Tz?T&cZoE*6~!f;4Fr6?*IyTP+c^D%`{)CBBcU+PQqqk}FQQ5{zIawJW6 zl-(`kVqS6FWpoYPA(-TRZ2l@CYp( zGX>gwY7t_M1=Q{H$=?t}2xmD%&a3$OGrxXShmHgjFLyH2USMw>K2$T6JeqQN<+8;S zlzP<~T#F#N0P)5w#l7up9yg_8zJ8#q8S!V|9eRtF^zWGPTqO{~@7W}UUGD+gh!X3v z6*UjxueA(*z`KOU8EL_LbkZB3J3_Jf*Fx3W2U;~QnIM7lm+ z2NC~!)R>ZO0Pp>d+>+ta2 zkp%)GsFO0xb#%Z;Jdp9Qj)b*OHqVJt-x^d7fD_~Uq1MtfKgK^gO@rF&o7S&L<5nf) z$PTC)Jvg840(v&gwIT=zb6LiP*>$51V;98?4EswTFNN?f< z9JmyRZHz?QI;nThMFto-R?rl4DOQN-AUmmns@L`N#PgC$?M^46m63 zdE#br`oEdW-|%?nmY2v%t(6v>$syCN6;deYD}xj3iOhERxA*`Jbm*OY_$lE9NO_9R zg)s~-q>M|IzJgCGJxAW7Qz*}6@o2U0M=ab*iK&oSA83o?`1pzk=ICZ}WXopcg>vA| zu*eO-Pv++5PZm<(MJRphbQlL6lX5b#xl;hQ#68KtwbW*m`hU-Y_231?hEW^y$CR@E z%p6e?%~g^Edjw(@q3i*S+E!kFN0HZOpVHQq8D(LUu6ZcEr6hk2HIYdj36-=J;KQ=Rzmip;{QO5F+ zoCqTnNR1#GsieeG1Vhof9&F6~Z{s*bzk+oTY@10TPwma(JPCYin|J#XE5q@7KuwMZ zCYqbYb1(y2d1Ls`pw(bV||S z93WDZJvgY-ka{U+NtF}DL4s^4odF^;yxjQ--fvD+5YoxBl`MvVy!Ak?D&5k`{K*F} z<_lKA&I*xG7Vn-_=Qs5BW=vXesX82$QC}o(Q%~%^R}GZ<+g5|ixeD;EtuODV5W|NK zXot>!tCl;xEA(e5G3_;zQRgYlX~lBv$s6~dUXVvPohx$YP*SVov&v%R8|c&;+;+s* zJe{N>N;9U#RB+?p^J_#ojy}uByrj}w+#J*Ww@Rw!ii=z9;tYnJ4BxMseOf+I`~%j%+(?rI=TdM}ADfA+42hPs?h|Q|dM- zQuBoU?KGb57&sLu*6|Wz5MBt|9+$Ye;v3X0EkwiE-RF~gvi|u|Unj<8UvnZ)A09}} zw2QbI?7j()Z%=!dn&F)N*1f+x%*rg20Cd&Bw_Z{!3f%*E`^e-7#7W{?Sw^vuX`!Y@ zHxy^Z0unB8h4o~jaZ(bEo17uvPr`5g$Z@fTECMzxXC3x5wOFsvnzh`i=fhdiu(U@C ztk#9GVhmM79T}2O_9G=$xbvDIcpV3mQP6YugfbnmrDtW0vB%Dr4&c|b8JD}i5Y^6w z-<#kQZ;e!^Rpi81;fF8sn$6MXO4l%yXQTJ40S_#3(b&1%i=@|bS3vNp((_gVrao)Q zT5XJh4c-y#Wr_VP(Peokq2*|$ap<;c_kdbGZ0EU4@V?uuFO0-;Wi>UKx9MhmVet1@ zZoHWje2%n6d3-LgHhV3RIdj^ynVRhy261PsSx`|gP~^>fuB1?m63%s4HCTf;7VZ?m zPxG1_$gQdyV1Vk3W$H%)&joLIZhB5^HyKfpA!}9>KFDg1P=aiiDK4B@KzHuj0Y;rT zm76eOE<7ghoi1doq@R6=ugmtn1HRK#mlrp{>(Jo#@$E+`!TVBz_I!lYY`I$MJu5R| zK)}h0%h&V>w^wYEy?anwdZ6F=QSCky1i$v{?#E~Ga15=VPV0kaJG(Q7sb@6yyvHdg z%-JN#plFPF5vy8TTh?nvB7}B~OrFd(ix}`tsD4gsBk* z)ZdphF-{G&d!Ti^Bp)Al(YGMy`qTU9v{hdw#wHCuLrW@#-9os(QS(J3#^$x{I;g$C zbhZpVW4^o5Tz9(5_T` zFi4cHAwa>0Y}Y5}nmJQxR9escsl7LHI1yb31o3cB{_`0=vTr*l1V_xlTFyt6!NdUX zK9RqIWWhx~BHmxA>xc*zd$f)pj;$&)P0Y-YCmeoK-^W!HP|o7DzW*~Dt&5zX@#eE) zBZm0z!%-n3I|M#s-2eCZ`^o!3{GQJw5<-ZI=l6-(Ybuw;URzE~(9d`FH-cx=_Vp_(xL2uL*et0YK?v_n#$-BwF|vX}0kXa^nJ!BaV;7f$_hI1`H3o$cgCH1Y%gwz$ zKf44$GJ@z)$$ol%NF2X3B2oNE5l64W2FgRd!J4ccOvy;oxQ(s^g;BFZht3_ZS6r4p z7R5xiIUI=fo`FvtWeX}k| zL?|Px@+P*L0=atq38+CV@<^st9TOP_Ye480@sW|qTBjPT<}e+bEYwD1!puqxr=A|2 zR0hx1hvzu8wppJTl)9J{B2H#CGZBx&N+iwZ_X#c2VI@lDR`x%DV@|me4D**_E z0`Si$?8ZnXp&B2cbF9ySkMa4B0`M89_=iJESdpJvO!^zG6u-3CH(>=u8mVvZ!+)eG zhD!-K`Z!wX@d5xabpZhU7J~NgL+|s{z{ZMJ&)U%5=2O(h$;jS~mS5k&(O%EMkzek& z%YO!>{ob(OkOnj#NJ*dZZf>9PZaDwueV(E6{T1@Rpl&J1zs-N%njg$(rqUl!5Bz_D z(sOb&rR6s;uyL|>6#caOe}vusY#}@F1>n{vcKb8=iTV#%Vv)bYirCngSQ`D4O01~o zVDZ;CfB(G|V(k+v`FZDLe?aR>{$J4lN&PM29)4JqFZ9!;8lPi<>JQX7)xV$`=vi9o z>ls+kiv70W$=H4>-C6%D(dYNBfQ?WRQh|}ce*PrCe0CPgAIQ$?|Bd{=1HoL+Rq$WU z{ZF9(pW6Ui7e3aI`>e*>^f}J{(8jFh|KB$L+CQO@m0f9{vM(O!006(`to{3lsraug zd|I#IsORYP7vA~J?~5mmcvGLSj86|y{u}yv7Vvp5|1mrM*YAq0Tm zpZYhhZhtp*egg|er8wYzg8BbrBogocH}L=4WV=`kCOC*zaTpp**lvV z7|}}U*;^PnD*W?`_@Ac#h0}k_j2i(I>4QT70MMuX^DHvG{J*yF*X~BT=(j-l^vIXb zMTO)K-8l&Y_@Cp%=`%5gR>esFAJg-%X3cM&{(TK=;y*B%!2e&&zqa!CWh@B)K(s>o zJL2yvVgG(!|7PLuB{=`cYo+)*-tS9c{F(QA@uokn_Ocv*$NLKz&p%^-uVe5>M;Z(L z9rlkpP=6-=K6&=H9DsixHBx^^{0}vRKSO_?(fP+UEK1?;pnsKx`+M$hqyG1KTz`DR z%P9RF_fOfOzeoPo@xRaM`Q!aptNk7Ff1}v{ZoL0K<>HUfM~(kC^k2zAf421ZvG@Pq zPz_xdN7zv4-VJm^k-H+OA^IzUprM#q6V!*PKx*irrcs9$Tt=eyXac-h*+A(~4hZGB M7#K|3fu%G90MpkbJ^%m! literal 0 HcmV?d00001 diff --git a/docs-android/app/src/main/AndroidManifest.xml b/docs-android/app/src/main/AndroidManifest.xml index 86960760..62370917 100644 --- a/docs-android/app/src/main/AndroidManifest.xml +++ b/docs-android/app/src/main/AndroidManifest.xml @@ -2,27 +2,31 @@ + + + + + - + - + android:name=".activity.MainActivity" + android:label="@string/app_name" + android:logo="@drawable/ic_launcher" + android:launchMode="singleTop"> diff --git a/docs-android/app/src/main/java/com/sismics/docs/DocDetailActivity.java b/docs-android/app/src/main/java/com/sismics/docs/DocDetailActivity.java deleted file mode 100644 index 0ba834eb..00000000 --- a/docs-android/app/src/main/java/com/sismics/docs/DocDetailActivity.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.sismics.docs; - -import android.content.Intent; -import android.os.Bundle; -import android.support.v4.app.FragmentActivity; -import android.support.v4.app.NavUtils; -import android.view.MenuItem; - -/** - * An activity representing a single Doc detail screen. This - * activity is only used on handset devices. On tablet-size devices, - * item details are presented side-by-side with a list of items - * in a {@link DocListActivity}. - *

- * This activity is mostly just a 'shell' activity containing nothing - * more than a {@link DocDetailFragment}. - */ -public class DocDetailActivity extends FragmentActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_doc_detail); - - // Show the Up button in the action bar. - getActionBar().setDisplayHomeAsUpEnabled(true); - - // savedInstanceState is non-null when there is fragment state - // saved from previous configurations of this activity - // (e.g. when rotating the screen from portrait to landscape). - // In this case, the fragment will automatically be re-added - // to its container so we don't need to manually add it. - // For more information, see the Fragments API guide at: - // - // http://developer.android.com/guide/components/fragments.html - // - if (savedInstanceState == null) { - // Create the detail fragment and add it to the activity - // using a fragment transaction. - Bundle arguments = new Bundle(); - arguments.putString(DocDetailFragment.ARG_ITEM_ID, - getIntent().getStringExtra(DocDetailFragment.ARG_ITEM_ID)); - DocDetailFragment fragment = new DocDetailFragment(); - fragment.setArguments(arguments); - getSupportFragmentManager().beginTransaction() - .add(R.id.doc_detail_container, fragment) - .commit(); - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int id = item.getItemId(); - if (id == android.R.id.home) { - // This ID represents the Home or Up button. In the case of this - // activity, the Up button is shown. Use NavUtils to allow users - // to navigate up one level in the application structure. For - // more details, see the Navigation pattern on Android Design: - // - // http://developer.android.com/design/patterns/navigation.html#up-vs-back - // - NavUtils.navigateUpTo(this, new Intent(this, DocListActivity.class)); - return true; - } - return super.onOptionsItemSelected(item); - } -} diff --git a/docs-android/app/src/main/java/com/sismics/docs/DocDetailFragment.java b/docs-android/app/src/main/java/com/sismics/docs/DocDetailFragment.java deleted file mode 100644 index eae4abb4..00000000 --- a/docs-android/app/src/main/java/com/sismics/docs/DocDetailFragment.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.sismics.docs; - -import android.os.Bundle; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import com.sismics.docs.dummy.DummyContent; - -/** - * A fragment representing a single Doc detail screen. - * This fragment is either contained in a {@link DocListActivity} - * in two-pane mode (on tablets) or a {@link DocDetailActivity} - * on handsets. - */ -public class DocDetailFragment extends Fragment { - /** - * The fragment argument representing the item ID that this fragment - * represents. - */ - public static final String ARG_ITEM_ID = "item_id"; - - /** - * The dummy content this fragment is presenting. - */ - private DummyContent.DummyItem mItem; - - /** - * Mandatory empty constructor for the fragment manager to instantiate the - * fragment (e.g. upon screen orientation changes). - */ - public DocDetailFragment() { - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - if (getArguments().containsKey(ARG_ITEM_ID)) { - // Load the dummy content specified by the fragment - // arguments. In a real-world scenario, use a Loader - // to load content from a content provider. - mItem = DummyContent.ITEM_MAP.get(getArguments().getString(ARG_ITEM_ID)); - } - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { - View rootView = inflater.inflate(R.layout.fragment_doc_detail, container, false); - - // Show the dummy content as text in a TextView. - if (mItem != null) { - ((TextView) rootView.findViewById(R.id.doc_detail)).setText(mItem.content); - } - - return rootView; - } -} diff --git a/docs-android/app/src/main/java/com/sismics/docs/DocListActivity.java b/docs-android/app/src/main/java/com/sismics/docs/DocListActivity.java deleted file mode 100644 index 6e0a15a8..00000000 --- a/docs-android/app/src/main/java/com/sismics/docs/DocListActivity.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.sismics.docs; - -import android.content.Intent; -import android.os.Bundle; -import android.support.v4.app.FragmentActivity; - - -/** - * An activity representing a list of Docs. This activity - * has different presentations for handset and tablet-size devices. On - * handsets, the activity presents a list of items, which when touched, - * lead to a {@link DocDetailActivity} representing - * item details. On tablets, the activity presents the list of items and - * item details side-by-side using two vertical panes. - *

- * The activity makes heavy use of fragments. The list of items is a - * {@link DocListFragment} and the item details - * (if present) is a {@link DocDetailFragment}. - *

- * This activity also implements the required - * {@link DocListFragment.Callbacks} interface - * to listen for item selections. - */ -public class DocListActivity extends FragmentActivity - implements DocListFragment.Callbacks { - - /** - * Whether or not the activity is in two-pane mode, i.e. running on a tablet - * device. - */ - private boolean mTwoPane; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_doc_list); - - if (findViewById(R.id.doc_detail_container) != null) { - // The detail container view will be present only in the - // large-screen layouts (res/values-large and - // res/values-sw600dp). If this view is present, then the - // activity should be in two-pane mode. - mTwoPane = true; - - // In two-pane mode, list items should be given the - // 'activated' state when touched. - ((DocListFragment) getSupportFragmentManager() - .findFragmentById(R.id.doc_list)) - .setActivateOnItemClick(true); - } - - // TODO: If exposing deep links into your app, handle intents here. - } - - /** - * Callback method from {@link DocListFragment.Callbacks} - * indicating that the item with the given ID was selected. - */ - @Override - public void onItemSelected(String id) { - if (mTwoPane) { - // In two-pane mode, show the detail view in this activity by - // adding or replacing the detail fragment using a - // fragment transaction. - Bundle arguments = new Bundle(); - arguments.putString(DocDetailFragment.ARG_ITEM_ID, id); - DocDetailFragment fragment = new DocDetailFragment(); - fragment.setArguments(arguments); - getSupportFragmentManager().beginTransaction() - .replace(R.id.doc_detail_container, fragment) - .commit(); - - } else { - // In single-pane mode, simply start the detail activity - // for the selected item ID. - Intent detailIntent = new Intent(this, DocDetailActivity.class); - detailIntent.putExtra(DocDetailFragment.ARG_ITEM_ID, id); - startActivity(detailIntent); - } - } -} diff --git a/docs-android/app/src/main/java/com/sismics/docs/DocListFragment.java b/docs-android/app/src/main/java/com/sismics/docs/DocListFragment.java deleted file mode 100644 index eac1ab18..00000000 --- a/docs-android/app/src/main/java/com/sismics/docs/DocListFragment.java +++ /dev/null @@ -1,151 +0,0 @@ -package com.sismics.docs; - -import android.app.Activity; -import android.os.Bundle; -import android.support.v4.app.ListFragment; -import android.view.View; -import android.widget.ArrayAdapter; -import android.widget.ListView; - -import com.sismics.docs.dummy.DummyContent; - -/** - * A list fragment representing a list of Docs. This fragment - * also supports tablet devices by allowing list items to be given an - * 'activated' state upon selection. This helps indicate which item is - * currently being viewed in a {@link DocDetailFragment}. - *

- * Activities containing this fragment MUST implement the {@link Callbacks} - * interface. - */ -public class DocListFragment extends ListFragment { - - /** - * The serialization (saved instance state) Bundle key representing the - * activated item position. Only used on tablets. - */ - private static final String STATE_ACTIVATED_POSITION = "activated_position"; - - /** - * The fragment's current callback object, which is notified of list item - * clicks. - */ - private Callbacks mCallbacks = sDummyCallbacks; - - /** - * The current activated item position. Only used on tablets. - */ - private int mActivatedPosition = ListView.INVALID_POSITION; - - /** - * A callback interface that all activities containing this fragment must - * implement. This mechanism allows activities to be notified of item - * selections. - */ - public interface Callbacks { - /** - * Callback for when an item has been selected. - */ - public void onItemSelected(String id); - } - - /** - * A dummy implementation of the {@link Callbacks} interface that does - * nothing. Used only when this fragment is not attached to an activity. - */ - private static Callbacks sDummyCallbacks = new Callbacks() { - @Override - public void onItemSelected(String id) { - } - }; - - /** - * Mandatory empty constructor for the fragment manager to instantiate the - * fragment (e.g. upon screen orientation changes). - */ - public DocListFragment() { - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - // TODO: replace with a real list adapter. - setListAdapter(new ArrayAdapter( - getActivity(), - android.R.layout.simple_list_item_activated_1, - android.R.id.text1, - DummyContent.ITEMS)); - } - - @Override - public void onViewCreated(View view, Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - - // Restore the previously serialized activated item position. - if (savedInstanceState != null - && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { - setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION)); - } - } - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - - // Activities containing this fragment must implement its callbacks. - if (!(activity instanceof Callbacks)) { - throw new IllegalStateException("Activity must implement fragment's callbacks."); - } - - mCallbacks = (Callbacks) activity; - } - - @Override - public void onDetach() { - super.onDetach(); - - // Reset the active callbacks interface to the dummy implementation. - mCallbacks = sDummyCallbacks; - } - - @Override - public void onListItemClick(ListView listView, View view, int position, long id) { - super.onListItemClick(listView, view, position, id); - - // Notify the active callbacks interface (the activity, if the - // fragment is attached to one) that an item has been selected. - mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - if (mActivatedPosition != ListView.INVALID_POSITION) { - // Serialize and persist the activated item position. - outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); - } - } - - /** - * Turns on activate-on-click mode. When this mode is on, list items will be - * given the 'activated' state when touched. - */ - public void setActivateOnItemClick(boolean activateOnItemClick) { - // When setting CHOICE_MODE_SINGLE, ListView will automatically - // give items the 'activated' state when touched. - getListView().setChoiceMode(activateOnItemClick - ? ListView.CHOICE_MODE_SINGLE - : ListView.CHOICE_MODE_NONE); - } - - private void setActivatedPosition(int position) { - if (position == ListView.INVALID_POSITION) { - getListView().setItemChecked(mActivatedPosition, false); - } else { - getListView().setItemChecked(position, true); - } - - mActivatedPosition = position; - } -} diff --git a/docs-android/app/src/main/java/com/sismics/docs/MainApplication.java b/docs-android/app/src/main/java/com/sismics/docs/MainApplication.java new file mode 100644 index 00000000..805ae8a0 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/MainApplication.java @@ -0,0 +1,46 @@ +package com.sismics.docs; + +import android.app.Application; + +import com.androidquery.callback.BitmapAjaxCallback; +import com.sismics.docs.model.application.ApplicationContext; +import com.sismics.docs.util.PreferenceUtil; + +import org.acra.ACRA; +import org.acra.ReportingInteractionMode; +import org.acra.annotation.ReportsCrashes; +import org.acra.sender.HttpSender.Method; +import org.acra.sender.HttpSender.Type; +import org.json.JSONObject; + +/** + * Main application. + * + * @author bgamard + */ +@ReportsCrashes(formKey = "", + httpMethod = Method.PUT, + reportType = Type.JSON, + formUri = "http://acralyzer.sismics.com/docs-report", + formUriBasicAuthLogin = "reporter", + formUriBasicAuthPassword = "jOS9ezJR", + mode = ReportingInteractionMode.TOAST, + forceCloseDialogAfterToast = true, + resToastText = R.string.crash_toast_text) +public class MainApplication extends Application { + @Override + public void onCreate() { + ACRA.init(this); + + // Fetching /user/info from cache + JSONObject json = PreferenceUtil.getCachedJson(getApplicationContext(), PreferenceUtil.PREF_CACHED_USER_INFO_JSON); + ApplicationContext.getInstance().setUserInfo(getApplicationContext(), json); + + super.onCreate(); + } + + @Override + public void onLowMemory() { + BitmapAjaxCallback.clearCache(); + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/LoginActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/LoginActivity.java new file mode 100644 index 00000000..cf5a92bf --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/LoginActivity.java @@ -0,0 +1,184 @@ +package com.sismics.docs.activity; + +import android.content.Intent; +import android.os.Bundle; +import android.preference.PreferenceManager; +import android.support.v4.app.FragmentActivity; +import android.text.Html; +import android.text.method.LinkMovementMethod; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; +import android.widget.EditText; + +import com.androidquery.AQuery; +import com.loopj.android.http.JsonHttpResponseHandler; +import com.sismics.docs.R; +import com.sismics.docs.listener.CallbackListener; +import com.sismics.docs.model.application.ApplicationContext; +import com.sismics.docs.resource.UserResource; +import com.sismics.docs.ui.form.Validator; +import com.sismics.docs.ui.form.validator.Required; +import com.sismics.docs.util.DialogUtil; +import com.sismics.docs.util.PreferenceUtil; + +import org.apache.http.Header; +import org.json.JSONObject; + +/** + * Login activity. + * + * @author bgamard + */ +public class LoginActivity extends FragmentActivity { + + /** + * User interface. + */ + private View loginForm; + private View progressBar; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.login_activity); + + AQuery aq = new AQuery(this); + aq.id(R.id.loginExplain) + .text(Html.fromHtml(getString(R.string.login_explain))) + .getTextView() + .setMovementMethod(LinkMovementMethod.getInstance()); + + final EditText txtServer = aq.id(R.id.txtServer).getEditText(); + final EditText txtUsername = aq.id(R.id.txtUsername).getEditText(); + final EditText txtPassword = aq.id(R.id.txtPassword).getEditText(); + final Button btnConnect = aq.id(R.id.btnConnect).getButton(); + loginForm = aq.id(R.id.loginForm).getView(); + progressBar = aq.id(R.id.progressBar).getView(); + + PreferenceManager.setDefaultValues(this, R.xml.preferences, false); + + loginForm.setVisibility(View.GONE); + progressBar.setVisibility(View.VISIBLE); + + // Form validation + final Validator validator = new Validator(false); + validator.addValidable(this, txtServer, new Required()); + validator.addValidable(this, txtUsername, new Required()); + validator.addValidable(this, txtPassword, new Required()); + validator.setOnValidationChanged(new CallbackListener() { + @Override + public void onComplete() { + btnConnect.setEnabled(validator.isValidated()); + } + }); + + // Preset saved server URL + String serverUrl = PreferenceUtil.getStringPreference(this, PreferenceUtil.PREF_SERVER_URL); + if (serverUrl != null) { + txtServer.setText(serverUrl); + } + + tryConnect(); + + // Login button + btnConnect.setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + loginForm.setVisibility(View.GONE); + progressBar.setVisibility(View.VISIBLE); + + PreferenceUtil.setServerUrl(LoginActivity.this, txtServer.getText().toString()); + + try { + UserResource.login(getApplicationContext(), txtUsername.getText().toString(), txtPassword.getText().toString(), new JsonHttpResponseHandler() { + @Override + public void onSuccess(JSONObject json) { + // Empty previous user caches + PreferenceUtil.resetUserCache(getApplicationContext()); + + // Getting user info and redirecting to main activity + ApplicationContext.getInstance().fetchUserInfo(LoginActivity.this, new CallbackListener() { + @Override + public void onComplete() { + Intent intent = new Intent(LoginActivity.this, MainActivity.class); + startActivity(intent); + finish(); + } + }); + } + + @Override + public void onFailure(final int statusCode, final Header[] headers, final byte[] responseBytes, final Throwable throwable) { + loginForm.setVisibility(View.VISIBLE); + progressBar.setVisibility(View.GONE); + + if (responseBytes != null && new String(responseBytes).contains("\"ForbiddenError\"")) { + DialogUtil.showOkDialog(LoginActivity.this, R.string.login_fail_title, R.string.login_fail); + } else { + DialogUtil.showOkDialog(LoginActivity.this, R.string.network_error_title, R.string.network_error); + } + } + }); + } catch (IllegalArgumentException e) { + // Given URL is not valid + loginForm.setVisibility(View.VISIBLE); + progressBar.setVisibility(View.GONE); + PreferenceUtil.setServerUrl(LoginActivity.this, null); + DialogUtil.showOkDialog(LoginActivity.this, R.string.invalid_url_title, R.string.invalid_url); + } + } + }); + } + + /** + * Try to get a "session". + */ + private void tryConnect() { + String serverUrl = PreferenceUtil.getStringPreference(this, PreferenceUtil.PREF_SERVER_URL); + if (serverUrl == null) { + // Server URL is empty + loginForm.setVisibility(View.VISIBLE); + progressBar.setVisibility(View.GONE); + return; + } + + if (ApplicationContext.getInstance().isLoggedIn()) { + // If we are already connected (from cache data) + // redirecting to main activity + Intent intent = new Intent(LoginActivity.this, MainActivity.class); + startActivity(intent); + finish(); + } else { + // Trying to get user data + UserResource.info(getApplicationContext(), new JsonHttpResponseHandler() { + @Override + public void onSuccess(final JSONObject json) { + if (json.optBoolean("anonymous", true)) { + loginForm.setVisibility(View.VISIBLE); + return; + } + + // Save user data in application context + ApplicationContext.getInstance().setUserInfo(getApplicationContext(), json); + + // Redirecting to main activity + Intent intent = new Intent(LoginActivity.this, MainActivity.class); + startActivity(intent); + finish(); + } + + @Override + public void onFailure(final int statusCode, final Header[] headers, final byte[] responseBytes, final Throwable throwable) { + DialogUtil.showOkDialog(LoginActivity.this, R.string.network_error_title, R.string.network_error); + loginForm.setVisibility(View.VISIBLE); + } + + @Override + public void onFinish() { + progressBar.setVisibility(View.GONE); + } + }); + } + } +} \ No newline at end of file diff --git a/docs-android/app/src/main/java/com/sismics/docs/activity/MainActivity.java b/docs-android/app/src/main/java/com/sismics/docs/activity/MainActivity.java new file mode 100644 index 00000000..fb61adb1 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/activity/MainActivity.java @@ -0,0 +1,123 @@ +package com.sismics.docs.activity; + +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Bundle; +import android.support.v4.app.ActionBarDrawerToggle; +import android.support.v4.app.FragmentActivity; +import android.support.v4.view.GravityCompat; +import android.support.v4.widget.DrawerLayout; +import android.view.MenuItem; +import android.view.View; +import android.view.Window; +import android.widget.AdapterView; +import android.widget.ListView; + +import com.sismics.docs.R; +import com.sismics.docs.model.application.ApplicationContext; + +/** + * Main activity. + * + * @author bgamard + */ +public class MainActivity extends FragmentActivity { + + private ListView drawerList; + private ActionBarDrawerToggle drawerToggle; + + @Override + protected void onCreate(final Bundle args) { + super.onCreate(args); + + // Check if logged in + if (!ApplicationContext.getInstance().isLoggedIn()) { + startActivity(new Intent(this, LoginActivity.class)); + finish(); + return; + } + + // Setup the activity + requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); + setContentView(R.layout.main_activity); + + // Cache view references + DrawerLayout drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + drawerList = (ListView) findViewById(R.id.drawer_list); + + // Drawer item click listener + drawerList.setOnItemClickListener(new ListView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + } + }); + + if (drawerLayout != null) { + // Set a custom shadow that overlays the main content when the drawer opens + drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); + + // Enable ActionBar app icon to behave as action to toggle nav drawer + getActionBar().setDisplayHomeAsUpEnabled(true); + getActionBar().setHomeButtonEnabled(true); + + // ActionBarDrawerToggle ties together the the proper interactions + // between the sliding drawer and the action bar app icon + drawerToggle = new ActionBarDrawerToggle( + this, /* host Activity */ + drawerLayout, /* DrawerLayout object */ + R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) { + + @Override + public void onDrawerOpened(View drawerView) { + invalidateOptionsMenu(); + } + + @Override + public void onDrawerClosed(View drawerView) { + invalidateOptionsMenu(); + } + }; + drawerLayout.setDrawerListener(drawerToggle); + } + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case android.R.id.home: + // The action bar home/up action should open or close the drawer. + // ActionBarDrawerToggle will take care of this. + if (drawerToggle != null && drawerToggle.onOptionsItemSelected(item)) { + return true; + } + return true; + + default: + return super.onOptionsItemSelected(item); + } + } + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + if (drawerToggle != null) { + // Sync the toggle state after onRestoreInstanceState has occurred. + drawerToggle.syncState(); + } + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + if (drawerToggle != null) { + // Pass any configuration change to the drawer toggle + drawerToggle.onConfigurationChanged(newConfig); + } + } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putInt("drawerItemSelected", drawerList.getCheckedItemPosition()); + } +} \ No newline at end of file diff --git a/docs-android/app/src/main/java/com/sismics/docs/dummy/DummyContent.java b/docs-android/app/src/main/java/com/sismics/docs/dummy/DummyContent.java deleted file mode 100644 index ee227fc5..00000000 --- a/docs-android/app/src/main/java/com/sismics/docs/dummy/DummyContent.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.sismics.docs.dummy; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Helper class for providing sample content for user interfaces created by - * Android template wizards. - *

- * TODO: Replace all uses of this class before publishing your app. - */ -public class DummyContent { - - /** - * An array of sample (dummy) items. - */ - public static List ITEMS = new ArrayList(); - - /** - * A map of sample (dummy) items, by ID. - */ - public static Map ITEM_MAP = new HashMap(); - - static { - // Add 3 sample items. - addItem(new DummyItem("1", "Item 1")); - addItem(new DummyItem("2", "Item 2")); - addItem(new DummyItem("3", "Item 3")); - } - - private static void addItem(DummyItem item) { - ITEMS.add(item); - ITEM_MAP.put(item.id, item); - } - - /** - * A dummy item representing a piece of content. - */ - public static class DummyItem { - public String id; - public String content; - - public DummyItem(String id, String content) { - this.id = id; - this.content = content; - } - - @Override - public String toString() { - return content; - } - } -} diff --git a/docs-android/app/src/main/java/com/sismics/docs/listener/CallbackListener.java b/docs-android/app/src/main/java/com/sismics/docs/listener/CallbackListener.java new file mode 100644 index 00000000..8caf7265 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/listener/CallbackListener.java @@ -0,0 +1,10 @@ +package com.sismics.docs.listener; + +/** + * Simple listener. + * + * @author bgamard + */ +public interface CallbackListener { + public void onComplete(); +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/model/application/ApplicationContext.java b/docs-android/app/src/main/java/com/sismics/docs/model/application/ApplicationContext.java new file mode 100644 index 00000000..99625f22 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/model/application/ApplicationContext.java @@ -0,0 +1,99 @@ +package com.sismics.docs.model.application; + +import android.app.Activity; +import android.content.Context; + +import com.loopj.android.http.JsonHttpResponseHandler; +import com.sismics.docs.listener.CallbackListener; +import com.sismics.docs.resource.UserResource; +import com.sismics.docs.util.PreferenceUtil; + +import org.json.JSONObject; + +/** + * Global context of the application. + * + * @author bgamard + */ +public class ApplicationContext { + /** + * Singleton's instance. + */ + private static ApplicationContext applicationContext; + + /** + * Response of /user/info + */ + private JSONObject userInfo; + + /** + * Private constructor. + */ + private ApplicationContext() { + } + + /** + * Returns a singleton of ApplicationContext. + * + * @return Singleton of ApplicationContext + */ + public static ApplicationContext getInstance() { + if (applicationContext == null) { + applicationContext = new ApplicationContext(); + } + return applicationContext; + } + + /** + * Returns true if current user is logged in. + * + * @return + */ + public boolean isLoggedIn() { + return userInfo != null && !userInfo.optBoolean("anonymous"); + } + + /** + * Getter of userInfo + * + * @return + */ + public JSONObject getUserInfo() { + return userInfo; + } + + /** + * Setter of userInfo + * + * @param json + */ + public void setUserInfo(Context context, JSONObject json) { + this.userInfo = json; + PreferenceUtil.setCachedJson(context, PreferenceUtil.PREF_CACHED_USER_INFO_JSON, json); + } + + /** + * Asynchronously get user info. + * + * @param activity + * @param callbackListener + */ + public void fetchUserInfo(final Activity activity, final CallbackListener callbackListener) { + UserResource.info(activity.getApplicationContext(), new JsonHttpResponseHandler() { + @Override + public void onSuccess(final JSONObject json) { + // Save data in application context + if (!json.optBoolean("anonymous", true)) { + setUserInfo(activity.getApplicationContext(), json); + } + } + + @Override + public void onFinish() { + if (callbackListener != null) { + callbackListener.onComplete(); + } + } + }); + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/resource/BaseResource.java b/docs-android/app/src/main/java/com/sismics/docs/resource/BaseResource.java new file mode 100644 index 00000000..56933dd7 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/resource/BaseResource.java @@ -0,0 +1,137 @@ +package com.sismics.docs.resource; + +import android.content.Context; +import android.os.Build; + +import com.androidquery.callback.AbstractAjaxCallback; +import com.loopj.android.http.AsyncHttpClient; +import com.loopj.android.http.PersistentCookieStore; +import com.sismics.docs.util.ApplicationUtil; +import com.sismics.docs.util.PreferenceUtil; + +import org.apache.http.conn.ssl.SSLSocketFactory; + +import java.io.IOException; +import java.net.Socket; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.Locale; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +/** + * Base class for API access. + * + * @author bgamard + */ +public class BaseResource { + + /** + * User-Agent to use. + */ + private static String USER_AGENT = null; + + /** + * Accept-Language header. + */ + private static String ACCEPT_LANGUAGE = null; + + /** + * HTTP client. + */ + protected static AsyncHttpClient client = new AsyncHttpClient(); + + static { + // 20sec default timeout + client.setTimeout(60000); + try { + KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); + trustStore.load(null, null); + MySSLSocketFactory sf = new MySSLSocketFactory(trustStore); + sf.setHostnameVerifier(MySSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + client.setSSLSocketFactory(sf); + AbstractAjaxCallback.setSSF(sf); + } catch (Exception e) { + // NOP + } + } + + /** + * Resource initialization. + * @param context Context + */ + protected static void init(Context context) { + PersistentCookieStore cookieStore = new PersistentCookieStore(context); + client.setCookieStore(cookieStore); + + if (USER_AGENT == null) { + USER_AGENT = "Sismics Docs Android " + ApplicationUtil.getVersionName(context) + "/Android " + Build.VERSION.RELEASE + "/" + Build.MODEL; + client.setUserAgent(USER_AGENT); + } + + if (ACCEPT_LANGUAGE == null) { + Locale locale = Locale.getDefault(); + ACCEPT_LANGUAGE = locale.getLanguage() + "_" + locale.getCountry(); + client.addHeader("Accept-Language", ACCEPT_LANGUAGE); + } + } + + /** + * Socket factory to allow self-signed certificates. + * + * @author bgamard + */ + public static class MySSLSocketFactory extends SSLSocketFactory { + SSLContext sslContext = SSLContext.getInstance("TLS"); + + public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { + super(truststore); + + TrustManager tm = new X509TrustManager() { + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } + }; + + sslContext.init(null, new TrustManager[] { tm }, null); + } + + @Override + public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException { + return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); + } + + @Override + public Socket createSocket() throws IOException { + return sslContext.getSocketFactory().createSocket(); + } + } + + /** + * Returns cleaned API URL. + * @param context Context + * @return Cleaned API URL + */ + protected static String getApiUrl(Context context) { + String serverUrl = PreferenceUtil.getServerUrl(context); + + if (serverUrl == null) { + return null; + } + + return serverUrl + "/api"; + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/resource/UserResource.java b/docs-android/app/src/main/java/com/sismics/docs/resource/UserResource.java new file mode 100644 index 00000000..19e1ebe5 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/resource/UserResource.java @@ -0,0 +1,55 @@ +package com.sismics.docs.resource; + +import android.content.Context; + +import com.loopj.android.http.JsonHttpResponseHandler; +import com.loopj.android.http.RequestParams; + +/** + * Access to /user API. + * + * @author bgamard + */ +public class UserResource extends BaseResource { + + /** + * POST /user/login. + * @param context Context + * @param username Username + * @param password Password + * @param responseHandler Callback + */ + public static void login(Context context, String username, String password, JsonHttpResponseHandler responseHandler) { + init(context); + + RequestParams params = new RequestParams(); + params.put("username", username); + params.put("password", password); + params.put("remember", "true"); + client.post(getApiUrl(context) + "/user/login", params, responseHandler); + } + + /** + * GET /user. + * @param context Context + * @param responseHandler Callback + */ + public static void info(Context context, JsonHttpResponseHandler responseHandler) { + init(context); + + RequestParams params = new RequestParams(); + client.get(getApiUrl(context) + "/user", params, responseHandler); + } + + /** + * POST /user/logout. + * @param context Context + * @param responseHandler Callback + */ + public static void logout(Context context, JsonHttpResponseHandler responseHandler) { + init(context); + + RequestParams params = new RequestParams(); + client.post(getApiUrl(context) + "/user/logout", params, responseHandler); + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/ui/form/Validable.java b/docs-android/app/src/main/java/com/sismics/docs/ui/form/Validable.java new file mode 100644 index 00000000..9dd57d3f --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/ui/form/Validable.java @@ -0,0 +1,42 @@ +package com.sismics.docs.ui.form; + +import android.view.View; + +public class Validable { + + private View view; + + private boolean isValidated = false; + + /** + * Getter of view. + * @return view + */ + public View getView() { + return view; + } + + /** + * Setter of view. + * @param view view + */ + public void setView(View view) { + this.view = view; + } + + /** + * Getter of isValidated. + * @return isValidated + */ + public boolean isValidated() { + return isValidated; + } + + /** + * Setter of isValidated. + * @param isValidated isValidated + */ + public void setValidated(boolean isValidated) { + this.isValidated = isValidated; + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/ui/form/Validator.java b/docs-android/app/src/main/java/com/sismics/docs/ui/form/Validator.java new file mode 100644 index 00000000..9404c5d7 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/ui/form/Validator.java @@ -0,0 +1,124 @@ +package com.sismics.docs.ui.form; + +import android.content.Context; +import android.text.Editable; +import android.text.TextWatcher; +import android.view.View; +import android.widget.EditText; + +import com.sismics.docs.listener.CallbackListener; +import com.sismics.docs.ui.form.validator.ValidatorType; + +import java.util.HashMap; +import java.util.Map; + +/** + * Utility for form validation. + * + * @author bgamard + */ +public class Validator { + + /** + * List of validable elements. + */ + private Map validables = new HashMap(); + + /** + * Callback when the validation of one element has changed. + */ + private CallbackListener onValidationChanged; + + /** + * True if the validator show validation errors. + */ + private boolean showErrors; + + /** + * Constructor. + * + * @param showErrors True to display validation errors + */ + public Validator(boolean showErrors) { + this.showErrors = showErrors; + } + + /** + * Setter of onValidationChanged. + * @param onValidationChanged onValidationChanged + */ + public void setOnValidationChanged(CallbackListener onValidationChanged) { + this.onValidationChanged = onValidationChanged; + onValidationChanged.onComplete(); + } + + /** + * Add a validable element. + * + * @param editText Edit text + * @param validatorTypes Validators + */ + public void addValidable(final Context context, final EditText editText, final ValidatorType...validatorTypes) { + final Validable validable = new Validable(); + validables.put(editText, validable); + + editText.addTextChangedListener(new TextWatcher() { + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + // NOP + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + // NOP + } + + @Override + public void afterTextChanged(Editable s) { + validable.setValidated(true); + for (ValidatorType validatorType : validatorTypes) { + if (!validatorType.validate(s.toString())) { + if (showErrors) { + editText.setError(validatorType.getErrorMessage(context)); + } + validable.setValidated(false); + break; + } + } + + if (validable.isValidated()) { + editText.setError(null); + } + + if (onValidationChanged != null) { + onValidationChanged.onComplete(); + } + } + }); + } + + /** + * Returns true if the element is validated. + * + * @param view View + * @return True if the element is validated + */ + public boolean isValidated(View view) { + return validables.get(view).isValidated(); + } + + /** + * Returns true if all elements are validated. + * + * @return True if all elements are validated + */ + public boolean isValidated() { + for (Validable validable : validables.values()) { + if (!validable.isValidated()) { + return false; + } + } + return true; + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Alphanumeric.java b/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Alphanumeric.java new file mode 100644 index 00000000..d0d54d26 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Alphanumeric.java @@ -0,0 +1,28 @@ +package com.sismics.docs.ui.form.validator; + +import android.content.Context; + +import com.sismics.docs.R; + +import java.util.regex.Pattern; + +/** + * Alphanumeric validator. + * + * @author bgamard + */ +public class Alphanumeric implements ValidatorType { + + private static Pattern ALPHANUMERIC_PATTERN = Pattern.compile("[a-zA-Z0-9_]+"); + + @Override + public boolean validate(String text) { + return ALPHANUMERIC_PATTERN.matcher(text).matches(); + } + + @Override + public String getErrorMessage(Context context) { + return context.getString(R.string.validate_error_alphanumeric); + } + +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Email.java b/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Email.java new file mode 100644 index 00000000..a39d4c19 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Email.java @@ -0,0 +1,30 @@ +package com.sismics.docs.ui.form.validator; + +import android.content.Context; + +import com.sismics.docs.R; + +import java.util.regex.Pattern; + +/** + * Email validator. + * + * @author bgamard + */ +public class Email implements ValidatorType { + + /** + * Pattern de validation. + */ + private static Pattern EMAIL_PATTERN = Pattern.compile(".+@.+\\..+"); + + @Override + public boolean validate(String text) { + return EMAIL_PATTERN.matcher(text).matches(); + } + + @Override + public String getErrorMessage(Context context) { + return context.getResources().getString(R.string.validate_error_email); + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Length.java b/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Length.java new file mode 100644 index 00000000..4283c1d2 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Length.java @@ -0,0 +1,52 @@ +package com.sismics.docs.ui.form.validator; + +import android.content.Context; + +import com.sismics.docs.R; + +/** + * Text length validator. + * + * @author bgamard + */ +public class Length implements ValidatorType { + + /** + * Minimum length. + */ + private int minLength = 0; + + /** + * Maximum length. + */ + private int maxLength = 0; + + /** + * True if the last validation error was about a string too short. + */ + private boolean tooShort; + + /** + * Constructor. + * @param minLength Minimum length + * @param maxLength Maximum length + */ + public Length(int minLength, int maxLength) { + this.minLength = minLength; + this.maxLength = maxLength; + } + + @Override + public boolean validate(String text) { + tooShort = text.trim().length() < minLength; + return text.trim().length() >= minLength && text.trim().length() <= maxLength; + } + + @Override + public String getErrorMessage(Context context) { + if (tooShort) { + return context.getResources().getString(R.string.validate_error_length_min, minLength); + } + return context.getResources().getString(R.string.validate_error_length_max, maxLength); + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Required.java b/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Required.java new file mode 100644 index 00000000..111a49e9 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/Required.java @@ -0,0 +1,24 @@ +package com.sismics.docs.ui.form.validator; + +import android.content.Context; + +import com.sismics.docs.R; + +/** + * Text presence validator. + * + * @author bgamard + */ +public class Required implements ValidatorType { + + @Override + public boolean validate(String text) { + return text.trim().length() != 0; + } + + @Override + public String getErrorMessage(Context context) { + return context.getString(R.string.validate_error_required); + } + +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/ValidatorType.java b/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/ValidatorType.java new file mode 100644 index 00000000..50acc3b2 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/ui/form/validator/ValidatorType.java @@ -0,0 +1,25 @@ +package com.sismics.docs.ui.form.validator; + +import android.content.Context; + +/** + * Interface for validation types. + * + * @author bgamard + */ +public interface ValidatorType { + + /** + * Returns true if the validator is validated. + * @param text + * @return + */ + public boolean validate(String text); + + /** + * Returns an error message. + * @param context + * @return + */ + public String getErrorMessage(Context context); +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/util/ApplicationUtil.java b/docs-android/app/src/main/java/com/sismics/docs/util/ApplicationUtil.java new file mode 100644 index 00000000..fba41d56 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/util/ApplicationUtil.java @@ -0,0 +1,43 @@ +package com.sismics.docs.util; + +import android.content.Context; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager.NameNotFoundException; + +/** + * Utility class on general application data. + * + * @author bgamard + */ +public class ApplicationUtil { + + /** + * Returns version name. + * + * @param context Context + * @return Nom de la version + */ + public static String getVersionName(Context context) { + try { + PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); + return packageInfo.versionName; + } catch (NameNotFoundException e) { + return ""; + } + } + + /** + * Returns version number. + * + * @param context Context + * @return Numéro de version + */ + public static int getVersionCode(Context context) { + try { + PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); + return packageInfo.versionCode; + } catch (NameNotFoundException e) { + return 0; + } + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/util/DialogUtil.java b/docs-android/app/src/main/java/com/sismics/docs/util/DialogUtil.java new file mode 100644 index 00000000..271977c6 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/util/DialogUtil.java @@ -0,0 +1,40 @@ +package com.sismics.docs.util; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; + +import com.sismics.docs.R; + +/** + * Utility class for dialogs. + * + * @author bgamard + */ +public class DialogUtil { + + /** + * Create a dialog with an OK button. + * + * @param activity Context activity + * @param title Dialog title + * @param message Dialog message + */ + public static void showOkDialog(Activity activity, int title, int message) { + if (activity == null || activity.isFinishing()) { + return; + } + + AlertDialog.Builder builder = new AlertDialog.Builder(activity); + + builder.setTitle(title) + .setMessage(message) + .setCancelable(true) + .setNeutralButton(R.string.ok, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + dialog.dismiss(); + } + }).create().show(); + } +} diff --git a/docs-android/app/src/main/java/com/sismics/docs/util/PreferenceUtil.java b/docs-android/app/src/main/java/com/sismics/docs/util/PreferenceUtil.java new file mode 100644 index 00000000..23a2fd54 --- /dev/null +++ b/docs-android/app/src/main/java/com/sismics/docs/util/PreferenceUtil.java @@ -0,0 +1,162 @@ +package com.sismics.docs.util; + +import android.content.Context; +import android.content.SharedPreferences; +import android.content.SharedPreferences.Editor; +import android.preference.PreferenceManager; + +import com.loopj.android.http.PersistentCookieStore; + +import org.apache.http.cookie.Cookie; +import org.json.JSONObject; + +import java.util.List; + +/** + * Utility class on preferences. + * + * @author bgamard + */ +public class PreferenceUtil { + + public static final String PREF_CACHED_USER_INFO_JSON = "pref_cachedUserInfoJson"; + public static final String PREF_SERVER_URL = "pref_ServerUrl"; + + /** + * Returns a preference of boolean type. + * @param context Context + * @param key Shared preference key + * @return Shared preference value + */ + public static boolean getBooleanPreference(Context context, String key, boolean defaultValue) { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + return sharedPreferences.getBoolean(key, defaultValue); + } + + /** + * Returns a preference of string type. + * @param context Context + * @param key Shared preference key + * @return Shared preference value + */ + public static String getStringPreference(Context context, String key) { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + return sharedPreferences.getString(key, null); + } + + /** + * Returns a preference of integer type. + * @param context Context + * @param key Shared preference key + * @return Shared preference value + */ + public static int getIntegerPreference(Context context, String key, int defaultValue) { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + try { + String pref = sharedPreferences.getString(key, ""); + try { + return Integer.parseInt(pref); + } catch (NumberFormatException e) { + return defaultValue; + } + } catch (ClassCastException e) { + return sharedPreferences.getInt(key, defaultValue); + } + + } + + /** + * Update JSON cache. + * @param context Context + * @param key Shared preference key + * @param json JSON data + */ + public static void setCachedJson(Context context, String key, JSONObject json) { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + sharedPreferences.edit().putString(key, json != null ? json.toString() : null).commit(); + } + + /** + * Returns a JSON cache. + * @param context Context + * @param key Shared preference key + * @return JSON data + */ + public static JSONObject getCachedJson(Context context, String key) { + try { + return new JSONObject(getStringPreference(context, key)); + } catch (Exception e) { + // The cache is not parsable, clean this up + setCachedJson(context, key, null); + return null; + } + } + + /** + * Update server URL. + * @param context Context + */ + public static void setServerUrl(Context context, String serverUrl) { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + sharedPreferences.edit().putString(PREF_SERVER_URL, serverUrl).commit(); + } + + /** + * Empty user caches. + * @param context Context + */ + public static void resetUserCache(Context context) { + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + Editor editor = sharedPreferences.edit(); + editor.putString(PREF_CACHED_USER_INFO_JSON, null); + editor.commit(); + } + + /** + * Returns auth token cookie from shared preferences. + * @return Auth token + */ + public static String getAuthToken(Context context) { + PersistentCookieStore cookieStore = new PersistentCookieStore(context); + List cookieList = cookieStore.getCookies(); + for (Cookie cookie : cookieList) { + if (cookie.getName().equals("auth_token")) { + return cookie.getValue(); + } + } + + return null; + } + + /** + * Returns cleaned server URL. + * @param context Context + * @return Server URL + */ + public static String getServerUrl(Context context) { + String serverUrl = getStringPreference(context, PREF_SERVER_URL); + if (serverUrl == null) { + return null; + } + + // Trim + serverUrl = serverUrl.trim(); + + if (!serverUrl.startsWith("http")) { + // Try to add http + serverUrl = "http://" + serverUrl; + } + + if (serverUrl.endsWith("/")) { + // Delete last / + serverUrl = serverUrl.substring(0, serverUrl.length() - 1); + } + + // Remove /api + if (serverUrl.endsWith("/api")) { + serverUrl = serverUrl.substring(0, serverUrl.length() - 4); + } + + return serverUrl; + } +} diff --git a/docs-android/app/src/main/res/drawable-hdpi/drawer_shadow.9.png b/docs-android/app/src/main/res/drawable-hdpi/drawer_shadow.9.png new file mode 100644 index 0000000000000000000000000000000000000000..224cc4ff43a29c546ae50c654c20c58c2f4cdb75 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^JV0#3!3HEVSgovp6icy_X9x!n)NrJ90QsB+9+AZi z4BVX{%xHe{^je^xucwP+h)3t!Yl?gg4m>OeUfNFiFU`@U5Xr+-Y2h+^&Fz!7ypldm za#4)fkaYOplLMWvd)czen2t>^YG&h=GRe5G;NW`))xgl;_^?U481>l1!)FR53IYvg N@O1TaS?83{1OO&fGZ_E? literal 0 HcmV?d00001 diff --git a/docs-android/app/src/main/res/drawable-hdpi/ic_drawer.png b/docs-android/app/src/main/res/drawable-hdpi/ic_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..ff7b1def9ac3f86488a855f502b965ac75b633fb GIT binary patch literal 2842 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 literal 0 HcmV?d00001 diff --git a/docs-android/app/src/main/res/drawable-hdpi/list_background_holo.9.png b/docs-android/app/src/main/res/drawable-hdpi/list_background_holo.9.png new file mode 100644 index 0000000000000000000000000000000000000000..694d6a4d002c1460e056c37bcca3f32505b775d4 GIT binary patch literal 970 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 diff --git a/docs-android/app/src/main/res/drawable-xhdpi/drawer_shadow.9.png b/docs-android/app/src/main/res/drawable-xhdpi/drawer_shadow.9.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3d853e902401d850f09b1cc50a58cda9bd3bb5 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^{6Or)!3HEd1bTh|DVAa<&kznEsNqQI0P;BtJR*x3 z7`Qt@n9=;?>9s(?2u~Ns5RcBc*A@8=2k^;BD$vKZ(B+Ju<=2igh OVDNPHb6Mw<&;$UPn>!5v literal 0 HcmV?d00001 diff --git a/docs-android/app/src/main/res/drawable-xhdpi/ic_drawer.png b/docs-android/app/src/main/res/drawable-xhdpi/ic_drawer.png new file mode 100644 index 0000000000000000000000000000000000000000..b9bc3d70f1d29fec2e4530e5d1809edc8e15ad35 GIT binary patch literal 1056 zcmbVLy>HV%6u%0oKud=rkbnW5+yx|J`<&Q`t(wY-lQsgURT^lJI@GnVjg{JG>??6I zp$-TJMs}p`%!m$vm_Q6HNWhFgdkGtJ{wp^s;CS4?Jv|~pY7%o}Gu+V}T4Zw+(*J#qF zbyIVQ&)caDpZFm|128?4gtpVh6t3cRFVMN~yDvHDxjMHbTcQ<~aLb$PMtHGXYdGDu zqq^M8bvT`9jKIg#hKaus#9E?rJzkB;saoJ*&xE#ht{+s>T7V@IVJP$2j3Xih6@^DR zSy9k6D2YfCMD{8fl+$EIlk#xzaLileu4#3%GVsNAI@h8!)C8f^>F}K_Poi}Jsj8ZC zNK%GbWa6!W+DRser-lqBj-AL0sYe2sGTN(TljTGkrXC2cz{u9QL)^TGi#6lg%WHWNueXLCl!K`-2J4y{%G}?URu}iTxOyX?%IG|Ni z=hzAFdahPhWYd&UB`ZouDIio33t8338aX7(id>P097kc5Tt2T#qN-LD1EI21DCNpU z)l>>nF>e%+ImA|jnA(AZhkiZgcYrM%i`7aIwke4kglr5uV4+1QiCZLur9}l^v24c+ zQpMHug8KQIIP&gcw-ON__A0D-M?~=N%==jPf2t<1V1%?i{%V(@iuGVB9yUMQ9F7kT z*vv$1ICdVt{>%oeRyB=A^5xqTV+_DEZ*K2>+`fG7_s{+D?GHCbcTc|H-@OlOr+<7J z`MUh8J-U;h90BvQ$x;pMJp@l5JO^O;{&-)=znWYD7w()l&fdzcq%&JB*UV?dmF)v& C(MM12k+qwH=niCTcuv z^yGTe_#gZO9z1*Wx``+6dNONbqE1<0_aHWz&PSf-d7t;4cV5mWpHW-H4tX8xJ zov%dW;yV3rR}!D;bc>YQq=|cEZ1{-DTeyor)iL_0fedT%_!G)9ObpnqHfie*p@|*N zh%j8}c$CdB*<9!u<`5CkMSa^<+3z1dvcR@fb|<9^x>rO4yE64rb6RVe)1j$YZ0nEVjqDNCnQWEEr7JhiE=WN$=n5! zAPT%7@uHLvGfHI=1&&bBS6r6oBjD^f-l6;Uk7iY(tNX9{_-SW1`VWOBjPusL#& zOBP(~j4Q9?MvdTjG_r<#dmmY4A3I={Ftk^D5mxHWxz=hg;z}-0&G6B+p1bD75$&C5 zxoldxS++fLX|MaVsS8}~7kv=9s+Mns$KB4G$>G}NpRW!dt<|r_UpzVa_T}mN^=C&% z*J3wfZ#$jj?`>GSy&L~3oWx_v*MII@iv3_N+++?8w%#4@o4e8Ds+MZn`$FgWUsJLv AfdBvi literal 0 HcmV?d00001 diff --git a/docs-android/app/src/main/res/layout/activity_doc_detail.xml b/docs-android/app/src/main/res/layout/activity_doc_detail.xml deleted file mode 100644 index 758ecf6b..00000000 --- a/docs-android/app/src/main/res/layout/activity_doc_detail.xml +++ /dev/null @@ -1,7 +0,0 @@ - diff --git a/docs-android/app/src/main/res/layout/activity_doc_list.xml b/docs-android/app/src/main/res/layout/activity_doc_list.xml deleted file mode 100644 index bca7ceff..00000000 --- a/docs-android/app/src/main/res/layout/activity_doc_list.xml +++ /dev/null @@ -1,10 +0,0 @@ - diff --git a/docs-android/app/src/main/res/layout/activity_doc_twopane.xml b/docs-android/app/src/main/res/layout/activity_doc_twopane.xml deleted file mode 100644 index 2c9296cf..00000000 --- a/docs-android/app/src/main/res/layout/activity_doc_twopane.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - diff --git a/docs-android/app/src/main/res/layout/fragment_doc_detail.xml b/docs-android/app/src/main/res/layout/fragment_doc_detail.xml deleted file mode 100644 index 190266b7..00000000 --- a/docs-android/app/src/main/res/layout/fragment_doc_detail.xml +++ /dev/null @@ -1,9 +0,0 @@ - diff --git a/docs-android/app/src/main/res/layout/login_activity.xml b/docs-android/app/src/main/res/layout/login_activity.xml new file mode 100644 index 00000000..6c04d955 --- /dev/null +++ b/docs-android/app/src/main/res/layout/login_activity.xml @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +