From afa5321c6c7cbb28cc1f4100ca3213669a01389d Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Thu, 18 Jul 2024 10:52:39 +0200 Subject: [3.13] gh-121621: Move asyncio_running_loop to private struct (GH-121939) (#121943) gh-121621: Move asyncio_running_loop to private struct (GH-121939) This avoids changing the ABI and keeps the field in the private struct. (cherry picked from commit 81fd625b5c30cc6f417c93bad404923676ad8ca3) Co-authored-by: Sam Gross --- Include/cpython/pystate.h | 2 -- Include/internal/pycore_tstate.h | 2 ++ Modules/_asynciomodule.c | 8 ++++---- Python/pystate.c | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Include/cpython/pystate.h b/Include/cpython/pystate.h index ce05042..bb2af78 100644 --- a/Include/cpython/pystate.h +++ b/Include/cpython/pystate.h @@ -68,8 +68,6 @@ struct _ts { pycore_ceval.h. */ uintptr_t eval_breaker; - PyObject *asyncio_running_loop; // Strong reference - struct { /* Has been initialized to a safe state. diff --git a/Include/internal/pycore_tstate.h b/Include/internal/pycore_tstate.h index befca95..1ed5b1d 100644 --- a/Include/internal/pycore_tstate.h +++ b/Include/internal/pycore_tstate.h @@ -21,6 +21,8 @@ typedef struct _PyThreadStateImpl { // semi-public fields are in PyThreadState. PyThreadState base; + PyObject *asyncio_running_loop; // Strong reference + struct _qsbr_thread_state *qsbr; // only used by free-threaded build struct llist_node mem_free_queue; // delayed free queue diff --git a/Modules/_asynciomodule.c b/Modules/_asynciomodule.c index ab72cc2..d7ddc85 100644 --- a/Modules/_asynciomodule.c +++ b/Modules/_asynciomodule.c @@ -265,7 +265,7 @@ get_event_loop(asyncio_state *state) PyObject *loop; PyObject *policy; - PyThreadState *ts = _PyThreadState_GET(); + _PyThreadStateImpl *ts = (_PyThreadStateImpl *)_PyThreadState_GET(); loop = Py_XNewRef(ts->asyncio_running_loop); if (loop != NULL) { @@ -3189,7 +3189,7 @@ static PyObject * _asyncio__get_running_loop_impl(PyObject *module) /*[clinic end generated code: output=b4390af721411a0a input=0a21627e25a4bd43]*/ { - PyThreadState *ts = _PyThreadState_GET(); + _PyThreadStateImpl *ts = (_PyThreadStateImpl *)_PyThreadState_GET(); PyObject *loop = Py_XNewRef(ts->asyncio_running_loop); if (loop == NULL) { /* There's no currently running event loop */ @@ -3213,7 +3213,7 @@ static PyObject * _asyncio__set_running_loop(PyObject *module, PyObject *loop) /*[clinic end generated code: output=ae56bf7a28ca189a input=4c9720233d606604]*/ { - PyThreadState *ts = _PyThreadState_GET(); + _PyThreadStateImpl *ts = (_PyThreadStateImpl *)_PyThreadState_GET(); if (loop == Py_None) { loop = NULL; } @@ -3255,7 +3255,7 @@ _asyncio_get_running_loop_impl(PyObject *module) /*[clinic end generated code: output=c247b5f9e529530e input=2a3bf02ba39f173d]*/ { PyObject *loop; - PyThreadState *ts = _PyThreadState_GET(); + _PyThreadStateImpl *ts = (_PyThreadStateImpl *)_PyThreadState_GET(); loop = Py_XNewRef(ts->asyncio_running_loop); if (loop == NULL) { /* There's no currently running event loop */ diff --git a/Python/pystate.c b/Python/pystate.c index f77a2cc..7a272de 100644 --- a/Python/pystate.c +++ b/Python/pystate.c @@ -1499,7 +1499,7 @@ init_threadstate(_PyThreadStateImpl *_tstate, tstate->previous_executor = NULL; tstate->dict_global_version = 0; - tstate->asyncio_running_loop = NULL; + _tstate->asyncio_running_loop = NULL; tstate->delete_later = NULL; @@ -1702,7 +1702,7 @@ PyThreadState_Clear(PyThreadState *tstate) /* Don't clear tstate->pyframe: it is a borrowed reference */ - Py_CLEAR(tstate->asyncio_running_loop); + Py_CLEAR(((_PyThreadStateImpl *)tstate)->asyncio_running_loop); Py_CLEAR(tstate->dict); Py_CLEAR(tstate->async_exc); -- cgit v0.12 2hML ;U*rإbbbޙf ̳өF`?A_` lbZ5!̯m-HQ&tC oTW3{f2Kald`<6cƋhMD$x!LK 3Z7iX_o %Vq!J#fxxmr+`=x_,6$b~|`SÆeЧEyRKu_/2mSضE"Ha9$F7f(awO T M"aSnn;WGIxW_zryzvWϽC"cjw=/İ2]@ tweK+0`X B֗F%;T$,.p57ԃ8?9̲t&?v&<ÛI z%j 23Oa V!rYd,+R+'\2Y}aV;7V@3 h-Z܀ڒ1] -_9@D,7kEzp7¡Jic`plDI* J]%1s'Z؍}u0̦bA`N5qKZ}S$ŶVE\~pbWG][^A W׸͜TVhun4  hc+ÊFE_NV+)U7 G.cыhXeʌR8mf!K&QP!}2d*$U g_$6|j3ЀqHEL-_?hgZƯ"^y$rx3WHqODBFGiTДEj7'7xN0V:PHA,0i9{crgSX{蹢%zü|R^Lܻ0 PQRu:> ո)Z 0'm.z;zRN3 fAF1tUF᲌ i۟^+J[X h #mty|fꏫ7)vL`QB):9M4)/|"Y hh>=DDH7בg2[If~girB( 6$e8YH6Jm؛y! \GR7Y!*Rqi<@GgOb"]PMG̥^xNd4jdĝgfK|k#n 0WqwOtu3\quGҰZ[/R* X ]S}:.[2?uTndf1a,3ȕ' TBk+U÷apA#V4ax5p.@( ً\pH|q# 'yV۸hhPdg)r#[GEW% YgJI>#2p.E~4"X2 ڽ%/$Nތr)q j_Т7RIH٢^xݜe"CVfܘq7bEG2f&O{ps:AW,$sS {QSح^,d7]QT' X/Q!onIߣQomhlm6ODLp*D DbAA$s7ܰt\HkՃ*SJe.phmN*IL ]Z7S<$%'D|[o)"Qqb"5]BU03U%TzP5W܃* %=9fOS ik#25d _q{s/ʳeSX t`'_OVOJc4d_T ^wR>m츖e;k.(%?ʍz*X$Vm'N^?LըxfW9kJ)؊o{Kb%u\QsE+m6Zfk/%gGxڼb$qE o.*1UuQ-,ӓCB42(?S -H13-4M.S+ZdWt3w.PA6KRINHjE% Um?q 8?GGCP9 Tn:G(QܢtX[B3t(Ġ&gkĊ"?]:%\2W>^DLE#0L"邙<1,Mv(ӣ2*Ue0_Ytⷭ`dvbT=mVk-rsm.jրP6DG^k|#9:fq3boIj{}[e!]vP-hZx,h /ddڞ0N YC+hPRr'D%Db9.T[*ӹ+AOQ8?֪۵BdlW" %;zF%F!Q-K֖#-i*۪&EDH/Vđ|)>~+2$ߨe&2yHZT:6WBaKei@.Ub^$B LhϞ%!OM@Ǖλ\k+-bd/Z`( fqc^Ƈ yղꓠ9#sA&v)9X'Hpzt80`d0@I[]f[[ܴ)RY Iph1d%a xqGI|[^}z;6! -nB*W~R} [Ώjqgg,lmxrvFDڽN$_XdgaD+i}?\8mAwDXCUA1[%j ETxD9m¢uEfFk(oeu-}ym!>}NrԱ$wXkr [6]u#܀MoJu#YpÊA͓9/icyJ>-Edlk]"88Y'i(aV@bA#|qxbi#؊.zzC 3<*1, IU"aT}q;w 5`Ruxw"|oFȥaReS.EI;xk#}*J!Cը<-ܷ3b|2XŪZȯwIG[__GqhQ j.o\q'*nr)R&0 )7M8 ⎁M 3a>u@ф\ +Y}|+ 0QQ&@G飯ڶYVf:qﶃ y"\` [43KGÌ;H s#s֞Uk+|T[_Hbs#ڷ}f|\5ɡOϝ8rvvBz'>wݬY-bkˬ^R-[4HqW J-'9 JH%Ԁ*CX#eB^m|SN-eԲVVSR )8w( kXh$ Z`=}jK??--Xp5uV ',aR䀪9Ox#$Ɏ1J/,NĪ˘rQ0 SU6GvD%45Izs74as:ubnb_Q| p;k_#GjW(n3te^-jFZW: "7DE:2q,k ы2qF^'psh]ۈ۵\H<a:~TL<%xK.pbsNKY㹏:QVpJ^bW!3VaM34 -}hm;1k'@ɭ^kBji#Krp=mV?"ŪGQ.zrQ27O ;mb1DPf8.n^ Բi\razڗ=6H|0l"W7/-\`hVuAοk}LWV߳ڣ׃|pc+<%%G3K0 rד%64YlMW2 կ8=:J.Z-<$D"9lplZ^.`4_.n'# RA]N\ D5w4Z1 & lͨLFCgv$F,9..u7ZT0mdhg +ba-MiG߀:Gbګ&_SeGz]c"" c[ExInj(<*[FLJEwylapP%:Xm\>TJ@u.C҂ÃݔޟF]HY K#):O0]lwz.TgW{U7R]`6#jM.nk!ZafU)Zqe̜r8'D_[9+vVZ!gĚc?1{9GF(:`B(ıy}>fM2_VVV*KwVRt,Zv^y*K(ښnCIH`BSJkT򗤑S?l.*B& LU;^,_KM{F=Wmj{7 q=C\յGC|QݰKM+#@U_h65o}UE$ dtʥ ISGA%.g+_{C߼u^fdsDͪyRd#zfETyix`}$Jw{ŵ=,l4gnk0lr|S[[Z{8XW+9u/(_.#\ecG!Vޓcз,leo:w1VdW*F-5ag.+n6zz<]ب:}u;t} q/6[W%XQy ^/y &2@('$Q1Ez^FP\ԓ/ /|]!Sj#Lj}^UCա] Krr0zѶ 2$< Da AP|ۿo "-LTiR_~է-Wşя1tc K'&Ї2D!8!ƋPh"I}P>fmjVמ= Z6#lB!ԟN+EkG Vkb [as9PZ>Rii?H%FiftL9RЇK DY} HӦDkJ߂>Ոl(>GQ8q%_AÝtrh!)+zC[7J#U TYb4s W0K iH˪VIwIJQUQ(VW~ZAoA%+qd?dTU=QG懅oSP<24 F*D4;U +Y; 6UGfdoV=GS>f[~לx8EC˶a98Ox[WAcgV0^CbBNgjވJ*aj߉aC\7[¿D#3 ```+=4?< 3hE;:o hGVvolYŭ.(8߿ .tp@]ϬLֵ$M6q1xtl;|qf+"cs\Y*cXhkB)7[x,3J?e-n~^)׿ :<ޭooXgd+"& "6% N14"$ihZ jx6XwၣM9=nT  U`9a:W ^4@̭A5Ok9<BiGᚒ}{k L$.(T<""؍)=̖~بkSH,jČ2́BkĈ4Tc_M|;PLEA< Z}KѣGf:TuU7LBTsեb҃4}{6&2$ȔQO%tKܶV޾|xnyqIh{$RM0`L7 "+D(ۤerيd֝fʀ! яGLJ}>^ KyhN`DMX8"D4h@#2>+cC5Sp#T述QAP?6]#X[G{9iqu$0rߺ󉽿m.8j~ w2EkYrjwYǟg VYsRryJM-U!$nXS/!H+ޚZ(nh 4 %cM =;7EI|m#RL3թ~ӆS{yuk2V ctcZ=8E8~j:zccjpt_BU 7H5d*&e-`{1bֵY-Ȗ๛vYC67y;T ,V.5"]|f^ LzluJ׌R(>mՀ#$ pݖ<*yâɺV,;KԜԻ~^W-%|3фBä$j ->8V٦oy ֓W 6;YAa7]Cƌ.LוI"`)'MmRAN=Xi3c`PA앥+זjKq5MrtAg2"za7@hZ /\zk(2vѯdAh3 f[PDk$ŸAESZ4GT][O6kϝyCFisN2U*f&DN{sJ't&zr~9یqHѯ?mrJHyvoG=(<= G0EŞ%ih5hCdEM]@-~|X?9S =  Cr- ; 4GŘ]l&!jukX(mɛD i!:e㡞FFUq~puCtñR "|Q]N6T#k1(kԐ]d` )E~U(ԾxYWn±j8fcī6̉B BټE M4>ǜh׋ hUVX+aqGsY'괾PE-]T|U MU3 e~٩T_Z,8FLte\ΫPC SqU0͑!8pn"Ϩ%-ٺ} [^u~i`wpW$3(-glN >'0YMEP6-mC{"ک >'74 iեo-p:q{CP)&9e׹RBsui^sVM2֥GnkANȧ=<9Ce )$q뛥kݐ||a~NblT<DJƁ>1ƢbQмůF Sk$0Q 1^7Qe˩1GaD:EPGn??z῱gR YAޜl$^DKDp&{C_Gƹouzu.7ENE<$|<^oo9`;ްb9B_e_\ w*vĪ-=j5gnwJ;&XZRT4{}nرYOL?Ɖ^o< ^W<s:1lls@[چgܽctۗfyd3RVFVKĽa@'Kv RRyLo圵g>'fd:0Vl45K[˄z=J@)q2/_Ϩƙ: BWYti5 g\oS 0nvWϵ:-Z NX-jjƌP7$*:F C7׽^#Z3 w\6ALj4' HB[$, K9/y=^>~`=lqlmAx..a`Z'd^:ͦ )=~ByRPz ξT N̨1h&% :M"W)qVOU٦+Ug/z.hXJBo+Gݦ3=>;LS`t {P3ow^׷d:'Q*f"D&󙅛!n_q,1c[09 $fģ*o$pbim~y{ڳgnۭ=k7Ͷl{͵vlO:YP\akE8>[̽Y +Y8pK?_#= tt)vZ7jfJʼnKł.bnn_Nc@1ފNg t68uľXG>d띆 GɘP _e$1iQ:̴Km1C|Ε€! >. wt`l҉3j :wt3Yq?AO 3p 8%9ɽ4%G> VZiI zS-pl).P>+q3:VY#U3 8]/'Zj|}gIٿ\_{hw#U>}J+?9R"N3R§_ׄuj> @tOO^+oL'K 4jJ-CBC})/%VewM΢A<ڇ>W9HawmMҰyͺlSD3wQlF֒aJ8~Qn|&a] 62\\d 4KcI3 ʘ0D<Vubziz.U*%S!fnRjI RL56_􃫾 pg^䒼U\dW^Bga8 3-*i㷑k)SU+K˅Ͷ;fnFpufJZ&l`nA&7$`Yީ1T>W'oa)&x>'ͱ0_*5D609V68>؊pXVN {YjD]+|?KBepĪ7&Cw6$B֙4c2%лR9O? c*^ox|xxY~Rn¤Զsm]`S ؄/ݣ_ ST96G [I$m]ġ$? (l *&14r#EVa.6S0`u6'c>_yܤ6kKNm-U3ɛQIsݺЌfE1 Os1ǩʈURBlgcb@ntnM |}Hk"Xv9"$iJ5 A95;_Oy267n_6,8@Ԟ [G#Ql²ɯ`{3$#(B% xc @\SkYsqdJˊ\ϩ7nAS֤ʼnD<ٞ|1N6bVtz{J%}Qg/wYn&|Z t^سy"~6i~8egzlJH|>Mlj^X/&F OiYTm{{ejw:q Eg!\1hrgeu>1=wnRS@S+o,W÷GoO֩9bV[p>:PP]8(?fp{jmi=Wj>sܢ0RQnȼӅ ()5 ¿k} /V ,A]e7n=gp}5!vOf^pzD!:!ϗz]DHxGMF}ݻXA.)nܰO֤rAo@VUlyn1hheTOhS#=,8<18Ǽ0:w4;Ì/Doi[HչϹIaf7WEoHR)z<:[Lky:^=lDuwT;z[w]awGar| 7k|PN1W`|_HE^Qv!ʇHGi_y^{>Ԃد>">љح}n%_ETSQNEԩ0 :9ڊ82}h'h?(%N:T\xI5l/qyW&8| ky|];щlFt~0۾*`=#/B ɞ䁑eNT Śhع~J+7sI^bFA/ƾ$t;qڌ2pZ=Rw#[f^\>%yA}hEQa*~DeM~΍M_)0C 72KkSmW Tjbu/ҋ{ANgE7TXefw@5( Pa]"OE.Dˬmf0$t"ߡ:׀}8䧎<]fQH?ěL9.vdtH8e =̽`uNtXRt~vjtٲ,_tv'U|Etm̗.-Ϝ;Wk;%V0ut~ ~hMГj\?2f,uoZ~x#|yq!hX[IqϽ8Eqh{GVmᠧ+*9B ;gkﳥgE%;7m3%鄋jE=\t@=ht:mh,CyaynR 0禟@HlZ)DGCo%0|- i|5@ 10ތF絛Z 9οr W?Ve? } [gA{G'sz% 0L=<yK`&1`/9o#nH4o("O,"˕OȒhJa4AjFA2(/"'IHBnSOvVvvCv >9KNwp\46]]٪\VҶ^?٩֏kw5P\JEr!wTπ96֨7(`Zc#u}wv_m_l):W-fK+b! >:C^黩RʩjlwV,p\*4 ]V){<8) e;ao"tCB-^ۭ~dvS]~ 'X$1uV˟4pz89Ǭֽz!r7#|TsG$,$^@L]SͮRىw:;sO,iн$b.w,1T`hW2\(.Z#O$ f0til1vdsԓvs,Gj]KU*\ <*`صM]+s 1݆bwern~; uz1߈ ' %4w {} 6U<:^T-εzCS r=/ċSL"پ 1&0`v8BgT'}}7F^-?{*['\&Fƅhm C"82<4$+PK/!t`KxzTŋ "¬TE K\|&BkM6?;Cx/+6"fk񸽗ԄGUժU*bJ' 8;[{nagBÇ,qc3Cb{GsFٛsfΪ >pۍd,[rUB4rn:l%;߳Q])Llq ϖ@ b <=H>F gͦ UtTd!'7_!lCN(Nw *"9#z 3PY& [au6wƽG]}8cvmR ̉o|=^ k^Q"L@`7݊Z aA]t}9cד@)!ja#zLQ''mz޹z)'ܴoR 8`#aȆ*Ǣj0 жi<J$lGtfc zpRt[X^FrGs5Y,1ywgc:b?JvZ^uuu~ i|B(ǃ74M+~*Uh`[;f'APғӣ?9`LՖVsj+I_4zY+T؋iHMڠ.Q}yݗr?@j.ӔOdz)r4b49Zw ҏbfgÓ5#(W ZBAa> g_4C <|z{:T%M^:lio5Zt/zXpbXNEݓ߿pGI: x}7$1)%dy~SFx01ʈTc>m÷q3uZt'G?rxt cZj jWDXv ,8QD]고a5\Lb(8w -s(N۠Pg+?uVuLG$ߊ_ʴl ߖqH ۋ`?]+jt,pʩ Ae㕼C\Ϭ5\0- SuT |hX8wWPUQBZorPhC;_{&sw0Y\:k~E]>*[o5|ΠCm0E9-Q2<mWVm k%"ud~SUGºvjP[;{Vȥ Fԑ{•?zȉ`GVlh1rx.u'Q^YHeС߿q8m:@ aviq,N@vZhz/zQϩ4} )?Wj?%i80M;!DkBQwV% 1t`ie`%*s~f3~d\qbp6VItZTZ<~pX:to$1vO~{zX{Bqӭۣvwn`g “_NwK۽DƉxX=YuIXBlޭțO> nOR#1RTN&R̺R%QGQŊd]Dd5lvŋ٪[^^nwuxrJR߇SSAF7JEI )7E95ۜR< )7wILy *B9[o%j Yє¼ jkƦѯRyү2aC/a=j(t;1Jg$3[9o"1bH1 (BҦzp,w #a&+I'jOWnX%>oSW kVCjj&cڜ:&%oA‰ 'Vk׬}]X,Gt o{=_}1 `4Xĥm[Pԉ,nN^!J wP$UJ I;F2N2A&4b<ԕjɞ6?'<0S՜g_'nSeH(b3h1Qx~c6рkk7%$3^»E~!߂'* ͼ |Y|:[>bui97'LTז~Cz뫓ӽ;M|J'l} &O^=:vmoמ[y#nw# C+۞D_z}֢Ku$'/Kyh8jKK kL#g`_m^qCF#s7[#N9%{- [g5C7:73îe_Y;Vqa^M_NfKcoul@A#ɉ=ãS:'\Z=bUzNχ?mmVjevNi!̆"ҬH=.2)5l_jV׫G^rsi )Y/'.ȄhMD eSز)x7Ƒ'1 ԙ5lrho䀡VT(ਢҩ@Bbpa>iȻ&T8n e@JH4 2· G"Kb=;.ob#"Pm޹{aQcS$:ƖL9&4 SUo/$>&:~/S23C?ruS~r}>gPR?Å9 ƎձNN:dcr.[6̫s<5ݰY K6ω:N8Gooͱd{۷6z.dp~%X#6zd:- )qϵZm)e!>_8,7?= 'DOnLR,M7ֲV</7 ;'_([~`0Fz85'"l{❽BG'ߏT)Ni Uս]'M,ܜoZպGȦ`b{/"#Fl-:(dgv ;6Y56*΢*[cOh%{ ӣBĘsȷ@w CcD%gEHP cwB;'&4D aϓjgEdBnvvжD{t&m~r'B lU(T0 1]ˢb:tx6zuk{0I wA5-{@=VlOP1/M7Ysb*-Jܡe`IH`mڻ YJ0%YJ\H -Wuh1?S{F,.<'ydow65#`P82כ'Xߜ†lT';?W nXlTZxD`]0 (NHVAY4.I Vya?Xu9gRes()Lɼ->iHxt0{4G=쌦2k->ġ`tqqC}qY+SxIPvcsY뜰NnMPH)T/,*7T?!$J'߬Z'ïēfH4I/SGײ#>! !dئ\gE^ѽRU5`fp\5(4_:KW!mLL~2ZzJ0H' QbLYn$]#7/ΨQ&(#+;Uc1U.q;Sy)S݋$ T VTDjk ;3!LB ;w 6IQ,Yg鑜A*T{0s6G6}(n$/Z;}tc[0r,KLN'SbV{^YZ}xOWAތ Ia|[~J6آ#khV1œ/E=Lݰ*k5W?[^Z^aֱ@]0 Wicx;J8^E{;JG'_$#Le& o5=$xD_]^Y_-=~O1_ՊO]*.WnFBS%L/)J0Ҧ{s#<(EAApR}J]0޿?=~>=I9-N˜F@~+kКA 4\ s ӫP4i?p?A_}.--?c /,Gn|$:6n7nzZ]儺q+Ux|^L r'j<68:\1/L™Ze bRwnvϋ" $,}C{O/S!,Y-deC~7|ΈM== ofYv ,hv(]ݍ^4sG>ʦo6#&ҟπ00LWs_W|G[ha 9Qua34ƶ5?*擒;Wq4/ޥ r%ykm)4Eq$\x/Zp)Ҿr>VdFGunФDZ62.o欷}[%ĕg,P"z8 i#bO.sl"66AӸ lY2Kr\JW:I)TcEX8;Qմ4ۛ^rL$8um OTȍ}Fq+ڰXY. @ajRQ6m|뫥NpOwq"|fu 'JXL RUM;L1g6nwsN+x̑}3Y4YYjhFa jUG)F;rlb)Edu"S O!kŏ2&Y4ho8e,:R4_jn&䚷NIż":{_yC #fJK(+͙F-e˴㇛0Jgq"xoNstJE6-DUs6\xڀhE2mX$R7H]NhPbK1xÅ Rۜ@92e{l̦٬6˟i#@.ܦ2{̫x|xx &<5wIZPwz^D@#)Ʊ ~t 4H!eΨVdX-ۆbA]kxמw 8s ă˙gZ@  3^,.3yζྲ5s\|ӻnְ?AK+ol }uy] hz-kh t?Z$׵ģ挀-$ߨưP6Oj;QtF]Ϥ3Oj[FZ);CZ.^!0AY%A49;}0tHEh!?6Q4uw—"S dZseٳG8:l/L ~rn&B,yEUx6q\̧^A+W ^?P sa"9hI0\dڡ H<xBsz#rMq7p, >B% d۶"x/;2sSҳ>tn_a4Fm}}+oHiѨa)-y̷TXQE %•U):M>ڧN@uץqҟMoɯo\D-gp[/ohjPz?{ 6KG^]&Mi!#5t/<~s7%g0/4`xl%S-9%@oyn4t;QtIɹEr:WJNfpSWa^'pc~ylwM=?Qo9Cΐ &=x_aS£WD-) "`kyn_.]+xMMt$v!(W+s: G,\RNU|% FuRs9p[($I囓|M7e_%cW8y RCӈDէwvr)ĮTt@JHÊaPW~UoR?MZzG3h?m%< p=3ϥ|!_4dE B?T4V= ]Rw>Q| g}h[ >3aOt V_125W%uЊ ~3~&'623OjkUܢ)-_OV;i:~Ymi{&?r6h¬%ԋ\ꎆAou -+i\aRn)~!ide~Ҿ~P:M]ӈS ߍUmU*m7[ yHBNG{~P7' z]V}Bz026qԶc6,#F5{pB}Yn!r|{A T;cR?\E|gDW@j|%K}~f_nɗSgOkk>|ŭ_SVs!u \zS[q|A_Ŋ8n[ DJ!3݆188ڦTcC|OCGUް;lwmԽ{DZ辽gL;=a :H}u@vXZosM<`UŐ jb~ĄjN]YAxeO72}Jw kva #0FvY1f l ңh\7ccxwɤ| 00b| h9W/Kdgo@qndoWQP 9kc\zm$i% ,i+=`|}g_=Cnu \袥WD6iPzTpɰd~p@RsXZrVVtAHvlXPV$C2d b:xϜgiԘAl ̂ŊS[uj:S:~V 37 8[rMWL|vJ? y; b;HBcɄ=]Etֆa@Բ`03pO3ٰNаi =9w=nשfhKSN߽g(3.aoNtNnJ=* CuY]ΰ"QNq`蛂ȣ#[!h6d9=gm)k=3g~:Td5֠aNkUyUhNjbO׬Ѥ:$@TƖp{K[HȑdM8c7})V{:2rܜEHipCjU> ƽy-zFmU~өvwL_v֦UWe\-Q>ms{C F~ڃm3XY}BٲZKևo8TV$IK ڼxrNۤVO?i%5]7jAwD]/c2<2N7hweaoS0uET/.ĄOY<޹U?Z1sWkyG9kG$IId+V[C:ᖼǻwJ ;Y-,;D!6g.Ko Lo"3*K &7ь #YPMSD sJ(}xϝV~z>wm{￲pﵦ1#ϜJX_mD"M0/^vn8όkr|XdX9voJRMF',uB/k"*/JB0>6Fh!25UvfF@Q$j|h6B1f۩pf C0- %8G ΡT; 9!ʏh1o"ص8UnJOITTey۠zexN9zXi<;ܦyHIn3U\6{-s3_N"c5A1cS-g E;Cgj߬BYUR 6ԺU3K2LaS84SVxfn ]E!9@HGm>* ʙ :44wx4ggQz/Uײ ~pmAұgs;d8k<`]/ɻ 7HBY awLʛU9VFEShB x ѩh+^w51NY$OfFu#Il73ݦ5i `ƎZ.WAx4e:м7qR=h?䅾"|\XKP`H#"J}% {GC::jakT~Ob?CT̼Hnq/_:;;KN5yMA~d=WpxrZP1yGRJ2h@S48Q\ݑq٤6 +%We^&i1*WG $^_S{Mɕi ʩ\zpE \ZSF]>7CCxL e6;ыq?oI0 e0Į%Y7/&fhIMKz;p{.a_؀+x צcuȊxDҽi™o1xSa:Ø|Q SG+I^KgҋGUڛOc׵#h3[?z? wU G @cx"d=z?3\.HlшUMaUhB8eJmopq`T*6;qBnhJ0mSi7%;@IfrI_ Qx OJEgu.kèQ_'38V {儴v?>ϲ* :U%U{M8TP# [W.iUfk~-.v?]%ԂaMN] /[om(9F1.¡gZ!d`fZfk)N~ ܮ(O0KP6+?6q0-8~OL"4sFqT5_u/ U<>rBwXؠqM`? ikkkR+Y+7͕B'IGk Zƒ=L^i&U3rHtQŊ@aT9Hk#m(גxbigϐd ,ܠ} ;Ej!.jU~Za2F=K¡\D&ED)>nVűq]x, ?Ke7(7 '!ى-DonK C-QݜٗgH$ny;@F@]5"Kz[`5'ܮV#d{RC6C"~ w"Ӟ1Ss@ힸ3JRONaGIPϻ _VE΄gsrZJaz2I، *\ eнjhJb]Ds oM70y4W@۰Ҿ0@9~c4On[Z oJvHn"!i^B-T4"+P9@e&ns7=F~زNgrn(kRjixj ST#> T"b@ Mޙ R:lf~}Db ?kDoi%ɰjyEH q2\4CRܽ.Pd i ]oS_(Ұ1xh4F1GwA` Θ1_6lc Dmq+Kl ѡC^o _dKN;9MLD96S"`}*%6Oje뻿/nK%Xo$,%f(3g|{.YJ]i~P}v~$LZ{Um OWgE.*A7q$tb':]L1jx^>|2Ш|:*<`k0`7S}A"l`5,[eķ%*^uIhj== elRgnNqU_ܹ:i7\Jwhm1D9 N`cz~O*Tck3z@Ӆ=xu9"'cDq\'Rs[Wom./̧ۯ{ooߋo,.}BIݭWc}Qq. gC0AJA\D~G.ԩ(N b@:0e{_~{;_yoVPRfF+/.iI! ䷂>|`ީ_mG[w'{{fkg]ft,y ?smx۬<_g :߃-?TA{1*FUَH"k ^l&pj <>ߩ?|*9(q9zTۺ踨G[ jLu;$dբ$ah.lҴS,2ڬ|2Wn z>Zvg\@i҇~sHn{{D4tȺ{P` ԉaauUXSt&6Qf7E3yသCW}'j^=(.5 d3ٚۈꢫFf%, )_Vir=IjȹR`Œ'i~|]>` +z ntoA3 ܐ]F=8w nh5󫊣+u^k+~,sJI(.WYm ߋ>NwyDxF$.!t7cPGd6]%qqUS}뵣RdX֛]BzRV`\%ϗPTeANQUu2FfIϛ*)3!-WJc';fZBiT:=9}**zDI۽xnf"&`N̻N͝`҄(mv@Qu(vv7uWoO_ZX'NQzt^^ƨD ܄4_GU+aʈݼ)th5?z7 ۰RLcV)Z{^շH On }ME2XjvarwRnS|[Uepj̦ߕ7++Hdl?r%.SR"xMgCQJ*1llI r LiMtu,#9suqq * -Z,Ħ˵AMP%U3~$u5DL4 J ~R‚IЫ+Vw {;0HfVM!@TH\M^!rD8yul]~[q;~ToaeA*M* f.9K0'ezN/3KCj}w}$6`ao![Hsˠ37JU]{Zc sx+}d&QE:bi"H#AM+٪d@o4}}O5gZzE(OyLmei|"[n87 7:\xzq?jyCeP)sIdxi%ہ_UPFREZU PeC1f9hZN L'X=X2yݍ؂^و6u%/Um`E%5'´Wu|#-w|oCh+µsaHjZ$?bߕ~"c0dy@EIUz@Z*K,Vl+b<1ּnؐ_l "ἒB E*!U$fEhY-k̍b`-r\;SZJ3kuT5Tʬ`bZOszHftXXTfRspsCJXiz.A)tuu%[{9.3 (˰MѷZnn~,n/DqI6ұ>%̼@*/ƏY*ʰ7pC/Q7Gö|^YPLM>4O1z1cS4pFxKV,)A7p#ap 7=eel4en~rnrIAHWZ^ f_[RgqW_/l_}y|}R^>p&ߔ-XTV> +SVզ4nX-;*R%bAOO(Ă Wb䪍6΀&>^jq7dHSK1R0GZqҼLe!i*̒8JjlᑸDE&,#wxvȼQUH^G}F8vfm"FiZpqK 5а?b8 pR(Eq+x-eNظp;Q줿h J6 =ǗbxQ#&7n~OؾQ7iuLEi;hT]h '5* ()DxwGl#s{B<{YuV KKs{ ѩO9g+]bG{ZZk|!=[[ gNc\,|ku[MU?oMNMn1l{Ub.*. JBxBK-*3fNa]4ItQb~؄ C0{5MG9п;:aCW9\ݽP~)b%R,ƫaĵ3VHe K4^z8IKA=,7n7-'77d$M;̚O`oI?8'̋[f8m_BvScRHlAkcEݿisWY8*٢D>Lqg>ގQhXb8l~|X`I@^J75ZJDN~Œ0,2쑹?WJ'V쎌kr} ^ cvyKxՔaYqSQ8j@a5 %Q+g@w J ].fX)qe ?? $bjLIus⋮B"* g%Ɩ_:ոQ ٱ}R`OlLӖ**˦ 1X'GPz#6cbV)k qv~2Y*3-Ȓ{bu ;ZwT?=xk[M~0 i=+WJ !D*<+XL3|U==2 L u ΪeZ0_W4$<`l_ûk]~wۗӽÃ2qr=#I2d˷0P`1d6P7UG&Twv77Tz}|HxsY^Z__G<7B:m|i죨Pj.1dʜ!jnLF>Caw`͵۬P~HGԊooVoVYlҳ]C/ GYeKU@*#bb h܍|7XgS[]k)UKf*f簒Y.Y|3ʩKЄ:6[Zcw&|ּ>L> ݂Py/[OҒ }%r=ta-X۽^$U5wVpQUAI.қj*|0RK6('zHҦXf&'ԡ& (Nyv+(xCܿl nwp8kUfFDIJ[cfuM2hL)YJBo}4%a笟5 YBGؘ (L0uJ50Ec)-z؟bV[[b딧M\n5E0Ի]#1X$,Hcp9#ց~fYaK&@}FDL+`FO7Dq|\!cwb%$$5Gč?ABI5n-^hCPgGdrEEY!ey* h`Qoq?anWx*.'-"nV|;.[6d{ c^k(3g;KBjh-dhȱL\7Ha*jGŊU=r(,֧^'i^/;ܺR0JbQaǜHž[DMhhwQy~slyoj!Фn"F QS)Ǚ$ݴ6BNCS\za|c۫%T%%BXnfJ hz܂Hm@4 30`W\݄c3ܑX-7a &,:3ك /?k$riϏ$~I3,S!5mwK .L}H8T!NԹ;u|: ҢdђUr67r[gc ;9d+Khg?5 u]#G/ $t/}?HiH IdȜ4*vL4(cܲ eBDz8@ndX@Br`\982b,ĭKrZ*URic~1 .<ĞL"R%&gq8,i8$ (&K(X-d> 31نy ע *UPW̶?hUHmE(ZUnc<@VlSٺuѢ ʽ|~5 ,mJWW8 pP{#{HMG !nBYRӭέV oťmҾ^!x1W~(* p Zc4ˇG%\d!зS$IKjR`:PR5f;kI{$8zxy]Zn1_&A黒ߞ}tGds`)3FB?eI?'!梅gK~#) ք)G|rXHbufk|aXHVm U ܎C3^8UɽbgcYvϫ:>;xh/ZXљpکc`L*dO;ÓRRp3Vl8yaڰQmz!z{2bpy P>*Cx:Aa\dBDO*XOj_̄1qBtG()Lo`ͻ* 0Դ &pKXH>刻!RN!}FKZ(3Dh0ɎԎϰ?B3 @"df98Ph03NZwck$t_誉Mk)uDzKiH`k5 Igp]Mh#?H<>ōƅ P 0V㉦tX,]3m<<~ѶX |b0nicCC@!tT[|{@h1`T7cY12+h]@9& zq&)d`Kڊ[nŎ /B1L8H,(LCBfLDdbZ >enV&d3?tJc3Fh]nrꜲUGZd+N1Ka"os(O%cmOv 7JLSP8xx\36ZF-#&C,/d}c"^[8R;*pC55^Q%L<*.FMk9w~nh~;P:Br.g}׸})Et%~f#>B*YVI[ԦaažX1Pv4&VXyBݲQ7P1 c /e~9<|ƲZw0ji}_M-"oh*8ߏn(89]8y*D*g;i&W.͘60~7LʰYZUZL7|FbB.} !ky5Z$5ivZL \^Lus)$g7)i\IkHub Fc8*Wblֶ Mߜl)L'Ѽe!_k*?j)oNF0 'Zmל "Qgk{hDNlZa$?ɰ1Ie0"6_m;_=M٧fi4b>50zƢnM%snRZD2f^J55He4}u~dېb!1&B5C-pBұ 5t%$3'MQ:E%5b /؇O jRQq&Gh6K0 @?eH P"܊VSaKqh>ϴvV:>D1}}k㓽QFD2WA/ }TK>JTNi\l,«؜cS{Oug='E2pXۍ+`Bj:NZ{xTxx$bX( U*ַɞY5r 1<S &_צӵ8X*:^366'~[o-o?N2tɰ!)(\ > QFK n)zPI6t*CJG8PŘ({`D30SjndsY=NF(9}Mf"