From d760b0a5c08d43a48bdf633fd6cf25a28ae5c0f0 Mon Sep 17 00:00:00 2001 From: "huiyu.eun" Date: Tue, 20 Dec 2016 13:11:00 +0900 Subject: [PATCH] [SDL/Vulkan] Add 3.0 new features guide - SDL is supported in both mobile applications and wearable applications in Tizen 3.0. - Vulkan is supported in mobile applications in Tizen 3.0. [PS4] Resolve conflicts PS5: [LB] Reviewed PS7: Reviewed PS6 changes PS10: Further review Change-Id: Ib819405357b3bdb9db286c523559525c897139b1 Signed-off-by: huiyu.eun --- org.tizen.guides/html/images/sdl_statemodel.png | Bin 0 -> 53738 bytes org.tizen.guides/html/images/vulkan_framework.png | Bin 0 -> 29905 bytes org.tizen.guides/html/index.htm | 13 +- .../html/native/app_management/ui_app_n.htm | 20 +- .../html/native/graphics/graphics_cover_n.htm | 3 + org.tizen.guides/html/native/graphics/vulkan_n.htm | 744 +++++++++++++++++++++ org.tizen.guides/index.xml | 9 +- 7 files changed, 770 insertions(+), 19 deletions(-) create mode 100755 org.tizen.guides/html/images/sdl_statemodel.png create mode 100755 org.tizen.guides/html/images/vulkan_framework.png create mode 100644 org.tizen.guides/html/native/graphics/vulkan_n.htm diff --git a/org.tizen.guides/html/images/sdl_statemodel.png b/org.tizen.guides/html/images/sdl_statemodel.png new file mode 100755 index 0000000000000000000000000000000000000000..0af6b30d8738ab11d12d75c3e340788ccedb7f78 GIT binary patch literal 53738 zcmY&<19V+cyKSt-P12Z+ZQEvZVzX&%+iuvfv2Cld-PpFByxn`>`|o{cjEr;69yx2T zz1D~M&H1fxB?U<&1Y86#Ffb%(DKQl=FbD!LFmMex2;hpF@6t8!24yZRFAN4&6Z`4a z5E}RnZzrYc2nL4S`|l4NlS;-9xQOc{uHmF=Yv$x?=wJ$_WN2yQ#GoLqM(o1Mz|O$T z#B}SB0|qv2CM_nc=B9Vr0jrTN@51qVX69P=RJ+8uw5!O$pMGlgu-5eKJlLVU>d864 z(bxkcchRx389`l$%~be6!vi6PNg#I75l#xv{&n1!@D_XJk)Fcldr} ze*6T#B>MITG2*{h)E?vl=6`>H`kxO;Nf5}2Q-TB3wuI6QXZMp99bYExqAQyaOKK5H zYTeZLQ1v_+W47Ywu(khcu5zui_8K`t?@9sVxCcpn-M)EJW$fOvGcz|QM~8QJhlV^E z8H7?~TKUV1CVEnfT*7mrSN;RkJXq-z>-ffCKA=z(LJ)(rqK`Txy7Y3ccT$IFUs*V}d^9?|l3T@ZhLuFOfS@X#(Oe`#xUvdtwG7t+%v0z;GY)-5ls%dlQ zUoL9smv?kvYis%&)q7gCdP=|NnfCKx(jBSTe0|KFE=BjSX{=b=f@4vwvH&?ubQ~%h z89To;D}ALn=mus4tp)-KdfXn)m8f>TtX=qACuF~7yZ-5V9qlSEF6QFl**`e=1Vy{Y zk62Digi($oEMlM1h@v~44D)M{qitE97~OHCX1MlMR~os#boD!^ZlwhrN}?~4FnN(# zV4VD*ue)0#{_yzN<8rg7P(Iz~c{ckedX0(K(_YHL!a`C~(k?y`iUvpkwUGNYwU?pc zr9ftaeTCq-z@b)%GFhag`$t`ss#7JecM%s?o41KWNCqAxq;dc6_V(A;r<<<#yDDjR z4V%|~{n!5UwYJab=zq3j@6VwZk{*!5#eS-v>mS!4*$= zPH>gUMc{dac%A+PGY}ypEj_$cXYPAnmmQCAnFT(qaCz^n zmBz^&w<6WR0Mq_}<_|--4GqiEC-B>u3ln4g|X3nZC;37|>LPNs!Pq=rfC>|yCIGL4u5 zZw;O&3?g}d8r(jjVAq9L%@Cd`{$Z3l+~}iMajMg{)GE`H`(t*HjJfSw!B5AIPJQu% z&96s9Ffaozu=&)IG592TFM|VL^u3gIbmTnlvugNSXIQl|m3PoJ>`2S^rKILNi%ezS z$s?d5lh%{TBf!Zc{7pwlzPxPP_<_m9cqMkB(j&CC|dpRxi`GeTl z*rP~RR#q%QRciPGUTz*9X-*IP2Jx*b8<~V!`4agUra@rsB=DnB{Y85+TMd%E5%cNK z*F#63uQMa9iD$CJcC;FaHd@2=rAqdd2opa@-v$6*6tJ+gjPLO@H6Bf-&&#_wseYem z?cJ-pIVKV;B0{PBdjcvy1m)k7Xq02?v|MN&)j)(WW_O`~tTJ{r+E#f_tEbbzt)_!G z;8BFN@Q<$QU1mK0#bLk3Mh=`tQ}A>S>$J2qQeA!Z_VjeP2VQ3cSx9K;$4l2odel^Hxc=+*7iehcU5{i)!Ae@y(=EHS{hJZd zpkfS$unVH_AUv6zZ=qz7PD`sO4?9qwgluuu8X1>=Xf_VFONCe}m!3*Zmh=+U8yL{R z&>k=zrvz+#ygwKlkKQLg#vVopbw|=OBb5nkgSaSZXd~DPF4OX)_wI@I4t~4ybrwoa zBe#8ruFI9Lm4jwo=2#iIv4K|o@oIw&GtfrD#1w}(RvUY=Sd~zw#o{9daKr45uB?Ut?0nt!U61QQ}^ZN<-hC_ zr>uE@HJkmOC{ys$N*mWl3Y6x75D*#r@&yget3ZYNx5l1jPfbh@!psp$02;+hs^h!* z$+f&$@O964a>2{#CoRt_*FGkubu7T(Or(;(lxx)N@vt~w>9)7@=`s!LmfSP4ov->LmO-# zPbNo=+zWe3r;9-Od*FJ@I_wOD2roefon|2kqo-c;Y;O+My15OuCmUTHGndDMtji+m zmtE>%D98vki0g?cMV~Mtf0PjeDjszkwqZ~lV{e2Dui9E<3CUu(zyB3~aY@NjKckPZ zgi(vAk`ijmME`c1GkM4L`b|XNy1S>>H4qUzMQCI9=bwLmat z^uC^fLg$7r+b{ju3JYzque1a1*MrdmYT_@~`MI$lqA=Llv{<5|q92ziA3_5L+~Nuf z$Sup_Tf9!>ZOb>@Z`Gg)o2m?cmi{%8J;?~%tb|cFK|6%9zowv?tLQK~q9Et9YHH4F zdbDt{-2ebW>J82oDGndfc1=x95rf*O=;o3v7yiuRvv-M@R-N**4Ep7EM7e7ZR>Sxs{N7lW;QT-yt2RcFV#Ph}OallWO& zN2$C&sfm`d(8&^CGlca!42+H9E9FuKj!f?Aw@cLdnK{cZ!M_v5Pfh^V$~FcA@v zp`#wvA{7^b{L`PB=Uy_rahhAg430^%uITsGBOA__JT+nnws&nzLM>8KnD1dRrL{6`pRToMCTZ)-?QFKN*gXF!tmqQ zCa~zUg-)4z10LSol;!qq&f$>nhlG$j&U|i{eo@WYFcVq)vX!p{S1KThK^VwdwT{{c zKB={*^Hpa?)0MLzXO&iR>h|faP&YwS*r?X@cIZ>O=6X1f1DcTC?+Oa^2Osem;bLas z)v;jSDm8l&i;0#m4thN z&UZh5lD4Ut8B((IB5-Kv;QqHC@3Oi_=eE}hg7;M3i*Fckw-*DR!z=A9$O9?q6d(=A zz>+T)Uu}X=yMC{@UfW!&UySw92ew?9QrLv!ebLc{A~HX}ALSEdn~`NWT?422nVHEi zAfT{-764av@~wHkJuYl9a*s!MB%A%`w{k}SmC8ewB~>^q9_G^@-arOz>90v?PBr`K zugQUrCPw(56>46Xc!6{N+ShMM;q3X-WgX=&EJ7L&;EvR&=8J&r*Ii1%w5l~fRxsmW!*cjyUjp0)Nt2A ztJmkDZEb@f#$7n`mO4@&ua>2=AS9dc^vs=w=08;(>Forhot`sT#Sl5f^M1VW2=~nT z9_IJ~HBX3)=|h6+(qNWL&YYGfI!zT*<~=%sGI0{wx1aeTBR}G4{e{3p-cW!b)YH>5 zlU!0lJsvtYZuVq#M|FbL-_V-KX!DgfXz>b)lmo;yjJCUg?2q_*(IDpbS|>51wN^jh zH1qDn5C2%9aO~lYpe8s=T&izX(0w_{p3qmU8-wQD)rOA(0$CRIk{?#@tK+II9v1q? z`?jF&q$tpNHJNfaX>9hbsP=q)=snArR(=INU}rNd2SVVuaI6YnN5-RK-JdRrO02s2 z0|@-`(oRxR(%hU9gSa&A%Q{5Y^L$m1$W{WS;?VPh!QJt^;N}XW?~|+)FCo8&*unx!t5-W?mO>RK_#0@qDLW7b9U>F-ZgK+R1zrx6Z+38A4bbIr9UUw47HKZtCTku zE^8gT2zU?q)~@Ir{KI_7dOI>D4%hjou*3Gz8>p#eXS@hmLTUT-Bj@(D`ceDL%JKkB{Nq7X-5`!|*e$TwYnN`K^JWq*7r&FKbNZhId z7N~iY&niiMNNmA@7e60*9wI#k#MlTop(NrKE*F%n-aH)A)Y0^w->anxe{hmO}%)r-QNOHiL1-liM@5;Q!hW zC70G9+AIOr(;0NTvt@Q~Z*M6=L&vSgOabrbILpV3%6x_ZD`!=~wyZc!cCMc7s+Oed zz3BXT9%^5uSiuW*xKaGfef9_WOsC%)Qcl{|YcB zFOXr$aeFq6+B*V zhgTqL$uGg9x@h&LlafUyqaa-qn%XGO-9S8pl_<1d-w%D&#a_P)=5hA%Y)?i5nc#K! zYpcAmJ{B7gwj!ySM=Cv)){?;HH`{3|0-@zxF3ujud(@ocO*jgAg}?t1eED%8r8z3p zX*`De@W=HY)~TP_WRkFez%#|~?d9RKmcwD(?GPBJLw03Xfb@F6<4dxRC+*#*ak04Q zMqw-rA+6tN2vVeIAWZoj&ru6x6JcS&Xd=T&fIuK|ap-*BDY$vZgNc%|vOt1EFJP|$ zXMB8gL&c1jasr~}d>Kg8^V_#14LWsIRYnWUxx{kM7j`NhS+64!oNUBmh$ zewii3Lz!OQS#C33u^bNUa0V7CYwrn6Irsc?Abw`0;f$5LD3&=%(={P8&ZTAGP#HWX zu?YrdP2RAFP~d696jMyTzxmW|mxpD4b6li0JNsJHRl7wBDG8Z2& z{WM#9VOuzF8Uq7k^Ip*N9x)3+OOHG~%5fp!D_umkZe%RY;ZLb4=Fs*Jwdi;KyJkVX zXhF^*+E&F8Ur&l_cNmQnO*zkbP7){(ikR3kQVd*=Z2{IYEn z5lc|n>{Y`nV6zf}Wb((`)vxkTf4}$3S<|JOyqsKASeRcTv;$g>(&Ju={`>P{R|w_6 z{n<(mWy&b9{GkxVpYpllrXHW411kM|gvfSD^$Mp!A8=ZgL_yP{Oy0%uZ*97YZT{qd$x{k!?T+os?Lbi9=kxyWAwX%_< zFl|Nl$+>69u{6Ycw@Edlr?Y0ccL23u zlHXvXFfK-|6;Ybthqn#E6=gJ8LWS#g(^~jStwCx@8fMC)UToc3oYaoyOyl zqAvoEAhWQS{;z(cHLt{`rLV5h3fIfxSG41Q-Z+*%{{a8`S)hboaYhS*WqG1`KhS=* zd&IX3wctYbwL=Q3VRqlWK~iOw+MGs>>{BaWLik3$eWc}Mg2(CvbY}2xqJwzmwK00jdYznu$ zyoz(z5ryo-YhTjTw18v+UY9tuhc)nnx!v7epaS}U;B9Pd{CJH0fWyrzEk)=BYrQ7= zxFS+{5&U?Xbmz+gKpSF7d3nAPmAt(C`}_Oa+FFy%T7U#9<&mqeuy_nUH$<@a%Y9N} zqR>lEAZ(7u-UudBr`b5JQp(ZM(LZQNLqjulzPrnIFvPo={eF~9tQ}Bu5domU^?A6h zN1u@xUVGH3jp&JKJP1dIhnR1$dpeEqFQjz(o_ze&|0MQ!;W12O`xLEF}L0Q)KbDqZ+w#@ul^h7mlE1) z3Fw^+tB0G*haM&Y)B2|uc5EEErnnDQBQrA?2sRx14T9ga+}zwset#ewFt|!ZXnq$I zkYh!5J?*FaemwYwQoEcjL$~%G+(bu5=a_%{hIuIC=*W7A@D;zcwRH-P{x@gbh@YSm zO!QKVV^MfGJYsBY?8D_HSfBxZ?;@Zi2qzGyO&>W~_+x}#?&yMjUtC(^ZhCg@lhwt+ z#)cbfhY`jRxjFmmN``13y|#_rKuCD;$J#Y!{g4gh5~c$g9ix1rr?!YbKh&VqLC`i& zZkABrx4Oeqye_LoWAG^Zb(`|2C^MIXuJ<$33zxB?RO5M>uXn9jw|{_}>$T=I$4vmc zmb6vFmtp5+X??xe4>^8hD455m2CizDU|U;?%30}vYjcpko>oN?T&&Xjjm}Ofo>(?x zB^sz}T28~8^@{cG@6*I?fz?&Eesth*3htHFdg|L5eAW-<0$hG-Fn01LFvy+Rz{k6f zD+X`8K%i`i`N#^ae+?CUH3Tw5+&6$%>+&<%1E_EEA$Sa*yE6SZpsIO#y_x*z`ndQA zv;kC?3zDuUK!(}yeOvT>+ada(dOH|2*lp^1JKK02-w!Sa4SD8sNv%i82yf~6%&FJO@6^Cd(bKChh1>JmuFbeHiqPO zmzwMRf4bu=r8csjoxq+xhxTcTp}LjO{vMF7_Y`P((aCLU9{BNwy}F(0G85{s%$cf$Z;3vNM=M!s1b`3*d0$4AZE;1tAE?IJv~i^?yP#YxB*bB&rojFE&I`<+Hk^ zsq8xhKt1h$uL#QAUrOxdao7VW5=SWo1&V)lvZv>Zco@Rw-T|#qO>>O$dA!4}%WGqB zkCw|}a`hVT9Y$V>i~9}c-_?ctiO3EYV^f1ZZ2u}d~RBcyE7*N*x5i{}dv>L+u_L6Ep0_6oH z4?-Em;s=8pz5bR%i!?M!N8JN=h^<3R5EH#DR44%%$IC9h6eBV!9Mq`i0*sYN&J<&( zNfGp&wg_l9d1F0n$xyfhPh#iFEz(oQ&|rvsa}Ug4Tw6Oms_i;PKAi*be)@B}ClwH} zQ*ULG`aZt`|0#Y0j!}Jr92&k$^xE++kKEEmrzK}-u$OdIox0IPHzGt8EO+waeTJLU zpj8<<8i0p_5J70C3J3@oYNoxInxEHoBK9t!1*@J}S$UxoeK1@m46T-r*-AGJL(V~n zWlij@9g~!hFd*6enT!JDLS0?mlyeiH+UuN;((@*hc!xXDs!H*g$?CQE?*AI4!wrZ% z_?vc`z{6 zByW$cYjkoX6vsHN9?~vAYj}o{ifp$}lGt^*(J3N6zP-K8%~rw2zD9t9P*qixeL9iS z?8*LkJ&1{k5hr5MpTz`A88v0&cr4QGNN=8fZ-FR|ltb0=j;p0)(rxSLAV?NsFw+Eo zBF>(iWGqo>{9WFO^H5=y_-a2NovK@y$o8GP+-Ye;3UC@{slaaDH)95z;Lc6~{5)aF zVSvrTI!1uQ$oQsO0xqxwdnUrc!xtLYF~fb3AK<#*a~m-A;4y^-2Nf6?=s~!Y9$lxd z8=D&0AMeojZIKKUai*%-w3{1Rk8d~aAK3}s&ZecM1u!Opao`$+S1GtMDo%&# z5_3(s@z;NBD<#iaCXwZceXxE^A7CINKEdE?Z$Xo82p$43n}v_BJyEgb%P|7j7=YXI zRmq5o2!qrN6tvVCdiV#c<@GEj9T9#~P*QF@6piaJG<9_7-sr*LpLMlhA!|l@p)Spm zPS(Tmw1(gmI@PPGhhN^zY!D>vtEs9&nLxYXCGNE}_3+@KYq4t*pWw6=GhfzL%_$Z$u6H|yF}}0!f-Eyx<9}qwl_3#vGf)J16bj9TEC1eU_X@}pY+PK}*Ae6cGZzd0Y>NOFS7tK$HW%L> zaRmx(mBL~tg0y)TzokFjfiyCWi-o0D%-`G7@37aBoIA46=vSu}D{jDbsTIq_37Y2^ zYi~laU269*5I183CJ%rVt*xz{aHXMV_jtJlm>CyO!if%DCkXV%=xT0G&DGWQ$3EG` zm}p}UUPZP|HFA(eC#l7qQ=o2G0O&dAv7EA_qhoe?Rn(p z8!kG~|vX_!gRx0#Gccv0Dwr(Y^c&SqYh$NTK@$T~{|9 ztq^{J+!hXiXSt=-x$c7xp%AAr0;*H+Cd@AF`Y%|r*;Rl~*-Cu#@9Kh@?Kw|L24y%Z zY!s(F&nLy%R)&m_cB!Li7A4q?3Gi1{I~f^4oO88^0IClWl*v7+dzPT@d!+tr0OA-6 zGAnBx5NJ)GUb={8Fv0RY`}+FW+1V#&%Z0Vdvnrcz^=&b$x5&`(Q(wy8g)GuUy}jQ& zpXZZ_pidFy2+}3iY%^=LSf8!puDNR@i>V~wWAl;@Wbhw?Z?M2_guQqyzP6|?XsYtr3ve8Kw&0Vg?B3CCT zq31gRpH~=2(HIi+aAH$S3yZ%s#;`b9rl0=-@U)~Pb`Fk49rIhFMNGKgaX5Dm52E<7 zzncL%&&jQG>2#P!)>n!^fXYy1aEd;57Fk019O#cgMnt505v=j0l*;}_d|jB8n7Plb zuZ#RH@%F3yvTRg%MUJK6ya=SO-hBh#1sURB11Gi7G&DT?1mF)v7O7EOpZA;Wm&eC$ z9B-ViPtQBR1`h+#S4fLEZLrYOqadsKbKC6cu$JS-U7U~?SlUZv;L-WO#l18yUdooX zzCOx?-?F!uay-PYx0_pYd%MmHICSqVCQgE!SZpv#v`5GPS!FmUXG48o14V=p9NZr!Mb7NIR7S#Xib0P9KqUgf?Lwp zhu0f^RXHmO@EOrOxQ)sP0Ji%TmKGaZ*8jGwj-Q`jPfzdT;p1JOMQaoeP;mgu9UL4? zc_>q~Eu&TGzQX@0a7o6?$x7O{#Clikxyr!0;Y_h^HJ&9TQ!~bPr3d+IWG#q4i+V7R z<$QO4zpA6LFM9BR zS3VkJB1VymJSV$>Kq+NqCzC$+tSn|#ZaVF5@jV7YV!HQTTArM`;A0aL3UYEzPEJ54 z4yAbzY|#n7-1-Gp+h?fmzg9@QSfA<*(V)l-MpkVzwO1=)!(T*LF|WudfT?46h^Hj`3Ka)s00qQm}GVg5!RP+nqgc zY(V#gm??si|k=p@wueB$Qz_I7eI zmWE);sBVotDt=&{FA&Xyg>%;PZguyUHi|=q@b$4*1<|`86f2?5m`3NC)3cI9p@a33 zyL@`PyHjB^o&lmCJ^ zDY$gwdvus?p{2UO(bE$&mugS9o1z~R^vulqIw3xOJIjaUsIAWp9x(Z^vWq*_WAWn% zjLpw(9L&t%Js9`}vqvR~yTuq)s1f}MiL|c94{On&&h+X7ms{k}18pHoy|;AtHuLn~ zS1z{`ZSWBf+esJwgqQLy&lyITnb%*Vf2t@ePtVOkML?h_Rsa21``98G-}UhHJUKqj zk}%D3lG-p5^B;OIC>1n8B+Am)yA92-Oz;^Y!HWQCNH{yQuTrB5{=2O;;1CL`}NJ(hOu*UQWluvxS5=?N$a|@?mK=Hv`nPzeS6t$&-L=@ag8>c zQ&5e#54=s?rJJ&B7G{0)Ed!b*%>C+x_)d?H18!=74yKK_wT*cDx1BA3-CqLK)e<$D zT@_-_imVxbAoYmYS^9$uh4SomG+So2|8XCK?n%E=b$Nmm@gm?zoaP)&7R zZ@|&s>dE2@F)%Ux)kHlyb2}wN{YeJnI-SAe<9ZB&LPKc*85;cE*kHc&8_<0OBsgMc zJG~DuqH>1x$}v$ICNF{Pek1<@L==?1eHT|((YWA47iVd zpzp2aqw9`YU002$^ogsh59>w`Y{bqbM4}mrU{^vGOX&H}&(0+TZcQzZ{Y;?|?t@zb zip1z9^v+KF+ovZ=eK5vHpAv*yPuFK3c=)L&%Ixfir)QN-n9N6l0m~wM>Iv|~{CYXA zEU8(HOJO}%Y)Io^NRidoCl*S|!R6)WzT#2e_XFSW-@j9Q{W`a}=<4DE#K!iEhfckJ zt$2uFaFqC;iRlBWP>w}%@;!r9Zi!6sYZcba5)q85W%zeLed`j;et>a*d<~fV@+HeF zho<1-B*Uux63T(#5dJOa3h&MwuYRWyxA444Zr(lh9PMZFPZ@A=f3lg)&CRhfLbG`3f~(}U(tx}>#YNTH3RxHZ}09B5)yzoOtLT3 z3nlr4l2AAXG>gJQ{BaGtwu@a^S=nm&rlNwLlIZiH`CRcrO?jr`f<0i%EVtxF>vI-e z{0)@-S)WApQ|f2DY#_e)+Q+-ap2)Iq8-D;;s=NiQMVS)$*_Ks`>w7}Equ`y5orju; zma=mEtv1R`c3fZ}IyWa!Y7N4OxrAK+zO3Tx53-Vy3Tte<2ORkYU@#W*>FBV!UiTP3 zZi@tUo9+H}v&a`@QE!8|ZF*`8} zJu^3S)^9r|aH}}0zB()ivWz?fgK{~kc~bxl>Qw;rBH#t??(W1)0KB18$an-=UwvLy zHbf?bNBSRj077OM2%qVKuUjZ1BO@>{FaR3~*gViE3K&07c>>Z85ht>N?h~9}y9O18 zhzxiW5fqF979tE}mZ7PsX>f3`rKROGdh+QXR~@I@I|pe;N~5ra`cl6tXo`txU`U`=GnS8(4L)9LQk+8KXmpeXt*`6M6R znJ-pL`sqK{R71q*7&?5M{eDU;n1cW3ZX8FqJw!y4 zg7%5?>;M0xQDdSoGPqb~=cWJmvtWlEynA0nK)A6_&nLN`4!ObR(3+ee^sVl9!2Fvm zz@W3Su#f`J2Q;EG=s(t1uC(UQ=j8X7)c3;^f{ba7HLG@;E+h!s(az|oTb7Bq0eZ8GSL$`s9S!GT41~5kR}U*u3JNp zKBcdnzy_@Rn&e^HizXo$D>~b`$JC{Gimou8-PIlJj{DS{!Zr{SSxD^lNx2E^CUc2a z>^G&USAL3a-_}(@TdSHb^%=qRh^-Ae2?dp4p-#epI46r0Owr%n4&c}JfYltDExO1m zeIaVNVfr$O7KC5=Tx{Jj6RrER5-vz2F9Vl{C^}3T7DY8{X_!)hyv8^emOOg*?B9>) zobG>NvfY!-_4eza!}bpqd9!pDinrFt&LrLY8}_w_2*BrntaaqL%~QbGBjW58qBZC! zvca*jYY{yhc@Je!M51-Z$ZI5n_*PPxF%gdj7^FepSK8!naN?fW9GUmBt-b!BlFVj& zXGoD1fMjAa!Py(PrhtylL{}3GZ29UkK^m)W=EVJE%nIDGG}$G=OCkk|eav7)Fx{=# z3=78`RI~I*hK1>1EulPG}#p9Gs{tgy+EF>9Nke~U6$<7{^&LBJkfsH+K|5^ zr?kh>{4vB&kiNBh$4xq90l|KochMU(ebw?uv&p3rCg7Uf5Qh==KE^k6rAEGR>b1%V zP)SktHy*!~Dzb#hclf?DelCqh|C372GgV|ptND{=;sjE&SUKt#nyM-kzE2yqbpLmR zC3D=NbfP$>D(Ny)n?;Z+8w(^yWXRH7XLzn5@~zkWoTpJF82=AV0bS-1^ZKwbaUZr? zcyAl=V#D*b4_vrEUUOWsYU$)~HeltyQ0+*jZ^mmHbaGLg{8-?4HT<&VN$0*&XuiLNv*NL5rxeT=jnZ!-0tj-QR%>KG}xqftqlPfsGt6 zM=X&{*y-~tScY=ql*egxc@*Wx`_YLl=c&qEmv@&T*0-^A58EFYzh6d6Xw@WUGsb-A z0`@_*P+E->D-Q&GKH_;H{4ZQtwVIX}G2XBbnaW7RjOSuhQR=2oLtg^!0&3X#)c6K? zD=UA^b3?Q#W@7~gpS_@*@ws7yutiQoTL)UdAcMcn+~6>VfU3hpC3Q^Swjx2U=Yno} z+FfQ6IvhPMKP(!JKYG?eV?8NNorx0{R+|nEhofRhur)ZS>+i1>t50@ z2dU`aN}Hk#cnXY*ejf9t1r>Y!^jsS=dwCD!MIrRWPMC>N`mP$=bN15UwJpVRaX&~3 zXV?OEf)Mfw=G4#BRih9lqj{0J#~L=UdlvG=(@~#WQtk+Q1SeG>CkH9k^hf73f0g&a z+;Q;F1Y8~;O>y?zMHs9Ydly21Eo=-;?mk89ll5{3;vn@S!lWP9-EH78{cx5VywI5H z>&TIuttXn4Y2$eN8O?=BGb~CYX_-wodYXfh56Q|P#NsFqxUlNS*gq0MKeC|8j??#V zU10ZFcDKoz2s}Rl6yX<)CgxbItrj_fqEvF|~_fs~i6fL(oje?7PHC92+#sX=G zn#Sl_L8r}Kc#^H6fIUn`yGxb1yqKk>0uV2(Pt-zG5;`hVxV%d5A{p`zg3$DfFN4&2N)} z2(;YAL9tOl{vG-x1VX&V+q(P4_O`Bx$Y@xpv9@}j7A$%`#T67B^$W7$W zm(ga5KX};o+jc))SB3kvz=Yt&q2~ z-?_(aH5he+;06&K32nrzty13n!~Fu-e2E$<+e5R{cZ#JV&X|(HT9{ z9AZCOw{#~xnM>?eHrstENvAKfIH{hXbw4ZJK^xNsA4dEdUrVi*9Z<*gO62e6@jBvJ zO+s%p*?5w*Bp@5CT&GJXiGj3Bl(IO@xd~TR>iF?}2Nw(Fo)#*oIv8V7M3G7jKK!Ax zeWp0grEfax-NU1D?hlMypi^hPp=4NkbPzwdmUSz8lrv^r7 z)WJLup7VJeOLNfM>ey+mFqsEQ8s}*RG5lKQD{3mn)#4jw$eHZK*C3ZrnA~AMyAT>< zNEN{(#ZXczIrG|}=b4{l{f$5x0%f_pc0XCw{yFpe_7;kasOd!3G_%|pE@Oy}`MUqZ zuneJtwuJ6<5zA)fRG}blq{g50cLu{6Z4~^vYj|R(z0M{pH;7Z`0yt&=OR6lis`XaYr`r~!wr}NLfyAA*D%{mCk4N$& zu$xX`=n#%Q-4U8ldA(&?hmM~@+k6-WMAv%3T`;nE>~6!#EkRAyCgFd<&0TpQ)w_#nTh-X|wq1+%I~Y=yq@+zpz-+#o> z>pgIjsI77*;hWLZ?$X;Iy1zEfu#48Z1X=x0`_uDsKYl~k6U4yG_!F~Y2~579C}v-9 zRbOsgN;_%t4G^c+Y`(@a`>JVf?kkL9+YEN2oxWGJZDGN}1CoDpfumNU1bL zuyfI7*H2G@G$6oOF@Bh>#OEwvn}H&+FVVl|)Q-0@=c^+Mo5gvl{>vc!Mh{&(Jc3LdtlyUkPoeuZmF#*?rE@Ar%Zg19aWOdOr zupN%F#55PG-$J?UhR1qm1fvE-pNJ9Z)EFe5A37G!RTipi`Fun#;#wt0JUP7Gw1oG% z!|_^S8LjX;DpkADXtO%2-8Z(p8kx*Ryfog-yk4*o^*0ARjgAmo*Xqk#Az*!v=Om4( ziTLGmj$1srgG0`Fd?@nU*Dtpc`ao>DA_0oukBHixDt<^@hN(QBB@^6F2GC~(eRWmz z3;9xu=B!eE*R4D`mOGX+-M!s9P6L~V>#>CjzN}3l0!^35PqFHL>!c-E25~*o(vm-- zgE%avy^%)XS-HZqB#6Y}cKOv-#I0}IdZlMaVKRXIOcx^&#RQoN62WR>l_jJP?s6BY zL$E?CfqM+nuJETk&=S0ZKvl3=?g;NQ=Y4vEr_j4jd>z_&3TIljB5BHgg zS@z|8*!CxX!%1vtLPqA{ww{M`-)ip4SMZfsJE^HI{&~?PlvSe>Vy@^jzZ=i#yGnib-0e(VE)z=GU)`{`=rb*f?J8QKzqjNcA5!qA1;bKnM!dQs7Y0% zh`z^1sQJhgBy=$MCrX!4*V4KxY0$4ZgZb)eNR0c3T7(jg2((BdGG~ZvVoorH$nTY@ zpW~!jesSbFb*>xrA5@pWpOLr-cB`d$gGG9g`OFl4(kuDVX!x;ca9krUdu>wL4c4%t z(UVQ7TpM9ono|j3;`Wp~&3FlH5hmsoXo%dBjKn$Gg+r))g4%U5Kr#yz**dk7FmO4V z@teUqys3dRCqjV50jkV@UT&d^NAgMWmxf`6nDox}pl!$>smENSZ=^qM_YlGGM35?}sMI zm;u?#-h7fAgG^c+PH#9~mPGe0PU7pp`~`V_ah&295)?(BrIB!`qF;$B6*zzo@pH;c z&Ls4VM-U@SjTpj9eweJV)yQR6)i-X887rA7@qJc(hYu~(;9wc58~`?)sMzXEX|gza z=QkBa1pc57U&7y^>hDzXdX#H_3w&&<;%DR70*z9sa8=iFIQ?_~N>S!P{JV`19Tp(( zo={+|5=mUqVQ|E>NDav4byMf3DUDg2#JxKf_Mb$EksckNsVWu-W=k+9Pz8y&AF;9L7%AH6*|syZ6Z}NQ!)$SD!;W24beag-=TwIgX$)3zzLrU|Ir6EIM=yb=ufWM~ z({A{Zt}ellp9Ppn&dk9+{B;s!b^9Iz2)Pnw6&@m2^Sdlmz#$lPxE0`#*|UsOmM>{R zUS1%;S8MeRFdTU^DZLB~NaRtCkbfV|6u!!1-enHiL{rUzd%!rHqg9iyYDr0juM*9u zG8ls0v_s6PZfk2RFQ+46rsm;bpy4swW8$IU;3l8n8;XD7w8>YV0S>m{L`6p{Qc+P^ z*xF{Nrp8gw`jH<+C{f`P5LA?v-9$;VAu2K>DzcNN2DIqZhmGqL8RlCYo8Y80Y|g-% zlq!p*S&GR>iO5)4os>-y0+bo7)F^NUcxVW&Sat<}Q@T?GY@(Z)LH*8a!aAjb_fQyR@;qJpuM<)#;-rKr)BBm!+zq`8wNJmWUQG{k|fK5F+nk@oIwc)~8|I*UZ zkPw(l|6!AfiHV<0L_n7j*fB(rNthWe0)#)97wtmp^fete0zjrfa=}NCdcRl^0*z5% zsgQZZkEr%SH{gBPqp*arP4+tjWuU6wak6v)uFb68X+sBxpQC#+U8le?@v9!CLiY+v zj*#*pxa3mW8!&(W-+?vle$i{K&Sfz%$QVO~u|d!WXaKj55;$W8dPd(Kj)*c?a)RFB zH`D`oCME%4j57UWMOkuM7Kr~LpZqEjP4W{kalrqFyegf@PMa8~_+S6F&iPzq{&P9h zDDBxO9fZ204QqtG<|=oZMPWABgv8L?YV=p1lTY}3=hJ@}DLu5l!)eAJ?#t}I*v4cD zx5)c;Mu;CFqwoy|QN~d_E2KgmYN8^R31_r}NADhJv5CO`@k?xMU;m3=iir9@Y`tYz z9ox1o8r)riySux4aCaxTdmuo9ySux)!$g9+yG!uk9w5N2taa`_`+M*Ho!_icHLR+S z)>~`6#gE5O`KX4Kh0h1DQCCCpODMA?r#Wns6tH3YF%>_Rr zWT*(g0}-S;BWS8VbEdnAKg0Iigr&BHv%>dloy|t>l7rsr%(!8sBgUWf#p;ZZqlArw zs^wal{-f(PK?=#VriH0*hnrby1^t0@wBWAN}mZl0fhk?Z14~-=YbCgnJD3(;8C;^f%-%x zSoyo-vqIII@<4ymQyNDHc1EkSguD=3;9^^BK?n1p8T@}PKEWYiov6M{%<~|MmoXh< zZ!gpPjwd-n(;*f0jS^9u=>y1Ab!LTB%ANgE2KjoWhn&VfKIN#g$NOUZMj-#%T%#&!u%2=_NkB3~5g`Ld$q`~0K zFUH9(!F{p^K1UsV2PaA?hnP)YIyh5mYJ)v?1#4c8#?$4$uii*`?_)}qrpRYTNUTv$ zIRgU=mDVcC^%-#!lfbv;9%*-yZDaO~-d}y*=fLZuTbdwV1Is<)fi*SAV9@;%|ZC!tUF-$M{}x4FJyGhs~o8d5XRl zQy=n%S&EGJwAtE~Tc&IKQ#3@h_In|4rRg*U`9R)6)$FzfLi!?T$l{(2K$jRT$w_#f zYUJ@P1q(F@)s`pljhEmdE4-;Z`+m|t{jtgK5hT0L2=?9FA2`Vbq5Pz=wio~QuJmrV zhp`Z(OfCjsB=2{Q@9`T8r#P47bd&#Sm$QGIZY> ziEX86;gF8?!{c*Ld%Y9fGe+u)L=08)JiHjvb*%bWvE&2XYO|Di9H$((WO7sCfdaiOtrVZ4yvvJc4UXNPd z>WYxW2LVOGK#a|K$==j2V*RbWmzcy3+#oEf@$cCf?jIb-HmEG^9=QrLFKsQQ%aU1W zbi%v`0hRQz?6bJ1QrH_3?BJ58;SBpHdtxEC6J0obFe5?)>c)Y??#Pfs4KYYFW?Y@) zO)nfx%^YDNXJ)F&-~Q7qV!td}9{1+V@Ig~nC%N6_slro?Sv$Eu%$pvobmi@bUwI<# z6D`}x*}3fus&a#@_&0+|oJLpJ3JTyL4#wIl63JsnhlL8Ng1UBV!+B@q!8g?X%z(b+$#~$bTT9GdFWYHXJM4RF zt|WfDppE};8nJH7Uz*9U{Ky1Lb#=D;`E><0BQTysJU%MZZ9b+YA##W&6Yj1^5#PTU za0YTPo~z*)*pp!<7}eMxflg=YPY+vIQV-0GMhGe`m2uVbE?ruk!jSq+;O7Co-c}!` zLw>#UA|nj5K3y()z;t_;y!89gr+dNzdV~Bg#`emQ| z9OcQHSwNcp6xpDy;dEyg<5z|ThJNjUd>hDq+XUtZsT79oEpZ2r<>PhmE=91fNNK?Y=(hm9QPG&HGm0C#?}#<2sZIH|pO z@;S?(tNLrc{ zD78c%J{AO^6f^{2W$6ux&)ypx-7CoL%16yeibpzf*{cb-^O5}6|KxE(-2KPm)!_i) zIZh)i2V3)`-3v$X%MA(Zi=SA^$=>&Iixv~CNe9+)>@CsNe)f+&uv$LK=iXMl;`0|C zpB1EKmvO>$-e7OrLZ%A$H|SXD_Q*BFBd^9%bc1{vA~?_V^ADn8RCy6PGHxqb8(r+$V>a50kh<)!{t16i zgnRF6PTZY2H=ClB)n@FcF5+w#eFOH=cre`JQC~+M@Sd_Y9Za#xEzbus@c=eH>2I&C zKb+yhFT{@{%A3a<%f^RNTE+Lo4jWW>jMQCJc4<7Pujh3(bJ*^D&3%~o|Nr)XoPwibFyNmJAET9snh{NY^4+vWVhz$LJ7fO1c& z&d(%8$L(M7gs$!<^3ny6zoUXh523s^WnGqfu*a5dLmqrcaZ-7s;DsNHcL!FYd?aZD zX_3w6r=~h@STslcHmMSQw&t$fI6qW$!YMmrmFkf5^Q5U+jEvS8gJs2EIJ{rSd8!)j zRp=IlXz0EM!Q6=CN=~0Blr|%Y3M8ya190D;3#DAg_0pSRN6mhXnGkd$kg+kE?kxC0 zX%immj~g8~*>MuvG`SP=oFz7O&IVYza&GVa+P#|(E*YXh1UZAc0&wL?o%$#1bpeqZ zDOy@2kqjoUsN+0kUn0J#ze0bG+~JFxa+|TI(S8#bLp-Bs(89MZ$J5p~rmp#GbxPlmNOaUp4 zYtTD37c*AH#@J{5Q5DdKXjsv!5LK?NQ9V2YaPq`YVm0vbeC6gJ*i2=QtTf*tvqPEi z($u8e;`YVnbf-kQ&mB9YOTW|d#iGDKPA>?I;2THRy;5^D?cr={F`l_Xuhzlk1(@5x zA^sr5&gDi_Ls(=yBc}S?r=RXS-!5*4W9l|N&YsK{GebM6mwym#BbDOETRia9l*|-A z)@VMW=3JS*LFN>v91ZP>r)a$nA8!fJu_}>1olD3p-*+oXnON!cBk^mspdtl_OhjE4~ddAwWbN=Yu_#DFCz?5*jKO`Mq*%EH zay>FMjZoA6i8S0{0Bg+$GOBk%WT+7?bzBOY0c$=Dt=)*j_Hh}HwcQH%w5J;ith>=n z2@)Kt9HsY@?KkpSG&TW-DxFnE@*uD<&RaJ-yTukk2AI6+1Z-!cUYaaW?rYLk^`r9;SPQVSH78~{EKM&(iPq? zHjKE)pzy=Q*lzF?c~F)&bAJtUl^SNr<<%RIipxWLGB6+KHP|bKN_N||h1mV2ApJOO z{WLv}W9c46GNStw;#046>rxO$V_tQN8m6yiv+jp0 zGn2viNsYA4Tf5$npV!^qax^8sb^B_WuLk1BP2yB%U<{? zpHY?8N~hyDWtG9gB!Lk=a$8+wqgnY=yiiEZU&(I<)9YxT>LQaI4&VK{WJSH+{T9b1 z8D`_@xjl&ayUe#qTaPKie&-<>)o86WIKCGy*p28Fo`S}pB#4lnOHEF}g|e2|R^0Cv zmR>_0r71+-+1H?RYu904eO)7J($)vL?=>d+!uuhYes@-Ftuecu$81JWPxTZW3(U?| za%1R1lQyP++!n`Xxl7Ly%H3^_aH1mYk2N`20y+M4=D;yrEg%WL`+(Y))s$pKWpE+* zwEEUo%bZjZQ`ulFWJS0P|GwAyq@D!+eqteJuncU>&``{kx*={$(9DA@chH`VI5JZ2I!R3y#u@UpKpOY*~-;5!?pK!a?)@$cW|7rwc_ z6-%_32($7VdU3nmmDSbf^S-JwrA-EYc9dM<8V~-C^+{^L4V4&fubXMIM)*Fn&(g*fk6Gt6eX>@8=Sk=aWc{? z(U#q81MmF`O`FF7C!xLDk&<<-&IdO={4Z<+l zNCzo-NSCbDNvO{gC_2(p^OMu3egzoMI>bg1cogak)tn-yj1ABwxs3Y%CUZ6lxUij6 zh6XxVF$|H>0Sr1HwOA?74qF9!PJ+f3zL;HwDrl`8`-{D1-FTMtH$ilrc zspl?+R31KN5d=aIO{hX=cOEN(VYsUXU2NH5UvH|oN63&VoC)sp1in8T4}?$;O%B^kL4`-NDbSn!87A=oZy9P`igk&)q|t}`3`GWhhdyW%@$~$mtlj8hOEZis&LM)5T@HhbeC1ZKF=p^ zpD$DrGF5{|n!xWVg^bmTKVDXxoKD?*I_!%B%i5Y#pzMb#n1$o#_L z^HLMe_oZ;Pvgyz1x@O$`r5S^wRu&hHeXFc4J`5z6?ly=)A)$`^U-XwZAt0d>R@)AH z&r}|u2Ys(6H>n+d)*T*rC18mSB*;vwA1|f{c_D_S@g@on=!ePL)gR1<^`q7**d@G_ zkaz|*U0-olC-M!wNxD;#sgH=aOq&8(DFW4Hwrf8r>9Q{=aY&B?1lxUUs$t_|n7zmD z;fh~Xm0x)(A<+fv5P1uUs~-&EvCx%HBqYTOs8Od#MAULEw-zEyg(5Bqmb-6pZn{@m z>i4+s?=OTuo#hA=I(i&eEbX51#j)UdLlShCAT7RFLwWvejIr4WXgHW3nE^4yPN1_u zy@~uRf1lyb6)#FB(xLP>kCy1;@B8t2_d~Y7zq!JWy#BCuJ3woo|B|Hgho_RGss=yg zvl42zB+IknDO#e~vkryG46+XO=aQLs6TWj5i*h}&7B?I5*wQ*UmB~QMJH|Yl3;Yb> z(ar2mC<-55)MaS3e`eO82w#d~= zRPZuC-|Y8Q-t;mcHyCmKn|As#&VW8gFVi548b2ngk>LtPx*SMHVH&5B;;#T(Qca$T zLa^>~g(I+~I0DeZGgwnm#Gq4Qyhim~Xb7P+tb)MPqR%rnTy?Ra!QF{}i*@TzQ1Oc= zz_N?^!JH7`P|Ph_&w&{uBVbKZh6f4j_mSNBv+XC`uF|mNO5-F=AwtN^jAqGc8Qo21>qWZRtT0&x(H6a$7|L|*8bkROowK0A z8!PkO`#iu~x4Ai*NCK%VxM<}M2m^18VHIwe6br_(zt&^fzQU{UjQk}Fb>>x--&+`x zn?nz>v!+VGam%@|C_B+=V-OwXG`Fr$p|lC`8esE)F+jKXd$nY4PeHiKy)sj zqs=8Io6Hu>=0!2DO%vW;H|>cIEf$mBO9>O;*L@%|(fWA}Q+5CdD479ei$RyKR>HVg ziOK{8JihquUfQMnN~;W2gh`>C4$@O|^jw!gMa{;9*$%@EhRGa7ggJTOnGFySxO}MB zMx5RsK6&D%59!mP@y3%>H0@?DEK$b9Uv-0v+H(a2z5gVPRE1lYN33NsL|Ns@;s=r( zhZIniNV22g|3(#H$f1DmjwzNxd)lJ$@@U6AGiaXKP{r*Gi|-EhBS#GZ2q`T4tK}lX zdUGM0+}H^qdYbz-)kI<7&!8%pOvD#mK>d+QI_+kN6_Y#IXDHrT7w+vHXxD#rbrs0I zKnJ4X)=7+C6-m#A1J0j-n$}0i2vi@rjAf1O z#T{K?G#zDuv8p@(S+c?A4IkVv(>@W>*4OZ4i2@x`B~F6+y~)kPgNus`Aeb*zQ2>%* z30vEcEWWL+t?oIWOlfg(h&FBxj)A@F5kUjfZg3q6nJ!WF=j4Egj{Xr>0yV`^iJDik z#VEekpb0=y_BVfp0Swi^0N^Y}mB`zj@Zm%~ywbHh9xQ8LGs98!yB44V00`AP6%u5m z+-~6@GE8`2bVVA71}RR0OYtOB5y|HeSyE$5>UHp&7?T(-(+16%+wOX0Hs(j%3a=J+ zg7yKa)EBBx!Wn>kj#@-p-}*x>jzjAy!I@^s*W0x9AIo(V24ImSMI?;&_V$2Y0~i&z zD08TRYrs1CFBKh7@c?9f5rF>g>nr&C12ra3S{#s6{}6}G z)8)cLz%ztw#=zaCe-VO&4^Y>kz`<7USU*UI0=5xO(3XHWh!~xOF4}W*B;w4t9K?o# zio-hO0>S0+FT-1zBvS~zn|*z-r{_y;nQNV`w^Quj_7${PwlEF>LN&ymns|1!M&yxM z0~!B+7}bfA)yZCwtsiyb3ICHc8ZDR`s3Sk7{r~(nlE+Sw1~mB}V)JK}@^6*=Y+3*F z+u26@{LD;T72uufBb&E9cM%g#M&A&4FblW=sq=E^tnka8687s$VL!5K5%Yc>8v%Vb zHvLOD4%nIERYpq8b zoktp~=DXX99V5iI+<{!%BT{&g`ku`<8+e^$LIw@3Umg`k0t>uuc+~_~8t8T8DBupQtF*Nd=pPmKvTNv$sTxNHvX=m4 zu8CH$+lf`lTb2^JhW1OMOjJa@*qlUMM!j;iOef&i7YUPHZLVu7`NS}q5BWdbj1zG* z>fvnX=n$#TI@6H7TRPLgy~X4RQ)ybs`VwQ>J-$>OO;7UN&JiC&zlM{#&ilVYliFla z)`IV%M zEf+ohkO}=levf?!9-2@6TbW;6k=o$x4|a{A!?K!%8x@s(5H4uF=&dhV9|Em(L0`{ZokL$wz-g3V5U z)0F44=a*phSuvs%bKUd(7Hs^okFU47Kqr-cE*|qndKl}|A6bb%$Sma_b**gd5#L-Y zd>2Ji9?T<0m==<=HM%-zroX%cYX!qENzSeSJ6kHb6T4{EM{M)1E@5piW{)4_c*Wjj zPg3a1($KUu*1vpWje~2o%6zuOfQ!FRz+X znF)+)5v5uGBFKni%K1rowMcnwo0<~l?nBFgid{z2H;We*NZ(_NJwn*UvrANGy#St&$sboQF(a#s78y^smSM{k8Vhsw08HhQ$b%q?;C?*4bN+<%R_Ud zI`MgdADJA5ozh6jR8a%hQI_queK!ZRMO7%fir4RT?w0YnZ8LBjSBf!{v{b3dq!+K^ z=dRg@7aYqnacVbP#((--uC6R-opKv+HiuVOJ$v_;*isFZayZnichiT@%HkjRc6)Dn z5sEv}eselYDw)ddermCcKrrMLLTbH3{32ECfAr)1&p5_%Qzv?Yu__Bx3M0`=5!a({ zm!Zj2ZWqzDwT6C^bL$PSJ%onfURI8O+@AzTZb!9wZoW!)1cE86%c%>ZcbhKoiSAF% zmxU`yE-A;6&G=z&&qKI`U9|4enaK~?^Gi@lZUmb)mJ<9Zgu(MTTGLBf8ZdgLbGc&GUfQ%a{rs0&bkZ*nzrGTFTeZZFXJ!n!^ zNY?HwIL+_ZP<7fGGHeov>2Z@haS)bQHh1KWZB33k%*Ghlm}D?h})Bock(7% z<5WvCmYDgnOaaBB{0tZyb>HwjR#*6{eSd?3Upd64trm|Q(`VB95|^9v-(k-xJ`i?S z?JCfIpQ=--6P8T;iQr9jUuWHDwawf72QB5sdU0mX`-;F$*IRJ0$vL{huG_-eh+M4B zL+=ObQCwOZD2844nZ#eG%ZzgVCxDmMkwQBVf$89Bl~BU zz_Y);0%m*l{JX(SX4(}s$7;B!Fp(wO0dWnm@n*^^Q{>beWM;OMH0}1kHyF*@)cd5G zVGTGM!t9TE-Nl)!I^*9!3T-yKgvW_G`?-1!cResII@_9#r9(L zXRk_?9|-t;x%rxPC8Fpo(1K_abfL%Fg4A&~?(gL3S-kdNC@Oi1n%+RoYRx#wQ+a)G zvt9-T>)e?wL~Tw_Sv4lJP0IaClucP+ZxZSpo3TovD(+5Kxv1HTtn#M>5VkSBv$?gK zPVxqutULn6zS<}Iygw$Q5S~js$uP#-trF+n0CIZv{Nm#ztze<~2Mm997Og1~{2=O* z8iWDp=SsY^O=Kk+i|`*RE8wphNYQ~-oW_u6)Xm65on?NTW93%5F8d83w%VQkFJ=bI zFDjgbr4GOPb1;<(U5E&xa^fG+1<^^+G=KdWbXdLrFl!GJ3ksqZk{@N- zji}Y;3DRf^(rN}c;2!YN+`a_Lfy!?|$5AmRvPU>pQPJO4{50;RX=zO~qKY17Yq=a& z{eBO`^i${QJzPbN>2MCmt%TCz?rPYF)>`%9MOva((YKr3Rn@Qx_%&Lu$Bx_b#KJc;G?VUJ33H;N9r`uN4-KtLXh>t<^Z-*sMPisUb@d|7;YO%mBduF)GzCa zA&GS$vg|bA`|qmGPuER0VlT&|na^Grjl5=R6(K2F41}a<7eBsme%I6+NuM;2D1wj+ z9%24rGZ`ZY^1M9R>}s_ckI7>T>GdV1|53*kG-iP&@u^?B+uKuc9gXf|7uz03F9!Er z0Zx}ByBNlF=?k-A;q3sPM=NnLmH=ao8hbr0#zcwR<7JoAAQugrZ(QT!pMwJ2K8teY z0-MhVnbM(cb|)Vn&X=;WmBdIO1GVx*!p{pyh>VrT55U}LF!E8oZ@nN~mD^mOEu>=q z+)`1NHX%l|2RRxe`LsFg=?-L15@iaw>GU63ONgz*-r0#A2gDceLTsO@kRB_8WnTSA zV-~9N+Y8z2GR@)n2JbI-ZC_aG9%V(akD2lXz*viM2-`~v4}5;4acA=OLE5__Mo;5p z82-?s1l57fusmf6xD zc5T!XTaY3gIMx5vY?8=xa|YC0NlE>UYs*0enZq=@`5U9e)XBkY(!A1~4zx71j>>EA zG=jpGrXF2Cw~!*n;OStP_4p1I;YdV?+e=<2QwUEVXihh-%b>DFBq9pGPOr0(pck;r z(30s~ZediGqV=$`nzXA&RpmiefY`8`$sn z((~@u_&lKSdIh?eUbcs{A_hFy&0@?*2*>p7Eo+GcB=>U%H7djSZYbj(t& zM@cPr$AxvwB7!M>o!X7<#B?7$`FU8wmWzh=@`oE|UDb6(G`*YRNv6OTN%o?K`-*6} zp|THIv}vN{5Q#5Lh6c4|ofe^FRhS?E9AeVp!9-AA>sjcf=N7Z&Gf@Kg@4BsetL%{} zf^6+Z=XgoW7wVmMyJ_sCL7(>chkO0i_@sz%2h#)9#*UbJ7i>M~3>!Pt2BeG0K0i?G zS1PP)I&S+8j^PeWVUSsshD_`7D*l+~Hj7QGnx)@*I~C!cfx-TH)&xO^_^9c@{DA46hL_8Dyw+emTL zR7vcltlkdV*bF!n3pm&0Ykv_$*DXE!kk_nz;cRswi`g4ufP=F^Vt7~81l%W|NA>+I zc1qJE&ilUHB{bu;x)1u3#u3F1;{I%8kT1%?;8DRYLv1+n{_pjK@-%8v`Gg0~%4=aC z1OSGZEJId!89PmGXpvx~g~|hmb=>hZ)pIHGbx-thd$}64*N!FFog<-t^@moI(HZJQ z+R=1q7>XSMx9><`fzAdPl4J!CX#qLcn~8O*I0%BpOlW!>t&DZ`%HI!$J)-(604g?x zPa@wF*F?713BkY7DuCuAI7FdGJe}Q{X~8)FVD&inFeO^Jm{vJf?ZSsi;$P<`g+9QshgZ|_Q$kXBJ`t2 z(W{Z7Aa~r^d*69#wo#S(+U{aCglx1-XwP0JigLMRPAH+~l&od08^wTOe4!B_+`& z0SR`9J#mw!wzA`&PdZGg{~rEyy`m7AWQ~CnXd<-=!9O3&;P}1(vStJ_q1?ZJDWXqi zJmWjD}hi=%f4lMJlGf*?!If_`%U; zV~pa%Dv=?!2lP9ul*k=tB(`tbmD1&BRUU(qM`LudK&n$p9&2^ za3kwM%5+J**ZM?rnH_XtJbfTBg{kof!LwR|T#X^XoDHVzLK)h-2J8wF8eEzR*)-I~ zYAu(nJ}>o=AG)ZJS3c+yC~($8!Xq&Gvh)ddrD#;9=sTdt>uRfW@bS@M!jD>h`1=gv zj{0`1NJtH2YT5}kB4d4~^??2Dv75J;s;auYzPdcaAsbtA!rSVRQQ6sgZcaKtdk+2V zrtc#wD{F7hNI*`a@414tCD+)lJX zUO1Yi{T1XDJ=j&aU;X-d=I&TDyO0o=ynnH!23Q#i z^iVOWm60=8F?sn_Kx#WTVO>T@K<#){>Oa)saL=R&^zL8v{TP{u{bgf`XDsOgqX?mZ zeELxup{4leTSAdN!zkY1G(Yu|GowSZBY(HoK_cmz*_bhkB#V zO;_XNz6PnLcvFWCy*&PJA0&4i{M?@@ex*xJ>dSi>BcQm;#yK1MDs6x8iWLT1SkZ14 zcp&+&wp%;LlHfjtqW+a@L*VKIz(7d5dp6+cFZc$jY;UskJdjy6g845rrUNOWl|V&d zFZLIQL8%I@l8izWVl^n|;Ic!wBLA;OA3Mh&ONw;9SMWNw%uvxw!IB4Njs%hE-wjlDu>*e$}@ zW_1GaAcJVFf>c@Z+JTxkBge#h6W`oPhhhpe_1HRxU;T0J28Dw*9 zW(F|Cmgy%c`C-x}Az@j*OHT)W)DRYl+^m|Jdk1#`1hW6?W=~iVG#q zV8)FiX!$ttunV8EGDQtg;Wm5j!HU~!;qu{AC|EkmtdjIN8=V*=hLm+ReB9|JCcKFv z=qkBAzCxOr(Pyqn&~%q94s7nF6n@oK!5WY~K}};SDB@}^|5)Jlw0}0wpu1XxI#j~p zAsnU1+I4i2nv=W5g{q?|9rS`LfxioB@v*;$4!Pohe0l&8V)?7L;)SzD^{4x6rMVj% z)N(JH+EiS<*|dq{C3iROj!W||FaEB^Uv^Q)f7J{BhOm$u@`^Q8Gl{O_>vI(f2uIYv z=%q|62nqeZ&<$q<->mqZj%4gMtml=63n`=nQc`_7tUsax0lJj*?(2XG`YAu@v88)V zkHn5VPIZNfh})89x9vHuNG`VcMrd_pxmD2a&;`-L+b5i~O-^`QnDJ(TB<=N_wFNbn z5zxo@5BPeMk_T!9aXx$uyctt0pj%YzpG0^Ff+mYtRjFT@D9@z2t`g^yT^J{)W{&=A zBYgm&von#3@t$&OPUMkM9Sz)PrbaU|WopChV-`0f)oe8wtoMp;F5KV;Grs8rH#b^M z*Uy(TzH0md@S5EP1`&J@dP4QCIan`fu~bAx4`RV``=dI^gAdJ?Gc%KBjbmVf(lCJd zeYd#T7)DA|2?0geogJSic6izIt>5vTx1|JW>UU}s!<~chZz+>XSEnMqFMU`T^eozp zBH>XEgL{@H#!y)s!B*p2fu)YeTXpU-c2*7dz7MBAUOU>>G-0nrpWNIrPLom;?WIGR zm+1*WUlu88e(RVlT2?Og=(-tPs>0~3KM;0XnEZIp%82PF96|3nzio|*DYvb_P4jmo zfp~bE{!6_P?C|WA3ZrZ9LukEw%u!iv_H45=O8dC zQ0caDC^k7a-gzjCVDH%LnWZmT3T3J=YHbR|+Kg2E<1x?0_%&2cs$_<}qmj8S4?IPO zne>qD+dcw)@Z#&X(d*cO4(7fHRR3S_O5J5vf&b%y+R;5B;X}3>zmsCKT?9<4wcmPi zkvKZJh&L~=ecYs_6R^^OVv@;#g-PUxW7&l^$f4KgBIt|}OfXSu07DB3N$l8cB!k8&J za$IwC9)`(|^5dl*lU2+^so%{}*ha*a9bQ>q{E@WT7I2Y{|NX+;?SUL#jh63ww0JZ8 z#5d(R-!XI{L1DAPBM#%l43Ly|1}j9`FpgiJ{`jjqmf-;a?x zO@}Q`+E1UR^FT_uk?rFUxc@52QD-)BJ@y&pq?hjaUf0MMk~e_G-Uzc;11SDQmC|6J zF%`p@kJDLtEWy^ky}4Y>B+ZrI)~Q}$U@mZxsP_+1W^KWKMaV>iuFiq%2pN>tXf>SS z7R=8VKfz5NfPJukQw%inrC`Y`<0$E!_^ zo_vVHX}?tA#}FCM6MS5>(M*gu^+v(ZQ&jj$yKbw`I#be;cIrdoM{Ww}889dSugMOV z!PoZ-r`X!mV}T9-<)FFtQ^r%8E#iNJgg6^=CTw$I91- zKN@l`eWR;gM@+ns(uR#LY@L^bae06g*Mo?+-h18QB~K=7=WPLglRq{>JK^@Z#ND(H zqxP=PW;AQsPMub4nA7d;73JH+aps46_*xtOuj8=rJ4DB!8TFL*x;{GvAbXLtlI+TB z@!YGiCHA!t&M+M0Q-yN^;F$d|P7mP@rZ$7je~6Apth$u;+jv@vOn{t8N z0aN<{yJKknvvk8e>u-8CM;d)xDcA8Ar6u%u%g+fIKw$GfA&KM%H%dEo@Y0)r^5CL+ zw1Ht9sh81AXb=Bg)+j?xvr`w+g6V<{*4|xuZW>>;P$p}N=GY`S)M&|=0A;ys)aupl z)2NvGxpIVc6hd3kY_zUuHQPnPiyuvGICCWjqUxUU{j$VJDUtH zjM$n-@eZ@NS?23H?ElQ5un}>pWv-O?rCt@Cw$zZYAAmbmePjzHL#Fe$3y)Nvs#q0@ zzMG=UtM{@n^apGKWJ{m`Is8_P>|&ie>Ak6Oea*LyMGCPV_Q*uEFkh4M1`3WFI z=N(Q5w!ziufr%PqZnARQOe}N!?3XK?)qk$jGh;6BlOK$lo8C4pjVRn>ww;_jBlExW z^u8tCplNs8Il#bsZZ1JFP&XkHcT{MQN_oj|1@7w)s(oaG*8ZxP1M>nf@5=$Ja|a3FMLWu#aVbmOIc=kEr}>M~yBc6gt8KO!;^XiQMQG$Q|LN^mf$&5PWRaIzyZyO>Y zoOY=anlgf>t9#blhj)+Dsj?6zcly$f>-1{aWO!vLu{@*}f0el5BzQFUn}Z@JPFS{Z z=I*8TSJ-_R&?`V23SM?opNLT0T0p3_aYa<%aWpm@u`rLVCqL~l@sJg!Hw#PV=B;$O zP}SD>IvZ7F=drZY9h+=~1G!D@b;r5x2~0WTN75ZhGuz87HrQ>$)#AL!VsJQj*(4zz zSN%QgHv5kRzWWu}#{?8GyNl;f^Xve=gv4aK=KOoVnm?AYv&$qRQ_+*$Mi&4R;F+pN zaZLaV1B)0Zk~?YkXGLq=UmJefN4hHpZMT#zS&pNV}>KN<8JLm)6D=EOZkh=1f zlz*LEqjXG2URdoo+UIT6mL1x;0~r7%C>eG7_c~&7;qn$CF_+5H*8*lr9-?S-_)s<@ z+GOTuC$GK0?K2LDazW=i*KH|=R$1GEw6~<@yZL{mDsmcY4*Xl#_~^nZiundCS$ zxadF^DkJjbK-FhzWc@j1Wz|)W-x4yE3xP$@8$2{$fEvBhd2hV92o(KM9`JFyf)3DG*}Ms?9tFB3f*Pom zi6U_*Dcwd)Bd{KbyhUiMu*n~bHYQ(UF%javshnF@E^oU$-Y}NE*`0?V$fVQ1c;bPV2bsq*|XfY%noe;b0|``QEl{4r%K5$IU^Wiz*D*K zcg!^g_r0}#xSZRZ)IlKp7~NNmMOyKB-Bw~rE@aH9yjPoL;-bU-7-tb)*kKR)Z6~id zK~mLLXN9vI2CTwcsgxa?2iTXLWc<2_<_-~D$JJg75b~w$@SeBn(QtDnOcZY69}U&+a7%$3@2e$K(8oUQ--8= zI|BO8n{bDznaxT<%)BrvJb1z)f8tZp%y5W{5Q;8EIk{L_Ni=-q0F7(JaiS2D;;*Bk z=!RE0{N_!;=1qa-i!VaOt@{Xuc>ZrJn!3KC4H^AXD)xmeva+>*Z0J6kE1(5cvUD_M zaZ$+! zaV)Ng6l~oW(3UsdH^tLrr3wUaOd}2$UYvVp@~b~BGDhq5M2W{Os(Q{-n20BZe?QHk=ZR0#GjLFK`|EZf1OBr@zWr)qOp zy$hJ$t9vFvMUA^o3lxV0yCjAqXNx}y_! zZJ(KP76*Xsq}}x3P|5D+ou+dV8f@+hrg&Zr4_R3%DRFZqxc`k>u_9_}Y91auXeLhK z1AB1@2(miDuE}BPs#vUzsp?dI^OT&qA`Z$ISgIX+%dXDMpnAm~5O&7L_pwv!*jN91 z)8L;#8L)4Up5M6n`8zD9i2zG-z<~d+k-fZ(3<=db|w9es+qj%#akk5+MfC*#3(j;1)uuA`YJF57Pwctm<4EJv_ z^l$Gk+w?RvA{VNfno@>6zgg>6&$hMhB8uT)5!*Aa$MJ%cKD@&{yumT`c z0f0$e{q;ZnTRjoL+PbW-TJR8IwIb3a@!QVlkkB3BNlXc zP(Q|9bp5V`+V)`8c@AHdx7=n={4D?G0{^NI3+Lo+q;T{!V=5F9d1BH-ubX^2Ww9^G z56h&%Fju~NvVGxx z5;2yxmXJ^y15uaxzK+Msc^Wh!@pJilQ`bY2fhJUkeZ<2`Dm|~JNJ-~<3#4w69eiy2 z3{aYpUwTP+(vH@ah%j@=Yr->d@*^m@H661Rs)@b7gSsEYVjkN6TB&uBCi+R~cpWp6JvE;(aVAA!qgz6Yo5AROf?GW<(Ba5D2O)FqHO| zATf`OiEX+vIax`^3Q1f`a16`fPzcb7MBLDc8j$3Oc)Q&weqyLjbUW?`KOGB&aLvHa zSofRik{NCHpdK0BK(o+EF#Q>BYtX)#PsBj%n*XGl0VA}fVoupp*hcCs&p{$qt-laL z3seC_dv7ulZgu$VR$R&ezFYOpJF-E1)#HT^D)L65hug63G8_AVV$+2Y+a+j^8@b2rtT_pmb< zC+;77zUcQ81r|&t0(HTme3T?uG z^!>DTHy=cWoqItyTk&d}-wx0SO$7;vh2*9Fh#BCNZptRef(~{NGA`l&UzjERv*!&y zXozWpe*IwK!>o^}&wJR0l?rnDykBSm;&bTBsA3iUC7N#`!}^Ra)M{R$W zJI>)saaQ(#EDGkPP^t{^aFh^2?{c`Wlf!aJyq%>s<8PB z*mw5>U(z2f#B;%$iikfAn19+Y1#`ay#wn*7#2|%cMXJgQCllkqv>jM_V+X2m~jN;za|PENtJ;kHvaN@sy2js4A(uMPrPrWV}f>`zfpGp-8* zPVF9giLvBd4vWoJ*n(bws~#yKcu5|V&v)b*@l? z66;X8R6+zHWtU~D@JjYjzanFBP9+o`GRHG@iC)E#>b3*L$v40D)PKn|hz{WGJeJiW z!D5i**3+Wn*MPL(h*$if1iYI4U@eP@0joRWV$|uzSotdxge*-0`pdy3*Ux`0$G6b) z=&$$C{|{5=6kb=`we2=()Y!IdCtY#lG`4M9jnmk+ZQHilG`8(;KJW2w{MpG))|$t> zHSU~ajO&6VRIckzSH@Es{^=@|*LbewO}#+z^+t9Spp*e+a*_yvHIP5Ts7hrjEJJKy zhnB8>$v&>cFKqA-%NIS!rT%>k^t;fvM-m7hZc&MT&pCNxt4IndGZ~RbnkSVyz0SjC}O+F8WAMCK{NHOXq zr+bjedKFH8{RNX$6)?Eu=t87Q{D0z!uK!)Ukod*^6HP}cb9vk>H3jtwRnZ5taL)I0bLV`mMoaY|cX*P(Sb z-3f$EC2~OC8gCIAkc$0O;Hn0~devoIBu84kB+Zszw|y32RZFT8m>?h5=9|`3Xj2#? z4rrrP&}pWWbGhxp|1#E8(XpDid9}}27$-yS$XRSbUlWE0QYN8GGQfF*UXJ#{J_g&2 zzaB|Ww0x7D+^@JK5phRm@jP<=bsv^hAAT&H&6DN!$=&G46Z}%e0O;cBvepOhU8Dtd zCO#@cr@;mbhYuQl`hG-zj^USC%h#kJ=CFcdNcPEDBzYC z4pf?3xx0s=sp!hfcJcW!xfPhaBovCsSl(S?o3!+|{Pd*GV!jC+lYtlHjU&JG<%fW& z_Hz4z{?t_eaCO=`eyi7eSt@-BkI(&(x;1#p>4eNCPS-cSR#XhYz~gRxVaabzU1<`t z6g!0~lh5?unZxP|O}pt{T&yTc{xBuE=VfX*dA}iZqBDSxby=I2T8)ZvaS+qDN;lyEt=u9jEQo#)}%BNnTiL^2_lQuz(db-+Un2dk-JU zC-0oQup>2cj)OJ-Zs1BH#}saQCIHl~xtV)+a9&iYc&aN9FAhre*B@Px!+&nfF+;=K?d|0NvI?uGpx=&1h9S|_L3LQw3Gxwe#kQa{}XKfp`xIP5+S%?m=;}=PWQ-R>;tm8#8l}qd+Dsg7C>r@kXDRh(mS4n!Yn2 z=d-+>Uv8y8EU}oDzhBXGBg}PW*@}g6)ruH*!$`hvu}Ek&Nks`!F5?kM^o<9{!c56r z)@{n(J7yPk#QIgi3GLL)*Ix8>?lk$he~@iuYG5-{l>Q@GyK}A2i0-4ob;;(cG(Q!< z&#X!j1)9YTPuj=bM6B4o@vexN$FI7gBYn-_J*@SDpxsR|`V0Fcn9YPMv7Qf-tXDmc zblh5Qj$xa==Gx16rzbqNhlCLRQeL+2ROOaJs1Oq$KfVYUIFm#!10;yL{-&}8 zccR-O?9rwNQBOUZ|y}PE0cyh zeAO4}pIT(?{DK!%asKpTBs^_S?|ns6>g_iD zryf{?X7h2Rs%-k4wTNeDGmrMR$a144k7cYB;u z&@if*XX2SlS%7#akxR9mfB*V!A+L`*5WUx#?V-vj+egiz)z6Q+!B%3r-<-%MBXQei+ZyQqY-kev_y(1yPnTcqg(1k) zX=HMmtXt~3JPvefItAE)Ku9~6?i_ADX%YIp+B6W1=AfOmZsQA67KjvmA z^QY{ye0YG=Nf?*e^6Wg+LX~%`zM|wZlF^q#pqSN7z~{fN<9f(q_zU;y&D;_j{cBy{ zH%BMo>a6x;pqx;R9sY)fV7rGMH(5BDo#?zIE@vU@59tXfQ4yx}q=zvEZC0DWapqce zna{tS#pz`mX`9R9J6QpANXg+LcEqe@PFM#09?}XlHbfQu3w%8FW#`oe3=E$^K-KlW zERi&knx*B^k&*|#0cs6DdwA2X1Gb&5d$GC>NhG|v&S{V|S9Z14g+Y-ziQ9&S@$b2s z>gBT8L%<*%u`PFgw7Y0gD`UF37cV_$>Bmm;P3^(38)JFBrjwQ z<+R)APjAI!aufFEs%&Eq)!WG=5gwL&&B`VqcN1F>V-RQ2-MaZ6E5^-gy} z##|N?px~JbkZoMPyT*rGWu9_?_8R`msrM+dhMpxaQTpvwicSOFTI>44f>l5h4pPkOvvA^$1xBP6>f+agr~jBPS_r-E?S5zmF&*iWSJ2+ z|Hy2)ZhzON;x4v*NKk=&`DTEs2B*HJp2?Y6Xey?W5rD$(Wuo$1N8NshANPpZ!PVX0+vH}#AM!m( z8xEduFB)9j&LC>Uof$TWcRw0Z|v2vZSw!ifcA&*P%&9Mu%x9|I2-z95zIVU@S{$HNHe7VhmXj%X07f zE`5?0EkQ|XsysxA9pid7YaSC|yzw*axo!tLFZ`b9N(kDncH^08^vJmYp6%Z3!Zm4z zgYHaEI7Lc={_#6=JSmE@0Zxx6rzl@ z&nqKw?ae{2n-9x5AJXY8FyBImr&2pCf?azHN;Va)(Et zKgz@u9ex8bKxH1n3B&Jb8Z$LEgB~5IAzF+BQJ*Jc!j@X(k8PbS9QhHCa_#U*2DOw( zp4(>a)(vi5&h9N3Ma|kkr`p6gS$;vhOv(tPudreT7NpXje1x9TDX1zHigc7HbsHv} zNA_|GkbBA3*Nfrl{V;lKSGDQ_oY0)WrG4b6dk`y(YoOC_-{%i0 zG8x6k6{cQ=oqUYH_nl>Uo4fzjG&k+*^Ph4gV-(z_?f-*tTXawqucC{~aDFwU(|Ja8 z{^kKiJ(`4xe=v!XsVhx(etR?bh{R(wNpy~$LmN>w+vx(4PA`QyV1`Xzk{?IP-{_Ru z?GoW^eEr)=ZL!lX#QVMo0x;`^&a$nq8LwPvZ^R|xc13XVOFW1qin%}x!bk)B@fx=uT z&q!BcW9Da-%!7Tj#xXOMY?|1tG*HC_Ck_jxJzjBq^pXN{G{x8I8t<~mH}CStLr$un zYN-KIR#0x$PjEcP*`~1Jqrw1xqHCJ}rFu4vR#k0duBn5;d!v698_yaX8@a{z2 zMXIA+Ru{0uwjH|E=}Jt6)V#`r^J^pMV=RF}`i7S4gIFiK_GtY=vGG&}V2UQ(fAWfd zeZw_RxPLXl08~+d3b`9uU$rN)<#YRz4KpF-7~Z}-mlc(ir)0Y2zXsawrqJKOtfxs@ z;J@2;C{nivHd@se>9*=}^(Q_j7`wQ*7#NTcHw(~bnapuH`(p9qh$1o@$J<@nJcctI zFjW}Nt*@;KsE(|^>Gy8iDQ}i&(o3O5-0sDtOT#{{A2>ZQPH)xe0Z*AZ@kl%i<4o(r z_TA=9WSNXCf{={5+soU3d%7_6n>2ZRcqlS8;u0&w5-ms#EXFb%BibHH6)6zvWn}pO z;58wJs55^UM-XmgDQsWuhFySsRvte;UvsL~)f~WsHiGlA{V+&&pyL17KmzS5c^mI!L3mRr43}t0yczF2p^Yi@te4*{1uhyZjwTta% zN4Ri~oH(PDoLKud^$hL%+8uObk-*o_tg+@9#Fy)-Je{=1-w4lxiKhF96+J$IuMxtb z{1G8Sl9rR}C&m<-gATR=yVx8U7?_xdFl+s!cspnA-`8o?ty#=-%h!*>Q|vAH_uE?5 z^^>agjQq>#SUWLQKn(AK+!--PXssUX@dN)OdkCxe#wk?YG%6eTE-ta%q)CzPI zIyZw2lJ`>NWrxx>Kh#WP8i$B1JAGa<8tBrFPw&LL?9C;<1?ZX=R?QZ6Aa#p6WcnO1 zNLknnDuCLC+isdlEOA$?vpWAWx%Q^V-3&WJu4>Ykb|pK9%i+=Sd844-qLQ7Tm7?5_ zvo*q!Lp`X_S|jlJxDQtbF21Or3Zh^P!oM7s+sb!!q>}6(rcs|dQ3w9&oW0dxyHT>wok<-$Uhhs{hrl6x@0w~N86a9nCgAN0GW z>!q(MikA(JM(-AxY%yP{1#xo_so;q@21G>ioroHc@G+EhQ-b*CG}QC*&}(E{ zPEURNJoh$L(p*j3uUG^fOuwaM9cQ^)-rsq$zPIU+A1WazBXA{*yR_ESYRhuPI8KdX zWyr8$fm5vS!J)(<#UaUmi;b6=;wEL`sb|d7V$iByXHeuQxzO=6&-A=-?LxiiG|j%$ zA|6|)V%p5UXg;W7-M1|++HBaGkYkVIkF(t7{;kMZlH-%OI?{c_xQxni!b}8r+Mt+= zlzyL@eutg1)r`Xu+g*ZP`j4Z(fgVyCuWDIB^v9G>Zf4yim38^oTd8w2w;vYM0m6qR zVbhIq$&0VD8#W0=|6*`sUb=MIi=6i>i4rAk`58AZzi2;C;^v>74@tdE%DSZ4HDT8- z9q%A$ZojWCxAq6tFEcFnfi6iutRUfW2$50g>D>>fm)hH>5D<$(H4(Y?^!hfhecq%= zSNTg#Tzs|_Bgu}wT3nlUcHnBSuJK;iIWDk>N4!A`Dk|u#Q(F8H^AX*7@w1&+HMN0l zE!19J?2PD(g6E-5CNzPi^}MxwC1gF}5Oj-}%d6M;M_gX!YGTvN-0|i(xwlN~t!l#= zShe>I=t%5dr3;>pY3f^8j16$QR?AEo5WV5HE+UO1h2h@U&`7L5Uuc$x`Xa6wmALI) zatJH=wK%u-N?u!*)4?NdkBp2ce45WZk?QMvc+|B^CCQ?x;5SUK*$iy_?_Ea8b3J?n zEzWfB5@fssR`1MbQ4hjH?3Fv}E}q>>{n07Ao2qji&lpvAZA26M|K&J)cps|CtV4f0 zc;nx`#_d2Jtw5~5*a@J^XoN<4Wh%-3b0=H5oAj&F*-ho4)nu;DW9!d4eCiB(^*0UG zAJ9WXLw6m4TWYY#u-#qw&q*R~o*S{ct1KH!jK|nneLFjQGQAZ16n&bjP1N6nn@nlO zdnplOyXg*LE71-|BpVLj-p`zQ;M7Z1WsQ7{l9Ub@*RNzZtf^ZbVn9qaETA-*fT1-A z()O2}$}gxF2*N|JSFHB~p3DpVyv*#&Af9)kCX`gcz-sOT3q4 zDdq?LLPgfwSNfIS<9o&W+nC5*1nid|Bq=as?ekJR=^jJcyXB{AKh*~DKiwz{qRnx3 z&<{gzrrA++tM7p9((hco>|3&H?@wCpN?O~X++IO;&R&A@3FGxx+tJ9jQpsl4ZA$L$ za}}jRC7Q|7W6kP#Nr>g{hJg%*by?AZ2rkT!5v}UrAcxWDT*Lv?$x>XJ7O+egj6gJl{uM^zEk4W#M`#terY!#Y-0S%qQ$Z?M(2v$u{cRReIKX*q>H&AZ4lF{5x29LRNY%oNYUn^9`_% zflzd6(8e@rAxoCzsV|t@38XuTkIU%o6+~h%9i50~+U~S~x4Eu+&z5noE(S*zIp;}H zMwjSuSW@#*_Vmx)CFI5X%lbXNS$%x18(SKfvz@6!e+r0lrvbLuzJsN%KVb*kmuIX~ zf036Oql017koWhN?#?-k%{{~Q97lprlOITm+mcByP6*PRq$-}3_>U9nzl3M@)?zoc z)OR_e8B=$<=QG>(XPRJ3%5FqeML&Ra&1clefowLf-l%_-6{om2;fDcd& zrc(TR2=n3J1&yvdIq2*EB)*>gB&(0yTtIx`{+S>clJwsRQ2{smE)aK*jo;eORuWcI&Jd(pX{#@r@*Q2<=rg)}mROfuYm)uHBs9J&Eaa&l=eEj;~ zs_*)%gO2&v=4cEzc6Z$_U-pLD^kd@L%D zXi_jGf_=POE6NXS(1<;|o0d%BW>Wae&#UZWX zLml;#c56QoMBR0&#T!RwcJT)zJIW8m@Zy`ron{8fzQdF2?D9d|8A%ZYI{m9s3%)r` zr}*u!99-cU_i2Av5Kl4SIT+S#=VbjO={}od=g=*qYC>Or+`ax@N^I`?_b(^P^k5m| z?c7$n*H-vw%-rs@!34>jM*449DWker20K!AKoHh+LHNQ=Pg=-cg zSqS*%s`#jHslhZIQ`js^#TnYnORX9AwR$D5&#k>=eM&|CH_(7ty|uuUj^%dKVC1ap zzDg%x00f7=eAd5oHpwHwrQ|%#?HJzOPozA_f9MHSwIlP_obs=1|H5h2YDmROx^q0^ z-*G;7(p_9d3dwVJnE=$1@n#OZBPa(KY-TiDlaU9t?b|lkMDS)Ruosq6+eTmCfcCF# zH)4h#jyOf7orR*I6T zhBwO6pBf>i_v{ajj*j|v7;QgHX4-DDg()^KW}l(X>U`6yerw*xb^nt4UGgivApAIT z?T@BYGRi4CDyP}@+=o@YEUA9JO5TJ*)AdWCSRX|unL4sspHHR<7@dA}#`NM&_BBo& zji+1Tf>dnD#L#_O!s@BD8}0>@o|Q`U(>Q0@=Y98kwC_`hZ%tFv)aWQO^fx?Uu=S9_ zOF@VOyV)dE+-C8$%9O~&;dqYWvi|Pre~3i%)AK;9B&ENbNfT&|2e@&$Uf>aUP1G1C zHd5lN@xo!RBh`(tq9SV4uC5kdVpn`=sOq3^aZiM@#@O2ItYvJ)X%PmQ2bjEd>xO>? zDMpHlw@>`DF3s+c0U7tVuKRwRV$Ps*ayA3HPfof*z;MIW`401fKwInU<%gr|hEtn) zsLjfhIy%pZ#KOlEwkL$qAX+5vtX3*Yq$)!U5?@Dq4=Si`bD=Tk#$=c%L zeKt@U=5qO0TTR?s{WoMJh^WRbq{nS=kDz99qXNG@F%E-!5955rmJZOYOcfRuzWnSq zFb9I*zrQCZCkn2UE7n7sWx@~<4ilL}XW_0~^w#G`Zh+-UtK%VHlw$n9m4Q@WU$34w zm(O9Y=4`#_*DykyOABSqnl~qcB=13Z2L2VCpPSqLQhmuMUHTg!2Pid$INRQ-;`RDv z`_-2+5EB0Rixc4XB0L@6KFsG`uX2ZRj`h5Y(7#YWRS{NZv3jxP=?`oS2!sB>h@Aiq zY|a1PlG0`=O0i}fPJ&**ck7myn9Xbi>WWTJ9Xlf-UvGSiEV`{ug4H6M{Zqy60JtK) zc58hFg1e?(ixjP;PfIMMzHSpcwcJKg@?E8jhK>AS*oF=vK51O(Nmr~!nq?BZH|b$ZZvib3_3aptDpeJOH(fk9|x!I_VBXt zKyW+xTy_jgz@d!Cr5e1Nd5 z_B_&kd?z8S8{XAZd(drZj3}wYYDY)Wp9?R;(Z;K70Dx4DP+$oFb1n4H81v*5>o4J@gndGa%@(CBvzG4L7zfp^FxDMV`4?IqBnW4#$J)x4^U&ANAW zpQ$q85@00yGpVJ)pfHJ^5O$}Dz);_slNi6gz&!0>&E%GioT&oYfj0al+f8cuDF7T1 z5bWv+U<#!3k32yhH$7||jkG}CQnQOBC~R(MsQ5QMKG$}GkdmGb7~kJUpzRE;6<{~g zWoVrapjdUYZ*i+JadEXQarS0~mhF0&wquIFla*%YwH~Z;$!I_`A1K2iz%y#^A|i-f zxxIxC6du~vcC$!t77%o)lR8AQ8kDO+3y6X)cgCLGJ$NuUQLd+y45Szc#mB!2@K&g;es1p^vg%u?=6O^S|O7JOZ*z2pSZ3nlCfti}>VL!UOd<^@C z->|Pp42v$`)n(lJ&>~N-)f?hsop6=Njg?cC=JG4 zLVT3#{tsK|#F#lvu}jv%gnW{1Qe_%3yb(1#sLo#|P%>GnB=8K$$7qncUgBn_m_&SG zLQ%Pgz`P}Ii~%R-DK0Xh3<9Rc!=^OsMHC!sT(-APR+8HfD)p-x_r0TT8FKl%62_D~ z>Gv^&?e7FLLU))5*XoTcmTYIvo^EcNAB#Do9*;0G@{W`oOA0L`8#6z#nYl*#hGe8U*x~C^$=le2v9}`XNLINl8g>uGi^j z5(mDTPqHCLGn%fFQ4^%jb-Sxxhn4m3_9WNux#&HWmRoSKwVtXlaeX*sJr%?FvpO)> zGSF%=3#YJGVle2S&lflZUunEBn&IZ;1UCv_j~IRQEGUyY;^}ZUj$L36PK1-}&j;St zo$8o5J);#WUocbar$RW_i>z=v%rlB?j&0{f>5C~|cE(W6{*x{ZRGLIt4jm}Cc^Okz zV3q1~9FSaQ$5=l|+X5AuI|i(;fa9up46)4Nwy{^>$?7VqD&$&WEz)y(3mbXEjMGJo z(DQq1?-taB5e6(b2oLyk2 zPnf7nQLb@0gukH1@x$`^3i-@;VPTi!;YJfGL5a<`CC}pY7#6)Wi+FW2K%+^PX{Oe7 ziV(}UR=_K6K7LFmk95brRMW^{dn7~3&A;9k%Lz8sevn;GUC3?8u_ND2`5wx6kyj8I zYjJKg8|n>RilT(1Tu}83A8CJozl@BGYXDcs*%PjEKS!zGujIyFc$(Z-y4IJAikq7o zzyxb+modj&`#@Y zJHrx;0vyvm?-@TSOY@Lp1hS6>#3apX!2It@Jc#$;s#Uep>fG&Al879er3|BT9L)q5ZLw71YO`I)@h|8qm^3X5pubIr}q<9mTJG8(k)9%o3C@dk=<4?#QIriy69a0LYC$-<@<80 zi$beIQeht{%iMC0r2WI~dK5se1I~HrSPTio6#|ffGE8?)Q zqGDnq+_{Gbob|ql+*$p6!;b&SQt@EXvtr`xEh{Sved}wy-%{ch*s5j{px)Wudkkg$ zjEkhvRU6Ps5o+hw%|87A)1I5V{RkZb!pNaz2A`XwjsrDi?8EM*wQj<9*BlIb*X)=( zZ1yn}R)L2fc?cy$(g)N_T6qIv{orLIjNdV&W6pZ1u{2v=H9VgBxPCLX+3160q4T?5 zGnxdwM0d%->ji}Z-xVnt%J(7}a-hGfp!j3IF)Q|%D56kl z%)#{Y2aAW&5f3$m&Y)aw%H3yTa=!LRi{+FUf#8q7>eG1qhVc@_AY5e=GFYauX(q5y z(-K=~;oTpSx&L&R%1DVz3wyWITJj>RR*@RcSr&}fHo!DvpCDQ;!1ZWyMZb})m+RRN znwa98Am@PR&vWU)2)QmRjr0}kYE6%p(=cgG*o&5A#8tm)r<}ozhsqigOZw$Hz2~He zdD$WFG$6?*v#7u(+SQ%sZz=ya6oeWHRIi+P4wZ|jewi5A+}wQ51JibW_yIfha@w1& zl*>?_hLor+Mtx{&pRzFlnBr|+re`-)y@^dsPa`5Aki;ywnqD^k`vse%d!|?QHE*(A zCT01uUKAoo&1-ZR(SP(`9Cg%5au}t=#Svo)tE31@+$_JB;MUPAZ5cDUa!Pe|%DNcF zGP6=>w zu8}gvjR-btovQsq2d9RV=kNYf2T9+PBu6t3VN7h~w07suyo8l2@P%(^rp$4R8sR*O zj8a;k_o8BVla<{zQS)HNp7Q*jciHqu`3jji!2riFQ(Z5|Gb}Q{*_Cn&$N0^)&vSQU zpXnoKsgRa2jE2>4>KSJr=-nOeyc{>1+vV2>JpQD&yu}BJn!Zv;)rd*u3OuRegAEk! z&xgUb>S+A>hX;21`!3w9-*sjL-~UF6JAMBHiAa^zYGCknx=^vcIeYMPOAZv$X($ky zxI7OvTRMZz+Z|K+ik2aqPZDO)?Byu1IdqVa#!+4Q^KnTyxuu~_G{o){4bPdDZmF+- zIwUd3zMo5rqi)Y7>U7h^Tj!Ux(`T%rne^|RnWtP#S?w9l@w4nH+~V(L>)fQ>ZV!jC z$;`G9|G+9~v|~HXj*pH;CdTAF1!TZtk|N89ag~KtDVKE-*US^V#$xfO|1~x?zE`FH z1?JmDuXk>JeH`^5%hBYLO>#8{rOt}bksUR!PMh;%4_=mqSJ6gixf{%hJWnoc-*;)m z;d_Y0@eU3jTlZT_9Zq{CVZ5`IGHsD6-7VlG1ytgydq4?k=qWM@*ZoZXZZOwjWzcz1 zzPY8{a#ala+?shSJGv=4|NfJ%)7y*nhM96msp;R$ME@bO;xD#G$KE%IIJITx-X5*h z1&XqYS!%Y2yxc)_)^!$Yd%3BatM4NOq?A=9#*yNKp^(tr)wT!2i~@!NQq^BN*KMBT z;KAs{3i#>*rgnX}VBuivZa#%PcycgvR?p)tIAvGi+? zRP^l_{9|~No}RAy7Ctx*+}S<9`jKJK)xv!sM&U`%w*)Rw6rG$DX<)6jD$~9IH&iMH zaJeA9^WURD1;b@LhBzP?ZahIiX(OSPeb@23q7OXmPyyG|XMwd784Ej&v2WoszssDQ z*u!-*7F&bp`ve0j96fZcQBur6vUYnH|1}psrL|AAzb@ft z@5ubhXp1+le#6P4BzFXHpPXpn^HlIge1W!IBIn-Ya|6V(`&8* zXqq~K75@2PhG_6x8v5)&6FG&fAXKuVrul(>M#qS&pCx#+VAK?7umxnkQCxuofR?e4 z5R>E-u6htg=SUinB#&5#uM*JQ++}7!Zwa2ZhlLSR7Q58`ITE58nndKSGR;<0)c=F& z`=Fz#xQJ+YUK>HaH=S+Lw|!OapJb%0o?#`tf7hGUmX6)yplHX_X@%hSvb9aNQFkcm z+*3w^u-B4!Wl(V1WX*B#e({wT7{+bPh1<7aPCxAI_5L7g?(3sOd#EczU%dNeF6lUJ zZcQpag{>Xm(w4+z-)X4UVV1vauOa6 zPS4*5CDmsoI4qVm-FjwE{)@w0NGS=E zF!hOJ7*9fLqOn4wfa*}_l6CW?a-*Pf2=AGoImdyw5~sMkfb*MunfL=;;sHsRkU_0P zhkYEk#9|a1irH_v$f7=93ZclsHlt@M=#UcFq>*p>6u02uVY`8yEBHuR*D$!LP-W4u z3FJTYsaZV}V^+t@#Omcme&ZNF+%Bk>F_$>iy4<}i=5#uQ;<4G9>-m;}iR#HUehsKu z5iHQX=l6^nD~7y+cL<^Wge+H3{jwU2m4{KQc6J@%-RIXh&g8zi`1^ht44J_TPY3qx zW^CS?hZ(9eMOKbmU0oe1am(}d6x~c){i~kE#p$W%^-ho+*zfOA%Px`V%5|sq6A(vyJg3h}pZ>#| zNz5F_*0#Alxl*RM=ax?FOeTpz@5t;CrSN>hG}a|g3hRK-Wqk5@SzJ{;UT&q+b$KdJ zwJp-MS3gJ}vc-9`n5r%^{-gTbEeS`hDs-n>UiGDJ`3b0JVP|KLl{g0OUx;e<9OWQg z*L~`uCq(Hog~XW719Q_%HMx9lKuNx?+xP8VXMqu5Pqg6TutmqojJlA+MW6phR?SmH zM00Gk(yUWW@U0+UKEWSAHn^&`WM-(7*5{AIoCS4)x5OJkY zlm^&hy?HyBCVe-VU;v5UYLEU_k_!DxvxNR-&fip$1JTIn>H?xTyTSsw^ScZGEz zf*wQxs<}I*u5|I@E1kYH*@(hXSB8PJY%5ukSm@o(;7#{6$qx?^z0G$WvHFE zk@RnDY+UW=?j|QE4;R`=cg~~JDY)Vm(v^i19=sb%)(ClhKh|(1*9*~k`zn>R2Cia; zSKQLl($&?~-Tm2r={(<77Z+n4x~);y;zcUgCUf^UvmeJz*G#UurU5vHzX(b134Ck+9bQibk{_veiwod@j&tWQ^xupFW=Lxa^S)cWNN_XQs1>BxOT zQEEw`!phO{7U<2+x71*hG$r{d*d2qC?BNui@P<^-e46x zE5<%F8%fYBxYlfrr*~F?ziU~vOCH}+4cq#bb(mL{7B1o5n@{GGAfhjcQ_vcW%`c5Y z5o&y10!wRY{XWml=4@hO;^u}`|8=1-Cx?hRXrCaiXm^Z9e|*I>scoIhJ>2A5W3}Dj zXZW~Wk7)1JyTUU&!-1FJ^=L9uuBBi4Vzyyt%QD@4sPWBx`-G=p#fp)OjST}@VQHy3 z;6~u#@e+8(KN=iyb#>Rsbh5QJn>h7!wwyd%%1!t^(wk(HM3^O|B ziF}HE-Vip`u$xbZdK@uqw<{jf`B{=tzrQhO&{{>Lahy}y7u?vh0y@l| zlw_>SF5DTEGHIkZoqHyA>KoWut=eN4F#?B=C})x~VCS^+&EwjulPk?Krp4|W>^vo+ zeU@5ORMhfiy3$V5KnO5Bd4GSO`I6d`qX=~4+e=LRGb=JRE6Zo>pNQAri7nghn{m;% z*u5q0Um;ywU|qbhFVlo3C8D8c$%;)%qCojGHa>1?X=$Hrs5Ue_%*;|QC~pM7*+&Q) ziV7k-N_I9jy(GCq2g0C2^H%$)HKy8^l_Goy=9t0O(~`@uHv`Oj5D}g4n&G`@ivO2= zT*V>%aV2=nCQmBb$jM%MOFSBAW(NsPEJb;mJk># zmLZGaQGhyxgTJ^Lx{b|z+YRw=UULVBy6Woc+FIljz*B@2RjnC(b@`$eLG#yZK|363 zvss|+FPIMp^Yp|uDenN#WvxvML4*4Hvur?M=Rt%phJ@-xU1nBY|E@ZipFk0n8+0wp z3u%YUGvdqw=qydqJe{~}l+hkoS;sx7ye2ASDjam$O59*ZC9BAOP4!dyHyUI@2hL*u9kM6x{sgj;mJp`}R3p@T^9>ehZcCJTLX%R3A!m+AOGyc*XsM_`B0>kW zwYLL`1*)T(?a@&mwJ@7^bvN8BBI1X5=Gld3}PEBe?;n>BF!rdfG@xHTfxY!vPws19{%@_XaVdx z#Hv^svLJSTeLcK>{6TG5((H|RJ4-Q^gUmXcl#$YW45C<^me}NNEUGH2&{EnEJzyzO z8S3cU0+;~w4UbW3Ls$pA7K_weaN(q5feDamsc{Koll;ToomW_Cc#Ja-Ooek$Fy2nC zKn4$)bqaYR3J^NWByJ48UXS5CZA#z(c^0-kq?yD$!Q*jkg&)_h>KuY)MH2kPj0Fq1 zbe&FAxl<|zseF&&B-QmcSxU0+2|797yT}R*;%L-(yZ25K{UW$vaZ|}N`s+NBctjQ# zS*1jOVI){e*ClxGE@HfFXe4L9=8*ky z2Z>{c*?e|HD@7nsSVbH6z@y>2ES9p2U5c7Q2wU5b?XmFdI7MmhE{79(G{ZmC&5E?b zwP+2!-yWy~jUUnkYZ>$GFaB?Q9kwVwWd}eQXZ_z|0c(q6A{vZqb$eS@=a6x$>;!4a zKY!HSxPo*r8XiHCdX?*4w+(eSewT98r51@Y69a!vV@guUcmC`fJHC?pz8hqk;-S_P zBRpnvIUn7%dQ-}lYOHi-BxkiaId8!X0@#}22rG=zM3PLYbj%$rMAvGws-(h8M!pDq0qT!6yCgZ%c_42Ey?yge7f&1m8B-vv5VBFTU}7? z_1z$v?hh%YNo&KfGG|+^3m&JtcxPNW8d^%_4z9|)=lfYyN(O2uQ|QZ(L7TPv`|I#A zN(LQz!o;WgplsW}-&xsdUp0jAvcKh2v8w)BwvTT|WR~OQ_inO3%tFOXjLuYLAWXfA zkb7N!i7e3=+`xFyxh^e%p8Vl-Vx{NdBI(SE6I^t`B0Yr*I0s7Y{MomG%`@bH`$7d(()U8t#3GuzSe z_VLhW|A>o9GGM2zgJ2{|EkTuK+APA~hmw<>BaQLiuj_&{Q6pmW-DF5z?J#bSOHb4O zuv=r^Nw3Iw^9N?kvp`SL(WK{FNgj%eyVOSQYNzPS+wS7qjrLR+rD?G?)2CAgyJ`hI zL7WGMijn`EriC)a*g%x4d4!2W0`pWcjE-xYx|UjwE7!Du7Oc-7bWYJF{ayxV+up?B zvRx5OQ0-_G8bcvO$M3bdld>BKP)+E6m@iBavVO>1XGCOmH3pv&i{LeE%JF!AByz1B6I?K4*rihN-dnWzsBV3GvuKDqPK?W_a$WU_74pe1N~V-KLCk zwwx>QiLzIl#pUR!*}&`Q6ICz^2)B~ z1ix1Xo~U5qbvtb`l1>BW3JwnjCev5g|5w>{2Q`6oaXmqZLO?iLlp-NW3lN%Ag+Nr$ z&_aRYKVX$=wXn6F;tN%{i64c|9|_}n|W_` zc6Z*q@_YMskp_4f^XIBtpXP%5L;k$~#>NPSfmE3cF}?cr<>d4RQNJ_CQQfq(WxzGN!F!e6(8H9yddK5JCudvkM`kqvS2weA zpUnl5c+j1{>6AVRb9A}&+OT`c8P z>}Dd+T$W`>$D6gE;*V01w)**RgA?dNqb z{3n4T+4>^3M6tPz4f~;6CHxH*@H5B2C3ga^Bl~KHMZcu`kj|Z5PCBE(W6*ZfZ^&O< zEqLwQ=UKKkgefcV2?#Gt1wjciBD_?!mL7yaECaMjV@X|_8?)>%=LtVmtM~`ki>Jfs z#!Vi{;N6PrdtUeh-TDO65v6{KeD$D>orA}^HGi*}n`CB(x&bfV?p8pyYlsS2aT=d!I+pBh#qrl1{i{V}2#Zy!E&{(j2y=)I{WkwDl1s?E zc+K=Rw9>EigfK1h)uMpy!-oiN*UBr*Pm^NMxVJs@tCw=H0>tR?kLvgB^)2QG_E|Pp zze;V%ERXk^7qE-vRp0W5j;Sg_W?Np)?29HWLvvS%j?@qBV%s2KBgNWU|FXHW70Jf~ zy~xO*kA#C&Z+}d4DZVx7wIs-68falQwYBey3JsM6j`y6K7*#xyN(Gh9x9sb8!sJd| z=$LF@_zU@uQd^O#sVV~n60$rv8lgoW4`v3hLZ1ZCGW%-`9z+u=`eK+f=| zBCfE=8&gVc!TPT7m$S+FwH+ngW$S*AT)lzB9N(KJ3j-kbRnDIgMB)W`;lZv9SMNbc0&+0&!UT}u@$=kCHP!aokr&z@Z+l&N(p(kISNd)h5K{PM1Gy#(X!JHQ9b6$@ z9WNUIO;6z-R(UO?Fh5&lyqOP^NA5%8rG#N2TWx|Fgb%|(mUFEo0c1!_TvB@s|2l+N zzPvD#oTTCi%T{*^2NpKRw=5PXOoipVx-}nb&=ESJqeLf!^+5wMlvii`IAU5iln!=lKn~zHP11GKjy+GT{M>w992EcO zvsYW~3oaUQba&A9#2AWl^ld%=nx%=~Fs@`tEPx#%g z0z~I|Ak+68lI0|Bd{~)d{`n}VgCXV_>@-5A)~=Laj9#s_xYV9R`r2c#3sjU}(y6?w zqQ!YK`pXKrg#^;Gotlm?B^khKLRiV9wjzefegP?CQPex1k$5^a%0r;|t z%ha7uD+eeubF>vO#%ePrBaaM~;PTaNzN@OnD;XxDY$=ZW+ui5KH{SRns}C)QiK)@t z7}{#k^V-AU38&ozUwQ;9XW+0=WxQ-&(0+^)eDb_8xKUhtwKj8<7J%2ghzFb+b8ZY` z*LqbO8GZL_bY|WFW6-MCF?T0mGQS!3E{c*%(5!|<+a@v4vHlU#!gOXIlzhb8tWiFq z=H`O4hDAx>6hS-W)7$rDBF`ve4WE&R3{ac-`&XdRmby!Z3nzGW;{T}Beqo=iQ>eEW z+J73{i3p*$60vEEc2~y=7btySfg*bcu=%-lA+#ST0Eu~#}Q318NXw|n2otHhc$(EcTzMT z!E7ee8x7+H1W@DR>8^#t`te%dy|PO;-=+Zw@THWe{Z-g()y>z{_ZrE}vjaK>24>PV zdY0k>z6PkIq3+gG3hGS6mLM9i2(Hl^$<0a&@=yjfR^3TC*O)2|UC`d^77am+VVElK zvPZRYMh^zsk5N2rcRh2_{Hh>P!HJ8{eERbW@-=)2~ii6s^QHbR?9R$7)+2^ zY9R$^J6>hW4@H z6|t}`i5+}jF8|TWdRP}oX0FTzL=|<_9qcs2!Y-R6=3B7ns4rWE7Y>&^v&oy^QUC+@ zG)=_Hq%NS96gjPNU>mr$F~NP*GMQ1m*2ze4hU?6l3P0epww>XZ@Br`w-dEc%OqyG;EoYI5j>gHFT2n6|kgtvs$>#3m=tW$UXfM zqW$KBp~?v2C?a6R@TCXL$hM6Y*#CtnsIg%y6sUN$tcet(MB(JjMz$!?WR(%+1uxO>W>rs7q{h-jNZb7Q{U7S6D$eAKgn8Y{e@NqI#m26GLGgt~ZvYD9lJdv^cj z*7~}Qon23*YEh5O4uZ0cpo}^{SjVUFrClAMQg8YDONfh8i0EG{KLc0DrctRpKp^`C z$M%Trx}2T@go}#{3WZ`9p&l69n9m2zhWv(?(&JMT0 zF~nG&P8OlF<|^&^s_Q%C1VCMeuOFyXkx;x*? z`@Wy&{qsG3KaOJu+pgF*K6#$!6``rFNQ6&|kA{Xu^jb+?8x0LZ6%7rY@c|C-jaQFy zHt-MKRa@~TTFC(YCh!5vT2@UK4XrGW;Kl+Q_>AYQWaNs5M%?!Ih2G_q{}v6+?fq+c zSzRyiZaS_PxdKz?_#lrk`B$Ds__GHOo_TCC8*0kRlYU_f4;+!j`gy(}>rIeV{ZLtn zxsi%lDkS8|3+Al#+x7Ih)~Af2Atn#H?)@^(YiFmYQ>Gi|Q;_|Ad(voMm7Y9`kbgWJ zpd9%6pLbuM5#WJhXUn1>jv zu+bssHhk!Jbwc`okN1BU68QJ{$t5Z?$95bJd-~t_(;_5gOa5@JiGlRsy4@B3GZ%rc z?EgEPJGuW)1OE-_Flz`Y?$T(Heu87%Zb`>CXf3`xr!bo0e~oW2`{$IoN@y0h%RCjn zJ^0f^IDNC03s}v5yNqiWw}q8YDbh>O9S+Lb&^({8oMbDsPDVUUYsj0cZhvFtwm))r z7rW*^)Z4UYEDswujNq~RHM4ZRjT+wvPUjNQ;{Q~+@A9+JpS0EuVVP(}MOc=_i0VPi zcCe$J53qQ0^K)lMPshj!r%^#|haBd}gxrdbWuM`qm3uM9I2v_n_#R4o57_Xxv&xNu zWyFq#FrMt1?H3zQ%cg{Vw`k3oAjER#HOsa~VxxGOl|1P(Q9<>w7Lx^U+w%pvbDvWp zqheJsDX}^&x6se+ZzF0<0gJJJW5aDlCH0TZmC|%daP}!Kf ziHadB(54DaX8{13^rkq{}%0|D2Eny9!$G7S7KEUt!`2O?vMX$4(K$`3)YOL z6Z`M!85l4!e5mi3(32*qYj}WtMXvjD{k}Q2Y9a6|!W`!K+K9ItyT0$}q(~Zh(a^U< z2`05d!11U)zWg|@f1cjaSZLLbX06jc`$KhO26-YwWEJR1}}_hJm?z~!s~4ak;6fdrC2B{q&jyjdA2M8f09 zw3epDJZUBs8R%ei`Bl}OkiqRubKS=tVe&1;mAf-owB<*rq~a70fBx-@O?)T}AN0;_ z0u44@ZvEH&L|xaTIi8#YF2|t?1<3|v$^=M9l5+$fqXxIvB*xczx1#yGkw_*DncIp` zHseHe)p80DHr(`FlPd9I;(ePNNF1;ERthiEe*uSxRz$9M-yab!7Pa`1jRFiOEvrZu z-QO(@wCrF&8x_Y^-Esewa5i62A512Ly~{{dV!6==`7i=Y7bi*089!$zo0-N8@@4=z z_t;nLk5eJtZm}Ke&nHkjk#dd?H1D4SE62wW;NH)>u>Es+Ah=o_oB=25Ps@BNP*N_A ztS6!=I68S5$T2u~;&N(yBW^3X6)^Ik1>T37J(%5ESZcK;?$c;*lRC?HK5LLDqLe%M zZm;}aZ?TQC_+Z5e^WjHa8dPipM9GGGn_SO8IbWrQ?+A_caQs&Td@z58uu4tf08qR%akKOeRPqfVRkbWfCetq zp}J)s7?M&iL5*tu8d7;?aH=PGU-f*;Z{|TFyg5jb(T{Ln$N{|zigm%MWX@}oEX%4{ z^8xSTVYV)vEyrNrI#XCg;jWwM{p)RE@5|hrnvVJTTYXT2=~gth~y!w z3+f`VEdr+TgVe4yp|^Y_1WR)sjj1wM(JA3p)}<{vx19@|_J8`Yp%tCrwgiZ;%4Ggi zo18%;!e`F@$ioo(#I3cBp1c3a|Lg&dI~$ZMI>-$P^`g&M3+|Bc2h? zvjpkUSP?g;ksRlr9F=T_FdU3Z#^UytP8|DGTjXf2q@OQ#Fmh8c=C=BdyRT&Xt9LFn z@n^U&9M)Nhp0_=)s=HaO+{~VEp?29w>v*Quls%BV4b9+tYxC0~1E;@c4`vrDeD?L7 zK#$XE+i6Oiu|EhEs77htlk$-cI#Xfu30Ur>xms5*Wz#+$9v+y`CN0Putuux$tjwy* zR$6?=@1cD`-3tp~l+W&W_;c0o zf;QjO?<*(4qqFe#msJ^D1!f8kNL&H60Gu4 z0|%r=5p$VKk*ib;=xXbCoP&6Kn5!?e{i{Cu?RqXES*pU&r<@83ejB6UxNeAw8 zX@da4yY@RB)Y9t1!*mTV^8tGe%j5doCMT+}xX zbGr5i(&!?U8EaA>&p5AQGh<(wRd(c=`F}br+*!;W@ldXdmZ2)qoYcql9oym})O@#8 zX0bm4eOIVe-h%6O*YWZKu0leX-e`CZx~*Mg>YJ<6NRA13qUUC(8p#{+DaKoy}>i>DeA_3|@* z%kZ!kZ}a`#^~F*c(}|~Cv2k@LYn){8-R(82s3>(tMg}cd`f4MGPR^EyRuB=dAss== z`ifalP*-Dvt=;$bbkbYu9kD9?6_*(be1{mq_;%QZzBgrFKaS^ZU9ew1?Bup|8A z+@nWPii|#lWD}0V_mSxX@J@wsksHUU#G#*@GrQ~>Ijwf%!&iBk!%jy}5)6=L0rk=* zJSO8YJ?FPLOJ(dCh_K=&-Nak@hS3`A$ozoK=Mrx6jiG9XVKXq3%E^OQw>X?}Tvtq| zj}@sJELq$MN5pHwUp^Jo`mvV9>28hfmek|doZ5&U1(ZMf&&(~Ig8rtMd5UND zClayN1Woya$^AiDv^*w|+uxq@iPNvqbx5&Q<;cGr%n4Sx>l4)`i)Shuz=MVHn^?!| z7}?A}>TG^&gn*M&(d#^a@11xuhgYWRcoa{T%-`YjL@j%IxLstNx)9Po@)E0mcq6M-=UTQ|a9kli|yo zqQFfxjQFc2_N%lR6cxy2UbxZme$zGoO}Q{<0~oXMF5^e@PN+FN`9I z7(|`XH1csmrlkrZ58`@_S-b;;oe@rhozCZ}8Dhufvi-(QYcIP@fNz@DCx zbRn5O6HrZLk{{CuypO(f{4+gG6DM+4`FTxj%3O*%>js?hAf2%|Smu+vvD4ajz2j?F={OI>ql|Bz*IX=vIUOnM(5;)%GZup zUxM99+|^4CPZYYYM|AiDn^)6ubNqSwl&yJra^(|V+eDb$=GV% zAM5uyW$HlY^-ngw34z`oQXQVS4lX70#k)7PQI(9j+<|TKRt{#SKEAx=gRE**Iwr=B z8nsXdMcC}cN|*k~rWNw0_ya)ZK9Pxwcv1wVYba|~}Z7?eCFoSPeqD{|v92hw_c z)29JnuK|-Cj^%>|TqfTiVe3$~upz?nQZqA>JeuVYCk!1Wr3a75$b`_mA&`^_Sk#(z z+H>QojWrGF%T+VylYSB8MpnwPM=7O19AsX!7H#Jzpp^_L((LM$h_y4Pi1U8RF9{mg}&bvFXBR;!L>_F za)e_GlxJR#8#%(i7J&CneTORzyqyBC7(BR`y{~FfeAcA`I~wgPE~g}yy(NvqR%6Hw zNqfP%f>(P1_t#ARnbKwk7ypDdspkYA(NvRF5f!@VWIn3gxqg$yKO#^uQQ{LHl9LE_|#gCP~I^*m=m|tvHCUSPuSm@QVhU zPrj?qw|Pd%0))jd3rV6GR@LV&+aFFRr=C|PtC(h;9N}I~Ln>3G5K5jc4Yb}~*XtGD zrWT*)Z?=7L``#3>bZR9gq9jMzPsV)rSu3szW{J$b<(Gi-2%-J6H!cSmDd% z2KRNO1d7=jA_p`ZB;+cZ4!jQOGg|=Tr6F`1G zSEg=A4s$qoUrMwvboH0*7d$h2@|ipF7X~LG`RT({nv2sYkTp`P$eE;NMMFB5b6fbs z$R4iX&AN}Ew&Qq##QLu1=&Uj4`K@E?zzvxgF6^mAw|C8`_RM8VY>y=FC6%MooR}1r zUbBnJJnNR1Fp+|CQ*cmu@|NpZ_@L`M#WBcyo0#(eKM}5^Oz$)ERWUYnWG2F1vimNJYnC~xNJqe)gkrDsgqqBdS~8KUK(>x{bB{2LPc)sq-X`5ihaVb zxTXs7U#$O_!QI1MIk+i3c44j9nbMPcjmpZ=GBu?OkxZ)3uN#0l&XXvfx;7nrBvqZO zpewy&OW72IrhA^y`pY*(urh)z2nTRlz(zc;E8koauk#NHMa{YjayNNoNT zEE2WWG}s^Nyaxasme{KF3uS-%!vLp@Pe79FcKv*Sc-1s{LE}}Xq~)g$+Ia^QP?SYu zQk;@qUJC~|%eCFLVm^Z=Lk9-}K2UIR$>1g{K7AUw=;7Qd#3_UKxI%)obg(1HHQA~- z;6V~2LAwm2tl`eir@Tzwa3pMCbP|EItKNLQY5aJgb?wa+WZ{wiznn5h zvut@P*~>IJZteX-+Tf&Jt11I3FDpk7ba*xU9s?F}cJ0Qy&y@)O(HmZNCBAaUPr?}Q zpoKaZ6BxAI$QG*OrcYXN0mja^qmPi^xOV6<(ai_TIkowwt07KIkuBm#Hl(|J|GCUW zSD4EO{{WyPJv7Q=yz(M3u6UD}#d+3lHoR@rIb66q8pI)~m1pOFbM(n{?2`XgAcu7i zk@>PF1?u1+C^4!1^{{Uf>FK;Da;>Ej?{*a-WEnV#uoSbm!|mHJDy) zj;lB+x>$;#g!p(+D(^B*)M{A2lu<>xChM1ii&^>_6r<%LW$tgvZ8%Ib{mxPt@%!Qc zc(K6@fJ@H`dJJ!znDi+wZJRYE&n;OR!1sRKZfA%+0fWW-SQ23TE`BST&F9l=+Bn9j zPRIq43Ga{I+i#0psu~;^=PbLgSWH|PwB)0xxGT$( z?`mFZLEJXr!6TA-m!T2o!dY=K4PoHex#`r>{Juh9; z_G*_Py}OXT5lO{V_l+VSxTw9z@PcgSak2Qh?wZQysNjeNGVATEO$so(pf4e~=1te; zL6_nyY8WTN}deKZ3sXducYCp&4X{?vi1dq&FY?Cf`2W)<1#l$gX4}J zGE>KzScCou_h{jv3JL0qEL)1^~b%=C#Z9QR-B@l=vkHX2~s-2eWMZ!0w>37 zP3t}i`CjdwPx+j2o^eqA(p|rv#~mw6cgIBtnxV(%1e2=RAk`!aj+Z72TuYLw*I+jF_Cofpw>FjfH&Pzjc69D`}v-#1RMnMt-lj58n{k@GeXuc zseZMJJR+;wQH(fBJm{X>buZOUeB&;dKxEdWWv19yjqK~#s`Jv5T@bk%e6dDb=|(bw zb?xV@jn*z|diOnWCR4D*qSBrzv8Y!F+%iR)7@A|d-@G$zFo=Z1W*)&hewUpW#A9?= z<2MD`R@$yqdhajg@Xlu2?s`x8U-1)jqRr5M{ZXoM*6KHE9oV$D;4u8gELCyLGs)%8 zH=#PoM7s(7*@^KXA@6w)znu#@LgOacL4~=jz=%n{-an^1?la^`KTEBStrD2}vf8vT zRK;{0(a4;-n@wH7@qE^QZYZ9tTaxr=2HX`iBRL0lBRyN+QTFym%-rW1tI>)i7fasG zqQROeK!;`{>Ut58&wUhw;XlU*)pbskWp@_D!MaBJQFIWN?4Xtp(Rqj#SvAr_CZ zxSz79`$TtE;BBL~$T5|v+~GKWVE;fOY8=itlgkN$^=j}4_*P#j4z4la*<5t-;v1`* zj`XVfl-f3=EDWuAKwYPBuXWeDE>e0q)T=*hh)?3UeRZ`M$K!Ow+u6L9}{;8V-tkwx$piM$W7mpe3xdrbyKF} z+%(2TNH8weI3y$=@UhQPPd0nkv1>~z2s*CbY0v_u*pWQ=U96RprryA{k*-^Bj_?INBMOU3BWx`0g>t66`GA(Vj;df0%_Z| z4f6@1kh+_J6X+gzT=e~bPTH`&X5QLEC=RFjcc9`5wBy*V-`&N+$*{tw{-A=woIIAy zz4XfyXPg_5Bp$3zw`Gd)T0a!%5*m2jDKaohxUJ{w=o8q;i@zM1ScoQp{m|q+jc4jO zFX6V3yL3;}StyT4GUWL#f9WSf;c~l<5h07!?h}SFCJHNtw(|n3k1tHQe8$eW%NN*3 zJ+8!cA%|~fa;i`t*X_Q%r%zHzj@j<3x;OaV(}x@>>*Za@J40z;tBztrf0s7kz>=OD zzZbi_1nPouxp&zOU(r=_$U(bWRHKytaD?W<&N_Q&(D$6?mN_3d91e?je=xsAjGSJT z)Vga?{W85JPFdN}z^sc+4N5lS$Vsm5b{QZ8+G(D@?X(ccg-7%4lYOI_O3}D*jbX~Q z7(#Q}fmo$lZ(h~rb5+P2KRRuWjt%42h=@#JT)-RQS zOup6q)?O>7@t^yK3LxI=CGRw3C+V^J6^fq04;NZQDJPKjhhlbjHIop54(<3N?q=cR>DYBB2 zNadg5i9CCCWqK=?#8OKSh!*7kQqr-Mvkk**nh(So9!5E|nG%Qo7*{tVM8->**A)fY ze8GSXdR}h+M`Yg_jUV<`d07mwXaIdKK&`uRJjE_)x`URx5U|~sQ|jo4cT`zq43RSJM$W)XUDo%d6&p4oEzGdd?IM;R3GtPk%BW_5V_p0Oy)E`!k@U zql?)8k&JHg*!@mSf{)+xFe4%1XPek?ucRbDzjj!rm@Au{my%LAG0NwAUz?3wO56VX z1xe|I)$~2%H3kZb+%~7g^IVl={*cj7{xFq=Zz6sG1_JaxjcTpe*3o@sd%#QW>8{c6o%y7=d#czF}@5GR{? znc3zo!GCFIVI;T@(~g@?*qiqO@A}ffz<{_fAgQ5g6#*EGHUE9UoXO#Wc(%N zMAMm$g_Vqt)X$5L767=9xLI%E#@dom9a##|xlcUbnJyOy0p8cw)NC9WuQdkT-w`fd zia9O3PZyJ{K6-DZG|vT5R8-t{ukP^yuxFZ9V9L8YJ8l=nN5sU$0}s`8JSFy9KND=r zXhU*wRWl*kP$-n{#p8cvMhQA)1|5Yj@s*2BPpNTzUgU7`;^qSw_$GY%Jh^nYTwmK+Z}y7WR_xIKU&HQjoqMFext6^ zvTSMwT#sY1J;}1>R!Ub{bM~`LZXU|0VpO34X}vdv}oB|wm6 z==p(J-R!I#TYg!xwcYa2Z;K%O<<3)2J$AyECUYs=K@q%m4^9t5jqjV#n1232wJ6Ak zcUanqv!D;FP_9g!6ezuJCU?~XnwQ|bygZxks~#QmD*)ZoZ1RNwKf=WTUH-MV_`>ux z8!J6(L_M-&`FgB798sWaV9Ndw>P9sZ5RPygnI&+%^{>ZMSy}?t_`9?#&Ttgf(nbY` zJ~~^ff6)u|{ci$+HpOsy4bzW$_aHeJ;awoYG->pMVbC!vF-$hhq*h??WkL*0rGYkC z7;M`oAYf}?0O*XR5J}GWe7-4~rM40mm-*@&!N9WUqtW1Y;dR$7&&KEnCUSx$oMyV_ z_C+e4c$GZb*WV)JvuRaBpXOp)E3x9WcuS4)lTghj4Z@Mqoa09K5s`yDAevv~w4A^K zZ`O#)^ZsT8>E&y-c$mff{xJObc717wlNBUZ*z+ysZQ#_av@h#%y4WvJWBYaI8*jKx zWrzx^`-03?{ZEYxJGEqo553q$>zvwo^7NdYO-YasaMP4ewTUbQd7g<{(!RC{67}oA z<+(E^P1z}_vRbhf(>QE&m_XMmP@l$yHTgNVj&#TWvu1v@!vs`HBs$<8dT2I}7za1YE{MP*KZ{uZ0cTfKv`;NV&QZ{15{vfW<@PFA75^6zwt9Lzo7@ z1PHoHc-AF~iS_Z`vqy_jD|lgL^EP6ZJoSa0JQ#jB9zYkWN9sO7(UM1k=s+^Yzb9!^ z;cX67*6U@FY{5=`h~EtL^UBhco!T|dPtthPr{lYy>i$9=ZY3PlEy3`2Q2r)=2bHJJ z;vIAvXww-@V_5G|{I7-DP889AA!`(Xg#yBn$2?+ioN?Skn+!|31IYLRq-&?MElx7J zIE=E;OhW&*X+gB`#n$8Chd`3oS{$|3WFK?Tl#?BDdBTcDH73rCAH+xO1xJu=ob-y= zifN;dg2{QbA9xTSe~o+?1&Q4ED<^)S;XdU4@+@%E09&P~PcHC_IpFnbUGl8ncP54C zI$$8)Z4T^xQ^AEDs1S?h&<@uKdX^E11~soeCDAQ^j_~NG}wYP z%seS(1FcG#bRMn}up>{OnU-LIdB6`wsbUdEUfa$k%|8*SNm&L8P-Bqmj%mnj%&yLO z-8+wX&BaZ2(u7|csfY>}q=`vLKxjjImDL1#7Ke{2BEk6@agvGw_--%;P-F-(&_rxN zT%E_1NlLhNV1(aAoE+c${##Lm64C?%ywvw3N3(SV`S&^k7jwDo$5o`6+D$(epYc!Q zHFJPC4|d}7^-9GXTB|re9O+YiZ^nQzQGoOenAZyY?{h?|8Xw3M%?e-+Qu$J%TYIpA zEaLE>?+XO|_*Yr~Ssk_Mlz&zS^y074kdlUH*h!gxt6$}Q#tPbPx1raGDJq`|rFXr3 zFn}ORCVhZB*v&U>7Vpu27V+yC*BM)OLuvz;NcHuODHaQtA6*HZR3mRBWdI(YjpISY zd`XZ^TT_aX{;xzarZNYpJEA**K@1bdjIA1k55>^^{7qVD-l4Ry{0)zzi63)H{qulte@4dr!&{1#bYV({k!_#SFP#JF7eFlQzCaA0?RDk~DCj`q4HJ@!+~8JlN6 z;r_BJupkbDO@GzjKd`hEFkhHPhAu*|*A|g52_&4l`1(~sbMcHi8a~l{+U8qJI_F@F z6wILB!*9W9-b@VVYSXlzXBgpz z{G0;XrH;#KEZFn}CJZR$7~4XL1fCn2LGV?dzo{51pDE|Ugig@kFtilVk$%1nuW2%{ z$Bb2WebHXoX!vVWSftxr#beOcv2KU#f72_+_%~=0{+k7cY zTaukaaNrYcWf%D2+c(3U#b2Uk`CPOD2rug6BhN9f3TsY6F?Aj$du*6pM(wKs9V5;nfypjb*$KM-*js}$NxlsWlhHNRR&gX>Yfp7;RG z@ATi;6LzA5n2sz#|&=0{qH6T8yXU#n|CB~-lm<)Qpw1tX~2^dn^gv8uHo2pd-N z3d;lD=~O?3!;k@!wjtPVw`?Pw`W%>`2PE~|{bY)|yuX_*7fbuk9n!wsXB&a~ zRxfI>n{?N`P#;jN<6*E3nRBXKn2YYkjmEjabS&ANJxCPJfVn4Ck)mX9vENWYkKO=# z@9B|jA`ZID<&k|RywrY5WLb70Ewqh>Oy~eQTr)@gb$hRlT5EUJQbzZdrzqA<^S2gK z=^xuU7=rmrMXF0l^kZmL4?gbtU|W2g zOsH$@^=O#Ra|hOe0DaVp6QD@LWQ#R)S>-Hs8${FbHF>PRcTZ$DCt($TUOKfgZv5|h z{^~3)hm&0`tNMN`0m{`)#A-aTYDw3K-%h@$NI#A?!-@!(UVAcAK!Wto_w?2zoKCQP zEt=)VldmvCccAW}uX!(a>Z+ZF)0S+hhFv$;|(lRvLVF;C!qBQqMdMqMIp+;Gh!eZPpw{Fq)Pj96j&9BI(}Y513Sn|~`-h5ZoPq!=!z zA-YcSn@t2c4SL??u^=d&l{sBB_O{$QOS?dOO2RcXv{0cfbU7xHLNnLiD1qY*xv9)O zy}<>Y59G0JRHM3GL1fz?{!^7~-|k1Eh)b;ySl>1CfRvAqF$EOtcdF-mI&Scv^Epwh z$BVgUZ%>x4jO41+cpX0GF{xqx+kKVun5QG^Sh(iVU|@V`bWa*lx#;=se%J(4LtLo) z)#; zv_Ca0nF3U1J>;{7FL}3-b5X9tF4d5}tPg zK@P|!sjeJ-v9Et0^!W{$$AU46aJinn4R=N2zbT=Y49wfDa5wXz@N2$g zYwUX6G91Dvb@09;5+6FY|HA9^tW~BhG#8T$MaO}5RWo6X51qltVt27$!jLrnfrc-6 z`NZGhSWleZMWXdvn8X~plHcVLE^We=Zeb)U)1UUX=~f?8d*jO8`*O9;eUq%$G>%0* zXl|7A`FTgw2+GK4hU75an8DZ%Lx&H0n21hT@ZXd=$G7(bcs^+@mme)&E2X@Q0@Z{k z*(AMj2(k0kEoaLXb{at}SNj@?|MG%ZDwmpRHu_$sHh;!|t;yl!yh-7&DKU>SKRx_A zTuyUs#2UX-3C^#<1wX3NWUers+3H-GxXmdotP*exRfZo!*t+DOB+6ku`jFzI`Xt_KYcf3|m()Rv#~=nx3bEaM+V^FrMYO$@ZDBe6xJ=A0 z+es%`B8`sCILWN#)=O=)LYl^vcv8ld!Sfqh)MF(KBNxufmAhsP5|$lbTD)s`E;83P zMzY1UJ$A<$T5O@V0Jq~BT_OwzC7_|&zs5KpY7_*GU+~CgZqn&iu2SL zxZ%BsF8%TP9PHA_=%KUz)0y~^FKzbGw-nxfWTu?UJ!i70L9zenh6_+R9~?NhcXobH zDk_!4hNS`7npm~`ey)hKTmDI>$t&Nt@P7~=@x`AS#6jKpebbte`z4nW)XY{kejfIL zzy3awWrf{0Y;_N`FNx2MDFNBxe<8#7HKSQlvL6lNZ5Y`?geaLiUS6BdU#!b^0==v8 z5yDfQGbY%hRRO>ued}!yNpZjSa0BeAXyTffbB9*=UxRsc9 zyFjw$Sq`U-(~3rmP9N4z*+HdkSnAyG^n#$ll-Qa{%WFwFab}2V>W$l}x)xGb*z>mE z*xRRfu9?pr;wyQfh&bnNt3-do4$r|GzfW_37*eWkzNqhf2f+I$PO?6QGYa(BBHBs0 zVom;m&FkDYgU>HpJM6dFKxN;erBZ@7z7Q|_x$V#4j++$+T^w-XXOG0qcX<6U z+h_5rLkJv5Q3hRv7m7-CYiDUWk%PWtx{2x2vpLlJXwCHkG5)~4a^|UT>ALpBvmw=gk_)pDd-@Z!{;}oTd zm6&_D<9^l2M~;*NdJ;*>QUKD$WjpN(LR9z|)Iquu{{kT-qK~~#%=9r~0I+Y>oAmtO z>ZAa2y#CCzt^(M5eoQvK*BO?WlnLBTM45VDetS#{OWqu`iT)nckR25oUo>e?IVj9G zzBaw({`S;$l7l&zSR=e9)SysbaaLGnxz#3rZ9AN#KJpLZEjBTStwg2Y0XD-xMeTrO zv(g&$3pqBAjrVP${9UE;BhPSSj$PD`mBK_U0$G$rlMKdQlSF)uqTQywa01So zlWs0&88-|KDLu4alvAtN_z#KwF?pDFS*4A#mzbm2*cq(5I@@e7e-o1& zOW=kT0}lm4Y+m3u1ZpCm>>&3_Mr87mb3W-TdNX73a5^2kvZyB_J6ImvUnB3$t9#HV z2VQo`xZgZ_#2UB)w*KW)PN07AB>$C&p9G9z)rHolntpVXog-iD_au|bdQn&8=hRco zM{*6ze0E3LlE)|IP^ot*kv`9Lgk#`cV;GBC3od%L@3iv9!llTV&XN!^KWBv}qmdX7 zJ{+fKz8t`fL$nnT!e5%uRqu|J0|ec#(yO;}WE)8+hD=5^SNxt}Fg0A`aVC{!x5^B; z$b1;mL^mqpL{c>5R&CBZ1oBvG%hTSaIE5)PLUiS5mmY)BnS8o%&KL^L`==)J5m8&m z^gW3M`Nsr$ny%6~;*y-tuvs#!HM0#l8V5T)=B)Qf;uJpi2}LssW0xjy=Zx|iH3){1 zP)8Npk!)DCgX{3uI9E&)t4dW8q?4LGm;#qM`|B#VatwzbU2I-6+A@u1<#*>54{fYa zUKC9mc;z`_N*=by!}|g(<}w8|E04CfYQ{zZcBbbeQM!n~fJ;)WwtHZvj(7SO2lHjR zlS>|c|Hux@Z3q%9A4d;7RUE1p7!gPDVL1Eqzhwlil((Sxad*+QzBs6#)&dvVmPdj0 zq_FcK?Ls)6npl-qii)?P_)#1sSPJ)sB)$B;A5m_%$dMcZ8uHwAevd_mAcR# z(=#;fuA5c&F-^@AyYrx$B&;HEgBrcjS|S3Tw0+okS)?HFLg0p8_nxt zmg4rhy3ivM4tcmPQG=xZ39mZLmwN!_F~ORhl;BXR|88NHa<|Z5g5TP+S*t>J_dN#s zLxuC^dnl9`c~^vT?MSbI)6VOLTxJ-UpWwr88ecG^ib|eMtr&{BKIiGg2r9{2`pv6^ zDziT3BlkXhx>F?)sdOI&pR<9Ad$53?89u=EyxRE4u&|rFKp+IEl}^g^AEU?4@P6Zz znmv*#;*huyHwkYn$odL#vq#D?G>_ELt4{iwwO4zDz%hM^JJ!*l{x}z7Hu~!~G%QeHr~Q^^1duo<2OcZwxP6B`QB3t zjlm)0{e-i2l^X<`Ek}s3Bh*B$nD&$$LD-pywU~K%=5-X2M^1ggwWy?{iCtt|M>i;C z@UV#|Z_x!rKPY`nug^0FA0^VeG?B!=4oE>Gp@Vw5m=^6U%2sro*;v7}vN za2ypyMcVN8gU47onwiISig|LgC0?a>UE+;2E6E#-v>30TPMxkxA(KX?Rm|01H%G@z zUPs+|2c6rMiwz=5sB+g8Eg~VG-TANdnA|Ciq#cn72$#Vp*p7T&TiqBNV@p(t9`HTC zNMbpB5x|57{?26fxT>Dm^Bj%K)N;VaXV zO=;?6z0?Y?2^=CS|AD-Rdp@$V2t9j!8w$T#YDp3W^Vyj;+E*s$nJ+@jA_uOcgM-1Q zxF5`w_0fJicfM)3XjOUeQ7Q+q8yri<;7mhoEGeY4tCLyAVxW~}LeZCTLLyu$9_YF4 zAI|C%toeVMJI|=5qOZ*>AVuj#=~bGjAT|MSj=`7mqEn(^aRZ*ES`J?Gia-uriI^|UqwpmASp z9%=q{uM`ww=UVGsh9#VSxuJ9 zp3y*8F`8LuJ=jHfFyO+*zCO04nFhoJBTWiwk_8G6qIV}lN9r_pm($| z-9Et;hv7x;n;j99Qq%6eHD}%8vy>(qsjYfvJ=FSeR!6UzF%K+$&_5m<)KFwalQo}E zHyILAQ2BYR=~p+&D373GuIg1oT}l7#+(7AO599f%NO-5xY{(|BN_ z$JutZ%h|7BE_GRrHwTGPEK<$P`dyB_eaz%ieK%wq8X%S)ym&0&Z&Sim2%PV)V(R0T z4l68!Df4&ujh!H_T$1Ncp4aVo=C@xGOtGIYLyzh4`OnLS!EFpTwdObVd$H$#%)_^T zoErtcrOGx7F7-JqxUp>YnkkJRq|w&w%aeB}Y|A8TWT(lFb-M4urPbvuAS$cP0Qn?s zOjO6#UbH3R+@OLHnn7pN%FJ*wQuw%A^qCnh<@>UeS9+M|Qs@&xpZUM`e%8<=KhhX} z>8sB3F+zdTnD$a35_dxB2HedFkCXd-&Lgg{OQ65%hFfcor(>S- z9%In0)z4d97C^q&KW2sO#Bs9wXUX{c?D9*o|Wx-`+I9J}{-j zx0GFMrt=X~_MyGYj;%|}{-3#zU+neJ|2pwg=9tBKqQ8Jcf9*%7eB-~?mAtAQ=``7f z)%UOI@s*k{i6o2fagf_*==(V3Sl;}5p zPdW^qcjnSnO}%=BfbAe-zS_IFe6RauF(QG|+1Hx}y8mFuJ&ca_qOW~eeVR7?MB*6d z^q(z-7$5vBMdz8!HUc2pw$I6t`@9r|JVfC#&V`!r({?E|yi1W@*Q=l->Z8~VIo zzTSJ&=PpGq&Ij^E<&MIOYs8H_>monLtex@W z0{gNA6(2O_$Y-^|KfGcI*0BmF)@RZ)YErA02Qr=gCj&EepIZmtx5(7*Y!|xeerhq0 z>qM?wz0-}l%O7&b?Pv86$1c)bfcIUY5>Uw_#VuEaoRdmp@AB4ZZFcSY&?*S|O@A3R z;JCr3?3JBwj6K_wPbbCUBJtEi`Got+rHNX+x4$^_{Mev0W<)+2UXQCrbA7=hSi=%XY{<17ftV+O&6#kF^rKDjozGn_d|&U5d}%&r z^Tj1WV0i6umBXj81dK`uQFr=@e`=A%UL;u8K6svfw<7MaH8{25wCMBs_p!ig)UHiv zt^;<+VRp(0yHx+nfYg`&n7zB{ekyxT zOonfiC5L-cbAw+^q@$3jNu&?YDqK_awNnzOU7m1U9p}ShR6D@parzooZW0N%ZiWrS zEUR%Q2qt?)F4y{dS$tNj-^@Q=MI9{uC-tqPI!A}=>wvfYpXl)CHB~)2oWs;kGmEwq3><;R3oN_83c*!%}Mpwq(NKL^o z7Z_b+v6I(aU^V!EZO)~4f*-MKlB5=aO=U+Nsp)$B!kc=H@a~iNXwv7~G`wS+g~-{? z(~a{NC+oZ^QI!(5cPfPc?Pf~(WoKj@Hs9UpT3l72v@I(z6y7Y7q30lc5z~2iiw{J{RJZ#jPvQU7cHgfC;u zEZsZVS&Oq@DwT$D^5TK5RlhzK#hj9!1T~mIYf9YcG)BqV^4((?32n+|v?too0MBpd zfhkS#d6cXNl$Et}27Fmf+v6wb8*xQ-jZx{N9v=s!zeCC4_Gq4xs+#+;fuE)M6nel1 z)Bw)VfrXkF6LSKz_c(%lc}`A_kfbC_RT*DBx}{adYtp{$Rk`Lt!c)d+#nVc>*v*!Y zXj57EBO^NM31-F7T<)H{SxnQU>axV3K??m|w$3xp&5yGW+MqQ6eR6;J%VB}i!Hhsh z))?cS*)6a7AU~v@upCVwm(TUTXSB6q=4Z*BkI2`|v|sWuyw4f$5649!Y0%)w`+swB zMjFFl<(^Z~Q@hw-u3Izg{vKDD&qeVZ5~w|1kn7gV0rtxE|85_ zkZ3Fq*z`=QsaNg>ElS0{OV;G%*7SZdp!fM98?M8oFKOxd!;$impxfyO*Sgcb-zlwZBR^w0+fQEeFH`V zR@Q^cVJD>}K<1k9uxLR5G7VRQsCz4%hKlMgZJiBitimggF}d1($dIu7=FMropfVC6 zwAgj6U*h3FVUt4wGy)V8A4wFu(Zlp{($~vtFkaX^1?iPC`Sk)*UJ7GxEAJwKkejAF zVz!d&_EKp{yNx%fjsSK1{$j5!wR1&=sk0MqfRe%4;3{605x*rMMBSN~5-bRTzlS~t zhl5gFo-!*?UrcCEb)wCC2TF-y_~socG@R6L4a%Vhs`GB7u4TaMwpUuY8VXX%+H1MP zJ$-zd)1in}woC7J{;tnEV#E#7`*8V@?U)KZSPdLfmWN7*LtG`i%Fq4!Ju~wbBf6BT z_(FNa4_CThS^ax)u@GGI9=<--%$r~_6*$=#MUPuYjDZ^Pc4qQGf^X2C=WAT{eYn40 zL8DxO6dxPg*9y;4rTIr5MBMlfmQTXqi6r2#j0gQa2M_}yz+eVwK(s?J8N4D4x0W<` z;tbxunZ9?4wIX3&DWJ@gTwGrI(31)tV)=|*!E&e4TN2c5=hxYkdtBbHNH2j5=YC_; zO*-2>PPzhWF+lya=HBiO?9ZGj$T5Iem3$AU;a{{XjUmTQ=p7Wb!?0U_=8;mj3McyB z86SK~(@#a^5LLV0`o1!E8_P;>Isn)BZ+}CoCxhGGzLnU2sHRDmR9-t${VG7Z;3k`5 zA|oRK=}=jI&yGk}MzG7*HOm@~Vq z+^TX;idzcf2278jd&iG9-&9>>!#88GnAX-4YHDgqN1AVLTci}(04h@VY*SOy>?uS~ z{@rs;c@^=UQTP+kO$q>$kpgQ%Z41jUx>V|1P$_J>*L&Ad42-pt;;-G^UB9K8^nAkug7(oZG!$6`(_X^4|zug!;B1Mup&t|>hT$^UsjQ4j-gr}7hz|+H6)GQYPV5P7AuC#GbP@tYc3+sa<#(6d5>!#pl&nm@548asA2A5xpU196>%G77lS~C zbWJZ_&|pwr29(C@`X-dNf&x{iPM0t`@($Q<=&`xtIQl`ecw)Fk`7Aa|RBiYqY0x4VrAy+SX$V@t!L{b%*oSA#&*gmZs;Yp2Jk5J1Uf+5t1B1=Hn+Cs zRBxAD2xyAtkT7}6j7Fp7FUdf?8&nqjQX;P4HHMNZ#mL`y2h4*?dxvmg@()Kr%VR;& z3mUX!;461kNo{h2RlY@T#Xn`(BnID>xelKM-7!BjjKLDuJ1oa|`GXxM0;T8*3I_8d z7e}k+KLL~on_h+*-=n#{uTr3yy9{LJ|E@399fgF2c4zC5A%zk)wW{3m_cKYNkYZwn zyff>AzPC?2r@qhr233u|HRpt$Xn0cP0w;ZT#c@nJ+vTh-Xo^s9Y0FTzS(+aD{1CRg z4X5XYFoT5{G}@(aG86Cekk^7jXii%^5PAa@sxiCEfnu} z30e`9y$JWarj`YR6Q7If&f&C4p5WylRw}w|ou|m8w~fR`TahOV)iGaR-%(oMnXb#2 zF0foFP%%F@e^v~0($M#?#p`oUdhp>(^CIHb$%HH4@xW7F(;fW`djK=F4A85u-9{_T zOYg-oicoo^#9g$z*BHs-ZyqP8vAj7MBQ1Yc#^#D1*y1h(YlCv zVq(2F=t<#$Di9RKLQ9n*i0J_<*VrWtk9;sI=;06%3d1}MQ@+BvF6YI4HX95WetCoW zd`8fgGc*NFs^bq_HLCve!@_^Y4OBx6mcz0;k{!`X?&;Q@LYj*_cCmZ+;3II=L0yw- zKUhtt>Pet8e@uKgsQm(nSV8sVZM3L%>pGK;tp3i{A0oIohsQXmIyA@f6yL2C04w6d zL=hK$l>geoJ1GIPr{DtOo;%%>s2T`b)2hnHH4u6Mt?|&M?G$Lu25XkJ(pGYVOtIXua{%O{ds?@H1NQpN@(=^}wf*u-Tw7$lyZ|=!r6JtZOQ%)z{vZAR~*vTJsRn z;D}d-O;z`3^}@81I?b`NCA&g>G6GjlCmcmIK>~C#g*9uI8%}V`(p?*|p%5HkF`+~9 zp8xf`Ens#U;109w;{V>bDy&*V>QM0y{)uR;R)s>{SKoS#-5w~k`a^Q?i`}#!D#?x0 zfLuP}UX50Iv9s-5cQ&$c+59L_oC_%o(#Tj^5imFVHB@*X*k|9kG$D>`7&N}JVVm6{ zbbjq56u7kh7S>2AO8tDXODyL(wKJ6iHi{WVWb!S_^fgXS^T8Bu0c*q!CS8{6 z8`oxRJK3^A>w!>wIC`Qn;HO5THP;m`o9gye<@~1A_VpIj-FCYxZn{rp2wW_eXu}tX z!u2vtYlbQA?kJ31^}`6b9AmG-kCF~MWx8{!`U@{b=vm`wAI5g_i}5D|Qrny?TSs}q z*%OzaV?&CY9JasG2xNNT8Y*4d60oo4;b^+6Vd91O5=Uh}Rpq^CX02s>z}bkBNu`5P zASm1*kHRGHF*C@*Nl+X5Q;x@6amWR&T!s|HWXYTHRu|GTEaVa_`PR;W1wgm6*G`%l z@q$)}7o<+^Qi(NC+C8bcMs46mZS>J@gxT?ks?L7xQlG}hZWgt=AYn}m6B zCiSrhmRNFuoA+#w)_QL7KnwF<;$VHztlWlUu?ZJDCpp- zt+5L^iTFe-6DBCaPjX;l6I$9?A0Ie!cjPk`k9BCMrZu7xLm&`V)IqGpkh9nwP#u<| z)~src9&e(XT~L;bzmTBRYio^G*B*4RObQiKB|^SD=)aB;Phh|i&He%{9e5S3td9#Z2Lx~+YTO<$HEi+n#ge|gZBvO`%#yOZT; ztjE_+etBux+1ZQ^8XeXg1dVUFH21KRxoOXzzm}2;q3I>4Lm7==ua$6-gtY~uNoIDE z^{4yKsM*)pS)R77N9~l^%j8L5f9!j7EXNxF zolgJB^OavS3%Thr4oQefto$jbZEMFVj`9*fDPd^U(7H`Kw(if4DsKN` z`wFjy5Yw>9P_yyC^|bSHN26=5F3j3js-~k?+dmfj#{15cl*K-FRt@8ls5(^th}kH$5@SzoD6I81Ko)cO;!AO|=7R(_Y}=>8)=g<3K9>*@yT=%UEw&?!*K3w9)Y z?aHDW;}mQrw)oqQ@Kss<_3)>dPn+gcgw{Yo)eEttSFzSY{5l=CCi#3+n+b3hiJz2B zI%hpLo?+cV+tC&$+m8(dCpMyvu9rZ>mEaSHlmoC1?r$W)OEI3$<`?%9G}#G=OR<~z zf$ici!Rp~c4sO)JB{EJ%aWd?vns?6(oe+D8&i5nyg(7GV0AvLs%=z|l2Q_-Utdu09 z4J_qIgEv6WR>Y5|WL)UeDdlaG^V&*rO;_uk>Jmiq$8G9sZ;hO4{``UwLuWJ+0ZS36 zWAopw6+>yxALR>DQk3$tMRF^xyy<*AvliE<%{Ir*k;=#3 z=cl+f=6I3TnPZl84iz+-_j|C*whj>W`%#wFzstz_LYM4$>%-tl<#2wGRWWu+IpyZz z^{T_`eh<%yhj{iJw*SI>ZXC#3*z=Q1cS_`=fQ>-DJwys@%Kkk{RHh?jxn%AX?Q=pk`zjs(!L7=0Rrv16}$`v@Z9_XX(E~1}k z^U*D%J&fMQ3tQNJ9beJ1mgsyedG6eex=)EqFDGNpY_eWIjK$C>RTyZKZa)Pg&os;- z9o}2|3}`KNHw6?~^`O7Ml@9+cZd7RNhZT(}|_`QF#rRC-_gpF_^%^Zox7a`tI>-YT-za&gH&XorS&>Bn=RDstej#J@>fU7_=PhkJrKQZuLu`-!v_Lnwh!(pP&*fVQ|~)H*RQ|n7sJU z&A_$Eg2w?}>;e}+-889e(;)t3Z@~{OZS6aj$!tg@a=wCYx-+A*-y8fKzf%qt!nxi& zrss)?EGJKbSwJeGlL=_1YhOwkkQ<3ihFj^kiLdhmcrKf`exGyc%}?wG;Nkug5^?|` zTV(|1-{iJ)txu*-0{_;lDPIw^AaF}U*2fS`0Fv6ZFFDL4b>p&?N(UB7{ZIkH40MojPyHDR-}} zixkh95G)laeSpFjPAP3fm=`%;HXm0GW+LQTTniQRZLQ}~yXhH(NADKjF@hG`)hl zKrn3d)=)?f=%MvyW}tz!2L<~)2IpJEGy3W^A$A76UY$@H@P}{w=g-@rEH>yCoGL-* zo6uuePuT^USu#AuP>a@niMcYZ;{L_HFoptU98>*rqHvsF=n~4cYq&4T|c5r7#)3ho(v`y533e182L2VG@8kMl)M9J;FzenE($$#=6zV)ciGiw`KTr9@Kgp?)rmJa_I$K+% zFeO0rZngqzGwcQ>o0OqhZ9en<)IiwNa)fa-B(mraD*G&;(gkn$3Ehq5QPS^Zu}@$_ zq}FcDNkN@v$(CMy?jHGBt6 zf`6DZKYaKQuThM%a-|Z8fLVmFi)VYWLP&(_Gr0=Dei?n(^l1>Ubp-EqhxY2iPkZ+s z0G?c38(~^xLr!c+gnfT0HIL;9SReKEhdkTl{0n?iQpW9~0}cHQMjVNv}(3FlUTlQoXw=o6cK_W5g;zk52;Tbjas_BWo4R-q@V^Ep2W)92 z2RzF?lsWt2(q*jrHfdk#&4S-zOB59#!E59C?_-Tgmp}baQjh^`~*(+wW5LGkCM333yuLeyt*{_3&7&iDGm=j>aLOae{nX_|CIxm{x>(hD{}qXwXa~m za^CSg7x;Z{&kLZ^af~e28T&O^CKf^$va7K zk#QcQwI42=r|@=ZF5?nNmP9PuH$~%s^J!jedpW{mXmpeh%1 zw}`_%6GF!)Bn;GCOu<-LTCOTmQqzB9u6@vdhEEN?@{1l z>|u%G29v;I&FvcL|50G^$1q#8sj+baAdzx&R0gJ6lm7(B8ZGMXpN6$)2fG@--;iq@ z`THFZ{lF5kEu`q(Bux{+?uhTdWz$b8cyCq^4F+i*pEA4!+}PEpuSE;2s=z++>C&A$ zuOxqUG;Ug>mBhXW{u}YeM$NV~l~c8~wYkj0#=uG-uJ#&C4?P_L1ozd`f54Fevrz=S zb?^(A*Z6;4bp7tC;5uYt;MsX1j!TX@BVZ-U`Pz%r1KyHRtr-YJs8dF`WkJVf26gTp zE3)Nvc6JF2ug!3iJ$bqgMVUxS# z!FvV0cK$DbLk^me{`hK)ls$fYWM>B~&;I4f!ybDK;GhJ((_L(*u>;IXj~$6HMc1JT zU>jcov(FIt$u2{mu3`D0{-5}J{(@bJ%mbEp?$M-7A+|}nVIB3Yfyx*sj(Bz20paY= zhnoWuvS<7qFwAfTWn(?F;LsWV!oot@6DKr4M&gkH&wxRyVmtfa@k+o=+yEh=L2_C` z$i%Y9^hMZs8{!R!t&HB?6dfh`Og7T>fn>_`&m7%T)w^5skf81I_<<}98ff1Jm=ReZ z`OqTt4HLnTGyF-gWL}=@7N%}$W{ZAiD-tw60FRfklrin>ZDM1o>RmvIGS^;yFDFY7DUi-5KRY(ONA8etZME zePj7l%#y!KWQ!72Wip#Bd86@9M?gM{nU(eRsp~oIbI0dVjO2L^f&1dpWKB9(Foj0wpSLg1(5;1B=h`BiZ2lY};UC zGwoKFm#g4K%ug`9nzTx2yk?1SM2&HC@u`e(ldLP@Jft_YnuH?X+rUqV!_|T|rg6^a z4!moYFoXtL#c?;xOaJ3}ledNu5Q2RXO4L?XnhEy-^eZR{#ygk9qKlfcv^CJ#cUM)p zWW~nH9uDYtj#g$I91Zw7;2d!8R7LPwbrnJ#n`dsmq2*R`iv{H)^LC1BZ$0=~n)s8! zITABV>`S~NcV*5`6H!bCuym%&c_7cg4S`%vtuc*&pdH67nw+F-z{yx!e*yl>z0F-# zEU7dZIm`SVq7zq?VaLr&A<_sEZp%rXu9ID71-{nrOe*RPx3=o8Q^WTBS7)-2yC5%{ zLtkTEEs_9zNnjfM#eCYP3KM7tr;Thj6l-ls|NLK*GsagI78FC&SF$i6SSO9Jy2m(4 zvmzWJ8A!GU2IBb(wS$A;@HP99-@|3|=}?D|4Kg8h=`=o@2|TdZ>$WDp<~I+b6RyeB zV^sMxM$(}wR8niZr%#`r851Y8^Mj=m7?{_1wJj<lCr`HIBka(_!R;UEeKG0Bij{f1l*@Ai*QiVvI|Z&`8`!t zA;frt#d1lD7&RJjyrTZ*kAENSlCNyp6jcj$np!)xBBYl|8|FUV%tQZ;UtfXp!~(kGpqqT>Fd7-M=yFO#1z#`ym9a%*&zec^$8w$ zGygG|Bfs0oT1Qn*8)kF$VKiG*I|g3HvD9bZ84ZV|4Z}%{%4!)BWn-e^tW%o*DHZuY vI(qVdqlCzw;Q!fqmj8d>bTxxwmx=MX=p=VEM=3al^vE?Wea*rvwjuumns&k1 literal 0 HcmV?d00001 diff --git a/org.tizen.guides/html/index.htm b/org.tizen.guides/html/index.htm index 33677a6..1572e0d 100644 --- a/org.tizen.guides/html/index.htm +++ b/org.tizen.guides/html/index.htm @@ -31,12 +31,6 @@ +
  • SDL Graphics with Vulkan
  • Notifications and Content Sharing diff --git a/org.tizen.guides/html/native/app_management/ui_app_n.htm b/org.tizen.guides/html/native/app_management/ui_app_n.htm index 0e9ec92..399a8ed 100644 --- a/org.tizen.guides/html/native/app_management/ui_app_n.htm +++ b/org.tizen.guides/html/native/app_management/ui_app_n.htm @@ -44,20 +44,22 @@

    A Tizen native UI application is similar to a conventional Linux application, with some additional features optimized for mobile and wearable devices. The additional features have constraints, such as a relatively small screen size and lack of system resources compared to a larger system. For example, for power management reasons, the application can take actions to reduce usage when it finds out that it has its display window covered over by another application window. State change events are delivered to make it possible to detect these situations.

    -

    When creating a native UI application, you can select between the EFL and DALi UI frameworks:

    +

    When creating a native UI application, you can select between EFL and DALi UI frameworks:

      -
    • DALi UI framework -

      The DALi application is based on the Dynamic Animation Library. The DALi internally defines a virtual 3D world (space) and maintains hierarchical objects in the 3D world. The hierarchical object tree is known as the scene graph. A node in the scene graph can have several children but often only a single parent, with the effect of a parent applied to all its child nodes; an operation performed on a group automatically propagates its effect to all of its members.

      - -

      For more information on the available application types for the DALi framework, see DALi Applications.

      -
    • -
    • EFL UI framework +
    • EFL

      The EFL application is based on the Enlightenment Foundation Library. The EFL application provides a 2D-based Tizen native application, and streamlined graphic core libraries you need to create powerful applications. EFL needs relatively low memory but provides high performance, and supports a retained mode graphics system and user-centric features, such as themes, 2D/3D effects, and accessibility. In addition, EFL supports various resolutions with the same layout, fast and small file systems, a variety of programming language bindings, and a separate UI and logic.

      -

      For more information on the available application types for the EFL framework, see EFL Applications.

      -
    • +

      For more information on the available application types with EFL, see EFL Applications.

      + + +
    • DALi +

      The DALi application is based on the Dynamic Animation Library. DALi internally defines a virtual 3D world (space) and maintains hierarchical objects in the 3D world. The hierarchical object tree is known as the scene graph. A node in the scene graph can have several children but often only a single parent, with the effect of a parent applied to all its child nodes; an operation performed on a group automatically propagates its effect to all of its members.

      + +

      For more information on the available application types with DALi, see DALi Applications.

      +
    • +
    diff --git a/org.tizen.guides/html/native/graphics/graphics_cover_n.htm b/org.tizen.guides/html/native/graphics/graphics_cover_n.htm index fe753df..43b54a7 100644 --- a/org.tizen.guides/html/native/graphics/graphics_cover_n.htm +++ b/org.tizen.guides/html/native/graphics/graphics_cover_n.htm @@ -56,6 +56,9 @@
  • OpenGL ES

    You can create OpenGL ES applications in Tizen with the EGL layer. Tizen native applications can use OpenGL ES not only for creating a 3D scene but also for a 2D scene that requires fast interaction. OpenGL ES is also good for improving performance and reducing power consumption when the native application performs computation-intensive tasks that can be run in parallel.

  • + +
  • SDL Graphics with Vulkan +

    You can get high-efficiency access to graphics and computing on modern GPUs with Vulkan. You can use cutting edge 3D programming tools to create high-quality games and real-time graphics in your applications.

    diff --git a/org.tizen.guides/html/native/graphics/vulkan_n.htm b/org.tizen.guides/html/native/graphics/vulkan_n.htm new file mode 100644 index 0000000..4d6b857 --- /dev/null +++ b/org.tizen.guides/html/native/graphics/vulkan_n.htm @@ -0,0 +1,744 @@ + + + + + + + + + + + + + + SDL Graphics with Vulkan + + + +
    +
    +

    Mobile native

    +
    + +
    +

    Dependencies

    +
      +
    • Tizen 3.0 and Higher for Mobile
    • +
    +

    Content

    + +

    Related Info

    + +
    +
    + +
    + +

    SDL Graphics with Vulkan

    + +

    Vulkan is a generation API for high-efficiency access to graphics and computing on modern GPUs. It is an open-standard, cross-platform API designed from the ground-up by industry experts collaborating under the Khronos consortium. It aims to address the inefficiencies of existing 3D APIs, such as OpenGL, which are designed for single-core processors and lag to map modern hardware. It provides a much lower-level fine-grained control over the GPU to maximize performance and achieve consistent user experience across different operating environments. For general information on Vulkan, and the comparative merits of Vulkan and OpenGL, see the official Khronos's Vulkan Web site and OpenGL vs. Vulkan.

    +

    The Tizen platform supports the Vulkan API in order to provide the most cutting edge 3D programming tools for you to create high-quality games and real-time graphics in applications. Vulkan is especially recommended for performance- or latency-sensitive applications. With Vulkan, you can achieve a much smoother user experience by parallelizing the rendering job across multiple threads which can feed the GPU to the max. Applications demanding explicit control on work submission, synchronization, and less power consumption can seriously consider migrating to Vulkan as well. Tizen allows the use of the Vulkan API through SDL.

    + +

    Figure: Vulkan in Tizen

    +

    SDL logo

    + +

    Before using the Vulkan API in Tizen, make sure that you are familiar with the following key Vulkan features, which help you to align your application design around Vulkan concepts and exploit the hardware to the fullest:

    + +
      +
    • Cross-platform +

      Vulkan is designed to run on a wide range of platforms and hardware with very different form factors and power envelopes. While OpenGL has the OpenGL ES variant for mobile and embedded systems and OpenGL for desktops, Vulkan provides a unified API that is completely identical across all these platforms. You simply link to the same library, with the same header and the same code on all targeted platforms, and the application runs everywhere. By not limiting itself to a subset of platforms, Vulkan enables you to "write once and run everywhere". This means that by targeting this API, you can achieve a large market share across both mobile and desktop devices.

    • + +
    • Explicit control +

      Vulkan is an explicit API, and wants you to define "exactly what you want", rather than relying on hidden driver heuristics to do the right thing. Vulkan, by design, is a very low-level API that provides applications direct control over the GPU. Older higher-level APIs hide most of the costly operations, such as memory management and resource synchronization, denying you any control over them.

      +

      Vulkan attempts to turn as much of the problematic "implicitness" of older APIs as possible into "explicit" application choices. It provides a number of explicit mechanisms for many operations, such as memory allocation, synchronization, and work submission, allowing applications to be more expressive.

    • + +
    • Multi-core friendly +

      Older APIs written in the single-core processor age do not do enough to take advantage of today's multi-core processors and thereby max out the single core by over-burdening the render thread with all heavy tasks, such as error checking, implicit resource tracking, synchronization, and state validation.

      +

      Vulkan provides tools and design choices to spread its workload across multiple threads. It achieves this by removing from the driver the thread-specific features, such as global data, access synchronization, thread safety, and order guarantee, and handing the responsibility to you. By carefully handling the threads and scaling across multiple threads on a device with more cores, you can distribute your workload across threads much better. This leads to better efficiency and better performance in applications that otherwise find themselves maxing out a single core.

    • + +
    • High efficiency +

      With a better design, Vulkan offers the potential to reduce the workload of the render thread and thereby allows the application to draw less power and generate less heat. It achieves better throughput by removing lots of (mostly) unnecessary background work, such as runtime error checking, state validation, and shader compilation, from the main loop. It delegates that background work to the tooling and layers, which are used during development and get removed before the application makes it to a consumer device.

    • + +
    • Portable +

      With the introduction of an intermediate shader language, called SPIR-V, Vulkan improves the shader program portability and allows you to write shaders in languages other than GLSL (such as C/C++). This avoids the need for the compiler to execute during runtime to translate the shader code and allows offline shader precompilation. It also relieves the vendors from the shader/kernel source shipping and IP leakage.

    • +
    + +

    OpenGL vs. Vulkan

    + +

    When you consider the differences and advantages between Vulkan and OpenGL, Vulkan basically compliments OpenGL by addressing specific users who want to have a quite low-level API with a much better abstraction of the modern hardware giving a lot of control, predictability, and high performance at much greater efficiency. On the other hand, OpenGL is a much higher-level API that does many things on your behalf inside the driver with less burden on you. It continues to be the API of choice for a wide range of developers who want to have the shortest path to a functionally correct application.

    + +

    When selecting the open graphics API (Vulkan or OpenGL) to use for a new application, or when considering the need to migrate an existing application from OpenGL to Vulkan, ask yourself the following questions:

    +
      +
    • Do you want to have really low-level access and explicit control over the underlying GPU?
    • +
    • Is your application/driver CPU-bound, too slow and consuming too much power?
    • +
    • Can your graphic work creation be parallelized and reused?
    • +
    • Can you deal with additional code complexity to squeeze out maximum performance?
    • +
    +

    If your answer to any of the questions is Yes, consider using Vulkan instead of OpenGL. However, remember that Vulkan comes at the cost of taking more responsibility at the application side from the driver.

    + +

    The following table describes the practical advantages of Vulkan.

    + +

    Table: Vulkan advantages

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    OpenGLVulkan
    Better GPU controlImplicit driver manages the state and resources based on heuristics, leading to overhead and inefficiencies. The application has no control.Explicit API allows you to manage the state and resources as per specific application needs, and relieves you from hidden optimizations giving more control on the GPU.
    Multi-core friendlyOriginally designed for single-threaded architectures and does not allow the generation of graphic commands in parallel to command execution.API is designed around asynchronous generation of command buffers across multiple threads and feeds them in sequence to a command pipeline, which reflects the realities of the modern hardware.
    High efficiencyDoes a lot of redundant excessive validation for each draw call, such as runtime error checking, implicit tracking of resource usage, and synchronization, leading to much CPU overhead.Vulkan greatly reduces the CPU time spent in the driver with external validation and diagnostics layers that can be independently enabled and disabled, as needed. Offloads the render thread by delegating heavy CPU jobs to the application and opt-in layers.
    Shader portabilityOnly GLSL is supported as a shader language, and the compiler is a part of the driver with vendor-specific semantics. No user control over the front end and higher runtime translation time.Vulkan mandates the use of the intermediate byte code (SPIR-V) by the driver for shaders. This allows offline shader precompilation, and allows you to write shaders in languages other than GLSL.
    Code complexityOpenGL driver manages many tasks inside the driver relieving you from the burden of managing these at the application end.Vulkan is a much more verbose API, offering more control at the cost of more code complexity and responsibility at the application side.
    + +

    SDL

    + +

    SDL (Simple DirectMedia Layer) is a cross-platform software development library. In Tizen, it enables access to graphics hardware using Vulkan. SDL is used for creating high-performance computer games, multimedia applications, and emulators. It provides a low-level hardware abstraction layer to computer multimedia hardware components. It can run on many operating systems, such as Android, iOS, Linux, Mac OS X, Windows, and Tizen. For more information, see the SDL Web site.

    + +

    You can manage video, audio, some input devices, threads, and timers with SDL. Tizen supports SDL to provide new means of accessing its 3D APIs (Vulkan), which can currently be accessed only through an EFL wrapper library (Evas GL). For more information on Evas GL, see the OpenGL ES guide.

    + +

    The following SDL features are currently supported in Tizen:

    +
      +
    • SDL basics function +

      Use the SDL.h, SDL_hints.h, SDL_error.h, SDL_log.h, SDL_assert.h, SDL_version.h, SDL_error.h, and SDL_stdinc.h header files.

    • +
    • Display and window management +

      Use the SDL_video.h and SDL_syswm.h header files.

    • +
    • Event handling +

      Use the SDL_events.h and SDL_keyboard.h header files.

    • +
    • Audio device management +

      Use the SDL_audio.h header file.

    • +
    • Thread and timer management +

      Use the SDL_thread.h, SDL_mutex.h, SDL_atomic.h, and SDL_timer.h header files.

    • +
    • Platform and power information +

      Use the SDL_platform.h and SDL_power.h header files.

    • +
    +

    For the list of features not currently supported in Tizen, see the SDL API reference.

    + +

    SDL Application Life-cycle in Tizen

    + +

    The Tizen native application model is responsible for the application life-cycle and system events. The SDL application life-cycle is handled by the SDL_PollEvent() function, which manages the main event loop, the application state change events, and basic system events (general and Tizen-specific).

    + +

    Figure: SDL life-cycle

    +

    SDL life-cycle

    + +

    The SDL application can be in one of several different states, and the state changes are managed by the underlying framework.

    + +

    Table: SDL application states

    + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    StateDescription
    READYApplication starts the main loop.
    CREATEDApplication is launched.
    RUNNINGApplication is running and visible to the user.
    PAUSEDApplication is running but invisible to the user.
    TERMINATEDApplication is terminated.
    + + +

    Typically, the application is launched by the user from the Launcher, or by another application. The application is normally launched as the top window, with focus. When the application loses the focus status, the SDL_APP_WILLENTERBACKGROUND and SDL_APP_DIDENTERBACKGROUND events are invoked. The application can go into the pause state, which means that it is not terminated but continues to run on the background. The pause state can happen when:

    +
      +
    • A new application is launched based on a request from your application.
    • +
    • The user requests to go to the home screen.
    • +
    • A system event (such as an incoming phone call) occurs and causes a resident application with a higher priority to become active and temporarily hide your application.
    • +
    • An alarm is triggered for another application, which becomes the topmost window and hides your application.
    • +
    + +

    When the application becomes visible again, the SDL_APP_WILLENTERFOREGROUND and SDL_APP_DIDENTERFOREGROUND events are invoked. The visibility returns, when:

    +
      +
    • Another application requests your application to run (such as the Task Navigator, which shows all running applications and lets user select any application to run).
    • +
    • All applications on top of your application in the window stack finish.
    • +
    • An alarm is triggered for your application, bringing it to the front and hiding other applications.
    • +
    + +

    When the application starts exiting, the SDL_Quit and SDL_TERMINATING events are invoked. Your application can start the termination process, when:

    +
      +
    • The application itself requests to exit by calling the ui_app_exit() or service_app_exit() function to terminate the event loop.
    • +
    • The low memory killer is terminating your application in a low memory situation.
    • +
    + + +

    Prerequisites

    + +

    To enable your application to use the Vulkan functionality:

    +
      +
    1. To use Vulkan for 3D rendering, you must create an SDL application, and understand both Vulkan and SDL. +
    2. + +
    3. Check whether the device supports Vulkan. +

      As all Tizen devices available in the market do not support Vulkan yet, check the device support with the system_info_get_platform_bool() function before using the Vulkan APIs. If the device can support Vulkan, the function returns true in the second parameter.

      +
      +bool vulkan_support;
      +
      +system_info_get_platform_bool("http://tizen.org/feature/vulkan.version.1_0", &vulkan_support);
      +
      +
    4. +
    5. To use the functions and data types of the Vulkan and SDL APIs, include the <SDL.h> and <vulkan/vulkan.h> header files in your application: +
      +#include <SDL.h>
      +#include <vulkan/vulkan.h>
      +
      +
    6. +
    + +

    Rendering a Triangle with Vulkan

    + +

    To render a triangle using Vulkan in an SDL application:

    + +
      +
    1. Initialize SDL and create an SDL window. + +

      Before using any other SDL functions, call the SDL_Init() function to properly initialize the SDL library and start each of its various subsystems. The function accepts as a parameter a set of allowed flags OR'd together.

      +

      After SDL is initialized successfully, create the SDL_Window instance using the SDL_CreateWindow() function. The parameters define the title of the window, the X and Y position coordinates, width, height, and a set of SDL_WindowFlags OR'd together.

      + + + + + + + + + + +
      Note
      To use the Vulkan context, use the SDL_WINDOW_VULKAN flag when you create a window. Do not use both SDL_WINDOW_VULKAN and SDL_WINDOW_OPENGL simultaneously.
      + +

      The SDL_main() function is mandatory for the Tizen framework to initialize the SDL application. You must use the SDL_main() function instead of the usual main() function in your SDL application.

      + +
      +int
      +SDL_main(int argc, char *argv[])
      +{
      +    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS);
      +    demo.sdl_window = SDL_CreateWindow("SDL Vulkan Sample", 0, 0, demo.sdl_mode.w, demo.sdl_mode.h,
      +                                       SDL_WINDOW_SHOWN | SDL_WINDOW_FULLSCREEN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_VULKAN);
      +}
      +
      +
    2. +
    3. Initialize Vulkan. +

      Create a Vulkan instance, which is the connection between the application and the Vulkan library. To create an instance:

      + +
        +
      1. Fill in a VkApplicationInfo struct with some information about the application: + +
          +
        • sType specifies the type of the structure. Most Vulkan structs require you to explicitly specify the structure type in the sType member.
        • +
        • pNext can point to extension information in the future, but currently leave it NULL for the default initialization.
        • +
        • pApplicationName points to a string containing the application name.
        • +
        • applicationVersion contains developer-supplied version number of the application.
        • +
        • pEngineName is a pointer to a string containing the name of the engine (if any) used to create the application.
        • +
        • engineVersion is an unsigned integer variable containing the developer-supplied version number of the engine used to create the application.
        • +
        • apiVersion is the version of the Vulkan API against which the application expects to run.
        • +
        + +
        +const VkApplicationInfo app = {
        +    .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
        +    .pNext = NULL,
        +    .pApplicationName = APP_SHORT_NAME,
        +    .applicationVersion = 0,
        +    .pEngineName = APP_SHORT_NAME,
        +    .engineVersion = 0,
        +    .apiVersion = VK_API_VERSION_1_0,
        +};
        +
        +
      2. + +
      3. Vulkan is a platform-agnostic API, which means that you need an extension to interface with the window system. The SDL_Vulkan_GetInstanceExtensions() SDL function returns the extensions Vulkan needs to interface with the windowing system. Pass them to the VkInstanceCreateInfo struct. + +

        Fill in the VkInstanceCreateInfo struct to provide sufficient information for creating an instance. This struct tells the Vulkan driver which global extensions and validation layers you want to use. Global means that they apply to the entire program and not only a specific device.

        + +
          +
        • sType and pNext are similar to the VkApplicationInfo structure.
        • +
        • enabledLayerCount is the number of global layers to enable.
        • +
        • ppEnabledLayerNames is a pointer to an array containing the names of layers to enable for the created instance.
        • +
        • enabledExtensionCount is the number of global extensions to enable.
        • +
        • ppEnabledExtensionNames is a pointer to an array of strings containing the names of extensions to enable.
        • +
        + +
        +SDL_Vulkan_GetInstanceExtensions(demo->sdl_window, &(demo->enabled_extension_count), demo->extension_names);
        +VkInstanceCreateInfo inst_info = {
        +    .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
        +    .pNext = NULL,
        +    .pApplicationInfo = &app,
        +    .enabledLayerCount = demo->enabled_layer_count,
        +    .ppEnabledLayerNames = (const char *const *)instance_validation_layers,
        +    .enabledExtensionCount = demo->enabled_extension_count,
        +    .ppEnabledExtensionNames = (const char *const *) demo->extension_names,
        +};
        +
        +
      4. +
      5. Call the vkCreateInstance() function to actually create the instance: + +
        +vkCreateInstance(&inst_info, NULL, &demo->inst);
        +
        + +

        The general pattern that object creation function parameters in Vulkan follow is:

        + +
          +
        • Pointer to the struct with the creation info
        • +
        • Pointer to the custom allocator callbacks
        • +
        • Pointer to the variable that stores the handle to the new object
        • +
        +

        On success, the handle to the instance is returned in the wrapped VkInstance member.

        +
      +
    4. +
    5. Select a physical device. +

      After creating a Vulkan instance, look for and select a graphics card in the system that supports the features you need. You can select any number of graphics cards and use them simultaneously, but the following example only selects the first graphics card. The selected graphics card is stored in a VkPhysicalDevice handle.

      +

      Retrieve the list the graphics cards, store them in an array of the VkPhysicalDevice handles, and select the first graphics card as the physical device:

      +
      +VkPhysicalDevice *physical_devices = malloc(sizeof(VkPhysicalDevice) * gpu_count);
      +err = vkEnumeratePhysicalDevices(demo->inst, &gpu_count, physical_devices);
      +demo->gpu = physical_devices[0];
      +
      +
    6. +
    7. Check for supported queue families. +

      Almost every operation in Vulkan, from drawing to uploading textures, requires commands to be submitted to a "queue". There are different types of queues that originate from different queue families, and each queue family allows only a subset of commands. You need to check which queue families are supported by the device and which one of them supports the commands that you want to use. The following example looks for a queue that supports graphics commands:

      +
        +
      1. Check which queue families are supported by the device with the vkGetPhysicalDeviceQueueFamilyProperties() function: +
        +VkQueueFamilyProperties *queue_props;
        +vkGetPhysicalDeviceQueueFamilyProperties(demo->gpu, &demo->queue_count, demo->queue_props);
        +assert(demo->queue_count >= 1);
        +
        +VkPhysicalDeviceFeatures features;
        +vkGetPhysicalDeviceFeatures(demo->gpu, &features);
        +
        +
      2. +
      3. The VkQueueFamilyProperties struct contains details about the queue family, including the type of operations that are supported and the number of queues that can be created based on that family. Look for at least 1 queue family that supports VK_QUEUE_GRAPHICS_BIT: +
        +uint32_t graphicsQueueNodeIndex = UINT32_MAX;
        +for (i = 0; i < demo->queue_count; i++) {
        +    if ((demo->queue_props[i].queueFlags & VK_QUEUE_GRAPHICS_BIT) != 0) {
        +        if (graphicsQueueNodeIndex == UINT32_MAX)
        +            graphicsQueueNodeIndex = i;
        +    }
        +}
        +demo->graphics_queue_node_index = graphicsQueueNodeIndex;
        +
        +
      +
    8. +
    9. Create a logical device. +

      After selecting a physical device to use, you need to set up a logical device to interface with it. You can even create multiple logical devices from the same physical device, if you have varying requirements.

      + +
        +
      1. Add a new VkDevice type member in which to store the logical device handle: +
        +VkDevice device;
        +
        +

        Logical devices are cleaned up with the vkDestroyDevice() function before the instance is cleaned up.

        +
      2. +
      3. The creation of a logical device involves specifying a lot of details in structs again. First, fill in the VkDeviceQueueCreateInfo struct, which describes the number of queues you want for a single queue family. In the following example, only 1 queue with graphics capabilities is needed. +

        The currently available drivers only allow you to create a low number of queues for each family queue, and you do not really need more than one. That is because you can create all of the command buffers on multiple threads and then submit them all at once on the main thread with a single low-overhead call.

        +

        Vulkan lets you assign priorities to queues to influence the scheduling of the command buffer execution using floating point numbers between 0.0 and 1.0. This is required even if there is only a single queue.

        + +
        +float queue_priorities[1] = {0.0};
        +const VkDeviceQueueCreateInfo queue = {
        +    .sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO,
        +    .pNext = NULL,
        +    .queueFamilyIndex = demo->graphics_queue_node_index,
        +    .queueCount = 1,
        +    .pQueuePriorities = queue_priorities
        +};
        +
        +
      4. +
      5. Fill in the main VkDeviceCreateInfo structure. +

        First add pointers to the queue creation info and device features structs. The remainder of the information requires you to specify device-specific extensions and validation layers. An example of a device-specific extension is VK_KHR_swapchain, which allows you to present rendered images from that device to windows. The following example enables the same validation layers for devices as before for the instance. It requires no device-specific extensions.

        +
        +VkDeviceCreateInfo device = {
        +    .sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO,
        +    .pNext = NULL,
        +    .queueCreateInfoCount = 1,
        +    .pQueueCreateInfos = &queue,
        +    .enabledLayerCount = demo->enabled_layer_count,
        +    .ppEnabledLayerNames = (const char *const *)((demo->validate) ? demo->device_validation_layers: NULL),
        +    .enabledExtensionCount = demo->enabled_extension_count,
        +    .ppEnabledExtensionNames = (const char *const *)demo->extension_names,
        +    .pEnabledFeatures = NULL
        +};
        +
        +
      6. +
      7. Instantiate the logical device with the vkCreateDevice() function. +

        The parameters are the physical device to interface with, the queue and usage info you just specified, the optional allocation callback pointer, and a pointer to a variable to store the logical device handle in.

        +
        +vkCreateDevice(demo->gpu, &device, NULL, &demo->device);
        +
        +
    10. + +
    11. Create a window surface. +

      Since Vulkan is a platform-agnostic API, it cannot interface directly with the window system on its own. To establish the connection between Vulkan and the window system to present results to the screen, you need to use the WSI (Window System Integration) extensions. The VK_KHR_surface extension exposes a VkSurfaceKHR object that represents an abstract type of surface to present rendered images to. The surface in this example program is backed by the window that you have already created using SDL.

      + +

      The VK_KHR_surface extension is an instance-level extension and you have actually already enabled it, because it is included in the list returned by the SDL_Vulkan_GetInstanceExtensions() function. Even though the window surface is created before the logical device in this example, it is only mentioned here after the logical device creation, because window surfaces are part of the render targets and presentation part, and explaining them earlier would have cluttered up the basic setup.

      + + + + + + + + + + +
      Note
      Window surfaces are an entirely optional component in Vulkan, if you just need off-screen rendering. Vulkan allows you to do that without hacks, such as creating an invisible window (necessary for OpenGL).
      + +
        +
      1. Add a VkSurfaceKHR type variable: +
        +VkSurfaceKHR surface;
        +
        +

        When no longer needed, surfaces are destroyed with the vkDestroySurfaceKHR() function.

        +
      2. +
      3. Although the VkSurfaceKHR object and its usage is platform-agnostic, its creation is not, because it depends on the window system details. Therefore, there is a platform-specific addition to the extension, which on Tizen is SDL_vulkanSurface and is also automatically included in the list from the SDL_Vulkan_GetInstanceExtensions() function. +

        This platform-specific extension on Tizen provides the SDL_Vulkan_CreateSurface() function to create a surface hiding the platform differences for you. The parameters are the SDL window pointer, custom allocators, and pointer to the VkSurfaceKHR variable. +It simply passes through the VkResult from the relevant platform call.

        +
        +SDL_Vulkan_CreateSurface(demo->sdl_window, (SDL_vulkanInstance)demo->inst, (SDL_vulkanSurface*)&demo->surface);
        +
        +
      +
    12. +
    13. Create the presentation queue. +

      Although the Vulkan implementation can support window system integration, that does not mean that every device in the system supports it. Therefore, you need to ensure that a device can present images to the surface you created. Since the presentation is a queue-specific feature, the problem is actually about finding a queue family that supports presenting to the surface you created.

      + +
        +
      1. Look for a queue family that has the capability of presenting to your window surface, by using the vkGetPhysicalDeviceSurfaceSupportKHR() function, which takes the physical device, queue family index, and surface as parameters. Then simply check the value of the boolean and store the presentation family queue index. Note that it is very likely that it ends up being the same queue family as previously selected for the physical device, so the example adds logic to explicitly prefer a physical device that supports drawing and presentation in the same queue for improved performance: +
        +demo->fpGetPhysicalDeviceSurfaceSupportKHR(demo->gpu, i, demo->surface, &supportsPresent[i]);
        +demo->graphics_queue_node_index = graphicsQueueNodeIndex;
        +
        +
      2. +
      3. Add a member variable for the VkQueue handle: +
        +VkQueue queue;
        +
      4. +
      5. Ideally, you need multiple VkDeviceQueueCreateInfo structs to create a queue from both graphics and presentation queue families. An elegant way to do that is to create a set of all unique queue families that are necessary for the required queues and modify VkDeviceCreateInfo to point to the vector. However, in this example, as the queue families are the same and the 2 handles most likely have the same value, you only need to pass the same index once and retrieve the queue handle: +
        +vkGetDeviceQueue(demo->device, demo->graphics_queue_node_index, 0, &demo->queue);
        +
        +

        Now the queue handle is ready.

        +
    14. +
    15. Prepare the rendering infrastructure. +

      You have successfully created the main handles to access the GPU to request rendering. Now prepare the rendering infrastructure, such as buffers, textures, vertices, render pass, descriptors, commands, and frame buffers, before initiating the actual drawing:

      +
      +static void
      +demo_prepare(struct demo *demo)
      +{
      +    demo_prepare_buffers(demo);
      +    demo_prepare_depth(demo);
      +    demo_prepare_textures(demo);
      +    demo_prepare_vertices(demo);
      +    demo_prepare_descriptor_layout(demo);
      +    demo_prepare_render_pass(demo);
      +    demo_prepare_pipeline(demo);
      +
      +    demo_prepare_descriptor_pool(demo);
      +    demo_prepare_descriptor_set(demo);
      +
      +    demo_prepare_framebuffers(demo);
      +
      +    demo->prepared = true;
      +}
      +
      +
    16. +
    17. Initiate rendering from the main loop. +

      Now you are set to perform continuous rendering from the application main loop. Initiate the main loop and call the rendering routine as well as start polling for user input events:

      +
      +while(1) {
      +    while (SDL_PollEvent(&event)) {
      +        printf("SDL Event type :: %d\n", event.type);
      +        if (event.type == SDL_MOUSEBUTTONDOWN)
      +            printf("SDL_MOUSEBUTTONDOWN Event!!\n");
      +        if (event.type == SDL_MOUSEMOTION)
      +            printf("SDL_MOUSEMOTION Event!!\n");
      +    }
      +    demo_run(&demo);
      +}
      +
      +
    18. +
    19. Before exiting the application, destroy all the Vulkan resources as well as the SDL window that needs to be explicitly freed up: +
      +demo_cleanup(&demo);
      +SDL_DestroyWindow(demo.sdl_window);
      +
      +SDL_Quit();
      +
      +
    20. +
    +

    Handling General SDL Events

    + +

    To handle general SDL events:

    + +
      +
    1. Call the SDL_PollEvent() function, which polls the currently pending events and returns the SDL_Event instance. Before calling the SDL_PollEvent() function, create an empty SDL_Event structure. +
      +void
      +updateApp(appdata_s* ad)
      +{
      +    /* SDL_Event is a union that contains structures for the different event types */
      +    SDL_Event event;
      +    while (SDL_PollEvent(&event)) {
      +        SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL] Event type: %x\n", event.type);
      +        handleEvent(&ad, &event);
      +    }
      +}
      +
      +
    2. +
    3. The SDL_PollEvent() function removes the next event from the event queue. If there is no event in the queue, it returns 0. If there is an event, it fills the SDL_Event object with the event information. +

      The SDL_Event object is a union that contains structures for the different event types. The type member specifies the event type, shared with all events. The type member is related to the SDL_EventType enumeration.

      +

      To handle each event type separately, use a switch statement:

      + +
      +void
      +handleEvent(appdata_s** data, SDL_Event* event)
      +{
      +    appdata_s* ad = *data;
      +
      +    switch (event->type) {
      +    case SDL_QUIT:
      +    {
      +        SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL] Finish main loop ");
      +        ad->game_exit = 1;
      +        break;
      +    }
      +    case SDL_KEYUP:
      +    {
      +        char* scancodename = (char *)SDL_GetScancodeName(event->key.keysym.scancode);
      +        SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL] keyboard scancode: %s", scancodename);
      +        if (event->key.keysym.scancode == SDL_SCANCODE_AC_BACK) {
      +            SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL] Finish main loop ");
      +            ad->game_exit = 1;
      +        }
      +        break;
      +    }
      +    case SDL_MOUSEBUTTONDOWN:
      +    {
      +        SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL]Mouse Down: %d x %d", event->button.x, event->button.y);
      +        break;
      +    }
      +    case SDL_MOUSEBUTTONUP:
      +    {
      +        SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL]Mouse Up: %d x %d", event->button.x, event->button.y);
      +        break;
      +    }
      +    case SDL_MOUSEMOTION:
      +    {
      +        SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL]Mouse Motion: %d x %d", event->motion.x, event->motion.y);
      +        break;
      +    }
      +    case SDL_ROTATEEVENT:
      +    {
      +        ad->window_rotation = (int)event->user.data1;
      +        SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL] Rotation degree: %d", ad->window_rotation);
      +        break;
      +    }
      +    case SDL_WINDOWEVENT:
      +    {
      +        SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "SDL_WINDOWEVENT Event!!");
      +        if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED)
      +            SDL_Log("SDL_WINDOWEVENT_SIZE_CHANGED!!!");
      +        break;
      +    }
      +    } /* End switch */
      +}
      +
      +
    4. +
    + +

    Handling Tizen-specific SDL Events

    + +

    To handle SDl events specifically added to the Tizen application framework:

    + +
      +
    • SDL_APP_CONTROL +

      This event is invoked when the application is launched with some parameters. In Tizen, this event is called in the _tizen_sdl_control() function.

      + +

      The application framework calls the application's application control callback just after the application enters the main loop. This callback is passed to the app_control instance containing the reason why the application was launched. For example, the application can be launched to open a file to handle the request that has been sent by another application. In any case, the application is responsible for checking the app_control content and responding appropriately. The app_control content can be empty, if the application is launched from the launcher.

      +

      In SDL, SDL_APP_CONTROL has been defined as a new SDL_Event event type for the application control. After the application enters the main loop, SDL sends the SDL_APP_CONTROL event to the application. This means that the application can confirm the SDL_Event in the event loop. The event is defined as an SDL_UserEvent, which is in the user member of the SDL_Event union.

      + +

      The user structure contains data1 (app_control) and data2 (user_data).

      + +

      In Tizen, you must include the <app.h> header file to use the application control. For more information, see the Application Controls guide.

      +
      +#include <app.h>
      +
      +case SDL_APP_CONTROL:
      +    app_control_h app_control = event.user.data1;
      +    void *user_data = event.user.data2;
      +
      +    char *operation;
      +    char *uri;
      +
      +    app_control_get_operation(app_control, &operation);
      +    if (!strcmp(operation, APP_CONTROL_OPERATION_VIEW)) {
      +        app_control_get_uri(app_control, &uri);
      +        app_control_get_extra_data(app_control, "action", &action);
      +        SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Get path: [%s], action: [%s]", uri, action);
      +    }
      +break;
      +
      +
    • +
    • SDL_APP_LOWBATTERY +

      This event is invoked when the application is low on battery. Use it to reduce power consumption, if possible. In Tizen, this event is called in the _tizen_app_low_battery() function.

      +

      Get the low battery status from the given event info by calling the app_event_get_low_battery_status() function. The app_event_low_battery_status_e is the enumeration for the battery status: APP_EVENT_LOW_BATTERY_POWER_OFF means that the battery charge is under 1% and APP_EVENT_LOW_BATTERY_CRITICAL_LOW under 5%.

      + +
      +#include <app.h>
      +
      +case SDL_APP_LOWBATTERY:
      +{
      +    SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL] SDL_APP_LOWBATTERY ");
      +
      +    app_event_info_h event_info = event->user.data1;
      +    void *user_data = event->user.data2;
      +
      +    app_event_low_battery_status_e status;
      +    int ret = app_event_get_low_battery_status(event_info, &status);
      +    if (ret == APP_ERROR_NONE) {
      +        if (status == APP_EVENT_LOW_BATTERY_POWER_OFF)
      +            SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL] The battery status is under 1% ");
      +        else if (status == APP_EVENT_LOW_BATTERY_CRITICAL_LOW)
      +            SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL] The battery status is under 5% ");
      +    }
      +    break;
      +}
      +
      +
    • +
    • SDL_APP_LANGUAGE_CHANGED +

      This event is invoked when the displayed language is changed by the system. In Tizen, this event is called in the _tizen_app_lang_changed() function.

      +

      Get the language from the given event info by calling the app_event_get_language() function.

      +
      +#include <app.h>
      +
      +case SDL_APP_LANGUAGE_CHANGED:
      +{
      +    SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL] SDL_APP_LANGUAGE_CHANGED ");
      +
      +    app_event_info_h event_info = event->user.data1;
      +    void *user_data = event->user.data2;
      +
      +    char *language;
      +    int ret = app_event_get_language(event_info, &language);
      +    if (ret != APP_ERROR_NONE)
      +        SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL] app_event_get_language failed. Err = %d ", ret);
      +
      +    if (language != NULL) {
      +        SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL] language:  ", language);
      +        free(language);
      +    }
      +    break;
      +}
      +
      +
    • +
    • SDL_ROTATEEVENT +

      This event is invoked when the device orientation changes. In Tizen, this event is called in the _tizen_app_orient_changed() function.

      +

      Tizen supports portrait and landscape screen orientations, and you must take care of how your application responds to rotation changes. Use the SDL_SetHint() function to set the orientations with SDL_HINT_ORIENTATIONS. A hint specifies a variable controlling which orientations are allowed in Tizen.

      + +

      Table: Allowed orientations

      + + + + + + + + + + + + + + + + + + + +
      OrientationDescription
      LandscapeLeftTop of the device on the left
      LandscapeRightTop of the device on the right
      PortraitTop of device up
      +
      +SDL_SetHint(SDL_HINT_ORIENTATIONS, "Portrait LandscapeLeft LandscapeRight");
      +
      +case SDL_ROTATEEVENT:
      +{
      +    ad->window_rotation = (int)event->user.data1;
      +    SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "[SDL] Rotation degree: %d", ad->window_rotation);
      +    break;
      +}
      +
      +
    • +
    + + + +
    + +Go to top + + + + + + + + diff --git a/org.tizen.guides/index.xml b/org.tizen.guides/index.xml index 01ec665..cc2511f 100644 --- a/org.tizen.guides/index.xml +++ b/org.tizen.guides/index.xml @@ -8,15 +8,15 @@ - - - - + + + + @@ -243,6 +243,7 @@ + -- 2.7.4