python3-pure-eval-0.2.2-1.oe24090>    f ;G|`u`  E2M&9}@M{rI(riYx\w^t 2&-UL nV,(SB|ԟ\j\CI9/]lCn HJ-a75w2EWHU)NφDV͕e8ql;|t Y[ z2T/b톤2LF#M*FEsfps&#ߐvfwRp)۽n~`c\0 27ԹngF+.yEs4yLRD+ز{/a='6!]6&Tx=~T'IPtx|+Umg"~Hv&Z.̞{ijl 2y8bd6754a786eca55199f62f87ec9cd29f8af75565a375f11231ad69d094abc479ea79c85e2af17a4603d0ff78c3a7c09749f2e28bgucJ'}b^`]>=)q?)ad # Rx| T     tnPh( 8 $9 (: XF qG H I!XX!tY!\!]"^$Wb%Ud&Ze&_f&bl&dt&u&v'Hw'x(Py(z(((()) Cpython3-pure-eval0.2.21.oe2409Safely evaluate AST nodes without side effects [![Build Status](https://travis-ci.org/alexmojaki/pure_eval.svg?branch=master)](https://travis-ci.org/alexmojaki/pure_eval) [![Coverage Status](https://coveralls.io/repos/github/alexmojaki/pure_eval/badge.svg?branch=master)](https://coveralls.io/github/alexmojaki/pure_eval?branch=master) [![Supports Python versions 3.5+](https://img.shields.io/pypi/pyversions/pure_eval.svg)](https://pypi.python.org/pypi/pure_eval) This is a Python package that lets you safely evaluate certain AST nodes without triggering arbitrary code that may have unwanted side effects. It can be installed from PyPI: pip install pure_eval To demonstrate usage, suppose we have an object defined as follows: ```python class Rectangle: def __init__(self, width, height): self.width = width self.height = height @property def area(self): print("Calculating area...") return self.width * self.height rect = Rectangle(3, 5) ``` Given the `rect` object, we want to evaluate whatever expressions we can in this source code: ```python source = "(rect.width, rect.height, rect.area)" ``` This library works with the AST, so let's parse the source code and peek inside: ```python import ast tree = ast.parse(source) the_tuple = tree.body[0].value for node in the_tuple.elts: print(ast.dump(node)) ``` Output: ```python Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) Attribute(value=Name(id='rect', ctx=Load()), attr='area', ctx=Load()) ``` Now to actually use the library. First construct an Evaluator: ```python from pure_eval import Evaluator evaluator = Evaluator({"rect": rect}) ``` The argument to `Evaluator` should be a mapping from variable names to their values. Or if you have access to the stack frame where `rect` is defined, you can instead use: ```python evaluator = Evaluator.from_frame(frame) ``` Now to evaluate some nodes, using `evaluator[node]`: ```python print("rect.width:", evaluator[the_tuple.elts[0]]) print("rect:", evaluator[the_tuple.elts[0].value]) ``` Output: ``` rect.width: 3 rect: <__main__.Rectangle object at 0x105b0dd30> ``` OK, but you could have done the same thing with `eval`. The useful part is that it will refuse to evaluate the property `rect.area` because that would trigger unknown code. If we try, it'll raise a `CannotEval` exception. ```python from pure_eval import CannotEval try: print("rect.area:", evaluator[the_tuple.elts[2]]) # fails except CannotEval as e: print(e) # prints CannotEval ``` To find all the expressions that can be evaluated in a tree: ```python for node, value in evaluator.find_expressions(tree): print(ast.dump(node), value) ``` Output: ```python Attribute(value=Name(id='rect', ctx=Load()), attr='width', ctx=Load()) 3 Attribute(value=Name(id='rect', ctx=Load()), attr='height', ctx=Load()) 5 Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> Name(id='rect', ctx=Load()) <__main__.Rectangle object at 0x105568d30> ``` Note that this includes `rect` three times, once for each appearance in the source code. Since all these nodes are equivalent, we can group them together: ```python from pure_eval import group_expressions for nodes, values in group_expressions(evaluator.find_expressions(tree)): print(len(nodes), "nodes with value:", values) ``` Output: ``` 1 nodes with value: 3 1 nodes with value: 5 3 nodes with value: <__main__.Rectangle object at 0x10d374d30> ``` If we want to list all the expressions in a tree, we may want to filter out certain expressions whose values are obvious. For example, suppose we have a function `foo`: ```python def foo(): pass ``` If we refer to `foo` by its name as usual, then that's not interesting: ```python from pure_eval import is_expression_interesting node = ast.parse('foo').body[0].value print(ast.dump(node)) print(is_expression_interesting(node, foo)) ``` Output: ```python Name(id='foo', ctx=Load()) False ``` But if we refer to it by a different name, then it's interesting: ```python node = ast.parse('bar').body[0].value print(ast.dump(node)) print(is_expression_interesting(node, foo)) ``` Output: ```python Name(id='bar', ctx=Load()) True ``` In general `is_expression_interesting` returns False for the following values: - Literals (e.g. `123`, `'abc'`, `[1, 2, 3]`, `{'a': (), 'b': ([1, 2], [3])}`) - Variables or attributes whose name is equal to the value's `__name__`, such as `foo` above or `self.foo` if it was a method. - Builtins (e.g. `len`) referred to by their usual name. To make things easier, you can combine finding expressions, grouping them, and filtering out the obvious ones with: ```python evaluator.interesting_expressions_grouped(root) ``` To get the source code of an AST node, I recommend [asttokens](https://github.com/gristlabs/asttokens). Here's a complete example that brings it all together: ```python from asttokens import ASTTokens from pure_eval import Evaluator source = """ x = 1 d = {x: 2} y = d[x] """ names = {} exec(source, names) atok = ASTTokens(source, parse=True) for nodes, value in Evaluator(names).interesting_expressions_grouped(atok.tree): print(atok.get_text(nodes[0]), "=", value) ``` Output: ```python x = 1 d = {1: 2} y = 2 d[x] = 2 ```fdc-64g.compass-ciMIThttp://openeuler.orgUnspecifiedhttp://github.com/alexmojaki/pure_evallinuxnoarchl`( ))[\kk##;D?AA큤fffffffff_ffffffffffa%n_a!a%nf3fa59ed0d33c61a273a6ddda933cd5b29f4737bfa63270086113eee70d73792dcc26606758122ef2c7e83a8d81bd5840eb3dc01b849e48983828f294d0e38fc15aa2f4a240d2a1c123d48b7ad89409e2bf5fc8d2d5208e10d6113557951e5ed377bad3f8dbf3432661fb8fde64a9688fb3022814309b9666b08bb2fb57c1019a01ba4719c80b6fe911b091a7c05124b64eeece964e09c058ef8f9805daca546bc6bc884df8f8627031df19665d7037d3e2e0ce4e078a59378ca59a8ddded08b56a3db8bf3c37c1cdd7b0bdd0d2c1e27485fa37b4da562103af547f47841b823a7a93f5696ef3da1601d05b42ff1df0d401659e14a09f85159116a616555f5ddeab130c1950af9772ad92b02586d5e3e93b6cd21e7bae37a935b7489ef7b0427aab130c1950af9772ad92b02586d5e3e93b6cd21e7bae37a935b7489ef7b0427a822e816e3e60732a8ab40fdf152d1c4fd31ad98c895e4f25a44d825fca42bd0386dba947781d909bac8fbed596a88c943af160d561e029080707b9823d623b9447a8fb44dff321945d3606e5982dd4ac457c49fdf99922ab81e2b429d5881d7e47a8fb44dff321945d3606e5982dd4ac457c49fdf99922ab81e2b429d5881d7e51311f0989bad1ce28b0b02f91e6353ad25814962af4c700b06d646678003abb6a9917aac988dff659d21259e3b72a35e19f988bbaaa0541e85e8fad894b5ea452f0e1900cad433eb2cc224049b80d4231a8b02915bf786353958ebe50c6776152f0e1900cad433eb2cc224049b80d4231a8b02915bf786353958ebe50c677616f1b215a0855c026b07557eb35d5cba878f950ea5a3f3d5a0240744f7c61ff7426f00cdf411071fed140a1b77d84894f5b62c0429b90f9e9a8f4565e322857cac37c58268ef5cc0ee90e717ae71afabbc14bf20bc9ec674028c2522eebf620f579223e955c81cd85b50f6bd140faef8573e1429440ae1bff1a8071d4021f5877a4a876fe1985354c06d09c5b2f5f2ac5d9a2fe7985a6045b47c5fa20f66bd3carootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootrootpython-pure-eval-0.2.2-1.oe2409.src.rpmpython-pure-evalpython3-pure-evalpython3.11dist(pure-eval)python3dist(pure-eval)@     python(abi)rpmlib(CompressedFileNames)rpmlib(FileDigests)rpmlib(PartialHardlinkSets)rpmlib(PayloadFilesHavePrefix)rpmlib(PayloadIsXz)3.113.0.4-14.6.0-14.0.4-14.0-15.2-14.18.2dgdPython_Bot - 0.2.2-1- Package Spec generateddc-64g.compass-ci 1726676644 0.2.2-1.oe24090.2.20.2.20-metadata_list-compact_tlv-python3-pure-eval-0.2.2-1.oe2409.noarch0-metadata_list-compact-python3-pure-eval-0.2.2-1.oe2409.noarchpure_evalpure_eval-0.2.2-py3.11.egg-infoPKG-INFOSOURCES.txtdependency_links.txtrequires.txttop_level.txt__init__.py__init__.cpython-311.opt-1.pyc__init__.cpython-311.pyccore.cpython-311.opt-1.pyccore.cpython-311.pycmy_getattr_static.cpython-311.opt-1.pycmy_getattr_static.cpython-311.pycutils.cpython-311.opt-1.pycutils.cpython-311.pycversion.cpython-311.opt-1.pycversion.cpython-311.pyccore.pymy_getattr_static.pypy.typedutils.pyversion.py/etc/ima/digest_lists.tlv//etc/ima/digest_lists//usr/lib/python3.11/site-packages//usr/lib/python3.11/site-packages/pure_eval-0.2.2-py3.11.egg-info//usr/lib/python3.11/site-packages/pure_eval//usr/lib/python3.11/site-packages/pure_eval/__pycache__/-O2 -g -grecord-gcc-switches -pipe -fstack-protector-strong -fgcc-compatible -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS --config /usr/lib/rpm/generic-hardened-clang.cfg -fasynchronous-unwind-tables -fstack-clash-protectioncpioxz2noarch-openEuler-linux-gnudirectoryPython script, ASCII text executable, with very long lines (417)ASCII textPython script, ASCII text executableASCII text, with no line terminatorsPPRdU1G7:J4}mutf-83e99fabe4ef6c81846827ff24f98ec655e7225b53b5a35c1f665b9cc02c915c2209fb8242589cd83a07b01025db4b7f567be99c6cb410ebf3aef959744227e4a?07zXZ !#,ᾧ^U] b2u Q{LY\/7Pۣ_U!C֝ !'Nb% 3Rȸ<]аzEw+}l UBKξ*&wdQ)cB0V"]V{//b5XImnWP N!Kς CÞ@p-b{ܳ2%ǎ dlZ>g|>i1=7X Qٶ.aeCuڸ:4VԀ5s0&Ke"fR >[ğlc.xJf@^SU$ FbE ]~̺NdU9:6/ SeX3zx1'{j' AOt暑 6 Уw"yUXX^8x+17uAgvA=x~/4c4k',r' iq_nm,(8q'|\gS5/pFm'k^TY᝱`U(Y2[ګ%g팤F)17أn'^xĐ?Tʸi|6`Hܼ./A}"i^%d0Mw("khV|q\#5&xLMEGPt-z F;V5-~ueQŧ+cB2"J0cxǷ낱:[͔G k8ˉ"2\]H xy=0/E]qN8_ ]i1_\ -ѽ,%V.<# ; 3mG}v[F?M.~ 7 AO/AyVw& cQBpX@H')0sRlK=FT~]HwRh8׵)zbDUp= 7pZfKOK9hoXTԸ@f@͓Jww]'MktE[grAq +w4&D :'X]B ]E- [JzѳӒhV?efւDEe:<[ę-ȄnNM_;FSL`<0 يWf*_X#5[ 5WwCsF<{z} ]7;@Nѱȟ{]liMۍ*uqqiwT&4JF ȝ&";yC@'6=kuql]J R84ZѳE8u1{T3>›䩐!aKz5ÍT`t+bM[_;K_q?ow|#z },m/Su<{s餭rrÚD. $ Ht!QlsOY|3"BVPr,fF5^Yy!]Xxس=iC T$d+|4'SLF#V]o)l!-zDsm&Wۊ/)k Qr83(CY=R!q'vc18wӟ,x|Bb,*]<Ʃ|H̀}uIC[D𐼶(w@1y[/]{AcPI<//O C2`kRڗF꼉άqF8HNItd`sj*e ՜f\k4$hj y}"T]y9tYkDHe7d羶O#FR vq. mv1`(Es8Kf|6{03H_IZVSn!bOI4e)ah&#ZZ5izAv+AwDhr EWFkT+Ks٪2Imbr6`zvB܂cF7Tq*H=uLH@]r@F3%+ pOJ2p}59>Q&wۇֵPTp=no Ib'LeX*SL>LL+)J:ʮ`g=bX㙟JAO"pX"UP 0n?Fu[J/mn!,|"n[^P 8;f=/,lG"v֋MP )q> y쑚1öbcA>)"ݛ|) K 2Zf5WYY)jyi4y0Ngtצ~.1yѧ~s*VX1'C$RKRn4,A(9{ecdQO8u=MҗUfJ&K}7;sYxYjTee_guoD@pkFMpnZl|ӂ3'Ōa sM>&]1kj̀X6z( Ʈ/N3T2Vȁ3.DJŧ'7$:#O)Oap_3aeVߩ N-pxԂMAUæ0ߌKH,8 KKTܫ/,B1*a`!;df77vzSV,|a"?;nݓD,:AG^Oc7A1{ YʨQzy;432 +߂LTb,t# B%s6L?4 Y }U9Jf̯~:1 ȈH<k.އꮗ߯i"s^QJY*Oo@Y/䦮Ci.%3_h.jՌKI;K0ʶgz3HyԼUUFqeE~-$^:aXBDpة1{[gszkkkvdk>JIACvNm= a /h)$ mɗ L1 0Luͷ5J֎. hk,+ ,T,e'X|]Z$TIO{FK%w5ۅ!Ӡ)O[Ϙ4<ٜe0+sC 1c7ʽҕ;աRj@/Jm7Mc]j^4Aγh5vfn714T#G:7@@|lgDͰ}_w]yx48McP" + g{ U:;nEM#EHV_ipⶓ`b9BqJ-y-7G/Atu]VÞ'i;*>C9gb80ɝ3蔃uw[@ȇ1.}ʝQ5W*-QBB D;惲i!쯊VĴ߇5GE(9:rb^[mpqM-kޏ-2 qûʦk@Wy.ޔmuWXB L>I-`7d@:Άo kLt+{*S5cu&c[̥&o J\^gdrVS>oQpCЬoj>ڒ+0"W<3,["<,}gtNg/q!vSIriNdSzb Ƙx:bWVXJ3(5=rTɲvX(`^{np(O C!jy=Tl?ޚƔl:mG*utl`5gυ$Po, qIpIJ%| ?O6E.N<]\;w;B C yyW[ 3M)}f{m6M26Hv CzS  1V\lA[i~My`j? L#}C/!|7q-ZkßZEp wL(kmŌ7zhSگJ744P o\brhcRYnfXyO\F䜞ȗ.&= gՁu3gʐcM:+HҸ㾜Utm1Z_,T(/ZJj~ OIW H9wb)4vClC-yO| l5|`Fr ~uξ>2Υ3zdl/?K & 7rB3'a )8|LmrWV"!2:8[f6[jG,GRPmf>V{bʽ@8;{I2@EzrUMŏ%zKCjX!|OH Q59іj%„ U!3yh\3g,`Y};+`.y CxgRf_g  ǧā@Ե$ۙrd:qdT6?`9QIIf {J-0K/?Z 1*GWD 6,WN~Gu\;9EiAlÐW;I0ccR^?C (bOk` -e1;@\4;~Hqͱ?v+2FLѠ6Ky cԌ\1≻diEfG!P0/t akyhF١+5 +pandЦfrP%qP.aRA+Ss9tcGlk^7NCAU*H.tʕzc'hw@RE wA}]m@ݗ˴ M2 C.(P5Vh!-6qv뮟KX<.io{о^h^9!_L=ð)Oc^qD d~aX7[+} ܄FD6i;us)S|޴E:v;DFd|0 JrN)EX`ޏf A(R9g>zNȈY)B09X3g;ftwF 7CEe+Y&С jGCtޘe@J8Hil-7%J.YF)^[;=|v7uC;0C-EO#T [X"wGEH 0&KxChЦ%ݎBi#n--Y>>`A؁Dyz[cʴ{mT j8Ģ8k`δ1yo9~ b[vcD6 Y} ̓)\=],zTD_s'`<#YB"CKRJP++Bf~މ#\̫. R?c?/\b{. B—U+- Ĺ0h,ǔOAY' )N[4Žfw)֪n'1mL P%b˾BTMbvw*k~OzbhR/Rg>\4T>KrR`^n~E!S2߁}H x;@ ~ 7&e3T!uwXEbCՌבPb<`4rrKjd!b1:o v'* 9ߨQƔ/sVɕ~h3$ m+8ZD(JlУ>xWwҕ:w P|<:PO8X8$I屋6(<)H.u̠Iyi7#S^1pEb^^r;hA1J`p{Zl0(UT&Vd:>˹G;n^ ޹/> vMoYȈts&-YZuHiOkH[˜~\nWeH[5*T֟c]MVnkᕁ\!!o9Ytՠwؐ)tЇkLVF T9*GcH]By w/`Coy+}k]z37D0.lOfuFJNӂ5;\kw>Ss$Yj=ǣ[ht^]u."}$(=ػm'C׸tw5v"IR0ߡp&0&b!8܀hllڑ0(oQ:̸j|Ԓ~߳~-Cy2Bw Js|%PSO=_TP0-ߥ]MڕH^ľ 2h!bM `Cnn1qCA8{i\sW{WrF Ť?]E0y0̞i H+=J$9{;o|.=QK ]ⱈ"uzwЄmjÃݑyv!ڂa5o6۞Oۍp9QJY֡)[iT]i.vCgO(QKƏ%d(׃_,H\/#y$URtS6ϱ> ^d |GlTsq?y'\ 3O'e%cio 72S-k)j,@DQ^4W=㺱 w ѻљnX[ ݟ-b_}!Ђk?9fT ^&lo |FNZ g7Khl!zTg vJɿpQe~`cv?'Q /کյ3ݷ򕙛qМFѻDr;ڍ,\aB{*ms*M2׾\˕뗭~Aı邼poK|VpHzvO}w}4\aʂP:lD}!.w.(b%^茱}⌗a!M}V!QtbY]4+H6a`*лA;Ulj5+̓Q91]Yװ+#n _ [z.ua+ <>h웿r/P@׋1~ v}NLdnဠ›v"O%^NT`ɾ2ҹ"|Gރ?]A-X7V x E[~t l~$ ns?< Ml- n_iٓ.,|Vz̐)5 )̝lbmΈ9t $ Wym*'Ge|o.{0}qd-Mma:> FL8d~x|D9w/V0-`wg7r/ߦ]^Z CJ>Àf9.ME:4M n`5j؇fK!3l6zyFh@:;@'n; ?uA[hcETEY߈B{ #9߾)bYKP@^8Ɯ&9Qo+t:JEex!vR(Xa*(|H hЗ>wY h .#D"AM[)Šj̺ps3kVɤ<0l%ҪA*6hOsDS ?6a4 :ԖD̎c§EfTed/VGKGd#o)&훇)O&O+t<ưD(u?;RG_r|ڢ2̤5#3|M/A?r|хj%78$>Ua1:eg6[kJ^$=)N!2~(: ϥY^ xV*=nCsZ þ#&3lSq3ƫaP)ʠɉ3{ZݘZtrbƯS+p!n؝PCV/1URR+S!sn*JXu3}Q}=`jYpX肦gAY5MDZNz wh&n R x24Po״"%&앛U>-8&NOHSx 2clMq=7 \t,OM\ dV*'I`cѷC<@3tfz4]:Hh䘖4c,n/ܞj'{R w~!' yvX ^Κ8%% CHi֩.GfS~6_ t6 e̷*-J)o@w\'e)D%әsz) 8j:/HZɟ/ @V\ZֵLB^K >;)< "&zϨȡqaKLm+s9vήYq";bb zUc7B^Jo|rڞ"-iż1h2b}|ce7@R2*fߨڴ.B].7P֧en"ز y 7R3QV(S&,k1ۺvMQj8KD9ݸQ&~z Łcw&%…27tۏ Vƴª*n^^"G*|k_5Q!6 |V!Z7e`I19SWX)@]+tञ {uD_EMگ7箇i=F&? y-3u7Z"byae f wQ]n/`uF-t HK&\<_@MӬ kLѪXc`n-i ŰX`|]Krw=ם;$ǖʍ\o, (ޡ Q.Rm1Q`=8/Gճ]ul;+61Aw"oUB\; ['x7YYCtKŴvuR 6 ,L{I}(M5N fE'0W>D?Huho\MQ '*]n3 #)-kʜ'gip|e}/tW_¢^yTb( ߂_ykˊ^Vwu]y8"NqH?N87([%U{6qs ־:'aSA0(~{N ,ʚ7 d7Goa\gQInkv 8NFe?fUS1@O9l߁C8yBx= ebxZV4A՟1]0T~+qX*j,dD8[f^2{l>f5M~+P1O\z)WdmcQ!F۸fB,#Q xx:|pBx -77ԑШM. Bu! &8E7l5q{h &6-AG&uȏ^f]I-w"6"t`O)t&||>%ebiT,9}V'g?#Oo ,'} DA{_uRg/Oq_26K_\ Եp`ӬZ N t[K5ga4&*/NkcUQu"fTkH󆃙cGUp=_{gHjom'֖oR-5pB0PjUX3$%v 9QHL^Lq5;w0rD% .[A)ѦP!>R#CBβ)lρ[RlUOq?×r|ԩ RjlID[;tl_w#gf4렭^ntviǟ! SR}$nڦp>) ңZy[//J7Xߢ[B&fWS$_&>hq9ǩ'} !zW{jlq տLf@ 'y{:[oA!RVmpڷ@k;Y{ T|y@rFYgtB{ +9 H_PhxR*|NkDO3k mRh/ }3--pOL"*J(såcZTojV [w*#:pZtW9|N',2_U,L7+(%W>YY&  NcLMwcǞXPNWr7,ŪE=IBFC1Ys0NTT7NM+ 3 2;.#9Ю;w$JO$24u3VtI ;psb צ Ox/w qMZoﮩHM6z` >w*:f ^!U&Ib?UEu iIQU,9t8vM\؝R2nQ-+7*VT-[OA,mYt!dh81H[ !гjF{@:@>{H?yLx21Xy^i ͹<|nX(Vؒec4x쉈} TO 'e#gdc>p}O,fK*v܎w#$'M|T͓c2Ǹ,JMAvVS .qΔUfNt|uU݁L?G91lS'$HmBu[$XaТ%_+P 1 #aP >:onG> Կ9UrS7Mt<.疌w/Q }d@>Jvd|ۦ1icϤbM1߹=j>`d{L ESfڽA$ (9Ź8Oψ[!+>bZc=;[7$\n?9J+]m-5ѹ9I&h XoGWu-lBIjKk[j&aaWm HѾ$,D8MPn4 V/+qN'>f#>\,RG]o5ܣ/Qxee^c4p8ky{(1EE w>Fc s3JwOo$YMkytZJջ 8? 1zz[bhGm7Ϭ#x1nGr)`7O''5I ʟK`,xa7*>w!CZK!ZQ  oH`I] )b%F mcҘZd2EA$S@z`yL=TEG F=y rXJ4$Ud^M_⚩Wg\ Pc83gk=x}Un2}ω"}YC1)3Ht3)؛}6SH sao{Z>GcønSQ G :w~Mbrۧ 3vٴ0FR%/!")/bMmg{rN=0eխPK:3reż_`? sd vXCW#j؀ZO> oι/Y3@m%ӊ2_ls|qz.0{4;QR<$fl n#j3qFqXZWyw&NE>C0 zi]בcԢ!R!q?wEC1UkDz?QA7<>U p'8R!}>Mb˞ܭGRč*hű^%+ԡB?B,OKZeTĖ8|)K?Yp 7%=){Db`FehvI#Y%h9VwDu,,i$8U飤拗X;#RH^ʻV?T2ؐ61[.X^緛B$Rjߔ%WBb$sT4W3d 3NT>Ѕ(<Ngm1RJ{ o}"FËl|=)RíwDUW4TtAe]ۯ`⿁pêİzo|OՑꚛ,yu1Yu$9pI)wu?9Wv_0ɓ+/1P,jYY$Xjp+qmsf[})"_s/ $yHřPN_"11|ɓ܅`lQ+m'lQy ;ڍ|K+kIOb  <M=&TZ~hiX&D-ӏ{MAJ@Qr-fy@j(ɩ1^;/%n6݆*+.-kj/)~@%f,*̛慩[n8$vp * !6aqUp̦46R`)EեH 1"#ېM_3{&mgjkRw:@nT \aW9p{5nm ;Do7S$هѪ^z\@,Qݕ`-Dyq,e+0A&ؾ L.IΌmMn =ɒ wx19#vMq ϐ霙ȓ{Ќ_Ϩ *u\58itSa*1= .s?Fnj8 åde,LW MvqE*"zb.}L(;<ŸA\/P/2LJ>  xZ6=1>WeCfJSƅ“:1󵳼 t* .ޫ@Լa¼ZyόE|aDt iGJA*Xko֦l.rȽdPs,IGF[e ujSAς4DM$D{S ׷=etxNsBjXw=ϝ)13%_p"Э5{}:'i9#Jb=a$y%1+<&Fg=bSVӜn,O۾ -dB@~UU;* ( ljϡdk+X 2B\L$l Fl}|:T4G:mp6H'2?/&Xհ'? Tz[>9p}W&Rc|Xi7`"U=Q[,i5R[^c-%;4@$]n@Unm23m?p'=K>j-Zru `EX8q3+9r 9(`bI6%?=Sn&Jo3!xO#@8o:M/da!f<+&=felhk+$hz|zA= 뵁4Ů9'5< #;Fd>W+cLA@'){L\?\PUo(?ݿۦ=-,E@gDO`_:]D R+&\?n֖rD> fmJ8*Aɮ|D?Rɠ?Jq3@Sw~ĩqf t('f{AE+ޭ5,>-F|qHR䥪Hy#^8)l;잟 O=>1yCȟ̄C7/ [XOS`'))/ZkѨԌ@=vwX`άD:퐸e-Q](/6'>j)e*B^_!; J6I^357d`Dʰ"mLZ¸j'GKdUJG}Df9ɻahgڸ0iybna^@]>?֟+h|`0zŗIZoM)jtyL*8q ZϨ%r"'`yMHAA& ?vzI.ªu4q4A4~dY߿:F&~5JG7%k fTpa V $W)W\}2LT= f[r̻ڞ]ohX*N޳u[C\mG85#*rR j|j*iMDQE<)ϏCܑ\LҨB';Ի?H #v-O*O>tA~O|Ea%?'E޷VWBGгXfӚcAE34@;bCGZ)?IS@#"~' xϸX-M T3l#з'U`c*I;Fk{&lhPI=!2/v: nƈ^+!6 :wcR ^b@pLy!8گ@^J8): hxEݷO ou )nM@lOQmG H [Q2Cgs%sMZnz;S<2Eئ;.#>kї4;TꆰL<9B Z+fKQP* ;'Y/FG{`*!U.`'MmfSDOT3 ~(>'OTALBeM2:{UJE#n7*CBbH溒+ <.?hEoX(҃#tHk5xor΍|!ePĘpCjk 0k`ؾjPS=aK64|H.mtBLdΠ5G8ܳݬYKMƑٞ z߶2T#\Iz@6@y(,@9eJ%;t<"xȾ%*u$"+cwSI-:ŦUlпfSd#4oAz#Y!@Kx fz,ƛP^iun!J|tRY -ȣs_v$W\f$r $%̓{]gA:D"~J 5 YZ