From d952001afe5876f6c2e4906d008275b4163d408f Mon Sep 17 00:00:00 2001 From: Taiko2k Date: Wed, 10 May 2023 20:12:09 +1200 Subject: [PATCH] add gridview --- README.md | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ grid.png | Bin 0 -> 16117 bytes part1.py | 48 +++++++++++++++++++++++++++++++++++- 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 grid.png diff --git a/README.md b/README.md index 50be6d1..15849a0 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ Topics covered: - Setting the cursor - Setting dark colour theme - Spacing and padding + - Selection Grid - Custom drawing with Snapshot For beginners, I suggest walking through each example and try to understand what each line is doing. I also recommend taking a look at the docs for each widget. @@ -765,6 +766,77 @@ margin to our **box** layout. ![Spacing and padding](spacing.png) +# Using GridView + +Here Ill show a [***GridView***](https://docs.gtk.org/gtk4/class.GridView.html). The setup is similar for other wigets like ListView and ColumnsView. + +![GridView](grid.png) + +First lets make a GridView and attatch it to our second vert box. + +```python + + self.grid1 = Gtk.GridView() + self.box3.append(self.grid1) + + fruits = ["Banana", "Apple", "Strawberry", "Pear", "Watermelon", "Blueberry"] +``` + +That part was easy! But it gets a little more complicated from here. In order for these kinds of widgets to work we need two things, a **model** and a **factory**. + +Lets start with the **model**. The model will hold the basis for the information we want in each item in the grid. + +First we can create an object that will hold the data we want for each item in the list/grid. + +```python + class Fruit(GObject.Object): + name = GObject.Property(type=str) + def __init__(self, name): + super().__init__() + self.name = name +``` + +Then we create each object and put them in a ListStore. Then from that ListStore we create a SelectionModel, in this case im using a *SingleSelection*. + +Then we set that selection model as the model for the grid. + +```python + self.ls = Gio.ListStore() + + for f in fruits: + self.ls.append(Fruit(f)) + + ss = Gtk.SingleSelection() + ss.set_model(self.ls) + + self.grid1.set_model(ss) +``` + +Next we need a **factory**. The factory is what creates the widgets in the grid for each item in the model. + +```python + factory = Gtk.SignalListItemFactory() + + def f_setup(fact, item): + label = Gtk.Label(halign=Gtk.Align.START) + label.set_selectable(False) + item.set_child(label) + + factory.connect("setup", f_setup) + + def f_bind(fact, item): + item.get_child().set_label(item.get_item().name) + + factory.connect("bind", f_bind) + + self.grid1.set_factory(factory) + +``` + +That should then work. To get the selected item in the grid: + + + # Custom drawing with Snapshot As mentioned in the Cairo section, Snapshot uses fast hardware accelerated drawing, but it's a little more complicated to diff --git a/grid.png b/grid.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3c6dfa9bf725d31cedb2f041c5b8bc97e0a10c GIT binary patch literal 16117 zcmeHug;!N?w=Rf+0)mLrAt2JB2-1k6pdu(pmvnb-8j)@!B~?P{?vjvZqkw>PgLF6C zxqja_&N%npbM8NI&mP0rd#|`%GQ3-ocba=RzWcJh`6c8=OM`WS{5mgf2#wz@X@`WCiE zmUin{^`dal9ps?LHu~Cj#+DYh-WZ$fV<_qC-MY(t>!mj8);;cfJh$!&2=YD<8GES#knuH4Zgiemk|L-8=slj`zNk0#+wSrK-p z$mD;@;u!Z--Y6ZyhtVe|&%c(JlO%l(2*m zJ%@Rol%$q!7qRU_S8R#@<|W<6{VbjyUZmF@%}Ep~r?NlayRm{C{5+evE$MYbw(%ls zb;|4R1>`f%r}|h4)gRFcolCyCTkjHHx1)JQLjC>y+k8IPY|Q7)E^O^(_b*+{EfVi$ zE>!L~(R^J%OhiOfNfv$8l95y?exlPtEB!B=`$*k7oXzs}SL9okH=1#_3I$PDT^RTC z!*eO3zkYqvqdNT)*ABz^LawJ(1I{G@I4nZP;uftGrUPcS*Gtc0BkO1<_R28vo1gNs z8Wi}tZk9LP^y8j6Ktn5T= zWMt75Ct9fsR8a(ujA|>Xk*}1J9xB(XMdV%!}9E{vZ30myd+N z$%0ms4YCA&Gxl%UUOilTt2E9yB(KaSAk+T4aymvp?dSB>`(?vs`F!SoO3J$pwndr- zZzGp~eHR}qsAZa(g5nP|1H+ey&N)>=z1N!!{@^ zc|BPEx$1+U7M&|st^`QEc!76O(Z)U1C>=(sJOIu*TB}>+S8mW2o)|)+EBbb^G?L%`M-? z9Q~R8rAgK|DyeLidZyNFW6>l*PrPp-`)v|1V3I32wPUGy!ys>(WjYJrUZJ#Cd zh@}xX&xriaH<2g9S)!TPRjfQp_Nt2=*n*Uk*}{m;jq;t5&k^ z|MU4VzRb1_TNLeL$J#5+ukxvg6MS=P>1$CSnU`tTRv7CnUC~#Pow9I@mj4Xi<=?g> zz-arriKJ?}G1$hPi&Gt0Tu*4A>H;gi!vOW1YEd{V9N88hC*;V7N7BV~|Nd;$f}rDC zSC#^s)0EFbwuUA;Swy+knK4^2H`RQEuT({WNT8LS&3P_#=PNf5kk4ox;j!W)aM)(TWum-Sl};}bQj+{ z!LlwOHT4#{iY>n;l7Lz;QBeRB6Vq<#SN!4j!uE(|yWKjCcemnzqY9D0MCI6;TxX@j z#-w;&S_vlMll7*MYEd=eaRt+fih9W; z2@;W!wFTbHW@fhHHXC~Nk9VLRJKl%vSD`lpmZKp;MVn5ocqLFV1N zcZlhW4bf8_Z24)=KClhdpzti~PYH~TjqP21B{(%XV}p`K@;OR5>9ltRa+~C3MVgM+ zWiy_AxFh{>htr}wA>(C&4g7X8YJT_+f3vYZXK8Oh8)~V+3oA#XI#kWF*2mKmgR}m` zrpj@>XHd%{sB`YZEe3`UDegxBYIRL+$rbn0-3K4<8$asHcq!n#!~Er`NP7f>B-q@ZI*PleTV7P`{V`qY{e;yS!|~;@9|5}-jija~ zjhB}fvgysu5;itALsj-{OtQ&ol3`?`X9vXS1!bEpq8}kHSN)pA4Givt32$*z3))R) zru@b#Fc~m`92MN6L&wkWzqdLv@N)e^2Dlx z5DIl@9~rT8Q(mG+O~_$IZ+o62m}2*$H_my0Wqne>nC2^!gx%!_;I=a578*t)WgM_J zc8w~0W-1~|GBT+YQ8y_mj7uI=`PT{rd*IgC0s{Iou8XFshW7P?%1)ITFjfM*7J}}ABv$L-x4oZr6KbftW zv#C7zo1Jewn8yJw!>&>kRkR<`)7h!p5*WR+JQ$mps2=&@!*Hc7ldpDfxuxZ(#REJN z_Ko02)qk_HjV9`-MO^ka?9>VH@ZhqOc7n!38}~fraxGh?y1DVe@BRChZZk6OuB2c@ zY)dJ)_4f=c$}v-I))~A!5fIWu-H~?k`w>EEyVy%d|<(iu72T{0L`cJt&$>jQgzlsrs{(!g`W~ zip@tHeuR1S^{sQ#)4z-7ssCh%rg1%-Q+hb{1}nc#Fa`^Uz^aquf$h%X>+8f1oHHbs z#%qPXNQ!xDli970hYVyZeMnArUz2&)hDu$D{T8ILJ>NZ4ZYd@!vU|TZj236Iur>KD ztnj|+?;WtCmyAS@sZ8bv0o!@Ss_s0EYJS%P?pRG{md==#3%%(t3@==`ASETW@m|2Q zq~yNC`uIyohW>$p7gAGGJ^lSJ3)=r}>q)APm^vB#kUUsL6LsdCC@kU}tTtyk9V( z+czbJ_IPiVfraIYr+%l7$W-3#*v^(OVWQZR#$Ly}gIXee$x() zvctd95x3}VM49vbbT_--a@@cc>TL!GQuXc%Kz8~szE%%8?u7{b%C}61 zlw;mEGY&6}ILx4(0Xoq~(j<5w6}1H~`0pm(Dx`a>rL zzqgxK+Za#VFdu#Sc-;!R_3i=4x77v?U#K9S~=au*yJTU*VcEcB0 z7jIgj>Rb<9)4U&V+TD0bLOHG)I>iJ>4W(zz{U%h4C#R=3=Q%O>60Ul9oLA-fN+oSv z#bw%;V7171#A6XZYc$hU}=vA|BhxyOUK{2pr+*P-<5)TLnl^4wuR11 zLFsMry~1`jxIrzAIV#0N#fF5{4y!ugc3mHNgCG=s+YfLGLOtR;-e1o&?#n1uoY!z1 zYng5TV45q;Q|x>=*@hO-cWdQS+8RFARjFU(;o~@tjHf*hT1)zqxP3I{KJ)NS-BFi- z*jnX$8~Xd-Ijob-!(xwf_r0~T&fmFehwC2aFCeooSHzHtHgO-!evoxqN{@Y>TMzkZ zsM?XM)@7fw)P1q{lk4t)k}~^z!1eBg2Zp~6R3#V`kkE#?U zCfBY{O+H_^Ey;$0l#<=jLQPRqF4F-_M&mUCgPJZJID|BMe@cugn(bpM$1D_cRgp^- zs^%u|);jMtwzm46ogT;jsZ%SrXl`wtv8iO`*iSh>VR|rT*QfHW_(a@GCMzl>1x>2u z>IE?k#lc=9Dd;H#(=gau%l(iM3mcz#7n99UHnS|3KQ5{(@}?;ZvsJidd9nGRsQal|#{YJ$=Svl^^ArTALPL89=_p0v9kC3#q8)vU6@9ABJitu)!Ckc+TYNd8` zDsx+}-6s=s7v5e#8!rFOl}-^&LQn!2xh0sK2Pw7*eC9eULxstN{?%($LEsph6X$2K zFBAASXTrpsMH@Is@F3gXU{lJ|+g}@FS1#}bc$73#Y_&$_`#qfQv2uwK(dOpneT&hG ze!X$H91W~z=6Jo{5OTG2lHh=Cs5u{HVPRp-!E{jbj~_+WGf#g6lY5st9`-$Qa&h4? z=pvh*nRzB9^|slch|JeoMswkidDjWMJHI0MH-~I(*Vwl)g&OX^;zxUn%^xrIRiLEA zFz$r9`L>?hP-?mDV4IT4WV#!1dr(>nb=Dn+=UQv=?ANdN7IsHtNIS2pB%^jLWaAmu z>LRWNi7|1fT9s6$q;PF+i%mtg9bw$B|4dXY>K4?TuEjmmG-&iQEy8f3ZG&5s?3@ZY z#*h5N;?Hyr2ZI53Aq1@SWf-M_g8Y%%0o*{ z2W>hz%DHu#FUN3dbi{C|IYC5xDd3vCD$1l z88_k1f0dc5B|HCRNp{;)$*Y*gP2CX7z`jahb$+_vS8A#R@XzUJDbuUbazs8;CLK;4 zwQ9O*_qRWQ(z52KZPyE~+9)M0w`g#{yDocXXS?|x+Qq{_Yt8){^z%zWg%F&s>+HSb*L0b(HsfRKR6La!Bv8^VRW4A*cXnKV=+z{i>5z+2 zG2f9vb+*dfDi?<3L$@42I)2+=!#ii9#5-&p6#*#)_{e(wCKcPD+2@5`qMG|>kAH}q z$7SyJj&ufvn&-_HdIT@PpVlRtBsp{?-i(oZi@t=fALg~2<< z%g3GB_!2@wC?8y>rtXF~MuXWUAg4e^)&-oS%uZ5NRD?wRV_*DFwhKKVHf(h9c}fty zR*2d*z{SOtl9tvxKRZo+h*MxTeDBw$FWJ%I#Mse%-RA*>Is> z#Qu0=q@`G@`7%lL+Wv&4`&;l~z2vsWRfl5dF@rP5MI|Z%reb%0#?S7|yBDzh&yDdy zI75KG#2snV9UM7rZ<5+B4HolYh*Xv64^+LZP`AL?JLL+Pose%UA35CLiJx6q=!2A8 zV)iGlH{7{Pvx2I8qr6uhl?1+#l`ul z2uL_oo8iupqmUgk{oS>_eg=>S>QeNC$9dAq$_lHA)h6q3Sf1nhc#d-61?Cg=^|9&) zirLYSQ;VE;O*~oAE-KNrey`4s?N)~F0zVD{A|)!C42*}ElvGkihM@lZOsF%KYrlkM z+;zJfa<@0IixmeUE!WLUckkYvb3eOE$rtQ6j`AaBk_nHA`C*!0`xLT?Fo!dNpZ9wG zdGhF}dMK5^BQrC0B~6rmZp!u_D{Vf@8=G5OI^g_i>FJxjj|owN7S1RXlKJ4+M(|U% z)n0NCIciYb%5|;+P#{F+_Jh2@Uyw?lz!$QdUk@B6;~K>A2U*c}{a6j(zNIv9nwz0^ z9cXkbH$Hw-!^A{ND~(GqY#Il7*L4#9a1PRNWQkZMj+E_eIY>5@vMI4lK~j9oCC9P&1_DTe-xJX#Cyp zSh(IjS92(??4tc^ zS^J`Mb92#0!kw@Mt*toO1JAv&uO5s{oc(ayA6r1V1Ds4gmkGRd@#3p|O_9hC=M}4? zT=ggKw8<`Bx`e7Ci+*MFwSLf!U zqoZ>G(A%rgR@8Q0`e=8#)iA{k`-b~n7Lpq`-iL*SEr{I1Z|Wnwc#D-aFe)laUi7xD zjSau`^u;fdVFmy^43E>}Bm0*0tVby{owm5hp6+s*TpYlg98;3qo|HeIU2v2ni7Hy1nlhKaD+bD>$5PSxq4$QEw@%Y-vV z9pGWMZEeEsNnv#j?K!{X^M}j^Xde>SyR)H1ti^KG_~^JBQj%QGlvdrA8zJv7Rv*S4Oh{%BLFo|chuosv>*Zb!PZvT|tEf#QKh*WRkn z7?cbn&oK)o28Nm7zpqK{+7+_W-A|830dgS;CbrWjKR-Y7!|7bCmP`-{N7iolAR0|* zX=#amkg8ehtZ?))FK)o31&u}%>pfmP87SwzhUKl|W>r?E)lxW@hGF5Xnv41tY5`P;Z6z zM{Pkx#_*Zi(5Z8gT8?>HVQi)Knc}@}sjBfP_s9BC-o$}rz9~DwcHxL8P3NYbjsXuf zVp?>*4-Vqwf94WM`lI19aMaqm+EJRYI9_@6C6{GeXbRz^O=W;aZSsPoNJCY~h&6v= zvU$Fly8zUSMw7ygg(<9!?OpA@vayvv$6}#WFXx6^*S7l^>4kSn)N*ZYx0OpBh;>sa z+krZXU=j8x1(9-P*f0McbzaU*jya#k6c-g0JvcacTc`|ef}O>mGw;k=#6|#Y0}Bz} z?Uzr_V6?6t1E#UH_$3U%*Xa7_tR5HG@$Qej+b5dCE>0PsodL|A8h2SwHy>#fe+0EM zz3L16>g3$q6L)t}0Lyc<=La}ozk}oB?Jgd4!Q1Z_Y;0}Wgt}1Ayz<&0m;L}jwk1sL ztgS1ahn&w$xm4`3tD74N*k+u7?HyRP!E|##sUVS=Mm)Fng^_YgLxhZ{h@}AQ<(Z&#F zHDX>~2p}_tORER&4G=usWihZ!K>f;PX5@5qbPH||MYLL4TXoAvR7y=0zU_kSN6*C- z1{*FnqUbQ5`7+_D9|5&;vB6a!@LzXCa<1Z$a_ap`dscHep8#aKz-sCd`e8ma5FA#9 z#Gy^PH-dL_a&l}B0!`OIh|OJQZ8Ju4I@En#;MSSKO2YkTTpovbK%sKI z|HMl+&zV1y9S>s6*}^0wtun1HHEbSxU^79?g~HZNe33Wfayi68rsF%u!pRW*LPA*3xYoA+YJ}*9w1?&PIzi3=rpqiVW(E+Nn$j_fYYfkq@K(Bt! zp;p#g>*9!Xoj^xn;}BwI_J{uzBQZD|DH2}lW9yGiBLPBxiOoxtsA5+#Tobzx|NNRv~F)qqLx7~T}Rc4dt(C= zIXm00-`=l3A1kgCOgdqpr{91?*!$^mazh0u%@}Cu5qcZ<4zz%m?8D0{Doe`C8i`(< z_bX^LgfzSB$5S+!S{>&yW@yPCx%UJJ3e>gvOn<&?r||5>i>6hFZ2$l+oV6s`CdtKJ zUD6P)FF)S@4$`_!C8FM2l#lQ{dYx7#ve`_0Q*^sntQq<}R+xG--ca)VX=y2SI;z<{OKi5atM+8*?Nb4`pIu`KOTs z`gQn+50AygF~QFkKAPrfPt>`kyH6DA;sgW)K(oZ>eEo*7aQI<4;Qa?41L$r`Zh7*NbTpStaf zkRntL9lB?L_{zJZy*2$xq3?9?-kZFNIX#sIp~3ihd^#{ z+L)7*lPY&(dO4q!nf4pA3)d(HF75~1PGtIEE!6cu-%F)}y3%LiK;rtR*Dsmd&~(R6 zHUmO|Qt6zFuk+;GDCSrjCyg{PFle43vjC*ko&`pKeIDEf&Gc}XoPVW~f6F#&{B>6M z{7hK)2w{rnwUc*^0`bnu+A?YQAvQOO1h9r%KeP))1X{l0Kl@IkTjy3(ChfspYMP#7DBVP?r@$`wajb@)dO(vuI`U(w6wBN9T=VlH*n)FG`S-x zA+N~|z)94U4=ip&S1QULT5XrLJWhE@UQCJEgQ^UP<|U986Zc z2HZEL$l`a73UKa35Rfpg-Msna&6^vb9EhwALf^rrPVmda1v^0j_Y;0-f#N#cnYQ9@ z>*$z1*qq@{>cK6igbRZ>@EH^Vd|J^&$R-HGO4{4Bs5>+;=!z3pRi$vKPU5ONc!%h( z{G)I)KplX@@}Rc#wzjqw`@a$YcMN+gO2qunefOg!rhE79b!Z@26XI;vIAR%a94MiG z@7)5wiBheUmynT>Ddijq5CFPWW--^G^dUfNOe6R$28e?# zsEh?VEx3?7FI@sYbMY-1Hv9+Lkaz7CU*Z3w!X-)e@;O zED4F(cV8Yd-Te4}fiD-%@*l0OeP3TQ0JnxtW6ee*9^z}zT-XAU5^2H93j7!KzX975 zc)IB6jy#{)&_j@bP#fQIMBGMygwdksyA$FeVSw^8yNwph1br&=RCT^5sq?0i`gc&n ztb7e&P-XT+_f0`hD)-7T#((tXV79>de{?)E5+Tlu>@$h+bkqG#*C~(zM6FnkBTa}N_HiYUDd`@I2FSRgR?=S#HrteR*;K} zi=KfYn|d}7<>Eq2LW1#*@@VS}Y(knYh!5dDH+HQ$s)Sqz z3Yo``9yuM(#j1e%0WF(3kbhb2Q{I4IRC32z{E38Vi7JQH=Q=v{gBp$+8cGW_^H%&r z71j*E%ozZX86p@AMDC~ix;J6EYCCr6f(BqPfaxH-;SeT6?pciT8=#ZB5#=A0 z^_j{hjE4x>pY$eFhDQ2}7Q$0fK?Di`V zfe6vKPE4#)VMPa>fs2#y1>&IlRININ8;1)iebtVZ7=OylJ7JqU;X-kuZi2BI4#O<@ zOMooy(9wxIKEDR`Y=~p+g~rfnYGX*QCW_*H+kipiG>HkSx;E5-@8h*DoBR9wQQJr##AV+i zuXaxrMi1^Hr2Fh-K@7`kwRG?vG$~;G#M*gprG0IzI$qG8)!p44BbY|yBN+7_Kx6O= z^}nIGugLl{WRjl4md5j2(_7YTVneHd7cBe) ztzQD!nQh?u1G6D+WV8l!v(OO@6V6BANp}V0FIB-xx4~*3K7I@wS-r!@7lVm~9fivY zshmp8JrR-uMEZ+jgYE)l_7bz<$jQmKFuS4)S~0)V#w{qQ?ECykqYie93OYG8HNr?T zMkn2Xp1io8URq`%IO8_(cW$^Hb`reuQJWXv+$LPsML>@S;kgC48KULEnr&d%;a6WD zXz^_JEB*a%V9E|;DIE}q5daQlECPxR?7Iku4RmlAI5|V%YI)Ubf_xUEZK2dc&@2Io z@&U3+=iR@UK3{xOQ1j$SPX>M!-6#YQn%@4KA`^*dLLgVU!}9MC0QDF?xhlTeU_XU5 zz2?KiLo#14Z887>;U7P$&dogq0n5qhfQ7@b1tR0wvu7*{JziKim#7*#v@ZZg7Xo5lpZ8a|+`vGja5t?kC1jR>L$o>Fa-pK@Y_x)#Gk)Fe1;FFuyCTo>YtzB%3$Fc6@;PzP{|q< z1F8f993(Q{Wwesm6UL(8Lf;Fto5+BRgQz-(K=I}PVhp6b zK@=p)7|t<0Ll9;AeXl&NdUqtR!C7cQ82;Fr>s*?s_lRbA;JEtd324Z&!kZVz$H$R^ zZweD`QLD&!4=LxY7Y-!ABRXw2=W=|`i8S@5y>w~@@w}f0E8ig8)6zT z`t#ZhkVTN30TsESldHZ9de@FH2?i?a*~uZ28rjt=dW+X!xJ~%%USmsQ#D71^Gd=YLRl&{Q}EYIZ%&_dTFr4YNu=DJD1? zp-94xye%JL!&kHaq>!yB{qcSP*ks@^inis8(K<-J@{OzU%rra59E?3sJ7Y@j>-;Ju zvlys{n3EXlp4CR1UrR}|40;Rm&|x^7FaC8%AB$YoRQZ^fVp;5 z0ZHk*=E#JQ{~Kg3>OV28wVa(#SOrf?8nd+>%_5X^uNuFfQrkXUl9}V&#hC0tH^f_C zZY`v~L8a-qoly|vY$GrDr!?>>LzYbpT;~}s+ z8%q|g*3PR7AzZ6`9}}B+1}oB>?#9_yZ@jr{u1s0-qkdVwR9zNq9#Q4^^dBo3enYEk z$JtgVo@{4amKCe~c$u(d3!Ol3Rh{VcfHrtAUBjd>@1NzY2VY3CToy9Prtz?nA2RHj zn=W+M<~50D%bsH#7yiwKug>Y3S5-^Gii~61oPD)UEq+oWC={#8LWMyzO-Q)&wYGAZ zW|8QTzt|AHnr=`Y-wu`m^=%T3MF~q=+4_;$|YhhV9jp zt-b#zNAlC>-vR)78-DMa)E;={E>AfK6>9v+{j~}Mdy9Wc*+8N|I`^fTVLCwPkW{fU zT#Vz1wCSN?HkU(#+ z2~mU%BQ-JS_s9LI?BKqo*w=403PGk zYr6*QyB$U-t`Kl0>VUQ%28#A3=+n-7E(cS7C;+iAX%DzI5yaP@-{hGPUUjs$ia@do zkRUM;q6cG_x9I4+T7pPzA?v$zfKjF(%jg2M0JL-tY34JZ4C1MA(jizHtK$i!{v#oj zq!nX^_lrvDr@VeQs`(yXRH%6Q>eaO*AxDFjz?;y!FVOEKfh)OmIDl4M1M>~YA3G@g zbdP-tfZ;(lZG|}$WNa4$QgQ2?%}*Ftf_Vcd0l)_U4ZhB*f&S*k(Q)}7M$uNKh zP)ItC+Y4r*e4vC|!GeoT2D0SrsUhQob?Bi+!Tjt%PXG``BKdF80Y0Wrey-LAX0i*I z`dL?>RUAtQIPb4@L(^Z{#DoJlu0JRUtjmB6Oj)Ss=@1cP_RH;zGiFs&WxXE)T2>+EFTKb-E&g(9j86D2V9 z5Dkio6->|&141%Ug8~Sn-B0p0YY{z}*8PAE05v%VfJM8tQF73G1??6ap#HBH+wjOl6L*&N9VGufl7nHvF8((OyZkL^$t|>M zd{0-JO$s3)VJ1{^7&V0o{KqK<)VbbF*%bLQS!wB600W-@mLvV+UoW_{$*`dd(F)E7 zX0e8m+j~4bDphtYFqfABM>V&!C=5MPmV?;>ApA}!RMIdWRKy58)ex+tnV~%}gt71U zDmNxDg#EG1JMBrSVU@LQfSI~57zUcL)9*@kPEg@xfEvHh=qXWVhlV*3jAR00gK6uA zkrB!!ZlnnX&2#XmVw<_=0CJWG^E08EBeD*}kWE+$pfvF4%{@-4Yeg_vpD4pbD0*-U zyse?(ArMT{&0r)M`=tKx%A4Hy_$LR4?8&(y8JVw-Pl8<5pP3Sl(WrOY%2p>;Yf&#g z{0C0aQP2D3b^t8_qrQx*Q&UsP_CO_B(z8S*HqDW z%p!l870E+8k&%&Qm<(PYp1dFk$GL$)(BQN1Th)XA3ta?Cs7~<1SSNQN#S--L1GNh` z$KQFE{)$~&U^uKPpS{C9Gxmcn62w-re8RpXe^!?ed1x) zq~ibB$w0fB_xi;ccqD4}%NTqT#A8obNh!)K9L!mc$OMwN4(> z_|ULayAWkNsZ3K|TN@#(^u{B#Ig?GUVs$lyia*AW&74-?iltF9AA)plMLT+Mc>ls; z$T_*o-MA&2+>oSOfC&(#0Vw~(R!y9W;b$2k8#8Yjsj z)s~b4NlZ2li4Nmgti6?;!Z8~EJmguL`MFEMcrQx^Pow>v`V&M6@=v60L1n9I6J&X` zm+HmYDrUY#l9+(G1#Yq8@GB)2HAbIkjpvuDPLKC3zi?k8;d&YXI8Q=?RZ;T?D}j|h zmd5bhjX9tEX?v1}=h}s~e$f>-W%NeN<&%I&ktuDus-rHH*t$TmtUHG0j4K)a*jtd&?-c`)ffia)GZ{%}X6tY<)u@TrI#*!