From 71de08c819652c1a373f6f7404d27c69573388fb Mon Sep 17 00:00:00 2001 From: cramakri <cramakri> Date: Mon, 22 Oct 2012 09:11:17 +0000 Subject: [PATCH] Initial refactoring into request handler classes SVN: 27263 --- .../UserInterfaceState.xcuserstate | Bin 159187 -> 159186 bytes .../ipad-read-service-v1/ipad_read.py | 120 ++++++++++-------- 2 files changed, 68 insertions(+), 52 deletions(-) diff --git a/openbis-ipad/Research/BisMac.xcodeproj/project.xcworkspace/xcuserdata/cramakri.xcuserdatad/UserInterfaceState.xcuserstate b/openbis-ipad/Research/BisMac.xcodeproj/project.xcworkspace/xcuserdata/cramakri.xcuserdatad/UserInterfaceState.xcuserstate index e503324679de9d1a81f180e7e61672237b914ebf..d39a5b71f68ae4ea2e29718b19967ba2b526bb6a 100644 GIT binary patch delta 40034 zcmZVHd7O^*`Umj)IkNAJeH;5ao3YJchB2$L4#vLkvS#0UR0@S`S=&S+B~oak5>jZl zq_k=yX%i8@x4(aXyq|NwPBZuSx<1$SopUPXld}asK3j0->;^5PH*b1!?0<b{w`i8o zC^D{TT+_L|XU8>*ZPF+*cJ9CumD`LSKV|q`BL)v09@#FdTWaT&tcin%bsK)yw9!L{ zuk75R{>l%l6}<142G9J`AaqB0?|S0C+5i7td;b>`+Wtsf^ycN^8#V4JH0tBv!{DQO zFV@?g+o@aX;3>nOs`p~>*}xJdyH6N4cxL3_DUorpiSdmi+wT4Holsh_@SY%O@D&%i z#AW{AI{yVh!+`%$fd-^8kSR=K2D6yMBkbcH-scow^DW==13z*5y|;p(Q78z)jq-TN zOMXgFib_<W8r7*uBch2VftIu;olM%(jUM!50CzHu2~6Ta7PFLPtO&wEqYWM&<4K-k zJD>4+5JcTUQQ~QVmqvMMl$S=`g%qNs5H*{*gjvI8wy+KFi`v0X-rxX-d6)Ne6LpMF zaA=gsqRt?)D3L||$j@BiY7j){U-SN_p=zO8YcBYYaEAXTi)=d5nXdGqAHx~RXp|kT z>}cgi8(OrXML*11*7GRJj((mO*u|^7&VCN@F`sgh(}ou#{1~Cf2t7tNF@qSwFh(Hw z7{SL(W-8N}$3v{*IG^(c=ddlYoiM=I-e@A$dt-fX?7hrq2?~#0Zg{aPJv_qW7+|ac z#_A$g_^|?y-N!*35G%*n3tZwdfAV(_#M!twn-*u&;%ZTc`ZOe&4k#*4vT>S?%cU1% zO*>9yak`3|!`<jEPK9wQjMHJ<YD64o!{VM`BjSyFn-4MUxF2vY;(p~fe&-5T`8Nm} z=c724sfuD7M-q<m5kq5|(40it;i5KnCmMI83;h|0(KH^xD8@07$yndU53rI)SkI$K zw(%ymu#MMvhmXv^@h2WEL*vt&<s4SFv8Wr1xv@?f{}lxBZhCwk3Q&k5lq7<3lt=vW z(Ztde&BVLt@kz8L70tx=p&#SSKVJ3ms*j(>OpGDkSmG^9{QZbOejPfA7k|9{h<}=` zY-a~X5Pu^Gnv}rdO?oheHN1>bHPLaC_c?*in|#Vy2Q~SUulNQpX<7yqH_b-1O~u^w zPR26{FK#-WS%|!;eQA0hqHns0#XQWjJkL&E<R$j<Dz9^Z@LN7q*7OMPaU4Z7tB0*^ zHk<{x8O;v!Ll892i=Ann%Q#jbndZ--+vfW)<L3ME-sVU7nqT=1OWFK7H_g9AC<t2I zK~colqBLcxfFfG7Bn6AuqAx=j&0S1o2KO+Z<yg8F8?kIHblbw=EkxZy0WH4eJoc-_ z<se8XWc~>yJv2n*3Edcst`fwXAl?M=CWtrTeikCy1pAQSfCRHo*u`%4AkqXKCmiE5 zen+>75!9y{3A7@a%&-rgB@V!h6CIqWvqYUG>MT(Ki3&(mK;kk)o%je2Puzyc6JKT@ zhj4hJjuSuUJ9L>S>O@hu%ugxGQ3Fl43`hHDPBuA=U=ovAgacZ>!fSlUC!FLAU+@)T zZ7J54KXHLeLC`7>c_~0)iXrJ%r71&sDw=<*Djr&pf%&$YzyenDB8PE6tAB!^wU@M3 zeQV#?+V{1NM1id((E4q3-ueShbCz>_gMwO1qV+W_ck5e0kn}(Dntzg)CaEmRjFP-O z$;*?XNyLnjvXD$tcY4wXV@q1eGrW#el60RW>ZJd0KynC+ot%$?+{;5ejiQq^mi&bm zC0`AKHfGbN1m@F5JZ;3&rZ#nnB_7Mu#`3gjMH-nHTboXFMPY6FF_0lhvCV@l#?rP~ z&Z;12>!!8UNL!<B8y0ulN!-P3EL_{W@y%_0b6XX+z5PvVSc~f0KEqCSvj_XpRtjwo z@h<OioDcaS2vQ`RQj^BCB#C4+5Kd8jN;i6=>Xcy&XATxHMFA-*cmxHcY~U$2vxTi3 z#I~pW8wBn0Bkp!psZK5G(ts$W*-o16q}eXP{M(7Mo%q_BZ@XL+(ylN48N^UT)owIn zky5)SIl&)6kXjPmrP`NNUz2L2sjGQ{jVLr#VyO~KeGzG;N-OmMZ{PmnqlhZ?EI;uJ zzjB#Bxe^3v1+W)s7BsCQwm;4Gr#U!HXKBqzKr?CLO>0Xk8cUOIn#R(4p|P|9+{rk? z6MfvpRAw-f2Uv*c)0VOvJCLTEv`vUTZ5y^Y?FDp`wx5F>=3UG`O;c%~@HOA^BbrOQ z$nX4R{%QXNLHZr!qaZ~nPARHkhUqoXX?i1K5OsQM+R%=4vdF<0(|gi~q1dJLG3Yj3 zv*{X4H^TILx!?TLb(*fzbX}&e=TSDH%XD3)>oWZ%-oVV#-{A=Fagy&i&n0w~uB-Ih zP5m1L8F|oHhQ=}qQ;en<LB@QxnSX|*$Z$Z$%e;*PG8~ZMfDAEah%w_!zCw%{4$Jt7 z3qg=6t<0Ll(ikt#v<sOM%9K#1WHK}9jC3-4U=K2-k~xy_SRdmNP3BbWK&E&y%{_As zn~_B3cAm$)GZmY;msc_C%#S#SIcF*^)0{JZMk1LK$&^S|eo8O_XJpM{uK8z4AZsxW z%zB!wI4o-iyKq>R!?GNfWdvDoa*)GFB}*z<Qpx%r2WMHZtY5i|+mq$?WL@RoAZTBb zXe82pAY;wHy~Eo-jxO3?41#R)%C15K8sREsr;<T?I?@H#D%-Wn?oB_uFnbEq(OtIg zvgdIh53mSlWk1Xc+?wo5y6;dPFYPdmwJ4;c#p&3Zk$7oGf2^YycJ#uIUf9tKJ1$`v zD_PAZB-l}c9iL@4cB)e{9q2??6y8a}oh)Ie@E<;I1wrQ!ccA;u#SvBK7dgONe9UK@ z#t*8_=H2-l#NJu#oyFeyIyZwrI6)T;bn&h(Hor>|is7AIB-!Oo9$}aHcd;m4E0K*f zx{9dlQpD6%cU>Rj2{!W#I_vrZzPYOoyB^{UcA%?bx>~@ln(Auly8g|TAjnZnPF@t0 zlb;C6Qpx;ts(PqS9qQAFp{&P&Iops#jwo~X@f!O%!h0O&Lp}+DZj$RJ=5BM4T(@JK z;PxLoi9)+cuAAh#DYkorj=QIz`|iH6dtdr93Ndvb&m`<XcZ=2iUhZch53!WxY{8hi zpG5-QCD8pk{{=x0<LDuQ9t9{#X>{MC0^uq?bl#&L4T&ZPh4fHJk0A_4K|Q82mj_Tl z4-44Ch<dE#aU|7a4^ry!25)kZcX^)^D6q$u{KN(G?{Ue)@0eGQe}W+Qf0$Kn0SZ$L zRp%-)w=D|G9mWVoGZuyAN+;K~%T-{m0&^9Z`w&YpzTDSPRPH+%U9QpP9ykBouRJIs z_gWD2ba>A@aBxot_jGVi%hIzN4QNUd*|@SjCDl{DJ$uogLD-$16S)h;^qj|iD5~co zEO^f~*sq?CnSakG*~Au9+0&x*yv*%_u5&X8dW9%N5iD7+QdFV}k<=uEE-0#3Px_#! zUJB{uoL&;?^&oCmuN6E(*x|jlV`jZxMFGA1Wa@R4_xS<|_4*cz)yv#^T|i>JjIEck z^){~F#?@Pay^B%;OV-<x^)8P>dw0T^dOv|PdjA;&eQKM3AMy1OOP|%OWgVjF<LdR< z#twGz60hK!`@F#ie8)u;)8{vCAgw;Pf}n4JV){y}uY&p-W#6hutFMFm)}x{M_l@-s zPcz1`83*>=jU@UW;B5}^E+6qJr}&&NgP>mp>_9&=?kBl^M%eE(xBuAJD72sC`bn;z zV*4wke+PPmefY-y!x@QL^%qnB8O-Kx?!nUZH@E)g*5BOvuVn)}F{b|KkwAY549H7< zjAMWV1{lMD@>IgX1L{(rMucO0bfX^w7|IAnGYtg{SimBdvYb_z<A7(`i?IyYj~_q- zT(1EV7;uaa_=0o%%taJA;1B-hs`(Gh69fbEQIH}OrxdCjn1aFvN@w6m#$ZGP6*f>p z10^(2fddsdP=Ny%^Dss?@O2b5@DRo}P)Y+&U>pM#G4S6Y7?j8S2Z?Ktg9kZykb?)6 z!IBJWNHdb@Kqn+MD3{(0U@*g&#AFmR$hZd0M^S?wWC?3Au0fBp5j!^M8D2O4K^AGy z@7%8F2DgG>updN&3uAtRZSUaHRHiD`sYNDTQPkjG^hHsF6*71p5*hpu%UH>396tCt zjBN00gvB)2bsGF0$FQ-3MKsvP4*mgi8+;Lw4K}yI<~GE*h8Wk7B1mnB)P_iHNO>xu z$RP?FGJ~hs&y^q;S`UQ|UCcTp5+3@fhsUr?L!V<8?)p%RHB@m!ee=*a`4|NaRmf0j z4gHIMf?!wy%2AOj7~Qa%G@>c(=|~rhZJ3mXNom+%#+(1Ji5{jii@D6h?1q`$FtZyb zzF{_gn2LvOLV?2$VVQ=VLQ%smV0^>#Py@R&+`+?#Acf)g<DJ77Vl2arV)$Ctng8(h zScc)-*ntCvOJKMe4VS?11Bh=#6p6GV4f7w7jl~?%l|J-m5JMS(_(yyb1S5@UWDWz- z`AC0k<Y;dH|NoJbn1U2WDrDqmoa6R4Ug9#>xfukbLfk=q3SsV}%46=Ms!|=xIVyqf zj7I{aBrs|z(i~+OM@eAR6Xri^qX*Yvl!HfYN9UvVp!-p}AN4gqBjQmC8TBX97%l42 zg^8dn3K*?`(Fz!C_M@AVN;*;+Ev3;?8l6jT`Z3!4N8jmT8Z()Lk&M0<6^~Z!Xw{Bh z%{m@M)uR<T`U4a;+N~J<7yn=f#wct|UM%Jq1&&eR7zK{0KxNvHg`&pfIBZN0dSNri zj6)G)7U1wPD{$}_2aj>^81o$SJo`AvG0t!nNsajq3pwTjMmOenj7^Whor<}$7$s5E zo#hBu^ii97G$fihnxM)%hjBLwx^oeWd6>1V$JM>_Nw%?_9qhsm-FXg0-Fcp$xDW(m z6*9Ic5*b_G{KvYpV<V}F!^b9IW@9r^z*yI4Y)^VKk;xd>*qKP`_TNDnYg}WEYwSWE zVkyhnilW9UYOJEhzQkT$<qh66|FL2mdzhn~<TT<O`(+S}D@8Rd)i_%{t`5dDZWLn} z#{?|!I0uZ|%^r+r+^^V&aW}XX1mi<AqaA5zaD02!kH1Z<<5fLg)#EMP_;(TE_)~n& z7eO$gBsP44v?fSvg0W5L!$?LW+X>^@#7<u1Wpq5@BG<T%eVC}2iFXjr@1q{(J+UpS zn<)N?qMz7-&WL^DbmsE_i%{@Hdoa<0PJA3OPkbH+Pn5z$DNK9?$xhVF#P>PDM|_IC zm?)v}#NRyp!QWg(g_HhAadbQ>f^t;Eu1u<r7$>!$B}piJQYxJ=o=N=~#85^cok>%% zCzCWW$uduRkR|3nX_*JtYtlA!F=+?8uq=~AH|ZcB@-e3{j!AZ7(zn>`Nk5_ZN&oOK z=6zRQBzxC1?&E$I;?TQ{_pV2RU~(QxnEm8ZRG>1|sDUmgHzJ0{bYlu@c#=(QLD7?6 zM6r`!<``!<ivlMraIyj?U*HcEI$6q-r98!XQ^LtUL^VZ3Q|`n9O_{_Z95lrNQ=UU2 zQyem7FK_ZTl9}SbDdsxmBR=IDzT+ZBJH??>96H6JQ!U+8OE*<AQwvel{HL1hRFzEC z`PAw(pb;C`%ClIksV}gPSA$?$V-!Bk+^3oQv~)VtmD_*(2uD%eG{sFjg;b_z(~CX~ zWrX=p*ZK6ZOkf7Hxtn{iEYqbhUANOuqNC~NJKYtUVa78GP?%zrp*)qSN(&S<L#i{p zcg8Hdd&V53JL4f1hkYzzHD)^FX<VThuF#A<xI!~t=K$|<9LqT46BIN<S2MonauCcc zM;yHvj8V>X;LN#bXr{AfTEdwR;>?-L2(R$*1RHq@Ma)#d%oll${k+9Hh;^pJXF7bQ z!)H2t<`-NIf>{-bCW9{I&;!NH8qP?hJWI;6?qWI;3C~j9tTpVwfwSJgp|f;6%lu}Y z-~${y%e9;J6~FK+m-&+`TnmEPcaWb#6r}{EF^<^{uphIHW45MeZ{S(;pS{<Em}kF= z0%q%Uwx3$FEzoQQ%+}@Xv*>iT0%kjW_C;*<Y@N@(&dng06T-oB96ZOta~wRUEY+w^ zE$X6>In7BRDeR*ysbtXsOEae*0~m<wIcFTAn=_F~+|4{J(VV3$XBCp1vmSdi$L*Q3 z9m&qwh3h*<x^v#+6dIco{@jP|=6uf&{EY7ATtjDbZt!0a%+=Z4BG~e|<*9^N=jv>( zj^;)YOFYeJM;h(vNEhtGT>CJ$FQXV^{&US^?pS6rn>ozoK^CK<xjLHr7_Q=63p&?N zzPUP@tE0JlF}k@roBJllHrH~_{f_f!YVMC*<`0Z*?$sc;J1_ao|895q?t+-r-8u_< zLHHP!F8nc{ahkK7;~S(E_R{b#{EC-{En@fzk_$^Md@Bg%{SODtbH=>F6r&^&l%t~g z&#OWtHK{{=8WBTdn$m)nBw=6X*_U}4h<BcN=ZSY-H*)EX{h4QX<_%#u;+`kzdE=SH z6s8lN<wM-_EYrOEcz{KSe%`~lD)Sy;EgN{8jcn!_p5=LVvYS1;!s{HsPtJLVc$fD% z!AE?`DJjjffb+iOYs_q(dCmKoi~NR}%`>xkSGms3Ah;*Q9ptAFMJYjPjPafdRHhm= zs7*Z@5=|UUXm0-ZBzR~=GAX2yNj9D6N_TqFhyDy=C?gonSSD~6Q<=eR?&comvw#O# z!ZKE}I_zT|kMaah@ibf6&JK3*5__@f_q@TI9ON)ZImQQk%x9eDEa&)!@A;8m_?652 z$?c83=NdP-6$JPGkGvG1FvTcI1m&nm6(Xrg9qQAF7#h=*7PKUZwxp6ldpZWeea1N7 z7{l|;aejWxalSduH^=$rINu!So8x?QoL`L^nB#nNoNtcv&2hdt&Ns*T%}Jy+ZD>b2 zS#+Q?IrN|xeHp-D^PfM=!$`(3j)_cW8Z()LG0nf1`&r0CEM+;XSi^cA<4HELg>5{? z3%tn7?Bg}|^VaPbzrzvU<2WDk2`4$j7ktIHoaZMlaEagfi+}i+|AIh`!Tov2M?s2E zoKlpbJe8<QxVn#8)TIGY#1c<45@<y-DWs7}Hl657cY4x?{tRL$BN)wCCU6&1nZa!C zHvjwY@i3nSJjfE3v69uS<58aADV}C4+u6Y`UScn=@&<2mki#717$5L4pK+SAoHPIX zzwz)rKk^H|a+yE5!ZmJiD+nI=A9*Q2VTw_b2+C2BDnwF~I@G5TF*K$rEojN@|NVcU zEvaPCo{n^(8@cqR9|IY}a7J+_<C(-1rZbDV%;P>J`M?SuVGU0r#RZC8VC)ORDqNt# z1r2F}nJ+ki$QGR7BR=5^&IQ3j#Vj<}g$h`xfQ93jhM6w>0jVwgo2&dA1dH+@u|+d^ zfQ3ASF)vze{)^UnxETZw7N#gAD1{AuP?QfogZVzVhgW!wcQ_mb4>d<}52ceuHr>g^ ztRMOc<9+CR6!*|?{2m00rL=efi_CxVVh>9Z&*F7KutY3N;)tgiX0^nUF7Y)>#JOZ8 z;#?w)B^UUW%lr`pOU-m?CdRn5Bc16*A1vTfDK7PWOBJ>BJ1(04(n~?`@G#8r;mJ&6 z25;k=9yWr9KjmZ)EUSiPS{98Wmnm}DY{a_E?O7()We;--T`$x1vY%1ta$mc=4Jo8y z-<F4UwEQuiz+x=ljE<I@-Ev#M{8kXG2%)1DJu&|kmT|=Zwy>L**~hCK<WLZ-Y)dD) z(2XAWo|S`8(8?=ZHUE{@J^U90t5mcq2lHFypj8f9rJz+WunRk|Y7Yu}qzJ_*Nof@H z$Y}0lJQGpOBS$!jWq#xYQhDS|5Ud`GuUUPU`LCYpVLGnN>U%NA)ec#s>os?fkK#CN z&3Y{4nr%GC4*m&(wZ3kxuUlJ?!bDIO*KO_dXkzV)Xkx8q*A+q&>xzecc=5VEj6@gf z#-fXLidr|5zk^`?|8U6q{5WKNDIBu?epaxGHLT-Xe&cukLe%Ruv_V4~rg0y>Z-brL z5VkZMR`N&?JX(bYG$MvL5^2RQ_VXrY{HPf}D$++k41&ju>ah`w!U!H4hl3uo#E(1l z@nV#~s2(pvRU(mM`0+g+EYIWa_2X}Fn0JHVi4;21mG0y+kij_gi7)vI-9GU>mi7r< zKk4u%XEBE`_n^rq7YD({k~n;$!#CEXw)t<2_7KY}IDDhSH@?qtPI5X3o^t3@M)K4| zCSzxwx|?|@;;D;V;&=Y!1~-FXlZZD-c9YR;TF;|AjUC$T%+0M;xH%c!Zce2my54+* zPf@_;Gn_@2n|}y`rxo$^Tzv1-_cEU)JRAgD%2S)V808kD+|rchyv|WHx8(#M687>f zUjB@TpV8$ruEsMXFw18qq1&x?U~2|hbf6PGG54+F-zxU4I^Sy9wqD^@5Nr#f$ZewE zCi-oP+qN7jY?H#XMX6~1&sO$Ojq0fQSrtFKksa)0H!riFH-lh%46R6_E$vX$c13M> z#kL>dE#AR6w|~G#LGYZfe=ZvdKi7pE`kMc9{XK~FIdgmNZ?5uh5ImoUybMDU&r9O@ zY0Tgr?!(va@HIQ~Q-~szp&Yv0VZ(Q9M>9J#v%`+<u;?$eK_M@6Hp3TG@`CtZP{<1d z`3Z%*@DB=k;YJYbbjVJJ>=fxvk?vfKNOy{Kr$~1?Y?rz3YD^Q%dshPXYF8>JFy>uf z@-@b`>jJm`?DfUzSfUpnU=a_oiq%1|+h}$-BAPhj5&v#+?sijlf5s_3=L^pBV-UO~ z;+Hh^l7?Oyf)rmG#{_;uQ!m{#|Cd8S@Up017TwFmSj*Eq!?Qfc%j^w;J;`*S6J6;> zKL%igdyH_8<n|cL9?9+X-o29BI|U=#Yh-&hx!1MaE4jTZ&3|9fAlO%t%IJ1qbu8jO zUGLk&K@OqYeedxJx_+fSJ#h<OQN$~Xcx5D``GZ?Q@T%rsy@Pxdrz9KLisoK@KJ4QK z_VH>EyygeWYfE^T6&S;7kMTqhyk4JXw4f!eNhgyxP~7Xs_<)ZvlGncof;S}fhT`5B z#88Gao{8N4s}=iIx4!^|k;eYAl;<fFw|^HeA&vb9cq<4Fw8a<>nDYT+IM4%!9B{~i zpSglD9JtPZLGY$C-gL&B%Xyq9*<}82KJ8%#uE$$8_AMQ~rK7j9=}0cUILUXM=O=!_ zyx%hKx6SwMd$^AWScrq(UKs=j3sM#h9jrtZ>QIlJ=6_Ih2X%GuZQkKHB7A2(mhhcz zSi*M{`Hm%g=anEh<eD8yMhb^gQS_nCi29Is9WsVPC-?~aa>y7CoeP4);y*0*!*?;2 z>0uvce)!%XI3oTdsyt#DkErrUHB@<|0T1&iqC2t?(H&9L5k<Z0Yu;^2a}sGq8W~u! zcNP7vqThX;{T$(F5FAY+EaszPK5C9fbLdNdEYs0boI&+RRe$tH%=W$Bj9?UZGLC7? z;A#-OpO^d;q6lRuhmpLmf%nb+eGR;C^x^k)@V?m}OF)drGEvkqMIAHyW4-v6-}s%s zxWcU<I3D6b*02r<9e2R-XE3%C^=U>6+?W%samEQ}oRG$eqvn6&eGg`J;zM+M;%pFn z;Ls0-Gm<fk#k@Y4&PA?qotr`6+ky`ZQW#74;Zl}i`96FE1%0UFj~dV%jegXMBr?qZ zqbw}RM_;4UkIp0Nk1q2^5PYnVk1fo{w)|rSd^{8T^6`8W@ks$h{Yg=ZQyx3?i8MZu z!YA92@+Uiah1Y`M(^#bO>FvM&^JxmU_*0R8YKuQT&gXo=SA4@S==`(MOk)PKnacw# z41$v-sY)a@sZBHvJL%w)hj|x?pLE8_ljeW&bP${x%y=d;8Bw3Qn|WLbg421(i%w7L z^mJ*;Al}nYu^BTzt=rQt;)m54-JNMq2Q+o2D}CsPgwII!%wOhz<{uB&g5dN2aR&=n z#cI~E0SA1(B?!*y<g6E;mD*XUot4^IshxGe*`w&_tcK2><x76xry%&EC&L(l1i!cw z<NRWp`G0YNtNhD<+zNs(b^4`Fzf{PV8*yE}RKS;8*~RW4IH#C%iaDp4bBZ~qm~)Cb zr<ik!IH${V_UN3^oin;~f1}y2Ea_L4^s8lrSNag+SGM#kTl#f<n$d!mIN<AaGC9T> zbocc+EbP}mqk(U9_RVCbGJ{#%$NfR@?H$;SZ;kESvXrMfb|n1m8V{S%-M8D=j`@AN zCkVc4iq5{%*>@RakwbUh<ugw4IhOT19e=0e@6Gu8(TMqbd-c7&`hF&}`JJ0V;7fz^ zw}1WD`Me&AQ35kNFRt_AI{zEK_`I>4zYzpKjKs`-n1+}A;AKC|=Yb&j(f9vYi7G@= zgN8(5bU*IIV*dCtdwG+$gW#uZ^Z%(Aedy0XMlpuJg5c*6dB{fr#Q3uqe|GTC%Q3#6 zSF@IlIP4eE{t`_r@ksHPB--#iuktzvxc$%n{qi1WdqLC}EYF3mi1<P-3c4_uBYet9 z?7#&(aN&D?2!e}!QS?PcUmV8-?7+oY*pG`>xXN|@3xZ!Y^Q&flz1#eMeaOQSma&2j zJQf6(3Q>*<RHiC*sgEcxss57UFTKNIKH#Gu_)U_(8P#v*|Jzv1|F`KF*<}r0*5G9g zUe@5{T=T!I!^=9n?3*v2<7>XdhFreH<skUoH~;<s3sLaz3jST}zl;5kO4OqPQN+-K zM9laPh5g~(e@O2S>HYB)-vq&*()#oE|Nj5!<$umW9DgogQ4su9jYgQ`UvZe@U#&>u zU2Oher}&&NQ0!kn2EpHU=x;CnTjzgIU=qggxA*^j`;Y&Har}J^<G2#O!-siXd6-9e zoQ+tdE6=eb2>z*sBK}dtKh4nHKW%BpYbfZS_c)Gj|2d7qt`21)cQF-XxH^w}xe)}{ z3Y!15!XAoIf(nT9n!~T{#GJ3WGS~Lv%3KrYzqa__j&vpmbNpA={|-dN|BCkC@A!eA z_?<t4;JUB5E}83+xh|ROlDR(1{I84VhMxg9N)bUh6mp{mI=``)b!<R7H=bl0+k@c0 z1~eyuRv6EJ8Dz1A-Du#yeZ0y+4h6wYDc)>Hn)%<%q&?l}fk<zP^rlE}iu9&PZ;JG$ zNN){8<+mm?jTzj-ef$}Of`I>#m;98V6bpHTHLT}Ro+kWE5DLYSL>t<XMkl)PIY06< z7rDegTnj?~%cd87=+8h#F@~@CmEZV-zxa<^K`75`6qM(|AQaBC#KXg^MP+wXqY=?4 z?2dR^p};$y;}u?GKW}oB_k&PgUz^w0<kdvpEIQDc9C|Q-!3<*rqnRIsLwUD*@Y1~B z@Cz!<dp!u{D?lMiQ<e%;MuGY2(GW%Ei$#(76qzrbZa6TX1M@jBp9AxaL@N0vGmV)@ zA>Z9$AM4Obz7t$QMEMI-h8ol&iWqd6-(mTiqTBp!NyWkWb)8?g`5m0!81heLI`g=X z2Ux^n9zo*y!y9}&#*>IO|F>KYLIuiG9bFb^f`ba!jRImVAl3p7D$oP-FQCf;x-6i} z0%9#NmIdtKb-u?g6tFi1EoZ^vl%%5h7p&qTlA6>(mjxT6!-CC8#K8qEV?j$+a3H!X zD9(ZoDmb2rh_v7wBwFwu=3}=Cu3;mJDY%nYP*lMKylwsk4|x!M!H@Wqlbk^k1utM9 z3Wdl+5maBO6lIW7q3YD4F7;`I;tQpaN=Fo5$X*o6r8h$u&M4Iu(n+ClSd2nuRY=u^ z9>#nM8Bd|d(LtfjJdZ94?dE0n@d^J1p~4ona4ZSfhr$jl+ynbicre2-qQcHAJQ?Q| z4$t&q6ARysnH64z!wPTWIbPsJ99Gz2h2P>Gj&PJ?e1^0N|Hkj!F2-Fi5+JoA`H)%> zsTC<hIn2IDP4h3J;v(i<q$NqTMQlYf5L*#l6cJmIUi3v5MJ6&A=@nVXLo8)E8YuD@ z7P^Qgiufs4WGlPa&-)zbBxlUO$QK^ILI*|6yT~PUQRGjqa4QHEHTR+ws6;L5(ts#5 zP*mhaTak<gifW+fKwP<^3My*hirTZHAK<*A=lGFd!ajcGG7c<y0|yrSA9s+S5{Rpq zLyK9kV$v$slom*>nAD18(4LNTCI@L1vt-5YVhR!~X1|Kvhr)_2!ms}d6?=rWtVeXk zwy>Kwc^i=xb3=-K#HXC%Yrf+LenN7^{^Dj3DqfhPltpUAD^racG$fih;?2K!GY`pR zk&8JOAIwlxUwkB^(M9p8%wQI}DXxp+D>3WhPqCdHn04`&*o!8LALKCa@;;g<{tXw* zzxY)T{|2EFdB{gW%)5k*Em0mbFHx09YSIYvE|E?qUFk*-deWOAD89rfT(=VAn8tl9 zL+T|q@VNPx*vMv{VJD(5v4?%U#!3DQLM6poQe-7tkwy;P>CYgBG6HFplvYV;m6TRV zX_b^#$p?^DNokdoR!M1<42!FzxJrtvq_|3otK>lrBd(I-Dk-j#;wpIwi(2v;7PX{B zE%iV0QjC&BP!@A9Rf8B5T*{J`vZSRfX(>xustZyJm+I$XAR;R@4D&8E5fztuki}Tg zQfm=esmGC6sb_f}iIsYhm-&!?f>3D%m5!nrcB`~8l{TKz##35Sr6pBbQl<U+|4`|% z9z<1IRHbL*;L`J0gt$tJtF*XEi>tJ>N=vJ>v`R~>w6sb~tF*LAORKcBN=vJ>v`R~> z^kt+~T3V&06(Ow%#YIRfLRu02`Oi><xFW<AA+88<MTjdxToK}m5Lbk_BDx^12x&z~ zD?(Zk(u$B)#6%PwA*~2$MMx_`S`pHUkXD4WBBT`|t%#jSD?(Zk`w6Q!;xwQ09Y63h z7x|5=T<2yGDie^0B9uYFWojYnGO@%X@-hjeU`fk}zKkZyXrfFmgBZsIBpxm!@-laG z5A#{VGDKfSCuMX}Mh9g?UuGYNIKqc~!b#5X1?TyR3;fDu#9uZa1rT{z3tF}u6{%wW zW$SpTPa~p<Bau|PBKERkFDv%4VlO+KQA}bA)0xQ}?q>z7cnrH!b`x9JhUm+RzN|*d zzRDZsU-mFMDf=1cusmhI=SP0wPp)vg6Qd|=6y@@xlX7LLhEbHOO+6aYgyv|ZTq}~v zqz9TPHw<Ga7oO;2GSkpSxqHz?xrJD$a>h|^HM%JGJgP4DI)^ZZa!0X4<&JZbGkk$Y z%4wvW2Fm>tgvy7o_2o-YfyyX6TwdknRbF27<waj!<>i}^Knk7d!$?MR7gMo3<?T*+ zyHkDviY>3$@(*JK<u~vQFR_OMyp6)kzl);Fe`@~aPkHzpRhR#YpZFV9`_sTs1sh+% z0#zu8&96{~@>HS<k<>@g6<W}icBGL(7CDH%LN7E^p+6&-5cZ*y3iqRn3d>l@YS!^6 zPqUTn7(s=dyn?-{U~ejXhPW$;yMn!`@FQZcU~ej1;Tra)g1xDjpVBD0qU0-vElWkw zR}_6k(O0xI72BYLis@vMO?L(`k||6>@fGhy@f8>H5UW_jdK6#r2^3%PWyD|c9qdZQ z4^e!$;z<u@_?Gkhgz78)is~zgzfxW-Po<JXP>zb!qz>Y*q>)M*sic8QsdS|q{TRp) zhBJyuXrj_|^RG11!yI%`$?{ZM%hNoAs4Ka%m0n^G`*;goR64>@j$s6qzT*<2uJm6J zs+^C4*qO@3DTSS>T$So5zH%KAR*s<+7NxSND|e?S7NxR9sXU0$jAa6<udMpYb6LPD zRwL@l8`*>gDr=y!1}g7H@s$-{`85<@S^Skh$FE`zRsNYj_?xTfpt5DDlAl5pMF&-M zP(=q->d}CBnvsA8sw9(%CaQFz3r0}I2&#y_%6Mj@@G1|m$o#7;_V6$(*udlHqKYo6 zY(d;r>_n9-L8z+es@5fz);O@L1FJf)sspQ<c~$9Em0DG)RUL|htByiyRUKS)0TQb! zv8qp)f7Pcvh^y*Ww(}Bud6m~Wz`K}n)l+<pWv%)>KkyU3^B4c%x>daqgsSDG7!s>i zg*w!y5k_9EF)hPBl4wgi(&>!IstsTyV;ILoCNqcI-*+$b(NVQ!JjSy;hwE0&ysN#& zexz9KJzTwNAM!C8s^(X;hpPR8>LWwsp$O(3Y2J}#C{J~2A^u2RMCu~4DGHAiePkDU zqwvUqxNec6k2Ld0(ML{U8g5&p!Xu45a=H0OuJ@qw$R{!LNHdRoffvz5q)|i~MdU$L z9;x!kvnV|B8;l|HM=tXx_9W60M_vy?)$gDrRf$C5)fHYnhQ>5C|LRE|bWuGO@mJ3x z2VGPjiw>$!XBHNy`aJGqF}kR}f>o^HNuEao)x}?3{MGmK7VjYb>YAwj3F5DQ+8nFv zqWUFnSNvZPs*#U^6rnh!sDv(RRHr6&&_#__WYC>l6kS8~HAG*-*4MZb(bv#G4Gq+= zJ2jkHV<8H!5q`qQMl4PZmDkwGZuW41w>iWSEKm)V*Z7(Xh`GkUL8xXP6kSu%H5FY` z(KYQ%O-0vKbj?T<U9%A_Xh#>M9In~d!vF>|jFC)aG8U%h3}!PQ3sZ9?kD~CJPw_Nc z*~LrPmzuBeI;Xf9glZ|ORufudytTS9h#}@*OGLHIxYi^@RZCR0=5ZenAgWpqu?k7m z+Ri>KWvzo8<|xPbfYY4i9AEPt7x8nUwv=iYz*5$ZpqyFMu1FQ?P#-bXjwX&o%(u3x zYm2LP4|*ZB+ES}6t=eN4#{}*|TD28j`w`agB%9d6HlD-Hs;!CI;n#e;!JFu!_DOV5 z`y0OJNBn%K{VP|v-Ng;WS|>yybW*1(4T+)|3A7@a6td|=SHxc@mx1PAXRL>rsJf0B z*IB@WEMXbzFz-6%T}S+NHuF5<uVcn_EN7i}d7l$}#OHj8`0ISjc`k9C|AJ6mW2jq@ zBIaM$w$?30C3I1@IyEtlx-saYZW6{&w>=%Py>)d_w;#HwJA`2vM_tQXcP^T!yBK4r zyOs?+jwb3pize#s4EuNy^QgNYUDQ2}G1NW77kq^->Rvz>b${nijHB+YAXKj~<*`Tg z6kbo^_3C4f>S>@}3tFOydTnS&2YL}6?nBk}R9$Z}(=d*DbGRRiRPP~{U>x;~qn<^o zx0PMIgezCiIO^G>dWW$`^^Rd2^^BvQan$>fKTvRedsDv<Ma{o{2@j<yOEqdxo4Pb0 z9@W>+q&?lpr8nZQKaf$}$#^tUUnBK3P=67MukY&CcN6Nb=P}%f`rCNU{OiBqK_~Tf zQeOx4-$V8FKjSoKImb8r!mnILH}(JKW)Ny%1P#id_y)CzA{NCrXhs4lq@j@p8fnmx z+kgGH!NaJk!68J}z<~{Z;7=UTzyS?K*6<GUQ;5<?tYHNzQ5A_bY(f&*IG~}V8cM36 zq#8=9;SeO%P*M#i5f)X$X}2E`Rl~K2si7Yj4b8csm>NEZlp5~iHTL7@MZ<$gs^J+F z-SB(NxuKLAN~xig8eZcDw}Mb3O*GO(qoOFjQ8n{#)W}0L%}Jy+wzQEgZPbCz<j|d- z3}Q5Qq3A~U@E}WA#!6Q61W)la&+sg}d7Y!Y&+R||Yjnzk4Q=!#U-L5;`HkQCi~oX9 zl-Q$+V9rtH5Pg*BqpDDc`e-IfGf{D9CQ1`gnus!jsJ;wiBx4xIL>)xU#I{D=e%4LY zd~_3~izs7=(m~V?ENPS_joQnrh(F48i_%S$ZlX@08UNDnP?Y_N(m<3Yjj}^gSGgX9 zqQxJbAI(H-COTZ)M|o^+bPOtwR(Z5BL>oi24x-cPj4?#_peKD8%0!GJdNy~XfoKgx zFTgmWjU!qk(e^5O1DnxEv>l3m)BK}VAFcZ6<9xtJe2#HM8%OlFoaYk%2B8=o#FV5o zm8pi}V`@_m4aB$wG0jP!6=^6wW*~zRe~kEJCYpcDWDnC2f6TqykLqI{MD;OG@)X-K zh8Wey7(<LP#ONT#7-Ebe=3O)r^C^mtF@l&s5r53hAQT%y@v-8M6@RP-V#_)-)*{7L zqAGPUhFDd{CXqpVI?{!1^g}1HLm0+Lj3IU|x8JvrhgiyTR`D1biQUB0Y(*on;WvD| z$1y(RG-o--H~hk{T*flR>Lyk<afPuraTTda9o&F8Hy};}aV=<xCgR%A4mTmrO^EA@ z!s8SkjvM2_EaG$!=O)C>K^JirDQ-SXcmyMe+syOqWH)<wg||6`5yWXG?l>pWMBD{_ z<qFrh!L1<F_<s~O|Hj2Ul*Bw5m!%pyY21_)Qt3z+#NRj<T{IrTa7Lkt#^adAeb}MK z;%_Ye#^P_hhV_WQ@fNnRogF%DY>^sUq{b?5e2O!C%Xxl62aPZB4{ku?|Ik6a4&sd= zz6^?v7kzv*%}Jy+qK_ASyy)Xy;dr+ozB@e`L|E1F6PUql?nd<SqK{v~GFD;)@oU-0 z4qn6V#M}IMS2+F{AMi0}5q-S<iT@5aA^tZ+AAd6lHOWsQikg3u5*|d~q%yi_QiEF5 zB^F&YNhXtQI?)wfH0h5nnheD#nixfsNob<UJQlH-hgpFpnmmpsn%Jc#Tg<<SSu}Z( z1H6SXG&#<Pe8Ne-!bqAJNs}M>g+GH((*R>=Y79+_VUL<dP>x7y;$}3hM?;#>28}fB zMW3(_)i)i%XvSh3O^u_eaWvIQQ=RztyN8<Ur0F`gu$5iB#9m&-IGP^DIGP$q(-VBe z=lsBB{^M2<YE}RvXcjKwL*>nkp;-ltp;<MmV+_rruu#oXNvAWGs96tm(5x@RaF?5n zK?BV+&`bl(+=6BcScV;Hwi*pIdz7cqM7Y^@56`ocSI|K-u{ZmSb6BEg-y`;BVs9q) zW>>hzb#4Zs=J^qO^QwrsxuTmlBY{>VlY-cr+n?rL>4snb6>2`vgQ}a4XF9W(i`bis zz4>A+P;(2^d=+bW5=A!`d-K;h#JjwY*qe*Jx!9Y3$=BGO=60v~B^2G<7+U1x_ODiG zVFWFTQ;JIHqJ{WdSe_Pjh@mB!v`6JFa_LP!G|*xcccO_F6Pe5$9>mtSc#6#^x`m`$ z>}C&Pk+*mo9kkFvi}yIrNxtG|u5dL7C4{&GaVHd_C}pWYWfY#E@Pr1~^n|vwqXV6> zHwpG8!QS|{?1vKUO*mns2b-T@1PN2Qhb64%Q7lTrGi+l!I!I7?g2EGCXFqSD@Pt!* zgP0R8bB!C^3POqhBQM1$iG4{dYyOF<PppBM6XQsvHEmFRqODI<eWL0URiD_CJ`80X z)3}fOS;}(kNuoVT)I{PYwxEGT4J7VhFYj=|{1eY&Q4)VZ+=&<YjX$s~i8q5#%Mf|U zM{(>)%UUS7Wjw7&CWSQYO3SWvN5L(7(~sfY#T4cew&g8V-|_(#u>uRzaxJQF`53Bi zX<=HvjJR8hyQS(|9zpCaKj9>2&`is7{K#KHsFlK7DZG^>Z>8{7r6@yrs+)f+U9_r8 zeHzgeU9=K;D;=~Fb*ugiVkje+fG%21WjeFaL@V*P5__x7D7w`PyokbE?c+5R-b&%E z6yEBX`M3JO!)eZAX<Ge<g=t-YLa5wtJP>MK0=v?>GSyIhYsI&Yq6KZ~L>I)}THLJ% zG6b==9?v91-`dW!p2@vo9}lw}akmzC>nGWS4qEG=wGLYAptYrG{VE4JhPYdcyY=^o zyY(;piY8iL;|3Z@GJ>Q#C`v^%kW`y`-2VGNNzufSNNa3<k`W}Op(DTRK`3b$qEDKD z=#xaBG=tg9X8{kg7!4(@<ta3fv<rnNy}_GkAn7n4n19m89zNp~pYt6T(LvJnAe5}~ z<op;#vJR4sA-Mv&NH&IKV@R%rF(hjsxfKdeb_0^L(Li!n`p_SHlx!r)Mw0B`{}@Wv zLGoN4U?I9l)<yDCEK~A&9^(mgl<W>C??V^KAEJR|V@S63$=~oj#*u6c$$xT%t7xW; zX4;fQ@og-8o7;cd-KGi6QGJ`%h`&u19q5ee+jK|uZN@Mb@wX9w8^yP|n|n}rn<Xq` z1&{DJTX~TKyv2JQNAYdK?rs}*x6N04%Xw7a<`-1oHsF60rWmSk8$mfDsYx9yQ(L># zRx@qeBKEdj=uJNcBKEdoZ#$kzOfmnqu0q?H+>6-Tu4WTYvx8l{#9m%S>}@Si+oQbC z2~HvQw!d?`=o{P$LMaMQ$x8tgo}%y+g{Rn`6eCFS&;N!}qCGSxm2^a&(v@!XpeL3l zWhf&U#hs`=#onZdJw@Ru;!d&kDH{-b%0`~$d3It1DKE1hg{K%n%E_>gGkk#&q<qT- zE}@$g-K1Ec6y3BdLNRpEt|C=1f_6sGt`RXbrU@Eq*M|0Jq@4!ZiNBq~+l^-u8fX`u z?qeSJ@c;{Xh*jvI-6o#n1$59(2kmTsJB!rr9gbiW?T+yo=lB^#x3l%BA#8oBE1X)0 zqLjr5QjH*-TGc~!8ldXb1X4&NlWaQClRmfwsRPkXs%}y>kUAg5r#{RIj3U)2QjH>Y zGtXcYsTxVuNU8=>-{yq*r=IojB|q>Jzi<&FNd1R@`41yV`yYiVLk(&XMJ(|&Lj!3k zXdq1kY3=DqE_NtwI7X0W1Zh*kK6H>a3nTDbZ-mkoVFYPQS;G^kJZ%Sid6hSKlY@vp z?E^mMQ%><Uno0Yce}YhYKpyf@kRoUzJzU;LC8`ifed0)>4Ow)cGdc8N0D~FE2u5=k zvsuW4tYkIocoa>fZ)H0gNp~aCcbk9u>mClF`gGN&8%4V6)4#(=(tqX;bdqkN(v2hC zI5KpSQ5s!j*r5!?XBbI_kz~{%hQ>6dIf=BxC^C#9V<^MTKf^3C%p${e$e4~%WZcIC zEW#)<j3Q$VmMLQkmMG&zUdA$Iyv94Y4H@rYBpF7MahmgJAmc9-o*9q_4P@T_|Noh# z&_$+EWLCr|GIfw?p)ysUX%v}lNhJddmDvqlWcH>nMv^&_soaBtGnXO$Oz~%mKl3S` zM*Nw(c!}^HAFuE>D$e|f&oPEfW61oDANUPjWd4nX%KSG7W$7ZT1d7h8OMM!n=&TmB zMDbaQ&Qf%i=(9SLgQBzSO*m_s2XSZJkE*j&owb5htVZQoD$i1R)-ybd#mPFryL`qe z6q}{kEX8KonXHQ_HtQ<a5q*2nw=YO3{P1aC-~8J*^bn1$Z{LLGh`N0`S!B~4akt;k z`yA(E9NylH+e@px0@^E}{f!`$U52W7cXkxUlkLW255t(U$1slDfBiRmGE&H%$sBI~ zclRQZY}YCKAtaN%9I0em#O(Dv#*=K~Q>2h>blHl@R!p{HvZawNjcjRT8)5bzNF`e; z*;2_4-wZ+>Lfk=q3Q-hu?NFMsRG<#^&`}2+b!dhecR0rde&sR_=-|a2#NBZ!8tFKn z1uS9(n&^}VXM{VI^5B3@=FzDdHK<P`VrWcDjHFXnY<{Oc^k)!55oafHcAAJZJ4vyV z^g21L)9u4H@HiXU%y!&@PP@#%(@P%S;ypyz=?voQB)(4K>m<HTI_vZ&SGX30I{%Nt zl*jgWu1+oL(g3^Exe0cub0Y2NKyUgogyG!&`#+uU<SxY3c?Po)S?49J=TSDXg>5{? zZuamBuXC7B_yPrYHj>VN@E3~iY~G!31)(kq?~<1Slp<Wohq-o9br)54QFRwpcTshh zwurq;2JPvI$h(NT%LJw|6LELZNS6m##9|(1Eh6tC>MlFk%d5P>n;bF!E@JO;oDcb& z9}#yK3)Dr$UGq_pA{3`A6{t)#8qtzlhq33cs+UFq5#ad&n7x(;R-lbFQ<{QI9m zU6*-S$!gZ|B;xKW?ylnQx`zWC;{=~^nzPvcuIKp)k$1hswIGxu<{ZW5l%zaT_WR6) za_mWtv~wB~&F#O^ozt3hy3vDv48)S;SdyHvh&#uQ<k*p%yHS14Diodb7>dqObdI8P zo=4m{b|gpfIf~DD7lr4XLeV+j@IAMG{a22vbAHFN<opwax`il2IYiwplA6?^KC#5p zj08mAP3+xz(Faj?6Lq(dj6vkxrZ64Rce|gZY%u?Bs_(X$XLuIXcYBGwyviFK<^ycE z-##bQP2}A~-c97)6yNP{u5z85L8yBHMBlwCitk>R21KFw?#)T0wfT2%<Dny+$)P*_ zF@o;<IK&a&!wz&8WA{@*sE6)*v?Gm7+GB)0dZ2+GZ*dUc*W)-J@(G{wC13NM`S-Yp zrRkyiT#J*N7aiml#vRQqgC)wfM7gzyL;Sfq$Zd@Vaut%RfLx8_c0nPz_Q>y$6Ux04 zyOTSW8O-Kh?kBv^$3v`TJ&*AOTX{AJ^;AI5YE;MJJ?%ix7!=Xd40~?C_w;;{r`XQ( zL8w;*zNeSH=@pHy@6`m+_fmK-h4+$LxL3A^PIN`|e&?D{uLZn_h<X<%i9U=(N4?#M z-V@N3-&7{ldl4&G#X25E6TP2f2fJ|-dcVScjHdTHd~E)`&wKcR-?)JV>XV0j6r>m> z(NUi&G@ubJQCOe0q>_OV^!dM<?gP5Y`uqd<`y%dIanwmw990|@wJJF321ikATdQP} zKrV!k!Ah8yy{Cd8n}m>klQ1RY1`G+rZKVn*F0_ghm8uk#e)#wNJ?C?I&&j>N_j$h0 z^WJmBbBq!6GJ;+yq|ujt7(=gY@)*J#%A;Od_$~+&+$f<lkKw}!y>UQ7I=SdJVK6?N zFpddK#2gc5GmmGGK!OAkV(2)*)041+HeSH;ChTSp(YL*Pgai`yV;K{E4#LFaIf+x~ zz!{9f%@ReODC$JBPh8F_R%7;wZkkxjdg^(ek2w;ANhfnAXK^ka%|A)UNmn7#q-*e4 zB|T0Oqj?$&l~hLq(n``z(u=&p>*yqDFZLyAADT%%4Npe0JxR9Q$;FgVj`NahSZDsp z+g-fIKM+l_!;&4A{29_n{)U76z)$ETr5#d9xder$bi+QRxM9jYbmt)+=Fjv(At@fe zlo4nwWi0c|KSh)&3t7xE4hLasdvuU0_SADYp9^rq)ZZbs)Gpk|pLmi45=kPHEb?)~ zR5wg@!_)~(W*+XF8g=7TH%@iq)RjmgRRO)P#G$>XA-djcS<fcwXk-gJ*~@#_qu!q& zx!yl;2v1X5h=$Tm<X4=^Z_z+BO>}AEO7mrq){{s13s0b<v}7WvJZ&bkQGJ@~(-f9g zN(B}#tu_eLrIp@^-{S`9H**WOb0<A`5cf)d)cn)`?qU>+Sb+o6%dsTsHRv?GiI;d4 zdy@W7cJVgv@;P5}fNwd71kxqY$JqKPpigh6;M_hh^Cr8@zmG%uIHZs0`s@$FzT)b8 z5~9jzrj<4nkfDGK1!O27Ljf5+o8hw=A0Yk=XJm*!LopeO$@q@%QAmd6%{UT-5z8An zmJ^7c?B&;3w#b>B&3Twl<RUCw#KJ{7b2Zm;JvY*oTlph*aWCSHh&R%cM={EX$2syO zmNSxqFSSTt`k8-ZfQxMM7(zZH7|mGBJz`@c)0oK|o?-z;7Foh_R<W8Aj4vYQi19_% zv60O*V3ZMGN|6?Jn1AF&7q9R-J9&#e?B#v-@h^-f@&#XG#*u&XBZv7V2>TgZKU?1K zc#N;#DRkfr&f;7;av>LU8COKTT!n4zcO8G=W-Ls<+p)3z?x8ym@FyPOG5*FAB#=yR z`Vb+Lf#fonVGL&!NAEeFNk^}zdYQp&<}sgzEM^%iDPj#}R8q}aHt-zv#M#O=w(|ln z^BQmPCcAlu_xO;H&A;ELE<WcgzTqH0@E?8-!u|ora2zM{D^BHfe#1GO&jobiQZDC8 zuAvJza1-6QjXSuT`^>-p{VpEjVg5`n5*fo3rm>20bl<;~S9u+UW-2hV9T(9V<IL>A zqZm_WHu;D@(>a;W$#hPpbTW_r{cq+jzUN2~4hV6;0DCY%#RGh3fLRTgNDZ42_kaT& z;&2dV={!rvS#F-Cfh-MVX&`GXiqD!s9nIMKtS_*<S&APRJ<ZE`bmUg<#j*|Ti^>P) zGMj}wi}?;z`9KK_{EnaaB?z-cpDpt2tFf5b$)qxx$=I{(Vq$0{TYA}h%s=}b7Y@pH zP_~0|6q9oam(i2QvE@0s$<a-YZgNU+NRB1U*^On&`3MQ-p1?_5!F8B@u2gb+k;q7- znX9PW)#jgD<-$hizJ|kc-$p#Sit&Hi2=g42=b$_X<>@R>XL&lyQ&66Q@)VS}fjC?E znjiU35Dw~yMg|$rpa-xIgZ@e;gBfc6gTy;Xyo1C$=y_g5#DhNOD-HzV;N$6ltsgAn z!8dX<DfGjEgC{T(=MC1-;OD60T|Qxd5Dt;dkTduV*AngO<rc&|#9>2vGYN+bnM)<Q z8?uRAe89dS9C|Wmau(gV8@n^K4+F`;_s7sRl=2e)<Sl*(!eNpf*3SHgUFbr@!>%L& z2Mo(VC&L!7kR4c<VQ+9K2=jd~zdd5j@51%?Y`)Lt`)t0#^QD=;gpD+@l~4JG?}D(v zXbO)0_n!iX6qrka0}7I`u?3c+U@B{=rxD{QFph!)K{#A|!!O_>y7LH@Y`B>YAH^7a zW_T-#A7OkWI$(SwZsR_B&_C*B5JPx|6|ACx7Pceu5ufoz5c+K<;YgK_bn}sSa6b>? zjFBTz{K%D*QNb&SeB^E{<fvmfmd;#H)ECXD0>)v1M)`nW4ib*?fzju2373(_2y{1E zaibMCT5)3}F-9?CBrzt7q2%M|W1KbSH8Vb+OZgp%^d-U?qBb>Ji<v}!;+G&C+YJjf z_Fjx(>^z?4b@uR15RU7J!p2>WxsS7S<1F1ckMlS)A7}f=>3F=3#~;h>7}a=*jUUT2 zW|;r@Z7w`+<6jNJ38!)nI-lS<osdKd#l)!L8yq}Au@i6RP82(FE|zZM5{zu3kxewR zNn)OKD+-uoM3W{mnVsx4|4Hu!;baj_z7!Enev&kFHF*W4l=CIu^J5TB>4KD|ICzR> zn=%C*O=;sFIDG0!*q5nBG&LEKPwh`Dnw=`mX;Cpw6XP^7PRl@q)AFcCGSj?y`fpL# z^eY&TZ@lTV*v*H06ofNw<34)eXEQAGj75Bnf@er<rbK5-bf!dS#@TM%GgUlG+_Nm& zEQQP}z%tIVjI;J3!dYJh;q2}_!k<|~HMK}&_K_f*6C$}elA9yBIYu>SGa8vI-MN>d ziMjS@?oyTq;XJ?pC7jp6#pw)S2*Xg+JTcA_<5LQI>S}(^XeMJRpE~-py%^uq*V2_+ z@bjnVFpu}y&*won-?--A&Ar%_`OmT>>ct!8f6KujT+kg|F3{xyZ&*;sY7PhCGwnH! zzGRcjtL$P=5H7q91uQg*g)1q;cfi6!LAa<LKEEg(kLe<xU$lj&P8YoxgwI}p9eB1g zBM|?ylX!=Z`6LJz{}J<D`~c!xT!Nb{*4<*oFE)xLH*p7dv4~X^;X7rCG?siAgiFt% z6OxTCO>;4TftbtEVjR45H%H(6Q4lUu)UxaO1EWybvMG4aGVfXDJ<G4c&zCD;`B<hg zgEujv<sSs$3g@hF&I<2aA^8<k&40yo7vfv751p<Q<4Q5E6ywT;h;n5iKL+8dkYjk9 z6naxj9SuQP_-oGQTr$aLI1()!iM=UwzruBFWV0#?kAAR;=V@UFFY*envlH<ZDzebR z6^gM?v4#I)Kc0{x&v=noi)?z4Q5K1}=u$4{O0J;`Hz1*+ZfLM5dWV<0xsUsKh=)nQ zvs#o&8j>hl%^J$6Kp{n6@--H?=wJ}87V&B~SlyLdxt&31boDqUGMRcb8eRQ@i<hy< z#qBu_-&)0Ip`+rS^dgZIL|*(1MHEv?IqxBf;;;CI?}Bj672L?p+=7nR<S~Y^Ofdg7 zlU&rXoi<)V^d;t8;=7^bbi`Y7Hh<ztq*IcNbV?RrKT4!iVsT5PQ}QmKBb|~1NT<{& zN-bWgbV|ivDxK1!|NXCYG)Mm&k9bNq(~5XX?LnzxO6@_ZJt%cp>CYSq!m@T8%L$x} z8<e?0nH!Y3L78sL?%-||TQ-1!<T99HM2CCPL75K9bWo;)GI5qwQG+zfcJns6D*J$s z_#_C+B~;!436)Ez+_=im=K{oCeh>Dl{C*xnTIFtBuHmD9@mX#J(eeo{EJXP<%(c9f z2AX&t36#IVo9tm9=3D+FQmD{<#hIMTW&EBVJWK>PtC-GA=I|66u2@8|`B&(;LdO+4 zuF!GCIxJ(wF5IwUFYohje!z_@4)aS8R)+kV(@;d^SzO4)T)~Z4zDj9S-p-v!rSef8 z<8NZ9e1Zhbs8Yq1{mCK+`%o#J$|>lgau#!0#!8B)q?+|?r5XEEX_+gHuTnFW?_hkD z##d>4m7nlg5LQKx^Ku5}S9K2NS7m-xow$;#xt8nc!2>)<PjpfB7g9+l14UO2A|J(9 zDZa{Rt7b9>@mDQD163M`R_UPXIqIk<jxMUUVe6}Q@)qy250zIP<a-YB6ZRn1j#Dv; zm{G*e<~)9jMq(O?X(XnRn6bpVa`fN-W4emzD5j&Bj$%5BC1M=0-t@s!5*x`Vj4U=D z-y1RA#1^oKRjj6*O>9OpG0ns@6ElvOal~FlBeBClSbdShsxRjc+(b8S;|}gdLDhdp z5!K?Yp2vI^vKTQ|i?LdY)oUoDl4{nn0qIstwpuaOim6si^>$t$`m&cFIa<vxL0A*g zp5r-*Q|N#lsj=NP=hBf2vE?-$xf+{Za}^%Fn(NR^&0X9>ckZVa1=MVznU)}|^}cAW zH`aP%tvA+sW39?+ck(8?c{>Q#_98-mvdHFLKIcmg@NE#T^Rsos8Oa#N@)ep}_j3@g z53ncerM`Y9v(10KNY_6dgc~f+2AyrVfKFV(Qbf9;f*3VHxKZaDuST~Ub-VEfbhlA= z8+Er)cN=xL$<H_4%I(~Vac;8Yn>4t|E^K;<S5)#`4x>=<bK{u6!64imatz0D0>kjL z%@%L-RHg@Eonq@mUv~{%u-$d5P;8xI>&(B-{OjsbT%F?TT5<EbH;BID<zvKG=caXs z_=zJySZ@#N?LoagsPBN;*PD6$wdlOw!q#`=HtynHdeD={Ng<1D2BU#`<EhtZy+-RN zn!n$65Y|6K5yg~Kh3e~7U$6Rl)z@$1W%i)x`VaVsPxykb(L}vvZU|9ygYSR_MK?&P zp%a(VnXA!+-=q)?8}4%PFpu&#o*;o#(#b#<4MS0R!weMN@DvMJgvYR9C7NicMBxq3 zqv!^+Zg`1TvDgi7p^1j~*>C<0s%{W>qpBOty75GQ#c7<0E*dXF<&7e5?24soypwzI z)HFVXCK~@r5{hmVd848mM=+YP*quhZ)2NBY`9xLTDDp;CH`?OH^=zVnCUnvGB0Kqj zeSFI2e8qQs&mlD7_eg|sg~vr6S9JU`uHY)Va08l%+nM-%<{wveT-<S0$J6LbKL(PE zF5;FZJ|0!a#T{SF3JNJk193YOw=?n0C^|0g`0KpMZtP54193YOw=?kr95VkVkvFNj z=@dF}2Ip`-x@fwbE_CBo{)p(Cdh!U5^CXF+Ao`~MWRZg+n;KC_(|ahQ=`+6MK-7x} zo4yaiEyr*yX20cBPUkmt<U%gyG9<QT6r~v1mUZZQODj9j`Idk1Pj=y^TR!AtKIIz@ zaySULMs>c`qq5b^ww{S)+j<_I@VIQ%{njhFfm^U}Te}Bg^BUZ^*`_y(ySW87Z?-GV zuORwnJJYP&W|24li~W3oy=fNzHqAx1IdoeeX0wo$l%lh3>k-|yZM3l$-E4E%wy)7i z%W<5D)LNw0BDEF=w-{lI5w;j%i)LCh({ddeX}O86+-3ePI%-)<6I*e!mR7{*_jiP? zX5DJmt&i{+f5o!4rtk*uBi>f=wpy%Kowa@&gxk}}We`KjXDs9Kp6x$#q#y`)w4*&1 zaEA_djAlABnZrD6{EnqT*k)X9x@$A0He+hD8*O%?&6wJrrkHYSg8%!ceY^kt+4+Be K{Qqm%w)Ve*BxW@L delta 40004 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 diff --git a/openbis-ipad/ipad-example-data/ipad-ui/1/dss/reporting-plugins/ipad-read-service-v1/ipad_read.py b/openbis-ipad/ipad-example-data/ipad-ui/1/dss/reporting-plugins/ipad-read-service-v1/ipad_read.py index c3b921a8c3b..c4649cdc177 100644 --- a/openbis-ipad/ipad-example-data/ipad-ui/1/dss/reporting-plugins/ipad-read-service-v1/ipad_read.py +++ b/openbis-ipad/ipad-example-data/ipad-ui/1/dss/reporting-plugins/ipad-read-service-v1/ipad_read.py @@ -5,26 +5,53 @@ from com.fasterxml.jackson.databind import ObjectMapper class RequestHandler: """Abstract superclass for the handlers for concrete requests like ROOT. - This superclass defines behavior common to all requests.""" + This superclass defines behavior common to all requests. - def __init__(parameters, builder): + Subclasses need to implement the method optional_headers(), which returns + a list of the optional headers they fill out. + + Subclasses should implement retrieve_data to get the data they provide. + + Subclasses should implement add_data_rows. In this method, they should call add_row. + The method add_row takes a dictionary as an argument. The keys of the dictionary match the + headers in the result columns. The dictionary should include data for the required columns + and optional ones they fill. + + """ + + def __init__(self, parameters, builder): self.parameters = parameters self.builder = builder global searchService self.searchService = searchService + self.headers = ['PERM_ID', 'REFCON'] + self.optional_headers() + + + def optional_headers(self): + """Return a list of optional headers supported by this request. Sublass responsibility. + + See add_headers() for the list of supported headers + """ + return [] - def retrieve_data(): + def retrieve_data(self): """Get the data for the request. Subclass responsibility""" pass - def add_headers(): + def add_data_rows(self): + """Take the information from the data and put it into the table. + Subclass responsibility. + """ + pass + + def add_headers(self): """Configure the headers for this request. The possible headers come from the following list: - PERM_ID : A stable identifier for the object. + PERM_ID : A stable identifier for the object. (required) REFCON : Data that is passed unchanged back to the server when a row is modified. This can be used by the server to encode whatever it needs in order to - modify the row. + modify the row. (required) CATEGORY : A category identifier for showing the entity. If empty or None, then the the entity in this row is not shown in top level navigation views. Such entities may appear as children of other entities. @@ -38,51 +65,52 @@ class RequestHandler: The relevant headers are determined by the request. """ - pass + for header in self.headers: + self.builder.addHeader(header) - def add_data_rows(): - """Take the information from the data and put it into the table. - Subclass responsibility. - """ - pass + def add_row(self, entry): + """Append a row of data to the table""" + row = self.builder.addRow() + for header in self.headers: + row.setCell(header, entry.get(header)) - def process_request(): + def add_rows(self, entities): + """Take a collection of dictionaries and add a row for each one""" + for entry in entities: + self.add_row(entry) + + def process_request(self): """Execute the steps necessary to process the request.""" self.add_headers() self.retrieve_data() self.add_data_rows() +class AllDataRequestHandler(RequestHandler): + """Handler for the ALLDATA request.""" + + def __init__(self, parameters, builder): + RequestHandler.__init__(self, parameters, builder) + + def retrieve_data(self): + # Get the data and add a row for each data item + self.samples = self.searchService.searchForSamples("DESC", "*", "5HT_PROBE") + material_identifiers = gather_materials(self.samples) + materials = self.searchService.listMaterials(material_identifiers) + self.material_dict_array = materials_to_dict(materials) + self.material_by_perm_id = dict([(material.getMaterialIdentifier(), material) for material in materials]) -def add_headers(builder): - builder.addHeader("PERM_ID") - builder.addHeader("REFCON") - builder.addHeader("CATEGORY") - builder.addHeader("SUMMARY_HEADER") - builder.addHeader("SUMMARY") - builder.addHeader("CHILDREN") - builder.addHeader("IDENTIFIER") - builder.addHeader("IMAGE_URL") - builder.addHeader("PROPERTIES") + def optional_headers(self): + return ["CATEGORY", "SUMMARY_HEADER", "SUMMARY", "CHILDREN", "IDENTIFIER", "IMAGE_URL", "PROPERTIES"] + + def add_data_rows(self): + self.add_rows(self.material_dict_array) + self.add_rows(samples_to_dict(self.samples, self.material_by_perm_id)) def image_url_for_compound(material): """Given a material (compound) return the image url""" chemblId = material.getCode() return 'https://www.ebi.ac.uk/chemblws/compounds/%s/image' % chemblId - -def add_row(builder, entry): - """Append a row of data to the table""" - row = builder.addRow() - row.setCell("SUMMARY_HEADER", entry.get("SUMMARY_HEADER")) - row.setCell("SUMMARY", entry.get("SUMMARY")) - row.setCell("IDENTIFIER", entry.get("IDENTIFIER")) - row.setCell("PERM_ID", entry.get("PERM_ID")) - row.setCell("REFCON", entry.get("REFCON")) - row.setCell("CATEGORY", entry.get("CATEGORY")) - row.setCell("IMAGE_URL", entry.get("IMAGE_URL")) - row.setCell("CHILDREN", entry.get("CHILDREN")) - row.setCell("PROPERTIES", str(entry.get("PROPERTIES"))) - def material_to_dict(material): material_dict = {} material_dict['SUMMARY_HEADER'] = material.getCode() @@ -130,10 +158,6 @@ def sample_to_dict(five_ht_sample, material_by_perm_id): # Need to handle the material links as entity links: "TARGET", "COMPOUND" return sample_dict -def add_rows(builder, entities): - """Take a collection of dictionaries and add a row for each one""" - for entry in entities: - add_row(builder, entry) def add_material_to_collection(code, collection): material_id = MaterialIdentifier.tryParseIdentifier(code) @@ -154,15 +178,7 @@ def samples_to_dict(samples, material_by_perm_id): result = [sample_to_dict(sample, material_by_perm_id) for sample in samples] return result -def aggregate(parameters, builder): - add_headers(builder) - - # Get the data and add a row for each data item - samples = searchService.searchForSamples("DESC", "*", "5HT_PROBE") - material_identifiers = gather_materials(samples) - materials = searchService.listMaterials(material_identifiers) - material_dict_array = materials_to_dict(materials) - material_by_perm_id = dict([(material.getMaterialIdentifier(), material) for material in materials]) - add_rows(builder, material_dict_array) - add_rows(builder, samples_to_dict(samples, material_by_perm_id)) +def aggregate(parameters, builder): + handler = AllDataRequestHandler(parameters, builder) + handler.process_request() -- GitLab