From daa4da558b9ae9150b42345389c8cba5be44ebfd Mon Sep 17 00:00:00 2001 From: David Montague <35119617+dmontagu@users.noreply.github.com> Date: Thu, 5 Feb 2026 11:09:41 -0700 Subject: [PATCH 01/19] Add managed variables --- .../advanced/images/variable-create-form.png | Bin 0 -> 80729 bytes .../images/variable-edit-with-variants.png | Bin 0 -> 140289 bytes .../advanced/images/variables-list.png | Bin 0 -> 77468 bytes docs/reference/advanced/managed-variables.md | 1320 +++++++ logfire-api/logfire_api/__init__.py | 42 + logfire/__init__.py | 31 +- logfire/_internal/client.py | 11 + logfire/_internal/config.py | 111 +- logfire/_internal/config_params.py | 5 +- logfire/_internal/main.py | 341 +- logfire/variables/__init__.py | 124 + logfire/variables/abstract.py | 1314 +++++++ logfire/variables/config.py | 551 +++ logfire/variables/local.py | 119 + logfire/variables/remote.py | 592 +++ logfire/variables/variable.py | 503 +++ mkdocs.yml | 1 + pyproject.toml | 1 + tests/otel_integrations/test_openai.py | 4 +- tests/otel_integrations/test_requests.py | 10 +- tests/test_configure.py | 80 +- tests/test_logfire_api.py | 41 + tests/test_push_variables.py | 442 +++ tests/test_variables.py | 3439 +++++++++++++++++ tests/type_checking.py | 13 + uv.lock | 6 +- 26 files changed, 9044 insertions(+), 57 deletions(-) create mode 100644 docs/reference/advanced/images/variable-create-form.png create mode 100644 docs/reference/advanced/images/variable-edit-with-variants.png create mode 100644 docs/reference/advanced/images/variables-list.png create mode 100644 docs/reference/advanced/managed-variables.md create mode 100644 logfire/variables/__init__.py create mode 100644 logfire/variables/abstract.py create mode 100644 logfire/variables/config.py create mode 100644 logfire/variables/local.py create mode 100644 logfire/variables/remote.py create mode 100644 logfire/variables/variable.py create mode 100644 tests/test_push_variables.py create mode 100644 tests/test_variables.py create mode 100644 tests/type_checking.py diff --git a/docs/reference/advanced/images/variable-create-form.png b/docs/reference/advanced/images/variable-create-form.png new file mode 100644 index 0000000000000000000000000000000000000000..ead4f5f702414f316bca8b69e551b5f15c402603 GIT binary patch literal 80729 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�cng&Ig(Q(884cPg6Qm@0S-NrtV^5N^9R( zz5HJ*^h#F?ldQbiYRkOkYpw=Yv-6M%A==mh(1Lj)WLNAL1b1bk?FE*&0q3JxTl3p1 zE?1uq?P_akn%6t4=#l!Z@lxeomQMwMYf!Zagd#+Tw?ajgrN?A-KEt{aSG*Ab2g27zioE2|1=+oF)4Q%60Ww%;pytxv%AzV!Q`nwgBplP_L=T$iQ~i zPEt}hI#_gn(oiF1Wi`G|O6bcDxFfYGs)a&MZkdlOBW3aO0Qm<&TaRPstY==k@4B2S zz^ZI8+LW%Zt6Mm$O6EGSVqSZf?drA2;mT2`&ubR_x!_Jc^Y`n`UHTSD;TrnTmnkic z^Xu0W2PRbGu8O#gT(?IT%DRV^tKiNrwfoyM7`8hN*K`*;+j8voD&MhPf54_9MUdm_ z`+M^%NfF;Ddfk^k6*&HBiNO*&`QbKJM{ZheOz7)3)+mES(qG-u9OcL65061ltJh&n z!61F3ohZwcY>`ne9s*^#TV<_{8sEywfL+U*)O}$xx6qC5Em{+?HPq5qE_K%W!rEAo z^BO}u{Gq0}=Emv*%gvFt%-<+g2W$+|FfnWZpicBQ2F=8VqM$$L)c5&5e8NI%Wy_x(VP%S**Em2(X@)lM zfQhEsd6paW+A=cbXdh7GLku&;%E}6*QZU09j*AXU0E4Hkt?ecDZG`EFH*6Ph=bG0} z4%{k%*e-jDfcZa8REB0Z&pAjt+VVAWXjz{<+rD)=KCNU+q1QYw)W4zdZtf%h^{ry( z5}jmga&iiXsk0GImQK)#SAk-Z1@>TkRXwmd^4ycGgi_M<-b!Zn9Rwk%eCRI@HvD{VKlENTbfz=(bz# zq0!eS^5Gi2_n9BC%Dy_tp=J3lxWGtbQ6)!~sXa}PRHu{t!&!%Q`?(=Yo{TJR8kz{+ z4leCaKsHH(jNa*#u$?+RG92dvN(G;uXw+bpClJ75yN@8Cr1u3U1>RtSq$=^!Afu@_ ze1sS=EE)eGX)zb8H7dahjBbTN#I%mle)?;^ZN`-8YHvWIqtlcoN*=t>%WGiM=*aR)B7kJtMvk6%2u*^w*6&!2N^O>mBuQ$KT-a>XK7 z%IlL_@JDR~v>=%)rwlZYRZolrl#qz{ezraCk$0x=1!K@E9wIS-x!o%~JUrR~qyV^^orHGaMCVeY zvIIn()F1eurj4tUF&KVwD_Nn+l&!u;l7f4wVf}tPfnXrnA0m}x zOd)T!@N>(^Z*M8rPo?a$ChpVI+A4P*8*ALnSTwsa`u5mtQcA7XN8i`yZq-~{Y2fTB z*h;+QB|d7wxx;HSFYZgJ$?eKtRDoivO8oq%-)Cl$J5eQ?hCU>j4Nc7QDC(F^3R_$H zbC8Pa_Hv|DGyB2)LI_)**Yo+PTlp=nBHDMTs;UkR8Ark`Yh_fjj4v6KsJ?;0+KPZsGG1Ao;SOHxad^U$I=%nxD52ZiuTKgh9&yrMw4)oS1w z`t$sA7V}=$KZsZ`K~n^mz5#lnld$M@U+Q+mBd(aW3;Zy|H~3hVAO!~vRFuay@Tn>* zlBu1b@-d`Cs{q7y^RWmU!A%Zw0~yFf_}CjDWst!1^6uc6Ob_?W>u+qOI^VyQnTZ+6GBrxq{&3={I6+QP9YV>}UHXm9 z%g3&@~&Vgd@DfPH#2khyk8DFamFOvxDnA*JP! zKK-c-nf>RgheEXFmYbwR_p~hPSJE1qn>W5w4V^ga-__caw$GPDVn*=v>3G+mhmoU+ z*(;Pj8I_)@Cdr)gWOzw65U3?Pl|f8JWFU!g8X-CvT5-Y zZc~-GQ`;o}EdRpWFRN_|c}OWMTi@CGAb)M9^qvE`nbRXDclTnxEm`|xln|vO`E2r; zk`^UjI8&=$V4$k}`AWufejg{gH+As3_IZBXCfvh3Q|Ej9R$m`j_f%Cqnq2jmz?~tNkLlb_}#mAd3G3Vu+~P&=BoX+7zXVqGcyyzXEK5%L>q$`I7o0| z44&xu*wyaX{wm=XCs(!7(`OB3UaXG~1qD22;^aKOtnmgugzFbLmbKX3-$f=R896x# z|2}+A*~H9DzB0h(FA*Y(KTh)@aqOb z`OJ@>KBk?+g)4ZpJnfaeqFm59(M-r93fhu3s zVPoF=`4OWj;hyIkstbl!ni@^EffGhIVc}fJg73n&z!Z*!pDIHWbHn*hf26wzi4XC_ zEDIS0Xvxu8yyKeS>kQ;25T-+e{qFya;Jte7g_!H+dE1nDf)fKi)v`e)-nXsk8*>Z= z<%gXF!dAeZ9T#?Z^=UB~Qb>{!zqQ1`Cnk9Mz~=)OPZo72`?AI?ce! ze6(Mi4ES~H!uj(D@t+wjnQ)E$Z(KLd@QAo7Lc@8@W9@l2L(U4Y4!|dC{YKYkt81bQ z;za_6%-ent?;j!H+TA}p32uqUy}LbQL?^+pdv!_Ktp0<}=if(AowId)aLJXYoYZx) z<_nK**UE_I@pj%59w%<=@vG~$T1~i69xfOmQS<5FcfN5$|I?M31{Oa73zcN|&LQX{ z;OV4P{y4LgW|kY((J_2??o_sE1$*vH$AV6mpOc(X^ED;xZ=Mi1yV(_-Cz-NFNuLtc zWZrc0)rH~&mQ;(*OpY1VhUDzq4R2!I27mstxOwwknC)<-_IuNnxH3h}&h>K+StcoO z@z7t8d77&Gs(#(OD#nI}T_b(SpkOhT!m4-1ye?7iq)aQjz>zp%`$fHEoDhO33C^|K z)4IC%ugWhU6Z0@@X7~f$zV_D|jW}WQ?rWEepuIe_CHVc-_50~!q!8ii+d3DoQDB{_ zm6~(AJF70BF4o;M#F**j%Z4I0o zs$bxd{pnPoRBRVFDJf~~dK`nqU6;YBKWhu4G>2(gvh zOa1=PFrN0GPn>s|@L5K5%2sZ50v8rE`N7H%6%K#rtrX^So0VUf{G0{Oz^!GU5b)0>us^?1HmSvgTl%Zdca%V>Vq~>!Yj;6rxZEbDq zR?a01b#r;neiJdX;iq)mdp)MUt>t@cye@i-#t?p87wJQI zY;Cg-H?yZMXlEOSg-DT+bj>36$UVHfFh-&MPCr>Y%!0(Gpy=|2bp3+Bbv9x`jC+8% zDDFEyoT{0^=*?%sQ|Lt3_PW$Dl*3sp-}C$M{5GYinOi<$`Hn_wuQgOv>#MIh`uh8~ zzN-uriz}VMQu9qpY{7`AS(?nZsBMWce=iF0S_Ah+nC=d6A43qo`vu zjXY4W2`pRbQec=B5Bu+B5;;uhJE2!Npp$8~18Q4c`8JA?r?VW=-m0}{%Opo+)7C`f zB@XAsG#P&v+Y`?Dt36%47H)ly-f7d+#6&u=3JSIyY2}`1DDuoy)4+cH$*0FA^*;-+ z$Ykggd;*nVU`MXmmHI2jjt-!F6&n}Pj5cU1NAY(E^#0j(qjK}Cgly- zo6@*8``GaEZd|kF11|V$GD6}-k0l1|^Ia}hS}#eQI(F>X#z@87lGUs}utq#i4XMhy zbP%&Xbl~0P_-Rd^9bOji(wIM}sFh9i>=5$jt&Z}@Htn&?eO;Be0e!dCys3)!@9(Iq z2QwGA%<$G#Hk{A$4T+;hmRnv6GthKByQ0AEIk>QyL`b=}K5XYunUHvrSYus7c@fEM zv=3%D6^A_&$HWmxAKi(}B!D0>O<7Tn&r{;H!Ipz~GI?phr&4 z2cX9(yrDUD#AkSFyxX=cyh=vsJ9hrU1*DH@jecIjvguBWtrMApUHP_1Dj_^oJojfS z;A-Lo^A(bNi+9QqI}NzFciaP>CUpU{6v)BDi=LBI7sSZ0!kj2C#RD{TV?)2h{MGS7`nHD$7$NZI6Ax&hmNm zNPz|}&D&ugJeshz&}#6+O4N2p5q%YwBy2zl1U8zko&6de6Nu%QCn z#R3$cUfG;3r3_Ls6mCuTb(y*x+ z0>zD7gk*L=A|t5YMwKDjIi`Wv5ZhKk`>u)LV+E}V(2`Q&7GOfCkZU_6aEGyLRJOLZ ze*bQ5?8e_6`%22C9ykhq zH*6MUdoa`-okMF%?4mr^XJk@BYUaR*X3Rjd?d*cVuNB@1y`v zJaqNmy?cG}Zxn+%KKw)RYd{*`_WU*(#Ees0_Yq*q_0sp5@LKWM|DS|yxSxN$8x0ZT6 z!3?~yYu6*Rm{q@+X#+F>L`;v#P2UDKjPrY zd;0Wg2=k*~2bUp8QfhT#R=cRF{M$F_OPBOPH^y~n@a!peFL+1-EC{szB$;c?VcoMD9P3kXiNYvHU+h2|=Js@qb z08+qjIWUlpmikP!`1IMTxu&tX7IDonrQ4T+D!rjI8=S8=0o$;*z++>YFm^(m{ ztkj1hxOO-x3*VpmjI5M?a};gR?RQM|UQnbqu7~j_HmQ((>z^!`Fo>*rqvcR?hx6}eV~~C%!!O&5`&5q!U2|(|Z8%RHa-G{@18m*dr`gRm?{z?I z!ku;jw1ych(PPZ4r+FDyFER$(<|=AW@rNLZG#qh%eMEvhBUSTeT8f z*d$5(RN2&&<4ja||CFD9Ov0lOD=B36YR5B5z&jAf_1Tm&fGL5@mj`TJ6}_Ilg@7Hw z3O#_Y$9S+VlZpb{8IZ{@#6S|t?+E)#n9pLiaccL8J&~A>Abw*QB0EKN4Fs!r>=cYw zyfCm_fQ%9@)Ywk43jP*T_y!=-fkDr{fMtTt0>_LF30fTRSY9J}Q_~SZFJ=A=8P9{J z=jRo%{s_Ei2Xzkq9KorgBpeoXmw~-uI!v`&GhKIdVj}JGpEmH5+q35v!O;ScX<}mH z2#`7@T;(^S?(AZ7xgoQ*TLyT&6--21KLklc{E8v74J;oHoMl`K%-TtjB~)F?LvVX& z)m;p*OIQ9{%Nx~=pQFLExvTyfStITv_ddOt4Uvi#bF>=G8vNU5iH=;YI}Ii*U{|7x z-7Ep17|~XgXmt1-qdiMG2CRF$V(xN(kAsaMH2fp5w7z}@iFar)#{`1jlzd+hnuykF!pOfJNIfMqy@N3?4_bELNW6&kgZheLuaJ*12$mzbk)^ zhX~m$XN*?JtjZrg9#;mAl|rkY&NCd4W|_-xnYRZ#ya}&|te1AJSY`~)q1?T@zO^;H zOG++cd3hO!3hlK~ZR|$14%hm|28)-h8c(t%s*x1MtQSv_N1&h8@>WAZFU0UA&Kv3m zE!yAx{Rpf~kJRtwe8tGJi@T;G&v#1;%i|cmykf20Z=E2%U2u@uDB!tgUb@~VhlyFK zBbaz(YtMx}Dx!Q_BF0=j-s$-H^ZgCbIr7b#r!cqD|9Gc3FtGkdpacmi$%d%=7=~BC z^0PcPB9ZOVw6iAz@|HekzGC4}TwlW>aXY@!`Ic?Vy^1HbC}v$mGowg@EP(8X=jDIF z$(GogrlzJZzJ@S)KkKz`jy0T>rC6AJ8WL=vJa&SsSDsJ*L?(0Xd)bv&rv|SA7e>HH z&(6+%xHstLj|AhiffI@3pIKKwhWt{h(t2ms`N4i;HG?5=ZLaneCIaq*Ppn^_r{6(3 zk7@B}PtlskhW!wwgqw9Nqxz6ykSjO^TEs-Dc0Y%P-^~h{G57s@6}#Z@@K!v7Sb9Cl z(BOd8aBxtV_k3m@YnjmTJ=k=FWvJFu%;;xwGI>9?1R>S|l}Jt69bOO8dp|Nsc}Yk2 zdP>~+5pW|k^~&rldonRJrcg?iK1xAlmr#Y!(VSr*fx^>nqQ!l)Fu$^-l10MhS z*`BSJD-`|GVd5HA$3ESexoKfB4t=aDXN`~je>fIU5PZna2AxWK$x5&M=`o&suPZ}8 z1Ailv5mRXyF$7E-oB&9o%tBS#&X;^(BE_IYKltRc5(fT{h84WvydSA6G4K$|!^ck7 zU07S{r3@j>YJsh6%)tcH`qom0jvUL9yT4EV`*0-Xmg{W4R~GJBnAB3_w!#Yv1Dmr; zSaeBov3PC!c7mjzQz47pcK#yv#Yg-k<*66#R zmFQ5@0xJ}ixwm8#6h#QvXj*!^3Xz$z(jX-Dsjb-E)%RS`!vhs-NWL2z8%c~Ay;#-6 z7eesn@k6iq?{%{1j4T@YMLk|Xzh7{m$Pnn%$@-~)z5Oi7=u0Z72XmXt$@GUAT zYKj(j7ZnuzfR@YJDm6J7lmVu}{a3IH%Y|hOtp`3RWswWD|K58>iuz0)R`At>u=@BN zA5E@~k;*GC&v7Tw@jJjq+<$@Ni?FaT zE)05@R+K@!4^UgkGx77=!TwWCh4L^Rod{|_WVebBSrxFn4yA;+O2T0QGmKi2kkvS} z(%sCX`ueVGqigJ4UUt$BxsV4*gv+R+&0yPG&mYVO+vGW{AHTrwBF~_ARKBdNM|7A) z=n*}87ClH2v<1fg`CH5qaxRuX@IhHwqMZ_vD;1N$L9DYP2HXX_$g@Ld67c$2Td1~WE?$(I(tB=dVZmANa{vs>6VK3W7J+#{ zoS0UFOofv0C=Jc)#21O=S-W7wgJNp{jVbyE5OFRypt&eieRT<^6U#A;jg7&57icKR z$>D!DHad!tsdDv6o1q{VG+5`a$&;Qzb&X?~l8Q8YV#)=ZFT|?RW>6j@+rQ5XAxCB@ zR+LF><(oI( z$uzKQ=G>UGF4_11?;bOm4NTQgRn38iqF?wis4ik@dOG0n?ckv7py>px$$9Of43oY< zV-y#3Q+BfMoi^X@15JWKJh*$uxw)n_^yAxhb?Fj56^eVDyXYBBFhogDJ-Y@ z`+4C>#0DeMc@$dI{IZKPU|~ad0}obe?fX-j@7nOV4UX6dlSoF|4zyLg710tldHWb9}0+DA_I2{>X>)^;<>6l;Wl>iro3_ln--aYZ@uV z?2Tg4v$tw?W}RA4yJKV1z<>GI9AmnE(Oc$o&FAqH;RtfD*}@vkxti#6e(CZBbslEg ztH>wl2KxK^njqwsL`HK3g;T^f$}x{&ax2kbV2LtD^2EBc74~{|$8YTSyrwds9LYSI^pw)ZwJ{ ztQPt%+1T0rL}j?V6~3GjQDN)g5Y`Ip#@wvws8pI(iq}byFJ5ySSB6xywK)Ofk=y(B zdA;lFE4zK6z-UgpD&8~e&+A7)?TpO%AX52qv6oBd~dz= z$H0Au=OKX`4Ns?5*8}RA3?gQ8aXE!ddeoAmy|eNUKv*&Fo9heS4WUQlBzk+o=p<&e zlm`96@54I8_UA9v1d9c4zpV&&hi;!ViYWURVkR?DXaCkOm&;FjH7$?SQ(&#CD)2-( z*kH)$7A7Xinuv-k2zBV$*ucglTe@}q`aWvvgfJs5gr%_c^HTo3jnsjRN8A-`}6 z3ToOs!KfQM(Nk#X*chC*_3>3qj`L3rznl>DprwzUA1(BcJLgV!C{cU9V2P3cSNZy= z`W9U_&Bwv2Y}?MmVE2sWM$u1;XE~S7GLSB8-WVCF(%Ph>Txd<-fc1e+iSbMw!|Eol z^AIK?Nxat(XmtOz0i97}b#8Fb; zs}Z%j_vq+g%A0$R^Zu+VbbP?|t^dZbsZfpd1aq;dSt<&!o_ca_2iq;+mU1BcAeLd_ zxRS01PI!RA(9$cc=76k^ja{NdQ^Fwfb4#!0fa({X*MCQ>)&&KLUbvjabWx&7*wDDfmGpAYAW)O-8T zr28J5g& z)k6b0R2%1s)}>^9R-wP*Sg$!)Hy~Ocfp|?pL4n~ekm|a1dgC8bQG0_p*a2h=tVD=C z1pEdDdzJSeKE7-Kej|Tamng@^#|se(0eKCh4h5=+v+239KpQNzJ>}a25p@jw3LFid zc=-DQ&3{Y6Va}nhzQ1#RwCVf&s3o>vnzNEkZfGZkfwtzcQI-ZYpCL{mL*JWx>-PB) zsnS7n%%Cw~+FYoSx%jQT z+`Q67-loLl%1PfKX|{4qDrICIc|WR3cy)m$w^*tuk}FC`Z7F(viW?uBk;RVFv<)W^ zE_%VYRnm1u2KT6`lTxfO*Y))1uj~Xe9#Z#{KhOr7sVam-aXryo?ULKBUS*a70%0^X zL|fk~Y9sME&vdtc;`W3yOR4`WuqNQ@{;^Tz1|BO|Zr`oSZ7LzIM$v!oUwvYI; z>1urP5|wKG|N1M!-$4uUpZ<5p^8c!J`kyB@|F;+F-g6k6JL|?qu(|xV@S8Sh%#6RG z_#iL61J94y<0AmbaruBIrMP8*1{EWGHvvHZzuki9d4qbk|FQoGXoHl2;+B!Iu_pGf zu`eKw6`A^2gDBeXCE|BIdY5eXxEy9?|SfcjW#PWBWP5aD-$ zLPy;TSOtb+&nfTe>1h;nTUa0=lHNYqrOb-t=jX#6SelDR_ajje448`st=~b8*Mxh5 zM@1ZXPl~=izrsuWxYNCICxWG(qi|lHCT@g>y<6IHVr z2C!~|SQWDZv;SI8p0xpbbz`c}THJX$zKHc`Jo|tD=4*S+qyG9^j@+wb$Ffc_SfK)d z4>5QiI3d=fZE5>`D=y{-ou(Kd+D)1UJpR(zsk0*4>o)gnd>H-2Si-o}aRRV+1lQYT zjE{jeLe@YG6=K#~fE%bTo8O^>RYU)oWn2yVc0E2L8$(TPZ3fCQkjL$9ZT~<~24AM9 z!vfpv7)FHf1LzMKo^}#kX5o7u55qrF|mu1A=QuC>-k}^iqh-{>NV#l&Mqx_(#PMYsLp!GR@;sTQ@a{7tcTGR^H_|c^74^b;Va&8yl-&X+4_>FSn%R4cHN5^$Fst zr*>Z;MK=r9<#;}(e{g$gSOK=}3@R560{UmL%bBXNrAO2a#Y9TB8b|hPX(@{JNL&_e z4WiB>i-P?2pxMTN@jfI(G@I2SY{8r@De5u~#c0O>IGA-P0&}lW%92qE~th-RYniA~sAy-Mlqd((WlzrD)s|yr{;Jr>{4S=~3 z8|w|1iz_9nQNc0}Mz%I}8r0#0X^cLTd7*2~Z}wV`pc9 zz}NKSC4dta$ADQJ<-rBapNNgVI_a;mvA2uU>XUfD(DZ1jlQNY91#|C9!(G6cJaEQsp(4Aq0u7Qe1t@dfdGlq0k?`ago27;?dq!NIk{Z{f^ar4 zNN}pZA+Z?V%Z>?;{zpTNb~5|tu2XKX1i<2I1$C?$-;pDK*3+Hc-ME2A{rVb8uXomT zQRS^+CcMK~dy@TYlfVo0+2WVdJ2&7y{`EV@*k!Plt`<2o>Vap>AfchZ6|^#ZiA$*U zoY|Ms6P{PEF5`KyF|2)!b4XygY_b}Go+31aNm%$JFh?`~>AQ&xJ*U4QQ=*^;hhA2I zm%*TB?Y~&S4?MH;6@z?R(_0yM^ne#wqszvC35GY!Vq3||1_m)zk343_1_nZyHC0{( zgrG^joV80kM83KoXJ~*6^aadWRnh{ZFW!8>Jj^yDHM=WFQL5)%TwE^-)IlY=AG1|F zC8r3R=9kJYrLWiwS4Ao4b7;+8%eAQa&04!Se)bR*6`RBdRAP}~Whcw10yFqzuokt_ z>%`5*>fCYps?*0pQBgzHlEY1@D^(w zuK)WyD#!Cld5MZi;pRgQR~nfYkBU&o-cjPg;02FU2&L*9m6u3`W{cBf%^V`pMBLN# z_HC>J1p8|piQZ&J!9{l2-R}SILLlgvXY);&oc8<6_uEhJKAZj(|2l# zk&4*yj&xoqzC?aZIDRT`_Rr192S&XPmRsddoF&M|^inS!{0pp;+nqGMV{Z>QJ;klK z75Oh#%$2(=4-={0>IY;l0EWX1|BQlYij{4 zyZa{J9&btO1kXd%ZsZR3`bQ^l?;Aj*U)e_;^YG!rAM_|F;F@&CesZ_AVpkcOkt`p4 zZQ>qp_W*Ll*h#H)-N30!NV`oDCxVEf3-AKH@Et~BVWLFam|+;P0amn|2kbGq+8v$| z<2mtX-O_V~MdhU%U4>ATz{+dKUIy##Vj}qyZCzt~Tga(RQDe)-tcqpd5_%M4=g!?6 zooxog&Z6o4<$iaXInHQty-(shd`JtO*bJ(#*{8I=dDdi-Q*~#k%lmUYA38QB$oU?xvzZ~*Q~^}5`_ISU_xXd=pA5Y>%XaF@wtK-L>4epV+;#;O&b4K&(T+W5LO! z{@YsO-{m6Z7>UZTpbTL*Ss2(2aV=oF?|!r)WGsnucbXnHTd)=y#gp z?!<|^9{?7HGJ{8Z@sUFD&DrJ;jgCA9r1V_{BI=jUY702FFas4j&cc4y&=C}nhL&d> z2FjCfPEB+QPIac5&uQwVP1szH=Cxhv*Ot4){~{{NvioCySH9nK5i(;3J6F0xId>-c zQy2u+*MQp_+1#lb)?bZs5%`O*@YT6avHnUSuFj*F559dG7|U&dmR7Nhca1Px0>p>y zgWkv!Kd=-l=sWd#Qw91yS;Lfv_c5hlH#Q_K&9YJme1$-DqPP04B&K`MXA8E3^ZaaQ zE&I1vBz^;S_K!X1Id#(D#d;gI3Exs(puR69H5%l8*-}>aO=42eS>|+dr3C>QObk5eh2gYqUha0&PP$&#SStoW);uB+Zgtt2Tw>R;f;wWzcT0>@ z^ummeE$%0f*J}9{@1UQ|A=cdkUT-M7*BOEORPG8&_cml9BXl!Kd`xeKl_EJb+~hwr?yx`w^yX8E%?Yhk7;@*ko7}!q&$v#$^nsEWcGjt@s)Xw zE0Itjg}&9zpT%VTAfe7ExpviVO5{#?n8al7qVt{Mud4!nsDvGdx=6GamMa=(L;rj) zFE=>niec59{|2{^xo(MO5lz9;(K-up`_|p}v#%t;;eik44Vo!x-#a>1v7Y2^ z{hJudu=ol&DqjvPQY-Gii=qq5W6&P{L|g__TfwJbE>O#Z-gV6DAtW!fGQ=_hihtV) z43queITj=M4sz+L=yB?0wLRltwaGUOp9O3=zpxO_6&Zo&OdBFS(9?`@Q+mOFA=`PY zxc9?U7l-h2=-*oA?rmmMVJHA%1k%;j^&jbjr4OLvr40%AqEgHN-wm?6#O{rm3bYCL z`H{e&o1pqUJ0kQUHXF0rS9mSa5n)z=xT6lWL=%wB=RB&eSQjiq)HKBnD?I2O7B9*FDfkTIl`|i zcN(J)w7xPjGOXGhXYL!)U@RU3x)Nv8mB;>Z5!GCP`}gC%g96Y60b-#q@ON?K`|CyFK5eM2NVrPm1jlv}}Kg z&q6Q=tJy^n#LJJt3O|2SZ?8dRPfrgTHU*Dhe0}uY6tKvE7$3-oa<7dLEFt{m0s{*c zqf7quMNkW)I3ftmb945=5X8Y>eSInr|3#PiCKT%JZy-|FZ;ABYg{^2d;Mz|Qo%xEy z-_wKD(J=swWcMVVFQS0a`%xHWZm9lfC#};b9Ru~j$n{@{W?VEuP7@6fpEnL z<=PmAuqUPlaYD@acGHIO80aU;Qn672;KNh`a71V%N_ybcqv#IsrPMMLynQy>wuYM3 zFZo<5$>?DepeLC#SS$)lY!BsV)wMCsdw*J4w>@4zjXku|ak7U;TwI?RrHT*eksZdg zi}Tlm(9q`ooef(=9S_*O*;Ro-1H~pLnDllR1oxt1Ho^Jjit%Jq=z0&Z=KcHkjsoHy z>&y5A;Lau$*5cH3=9)uxS_@s{w*?S%0u+f|J&H@z;azwP2cwgUks(p~K%GZ5im0-V zvK4wCYCZ58Ahz3*DVk{=s1aT($I)YSL6G%>kd2`A7v9|Qt#gc=oL$_vNZFL*M5e+k z_yj=QRm9!BdFxh^ZkAJhx9eWhAuARA;g_l<)jGNf%R2PeMQ(L`v>oPtzP>{Hw>(m_ zV>5-Et_rADE$Molyu?$D?iaXF>TSlmrLK<0qY6$2*kC1?Id&NU!hWGc;%>{2sZI>! zB2f_4PE-@55yE;3I>7*y=Y~EVbQHIu+$S)2`F9YPAHxV?4$R>^k;P+U^+A2a^>`}? z!=KqfwASwmi(5PF@nTisJd}SyVgN8{!NI}X8M&VLK3hqzrCeKdedOb#6eBLP-Fv&$ zN}{+yY}YMTMV%rCb#V3F(yrz%1}xQ&HM3W~1q9miRy9dGwT42I?c?e_>)u9FP5a#6Ycuq3JSkkSuoZv%Y?Q#8L+jUIFtV zB9~b4Cxol_=LHVjM4d*x4=S%{Mm#VwMOK{Zwgq&MGzg;IIkZNo_}+$&{boO@6gjY% zfk~;tv*>$;g61vb2(O^bgzUWs#@QPy0f78yV&})2tLp2a0QdwUSe=ll>P<#-s4YWg zLA2UpV(w>b!Sd3eZF9L?(;NNUW8dORCKie`e2xmz>8+9<65PsT!_vr=yldySwEQ2C zTyq?`VHuvCqm`CiyDpSw5XSbZTZgh9$DF46FcJOx9G<{eYv4B1?_CHYr@-AL%z2D8 zJGBCZNR+jyyg26GmC?V52NxdjA8HgNO!!1pw{8Pr3SvuiNiREEEx!Lihucl+M(3M?f&8ofC4m|e=v}?G0KSG`1LBq zo#3novh9Hm2J}>*2@lnqQOC4O6=EM{1>|;O+sAJ#| z4w@b0W}c}D+mD58XPl@Esjn%zXO6{ZmJ)tMlG=z;k-L?U$1vP4r-rRBEC3{<`$|nU z$LAojuVLhzOH8H+QlOQpdUc%ME7|Qu`y}%6eUHL0zdAWna{aHbabEwq=2^punIN+x&W;3 z>jUJ(R7W7#-RD*!6>*t2)zRq$g9LgYvM%FzFfmjJuRiO?{1A|#bpbDmso|6m!l8vPjI-f^T(s-6m=K}b0u zu^8=o(2M`4xHpfddT-yw?Om}Y4Wy!^vdFALB4da}hKxzrWC$TsGHX!TCCi*CGL?iR znQ1qf5*d;qBC|qd9@e=&?EO67=XK8Od!FZ<^ZNbPAG>yCtGE=hwfDH}~Dr?>=cZXnhoMnDh*#Vs^c!ag_AJ!+@ zTYHar6j?4Ls`tu1$ko}#CH5h@YLD13x0Y*dY{=#8Y{E(%yor3!E5zH&#UgM`iw>+V ze`5jYEJZYyCho1p9k}X!r3iRHxTe)g^FWSIxqduB0wpq$$I!^N9s8fSPXFv2_^hL$ z$Z2W{Yn*(^>H6({IktpLSj`$vPKA5c^eKb@b5S8{_pz5rSFV`w;@tw*(%rZl&BiRc zszjtRGwo*I!paKq3;vQsVYpiP5HpvU*U42MP+sGo9q%ors76` zvXlqg7G`FYe*W3;RJ?q-%-q4&+`@uqJH2X>9W6~2B%b4XIyXdks3zirBSSkuduL@e z92|P1^6vMCIN0{vH6NC1yZB>Fd7X>39t}_R_oMC@FD2^KagG;BlxB=%vTI<^FPDXr z_a&bewey}GbmB<3Ra!QZcKA-vtp&5n%1-IxqY{#&&Z?ktM~BbPU4EyUU}8E(yc7UK zSYEEPu8mIMy5)1{TdSa8t++$m#{#obZ7#LABX0e#t8{$4rnJPRyhax{{wY zDI4AACM=^eXF1U<%(K(ibiP>;oN(gaVV91P^?ev?Bono(RV;R(>N^Z1 zrKVb1nct!}zW8AOp{W+bH@7?@1&y`IVxkx zFX&8O&-NR|LXITQ{SvOabnOk+0ufqvdSFW$eg1^B?*vImXu5VfyZ9yT_2Hh8dq2wi zNF=(DY~aR@p9=cMKb%#9Q%y}+MRj%B>E>$k>FQ;YH2KnlRy6n?>8Ga*>1K%Ulssx( z?6wfu&*OaW!@+}?Z>|j?=SS)oLoD zAI%>w?Ea;``%IyU`Q~4=m`rM6pC;+SXqPo_&<#nczgVhAm0 z5jkLieR6${y&u<9{(R6bazuRj{aC-Pt!>Qg2@Ia@4;4|q>X~OMYtAbwdaJbb*^I#H z-uj=>7?(aSpgoBGkH@XZNWPPgG0{Cc?AEo!y-{i!5|e^P?oC-!o?5Sl^F}b_xcqxt z`d#agt2aO=IimN-!l}xz|Gg=A2WxB`9TQrSey!+a^;knzb)EWcE-IA(Bbq$k_ z9pi376zO7@ifQ}QB@VlfYE353UDMf`A3fw0Yr4;z-DOkf7$xAhqyg8BGn4(JpUQ%C ztz4YHwH1E7UTY+NzSGM5ya4ZsXl<@O%?FPkndDVZ#}_+vlr-n*ctJmK_QO*ai0zSt z)W(X!vR+9e&8J;|a=ReAh}j?KwTrFt62Bxii6qG@2ydwsrNne^AZ?VJ__>dhlLdJ? zgyQeNV}4^~3{Uq@mhz-5jURy|8=4fefvis9p5YW4m4k&8eY)-5_4;6cW)JMva4N^R z^!_QGP48+WwuY&TitHh6+r3+8itO-XGq57`sH#drZdR%+UE8&H=(?F%zm*l)^K&-c znzt1@Nw+uamU^<7+t`GpM1N~MU`D%^Ylx{&&lX)s{Il`O5UNu>OZrOI9`~n8DrQ266Gsk6xC8!Crq|PhR;$G z&T|;3a>;{7KHwHGX-E32Zx*j+mQiM08DHK7x$Q!_U4do`V$1B&7 zFz?UOO};^jXydv;soU`V+c(I~;D~zfsJnxb0cm~kyexEl+}7Q zH8s?_;_U#0TY)DZy8%y0Ob>sGUpPEBJ-12=7O%Kn618gvG(Hfj^p_ck{<%*bhK0bmglUIhJ+q4T*5PhQ3FRnGbYHxwJ3^FW^sTux8Mgz$MYt< zX4LOV8J>Ro`Zdw=F7hWfWExWQ}X~Y6F3Q)0Qq$|r~ zJb#;$A)o+4_?eal2^huis6;fBpBMrOcgG2=PAF&Z2`#`9^nq;R4j>@T^t@pp`|;^N zhBNOoaMWA1rW5g1Q^2*Mp?p-SCx#$_b%^~(HoQVR#6mQl@C}g7htM{>DTN+wE71cc z?;=%Fp8j;ks@LiqW&#=cGb+qbo6X3-x-77B=0?dMFJMEymcRNI+z$Xmry)7xB^cN0 z9MxQuD|nz572uvO3huSDB8Vn*baY&1?=@OuJ^hsNi7k%}SE&20zv2l>xfm0|Fno%3 zYRWjvw0!jIR}51$;l+cfJYR)kFRJccU!$Ab)~jf$=v}=IaNm~C_{wqUy(6JxtuHT#bIB|DM1w|Sqn#`)sVRF~nRz%s+Ax6Kq8=Ul;K+#Dw#1KiX{B0B^VF9>ovJa3XiV}9 z*bQQn=9Rv^3wQ)dJtnOn+Co`e)sOqyEc$T+Uq~kD-e1DwM4h`Em}p$DM@P4MCHU`= ze??UL2mb^u0OGfOVxWdXU`ljF(e}g8FZ4Ci55tr2CCX61Rm%t{;ZkBc1ElDvy$v$9l-K(m%CSZi3I$yQl-*6Ot#g?RAR;~xrSK@9 zu6BUXj5~r!9LozXzHyniA+y4%)2CHm>>a?Sh~iYq07(YISyMhzVdErAf|tz1y=Zpqar=5j=I_ zLOFzXY^1EiksZoOm!U0U+qn~6FvEDGZgqsR$Zx-+S$Oc^K|sw>j>WqAk54%PRbl$M z6^h6!8}bOqv-cEG6&v(2(XfA{m+>5GxcYjnK&iWg-eqvT^we`r8Wk^6!MpE0i}JB? zKS~FNBGt*oy^YR8Zu`@3175@K)NF}(Hi9)I-#fUs>jo5(d>qG?&DrqUvE$(_5YO>U z0|}$Nrkke^?UI7y#%b<*zbV-E#%5cwl23DY#=e$=f}?sMs-H?-LqnPOd7bdJ+;J}T z`KGPW$*}9$2QSZ;JeNb$((4>%6&<;M4|-;tTP2ZAC2vsass zj}6gxYa(zwV0ut|)mWKj{fz~H$2x~F3v+0m2z1_v#xa0u>>v0QF2F0#XR=nDN%I?; z>-s)8p;iHo*|m}!qG0kMzwl+p5R{WiuYq!KDQk^o4z}h#u-J?Q;~{b#WVo1y_o&qZ zvsW4l03Jj0%!`Kt(5SSuG*{;Mj~`HF;q_vF{oDf$e99!!7m$&4x3Bs2SHP5~!2Q7C zPOiVu^Ewbq2w3eSdIz~=JS|N?uJ!QUnw=5eIQQ-Qi*iWc@NyR;)@~z}4b(35?R7Dy zI1vqwRr1Zxi3!yX6HQIcm0le>!S935Q8wR4B7mjW+Wz(HS1#q7ckU2$D6IV>echW0NCSyURxVf#+lm+7rAm_nDho0u-5Znu_H%cX};_5yapBwV7 zhivBtyadD?J7MQkgzOBywLgFU4ELnp4tBMpon1SKZ9t*;RzBy;WaF*dw{;uV`uX|c zjCnmN4Dv9#xl&{<|Lhy9aFOh}Fp;tusn1V&A#9^k0rCvU^wj-;JzZSPv+f5UBFUCzwHHh%y_8B^xv9RlcgdNX z)qM|>7F-XV`vhZ6cY0{8(mw7&`aQRHLRixJ{VuqDtb5T?+wuC-$G3~4$=iu-J-%*E z+Lw2GlC#94K^bsaF{Hf_$)PemaqivH_Q1S1==k&EZiCY0ap_WtA-n^-Kgvm=V!va)Q!Jl4%@zRV72Zr^vlu~a|jAj(}C0*LMu525yMPPMb)DDUre){x4RYa|jeaFH3_s_~J z;M#iiLIZ%Vrms^^_3V0Gk-8xX`aCG(FvmVH9QY>nYp`s!9aavFAAv2$F`NOXA}X0Z zcG6N(Fy=oB0~2VbxXVZ5b5r8au;Lrc9sP(u91~}c zATxG{3VJJYZ&b?ggo1g4Gvq~LmOEe)xfKLkK1Nb-WvqDi>Lc2jcvk)@F{x?1`xU&( z_gZ?eOE{;59yt2y$=d4uM=yMlQ&hZWu^tT#6B82x&6g$;r=Q~$9DXWm+?rOOiA!OS zbV4Sk!$is=I0H#s!{-9-(Ib9Aic3%Ql#t=xMpF=B7%81=4;vIG9(omrynmjc1S0;O zL&FYeI=|6#U_$no8hCvZhtRs!A1nzjOFD{G(gBNt6oE$Q@LEP~8O-IvRG8DtTbV$b zywHt43}hsPJ{}FS)!;_?wMaBcK7RB^ZQu@35&1_MBu_1wKOvb$eTBI}Afia43_`XE zlpO7IHE5~!@bIXthPtst^bkPMe!S>)OOYvNfxGGHT1MNsOp@a4Bz1CTMziA!IspW6 z7d4ig+zX_Y;_$S@ZXvT;=;7O-)IjdoPm~iYU;hhZkvMDbe$Ux)bUYcETh6yX7yQA_ z3ZX{{a(EbBfH!PoZoV%Aa?Io`+lG`XoL|U3KH-89J&DE!HX3y$&bcZca*=+NuTf&S zycJ!voZMUy(GxLm6qS`nMn-_gf)Xme;=g%>_%XS*sTo1p6?HiXneao~yb^a(Jkk%G zn;mwDUwLPmgiZe+#kVitLEmOsR7Nx>?$aPQu0};QXh#n<^$SCTS|TrhfAJrlOjZ4 zzj*PYDRykzx4VDsFTH4d++>=|e6~)P&-8rtHQz#K zNpi>d79X2A_uGHm@tqfV@%q!Jwzik=nsmtuP; z*UEb|$ecIBTDp z;+Dq!HjSIxta}TQYVOe^d<6ZVYdSM+c|^h1X{cI#YBVt1F)58HChi5{FSRW1D9AE@(=R-GnB%0TW-v7$Z)02|8B*DJO{mMGzEe#R7!h9^5&uiw>p3_=Wv*4J-eWz1IfnSe zmjeUojMRPDV3Nue$Nx)+&m#i7+Yi)f5EAIh#KKIbt-bxP$BP}&mEeAc@)&9{*ruKX zKc47K7Gxk5foRwq{b<<20HRs$k97n>#WO`{yh1%V=7D3Rs%_`}Ir`ZPED&wXoCWV& z2cBC9<)C2PKMeV8Ac5Ow;UtRR@Hg`T4EY1=KyzB5ns1+Bj_Azh=#6-$YHxoi#a}<+ahT z_C_C8->J`QG%Tpo*;_sIDb>fvMMOs_DgcZ|$Ei=BPW7pUaH{(HKz)EPEjKgN**p$n zHaLA9oR_!uzmMOEZdCjt5TA-SZ>j=LBc@M}evS<_t_t`J@gQuxB_OiJx{{CWE#^bq zPfq>{>0HxcxC0S`(wFvkK7mvMRx%hMhHw}dceQB)a#JL@{Q8e6$-y`@vC@!5>(Y3O z{o&Pbnr~iG_d~BZzqZ7CIN0>~OgP$zwE5l=ZTVSeEy5dk-AJ4Tqq*-J8l;^1x<60q z3-645DgCLvz4?*J>3vr%+PquxoN8@TyB@pOCD>KYunP#h+xoc|qg4C)BG9sir3;#k zDjNj-c*E<2F$f%!cF@u$9L-!4R*%0>?rZxg1UDL+#NrpAv!Jzty%;hNjN*ZX0U)V- z*lE-N_9EngP_A1#BGuNbQ2vcqB^;yf-uAk4c|aq$fEvSLKjD!CGyr!r5fLVwZ?x=u z=S}}8c}62&(2)3Y`A*&AcJ#JFB;XHEz;;`6)W$AP4v2nY6qCzInu(-kC|bnR&#E+Jv^3 zqn$1+2G+kGjrTgwi*^$*@+<4oEOqVs2rpf_O$j?CtbD;2pXjaTwiD03*OaGlm0s3w zz{T70{uPguw2MK9`~=utrYk2T8tDdVF&L2$hRO6YQt}L_{NU0U-S&bUeev{2UM?0K{%!Js-1A zF9Ag`BZF99XuX9qQs5zPH{98q-JmJEq>I!Ag-^|C&;it!5R|@kcZa}i2Rz71iGxqm=dv93eW_$Ndr^9Gc5T><63icg5+u+~s zzWdIcWlm=1RFcFiI1Hy4ChV?lfA+9&F<5rLhEYiE!O54c3aJeXgLBFIP3k<0E#5rG z0GIvnZ%bDDTHC&gdK6F_F^HrFfm11k+Aq9)^GZ69m`&92+$dmW^5$0WD&}|VLTG&*EoBQ}M zmnGCX$ACVi_L(L+-+%u%7T~wUwQhGe>cob-;hjHY*(zDupR9HKn33`95`8;P71XSs zVWI|_H*#l3c#$8VjKGYBCvXSkR3Kz=O`Pj2DJ;TYj6=Ty2k`^q;s!J+HVp=vQSXO8 z#^0!V7INyoPkuu4a&OAP(v2LGtn-b#c){0ll&-bh#qfL(u%NIJYK2Uvm z%Kso|@q^r)a0kCXe=Qto7Rq-T`IAC90FPu0GFDGms^|#VncBKUr)eNC&x_Gq`BdtM zdJlGonNJ&Q9&u0g?w+VEZMSCO4Ij&vuCV-o z**J#9XvhVSC4Ru)TbjR0py|zXW53WB=5u35KW4|(m+5^EGTM0V@QLp9wB3MGHvaY- zC44T^uCL1hi9Dn@I%6qeui?!>{rpD*2ANMehAF;78Vpx(O8FK59wS}lnBbEA;4Nj* z9GXE8KNflRe$_98N;`9vZV@E_t6R ziO_RS?Y?~$5>QMq-rciXMMhdERS*0?@N+>T!rU43u2m1ow}QD z>=|^XFb>REHt~mXuOu?sIq{=cFx#~kq?_S@6p0J z+x5IrOVwVNivt2N(l^T;KO5*=CxuGz)62t&>e!hxiyxS`OXg>QkUMk#L5wF@W=Qkt z)~zdb%S_>e8yqAQ;hX2M;fb>*+%We!Bs8}7RYLaR1OinuO!k*hMf9S`neHww?N7|E zhElXtHsl~c0jIA{^6a|yEf@cTs$TB&{r0-w7rc9Q(onZ55i=3g9qqM%?f`77jTTWh zvCIMHJ7Ly>^P<;TCrbe2Lcp&R^32C+>Q5rEbRUyOe>1$G;e}k+$B!7Tu40TPfDVJL zfs~Yh_Wa^-ODIdbMqHUd#M$Gnrc&0Yd|P(?nf)^BOzG0cv(eEpl_RAK!Oiwu>nODx zQr^>6HG)S=_`~`6zT4^Z=X!Njjo)n9w3KPuj@;h{Q&oZDhS)R14$^BOc~_W3M&-jn zY6NF8BO@a-wLxtzJ&g&#bST^YXd}YB7FgKwHWkS|h8M9afTJ)h*eb6yExN=#?{}2U z+nOE-5DZ}n)l;8FM3J?;*((pc4|rLawAV!>Ik3@*-ooe{kdL&>J(KWXh4^|yt(mUyTdJ?9wi zDz=Qe!+6G7^7fo%$m!N1k6ImTZ=;L5g!;Taa@{@KH{1#2^3z|(&>JeHRI9a~<(21Rj#ep# z;-Ud}*15CReLi>|Lz+7s7B#zA_=i7cTi>c?xnB*>8vD&<%O|w5czTu=6c}Rr#jxpM4_+12R7~N?5!Q#_>Owx2Gw5@Hu8$W*UoTr`l8Us^}m0g$T4mcKb7y)^=)n>^!&XE9d)jh zx^kOF?y6hG?qj1c#dnfJh$sAtAmEzCx}bN5P}GSs4yKO7rCzWV47s)y>MUO4qMzvV z5r|}`{a)Vd7;A>z1+ycTx)3O!%Bg`;z|nL3?yT~ELmr}!{6T!*D@bo4OBSR6Q@((Mw^ZKIkphk#wYe++2Uo6MMMl;2*bfyb;K6WB=J9=m6RVHpNVwlE z;vAd&Cr|@VH-B9rQGuR$#`3L)eRprZn{r&TYHYa9ZXd1QiSyr--9MYsmdz(lSH(qy zjz>mV_*ADa8^EF&sYTagag9Xp-xL&HiR;kjEjQ|bfa>2Ai29v){qKz6zWCkEm;Jk3 zCjjll3?MdD=D0xHL9dUn{FN{>6vN$1H0g8FluaR8EY<$ zw(Hyl+{45YN34m?vXach?U}U9`jP!WB`#n7Q?-p{=gygTR3+Rw)K?r^D)5QkG6b|8 z)20_D6N|whCDF2>VvG4C%N;X1n0b;MJgAg$`6R7TY@)$l%>?OShPaqtkN=3wt+Ym&?x61JW4J z14lJsg@_6OhGOLd?_QDxqb;2nH#fKB^Atp4bY{bIN2Hh$I*Ikqya4 zO(%EqjmF|4`J>ifrQPjFPeVq~j!n=vWsO{}iz4q$^N?CiSu{TI&v+a8Cuas3x}YR<1;CNIEp9dC*0gWl;c%>S!aIorEid5<1bp%)I<^$STTQY;3@2g zxMji>v9juhcVlVSl@hH*e^FH-_r4?pGO;)*hL}STIws?@EfIf3V{_-sVD&%W?%BJ; zrEadSq6FYZ)3BrPbp(TPVTYbJM=88;*3mRP!xT&O*6hze#*9hiJ-FL6a^gx#N;j?t z(5)*yBqm0V=e-J&@E3kCd0E)DA-uQ}Dk=g7#uk9WYgB3}QV&@QMf=_@ikNUqAU{rD0p(0sv^(Ztoa*jk^ONSLWY zXQ`>}0Vf9_VV&iErgNvzKEcA=4h$rp0j+!xDq1zdj~B2O5fAW1)(Z=|3R*QN!hT(|1_c1d+N!HB;lzah z!ftkU!9LgnqC46O-+7dA(15BwrGxYo*b*Q+eH|B2mSknifiS9gpn?ErN^b-`7vTsb z{2+=*phwxH^0vFX`~Ge&7>`5y3$R^lC%)_jlqkeb!oFvY-^7N%jm{JM_U!|GeO&Q= zLvtBZ_!1Z0+{6wYnwXx3D8>sk8!iXRTYTX##XVITz_tqU^*~~AJ9+E|;ec34k*{7} zUWQ0s`x2&cLOe^zU||W3qoKwZZ!yx-v(JvppF)f31bD$)e1)cX!tM=zfB)rLMB!`= zamX|K_QP%`*8@9>c!^R5{Ph;JOPRP-1<(Z64kWlDt@_8-!n0l&ri#zv6C7SU!%{S#dW(5Q<1sJ>igac^*^3E9%hYK)7K zb%OK5EzBVEVB$Yh<}GpHz!TKV+Nhb{l;`Fk~*~}u7Gv)m&gm6 zU3vxvknQwCXf0U(-;qi+e8Yu=TB@WoS0@@K9w}OI-2vVPdG_qwTw!ss0gN-9>By4cWj$Q|vtK+kV0`<8VDF2+u>edHX>9azF=|;$=)}=Q1tF>P{GNrJyu9zob3*5l zsHpPgz~<3rk5}Ybdzh&M&LxzXD<3vnJ@{$Yijy`o{iaQt4T%tYfm`P_JAU7Fp*aSN zc$-6Z873BB!~j)?-S1IAPDbt+98zQU>bjw!A>9AxYxCd%_z5W%{uK5)BxN4>@?d*3 z=|PbdL(HaAErh>M!#AKKz&`%kR;=s{Y+yI(?FkX*yb87-ndZa8lZ1F8FAdTZAo;Mn zEyOy2h6d{1Y}Rjy$Z25@z$9McR(W+7OnQ{Sivs2uA+3^FU+nJarbif>OL=I6rom;V zs|30n7-s1btB-ZrZlV!W-STHwR~O{OnR{Q-c|dm*5fOnuCITVyi}Gxqzd~JtQA`Z@ zRm5vC|33<3|I}R|6(L?L1FeYP{O8^JXS~n>&h7iFVFe}%cyZsgIIqw8@h04e5k99) z+q3c+D)zszC9bnA*t~P6_}TZv>PDN+OqZs5?;dJ2G~h8vF&>fZQ{Aq?BuQKahJUOa z8nbJe4!(Z#X31y7_kp9bY2kd~zU!p2v6hQkU55z=E+S*VH4n?x`)elMu>?aUQ!6=k zEU&$KyQtHN>^t@&8Q^9U|3-!VC(D;c;=ShEIZTgOZvM(G$jHDDmF$2S)Z z&2gjU3$uWs?hTJd{JIt%Zz?1{kH(t^PGQ%)FP4JN#${HpjM(3+mkEAQs%Nq<`oN)M z7g3e^pcaEV7ms8lXnOdC30h;BcICDy;?;4^83{7@&lTJrskCGdCw^t}n`z zcEb+f`Nz5PLc{M9%FT0a&unld>$mbefus+ijXz!Pko>D^CD{nxz8^*EXBIzu1%vWm zZZ^5>E+%wpk9$s1)~!f;J(=G64c054smt}fqa*81w`N%_nkpzHDsHoe6+8u*5&Z;N zm;T$~cs>c&``Sl1dEh$_22uL0a_X`d3J_4FVRTZ6@eJuWpC5|;#>g1adu%DsKU zth`RwpTTb1_H)q`&H%Ba0@^7z;}lSRT1223fwKq`>A^=JW?W#0fVQtozKlD_B6#{I zN>^EZ#Ag0aWN72>}4s6l%id|BUv*~t$@8pxR$fWKjzA?igDAtqH`6F|gfDkhMG z+T>OJ@iC2tf5?xkZ(um*qTS4om#L?{^u{iZkGGP~dZubxPi4IwoilFBf0XIH=jrMb zr{^kj4homjk{B+)r(I9X6d*mr_yiEF8k(ab1NlK@M)*F7+<|vtVPXHh`*NO75RqXf zf0BvYd=OAP4&%efE+CKwLXVTlV15xTGm*oGv*1dxVhAjVCqpRYPjTqaVcCMZ^ASib z;EU+EUjk<#!FRq2mRq>NpcFD;UPT+hs6~7x=2iTh13&9=ia%)`&LHg_M=w6!m5O5@ z+vYu*UD%>cH2W}|X_*viV+3_i;4em++|j;ekLfpfvh3J8@ufSrtL0lmV@qycUWg|~EjcB7#z{W2 zm>eeS@okHW@yx4X9Q=IfR%!f9mIrX3hQ`K`*37DqQik{J#xfpfIGCBw0_j4yWN@AO zNFM~I7x@Min8t9Dt0&qQ)U3A<9}=@=Cr++fQ3e09hE}B&16~>%b(sD@FGJj>ftbl6 zcgL* z?}ADbKmroMB6#me)b+eEof#h?T$a^rdyPpl)j0OJ0tw80-WNBI|MD%ik(9WyGLsK4 z=Xz^|6pFT~KU$h=`G5|H>e5XPNtO#Wt(h}x(Ll61!KRfzh_fDXm7C z+k(7P-C|};^N#t(xSKa04lys}*_?FgZV+5KSobtH&Lzr|rvic(jH-~-Ioig%HG`5ursZRI7u!yS*9y}BJTN)p7Fzg-$} z0DVS?H?XAfEWK(t&j$eK=?0pdNJF8ZheI;9nm1_lR{T{*nywTUdJyu7`;^3PjCs=L zynnqvI`R4Q=gw{9JA=c+MaV@wBG!_?WJe~YCli;Gb8_@dD|gU$!F6{0w+b1kWTUbW zIkOkN7;jx;kUY;)6D3%3Y3@0CcPMB~3x4K{9`TrWPFKzDO1yuWm=_O?1kns76rBTC zuj6>p%{(pUREwsFJ+!61u%GHnCQ>JDf5eg7yQSMO3Tb{0QL4E`({ro}Nvx%PPYg08 z42UN2@KnC-pE6!U4&6xJC)y`IljekzU}?crGnt3?Em9%CV~#d9>7?5qum$Q+h$JN? zVfG0e-Iyzc5b+wrGao-DMDK~dbf_Vi#!Qp0k(9&TC1Goa3I~T;CIp{gV-Y#x#N~ba zlJv9Nm%dhZrNp5pHqurl|L0z>=>!;87>in;I(M$1$q4v<_c8NO)kUetcC8Ho?`luf zzEgj`|0|gDcJ@m-m%WP(#13EQkh_?J#o` z*Sa0xS*^N3akW7|U*K7zz(lx|fg#jGm_8FzLeyDh+K8bem@;&oOy>i+EGWbspT2Y%~MC6uuy7@0TBvPV7!!^s;-4%D}=1 z17C3FsUu1wnhZa?b&O9eb}OImAWlI<;+Aiw+8gMPgx7sRMjV<8DT}g3)$7+JK0Z~A z*;4V)t+2#>xNht#OJW_|TMX&*-ESQ)UmkmU8?jNfyD41<4m2Hm)U1jHqD3s~ zB2(QaW9}(U%$+IOoBrpIu!D1My6ti!a|`*4+O|g+{qW z(QP3~vlvrwp>NT_dBjx+dE#GsZ_zRFK#PsGR#w`b8I?I}Zf*Rwm}z%|Hg_P~G=FF+ z_ZZ#ctX+|7r1c$vqt6|?YZ46>Hr|V@epT^4q4)@3rc0T2u5jx$2WMJlTM92GkQcKs+dB*r_H_(;6M`Ksy# zGBEsYQlSk9Y_HVlHFgDm2z;9f_4mk1ycI|RCuOuoG&s9XQ+q5gG#*yKGkx}J4@Sf` zRU@Wb+23H>F_e?IA;!h9Zd1f3!8_q+XK5ApMCW90)nq^8_E3F7aD&{yG3$@OK#%3c!pEMuF8p3$ zGTuFrP@f<^R}aiU6@uYE5LNrs>sOU*4|=ke>3E4-rp0D>5QdiMX0}gOHzWU_X@4dk z#HJe}uFJ=$owhGF)6v1l_rK^Pn z=^!2F3J$erYR|bB571PgJl>0xNb>UOpm<(`@7LY4vXAP4~Akaj1-${&mXkIp@FaVX4p1qS{)@5zE;VbPc@>DXZV1ZL_G{ zQBj{|;l{cB=ENnhK;UhPRJ4q-0?z+u2-*L#u#Bh}JV8UVo{y|3Phh0~Cq?GUkNvmY z@|2>)KgX8Ou6r@i{ViOHICK2#$ijyX5yOu0s;B+WaMS;XUw`HE|MR+f^|JqE;xzF` z|Lq$kXAdUcym=E|7RQy8K)uFmj~G~Ve^yiwiV%z#o3OREZb5GiCn#5W6~ZkfBj{S- z%uBEexbXGJ%5&ijf*na{<3{6lmsmEIZ;xjsR zs?r?5AX>l15Ne>mQ)7PV(yae4YY+kB;^JVA#SR@~1aytNF+vW#dMHqc%vTI9_=9)@ z92syc%7vE7tqv7{G;Bjo16N$aY0)%+qLj#V1E5Sn_wNW!Ze;dhc>wOfD~$4ifzT;? z)M!6EAH8ikV17ByAZR-6QE|eIxme7cf`?ePj*?I-npnyXo1=C>Mz9+?*ZrEiTd72ixLfK7R5h?xA@l$^Mu~E19>cGojZ=L~ z6u_|N@bdCHd-iOr6g1TV4BI>N?4p1rit1>t1Wf3RGlXP*lh%;12h%r?YU7WO1S)IBYZgN&?OWjDE&#> zfnA`LIi}`e!cAWuo4bUNU<0VheH2gcTW`Ci_ z9cV@pkr(|9_m+2p59)0rGArJRYv^j|_@!Hwm6fE9PsFE&s+6oZ1E^2Y$jAWj-O{ zUAgo@ZsYi5Go-S>+pyO(=6o1Y4*aXX{mMT)7ogE8dC= zx0P>h%@T@?rwY8488>bypE~sk8#0v`{RIT99bS+ihl6&~TNx6lnTGvazBC=Xf-1{B zy6+`_HHH|pcEWfu(T1&)OH}k3nhx*@WHJF=!(+-z?nn2!7i8E#-&U- zjM{x3(yS(0cq4@V#zVh`ao4V0sIsSl{#BZz@B^Akj0sMZyX?-c@;qWG81uw%Dg+Lk zqa@x3AZtsw$4^)RN5{ZivSCM&TSjcG5k@Yo3LLeAAQh&eQrYgZ-o$OEC9=jfG`A z``6xMUq7g^SnIlGoaa$9QdL<79fbr11_lOQPF7MK2IjdJ3=CW-(lhXvl${^^Ffdp! za*|@2URnE#&o%K4;GVDKlfqR$Z^f6=RNPnIKm6zF?LKt$XDBErnU50lJaanqc3OI1 z5~~z34~*{1@I73w_*6SSN<3Cl!pKA{;{RBXpPwUa@G=tepKD53>E9n^rHFX3u>ZLd zhdHgOX#R7hnoYcs{LjVQlNa>g|I-W?gZs~GvA?2)ApG~W>cj}>|9!1Ztf%U<;1T1i z4#ujylDz6|9AP%5Eva&zEJ~SO4Bmf!o1AJmv4-zlpiuCa8C8Ez>&rL+*F1A=FD=(wf{l92rtZ z>U{s+MM~wx(Xxq>(m`hsoI3N>vBG*Gho}niTL@inH+>ly^AD1LA6YHx{l)GKi%#WA zM@0o2g?5#(5!$_DM#hug3=wJc6Z5apt>xr2ZlsTrDjMns-sq*GGQs~H!4Fa@em*9i zfjhX1i7WdHf*9Z1m>*u2IL(#o)k?>b{47?HndLNs#Z+S~g)-Ns6rwVfQe7D~MUx#`+t`?CcHQE( z9IkU*Bw0?*7W9;tYqT1tu(Gn+NvCuFZ8?&bEgJY(Txg`85HQ4{QkF!>^XYK8qr>xP zDKC$TX(#Ed;GgyM8CL_JS-boi+7~^ZE2>bc%^0Gs5#2$W8mQ4uHHdG&kp)Gq8>}IS|p8 z#MEkzxTw$BtH{@m&i0CHWO~+@N(H~J&V?X^q6UmS{vhN`7%ewD-=0)cQ&Y(m@xQ-5 zDUgcpkEeV>P3+qLRr_?i$MMhO?9El_d{y5lE~M_LZfs2dpC?Li`_t}kprWE8-?H9j zE%|jMj$AND*q7lm8>NWfd`Dp5zRP}XqG(HNt3t=8!a@u4;1xV1Y=2s4* zo4e7me-riCt(de<7=o~ovU-%%Yl&V0!(r5dXMzLol>9;k0~r~6w0L>FeuX9xXpT+%<_#kCXO=(T>g9Qh}3KQ!U7#rPKu$I8v7*(Q19`%6jQj>!FLOE}JzQ&?L zzn)pGKr)@(h%=H1U4_qfnsN1_w~Whny5w|YM5j~}`BOm?12Y$?a?0-c!Gh=J=qD}| zH3NR1^X;Ap%+Gi$T_K1Yk7{Mw6{|fFN5AV?`ctDKL#0#c71DayG11Tr+q_PWteqlZ zMX3Ts%6knA51$Se8dc;APzl-ZbqF`|XQSL57aA&D%>0}zpZWRuRj*!iJm?Kmn%-Ej z(l2t@pXP>2;F0wZk&^0^s8U<~$dZaC`0l(W-JP5_1Uo?FEYeFzcHn;9E-P7t(&)J8 zb8|{h!h!vKw!+{Fl*y#h{C2DxOf|8^W>>4ZN~1=nW#cMiVLA7>KqSNMb=s#Pf8Ie* zu3q0=UjAzIlr6<-6>%z~>f5DMbHic!8kfZlfrw#{ypfTSxpk17L#ufuByfQ47=UaE z--6ID{b_Vv)ZIPSOM-bgQUHA;ew5Cn8)t13;0{$!a>)%;KSz~jCYya;Zm<#uu|bNB+-^5TdH#94X6{Lqj|i3p5U zL_E|!^<(-jA+9G-Os$4fkk5KK%8RzCpE)Z&+lySw1QoY1Dok7`tj>Hmg(>pS`+_>y zWlu!J2(Z8unEDSFTgS5nBYb4DU%OxK|Kf4mR=wAjP2uMs6f7?CKHF5^4H8xZt7o~* zJH*6^iMTpmx6XRP_MPXsj<6Ji2pU!uF@-w{R z;eIdAXclkW zkZ=C1Wf!R<+Xw$Stvc0sl5CHO!h9?|qife5ZWG=9t{gKW= zNl|IkN`U;c+N_7Jk2D^Ijrj&Fn0PKLHa504vw2Gbc0(dKWX0?A9SyWXrZ?(!Ernrh zmvy3H2%)(-KVWpDK7IO>k&*F{jd?~l!uRUXay-XKy>82Csf{=iPMZmo6x~e>cBh%{@m9Wq zB0@|0aC>3*cz<)kLo+p+kdV+9O}O>~yF*{ARFhc5uc`fUxmf%4>(@}Gn0QL8^+*7H z3dj)EOXgRuu+C(DGZq(=5Yu>calpm(x47-lKqs%$77AtJ-;HIMHG`rj<&P6#d3SXr z>avccu6D0zX1UJRjRZD@^kL*$2P_=I{VXAt5~bHpih@YsBiXVb>6Qo6U9ug9SK&!W z2iPy5QbBU}h>lC4g%GQd;NWV+UhNg(2k`s})Dp+-7M|guB(859;}X@>3nY=(r;+`{ z0}xMOwb{E6*S04M=O2hkNekaCH9DE>dpPUH$76X&tKGr<;N-?{3fhBww#P*6Zy zyU2a%Koan#_mId=&~;O>9N{G{DP)m-7K_$&!MQDn63cHffs|Ra_Z4<3K^<0Jfw_}Y zJRV%+Q5g_7V$o)%*W0RfFvF`D=Ba^*xv4>O(> zB6@I}`;br}Y)8=bkhle=IORPZln|}MqQF~A{l42mH*4-g&^)ce5Uo!j-UBxTXCv-~ zqzwKwr)&ouBWu2u=jdUp>mdx6y=j)s>X2s#XENPQ;VV=r4P*?}_o@)#&qYm9uur+d zzTpz=T+ifvF84pt%3$o1NFjS1&uh@2Vqs2B1=|Yj_Rr@I>EMHErIAIF$J&nUd>@*< z4cf^G#VeaB_y|Jvsnxr9I1Hx9>Ssv>0^&lwGP@6VSNz-(v_z-Rr^{-5tfhJ<758nh zbsguc#R4F6Sh;u0065li^YKZM9pB%$o>W^;7C@^J-lv2Q^>L!qoSO4ko_ycoFlq0_ ztdu3D(|Y2^`AmRBFu5IcL>?z}oJmz$82E5O$Xp^znSc+~rPMkk=6ScG@Y-Wv_pP5b zTjC?qy-|9a4}xl~xG*B$Dk3JuXpS)Hh1@h}4JLsoQet9a zN&YGfk`^8r+-d|8z7W?!7%CwRZRg2P(9xY^>H%`S?>3E(TdV$o@{z~mU|v0x{Dh70 z!hn@TG^gZ=h=|D4DfU+b*dJ~?Q`WTI95GGG_!knIA!?T5L{U_5wZh(~Z@UK^O7X#t zTJ{*ieO%=mz~p9*Epdg?Mi6rT$b)5qGe=rS_3`n6#H(5Mb*bv=5?vPav)V1S2`q8= znI2<6zrWE8HB-c2ez6`eCQO#gBT8R1x(LQm{;#0_DDzA9+3G~Gnf7MYDO}ZL9gr<8XP*9RK#YU z=MwlaC#Y=>B_rlm0?ZR#oWQ*T1IHoKjy=yvNlEEjdg?ga5?t_51Xf1Zc&X54ipBV#iJJb7F*HvCEx;=mjJoM4!?XSrBg4P3#BB#(oW9I82zxfLk zrvs1q2FCFM=)tTi0LDT;jWGH0?!}%B5}za{M+tAi2>~CM+=;vN1sqFAn$|rLbPk!% zDy7hce%Ts96k}ev5E_(AIJycT$f=N8umn5W{QSJBNQo&e)f+9W4VuorG-x$)bPpNS zpt7jMd5Gh=ZOBK%taAvZm9r3Hl}SfGHfex87vd<2`wx@7{FjN!S^UnI`+7IjzcW;? z;?A;_Oj{q5`9xhe(ag>3Zq_U%4@m9^y;Z19bA!jk9te;Vi)3@9P#e4mdeBK<;`Km# zK0MK2M<3yyW&&g}6uUd9G$91>A}@=Tgt-&+Q?7PDeV*jCA!P#PFOoPsT3N{><26lI zqn4R^p}bLBS0}j!UqIu$#C@3>O~8iZD?z5Pl8rNfql@AJB~r@5EpxHPkm9Wdl(*>R zb%6W!1S~yd=GaEB+7yo6uA-myWWa}BRYUeDqh|g-WW;4_n@&^%Y1oL70xL!u9ITeT?@h@_^)9pGxz#@-Q!cqokZj^Co1@Lv1J=R*Fk?P~e^7^db zxx^b%Ku_QU-@SA#dfRhUJr92$UzJf&>d=cCXPfRK*B6EF#4@M{2f-yXkIy25QsBCL z`@n|3`s|X`3*{;K6Zf_ay_<;mp?DfS%c}$&E?ljfR2~xO2nmidF9TZz4>gxM9I5}7m9iQorW^bw4vXU-)Lt38OWuC5z4 z3M`D{mzZrIKZfvU61w(_Rg)bJajMv-oHC*D??X<8dmD4Cv2SlLSTeM~y&Gd@QucdO znD7VlSCzY%Oo~swb3jix`nCEBKZPhappdC}4-5I(#7ZgVWPUOMp2BPhWN4ANlP8q1 zp8#0w!^Y88zkMMfm5su7#@PEvgs6T>ymsx7=vyOZ(eC2pIy*aS4$~2O?f>Svv^rTt z>5>)4v=iwh~BN;ZNW`t7X$epmQ z^i@QH{K$LNEG_IU!OTt%8Cc#A@RXW_^e%NgYarf9V(qtY z-E&Ib+Sj{gJW`T0o8g}Dt>QHt5*kHW&1>^`)UEdj&*9-s>z46&O&g;rL*=_AFnF*RGq&REekn9T~M8_%e%5MjYiV5)2{!kEb;>t+{ zoK)f>;bF1dn+%PsBgjquiJhk8^V`2y9hanq*{vyXvL%af`1Q?ldm_Ox;+n{kjnPeXap!!0zxvGMSQZzWiN&`BL>nJ3uj{+JH9HPv@)$0MZiAqk zJUQk>LK^dic)a(J@MY9qM6m37usI7t0iB5|6(lj32#&~jX*)M>D{TjMaXw(8 zs9SG~FLKTwOvz`9XPic~IF4k!E0&3ggWmShZnnJH_sTKmaU5!(GPx9{16L&wXQ(!S z<3N#%O@M}RkTWdMHXg9}H6 z^$n1o1b@q(BnO*KyGjZKP;c0N6ry6xWezj5x5(O(jx4qJ8%ce9nr80p9ZnwUDR~JL z3)EQg>q&`4G_`l#i<|Vg=0At!dxy@P+iQ{S=W_tk&LDx zHZCNd2I1Hy#qJb&A8YL{^qyhRXMN5@;1TPEH6+F4i=Q@mxWyk=dB0~CewFLrlTHUz z)O{>_uQUaIT$6LZ9sFQAxU@tuzy{gHf{Comc9u=nfNh;KX`0M-`55Mb&GmsK(d8+x zz`z>TJs$u|i_oFu7i+HU+!zJtXxIYZnkx(%p^bRUl9OqXbdEp-9M2K%$>*Meb@qVU zrL`8CZ*-z;*PxY&>s{pykewueL@_=y)WqV&FM3i2*a4+7`(wr2lM&|U47ok zAE{3sHv#!%PzUcVY~<0rS{ll>F~up3+(Mf>Xo-7<0!e#JQ&6 zop*YH&ZX(nEa_1gx?60r{QbT6d#y)QWR&Z$Pjo|7fx)TccCw1YRIK`SNcg5?JZ8m^ zMVxjonr9~8efSgv0FLO>Us1Wm4K>aAmCLy zGLWWT`(3}U^ITPP#K}F2j=VRV%CZrTVaY$+C1f@F zF=!J{vcU`8;!2lb*#|oF#v71X`o5tl-5!1u-bhCO&Mw4nqJF|BHH01F*Pq2VWE>6p zj}S<5KZ`!sLh^f%imnU^fzwtoREjFmJmf~GFE>ZIw#u2bd7-AT?3Oe^>7@?HJ7x;tBTP!N20Sz0-jvsw zT!)sBHCPYCk@E-3dx=OlqBZt@OUM05Ua8wQjWjV#jK!oq|vHa_?BXZrTi z(<{7Xy_>aSm-);!jnGS+6D&j=FT!J*bVjvj?l{v9>litS=tGD+T*~u`>o=L=pr(BP z{ym;Tn7Q3#*mJYrSySUVD=H%a2^P2Ibh2}GY{Ve8@pqrF9*cW^ zO+Y0FZjzuQ(I!UsoPb48bi6DGtn)bdy(-x5bz&|znZ?fjK92f__QUe@w39XdnSDK_ zCqt;05EuKjnAS}&_jF@l_=+lGRnFi+=)e9OrNR=EDs^JX%;T@157?P)H|loZ^$mjW^L{0C_e4xulW#} z45%9rGe&CrdO!n?Ohat8d5%tHP0(4TVrrUqDoksxNV?$U&y}zFRbBSteQ180c8x(x z?}j3m^x4Tt;&?%flQ6a-nScv?6~aqZfj>7p;kcirua}r|Gh^XUH>%L`P(q!C!OoD5 zr(lzxfYyMj`POwT^Oa0NM4AIx@4dK6UF6pKdMF2zi$tAEAu@?WZNcUT@#$Vr@adQw zby?!$VX$}do4$t1k_NUQktuJCWfEq_6Zqb%u9TpLp_A~wQH)$BV__)+evPQlxhyYy zU*jJlRht291EASpN3Xmhz*lh2=)5`GsyUOMjkJd2>8e68*Vt){JRty$&fr`L_b&Tk z$K#=fZy;zIs5lX5#5C-|33v}2E9l*=0En(U^jTp>bXY5Zf^}ycwl)wykV9R%K}4Kv zL0WUuaf~d70mQ(b`4H3ic(_@;+IK*YE>TElm(2rQJcJ`<{(<^I%#~&r&g=Q%pJv=O zp||DL*M_UlxwyFW8XdFq^Ubop^A-BUOLK-YU7tgvc`S$V+MGMS4#&EKp2qkv(OM@Y;c(qAtMlB&tTo9of-_q^(f^qyE2wgps&ssC4I za6`9Baja|T@|C%GOpB_y^g@d}%PCTG&vWYbiF8i~J4gMwZHO}3#lB7tx4lb+xMKwNgBXT~iX@$OV(4b>s z>#3&u)mkMCqvZ)*K3R?D$VG(*zfj4EA?87d@GPOHDU9?dl*5lYA+Q+hLnZom&2{)( zFlQ86xG{cET%E|50HU@QdzO$lH%9pF)lvM3>*i=ACMQOpkg%}DC>H)CKrA$@(%F=E z!JtsmMO?$6UK7!Z@p~Op?JhvWQ%WKlZD&yE3j`(Bt%+bMN%uS6H&NcfzpfdQH3McF zb}N-tq$|feE31fcwj^#$Ow2aD>(Hn6aQ}O%ye>G09B4Uws21_V|fWMGZ7|kt*W0H_H$!k>QE~9&Amqo^2AL`^^kir4AlE8 zAZUVb3N|F&n!dhwmj??^`pe3|aq9M*>hBLXgH4pr+n^kydb)|#uO=yx>2rK1)`wtn zNp~R-uh-XZmQd96Oz4tAxP7Dl!@Iz`@qr)glf$75g`(a%Ba*i}9-lk;;vtYXzFy|f ztT$?>0#( zbbTXn2$@E^atLmq>K?)DSVWIMc0 z3Y^#aDJUqw97@pkwz%)n(G>6^iZPe=Gq>e#1a7RR56YM%rSX9-U;b&!JM1lKTsd<3mGoDk|gs{a-*~!NFG3Uq3h?Cm?wD?j6JD0J+yyVjElB zNN6Pg#t|^8@)%_r2l?;9Q~vAzGt9Wde2w`xZJ?&VMviy!LvVPE1EpCa0eaZ)qmPpm zwl8h#&0Ts*fm_4%zk&-KUH=Uu6mkF0C&*g^K$MY_QP)I8=kF_I+34sb zX=vo5mjc~bJ}!&P7XZlm*B1IwZ13OzS|!$^?Ng489#feP>j80;^KpH9Iq@~O-qTwwzQ8W((Q z>frYFM_^-_7ZHJGJ($7A!Vrng`?u~22^p%>VHd0en;pDC;O+U>#zxPfBzgx22QU@% zIW6E5KsbQ28sI%(BLXl0IbA6&dOTq2s8nHC%`8F z&}?sS_s*kWV#WiX`Aa=&T$^AABHV%$aWC)DzM`!^q(5f;y~p= z_47-Xk(M@ZO*jIk^fL~ruj-$HL6yj3rR)vQ!NFla2?T*^s!`&qUC{0*MEtDH%(%?D z;k~iJ`fT&NIW-A<&??vEDwhCuE*ctIZ!Hn!hJefZM_!w${#eqQ()muHf5wr%!r;LB zqBJUqPuZrlHJ&@L=Lbp%h)!5Ec4{&i`)->YYDN4WPOBtw*;Ej7p2TNGJ&b(c|Ya5R>%|XEPf9oDt1hUU6XdNvN3S{v!2Sp@HZ+IaC{sV{Cu>rBG=;( znth|tQ1(?0?yiAYq@<8&d3CU_o)oj)?;-z7#YNUmNH5B??Yz@==jDP2dB;^}v)T9I z9z@UHjM0onn};-s$HyT0asw5TxiX_NpN}`kHPKE>0a;ujW((Tx#W6<*8yf}{jvSPf zPeDCfTR-X#em5%(s2DALTbp0~9$mEEgR^|1p<~o^pI%dA_A`8jv%RIo$1ghiM10J+ zy4iMv+q_BNlI31zc%pplxbQ9=+L6L=JcUdnUz_B;(+iRrQG^^6Tl^)+AVvUtA>I5I zAWD#0P;YlDkWHj1At)$~x%Jye5wabrF~|qNHTaV$$HmQ=)pVT{wQYC=201r3clW5f zyZgbx0npIMiLL`1!}gXtL>V+SG#1*td2*zN+Pu$H3HxA5_u}H>fTt<(CjrdmT$M>7 z7XBizBdN_*bC7LI2l*8h71tGBd{NGhA`ZAcm!m+;thM>cz(uw;g{%p(6a(KfoW-cY;G+`b1Ik|N$(O-#nv02_ zKL!1+tLy787F#`~%)t6rwb02y4*m!*{o3cA_kc_%G_N>R=+%BXWukyEWBswVvwLxx z9mU4XjB?>OYS_#Pyh&N<-eRO&0@ib21r5`#@QM0fmJf>I7{6+3cA=vd1V*Yj{7o{$ z5=l%9q5MscfbXS!kradtl-_#Nu4kZ!$hvQ`|Mpp%rFE7L`QUHf;OE|0nfbfgIF-Xu zlzDD<@|!o?I#PVLaa>N5{Z-npi#=_ZyWP0cFR}K5^>)WAldkJXcb;Qa8nxol9)--> zi~{ejmnXdwr#zxJF`WM7*~SO_ofq0r)La=sQ5trDQPQnL=sUI`rsg z@i+izf%n(gTYkKJe3NZ4tZ#&Rue~4$2lEyMCwl6<`-L9N@&KBuVfVcOtx`=(nl}c) zqx=n!F(zNem9|>v5o|Fqj@yD%iid{>L?|4CoWxhm8ct?7;gyr|TX^e$Tu`-9oInJl zFh|Jh2N@j(=*0S-53cMMp{@p z5{OtW4CKJ!pckQ)?9y_H*;a!*hvFyh=H_PVE^JyikU%Oz108SiyYH)EN?{+j({;Ix zPb)^9Bv607ruWpdu!SJiVBX-O(Xq0>A0zvmG;FQ{q`DZp%4z~0ZhJd4YN*w*t0)*i zj_$A5l)&BQdxh~U%F90i$#mg_0jl*Kn2~@cfKG6n(P;mRn`F0c+LE}nEC^~KB?u}id=%rdha z!8@3&|8*=zu2Zob;c^FO<+?T8;`WGSS7z?-+hEvg-d0r=*j>w})8N%%Tv0AhNX%9A zbK%NFn~m6@{~OYmzI#eh|1j*dir+l;su7Oa87YnI?cR&iubf1e1Fx_2qKpLj#OBQm z`fTsF57VobP*E_3Qh5}9km;SDyJ726S$6UZz8rhA{o%r9ra=3QfzNT#yZr0dAS*sT z-qVe-$P_VeOR{XkLt(E5yR&j;d<9xWz3=w-yBBwfBE5}G@C~R;5@!vxlEWV&Iuf{x z6x-Z_A&ibC0t1Y{s?Fd?MvoR-x1dlOrqX(7%mWDX6b8rc8fKk!9X0>}Oeq?Ghq*WX z71x9?1ZZ!PAx{yQl&TTE!KyAm6!`D~W+!)#VWJdNCtI}XG98sHH&Yv%NFN*E+xgX)Y-wt!3=8POr2ZJ)R; zL4Ob3t>d>5Csrpahe5bJTr{ZA=aX}0c%CtVt)90T&yPSa?0ebff9C;GBW0RjaePzD zD=HEt*MSJ3nR9~0aS8$}HS*R($S5e{d&0vDbv71GP8f#pjlPm(94@* zsNkv6D9^rmM&pxFZv6fAw+~>PK-}}k%nUw|UNW!};G`rsnQ~4(BH(0X6fCego@13F0zTCY+p{Zy+CBfN!J8+V_D!jGB%PJ{5#Q zRe+&hgqBn=F1w)@8Ge2ZL3=*7Uosl_^hiFo2x1RX@o2+^`3{CfXy%jFzA_4}r+uj0 zH^X7TM=j9i2=7CtA`<22Ct|yi#e!yOm+04*61_eQreRx3=`)YU2`?S>wg*5c04i? zn$N-Qz;f$%tN%1hUyN!uzPPU3%9jU^CM{?!SSPHORQ+e)|ztbv_ z{T%tWzT9{+bzdA^a=jT;U%K%2jj5?@NK0yh_1h8K(u#`I&ftPZ1sixaB_(%vK0F2& zXKwpxfQ9USr{Q8&E&2_DC^}=Tp#QB~mOrl$h%P;W@UQAs8tUYEHj@T}TD>xcrX)5m zgoPpFl@ohq{u^|Y!{C$6u}teq8Fs4EuxrLEF`@;4P$w$`K>BBc<;Eg<64^YFM(UUn zyAy29br|u4)_1CvvZ%T$AjQnW!onm5QSOf;2f{P#t5=Ql<1~_3a8Nuny`X2$*Ym{Q z(kDU7gXUe|u+t)liZM-sYJ4eeA*CA)kvvo?w;1i!QDwZYiVL0}yJ_|T;b zzHSZ;4b@`Q>5ktv3jbFNn0Rw^urOZ0DI^4q@Wt^k)?!Khs`cIPX(`atH->+$_!nTp zMMRzQBL17VOB+QsYHkB^nB*pdb7G9~3@lpTRz|%uu~Z;J-8WL_k2+aD66oCRe#zS4 z0a{;Bgk4--_?v))ggN*0!)`%URaJ_;<#39aUwj&%l7p4Npi4A|)wWudG8-;rrF@ zYY;;AWL0Q?+K8tV{m6}lJ$ZynM09#PHZVBIxV7b^oc-PT__z-jW5f;r1vjsgq5sbC zqJbxw-Q1U)pUFCZ2{Ko+iJN!wu7dWye(QXvA)#}iM~__n_& zK%^bEN1DTSvhGV|T!ZA3DJWJcyag=q`!|lu?GAQ!EGSNYny7PMo)(3#b0R;LJnshx=XnT))jhurR<*WC`DRzRjc)B zE_L_$k^mB1()q@*X}vx96uY~wjb-+diwigMeZq@f zQCgFeFZ%i!kQcL+L>%lnuC10W{(LuAPbsS-3Qht_#hrR|5 z2w5Y<$HZju+NdX~BX~0;L3w?#dFK}v2AU2E-UDV1f<5u1uaqSuEP$C+GOrLN$lXs- z3qCSDJpA$T5sW#AZc-Xkmd}7FWFqR@p`;BE)n#<{@Sxzc)dT{ScDXLKlNuUG!r{Xy zD=UL=Yr+V&!-^D`Nj~H6z<8v!>-=cY=qT09&jfRRer|7XpKxs&22R?rDu3(zvg(k8 z_du1xs;4d=3J@+gD~VYb5X(Rp(rWc^n7)LAg9DJO9q3`BpLl?8Li#Du%m4QB!1wXq zn}??sbjB!SYMytajEBo#aR5YPHE3X6Qu5>cYqgCtLpj@My%2GULxHYEKXk3Oc#__U z6uYa_l^Y))7>@SjnY(%G&ayhburNM9|3-w9lXpVGa$$}GrruN7DBGE~HS&~g@5?Z* zHmJ61KP_)oV^K3VR^=>wq2r4^3v{js&7apVk_%6ffJA)iPY)^?#xD*O%=n23i1BS* zr2mVULu?`?lO%%mngQ#v%)0;%Z8dS>89swWZoQzE(V z%^CsHk@RdjxmY=Nsf&u^F&pN&%PN-rgepdRqbl0wj5GKx1q46YVL< zIx3K<#P)pl9R}8+k}z%6^SpLpM2m{7;1Gzr7g}C{$lF0Iq298|CTEKcko5Xx;plj{ zyBqa{L>@)J_PfSn07RVGjaulqEfbPXm6;?85(PaSC6RSq?VlOLJ2xuO@ySa3%?Riq zz#*xAvl=&UdcO(+D=ke;R4uOq?!DBPyWmZ=b+NQbYl54W5sj0yU zCmqAfcw5om^OzJuM0df@EFqY)RVEzln=*DUZC8+ESR+t@T$egthp4%tmM=9GG|cmR zJP|u@hCEe^i76%~1}IYu-(mnN3X6!a*hqDXWs;cw22>5rBy4XG7R@t{m$&!xMp1_u zEd~KW5I=q8_~*T=D~nnIe1G~;U=VhKWL_}P!*=GAE%ZkztEi!*ynW+9PV83#beAu& z^iQiNrb_-L5KMLeg^bkpi4DB<=x6yG0fA=(tf9sCirw~9mL(yTZs&Ip-FFS{nE096 z+FBkSo*o9%(!b}3{xoa+vDQ%k6Z%XK%@|%-SlFJ*SY@3b+;oLu^S2^(udu&y_f%qV zYk))oXoyW0`O|ovFbZh%+l}fylcfNl5PW~y*5>R8I~Vl7IqjR6P!;(l!iA-nN5Jek zePyQ_E0ZnssZrthcaBbYFwsVGBk3K9DX4IwXOGUpZVF{gwI+YOi3}t5>U}elQv4 zDLO_IyfY^8y#0})50w~ut#4AlY*jsMizkd&M#$kU=0Gkn( zxhsO^S_LL#0BPiFAKy&82~-?OW5c8riLrg^4nqY$-vN3C00y;x0v@5pU}L3bGf1({ zmZ;ILI;+NZ_}zRa9OeoH0zL@kgSy2+xVyVs2@2!YXSAqEFVl_g2g0vyna zzo3ElIJY{E`Fp2c(h?-N6cp`1yw}VJ;gM7}gO|L&=StKHRrAHCj@Gxf0Dnz7<}c|4 z9)hksmynPU@D(Cv9>M7efJ}j0t<@3We~I`PUTU8JO|U>T;y(_?XYapc_`jzZx&J*g zDf$1xEcstYLX)Av;a8N4bTqfZ>c1VF{&_dX1370gI2Q50BLS|jgdExbKTnhXf4isu z$1zp4T`WAj`^TP$&dxXf{{E=0uEN4b05(7%j2nNSBxMS;xySV#*DDGkO?FnD*;2KT z7VlGC*?;byDY6B8XPVzAn=2m6*jn5B*{E}+HA3LH*z|7WTbRG^)$z%Nlt51E-#46! zvUpMTS~L*1_5M*}>n#0I-s|_cN&C^ftNN`&gT3hP?WG2EAaLW>d7*Mmy`>kBnC+)& z$LWqYL+_TB0$hgHUT^>~VASNNbGvr99maZss_`i_wID0=^E7z^P`aKp=Goq6Hy~cfui%E>bB=94rd+NC_ zc$7-R#;YHTFaBfT00*V_c+4PPyJCS5AD{lS=wDiAeha;{I39dH70AZT?K0jDH&do% zV>zdoGHTESA1D)-jfH8@U~Owq5%tg>vg3*fVm*>fT~Pei9btG_SbRoxIhc~Za(!}sH!<(~SOd)TvflzaT?olm z<*_j_f|*S|Yt$HJ-!?0LR_=KLX5UPv*T4VVpq$yg(`*6go;^LZk~e)US3vMh>??SQ zF~9y3w|8(>>$M)9&GhFvJg!_!%8s;ZNB>7CdCEdPWf%^ttYLc)F}r@d>uj46e+i30 z^Un-)L{-RF&i45Dr_R+gF4vS5(<-S}HFIoZPBli;?pH-4J9_`bz`wH0qhPYm3pzL_D}WIFrnmX+`<0x;D`bFfI;$x%96Gfb*4( zGtM!Lp8jVxzjlQ)NJuPX+}yn{mMRxZ#unmDo7}#N^K3cb`D!#)9nSwUy{a|6oDd=q zczu;s-j*JF@agPqDvcf;9lf__Q;9U5R9O5Z@ESE;r(j}mV&a>oTny9SbG;8QCd_jo z(sx_zPRoJs%ghWafrmIeCV+&koYm6c_BdG2!eIZ)8E-(X;C}rRY2gdjy`MdYgYA7e z#_i4??H?rSFO6Q{v1A-g=i_TJr%?!chuu%#(=Qxc<>m(jVmKJaHV*B zne)TPLW!$LqNN72+ZeeA42pJ6_gSBsoFmZ|v&Gj94%K!ete~BT12?7;7x;@ruk#*i zaOZr`KRR!2KN;=J}cCSwbBiOG27WQY4!xnTtX{l|2|97S5!@n^muQ??wU< z^=zLlV|Gxl`mu0;9iJuTcl({Bwe@_^;u-q+#qY+-M}s5(f3<)sAZEE|lBrTGzxI1t zbu`N{2+%EhPtEmyeLfOQ(a?s#H!I(#)xv+a03w@SvmhrG5_ZV8y4mdgwgs)Qzh1sj3vSMSwG45NBKV0I&|UV4$CW|`i$KWEJFB3`t7Vs(pe1dM|3>bF+9d>_0w2Gi8n_wYrSgjhiQRk z^2hghA3$|L;8yb!6UCw%Xp5D%3xSXv@mGMpreVS%6_mQnFD|3~?DDq;LO*0r+-l*n zXdgvoTOW{YY@BvKXR9;}tR7z_n+mNEjFXQl*M~>%i(1EBd;22`)>p6yji_H^*LIhN zwc{Z@xj22i$WIdbLL5hiE)@#t4kR!~PV>->L^W8bz4Ce`PN$6u6lH zyrK6+coY-?xBFw8N~IkEXI%Vry_>ln>8$TQoozj}rfz(#-Ro?3=;g#1wI5Cg{fwvI z9*7RwtS0J*@cG|jKO>PCE(e@qBK`4Q*`LJKDcUaMp%E9CnC#d1;pgAuHlaeQSsym%-a$^^De}^=5ExuH$J!z-4Hi*ba*qh++kD z(h7UawqN5K(uj~SkY{FR?RA?)#9PuH4gRxHa9%fN3kvfLIHrpNklZl&~%;EYLU!U8&Y;Xv!c-%O81a~6m=`>e_L>_PK>3V2He`X{yB2Jl| zLEb?$FkXXoSwe>JX0>o25R;JoZP2h^$m`T~1)>QII%U6!nMucmZ|sjEfj7q8En^2A zS*6;{Aw@lE&iQ3U+c$Ufk!9$+T4^|;7l{!yIZ`NFsT$!B$RH7IIFIQ$*e z)OFKGdQVu)Q>3+zmIPrmhCV|HU4~L$Dh_s683%s&zIGGsnO3osobpKyY|O{^S0voF zX6NhakIY)_2lH|)I7G{(F_s7xYatPF!}LJSFm4U_IiQlekp%t#w7*m)Bl*7(n_G_U zojoW=5cWiq%l7=|S++fE>yqe>BzhD)M$>@fL8-d4R}OClfzIXPZ;g)7En>OUE?|#vM0+$wc?memZ+eLf0gf z1TBrFXYsUH1ZLDr&&kOsDz2mWNAv6ReV@j%*50xJjTSu@e==(S)xCnN2QZcDB0o z@z}(x=Vw)o_&hk2id$3mUNe?n7_mQh{#)Wy-QIR~xu2mk9|pS%?41|7$?jLy$|+_V ziFITcg`Lv9Fmr&WD$-U&JlCGS-`#@{Z_0Y=n4kX!_`z|(xZ`U}&T9>w!fea8WxphI zE_b~Prg`wGGxxaO8}|>}M?^1Du+EQ}b>tY|IW%?7GB4F>p{7#wQ4x>wA%h&ZhTdw! zM#m0XVehfF8LuBNb$IEY@}?{9?BP2qW;@yGHCUdx?D1ZlY(o3Aw|a`pXS?O`?mWf^ z4h>G{T%+^s22xq>@o;~gd`P|hzRk^o&)Tb9mZW{+B3{3nX(rlJhno@l_R}<9h}b{b zGg9;V9D9A9HiOto``DkL1J{2X`P!1IJ(BZcTXQ)R6VvyPnm<43W|epj zcjr0Xr_I;i3NdXB(o71<%7TAd)b;e-)YP&;wx|dn`pyk`TFxg_bZcwd<;wcr)YT~* zKi=P2>qsqj;M0i{A>J>}m5nI~jGSluF>yFPJ?S;QZQgJ?oB3{_JMFC+)8S{>FBX;- z)IB#=QfyUcBr7c~1tK=}<>e#TU?ki8>OW_qWMLNC%iRci3pl@_(mvh+{uq`O~=H~rZd|NYW@^9@tc2m4uQO#(y2NHVicz6=C4B@@akp9qha3D zP+wU&1nwH#InrK3jz<2o1m-p%FR|dLntxj@8Ap&o=*e&Dh4f zlP=ElWNvJaL)vbP5ryqEH0%L9nIyG|S@j;uqw&TwzyMo+-JdM4s4&OuQ=tA=f0@bK z%Z&gN_4M@z2EfibB4m9Xqgjl{Yedq~lN%TsZZ6Hp%CSLe(^criaWukT;j8zT6cl6l zaGl#*e1k>%5914X@5HR(#?aYMPfV<05@B8)h_U9rd%Om6i{yi2V_k6101YaVOY`!0 zTiWiUYNI0~el7f^(I3GRvBkZfa-9YYgkh3A)meG@#u#Cexzp}|SS2MS)H)$K2M%xz zDvfX;7Tj3@;o+Ki*7EiL0JOZ};_~?OIscN~RV;YywK8DloeicI0B2XsX~dMGp$l@E zVb~K@zTv<18nzc7@IV?H8*{dIin}M&9p!h20|AFhOfD|ZtkN&Qk%$gWKg8Aqdy{Yy zLhMBJR81aySRcCG`pT8D@o}^`CGK;V2{iJf=Vi_xU|@i#cNN1Bj0?PAq_b-uUGxdd zK&rk+3iH-jVAQ29QwC+;>*CJicX|F9DzNW4DI`QSj4969cz*ZU9|Y9ob@to0vIFqT zQOmgoGX*H9)Jk+O-naSsYJF)Y30?$HcpPR2Wvnh*;F4z$HrEr#Lt^{D8v@w#-u2f* zQWmV7XeW4Rs6A|EV`BPeM?Yw9g^nrkdw{xxA{>N@0O5WB(kI_yXbR+NVR7+X^Y5u1 zkr^ANigF5q$xgPJED_)7)2A_KCVX1rA`MR6DaQW}cNn$L9qk*d(@7+Ucx32q`QF@{ znVAXjtU?xCbwJK4Pfx12&tmMck5P(l!ISh_*PETf?&mdf%;h66oG1d!!-?^Q=*Za6 zkY=(1xy7#3If6h3V<(`e!kYq@Y9hEaiD~4pbE=+D&G06In-qOS2^b7J-}7>JO4&#vyVU~tz%n=5L>9MhZ_v=8ChONL^;U;E~_71KuR-lQ;f=Eb6 zfEz`9-`Q9Y3$Q^hUc5M%aR2^&XtERUg27<1EwQ<+jp}rzYR9YC?YAE}{cL&-91vfO z87QAts@k)l5UW^fC`u`Jz%MA8dBiV%o8S|Ev)d9EQj{Xq9&Q6C5%A(5SR5_!r*~k} z#(i7a0z(MgJPpm}TTD#AjIA?kuVY+b-m9#UseAwKU2qudhT#ZgJ-&b6zK0Gzfsjal z>NtHqM(AT}D}_5z%~~Giwv2;*`xzewU&6y5G=I<;q)^YpJ}ews&;%7S#(I2F_ZJox zFxhhWQAbWhNAMh}CrEJjY(ak5-}AdtUc_(vdReFqcp2+J3togUj3SbW2VVtlG3zIo zfUEI6(!@>y)J;asFC!6*B%&fEAwic`1<0<-o`+nIPSPV68_UnHMda#1W45Yn^Xk39 zCq3q^XVg?xvoI4eZxB7qtm<$1vC^SQObT9Cc?AWBy)JIxCBa(jDS9B8CLL66Ib4 z5ffl=iO*)~ix-!{$-}eRfOiPk)qvHTq6I2}Z)q4sIn0fyh=_>$w}sJQpD@hQHq z)bt*|aD#)*E^SSB--mu#X95A3_^PFtr_P zwM6!yrW^*idQ2l(0jo&;N}0nDF$IwW?HPCw$8N_QnnR-ZAXSYDGCVML+=u8?G^L1)~(>ETewIA5DBIY*&`| z`47I@H2~28q>34uFCRMAGjWMW2TL-KZ{}zc`wLozKGz6}had9RP(;~wV z<|JERx6VMoo<~)WNPBw%97n+9UMI(v#2y|cEXztTQh-?FQ%3d~1JM;}lTyzskOG2! z*U;E_b7A}-6%}fBX{1zpBvRY9)R_(wpM-JmrQc>VZ5!*WSUv$S4GONpszy^?^u}m2 zw%xDJoFwpFb#!zvP?S%ABhk_Mg@wL+`y<3Kc#0~Ik#PGRkL|1f#)8ZE{XE72!;U9rikyC4h+z62E$vep zJ&p)XP|dPnurv7m`z;4p?C@;eKKl*=@VR*>yZqzFE6CoMbQcs9FrISZ*}G%=b}&}F zVQ5CqdbYE>`_E`gWp#CRZS5{q4D1phuY*;|MR2&0tz(3)+}`9o_h22t6H^3+6BY^} z_9A)vchOQ)2Qx?-=<0TKchm0Rd~{71^ZR~G4Y2CXR1T1lV)J6vhOy9=4;~=nF?y#a zE4xFHNMnD*O?P**$g>aW0&XOMV;#MhW>-D#HYj-q^X@~s`F8pd@7});6qY-B`vL6R zo{Bqj>+A_Cr>m%__$!34_)aLUHUk3#4RXxyf&BR72@L}a?K?1diTR*Kfc*>6t~{Hs z6|xR*?nGOlj!W$fqC6CH(mnlo_kF1*IvXqnr0ix+Y4#Z~yQG=$Yr7=5{d+KBw=_j1oDex8P2^59f zzVP0-WMDyO-<>N4O|6B6#bmX8f2pyuGRen#b*J9DOmSau-x^dX?ITP>HqT6zV1AT( z6MDe9zCJIMMsQyWOZ=9ZmZlF*o&aswPWP~&!^a1Gkf5q%lXnnuH|CWU3N-v7CGF zIyjCra4CV}${lBN%kE6I5TQU0uEp*}Xw`XDKM(irTed#Qx*{ z?AgCda~EN0`Vh)8R3+Gk2Mg}Ht;};Vn3s2Vi*s|^AeLj{RLZs(Z%<86@9FGB@gpNO zRNm2{D`w)aYHe*@!HP2IGMKl!$*aW32@IhF;5P13R{jJ%`KKgFx8LRU^-3%3*lCgu zgH@QmphdX9&{gVHw6*0U>5X24*!vSi#GiM0P_<&5jH($TO zc5&C~V#EzhflFZ9fn9^G8Z9x962YxK4%q<+Ub<2=%zp4Vz+eqDBC?$AEVqz72#dHH zm8K1LpMnfZ-Z@Bdu-+BREb2m-{T0xLsiWWp>4=7g=5HkWSVK?*ZQR@aPu}A2Uigv7 zVJ2;Q3ss}=)!rqDAX38#tXsUB#H723KtAg$2ZepwdLWlLdg0m9mzYg|a#pBFZjY~{ z7Z4~AttA8*Bmj={(Q2ih?#9N(KS%~Q4ud?84c9aNH62C0#nr0>k0DTz70QS{R^S29 z(b1u{Zbt}5A8MD;$w>&*i6$=&QBbfTO3VM7aM+FUCQMCDacjdAs45^NLh9JH;3I(u zri-$bLBfs6wRCst=F^y%qov3Fva|Ua8ROt=S-Z?*zT2VY?#q`iK@pw&B#^Ci^ypEI z6B5viU{EUQF@Iog43atcccFTUZJTBz)CHr`^Z$?52Wg-+!(<<=IXd!J7muE6H|P!$lc8fNz1A{e8g=&M+!Gp(r>rKktcDXkn2Yal-B9O_ZZ8eSOA%zm7#I zPh&WR61J^`sweC=($0VxLf&zscfY}vLg&bF*|CZe+rnq|#~ux0Ny!pKx(wr@cGPk! zs?6daR-$+f+uPc-{`Uq`^@!A!)sls&b3LKh1 zr$a1(VMQC7`k`lc-oBl~28J@}z4y9@x(4caG}!sJ9R$iUdWxv6Cy8+?jm8%mGDPM^ zPyk`tP|L+c3mwNxw^wMcaA95xalEWY!(QokbZoMlis|wZ3n6v&Uz8M z&Su;(zJO(KPPTt(<3%|+q7$JoqhaFA$;*>;{NcY9U&qbN0XmZ-UNSgy$jEirs8w3jXC+#Y#^Axi9A=HB1XX96FD=cg!=4WPrOQ7(v ztfE7<@&X)!TFAV!sc9P5j?IDAKJ?!up;4wqiR%4qpc=A=0Usjf{_kC=TmpM!Sx)#n z9rgD1u74>A7mOJ!C38{iSd`n&E-w4_?uBP)8&-y#J6ed)qjlj3$g-s9I--yR5FU5a zLZs$Tf!UJ#E8s!|%|5Bs$1wQ|H1W8#utAL=e3SdlnOLk3&`4WnwNdSn}YSi>rkU;Ms_Rt8)7g+zkqxZE>958ClE+t_xuer7t9 zhAoBnn6n2hJLuU2DL{oF$KPk7B(I@q6{2v6KoA191QHIcObej$s^_Xi5kM!qcZm!u-LvXI1gPwhzU_RBH;!_%fF8O|);=^!Zo&2p|<~BuE(~^fZjf ze76N>6PzM;;WekLC)J?Hr@WYh*7osnlW$nAc<(@f@RMilW^j|8mkyznF){JM25o9; z0vXJ@Ba>d$>fdY3WfL|QXO?X@y>w{~SsSq&dL2aC3`ms%iWPr=?5N&j0$*3$Ia{?b zIpQk}fOGI0sJ9K9nVEsgytcBCo}cf6Tf#Pp{w?8rX{|p6{siq@~M{wI?PfYQ^^5CYB?PiBYUGuc)l->+3_rTlq36GcS?={}b|-YjYb( zh9A}rZ6#av?uGyIc^LN{;wRvevD`tpMpn%E>&BiabbKcs^W!(Ye$oLN5B@kk?4(rZNAdt7P1s!0H6B!M+S_#~T)cXuz9U0Ed`uHaBL>Gv7s zAy0886yt=CchJI9`rEfK86H)?9CVAjA7>)jt&pA}s%GK{-&`NflwCh81ON;4;xpx06iyg(y< zBkue3fTW9@uCQ?4mA4(A!W%dn0}lR&1zgOwYNAE{q;&~UBE zHwm#B{%f&xg9A@U3Y2f_Po5y`sZFoK{Ii> z{uY!9yiaG@>7N_%ueEg@ywAvDdF#EfeN{P0RKW*kX57smM)AWw(ad`pPnAUYYfux~ zH0k?yZs}&iIKcltWV@?>`o4gk-yG5$mDRtWp|HHJ&UDg06UD75K0d zp6F!XT3*wa?d>a>?0)39`1>&y7N;avw6tqvU`oNHXyDQNMf+o2CVJ((xuL)n64KH= zXUNym(z0)F;B+%&MOx=p`z6j8{`@r{Q~lO@-^V9?q(1jZ3`i$?YAPg(@M@C>l{pAx z$o;yn4e%OQ>>Vvc((Nv}k54vANlyMgu%nT-$7a)sNbO60Z;a&-e{+VzLfCM3C!?sK zhh9|mC)f6ji&uvS1vsy1l_`~)t3b2b`qtKoz@BRjpEizpNLSF-FTH!}(9YRm7uU_A zfz!suB^EQc_tTlwU6S&c)aZW0PaJr-u?&Q*@_17(Nn?rPo10Il6Xa&rz?D!r(&aKi zMXx6(FTcFBgczkH$90~Yg!TYm!!t3;9f*@b>yvEvsv2rh67}~JKp=P(z(#^4H$Pp_ zrFHM*Y)P?aoWxCG+wp&v)4GL^`EQ%+?b`c8?E|hiDa_Dk9rg2ztC!0z5W!#?zG`q*kLdJ&b^1c_7sFXADPKh*wQ9j127@^zKMkY z`54jWj!J*(5UJ7eaqhUW13k##n0U+i4(IgKY5|yLlMfxqEwr0 zvY&*c%yVJm$y~wt6IL1OjRxLI%RkN<8&7=?QJbkWkI&+0va9L`59F10ei&i7Ja75h zGTof-J#wBVMmUpUDD7gO!FlRFr@o{21BKsX6Xah1lMQXL`c=)+AFVrC86@Dc&=oJa z`uY6RX5Cne^;ZEPR84o^w7K%sg`hbvbU&&|tmM0uVYJMFt@%@+7CGF%8#f~d86a<| z!-Y60dn>CB6u1O8f{6*%QyA&gpt=N9eT>~2MWh~%I6yO>R=fJ>>drYsg|Z*x5AGvC z5(K}F;@G3t=Zv~ay`4UX_MJDPoN4IFGsQ7Wo74&W9=5BxBi6JE@oaV zQ{5;oJel>J{u&y?_x#<9`1Eu`mD5y!Zy*fN_C7fvh9V&ub{eQJ4(x|gZe(oi%C&2ddfPcW z{|Qo*lWuu0KjkfZ`O^3KQ0@9*Ll-*1&(B{g3=~7~Q}M7&F=>=B^`ZR{QpUIMjJnM8 zY_#4v%(XPPkaT3lw3Rwb686XFX7!U3GS9en#4p_D+L2=7>lOVgb!a{;Mx0g z8Y@&66s+w;-%{kWDMdl>5JU*fQ%^bz`F9;{)mt=^auhj0YmqC_Ct=?9kXCr_X;}Dc-`c?(LqvxZqkF~O6I{!8$-Q`!Vw54gh$PLp~(R2R4 ze$;@fMIaKeB;H_+%*zfqc688l991F8SCw~9iRtN|1Fyt9bLYY)MlLu|LIm?ptEM%t zf@mNFa2O=`i(I4HdyxCb^z_Eq7Y?p~=C*)mXBe)2eRa@r@A5b)i&9EOC96R}s@L4$ zpDD?TTR=D+hSu_;9tc3hCAtm)8b4;i^OfemQ`f}1OUzE5HsRa^I_9F@X z0XzTWnVrL-`1@E`s&jE6E+xEt$syekCtX%nwu#9f0YD^IeM8?9v141%8`QyhX)4C?Cf|vtU{<HrBgYs>`1dY(oB)aj3V_-aPVq zwO4~c1jOpfM_Yn=Kb$0#oJomOFPq8H7r~SzA9eb3xB8x*RX~;pxwV=*Iy#!0%cC*; zWJ!i_sTTe4+WI<3sx!^-BhnzEf%BIO)-t?~f(YI_oEpjgj~_oKR0#M)w5NP%Vj3#C zwcTu+h9Bm^VD<}NX|3w)T*8nQkky&XFlg~3hXgGsf^aGamXrbwFuu{TvE|--P<#Bbl1S}i&y z&5m)i2ZBVz@raO5)#Ye$vv6nvz`uUF#Kc5gM**B;9F8fWEoZ~H(Cz@o(Q-5ncn=GM z)g)NdXmc|4-_}%AoRRp7_@epp!jq>@S!2s9(Y!Og{XI7a)B?_D6PPvtN-G6KW43{< zXN+k#nyB91UaSgVU&M6cR&Qd zDvK?rPDXUE$(<9fuC8A9Iw?Un_!tfp0Mkrf%w@*MH@_9j5|LprO}z~43k7fD=I%TH zPMkDMn?qLko<}D$aXqhN;_|RpSfgueYXi$Gqmx?*F6=N~<9!s7EJg zX=oH8T&`GKQ{x*aCN`D^QW7$+TBjZl-TwD}SXi`Y=SbRGThI4!$!cjuM3knbt$T@) zviLPT2`($TDPSG4CHT7&Rge|uBcq^@N_fU&j~+gBsUbaEbGFRwM6r*I+DJo<2JJon zf$4RtxkJ}Zxz4z(1Rrr6t`mo;0_2OYxZ>pu4VBL+AN$vZicpja-1WOx=(P^guKnd0 zeO29agvd0{!6{nR(b4}|nm_2uW!~3px-l5t+{n#K&Q(Yz6{ejJZOu_NDSZ%=J-@!I zpiq!lar0Sse9CJY1_tKP+XN|u5+QAy+C}rGgX=(ubtLz<>A#J}!|--pjPRC^DXAs8 z?N=C-uf(Q!tYfOg=~qCj7`;ts=-9d=1r44`qK~`#>bSM7RYS<-&(6TO600hief{3Q z&x$LP+pE6!=kdN!g@Nt|_XmYTM>h#iXC*4m=hlpmtL;`Ja^-{t|LmWc@KMGL-D4#C z_6?_#bNp$Mk(8A* zqne^m3Y_4!Sr~sn=JQm``_@u0#i=h*CO1a>KYzHyd&;2uO@#Zj z5p`3HuyVhYq?FGJ1p@T;heAhbKlKHddM_iX}|RVr^#iq zcWyk=_TjUxn>QxxE?)+NWbv!*$y}SSgH6wiz=g@puItM_U2=QprS`d`#6!<1}F93T6oWQT8>YW#g(nexYv;SLDP_SF)t&kpg-V? zNV}Z`=OK&GQ$5iG&+Y4@JeOB06Nih~lupKC6(xK8q8jwvd&>Fn;VA0E7YVQiyh49Y z_pSasZuDniAu`dnnnrE&T>Y&9M(N)5wZzXP;Q6hrOs(b&air^{MU=^uCe^C)>F0C1 zW*WhjPlh|k_On#*9lPyAliy0<0#RUA`93!Gn{B)O{OoLC&O1tu&(EZskQ^uc$R;qp z^!zenFRB!ZlWGFCFVBuhcy0VaJMi>m#;b%G*9E8gcd^gAg+*OwvhJMYdvK(S-SBZk z;@V8O?$=iluuchb>r4!odRh<%r?d{fBZkS>V|OaMPUlMZNy;qn{D%ePn&r)~77gg5 z*=_J#NiMyhYSP6hYMAx7an$U2)m;TL;ze7hv!@v#Z9j zy4y>E#*fUVqu?BgVyH)kvD7}U%6wxE2J!biF@jo&7DEI+!ADCAiyz;=t0AM15{C3R z2L*JWPHoI5QLetjV9#6#V<~1?zh}}u7tfum#izU51LG=u@|$DqLvole!iwPZ zi@aWYSP#b&s?&Y}V-stTPSlOsN6gWpfa{tuYIbTIA-gxhlZZ~Ti z^EWq^$FYAc8e`-&o@4bI8%r0KE>qFco-{kZ7r@7=I}pjVNObN-}+ld%ofhZk1HNUlxN}FW7GwpY z*UU01VBGOuT%5kAy|w|b%frR~{gu_0d!Jkq*Z!EOp4~SUEu#7`n1=M2HqY0@K5AeT zoTzNZx?Xp!@ZSFv$?NC-he7mb#c+|vjTb{=&gRzw!U)>F(0a&4!SwJ(uSpO@GkkmR zoDNnG;S{46-$7e6!>kCFqPRn0e*WtKM+xKxx8J51wO0L5U>vI)j{XEKbHhHB9AimL&TJ;L_Xdp2qj~*~)485D4J^}3aM?8VPgz>kNqvMH_C$~Ty z<2U@DAC#SaFitOeeQB-w6Q+l6vi;rD<%MR0e2Ms+n_Jto81`w_GcjRA04tO8(6q;M z)~TgmcBTw(2piXW!)0lm+W*4Rek~wuM8yt``s<{m6g^-5l*nb*rOvb?%0Ksi>G&ew zd;QNKy~SQ}@$Ox&pBv2|FVE)ff{e)YS$w(A@zZ4cA05ECouTG3s1^#1Uc5Zqx1;)S z0pljmXiS_5lLjfhJ@5G=hZq=cT8>7gl*SLBd&waouyY{c>VSDAyx|CHNo+?j*+|(@ zN>ZtciHj4c7RjXbLpXv<-`m>CY7yRX4QAN&gz(8;i5hRFzoLRAba+z?aJ2J8L0h^Z z!MZ3h*)(DMZrUH`nbW=%d+ELiPDvIu{4h095Vq-K+h8Q-l$xFv$!GjZX*e(}aeo?k z4)*riF2r5MIlLPpZ;tRW9IA`6U9JetvyCWolw3LaIE9y_uXL4Y2jEf1;ReTF15N_n zND(3AZE5%~q)u}wj~?f~iVjqBH`5yIe- zfoaWGRPSI7{QS(=_wg-eBisF{hggGu|M|1=d*DvtazF1u@SLl1LHs*2%7n+-lH~#B z6bJ#=d0s!`VzQKpfjW2r(`>NMFk_nf_Ewrrs7=B(^Otn*etPj3fjbUYt5rC?KP(&} zU`tK0l098cIP{2B+3>NJw+@J#^{?hbSvi6qJb)6X=*Dt)-h_zNg*Xcv8xO|JT~F_<<}J@JBfm=f&0o7@ zuYF^&^zFrO-e4#hOSq0s-s{1%g5%*>sIc;g!2{x6pWkb%uAg@b?rJoAW2~!dHQ#)J zg58k2Xo5(?4`o7FfTLOMT3*y#=hRs%fpq{u{v<@QR)~wYkt?f))Smt<|Fk4;}<5-w?lg z`7+=lnoAbwZa}`H4EI?arM~#~vI@SFVp*0@e>%L$%af14rFZ&S1rt{ashg5gDDl40 zaN+c>7mYm}s?YNrzl!tPPpK#QZOqb;@x}T1{j<7}hD&)^~X9G8sfx8 zL)O>U+?^IirO`r&GBKqZmeGvUj_-155_2)liOswa2kUXxBu~%vU8E)l*yZgF1h0(W z{YLV5=Fem9cmnq%g&{SwR@7-*o`W2z0^NA~>ziQh-2H4TleY;L0eHoci8m?N9RN_B z*GN@M0OEm$iKBQFgFNODnb$H(fj@XK_j~}1WOIz-Qih(XDU-puASx~v@|2rfq?Wkc zKY_ZLzrw`><~LoRs~w`EihxprZ6D!?-K$Gr-vz&rr~pcU8QSr%-6|?7Yw_9{)Ltv* z$Z%eso?zjffFavAXNcZMqfj&~U}%|`WGV2Qgsbv69fRl6Qlo^c&RA6Z?LSki`!&NG zq+cJe`Z@RW_!q0DBjU+EGv@MO=aG?8#HfNiCL{CDzRSsS{$RTK`|~&HsA%kDBZnla zUh>pY8D(Y4mRngSw<4^eH$(IIO=?3RDm^RxMdtJ`M(QMqJ2}iFamhD5AJTktZtaW( zs9krb>h_7t{1F?Xo^rg7R#6&ZLaj7xHr?RP#ELn+*iBDCEhy_p3WVrzCH@NRb>BEK zs>NKw`LmCti{;iB1T2|W`oQz{z*EHXRtzL1-xde@ogdgffp_lU;Rdvzwg(IP-nxL_ zF|AZM6pF*!s>KyY^91X?y^IB}GP#_kmy;+LK!LgCR`kB(fAE07cc0)-oEkjz^z?Hk zB}OdycQuLCbahoN>f;@emID}R+~rtU_vpL9^EraqqtMqum)gs7on0eT%VkW?4&;jG zII9fPM^Zrg;bFV)FIiuZ0ObR01i6pkMewV((ZC)LHt@XLUjuDMXF;uwLm5(@(N>9# z9Osz=f%-feR_XN32ZdZ1W*+ljzpgES8ortNN!6oLv&a&{Eg3}12Z)hlRMBLrY zFHdYhkH`U~#>FfFp8EDJiPa#5v9l=Ac}5cNqjMXm*y*_nH;3CY+Y0}wC!ZVW_(ve| zUA`^WjOZJ3kw|MK^1rlVCmdWQM+%OgXs?5-tI50TkZJ{yaN+=`u!uBDl%{rdv@b3^ zk1^07j^saiGT-(ao9&^;hpeM7!q6!4~O45oC-kn`>xy#z6Y2FlS9Zl@69TSmpw88 z!kJcpD3{O|4~Yz(EgVr59=q+^{(E?;IpGeW+kO?|twGGSl6Zk|@JMQQ<<7)pCDy15 zY`Y9rTipD`-GShNx3BJtYC)`CJ;w)ZHz4_H2eV+z8Xo=y>!JB5*Nebw4as~Cs3Sqc z*-fuz{6UjoI%X$eT7GM=dh^#GK_IwbV9jE=pu+A3Zzw(e6li-WbgM54Sb~zlh1$1W z(^yhm9b6KEfguQNzMe$;*VotS>F8i$%vN1JfK_9HzTvp*N!f^R4Npb(o4DWI3FPjp z)_Yaquv5w2xXKS`GQJhp_jBPu$!U3c`4YDof>Z^E_tgtVsEUS}S!{t#oOz1Erz?Rp ztH;&;6La7z6+aK-hoN%G6DKrClPDgp2-5zhly*8#K}F@|tA=8nP5wS7s`LdAr2)x$ zF*PYtNMEi{hP7ipc(YNrlk1q+s-Nr@xb25vnY2vh;D=&GjoH<85hR{~nW4KKL~~%O zyilO|Cu`5R7|wKSCh!PDPbdTm)~nf~JfI(!ryys)aOhs=@X{5Eg4|%rSoxD%T=bL+ zqR|6ipWlA?@Uff&E?XACdhu63P!AFZoD8X-V_wbwCc+xe9w;%N<_l6kIL6={MNjM( zqFw0ZfSk;zL@o(XUK~U$`fV~zcfmhYABvNmn}@kMqhL}h;T!(}V>|Fd3-ejKb>%nz zfE0UnnX6@6@aP+OQWIc$DQBDRXGLy?EQ+rT3WK+<KWZ5o-UM$IbO{yHTx$Nv%*?C7d<>!b$>|ecwytG^0N^wE! zTiZ$uquz4A(BcXjbRK=v)%CzPB%dv0g03|isK_LXBR2;t?YQfyly!1 zie77kU}-)14=|vz<8f5U2?^xLj{OuYz5?O7a#dt#%1HO`kILFr=rR=peZnkTOiTMF1ehr__n#ahEdSK0!z=6j&x8rW^Df?^GJVM9X$Fy^WZB#Ar}s$jucHpVz(hk~8g_)P3=bT$wpyn8}y z$@C3oBHR?=kd;ZOlmN~nGl7?kR07uJO;F*eE*-@r#~x81jJ~PK$>Nd{I5+#($@CVm z)C6*=f;lUyjsQM^r($|k*tT7+=C4$u<=Q3F_zA`X$w^7PDPpPB@hNZ56jH3ZHa*Y? zX=Nnmi$4<>bw+FAjBF(wLmK8!C?+T7{eenDD$?uBn zu-%ABshdH46=T)IiCp7z1ZI9MzidR}9nf{v(;T7kTpt_Bu4ZO2 zvA;7HaP#nBu`d7YD;E)4OmJ)RX%%O8A6}743n$B;3 zSRn2OmHdE7**`mWl#teJ>Nnqdl)B~K9~O9|0CcG6iS zU>HdR$Hs83BnJiS)PhG@giSHVuy0QVD@*VLw<$^W)@&0Qj106%`$bkU#XC;o%GV?QV(=1C zzM~xkj!vNLi{P52zbZV=fdBn568|q}r2oZ*h_C|4$y8>xU88YWFR`2U@YfXHq;uECv)*(BIuhWh$lT&Dl*hp_YL`bo_Hq+F+s zo~eR9`IpX2Ux{U}4_(hz{K1UsV#=HN51&4zV{>EsoGWck*FCQ8?~CF)@qnt?U819y zb>&V=Bgb;j!+}kpM=z5{PCh zDhG?Hp!Advq*7d4LO?mR1L_djW;GO%h^GINu;tQpY~J56$5*1V1(s|EtJ+yq4ne+P zPMQ)0KVEXjQ2Hb%=O~~jkYu9?;p)fB$9%@!IJ$5+G|Q;)HWMrOe$ji~&rKE*WGrG_ zh@-Zsl5s?)0h*h*SSxZQyd(Tms3ebRzhcWw#{Q0m<~F|tQNF$X4<@6tb(oQ2G?(4pzd+beoY`t}-%Adj+Idt+jB6azrm_z@8i)u|R16YS?1D3Ev&NAbhxi=_%6SFK~+;cX74g2qPc^qR>iKkr4#Q zdp4k}EW=B~ko%;F2tngT=Q0lf7mJG^r{3Ke0#c5I*9z5eC*7%2r|#~qGv}Am`R8OO%#En)Ws2NnAgTyJxlG!nsoLN|jF{KTLc>`+yoi)&*No3kCvUBbzf?Ys7T!mq~y ze(1SP6^kJgm<7Ix3pE1R*KmD1pyz*;l|LON_kL>re?HWLv`a2&YN6;b^%1ZV_77!$ z(Z5LEUM-)B9N1)zLfsh}Z`G7B|<059q?5Ldg~t6}8(an-;19 z7R!Gyp~jHlqDsx-u45Ve;Q{{ZiXsFM@K{DB9EYbn3`gx@=O15 zCN@!_^IIEJL)h4!mvsmI+Xh0i(x45qxlP={DvQ?Rbw)Q<$&dlL809E0r`LYInCXx~9z2nuS(1Oad1<9^cFe4!S)UnDn28EplC+&*n2yFNm7*HI^IiY7eQFA6=AG8u(XM{ zyTo!U8K=Nx{pEI}W!8J8#RZZHfz%*)3ikm6fhVFbA;1yWVX9f6H|K^<4)p9nu3}p3 zm8(7ZQ#ggF+Ezg>Gp<*-?W^*^hQGDf`bq2N3X}E*zh8aD*LTNAN2Ns^O$JRp7$Fpo z6U`#Ue)+{+VTtF6TLgXpufawS4!_U8DAu`p^=kAQ#9Yw{zP{ULgRtw(zGGWZkaIOz%G8H&oV&c0-bNQ?Ey;Gpi4s-& zrV_3_K7kOY4f7|#80Y>9Nac`gOti4=A!0z< z!>L7~ez~?C7p7AaJrFKmX;f&W40~#<=l5JrR{j6 zGjRZpp8W)^IT8v&Wz^_4@*Sy{ARwR;kn=3?RS3rZ1vmXnFLfenN(CXgYx@WXSb{m? z@7VT{UDugquj?jA~;_6!gQE+#94;!O?Xka^Vvx^S2ZFmrQrBX~t8+4K`mFhv0X&Y?@dDN2R$$K$MczVh;)026Jo}OOt5fMH` zkw?Lg5T;&D!>`0aDro#YVh(&FBCH82t)*A53LvWZT2)14%gJup7ov36&+l>*-P{~) zs;N!PSw13`z=6NEF=0Xb7C`XHZj7Ajc9v}f<%zXxXqSRO$FTADH% zzpXzrB;bs6(9$Z6Y40VYMe7p!6ZAy8wI`T;vM3E)&prB*)SB;1 zRY>N(Z*V#Q8cCkFw7eW3DB3F1ertuNyXlMl9TTPC+TY&%mP{JVGlCpjrD7mkT>S%^ zeBcHvb}X&!?V#13840`0M@>%Vt?@o$@HTNVWwH5fh2hq@&vb;^Qt2q)WR$9v!e@>| zn`6l-3@feneJ87Tk})$gV=_a$=1BP36q$j60rP(j+Nr2C&Np+(Zbva2QB-+;>W7F( ziJ}9e`9-1A^G|<&lE(v&*dFlZ!mt!m%DjrQvN92wMoh@nUvbg+&EGzTjfxCJO_U7| z53e?K;VAU!cuczc7p6G4x}>~U{y?WtH5qx_sI=(PXT>q;+YgM3X5y8k9z0?wqds}r z;krUyIqt9JW!B0ZXd(3B3mQQ)S*fqA2O9y$yC*#zC=9ZwU?4)qz zWgBD1Lm4KS23CS|1{gH|ncE*xn=5@iU!!qajHKMI-TpXhy2F#o_6ld-wl` z1@H=vT;;FVSjf7m8u{~?@U`b@Z`-Rc4#LcoH&BS%=)HW}ti3=J%sBV_ilu*OWc0>7 zYTiVqwE693uxeb{dbeT%tYk2pcUzqfavNP*8cs-xQsYc}xHcI5v+1PspB1ltKM9N< zX@z0u$>!!}Ku#|+OW$vlJ5xrNJ$-8UO!v^x^#e+Q;mHO4SGapLJHTZ6?T)}-g7E? z<7L9mwQOTLz}3rhmKI@jY3+4 zm3@fM2szLin##mpD8`|Tlai9sn1zV7yro5bzz6Z3z z+)&1&9N)2H^Xjg>`}WmTVl)BJqzI=U*&m@F3>mwI;9)SOLRN?D2DM&1Xp z7CSCyWH@~>_M#N;(~f!&Kpy7nKt7;KZ_x6>l3p=1LiI^ud*+o!82nN3hIKRuQJ(F| z_wHUWeAM);i2d`x(93H{wZ~Q5xFClZ@F{3g5ww8gM)O2>&P>;(bQ~RZELQUR=$ZA) zci#L=*DX@t{M0dhOx10^DiRux;o~i&&R5(y0y`7E3id$jV%O~Xdq%TEE&+O$6#MRe z9KvS);A-LClhH-i6Y!{Yfu~rb;mgZ+O0RwMI+WB`vYByVXj|9p*SuG4W-wiI$ebFu z6!pn4sxGEl&fNhXY+daWB{qFh>Pz(ttcP4zdK;T0IW9TC8@9~h)Cv=E*7>JRmjw84 z%%9=ey<^vYld9-#zAgHsC(W8Fc=alat7C3VNiHlrePn)>wf6W_t8M+X*Gt}Gxo^|H z*$=f>&eq%YdnJ12@#)XDWx{3_UUlYK_CtQ!WnPQ#);lOsO>kPuWDwdy;6hr!6wS76 zBpnEledbUJH2xu@G|0@C+Tze2i=lylYE2<9-VAlu$NjWu*2aJQU|V;~GA6&)0`iLf#7eo${*t{f`k6U5pF41~ zgt$RQft-QCOUL4?l4an*Mh-5Uk-pUnpUfY-e{1+aOzhFv6MWr!W3lib_(WS`D?)KVM7WQ!6F4L2`M2k)w z#Pe>EirtO0y1%|u?%N?%+H&j=4bA$S^Koy@rYm0Kq?7Y>UxotaCJx!3^Kf52do8W! zQIPKRwB&Uc)BclB1Zh~4-Bu>^l1GCQ;5Yg8l^(Ale|?==nRcxJs1;RuJ?8SWSFYGx zEZmSGB(iO4vZap0N`MGZU8)bst59zW1XDx|bx{vVd#&VxEH58)mXSN&YXgO>0w>Bo z&8&-(5g1U|qf~@$edk^(f{hhU`fR?1I?B7Si!st(f_69XIG1dB3kN^s zO>`*riR)DN!TmUPSlD4uPGA7_r}&LgCN7E)wD8Vjtve}|0tIlNA)@fNtrpaP-3jcq!3< zV?OCVx2TV}0%V~0ks%9QmdwyfW9C*5>1bi081e7W_tyt*qsjYrQ$mh8w&EYDMu!W8 z<^e@wZRWRM==vx<+}sobPQr3%SkP+l2BagvKWZ0w&QzhfMP1;68iKyJgh_%WQS-B6 z*IfJSe!J$(l9yHAy2r+jtsOVu%$i-Ir5&$3`Xhc@z2RX-@$7ZDB)4QT^lPZen~2`* zymRjJgfM-yq=|9vx1c{hdifrz`ss;~sQp50D}6p^a58HFM#(c;YNr0{`C_S=zxt$f zafU0=Uh9GVWMrqZZ+fq`FSPS9n&h8Xze_%Q8xDV+MK^<9PrOV^PmAK!v>3lDb!W9; zqBo%hE}IhRnF-z-RkS=QIOFlyp$AQmzfyfT7pzUThfG$;H1^n2H-FvAe(7ej&lNb5 zlrKgwL-y%PP^8DhRGd25_{Kr6D%4AvKW5!m5Ru-xJ3GehRi3f^u-N^3_l}#`OIyek z;lRFy@%HVl5|+a(db4&Y3?eo0be% z-$$^=pFtekVACQfM?DKOG7!!fC;NoGILP7`eS&ciQrVcBVZ&m#pEbauC29pW}}6NMKG8|%J(`}BGc zQA^!s&M2{nS(fW?Mn!2VShU}wJFTl*fOv7YLdeT_x`|8H)_RF@d)ynKl`!og zm+`-^pn=Ku@ArxkyJIxQnOjc{Q~WsZAMtxJMx zG9Z{*Bw{T;TK_=NqN<&yw=z70(|9+XXX+(!(A_F&%tAw#^K|fsCnso!^skweQ4g&y zE#Z){bA=YOOW$5LeH#_D{?oFqJZQMLd%Wm|9l?5BS$A5TuJFcEr{(ID6Rk+<%F@U5 zZ+%aL7?0t=MZ#es;V6V23nYamrz#&l{OrwuqYjXXSwEr|zf|VYb1_i(Rc8PR|w7C8crrrY_%l`czS3-8# zBSdA7WRJ`w%DnAD_9lCUkP(GsWbeIq2oYsu@4d43-u%wH=lePS|Lb^;<7w#Tx~}&) z-{)&xYzJ2~>03>zj*Z@j`q?fpHpH$wWX|a;oc@9zBW+iZ=UCW~Z~(g6Umdi7F_UeO zmifs9@Rd)ig63mnPbqUv2SfJ=K0^Np+JH#wyGSN52~$}Czb)v{`YzJ~#tP@`s5uj0 zr5@pWe`^Fa{>LW3ce~>SkbZk0RDl@tWLodr`ZsRbwue8!_KAc}n0zcZCZ{Yk2}}G( z$^jGvLW!K~3*ly4qIM~Ql$;#cm~n3KJ$nP$)&mYtk<04pg(&3keqV!*fC~G^t+EgW z^m>Cp;t1@zy1JbNC6Oa~&h40vSe`tv)Z&6A#?eAOUeu!XdDc(j{O8uAt~hcSQ4g@^ zm`)_n8;3b&er6TzMxyzIR1Wm;OP1A#cyixdO*X`3|)WJX~x( zzHauGhMvIfhR{zwJ`%UQTD$ctq*A`mwkte%i~roV3Xe)Ec6;mo)kKpdVsDxKP;vscZ!~Jbn4R?2UNv@!}m4>cWD^SOQnrpngK$8?t>4#dlg|XuckViX4ZUH+)N% z*dM+n30NO;xKraIbsxpEk1r zs8^aqU{~3}d?9P{x77R|M!PoxmDoZuB^l0Bl9x^6osPmdL09xgQ8uN4$(UJ1jp7oq?lpaJg^=~x9*?wK+VWI$ z=#=C^VZ1BP>CW4Keqxu$62YpoJ@vDJgXHH;%E~)Uxw1QXiiJ-$<41w~&uR9GvDWris<#6=+|Jb1uG0b@9Y?{1gz<-6HuN&1TwzU7I-tJ?hg-JoOxv z#r2Xw`%L`RfkN@OX|Ap(v6uE;Xh1CV>HyJ@AujY4rCRi$Kt1ND2_TAAX(po?gqX1K z)JjocVnEXwrg3ZcuhF9~{{H9``YmrjnMl?e$5#{(Ag$Ol?c9X)^?4fyu~Y4Y?cL0h z-#~>K%p4hdUF!+pMD!1|*Yobr)h0?P4-9Od22wuL15hD#{C<3VJototyav*J&?JqH zj(!Nf2WE9XRw^O}bMVGBOdwir!4(PhQ^x(^*}V_$JV+ho2LTrPO4tt!Vfvq>qvNFc z+gRT5ps6(ywNh9hi;QDJ!&wxY*v(!RuFQ9f91kMRb4dSxO zxo^iyz7V(*r{>7eU%mVB^EbP}bLo#SSLf$x-0xVrgxoRC8t0?@UoQaMyTeFHiHIhg zd)5O&IGol6s;&DQLpD}B?%9mmT3#3j*9bkRyax66|^fMxjf7ib0HtI_tJ9TLQy$#K|#W* z(E}%LFd)gkR-j$0MwFT}_~*|H6(^_7i4R!S4PN^p)F)^@s6_f?Y-!n12DgD94-x@& z^yg1L83UHndatK=41C3)d-}ZLi6O3?2bf{T+h)RWKSMhFBGE&rxU*k=VBrZ90c$-9 zi{NOqf+iPSsh5w!V*zK==Ym1Bv9{*EI>1zJ0&Aj@ZkQvU+9A#e0R0HM4up3Whn2dtBD zq7*Su7lrM8V7;~S8ftwc=8>cPfO8RkI%I#{z#mh=k62Q||DBj}{0nbOe5KTh(7ZQC zn-Dt;9Kz;u7Y%@tfC)7+J`QHH^8ow8w+7s&Dnd{4Y7}YL6pZ8Ks3p;X>yk>)vSL{q?bl zjlAFfYyrky<6k)eP;tFC_kzsh>OkrHE={sbPv0W#&Ed9OYUJwIYwW(>>$!+7pmG|BStd z-3q}pK`jQ&E12N@pBCWUvRbk6XzE}^X+fY!m#5_DT@1`D+?zPeI^0+F3HA#i_vg5+ z^rzt*IcPqBADqbLF;fv|J5jJYYe2fLX+F%zf$S6Buf!6ivV!wZ_8|~0DI6aR>|x+i z3{+aZWIDa|fNQlo`&Nn?aoW`T``0^@px%_WKpIvlN<|Z~UEM_Mc~=7=&%hQ*#-e9W z5Tl~b!3Ylla^At_BxNK8EA}AW4J-}o^@CCPJWy=*ZU$3$!gd8z6V?mn8@Rh~uCw)M zC|KUjeGRcgkvYL zgOIw{Z3#fmsjr>f(HFjtoxKMmi$dmFYCfDPS*Gt-Le&Qn3A$bMqr#t^V zX=KheC!8-|YyWvAD`;cWu-roYP+C>=7s8bI>aerywYdEPJEkF|;%p|0pzSS1gy$|LwZuXRVeNslTa_xbR?p$f8;+P?Nat51@^(fspho}(U9 z>2pXKd&2#Z+l!rqHt|X6$jHoK+6#hvk{9o#vtQPxT1A$EoFG=np!gNp^cp>rPCS3d z{0s6Yu5$=UWA;R2eJ2gS;ZSMD3X`*(KpYWD|Q5b=G zT8MVZ)#M}QX2xdo-_B(c!eGT-s`c)fY=#H-K%w?{XQ$k$DoC9qo8Pf+0F-Mtoeu4~ zmFWi2#kcdnaNoa7y}atb#WI@%@$m~HO82F@@xtfm=oSQKXm?vUt`y?a-*a4nH$2z^ z0Poev!a@jo7E=|Gfy%X!&wm+q8`IYq1%aD8J*+Yci%isQM~4^DIfSR&W*TzP4?69P zSX%`sLHQISbSb8DNOF{FtQh3)#eomz>je=NLjO0{Dvn^{tgWoHRe4u~zjIX75Lmn` zZ43{<0CI>RxXpO!kPCCF?I+lMwL$Upk-q?Jr{Ty&SSNoIjy%Lwg+FA$`u19b5X|rx zh*SixP=b0euU2YTzpJ}Ri#qn8xSxlojo;jK>AkzgF)GA4tQI&p1NkL&8sp%mQqiv~ zNM^h-cf9}O_iu(yDD&nzBl|K2%0~kU^rx+OkY_V2VnH~o1AF0#S5WGG?-L>=4In`S zG*@w1-S!q#EP$574>tq=Jka?96D2&EXLGi5v`P&>q%U*)g^nkDE#Z-=s{b)c-Xt(2 zpdbTKa0y(cfcgQ(2u47t0Sir}c^>eRK=^a|xe5IIU_QYmD;d^cVPSDk|JFtbG|Au~ zqFh4+7a19#%5lb}{_ow>p8Z5}c#JzK;4rb0w5RZ7Ab?pg_XyTO=zKgCz><<_Dl?z@ zeuC_!uhGMs&VZ(^IIb7CX0@^wvkIT}cRM#BU{RxH8^khtQddIX(qj-AF5Z ze0;EjV@eQjeupbDjwCFfc4w0?*{q4_8CM=HQ#UnDR~`AyX^#9|`R_Mw6OMv`$2B z=f=uTnDOcbZr)P8UmyPuy6nSIDgMj~lpQeWfv57`&(GD(Efv}&zU?+rpHuHDig{pF zP+RgaFPYsl>Vd3L8|$wk8K09=V50m-oX)tHL!%f5e?o?FS zvHjfvB&#GAeGSX#7kT&}FHMo&pdoY-&L*#DmR+k8hvZqytzH55|+AB+d#7-4|JfpXzPpeL$l^}qXC z#(!oj?hBA80HY8b+R|n7A8nxf*@t0En1?%eZ0LxaNSPC+TmLh+y!=WuCJ>*JLfdU| zR~hqd`>FNB1kS5)9KG>q`~7xXF9 z4W{&*eX}3A<{msTnh|l|PX}ps5cFC)yzv=_jXdFhw&5$_Vn?Bjj&tM2g@?cVDKe9g zvHF&}2^S|)xfmEo^yW==K?W0hfn319oSKek8j%z|c=B+4CfKu#>9aDyMMB!)XyU$6 z^j^=Ak8=4c(1Nj#f%*>N?FZ4oZ$|!XPxi0=jw@yGF&!O((?*WOtgz-kxS#G6172{d z;jBmazqb(aFQw8@rkjr)Iqy?%z%z^Pdw>*YN3gCO79s&xkXX(A=UNWG%>CVU_e0>a z`u}WPjsE>KehL3&KrqcC4XN9jkY596jy%#^IM5SK=)Yw}`JbsT@;(DqLKDO@i9l&2 z^JL#$16gXq92Yb7BB{XCh%q}THL!iIX5G1`AOn*J@> zo0yhPR-0g&{O`F`hlGSALkML?%H`3hp{M7iZ$PLHzfERLPENY{Z-sa>jfO5SN^X7; zC&*{ynN7at-Fledo~x2eMtysBclY1~J33b_Cp|Nh{sC&AcS7wE3A@U6miSLV-CTos zsRybyd`2bb@6bMaWIpm$3QV6usJP<=-RE06j{ajL=>N0sZVONEx;y>d)&0EL>_Y_9 z4Eg$gyHsNpU9l~HD$N%(`xzLxjGl#G;4J|*YWKI9*zlkI`)An_q>Jt;vCJw?saplJ zX-O5UDxD2=@JRQi7m$9~CrIy1wsWxBRJtfyxXGL1yNK0^$x|d0>EY8EMIlXZ13gQHN+A zIMN#vWk(Ag!>6Ziyu|I}JT?SEMBf}1DAaz9|EA3Gt~qV6brKW%F@+j%iv^&L+eN-s z70itBRd3pAooNPm29kswsfClf@ts3ihOIx63HJQ_X@8k&ROjZ&XSmKylfWaGhkD_`f4)4+QpI0EMy8ZcprdY&p3O z5YkS#x%`ZhwAO{q#yU6UwzJ07@=mY-cGVOBs?Sn{p;>4;T|GdzpmgBFFlS7axcT5mbgo#j3sB>YEb}CEMj&~Es@4mu8VCxG(QdlK2Mi+ar3mO*hjDPzblXo8GyHGV`%sd-iH@f_e9Nw zdMz(ot>fnL{%Ekr8PyYDg8rUOV^|%`;c*eueS(R|>h6kXn*Y{&4{Ncz%5$ECvn%!> zj+=*D8jt2ov+LQV?@QcqJAl|F=I&xaCY;bg{NIiFDz9N- z!)su~5cXTtb@A6SX284Mu+9zdnS0JTW>tGJof*>Ax``B#l`8Q{ZW*rBzid|pW_1H>BtgDmT-g| zy6+c3=}zdHKPy)+Fz}Cr?raX!f3iEN#wJ}G$^p|39-O64gPqL_43(@nZu4Z}u7J=a zEK=sLY%li-vgGfOQr`~oE?eRlC{(R;>Rcu3islRboZ=1K-V{BD=^MoDn(BpyzSkaW zPqy`&q~RqoA%4Ld!J`qp1z|=-)Y`_K+9Q>6&ux|8Sq-*l$VUAT%LpQlPZYKqO26$N z$7AJia4M(3QS>L~(ZSX@mw`VHl)M^Yd-l=MMcR2Ph1uWzN!hgvv&xAP(_Ob0M&gGH zZKBx{v+~jqitSq)8}_q(#CeaR1ndp@dWQKxL-(+o>a4=NH($p4{3LyOtd^1v=MTBJ zRQ%f2;zlhLz8u>8(hlv(g_)Iho#-nj>qkju0Gvfd8Fv`-tnpHnyG-2#lS;@NgrvlJ zJ3%@@BakgxOk4Sod2RecMPhf8b!h$tvZOgGd#>xQkle;zBo!iM@2~gGGA6Z^O08g8 zy}|my&iY^5I+loFPrszv?~<0@)dGTb=WA16__{+VDVAq59PI6Nt5#lr@gGFKs8p3; zV0$T*-mm9+rWsn8z#tc=`KvVDb<@jY7^us+nv-gtun>Ybp~$bV#pVk^ah03L$17z< zIRp#&1s^}9Dt!NK+D-^AzhXQ(I8YiQfP&QB%>khw{P+JJCe-3n3(5u&VgR{na-tp# zI#Kb9Ml!CTEvBID2pi4WAscca+|B6TbrYFO$V}5FZ(vI4^xSS$uI| zo;lGIig)PvO={{4UH;CQg3B{ytO|kA;m*j_Eo!Z>5c?xw%B=x^(EIe1ZU<-ukkeqm`YVT}FDw`@%p< zI&VrDS{9bzOE`U2CcB?iZSX~%+J@I=yd?v|6wxsPhRRC~O?-VNkBgjV6dOFc zH?^0yj@!7Zv^SNL8=FU#*M{$I-VV2!K3QH{QAWI4c7v06dV0ELz6Ci2MKRM{m6@p5 z2?YT~rB%Nm@57x3jEo$7>UTpw>n$YD+_Glz@$m)6V(iMURz)ePYVA0+i5l7ADE8b- zfB#4h-CFsSTfEI;YiyO-2ooE8svfhm%BLjcWy> zRnOR-b8R_alkeOZ(R7nRAheT5#wu8K>JAr->!#5)hPg>gGKMPtRB*G%#q@+?Kfc=z z4*-Rj3f=bx%CXHyGG0cJ`qwj({=?&wBlW!%aaGqvJX7fl=@#OR}!99zzQd)$_##){5mG+lCF#PuijwCm+5W= ziwW_q#Da|U`=g@f+hBm5)bMt?(6du^mAQY(@?)sNDH+-BaOvcPvWHuxPSwhC|I$>B z*^1C%yvO{4`ZxbcK_0K&fxVvIyz(H@qNyS+FH^B;C%Vek%0%J;zT($W#LOc0>oLLe=hwUXI((|fjX>Qi4h;?-uXgv+R}L>M?E0$o6JmPN zNXP|Ueq8!W)4y<~V`9?Nv*tB??ImkDkq!QT=ZO~q1cYDUJn}1)JO|p{`gK43amJiy zwo@N;aFvzrJ2+;^Q**Gale}x%KiC&^wyd&RO8ov^n5APC?-S*Nyy|AcDbg#ojo=QjgUD%f>~CRv9*0m=^yS^+es*Yw&QhTkmK0f4GKnOoit6 zMB^(^m2U?LUM*Gi!AX&YnK`f(>@wx4&dxiHNgNmL(`ZRp_&7N3J=Q)y2T1IW`E1#} zCnTCK*4AojQ9eFl1+A@rA|k?OXjYOPf^xmgwPI6!e0~&QWYm%aja5@sHD`N)c63w# zoGNm2+fzvuUc693u+ZZ-L<~3t(J*<^aG=7^xh zp~W8(W)4cb$nCeLn_V_O&M>v@pseM$m#g5k8$#K7<^9@lm-?Ybj*LhLQy-p(ys!_Mo6_OR5lc829}9lXugo)(I#m$F!Ha_sEf7@=oHve}j(v zSh!{aSSXPHhpV0Xzi;*9|Gv}tEmP#bB*P&<{_Q)O|32vde*6B^0K@l5@-_H?`&mYd zOG{kHFGBg@`){vMQi^!q{YUTL9~~_kg;gpj^HNd~zK#r8ISdhSKOY^H2dH$gAh1qM`~_^N=z| zfVqT0S;fmK3R~3f0+5}z49XT9f1|{(dRbNUHCCDqLb!`fZf8y!{hko4gZ@NlsFe?P9pWrV-HyE)GQu06wX@SxyWx91KJxPNpiBVS11>&(7LnEpa5||O&;96%vH{gLgykVFqG(c5}}RQ^>{9k;xG7nF*0*CfI#~b zl~5&cbpRCS0<9bj84%}XNJ~j6y-dhNW?MoY6BrY{`u4`VZ*O-O8h7AH%g5{lL_d`o zAYw2jtU@4J8Z<^Xr|RNl=XL$k(hM9N_TkS&-yZ+SR8*AI)=r=Yq9T(qr)ke!EI!3s z>41xBYH9+qnw5--_Q;eNG)N?0Gcusv4(T1EvLHl~d-*bM_35<`NLgH1TvR@VS`bWJ z0CGJB&m$;46q9KmmClSMg2V_+W_u~1J<$&-2LKHN81dh%ML~I>UP4nTo^V1yKmd<6 z?OhXqvfxtugladU9&Q=fB>7quL4qeaQgRzhK!-#)K&v}ItCz_6R%}dzp?NkuzZiX7 zZn+K++b8ndBGsAPd6}6IbORo_OhKB^YU*)-p~CbN1`zDVVzeM6~3`XvKf9KqslV0>7AJ=<^E-Kwh=FxhZe^38n?45QUO)`t$)?sqXvtkv~K$VG$AO8os%?%zn?% z@u^>ZtNd>?pv+~DY_!2D0sALNz(B)+#i&@DaJtI$7}Qu?T>aD24bV^?@T`XrS2S#3 zmJflB6pj^ehQjR3FS@!K*8*++C?hK5WIT;%l0!szCuE}h29|}H55-2CkzxbYaV25_dBg9g&o!nniLysFQ6G49q5uE2BY6Q_!t>YR=3+vqc{HSF~Nr?&t z8UVuFX75JG6GH2|thhMY1p`fJ477sznp{}Z5C8Ax;LX}3 zB>!qCEiHvkxRw@0C-|q6ZTB?8oX_z}Bskk&k)%bBO}<+1#HM>>&$xe=f#G*&dwaXF zpMC-4&cpe@X0*V4d%Ft$%v9j0N!s7Xcm#C;{kaWC=N32}>r#acQ)zOiW zhYuQQ#%7qs#zB_Ynql7$?+L~R(h~!IGGxMKrW~cU!N1K3CSv+^-Ci-PGg#BWB=`xO zQ-HJ&Zv6w4x?q-msA~SV40j!%GB7@@hj|GZkwA4#i%5O+yQRg}4<=$#TD2 zavlJxvQuWf)Y4K$V{E9bJOq-anO5?3snHro7C$b~AB}3Fp`pRi!|5TKw6wI=0f?-y zNL!3&ZvF{U1OF+2Ae3N~rKP0-U^5C-%)fEl=`lRz|?JIs4fzNQSF0aW|xmTxmuYbU914lfj3lK2?-Q8e(=`ZNQL0tAsP7dOC7J!pHl6N2Y(BMm9^5^UA z4lY1dfWZ(r6$J|y%!gAjI3^bcP7YXV83j15!wwnwqTm859}t6Bn3=h{xF`yu0seVz zx;OgU@a7*93t;?}2Z3P?tcnHj@XPt*JQv!D$52)95wp$ioQu$;PqPwUU)`nV(1xsR$~KgZ69_O$@C%C z_IlY1TgJCyjo4T$Z{elDA`9Yxql1HtePGHeqck-(ivQbY{GCEdY}=?Ou>O0oKf;sQ zJr?;S>UQ9;0Sy?VNC8?}Z;!wCgC$U4X&WfcLR(l^FfuYi+s%Ttb>Q6`-ba_+y}gFF zCv;$z0QB->HEb+yAoOCUBPy5%njT>N3ED=6*$xbVRw`kCA zj!0`^wP+VLD$J0R%!vkt5AlG^5|{{aU%x8$c&Czacht%5+I0 z9S&fkyxV1EXBS}-h+(Q$FPeTIApOv2HX+o8tccM%^@+a0ys(aYP}ls@)lOwc9k7gx z#2cqpo$AxyIhe6#2!whOsJUGm2_Jj|#gzs~&FItg~pE?G& zZ%-}#O!UBbDZrEUv}OyVp}6>F+*rleq;A))CR>B2DrFC|626;UHNFc?Qc+c%pC<&% zx#4O9At$j{<_~EEoF385#lc&Jd5-8XrW&s@BF%Cz=jG7k4y7Dk?2ELJk!gc-oT2Q( zpK5Gl)jY-zkN3Aik4eZ^Xtr}S5g3^-fLYOFoo{BOIdJxjmSOBud5i=pDZjs0c%KJ1 zbuBz%`yC=~BIxyFaci(dk6nA%YxG(G&4^Lg#8_V(WFxfTF ztgo+QM;BI_kH%Z2%f$&N=G@J`_EayhFhQu#A;8J%tM2CN0VTo5=Alm(;5(aYps$v% zrNA~DtHuNGkJoClw@{8Hi=-3AJmYe)Z3mtdnjc9g)hJp{+$p$mUYzdhGskWR+8ogc zGw+F^W;tx7{op+R60w;kUi%!{7z5tOy8c*Pd7>Zp8j2^^2N|YViq!{N_k{&ZN-HT4 z619ia%LDats6sDS)w8HyOG^6g?|#o(+M4|j%JF>uE36XE~HKrD^t8-ad{gTy|=H$FS2t?R3zs#5kfrlT@9L7|3zIl zMo{Pz@Z4eV8y?P6k$L=x`LwA8iigSL^97c=mhzMHII&0t896s>Eq63w%cCHQ zsNS#(WqxWyL#4hxmDXY~KeukV*891wJ~V=ifWU2W!VjJ%QG__53Czq+1uKADkiMk}JS2F`K zdvNScdx~S#_pSF(+kI|s4qH7`pJw2u*X1s;(Ajzm3)X|1e^ag#5)cI7lWX+nqE{r0 zG?$m}rB8Vt3d$t}mAk9D@KpGn} zO@qD4goq@sx@uR~ai{eZ|D%!KdthmwGy6L*#j{Q@x^U{7^A&AHomr)wkq7UaZ5~FA z8SUbH9X9YZqoX<#B7nFE((d}@)+p$x?Mko*Ai;lA7R z51gE~Fr5@1n<;p1V{6ptJ06%Xrb**uEdMDGaweZjxE&ChV7V~hGvzZfqT%-PB+pQ7 zFk((5l36v??DHka;U3d2?;oqOy6|=Pce>f) z`)xEd={l3Y#=tKU5f@m&--#0c*Hz&xDH+Hf>g)TfkdCKe?q1CHDSv(a^G|dZMn*+l z!GlktwqC~Cd6^+ zTvt8|It|O=X=RuCK$Mb9a@(EC8ztb^p|nDL>JW!q!>$XL-UQ>N`uyDd1**vAM2(V~ z+OOtjemc5v!KxUalKURz+&rVft2yMn_J`M3X+RjRqNbc0h{|J&Hl+N`f1vot^T>0! z@)I<)1_sxcNVmuO^W^fPCg_yI!}FpzjI+$RY$j?X6Z%?0+-3$+$sJ8a?L6#u|F{CE z1p7yhs=~^2y;Mo``#0J4FA-^dRjrJhlV+wSYYP`4hra;Cd{076lO(39s-#qDGw|+` zap8cH!_krFQ2XH{?uWdOQawFgU0q`{oGhU|{DK(4yw|_Paj-U6=X}-MI_o>Srf3>~ zU~rujL{opEDC(Mq?!>J(-MWdGG0A<}=pZRHw#S{4l~?O}VP1Ki$eJH+(kpWLW=d6L z?8LfAmZO=uxx>nU_iWwPwQEVjb>FMUCCPN|E{?Q8eqd%na@BZaJ?#TttG=(7BREb6 z*n+E+JmoCkPxdqWMGUusIk~x$p>|+*u)Q?kXJV4sch^qUQsv^a8P1Fpn+y^hizB(w zVBYiI0D+;Puw^Vq#h5Hs8>~Zota90!III3|e88@Gsc{q8Q@myV>A9?|VpVlzB}p_{ zo5e&a=?}!q=wNz9$`5Xe!OTI|3Cokk7uwfZd02B~Bsb_{)zlG2zlGATA_oQ$2<${> zF}WdFI+b*}r3ACDgF&K1aK@#*IVGqK443{s>v)F!@y>1P%THrbL`JVoKH;#GdHaL^ zJk2zImpy6eN{OxQ?P)ru9z~S}?BTG}DYH6z(sM%DWa`(ht^(c}6N$o(_Fhl@$~s6Y zFt3mJ-#M^BTFk7r-cPN~q_ zt87F)<0&psz`m^0ms4s{rmVM3^XGUxrHBaHXjzb^YAAnd9cA7sub73T%U{XN^ZJLB#vic=1#2xvJZnS) ztPKmR+~#kr052vkc9t3)8ii>K5x*K)A3UU)Ib90+GOF;Wpdx_(|HO>(#r^ zetL!EBcG6XphyI_=I7*)lU!a&EB#`)Pok3`IsbInW-3$L#9AlvaTMMi!OXn8GMC0X zV{gsX?VY`DCS$#CxVkF4zw)|gLHoY)`dmx>u&6Ri=6&f}(+35pb-n9#1gt?Efg>7v z7@_oVGT;8c9&@gGXdx6Zne=pMMA@{b%@?BvRSep$q*YwsGnp!^vU6Ur-HLX{A7QtJ z?glI(s}#hH?U_ymdBZlnbOWU|Z#VoM3t}zRz4S%}1P1s4PtS5v|M6Qv*VjjCAZ$#1 zQz7ZG$E6P)-gOS8fQHmmx(de}e>g9~-mc$YV6JjCv!r0<5*rd6JYDXHLF#*puwt6= z&i3|a3-PaaS=P3D3D+wK?wB`0>9e}B+Ot1-hL06p?0B{*U8wNYC(PSMOH0tbAOQBJ zC3YQSq4FG|u_NCkv@JD1-hy}$Pn_?zYx2g%^aY;Z*3uB&_W((r!W7S0xZ?B9rpR9>~^|C>>7qyTRYEiE+TF;o;?4U~WJ zqP?>t&8ang$KYEnPPPI#i<`8693_HsO}(K4f$i^%3AV2Vl^Y}d?KuMO&xI{|-qpL~ z-$@j)phi5zdL0QzH=+vV)t;@vy0su4%81B_T=lAle0g-K{wf&evPxxPT4nGm?;5N& z+twaYrK1FthU*gs{7TfB!YSh6dD{w+e|W}*#)}Kk;~vY|E=^Tx2Rg$EWzo~MuowVCssc!UN}?(Np%ed&BcxGhcpzT zuKuyPviiz)!Nzi|*LSK_pO7j6)|4(=c1Br5vjMm9D*&Z@Ffw2K%ikfcwcQJkNUAIdje96ZT}c z1Z7{g_oT0MA%Z?+zA`$tv1)4qp{|~Hu;uKXRG&CCbL|3I-`U=g^lhIIL;ZJ3m1_7m zJ>N?UAs&VW%zr?bT%3z`B?=r!uO=5{4Axt%Wv~n}vapN}6=k*6-jP}M)*fg?PFs`k zDQ)*wBZojO@}vG}6|Nojx?D6Sfru2bO* zye2WR^+uM97rqq)SEft5q$0wyN&%@;ivK%Z+|p%|mlj1wk0D#(TEHxX(*+~fs=1WN z{#Qz?&q+5FW*v6M&Cqf7K{C~qfX(N1f#Poe@cCQeffBPP9Xf_e(DpA zt0RK!@~;UAlh8;02Njs zojV^q3go4DTjl#p1~4K~wE{7+w%NRpKyhQz)c*>_2vzxClJoAOHkB-4ua!* z{`>b&01o>~(*q!d(;VpTh)hj;Q~e+nN#rG_`xy#{t40v6F9lqRfp86JO4hZRAK)o|k=U!D*R0Oxy zauYmz%;*5>1KUjQ#zJl`E_?91gmAxdRyF{Ynj(6@kP;f*Sw%(Dpm6{_4|eC5h=?ae z@^QRuqM}L0W`of5&RT`gzeVs6e8ro40z&4c&NvgWt+TX*H{_5@eWv{4#UFTaFW{1s zgO}5;qxZi)wHmWVa$`$N#v3|5b5tQ6-<$9>Ol(4uS0MN#hyr@h-l_P2=^1k=CVSV$ z)84)N8g%wbN=l%OREKtQ_FFJs$j@gruj{9PP8U5G^A6?3v<>uW?3tIOJ;f7SYSu7K2IILZM&kf;5>6231ex}*M#?DR z1PMXNX7qI|OX?sFa0C_Q;Mf8f7SNoCM*tIJU<82dOo_T3sIsCEO9*qPDy zBm{H5lk*cUGz!MU9Y8=qFARowW!=TaWo3ZJ-!4c{`~83S7vUG=AccBW#+IY1Tf-p2 zYcq8Y^8v@^oj(91{Wl^d6VAoO#p~-qScQ3x${h$^Na&Eaeh|YTAfO3J_x=4}Zij}3 zDnKzLb>kaRth}u3T%!5sxHuvG=0LD&3%U*4P1y$`#*)g)%iRU++CIRYVZjGSyV9ac z(_SBz0)XC$uu?DqC4|t6u>j}I2^j?_o;e{AoG}##Mbx@w4ArVu-tfva_Hx95&sl*z z!2^gWa2-#=N+rousDDeWz?!#5Ea7B*`J<|-B%!!nIGbZWulP&iJaUg7C9*? zKM7)P+6NCDVW>cV4j|l>m6e07=_{Bnz(ODkqTiOj^=fjuxCEW|^heScWyUgoBdAq8 zwy(k?BRkJCyL4-=IE$MNM$f;+$4>;SQ(KOC((&SeYv3sm z%2)49^ZnLmS}qp%t;S%coE7AHbY9O4?6%(C&y<^=y=tC7=B51PC1A0EA3uWn@<3wRPg9&ACD+Q71g>OX(+1-Y{9-@s=|wA(aD*fvAK*__WB# z$8V2|f5?tna6icgI)fh@=v*porschH#;6txO=`6NdG9h#{H69L;HGnId-nOGF2{owG>g%30yh19k?w?qh!I*xFMriF zd?s@qwLvRcFZ9KYQ@og$sbR7|vSv<#tGF`kjz&I%GGXp zMD;d#pK^azr%qB>*gt;PR-O+odK=ThATBTt0Hgv;QwqRph_D)Y!oZLPlTyTWHyy^4 ze$>4O4|E| zQBXK}9J4LVl}9TJiRB_p8^PYGVnZvWwWX8z(*JIS`y7@Zf<^iajJUGLIFx! z(3n3kUj>>)1q>E2Re~JXWC~cxz&1Dyp#8b&$mINdVNl)yz6##FGRKhFJy_J=f zfghC@uU5x(YAlkTb+Gsabn3-z!XQ&&_rs4vz$9^i!`p3^)Q30xRABkKedo?O&`Dro zfYUG%ibhc!isdb|&`gt+i5@FHa4E8uhg58YGV3>+=P&d64(05HoZsy4Tx1=%%f^fozcK2w z?Fa$FtfCzB)CZIQ>jmf!j!x9%?fG=ZOmCfSdy4HyQ=_VdPgTeNfG1%nL$|`}ae(&`b-m%^ZruBQ#ddlam79qkycF8j-fri$N=!f@Lk!%&pY>190&*Lz zkLMX|#+>6`3@-CI=)8JGSM{xjO@Gb)d|%F@R>VmTV{1zHp*|;@lph0qW{-8sg$&cM zb&b;&Uoaa3Eo}_%mnqWrz2Q=AKO0It{FI!oHM4Q1;sYMWx3CTwSJd>;#Z@NFlwwYb z8cwG?S0NPSCAp|$;n=#WeJmpKVd!OraWs9w(>^>y*=IAE_b(kdZICRpcUQ7#wW;3N z>^DC>dZUm-^r_C$n=08mBQ>=Th+q)a2l?`k=3<0hOT)vJ!61Oqn3jP7b^w8U_tLJR zq9Y9|pa_8NZI))DL<8Up!1TZmeEVtHY==wA@Gv`H zGB3F@!!M>cvW$|FFMrZ``;~bxmWpTF?qiyBk?HE1`GMI;=dFg3%Dfrx+JVB%#lrf; z!$Et>0Nhn!y;bH-^h+MfPzTfDzY{w=TCuAGcE*HK1Foa77hirK2zeMrp4oGpElT1t zTfk@4eNH&oE_ps;#3W0{a!-!s)VoMeo|(UEw`OcHNPvuU%6O-LSc z4V0*IV<-_f^d=&RftXwGP#!!tMA6&7B7JAb{>{`h)ix^{^{w`Rv`X88uzt{qWN%5Ha(hU8fg z9`Q7O5|e_`+0w5KhORxnQ1agS-56Zk9hnIfLRh~ff3aSY5IfJ!>@pFac4~kBq)+n# za|gemJ)?X>@N){v7x2`Nmnb z0cBbSdE^rdK$7+T{)Kf|v0P$*Fc%IB=Tf(^ZduNx+`LZQa@7aiwUaWXukYfhS|lx0 z{xan*a=DDGPzwXo2>6XejCv?DORZg9da{8v2{}flnj1-Lch5!9>)fxp(@e}&xN=nc z-|iiL>8Hm{UKGr@Gg3E_Z%n$XYCVxXlX{=h0^6Lh?}m|(=jviV>69GhF!5)v_3Xrf zM~2u*{FUALW|Arq*!7b1p%)zyl|k>2HZ+{EK4<|~L1pAM=#$j^Rp7=+oE7uWxz ze#1;cRVqhsk9NS_#x(g}YS&K;N9*yiM0)gnGv~9-vXicRrf!Yv03PY$Vuz-hw)S3l zt*w~1w?69+qONfh_Sk&<%?qQ@t+ez}Iop1&CNb)o)}kdH8e-%V-MDj740qwy^6aEp zjZOkZ;*=*t_f#U60b{4~|0C`#qpDuJuVEE2C`D;RL_`{tmTsikl+pqsAt9|IAT1jK zL6Gj)lr$*aQqtYh-QDlnp8LH2`+3GY#yg%*&;I7|AbVf?x30C;Tx-rb%bgvoFj3u? z8L>9%WVuv-Mt~o`(@t@xV*JV@iKKg%I6u>4ReK}TLS1&fm(%nyGk-d?`WpzSK3q*S zBl@-cOd+XAi3_RVzzbSKySElJJ<>I7!Aud9M^dKm5 zby(%&e)mC$rNX+^)sj3}V0)^stV3`hB$QwU`xg~*sN$S|^|7S6JjD`AxIi#2N9W~j zfi>Zt74$Yph!!DJ=O5@@=H?#W7lV#HLhln?t5B-!?(Bq9-n(gZ^D1|@=K&0_NiQ5k zz)p;Wp1x|hdm=w4XHWOJuW04YhCVA+eEUgPT`6mhsmt+NPmajs=Jj)&KQgD2R^S>- zKKZTh{JLUOYqMrJIS?hF9Su5^FWCjd>z@L<$;BowRY!-g9Ssepu?JSqlEOfm)?GvD5I`PYm9`D>G zp3t9S2;!`_diZ!uNW_yNHFRh-W!%Nol-_bRv{$WC;ujIiH}^|WFqquueW&okx3K&yCXjMtXLPdM@?FX2j91Zk*IBiV9$ioP>f zUh#S?k@P(cQGrEnbPw13b+_K6`J5W=&~@Z-Cqf)?#X((1hm)OJrT*;QI{DK)2CksJ zTd;@P__+LsAPtRw+56gm*gJC9tv4|ph!Ajtd_*R?W0HmI-IW2D$tzfrlw@4zRxk59 z@kUXC4s&EmE&Y5#)P*8&_BdNUc z2HD`Hp?WG>MyF4Xj^5wAdC4X9d;I-(Ky+)(X1&BW?{3A|3b{Pu){~O+oUkaOJc;x7 zWf2BT-$FxGdbO%^1}&J(&XrCNduA)21>;6oTN#A~v>okQsvuD>HX6xp8o^VYMh74i z5PnV=#|$ykjVkA>y{IsFZN67Fr49aAzx0hYwtC}AxSiSfi<1T2Q3i2tyoTnum>AoQ zrcm}q^&gf)UnT`8gIwbqN6SZDkv3^kI#X~fz7WqqwApQ*Jl^3pT>AxSt!qvx{7-Yw zdEm(WZod#adz8hCu+nzXiubF>O&ac=v^{kMyRz*i^r#>*xVji!&@y5)uv0d3w zfOwiN{g=Plk2i&cN6IxMSGjfM<#(L+4~(PZHPzK7-kzQ>3dN3}%Y|9`VcpnyI#Tqu zVQuHL++GGUcY{t-0<}kjH$+_IYNip{#Sx}pm6w{zEB}0eZJ;}g!$?$!W#Qpj8U06G z79QSS#zjMIIFdhA$_PrU>lc)=(Fy2yx~e-$sA5p`l_KS>0~))9g$AmGpk9NWx6>ne zjjG4qMN!<}6?691do25o#5(jUldjC4O6AzeX;$nJ?2_nMZ>i}0h>XlXW@lXzI{&k8 zw7kYXD*LTZek|^t)Ca%j*4E|mlEYIU*1*_uk+Fe`aqi1ca7N2dlZ6p`%-(I0RS|4T zh)Mjel^DD+UT)XL$%5At@0KQ9c85`7`{{92-ls2Oyt=!UQJg}~bMn~Z<=Zo0b+!6(tMTtzi(qcRZhOmeS$lbY0nttQ9C6m$J;+ zrzmYo4Kwg#0yJ%QD})@=LoFveCCF_&B;vK9;cbY^8)SJ4kj3Si35#6m?D8#DMBbZe z9t8*(mt6fc*k6#5oXuuCp8E5r_z^jWfquuub~#f-*2TX8i1iOW_PNkb!P0WSotf)!GB?bPhx zZ{NrSlUrvt-NlwHM;=2 zcz$Zq_pZ+D{&`mY(T^cq{e8uj;ivl<6)La3XClVzHp?HoGEeA$x*1RLjS8uvm7^=i z6Mt^a&c0-g*5)&-Wh>Cs0VGR{k5lt>|7Ge7a#+YvawmRJW&f-|S*4q=@HN}}xBEFY z_#xS8_gp7?c{Q#2B6ad@ZT^QT^ijw|9MB+)3mbe`|HXhPR{!<;MkeBi6cm4j;V8NE z2M-?jcuJ~&H;YeBQ#$AiAG|D&%ek2&%E~2FBxE>!%WDqWoH@#sdxC<}8XAatf%D!N z7Die|R@#G6?cw`sYBZZZ*>sCsHbwHXtuLfLF%{L<6L4}G&7n+3jP4ih8Ou{JeF2_g!>OaJ>^_Bu23tNQ{MXLs z-$y2-qF7-srHmp*0#_E_LY8@4U}K7rOGvFKjsKFo`kMY_3H;&Smz6?yML*DtNfPy` z@A;5-3$eCrbl1%{`7XO$)a!_Ou658?i@1`is->#xk|2_)e6!S*Ztnp#^@l2Y#?ZF+ zfM>;DLWA`2D;64hMNVPu+`jDx3c`Z1}1%eYt#*3*#vlU2u}g6W7aPhC?1K1&YP+KVgbm+wg~W7!MITMB{4e7J927Zg9qIN zT=+wbh5UrNjo_s)VyHwqE{lUzAQmksNdia0+W@ygcOX6|r^;bfGxDjTA}l1M?LCtc z69F{&eIf@d>;RY>pnxqzNlIGsqUMrAe|vkt#gAL{N>T!kIN%?6coYg@fnF@V@Gagqi*~$(;F~EfRsd0hM=QmD~Xwt25XJluW5<=x$Z zUZ>HYaltbxdX)@n$Mk|cK!@N+2_8Fmn1GVQM81(95LRG}QAe(?53Bz>Xi^3NHdwmy zL@^5rx_}lq0rgW^*-Wh;Yha4V#LPSt2F?OM;5^<->*=||I6|%&2mpZiddqwX4o)=d zL^6OT6we5(&x83Pnx&AgoC3Pcnv1})F)0Q9QQ_5>M%XO5LqG!q$t9C#zhn3YT3cI3 zM*-j31qD>|>xC;Y<^k^xI%m*Lh5u-HA^w^-@6wJvB}LdRlHlMVuX!c(feH_O4GTpe zg4wzIj|A4j|ETr~*TEbFK7u`HV8R4|c}D-O2U#IN2ja5_$HzVA08ezfn*G`bq7~@P z0$FNjZ!ea^G}zt!(g+#2A2^DOd;W#Uegm7wgt=GynW`%IkFNs52o$O(T+d@-V=Lin z#v)Rx7dgRt@bIC-a=*NSLI4*nH+R^5Ox1gs6u^r+C}@ilItMZc0Fp^fqGo0cvq52D zdW9zV62fW4s=#@2P$~wX52gu9Pu(-dKr|Tb6Bo@BbRTc08+P{_Ka&>NEh+==ioqD9 z*I@<j+m|d~1=I&#Md;;9xDNoqN#RVW>7&Ou4 zS67OA!D#`@&MPM6*AuS`VBG{}#1Ne_^o2_>i$?Nw+C6_xa=O2_2gXKEpb3DyVUDf$ z0Y=oI#b%g<|rLqL9(|+RJ3!Jw0F*DAwi@nOf{TDfJYI zjvVwz51)kOCyWsR-Oh95_4M)SIk)FOIRxICF!Lddys|ZmS~@xcYj49a1BX>XMM)p6CK)5glAAb$-BZ1$h49{pP6O%@MJQ&-P^mNO35hq8(aSQj*8qpyv^rwR&qT8iHLxt~9My4J<`9vG#7IKuo9=8-U2 zTbY^JIXSfb@3-p#qe7VTrfa#t`N6Yk&>{*y6vg?v7!2iBR@{vT+9KF}C>s92V-4Tm za#vF0&SDSnUw|tjPYMo?w+RUB&d;3B^vS^To1B=K8=fr~ks@BZ!pXs`P)=HD;Q7^ZrHjo#MbwlTxE)H1upd`Lt@8191tgusnvu^nyEH8lBFN|U!ep6)nbMz+0 z#$t%*_b%Q6)!D?ROKQqeQYgrT5J6GA_6+|ig_KesAXl%mK7&J_hUejao#@@UMmPn! ztqocr*+_z3+~VSOf9lTrpt1>be>u|>5bSHFDZS^OcndbxfR;4H8vOOEm>Mv`m=PS8 zfy5pM!tC%CrrD zOAQQe7Zx#4wJ71IXJ*RCN~IN10d{bU)Ym{kvI%?l zfp?y;ad7N_3nc^s993O8q-_W%78Vxt!3iIt!~bkCWnvSB5u)jJgF`7K0hsV0m;rYu z2i&z_q$1ko2SfJumKN~S(}0CbxcLc#dPYafVPyffDU9n2U@i$VuR1^9)WEP>HkkoI zURPZm51j+LUcL?2*%%Z6XGW0J*}*t9vZ=ZGa5<+6*v5c+4i{T2&(1bnsLq+1oYXfl z8BCV`TFYuNRvM~nx&`cHIMkm!XmY*FXfTaznus`huyNzv)>~K>&`mJJ1ycl+ z;N8gh$_SWDAgk_iE`VD*2^}^eedn9QEh8+Jw6wH4GYNa=SsDeP&yc1u4lNA~f3dg; zoX+IOLeW$7UqbRKKi!Tb!hdiKP&_zo{PwzW?11IM(&}fCR;^7y~L3IIJG-!>93xC2u z%5?#(F6F^xg zZDFSliq7=MkdotI=OBN`#9eR(R)sj^?fF1B0LDXxhK7*mp;|I{`LZ4!?^@l0dmC-S zLZZL-_1L`k%Ov7JcVGl;IdRB1nn1j?RoblBO!%0Pkvf#oFa07V1@3XQbmr3gJg{5K1>MNQ;Z8LP-L5@ROod*sX$##2Z%L8pup)pov$E z=GlZx8r-r8T;-lV-PqimyrNFR|Mrmt78LRHsxm^|aDOEd?9m+MB}eagJ$l{GM1S{4 zAgLBg^9401N1+#vjAx~>jJ%Yz)AltgYNX25)!u#=e0AUGJ%k7Rf+*r9Rp5;_qV}Hh zceV+w%7N)u0-n9g{90X2Iw^pdxC_X-);z zU8)0V9l2}E=xDSkp&gMpMIKNv?Og1q>aTN+#PB&ra+r$Js)8_Zye+CWG{J> z)J_MWFz2%(#J%5phYLx=S6$!G&~*-rYumJBBqVQGeWxKA?Zmymw_TN_VTJ=uvCTVp zZ1+5U0*0Xi?3$!eXvQXDiVqwG^#HI4m!?7&(=xs2HsT6J*5bLObNCJeMF>G`JQ1cB z`9j*Pd{F(*IWQ){@$fHz^rp8JF3Vl}H+mEZ4u5ty^!y6imRjek&%Gh|ju`7K@F-QiB9@-($BJr!50ls_-Kd}5^a}*X@0$n^8q$07B z!>Pj>M@FJ5N!#Ou6muM4rBNoyR0c(0NwF=ehvq zy#?+lbOTNo*-1t6bD54*H(tc#E|Q6VHes$Co^y~jk@qK)K@s8FW2lToDSTNlM?qGH zgl;F(19u7N3|z*-&Oe@&>bi0smf?DLHt+CCi?;t%3}}Pez^tR^|9@j$(bZgH^^J6#R6* zYw#{t+RiI*au!{`{qT1j?1ZL23m-NCuiJ=bF$XY!$D7;hVsVrHv+WfR@OW=78VXBopRF&vNTfb)%qdKu!#Iu$V2&i=GAD7ql>QPc z7ePZ)nS>F>PZxOdK@qud1)zhUthh)8EGC7#r`Xuo zk?~KBKs zvH+`W`s)mYS7UsO&J`BkjHyOI=7nnx`Y6N?j+EZ-TF)dUz57Mg5_?25a4hI!8gNP3 zUVyKP1-mZu%T@A?_}Gw>5ts5@V;LNhpc+nu~xou!W|Pk&F~Aw zn}p|ff0WB&YE4gk0VoOx2=EFVR_^KP0px|)nP+js=IjYy6tY(1lTV$Y%)To z#f(%3#Ds?-7x2Fw6)7qQq-y?v89IhO2?t@iDQG+3Je_lz&#unAgNf+{sq*;n5M(;M zhMDXn3ynMO?$H34=-{rK;-C)3e}fuJA_)YVxd2UpL{NOdb6)#|;vW!0ZTUK43<$g?ng+r^}bkhYNl2I{@tKt~6wo zyqOC{7i2G`56N(GaZqhAsCgU(4p~w;EdNA>T04F0)R=v>t(>pDS zk{-Q&eRnk1`4O{bAsTCd>S{3PVY=JiTpRfw^2*X&!ck`gdg%+y_QZ|#dezNff#LoQ zzHgU{0uKgkP7bWSi4X3f6IQjjoE(k{kx2ysX~Ly+JUa#88nmSrj6ESZi090o-h5o{ zc9^#1g>C)j4Z0lkPizy9PtZ;}xGCYWAQw5V$y+j!tB+B1QQVFk%VeaOnPQnB_U2QR zScF0+y)N|elB7u9YiSn3Io%nU-CisbHD0~Fs=T8^TZ;w6VDGFS0LA(>)o@J$c(iA- zt?#LdIXXJF$oYLZJ1K$I2Q55CK$9GP&$$^uStYv2vS>FKQ`j(1%gQrT|noSVH#c$qSj@iFbDjoKKJJk=j2?O7iOd%GnWkm1;s- zlIyyhkdwbCihJ}2mLF8OXXfAitD6W2bqL}ukhp;v2ETxSDaH`FDQ0KH zOHjOlI!I>Z05!%fk{p3dWxt`)mFtnSwY|G*bkzyAX_Y2Vko<5`QVTyape7^0dvR4Q z;U`9v!sI)dbj>0LN6z?8#xUCN=>1j=x7)D(?hLz;z(hiThzW@d(NP$U$E zXUMyoNOHA-j6|2tbMJbLH)3TPN>^1|IBU3}sKmTKQwr&tAXM>og%!gexgBn+mJ8Qe zc?66>MR}W6;ge7}&4m*gz`x-Qp+_BXyfE3r3JcU zx+e+)E4qGReayWh%sr|w0)rPlUV_`fO6*!DN04$4j2C}5K6DEqlY&E zp7xCjDwL1-9>Z;p^}O>v!1X23b?*kPi|AsGkS1Dy>XZy)ty~l(HDL$Sq56||H%$&Y zloaVPF3dg$Jd>D38y)+Cs=;E9&5sTf^oF3t1j(m6Ja6J*B4hAv2$YDh9(UfD1k9BF zvY^E<#}V$d3$b4x0L*8n$121%Q0kfWrgcF#9tl(!Xijk?D50U))u?h2a4f=vGx>PU zT+YoMdz9uIfg>G5y%N?5;)?Y(0U!E1MhBQMjXOxfxxmRg{=zn-_bAwzXaytXP6oMX1c?2m7CJOlBB_;1_67Ycs z4@+(!7D__5-_6bj>%O3T%F)|Lr@7;#-SzQ5?^@WaQMVTavF|f7f~G7Haoi_aa)!%K zG)Mt9v&S?7*_D6aXZ#&~LtG>vbvF5cbiBPL;ZD4Z!~!CY6Ry-QphST5S>L zl$U1>7A71)5fRNHF;H#;Qx}z*+P&ixccYT>WN>G+yc}eWEypUO!or@tEgr=J0d0>s zp>5lcRfV^kEz?>rUrz1-75RQrVnp2M^9rJjG=T_!o3F}AM%?wJQSNnNWUP91e*S4; zAskff*$CT~xphIRNls%LnUYl7*A^o?U&-awUhB&8KXs?jpAT;r_s@$)PxrKRr5l0uG=n^Y%FF5Z+v-VF%kSnc`rnTNzF|A}?+QPICxfH5b5=&94; z5@=`7&TM9X03~~Vu{|@sU%At~ z;Y4oDN0*ABA^+FU*o4~B@Wo0@*B#f7cNa~cRmFA=#ksY66cuqW{ca22TDt1!Ugi36 zq-P#?Wy!CJnx4MI?9gCte%dw1HRWA_F{oe}w`5WdozI?MVDSMwK8<#r1#WCyJK|D8s1v{LsR>&7%$Pa63 z_GM~3m3ayX4RGL@`S|AhEyDU0m`QZ!>q1|12i_F|V*M#FRb*SqLM(Pm{UHYGYU?P= zN(a&`gF0r;i|kTBi2&v-jOsbhlvVj{*J_(p=4+`dVG5IxMn|j`AS|Coe%Ki_Efo;^ z;q+H)ef>e+^4D+7k?9#3(PeKARbIqr2eeOBJyRY~60WA@-bd{&4Q_Ps7MVP>BZOd- z{q`LonW19C8!pmh!$D2i)b8aF$oaP`N$ruC|>Y5l&(;QMBLEN8U>;PWUA> zNTbR$Gp@?@&C~GAD4+=z0cri`aJF`V2n>Mq6vJZ1N{n4WV~9}Y>(xN*{WT%EG4~T0hczvee~ekM0l(T9%x~ zg@)>=p53CTmaus0+cM9}e1B@hY2pSLooE%WCZAHCt&&$Hba!J?@K2RfgEXDP+PGq- z%k-?p3ndM)q+2w|gF+iVA9X6b#_lH^76U=kv>m!X3GUo6Q!hfgi`KZwGf zV0g61QRo~dTp69i-P{?`Su2}gQHs%m1L{;6DH7DC=VOdiHn7Qx7?ClT5@q&V586-Q0j2{(0SbdGtN*j_Bsc{ z{DN-?;d^TenoBJ)8YQ=@fp?tNr)7`DrL>~jSa(eH-x9}mBEhy`f31S`yQYqg z|2XDemUm0ZyG9zS$G!{?sTswNJKT^X5F_8+Q8LrHyI%^Wd({^SCpFN)LDW@hG;#}*pP zUe5E4em|cdlGe@zHL2YUH zxr&Rw%()qNci@g}plkMavdaCVcg2NSXXEo2G0Tq2-Cgf~sWQv^%WFAaGk*nIC+9Rt z&E*!1gTIm=m{BY)E&h(?ifDiTV{K53_Cv_p;_lwB?|jrgxVk(O5xl9O6VsxnIT`b2 zv4wNrxWmbAnN5F%j=^c9eQYJAz*oANfFiypC;jU$TdE7*1DXAW(uPP5#FHX34QJN^ z%f7t4Sl)O1p^CKJ<_2=++C=N#YF%m!i?R4=B*(h!+ zK2#coEX*({Uw03>49{FIc~>&xu$HjLU2t^0RJ=cS-WTVePaPf|QX}G=5u0 zd2P&;AO;5;J8queu-o%7L1ek@er0tO%?@q~hUtrQ!JVZ+L>-@_d1GAFMl8WwJ-TQH zW*T|Q6kUNb#P6Wm{Y&dS4c3<{GfOa%(qfteD{m}DeT(!fNLB3b=^HP%r*(3AhR|E_ z3e>l*G^YC?W~K28a9>}9KwuodSdQ|8!ZaP7w?D24ycIwBNnGRuJCJm#($+p8A+xj8 zwcF4-Fwd$>^jv%)?8j#Fb%V$Ey2)Nke=W)g6my52pg|C`wSxDDkUT>M@j}lehATz+Me{1 z?up@wPWFQ$s{zTzdrL7mHjK5I<%AIhXmKX-GHUnEwQl+-kNqWqyk4%{+es|A!)Qf}q+gkCz_8TqBhg!#wR zzSjk|s`QWZ4~*00@7ocsl|+8?CcB^$c4N{5WlY|J>Ss=X}Y1& zEC!WFTPl}1QRzRF&^!CZHGuw;siob_m2MLdgNWySkWj+kI&v7@2wXF9w^C`Y&VgbV)hG14fModT0V zT&F_(Z7+yigcV^0ul`CCX~BF?fDvmHccxj(w~jzw<+M|JM%vaYH{4b8p)-BVcZU+P z&pL-5jZDIBcLI+r(s%WFA*{Qrb`+G6)eW0cM@( zQ^^tKo|fR@#MP1FREL<)^p0ak9?MgzD;_G7(df+=@EyQ zjJl;)HxfJ+j@?q}J@ZVOw?r_G7#QgZj{}t4RQ->3my{`~DfZ;axB)duUgN}%Q$LHL zwrdGbJLk94IGn76(V^0OV#CNP#Fr2v8=g-ASP5eVNyHT^kvUu zA&}6oy~&SR{m*Na7wRS!LnH5^HMx@d@l;0hbPoKUEuf`W?~y>TBrNkzCWL1)a7kEhMj? z->EfgxsPcOC=GLe*OTD;GU=SuO*NL}G+@g2<9d;e zS-b8f;bRdA4PQ}v28Q#UudmI_I^%%IGkGJZ6LW|g!I8j8ynV;J(oD3jmVPQeU1VZ{ zjJ!Yl=Fj{rx+$ioQZ6VwOe!vFF$^r4s~?hCFZ)4ls{WWW^(K3n5J(K)Efdg>zc$O# zd6Pi-B>wdUC0=lEzzNYdGb1~lLrgzlVBn=@N2~4SOuT(u-ozWTEg}A4I-80(!)Dgi zf$!7=A*ErUeBU0AKnpMCQ>SlG_r7ddrpEI}Gze9-Ax5hb2F$BIN?Hq3`)Bugsc^1e zpT&B75Zl(&*}2-x-u0RzQ`5_Ad7biwk;XKHThbNG`DIwD121R5Y>~eH@=u={y!9Yp zGl<7yTuSA8cXWqud3P`7a?Y6S{C&Ikg)a}6j_j8Q`!nk-J}Ctu5FkQ7_eyP0BjYm& z7WUdU6@Ow__B*!zvxgCL+HG%ld_#pBpj67}qdl<>`PKlZbE% z57;a0E!5=1KDv-jF*UC!UoN~q_SsRHn~nfz=Jk%IAbrmYx7P0@@O^XF?zN3Na{i#SB$2#_LL%Ah zM{FKn8h#EsyOIyOC>dE4rTqx+6&9PvyB&Z0Bv_2?x~beGwH!K zGocODXKlf7)YLp z1mE{`kJB?TDKXJHbF+a&JY%&`R~>EUc5(*1GgcNtBf<=vB2$n-rYsXoR~gYnQoYKx4D=u-B|q;lt(U@zRq!NvKhHJP!wdK15q7L_*5UN|GPruw$#emNM~ z&D8B&T1Yrz&=FZJuv+25RcigVvx9G%Q#HG4G zXXP#?nuZi~PSD_c2C%k6NbNYN#8{1~R0b z)nR|qPLQ_rvSqzBZ+d(WU$%kjyFK3LN0WMGHl#5h-c~ueF18doSZEQhl}~jFCT|m- zB~+PkzjCD%)DacU@;5lx_sEr~PgnNc``lUdsfqPXbmvH;D@7U4)u>MYTRbJ_d(1Yo zk+=kG@$87RN%DnH3}$aQyN>;PGqs>eQn5oS@}XQ#OIN(3dF=O68ehMcmeTTT=P|7- zIT4k`52_Ns`UXM1MLjFqda`T?-f9w!$vo?yva(jDylfY6Mp}=@QknTOR3FE1I_EDa zGP>e=u00p6XgrCdU;4^)LK;NBmMOW@n32ZM)=eWg$)v625Xl!UzTRA`SKct?T7|{M zK&!RG@H0}0{OLlCO7H%2k==TdV5NmTR1>*94K=lj#$nuW{=R&!=NgBZ5_sHpI`$?t zTB6#cqaHbMI8xzIkHa%&X{F@xrf(Rxa5=3j4V9$w##Bst{4~+wp-@Kb=jtf6T2==r zv9MTPPmTOoS^XNF7@(+txT;9+GHSYfP#`TW+w}^oTuKx!)?e)B`GpfdF}*BBYq%5a zOn^NFUoNO-tf}Z5hA)5r4zbd|PZY9tqX^6nLau@7TOnJ=jMCef!of z+=cF%KGMO|AS_!uN4?G6WdPjQ7JM3im42JtN7OHPDxT~yNJZP=;4fXO4yt&@ z|9Jt+xSC$o7>Vfvk)<3XMWzkkb)uPDT5q3S&iBS$Szt=|7MhY5baBM-^iL3@z4gx8 zkU#wbx8L0RJsz7ao0EOThYud+V&ry3#03YlIj#PZQpNuw++ zAq!8FmmXzXImC|2FW|Nu*QZ?=?G^fSt|*3sh1K5PtZzj}M-;=UIgqh9d)nXA8a2l8 zKJaddU<8|KG-uB3v%IJ>*J@gPnh*{l*@cTtc47-n^b&`6mYAUPPxdBKc_jCYf0wj- zKJw^m!#k-ougI=UoAjO61YmcNPOw7hiXQ z6Y&wB%hqp;u(A_3Z?^MTP{CuY*d5{eZb;3h=kC5Gv!&FW=rC8cP4Zvfe4qV4*V9J} zcsHDk$1ljet>@O{z@~1?k@78K(+4L~$%7TLXMNzT6mlM&>coyTuDt66RLU&JuTtI+~>7?40 zcOCdVWgm8Vi!z4@)CgyDL_`R-Q0;1#_vBpc&cr!C94>LHZTX`ds~cTo^(?eTA$0$~`}nE$W-acNYC3_FD~f$^=Vf&Aj7F+Bow#B{C|NME6qciyeAgR1GqRRHtT0%GB-|6j8?sw zPlA#R5EknKAMQ}bRSRl(jI+HDymU!WSq-%5Vd_I0pL`gRc;iI^xiWI=u&Z6@!^~w1 zic<<+o7&n@xg=#8Yr&}A67F}Uwsbj9L|T=d#GXl^#N*W6C}hdF&EC!)wLuNPI0m{v zk1V?jS@k^9*g#fVUx?byghKGW=mO>i&0)>nTW?Q?*?k5^v{xEsej7;K)YMAtTw`7& zh6|ay$SPewBJ!KV(#{ix@<^|UaL`-1>bwznhfi9FXoqyD#7StkjZMNe&{wz-wLjw6 zYs4@$NY3@LdT5*Y$NF&Dc_-q?|AiFg&Ac9>^NL{JjdVO!Rq$8jek+*yyNZ_njwEB^ zwQCjPT`UgIKIK4{o0I39^qSkMi(#Q6e(ZR>aiG08e4Z5hPTkapY=0bFD1^1EOqUa= z8-JKjGzhi4K$Jzg{vfd5_;fhku1BzXn^TQ*uRt+{Lcj%C{OpgiYl0rxiY$TjyZLF^ zOqZ>lC#!Nt*|+nq%ikdz`#HN+(@}M=>X`i~I4Fc5v*`JXdub_eJ{ucY{r!fAny2dh zmMZkKCkr$nMiB7`t+2e~92*(=E%qDBo43S8-3G)=GPaEmcV7RrJ2ZRGN5@Y^<(pba z_cQV01>rBP6<2qps)BlPQge?$#=9g+(+8KdaJ_m`LiU^SE2G85C50G%-4`KDj|sH` z%A-d?6n25%rklgqh$dyS?urFWwdk)~XD~1_@;SHES6szYjN$~sTSrU&5#Ra>2yFLKTQ9ckUMW7ei?v%He%HD;_BFLF@zowEoPv1?)(k4!YAGxU zODPUxS4U~uQy!)8xr^E-2DGa|kFxNeL5{#)(d44P;!7UVpp zRfv%`epS4?WVbvl{bDFF;4*JR@+(5CQA-iPn`Yw1avi)XoW*i}tf%Gpws$R7JUTqP z_SkIZGbP{B??b;{!Jx09_GUw)mHHTx=JsY=^g@(GQ4)3A2ECay02#ze@j*I zn;Wni!`Bg&-X^xcKwLyc!yE^~bW2=Z{kFs`sSodZU4Ixr-j+&yJd~w^a-crHz#Epb zuc|2nM%8XBs|^3-hsIPq0-@nzTSfFlHh2mgFNf}~;EP>F{5BY`P3f%~NKv_}a+^w^ zZYMoq?G#)lRBXM9A!CH{G$55!EiglNur+p2Wwt&JnFE%|d*4NjPJO4PR02~VVjfNu z(%+^V+0n42cQMk*e0coXBN5Vu$yf%>Y@EP(jzv^Iq5TS2b4cMcBBeT`M#`jq#5nEw zjhl*Hy)o#z(d0?52(xOsVa}H?&PB`en5t-Z|5{~A^~DoWQ>37MGF<~@k$+JlycHM_ zAw@c$Q5HRD{7hzfvW`!KeVYf8i1z;aKonO`hfsA>Q)ixUUHEmC!JR~hqH0U}r9b%d zjXLpZiz>7$V|p7yD62o3oUa4!aDhQFLXQk*J=Fv3qP@JmfslZAcQCMmIXg{0{(|`b z=I<#z`-xrBqZ9Lx{i(D}0EytwKh~iv`wKd@xmHbr+^DojzwIs{+fuOQQWhQFpcH7H zndi3Xetxf4w^znbCzsCdLwn?75U1qhc~EFr#zl~q$jW;Kd5>!DC#X3PDkwem^oqE? zeOu{+fX;nfFK|B7$$-B5-_BU#C+?kGJHBP*T0Q8IHl= z|DIvtYT1Tt?>sdtE9;xFha;SgTp0Btd~U#S>eYCGKTI{Xz89?StF{u0FCd2}-KoQz`?rWVY$u>YX4Jp_EbBWc?8fT9STKhRgu_$^W(PxT zR^?u)&v?V#F*BcZzl^OiFtjxEN7KwnDee$UAQ+A6kG&`Nnc2F9{@f<66R=&InrGF6 z!nP&^1E^aqBhP)%cVT?}0>^A)5{|*QZE9Mx&x2~rUClHqwKep9&efqDft_KV>bl-O z_~fgX({EYEt6tCXVKNPUKE;0|`}?G!(nB=RGq^aq0V?=~Q+T>XMX*=(zCWB3)S6x`T>WjpO zQd4p-BAPjd8RX!2@R{zLMpUOEtDxXyeY!2oiCdq_I=!o6=gwrkXdXIMI1f}>FuEz&C(vA5fuYS^>q>S^ zB!fd7!EQ+w*&R9AL$@FQyiVHxOQqnymo)y}9{Jw{5CZGK*tT!{_`}BOpJzM* zLP9_oY=k>QF5>;)ZHxzhcWO3d(W@mJnF6kxTeF0{9Gm}Q0ht3{J;0+`sb4(s6i=1Y zDRVjAp3nJ@B7&P1EwFNm5Y*oPY~NJz=Y_H|V9C2M2$0E_2_wJGc*{rpQP# za1;g)hw|WH8&$i)#%1ny_S8z3X&Oex9zY2g7`Rvhu)ut+r>~EcKbO*#6D#buUPtX~ z4cP8jz!#I3`@Goq^8nO4xlb$JR)P=XxiUB&yP+CBg?(RnEkdp3}4kZPY?swk0 z_jsRoJY#%+e2hKzSZgV8-B+B~Jm)-)-?4mf;E*@D66xzhn7i`7rfB)(pN+iyCb02H zMHNsF$LeSJ+@cDe^b80tK#d?nG%c6FN6y6z{C0ls`f~y%ZSbA`XS`uEe>PL&o`Mh; zBGE7+Zjj4xjh~~vV84d+C|s@BCr(Ds%qC%du+W@%G0=HTgxkAYEPNXiy{bqphIPK) z(R5|E`Ad<-*yntfS8X3a3;-jG$#j(cO)FE)0ho&OTBweFwkdhQk*}sCFTbEFNdafxqn-(_L}6J1c?F*SIfE28K(_hPivb(?lKXdw4jSMK@qprj%b z{bpGR3`A$Fc`YQY$C&Qg#H7%hK~ zEfOE0w7QB(N}_}?XDX`pED*o}d1FK@!`~^VUu$issE4?u3TjyvWKm+HA#dn4b?sz4 zcGw&SnSlV%7PF}?wOR4#9URXy$X}0$M`=~xB=`HX!geAu;^^QoX?uT?Rpx!DS$dhL zsFD&+umzvnmeWRW4XUB!M1e)?zk@*gdk|{yaipYJ*%|7C^H5ufMadZ$>g_uY*{#$w z+#tnlB6WdTw@EgRJxp;QomF}YuuSaidISRl137O*APz6KfQ`M-%`0S^DF#S`U$-g4Z z0EqiluIv0@|2F8P6o!Uiae)U(Nm=>H^6YbRTJ>Eq|5i!4(R_1p88?6DYa;)57pm7> zH0_-8A|)v*it%y-{QK#dxh`8P_cbP}Iy<3KtXR*YpMuKhVrp-)x*BpE;ISg;AFNhr zrJu0zLOV}Ph*@1e)1S#S*KI^mI0cbR@>54nUS25PQa+>>WQYbuT6JuDZjF)rJ#R~` zc!-O~YT5b5^H%uz7b9_5>#(4*-}|&UQ>E8i>)a7BQCrAZ^K5ticN#i9PClHQ~NIPFnGkL0MUTZK$DV+Ia_=^(m)gU`RN`z5R~@7M;r<>p|(& zLIkQ(GN1+Ee#X2%nSxE(DBgH<@*z2*8H@Yx)B2D)sJ9m~tN)u?&=QGuaH3=?Kwv<_ zX^*J1vJGh=ctF7+b+_+c77aHymH2ao2;v!Gm*f>(V`D0xv8rx zrRG29_7kCF<~N93?st$K9*ND|{ng|$g62lrppbf0VS1sK#{)ca*W;ABE|JK;haz?D ze=v0LOrCUtuaDm2F*Eak3>bIc|NT3#ME*$w!UJf;WBT_t#^~cigM$rBfBpI!rHDBB zG-O@@9h%94-g97+?d&vL8%zUpuO&tMLzDhQa}yJZ^|vUPQZE=>GCf|uE`>N|@QwnF zLr+hy6uh*hrKMn`dSzjugbJwmf4*kWHNHV3GkfjmNXlhR;)hK$^WoE{5s;z-XkAJd ze2AcL2Dj>K@DqdRx;LI91RIDZ0Ftf;nJY+ai(Zx)tPf`){DHe|;OAe<0_W?0Ba3%$ z(9JC~&Nq46SXdB~k`|?>i&Ws!rcQx{b&%akdMsZBfh<^9xQmCEm74nXCpV~Pfr|2L zbCZ~m@FggbK~6l8rxY*@yaS0I>&a4|Y(T)&c%0aEw}Pm4N%8?O(BMm+eBpPr@eTmV zfv_F~W(HI6MuNjn+6M)gBx-7E!L(u$5{hd+*KuYjz`nnA(~lguGQF~D`O35a=KSy3 zC)?$HKcolQ;k&b7ma?+6q_G8T4&n@8VsfyvJ2*J341_;!{f~b3{1M(|FbWz4i0x%S zvz^ojYr<0zC#OTe=z~>cqSnzuiqB;?H6elcKi`2QsP5O4o(3KPa3(>_th%ghKk#=z zvd_oI2T4q$qoc`uuD}HUvAJ1iHO=`?CJV(uBU~b&=p2Kl|LkBhCqJLZsPh9@dA@)D zuE>K-02a)Gw6r16g@Z5YzdrHZJ(c<#SzIa}9t~;f5btw8keNcPu#XthvHe0GyojMv znQm2j>_q|43m@EIW?b3-at2aXk5K=c4Dr<)>wnz22=VLfnCLh>(wL8l@o^DReTbif z6v^QV3S25~D@WY3;e7mmfwbPt2gDrJeHeTa4=HK6 zhK7Gn;kg~*9tK#O5s8j3U2fj+hBz9daIWNY9OJcF_mmoR{CQ|ev9Z0qG&9)trHbrC z{N{6wf18kPeiw(u;V9T{KbOARW2`kkD~5}04xawHElRa2l*$84x=l8Nvp*a(3(Gl` zMM;D--nsnV8@;YhaBqw>>c35%t;3Dte#Gu@G&Zv`q7wI&@2iEL2R@Fqk>9n7tY z-l#iWV&HZE`T1vGJS)}j1B*e3Qo2u5Lep4k+!_xvX{Vjx_0zuT@Y$KT6iO=Y9~%b= z=IiEux;(ZUB*ezm9tWozj>G|>L~>-dMW8>praiH%(6e(mq z4i$!%=mNz@o0vGh(P?=+qeG5nU%t+%NdN6E;9+Ui+VMlbi=V&sZ1#*)bKGXGa->pc zmKy8u-o1HP%QaVHD&ZuHGL)vO+_&^8>5E|3j2-7&_gb$Rh( z>o>f3yiP66E*%=p>gqU+LrEWVkt6f@(pkf?myLZLl#^Da1qz zRcCI8PDRm_P01roGe&klg#yby$y7caI&hKKmO0==d}V%%cne8oK++hO4xqj)TwWt16R;y@&AmD<%a}Vmp7TDA)yblHyZI@Hh-hP3;!e&~b+yYY*WoruBXj)x zROjcAH866v=c_?1-7G=Lkw+hRfoIFk6L`7!G9F3_o4ed}64CjmFh)2*1 z^KY0ik<-B@si5o6o{5J_IEFSm&NohvvfDPs7&wbHyLO2Z;mTBxlgb=z49TRviyNUX z!x{eD`ON&8l~_;G=d>}I93PmSO$}L+C>|J@LT@XxvjGSI5rr6$(vbD$en{HgGqAUJ z=R?dV3(NU8i=n4e_3EGeF)ht&-6v$BLMEClky|uwZE0y~rNr+~%F4}s=HowM!$&JN z)?4;`F%d+vppa(Qx3qjFeCysp+N;tDj=#(Dl^@!Dvuc;$OR(yjr-O4G4A$AGfWga_ zk#-tj6Wn+<)8Ot5FFqhFz>3BKf@%4ei_rK7G@OKq2?Qk`$pFoll-Cw9GtH9cneH@l zsnWn@T8!#QfbO!Sm`6{4fA&=Uxd*3qQcT?U0$54o=FdK-@qPLj4Wunu8JVoW*36oI z$jMVM5EFakZi+cHG6o6(qY|TgcP|+g#nt1|F}4cB!en7Cll_hc$rffK*3s8h;KqAh z;giy2@JIo!#c>qfToDeq56PbB2|bnDnQJhQ#zuJ4Ojou(-v+)DXMI90vY4dgKr9Qw z>Xc64-4Av5E_-Rg&iapE>j&et(Rl61vA)-ctR+3pDpyKe-JPw?XL8dbGnEy36cg-M zlP_c$M$PkP)S% z;)ufJEaU#d&S5ShB0|B)m?V=~J=PT6MZl057V7BX!ABarwbeJxv=7cB0}qeuCpc4VTcn(TR zibmiQvdM=jRKvw1K8%jj;3#@fS37d=V{EL$aRf@-772@xqDM3&wT z4+Mjxo+UCrKPep@Ir&h>#EymhlLU3h9=?9J(d&|%oBR3?jIDXo9UoE4!Zgu3&i#(v zbd1QSADngX{9P`Tnyr%niIaY1`0c&Esks4Ahrk}r!NQUz^tQg%C)K2z%&kKEJZBqHV ztGuS44VpcKG$n-=V}%BYOH5ciIv=Kmbar>cq`+(5 zhq7vWMnz36!*WXqLz~xmrrv7ev$}l|LqS4!2WYSEYWqjb8DQA7i+cYjV6h_JjpmoimI_>Bgp}O1C)LiQ2jn zQ&QyO?&r$GN@-_rM-wk^*$>g#Ek~-Ez>9h<{7_*(Vgb@r8!~;b<5M*lroRaDh7WOk zFYB25l915IAafw{G2RxGnKV#=8v?u!5}&fB5cmxS0^`&`Bqf9))W{|qb_%Z`=|!C6 z=RnHN>S~9?eIRa$;DA##69YFqSEqsJ29o?umJAGx9q#MzC+`~P2Ew~5t1XcAZW`rN z+%VQB?WCx6T-$tLfsbny`C7qLPk``*8o+SwO3HoCD!zMhu?g2Tkf zNd5&l9j1We1H?0tJD_gEb$jZ#0r6!eZip*!7j_b#K7RbO91{XDm&2~lf(#on8h8#N*{cqmDDirT0|}0X zpqEHmI(cy0_4dMpJ2b??o>o+3EMMa>n}?1hFZ^RSbo;TDVe6Yo$kFj34fF|Rc&+71 zs8hK3d$|L4HJ88LX-@xuRTuhtJ>Zx>+}o>j-2BU!Y4QV$Caf6CrIFQx!WYtS7T zTcuZBTLV$z^wgZu(nG_eTiwWWSr}M~1vNL559qp*@Y!u84V`v9Q+Y8$X zdO5U%UuDt7h2JGyNthC!-%l3s{0^%hygEC+eFN6fB0#4Q@YsOkY&L8jxmo~Sz`hl+ z5x8p(`$~95GC>*DzqY;(G|VjkX}myoUO5h0_%KKn^7G)=Z0l&-OJ9JxRYT`Z`YN7` zghWdJ_RrP8;4r1pSA6cx`1f2ZxA}f;TxP#^`}!}7hyp+datRFrOPUyaH~>Mkn)W2Xf4sF{IZ(Jq)2w=KtCwId+9cn3ayJOsnZzw~Lr1h38=S2JG`jL2uqEKOoRPxj0= zCmzcs#@cR^^qByOs@9F;!uWUb>w%}<0>+o;qX(O`#5X8ZVueK2p%1zF+Xldt=l8*8 z|HNjl9+Jagdkn--FpBzOZAn8InUjM935!8nG@~Zs{+p2!Gu1 zJ68Wq$|}npWP(Xznrdlcnn9r;U`h5eN2EkX65oB8mQ8JC+L6MfQWT#VuhCzic2eD` zje$o!I0yhB*u&xw! z3A!OVnwkmPGlPS>@H~vNRX~3L_9P482s9YOZFhJ~rR z9hM$*TPYhrCc+W*lqz^$rEP)_6#u8m3v=xnrwr|BRa|*J7X^PrI#d5@4MhS2%@PNw_u~tPY!3mArH>)mgsAv3ZnSXQnAD z%Y<-d4P_lUG~`=tuy4R@7VomRQU)b%bnU6psP0y+uV~{~`7ck%Sd!WqYFhBj>7Mc2 z^`*}JdY~D`sM|1~s}XRD_10;dzax62=4jvjjt+@{Z74p*IkwxcY>OkWifR>kFS_nR z)rldTnD#d6(sfzVZ`uvNW4m+Gzsc$>66^wn_IGJ3%ai&LqR9|~2fs^$aNYDuEc60w zj`LRB4nA&9eWH#`Oo~z~R!-zq3p$d-q2qO;`Q!C;g;uUa2P059qS);2Z!y$MO**gF zkDg&AsoeI=js#E&G9^3}Zv>OyzJ1%&gh+F&iG=4uLQHJ5K+Oi~AE;JeJl~qBv4?m) z+%!UNyGM?s0}y4^?2C+1qRjgq8+h%ckh2IZTMK>tGT?teB1|dskRtTCw?0E>4fqw`pb6)=p{%Q`i)ISb zZv`lfY|L%t+{Pp0+OUKWMU6fVBL;)CdadlA z(%rz=$w>*P$}LNX`uxcwm$JzR{!&@U=Pva@87}o^nGTJ&7%P4- z80_>z4eBxtFG&_KUs#E=sEHZ3PAwS)9KzLxMwv!IZ!Zp?-% z^kshDDwQi|{~3DOxqBURtL;a@1jPH=Rc!5kh*aOd!OUgN8xb8ZOOE37%L&JzG?T}rMQd&4PK6PK1hUMEUdfu zbTyOopER6Ysf*fZNU$16biPM3vK(3xZnFT1H&a7o&}ccmlQ6Jr@Ejr#nq1uY#c9l( zb`Fslr^7XC9I)|zoGtE^H&GMb-xyA5IueJFdbjzit*5T%U;k7Vp(j@>^ptNv1lp&M zm#$lD-|>{JHr4UwNFXCGDPa|;BZ@}k=b9Mpq;3u{r-{!4o@k{i74hb)^Eh+7X{RJ^ zM$mwio)5R>-f7cqW4AR-;J7tmWnCimC4==mv?gmr+ezO*aom`<}#*BtJ6J)v4%Uw__%MamNy%K8C7P)ZpPbP1FWHFn-tqcog=tgiqB3EW-b@81_H=V50} zPES`r5|p!R3!o{0_tx9nTi?(C>3W@z{Gt;;=*O5FG0>y~JY-kb6S#d7;^P$uGpX;i zy5G!(A`f0|qOLT4jH`h6rov=5GgDSnP{l$IPaVI!C3uBWDY&^#yoHH7TkEhjo~0Co zkLxD+OhJuPzQ=nfP1+(_1~oizd{7>&!ZnT^4VtSzQv?DadXV$gu^f`Pq-JaHR?5@c z;&-=*U)oPtKV>hcB{ADQx%;vqp7!WH>Mfm@J~zEkWuD9MdT#eeZHCACqLbONRg}Yg zUtL|5bTDW3jsBkbm{sByucH|q^JC&&+NT_h4P_UChAkGa@=MeO{HW7iow-JHb;Q^3 zIX)MOLt@VN#nk1%yVps0>}*yNm5Z!sm#|IJJUuYHY+`EL`%>Z8y;q(pfr?` zp<_dmC)v)!Ij04jP^yjPrKId@=a=VFS02ub9}ltrv2mqJfOZ9{09=byp&J)D64im4 zq~dy#5~*uQF)acw-iHHU1sZj@V)Ew=o$V_W6-M^ZX+ugTKr=N{($Y6LX4Kly=r;_v|?kuSU-D-;Lfd$ z?YPKDR<8{yCgY)b-n=g6v?#-XRU}Fybd`jCJPcteAD(+1(eTxkD;zwWcGIqGTLDMB~prprLc1 z=+Wg;pW528JPamGi(_MBMdnhH^`{$f}%zuMeIA8vq{%=*W!93qaw)t5365_}1j)H7@JxO>`<~Zb8r~tB%~= zeSK;J?D}*e7|y^xISu(Qe94cyzP=s`yqNfS9zat=&3d1Za8Mf1O7E|#;@C`Csnn)x zf8M%!Bj=-=uO1uI^-K=5v(Vqst>0ge0~4YeOw8q6FT3BC2Q}I(>HgV^TSBSlb38m8 zyq5HlGNsg;`2i^=T3BF+bfHcka7mUL1|D+~AFST;Aj?RLR#7Rbx~7GiJa_3AQe;dRgNdTv5FZ3-FK6SSIWk0FFZ-MySR1{3eGQ$|yf0yVzTPQ2WffVQG!!St zMv;`}=E6b4d2ivCJ;6>^W;Pqe?>l_!7fh)V2XtDIAS+ON$X4Wg{k}k>&z7Z=Q`kVj z0E9>pA|31drO-Er&3acdVwJuy#L7@y14%mfdoH-r@3j?qUM*1vNImN{i zp0jc(O`pq(yCNfslXz!p?T;)5uL7b#b+Q9qVr$N)kM<9f+@W2ATlY*tSRwgR%;?!b zXT8gT@J@0O><^{{A(QRr&uH8B+L$PWj2_SaZ^y@(;XdTvjMIJDJ>A{=8*{I^3mtVE{goE>B6llOGLmEE6wgF!%VH^fdEy6X4~%e)@1cB zF-QX{m=Gu!C)=29z)P@JpB=r3b8f35tW0W67n0a{P&C<>sq&P0GQBu^=4&PF@dbtU z?WrbBH7~go{GmhkyvtYc^np-e+M~Y`qBmp!t9J(|C-eZ+U%tFOWA;!$My8KeDSHO~ zd*=so*lNT9;tsYZ&@<0Vng==@Q2*p-^kMV=ST1=Bi0!cHX>&!o`2*t5HCOwSfGJxG ztY&CED7{RBdIAWimP3H@gt}4j;WF@np#zaEb~rTg`55*VzzlPOsu39JpUs90wkFH$ z?6OFvO8`z#TKd|)BLBsG^Y59qH>Ta75t;htdIGB*$V2CMdQy?v`e)C!EH^o=44A#* zpbkhEym!BN-r*Cpy~kH{ckBj=ulU>zR)5xPY~(ubP+Bce5Vmx+(&y&cC>M$L92!EvPH)3!&k+)S?LPlLe>0-bPu-SI zYnCl=SAIBr<^cO2hhe|OEL~C2uhUA4<*z8WIZF~$GUA^vN4L^GSiJ1r+>cOc*D+wT zd>u1kNey$Sx=+6( z(+wbf4NrS|9T1=istdI!@mXS=*v;n#*w`D++nwyM#Jt&k+|#ARDA?FOfw+ql*-z|c zY+R(-J*WpUP*A-KORL#6=?$}$CBh$gE_}WADz4&&+wTmdYkn9y&|9&@@I4I$Hm?^D z=mF#;F5V8&4%^?qgiy!&u2SRj?S16=0swe`!umt%u(ww;B`O3IKoqyx;6pU3Qor+y zqj}{3XjqKrs|@iL;xXLfZ*wc<5M6)$Aa0 zH3JCQKDOp}_>Gm;v)y52!Uyv;_BlyO+6o6yUl?^0adl?N=jEA$Pr>EK;#9F!0b-{h zO5^J*s#CvT?YPS1M-CE-+|2!grV&NOkvz|S!G-IOnV1wrMP>GvP*J;pg6|VK!w~QSLxagBitOgF-DH=+3I>$f{P#e}T=jv7Z%s5xk$! z$x+^vw_|mG_3*xq?Cx{p%H>0oP*{~SG<%@$BRxGCc%^thePrn4B?+{Q(vfJCk`dau zCWO99YDMxorh%KzzI`V=GBPhNPrmvG1Ss98+kJ@w?LSDs1laQn)ONt})6$~8*L?^H zP{|aez^(PuO@9)Qn3$NKPe(aia)-TiCYi6!?w7<1ONN;Ath}i#C3nz6W8em$vqSQ* zb!nMD;9JX@Er!Ay&hIOl^!K`+sjf*Q8gMp~U(a74ioZw;`2WaG=G*Mg@cBKCB59Q- zr}62Ep%Y!sUzEP>czBYubQ?V!x@_P=iKS^?3-_*{W|G5;S|KIffT^;FU44UJ_SLAx z{g+LWsn^1*zyT$w4X80|9UVx6P-=XRLrZ(wq5Lw2NtM#!nFTT9oZVH7cSLipJ z((7x#{S?h6vRR;g3kN}SK8IL!-UzBeN617q+P6NjvX<_`w7Y8meeb(>neTgFa0AyR znER0mypZGO3EJO4Hx&5d<>lqEWR#B|ODg!Ikt$z@pK#ynD>O+4p!5or%HMdE|3X|S z?JhF^uXk;k$M1|>YyLdIKVburNuYNH$QQoup#3{^W$1@+%+gCm`iSC1$9!VE;zBfg zzmlONR07AMKURL`7pRre+z82+i86&hLF%SLyw4WyL?t9>UUnGY4bBfmOe~T91sE(G zeKtAhhSK;y+Q+}jFk@PNe$SKgEb4DjXNT)u=gzrxXWdaf1Ie{)^8KKbfDssrpd{0F z4*Zxmc1UtSSE6C_@*?xcBrQx!)7R7MJkNo@lOo{Wbxs03ewfE$;97x9<*{tyLb8m@ zVhb{;dg5P}>NP`UZJrL~Phw6>nrTVp)^WWT@k!1_ z{*Bw2w4Sa`ezpY&CGXiv5OJSkq|YU+*TCdO;yHMnwp9(6zuHp zWaM7Fa7gCJP!OHYmf0d;Oq3&CuypIdvI6kn7l$rg$IVe9zTBpQO~c|`dNrnljj6tJ zf7c`Hq&!wjgR0^rr>)6vvOCjNIpTZSkv`=LR5fV88g0%qu0U}*_}QBb8&pNhr1`Vs zL_SZq)}M?RfnpusK!@Vd1W_~)L9h=Pv>&LLm=NtvqvQnZ5)L-D1O{<*R1zKmnH+7N zxw%|&ZI#7HJYvpz`~`83(UeJqZV7s0dF(Dc;C0{o1}J?XA6q#5`tBLMM^a3t`B{ZN z#%8L#t1EBpeO$k=u&%qqPJAnyUE84hk(NXl(QK9O71STHaeNUJ*CVf>nyGWL&N*B; zM*Y<2b-`oX^74@91hz^t@lT9Ren9|K2J+eA zHlup>#cos9|aRV_xc#unVO57H9{5&%+Z{2exNvBGUFB@lfNYaBY z&d`~7N~>&ov!Ri83DHi`nCzqZ#(mkaN)0aD!NN)xdK*4)1|ZBbeJo%I+Ee+<%Bvi^4X;hgFDZ-|@^%f)+^;Ve5dY_!f{V6??srSAL6CBht)4NNGla!Kj z)jVHP`Gw<#K}b+g+R+khkOB8e$nh!?eC;q|qCHJ5F77wURnAjn-*Nj?PC-RGm7%F7 zw^OBE=a5~sb*LS)DC&QFawcf&Ew!V4gIDvPz$MS6N|r&lF|pRa#nlav+!agAo3L}* zyD@7ENi!PdMyR|OP@9!EY~Uf$Maw4D!h}!2`*Q2@!kwBr+i_!*acBv^VEawGAA*7X z2jem=9uCzhF{kJ{+P8m75pfLdSbZ;>8h>5f3Wu9(`Nt1#ht97|Nxbqtpl{#*7!(xr zAiSpLBv-)@z`DrMMH*RBub*{Jq&~D~V?$~CxwOOz@OmgjKtFir0beX;7{n>Wp))~2 zKg6Jvje&{D>%66BVCiu*=XoX(8W|O3Gi$p(TLDsV8|+UX5tD;Ax>^63gO~r$Ie0HK z^r%8%*k3V%YmA_D-$3%F17)52*|($Z+Ckk3Y@L1~2F4=LEamOK<{%fj&{?Vh! z@3l_W*4yxmPwrRQG^`6!;j3VYlN1)dvil*gb{Ih!0O?BoDFGDszI~&%UuCQY4BSt~ zX_|_hRpNXk#_2}U4)uQfHJhJ>Q*0(Y1UeCpMHfeB$A^8DIt?o;Mvjgg29}n}m1=T`yE;%65_jPBx$h1A z-Yo{+-%xcs0fjhWt7}G1q(N?UrvpZy4!_1Px}&5^U{#}aO%>MBX;jK#0$YB)+rb}b z^X16KRhuun$;cF)9$3l96!bbJpX}$I!RrM7>PxPZ6)}3qD~jNakt(tu&>g1qd#qag zlGA&R#0Mh;zrU(jWf_(UR8-k{_-WBEr`geq~jK)Dpm{^YD45y(!yGLIVE4r=XJ z!(zol0l5zlbRMts>Y}2e;$mwEpKEPF>o1)sRHuBh-TMAM8x+PeI7-mPE7BK&90` z^q8$Tkz;y%yx1lsnWHE_iQE2F2VkZ~xVWt5zL%z5y!&lPlEB&Mc{aYyfA-?V3uLsM z!;M7sikshX6ZtKuZ%|l4ULyPtF)qCO7G8|J)pz%bGeuSmMO^8l1(t!Lw=r!RmZ1IP&2 zAj*#?1fkD0HJzxm(mecTat$U95RfxBha5xUyf#Sw^y%c_;A_|`Dlfo0JJ&u4&B5N@ z0`e)t!^7|I_^*H#w|nns-aDL_s~8H_QIw}{`)eRer4g}(hyoahT9}y)K7SN72t#EJ zW@Or254r%ft%(wd0KG~=XcX8!VKXi*5?iLGbw(xu8My7+H(XgRc6NgurBsQBj&Amb zH|>UphjY_t_6rJWpuo07SE4!P%((p3azFPvv>$*3-<$H7isMVB@BJ5*;lQ^6=4R~_1!}F6p1UaafF7LUIa3iWC86J4L_~ zh}_>$h|F5RMA6Xu@@B9kWX1fA6D(3K(tz90%#5a;0Xjf$lepb|(o_6Krg9WoyhD5$ z0IZ1ihpO5#Gcom*p^Ge>M4BqPm#NKteTW)6y#u$5J{pq zIATIalwbMYp?wn+7O*Q26X%gp?{AgBe_G6k!94y|XX5Mm6L_Mbm8}$*2Av`(kD(QM zFG*KYQc@Mfn{y4gX$x|a;Z#UMu3#4VlpGQ9AvUx4FoTl%TuONnD8a5Z!OrA}cj!4e zd=PzdxkZP=ELO`&rOpMIg+dQ?do=IU;F)<|3@aNO8%RDxFyLMU_C4;-0*di72u|7G zw*=)2?RGiDqv=Y>s&X<3zz#u4Tl>rTyl6ynMBE4YyT+-n5O*BX4;6?M0c1K$eGfib zlUNY0StC*1+MV#gQ%r7(gt@TI{IVF7lc|yzJC!*ZZRL~35byh zCljnRACWNgN4$hdc^sg=;j*5ANX?z$tR84{($bYdS|TcH5X|a9u978oLjrbB-s1kA zoHvMe5g))<7}1f)dnl$=@pX=;`P>d5(4%*#dz?`%Uc7iuaR;91FaOUo?K8l9p4PH7 zEOokI4c||r>A<5goU$D5BMcOx7p{tkv8b(Sn>V(xo=Yo#_vM*{I$ziW#IFJ;lTkI4 zx&OZYf8+!2GV9x#LmkKt5ym?+o}8~-xTwUD5!c#F^6%tC`Z<{v#_lwzzD=aoX4>6F zJI)<{Y-Nu#659nCJ}#+t`O&P_v?(HrXu$5_+iXtMVg9wmG|?ky$w;ZnJe4*gzkQ|E z$n0pRrno1pYaJ~oZrXxS{f*$?ts;`VR503~B;Kbwb?fm72_4ydcJ4_ZVn?ggh~vH1 z7e{JGZXzby91lv(&w^S)Ccf-=A0Kl#om$AdBuQM53A(oS>r{I*X-_0Awr{Ln+`7Sf@KwA@Lane%H=NcOKddtQx+`i1#&Z*0(_58}qi8Z#K zv@0~Wud^aHIog>$JnwSEHLkY1xQBS3@Ae!foN_ z3e7^g2^R@ZE5kEH`Tw5K+X(S45|UtBqrR1)Xajl-nO4JZ7x^YE5CKQJY!A-@+x+NO z0Q3fFoJtJ`rdrSe5a4ybKfuQER$c{+FAeoN(=yaB`=+&PE@NRU{08m%U-QGU0pSjy+C9BV%vvt|Ni>D<>*5)o)lknt<$x|+0|acT9f5_3I3j@%rmT} zKX)%1rV*_UdEsY9CMNJtO&S05VYV>t6(XOrnfH6=KlCml%}2({0>w*GaQRqH_BmWp z#Sbw!5s&G3WHUa-4<=BqQORIB($emSz!H*@jw{&l*PFB-_vdEQ44mml099ZTNTy8# zR+?0;G6*%pOH$VO%4}`HF!+9QX&FZV*$Y2u^_P1JH~0&jYEqJug}vEXoENdBj1~l= zpr2S>@bK~D09sS@CS2+B_hF|d(RBcYoBCci^qNC4jY|*r0s5x9_4Gsj`*};HM%SeDg^7$($j|%^ZUxUo^G}045S2LZ2jBZ zi~Q~Ep*T`AYd2=cWwe5M6qFbM=~6A3H8V2mth^DT&B;oqk(hYi=z+<~!9uq&_U@e+ z_%VPA7a2|0yl}4Dgi>+uCR+SVwQG*&^!WArvdIFVx@6LA*j^=DSiQ0>-gAi0YQxFt zAJ-|1^htp(scUyz8AlPr2@b7?(5=?|AJVk3rCuYI0pYVi|A3kRP;Cip7T@?Jy_j^uo{2>gJ(f%9`IT5; zzU<%0db>Os{Rs&n?xRlYkXRP?%dcsa_x||#1%!+QynA=q;D9W_biSFg%B=Nk%hJ)& zad~Np(`K5*a&!{))0NAmNSD<;Kspg~nSURQFa)IK9!!Rc6N9v6Q^(wf=6g^uNjXd} zDSlsuz!2g^5(_UMgU8IfyxXiGkYsZ_-2&8dujX!yx6qr1b?Fa!f4|j8<=XF0mOp6h$scoLuF?Ju&{QeG9m)cGVeI>Ow4EQt7!x>H zSXprc;R{aAkPw_40Qzo?WF(x&q8w~42wr!|#6CUTSX^0o!+9l>P<4lBkc*sLf6ll4 zM|br4SjJ{j-4Os_RnuJz_JLfY$|!6xzEAt$!A?xk%e|v?*G_?F==F}Pb6{UVIovGD zDXDTiV|qlCX#Yd3TyHxiWOFQ!BiB0xsNE&grLOy(`Y(y%tCw+>?!DYtUoTQ`%JZC7 z?UZ^r3JOi5@ZzL;0gutvbmOXKNpbNS_xh^OyJ>Hkej=v${620 z&$GCGaIFj1)+Mn}pJd(N7x_ zVNn~ZWnp1kVnkF_R(Qz{0J7)YUG-B89ttq&T>2AGzz8wLUyc3ly)43XPjIP|U>!c6 z=keOWC`Y=zTdw(%Jy-3hU0UsZz5A69^j!9`LwjGySd8Un7i4TEj&un=Tv*KL`1Sp> zSdT;UOg}#U6yKbCH}l5eVg`Smqm!MT*v!i`4{mmugap$D`y(Ar`#riSI#73J*=3=X z%-6RfvEC+YXt;MmDU(`M#IL`VD}sy;VJxdo{rB(R^AT@2+PAYizp^6O;TL?mQrcnk z;6bu%7#3_{VlP@dt_F%t3XH2{&lAj2QyxBI$301F_wHYxsOxBa8=yU_gId1z7CJ3Y zeS-3yKQp_H0;WGV$DKa_QnyaxO_kc>f1PXJ;RML~xT=MckeK4zV(=w+uf*&jg;W{j zwVrdaD%&a4*40S@zqd_)uTcH75tnMc>sf!6nZ7yEjT;wQHFj>Uo^oC{K zf^b`()(~ILH`?3CmsAP~4ufwO3@5%m^{#f5;s?iF71vMp)QzfcV_{X6_cC>U#F}b! zq781K-5w;ZI~>nbp_In2fR*`5z;5kNltl<0eSCVdWDq<#jkj)L?q-?2q}qg9e+@PcCMZ7-Hpi_;Q9tZ$(`MH zApR^THhK4Sx6CMLX{qfcZi}q&IF8Y}A{Dk8GX?y>mT%uQ^htvW?57$ncHRbrx6|(e zNjUUsNz%|rPyX&s!g1Qt(lQypt45I&)$gn{AAK<~gBTJ{RaG(pw~zs}->196wV@*W z{j;qjo1y_uMG7Mf6_hwpjB*c5ZFb~dz>{!qNUl}$abTcghKp^?FJ5QZ92riYjpTSo z7Xd=L`8C|~~f@SkA?6X34&t~;FdHw+FAPEJnBXjV;6eShfrVS4K1V7h7v z^H8m1p6~Tq;Q5~l&6jKI8!&JrZDrP})oFCowk+)bmADC`+h<&0ecYO<*a23DuS>J9 zA=d98|KbvzRR=q<=*6Ms$3U{iBU4T*Kv?~$I<383j@N9NrtmPgAM7M0;luQEvE^-8(~NS^UM`E3i9UqbaJ zoh0z5K#)SQ*<#Bn%IP8ZmgrxPmsKH7iNR|-2O*ssoAqXwmM7C(NM!sARRYt_+uT6Z zm}FUjf4b)5Lr7~)bRmCny8p7=VXPTJ{S+xsDbmU}S~8|>*9uPO0oE3B)J^v^j~dqD z{SLWg34UB=S?D7%DnGf}az%$4fW&SR{qKqr5zJlwRLlILt7q-4Bda{q9(2wi_AvX z>sM+0UTtL7P)n=+_$6A_1Aeci^#kD#jx%3*sl8Zr1-)UJ!gVrJR#p~iAuu$gJlIQj zTHoA6kAH4{@fenS_L$(5Wi=bVVa>M`XNZ-KAFvSTRHP;B$!a{<_t7|-1?Obqjghh_ zss0RfMy_?{CP~lMJ!5*(w5xmX%u`t}w~%=_lYM{{o|Jo8c+^C&T+m>`k}m!b-X`jr z5xW+K={|@x1YHrsN0?k+e{qPV>^eMFC4EA=f)=VH3?|u4cC|i1DDd~Cvf5-N3=BO5 z&XzO5S<>>Xf|v)sm$eMudZ6wv-Mw9~h41E8+hkJf6JGTQj$c_M{hGQzLpC+%_*9%R z{7!7_GX>VtvPyOq);|Y#j*WNdjsE_AMbUc079rh%8NLu9xD0l?%ee&^#6AIs1r8~Wp_$o3_?!yZ68`@1DVCVC zcSH0|Kfs?y5_u$3!Jm|S^`%JvJqd8wfi!(jpyJpMts9s}7u#>WiGq^+)OHCbXP|)^ zotPj%{FM=XIJ`AtV>Dh=v8K$F55^&3VN43?Vvr{MYAl~hM`~knvF!C?3-q>d=~XSE zD+5uhTBUkE=M0ct3(dAz4vT1z4u5F2nyJ30Ia^^Ww|EPz`{J)(??NL4PU>zG2v|U+ zim&(s!XiOelFVfTy__M?Blq?7K?^_pH{4^;-oVf4f({})iGDk!MqStpH6Ym%LCZ>) z((980aXgIHKJkMSU^aS3c)PM|c=+2wJa4R^>&ljV6bQUG| z1>qs&ak!1HCV0P*7Su1TLhZqLlA%OYp#yiPV*xVL*rregeZrPIpMqQCTNu`Js%fms z*q*^LpFW2kGbkjTLG=P|pBr!6bRKznctkU4ga1bp1Ef;MKf0sPDju@Vfc)Rrbg}M> z)wB}`DO$oEpmB z|DIHbpJg$e`5b%#Tfcr4s1*2D%RVcTj$uj@dKW1z9wjux3VlhCf~yv5sl$BvI08b& zyZ8^`b&fop$aO}VOgM6oLAEcUoj%8R46=9<7a*g!kj05UB8t1|A12B8o|5({*Wp*MEL*H!BxMH+E<>2*gt-tC&mAw7wFu74!SFo!>!-Uv~IE-=VW3LqW#XoZ9$BDhuK z=TmIOau@L%@Elw`0(|6giT)>6ipgMI&+}siA{g>*L&M7k+Su}GB2-e5laL+1AMG+B zRA$irLPkb9iq7vFi>(I?&vu6)Z4jEmSw@42OpTC-5fWqO3)iJ8G*kwpP3<+`;J$O- z*0POHO-(H~?rC&8kUD*Ma~d>J-*QqTwD`;gY?p3Ev)QdY`z#(pHk7CI*!&c1G9kpQ zo~I5cR$@Q1;9$VN!ELuf_(bo`sBe)8F+}UZU9t&K%$E%-)IW7=wK)^Y(7tAbl=Rs5$NTF_(B@W$*C!52;ct^L>jzPc+Avd zSszkFBcJ-lBM9b=XcS!9SH52>OjN2)P#e+~jrPR`}kb=?G>KOj^}XV5Ewn_dX&b;&VSjbKU!v5s&#! zG?+0FLcH6krLTJfLm?8r=+r8a(+WEKy>J(RYUy`0u8PyQ?NwS$3CQy{+3P&O^BGk8k?S!{morHZd?z{KG6-Sk0hsuyQ{fI19n` zcB35(Ngv7qyOque!K?EM;kPIc9z0kw&HGN9pZ_jiPLeNtHXz>*3H5~fJElC=AF%NJ>Ij3S&c1~M=J z^z9b3oO~i2-I1qN!|HT*9RFZ-FijN3?n1-Y65f0f?|rX9j`9mk>>Fw?J)@r8Q_*#` zByAL+xxX?|8hX3*Dngjz4zcef-ia>^Pz~cDTza7{h#C2(2z$sC%^o~|25ecF&&BEfW6>+dD;#Jnqz@cmgH@(8HVv8_&izmLDf zpJ+;NWiPt?fZ_xAhg9>GQPJB@KD&H$yF7Pg-=nC;Zfp>~k+bEyb(1tSOX@A=XOv|U zjlo_r?{l9@$vkzHE&CxY6pMnQqNIIFyRL_5AHCywTBL8v-hR+l;q-0<-X*ODGBPq_ zmXv>pDoh6?40-*BYUvpCMh-JBnH`J2@ROpVCPHFdy{+|sn0w2(D%$NJ&db%sM{*|NLg=!+e?#b3XV!yq+WHzVGY0 z_TFo+wYJPv1*##%KfEk4HEiQM+w3(Y zw4JhcchXFuHB${Jq$3q54V%+);Tvu|V6Ub>1!@Bl7jg#LC)Zc3ZAs~0+xrVfKsVZ; zo|CDXH`v4!7-sAtAgc*JovLgOI#z6c(|z*pS#qqh_ORV)O;=JXr{5EoD&QJ=kCb{B zy|xmE<{{lEN*#XaW#M#s(`m6x-xc*QtF_DpNWX))s` zR~zlOv5Py(H0(^~?jgV>i9y^BXHtTAa+7$P`iWZ^|L0l>4GW_eV`F3E^=GQulX-;j zovq{JM>UIcwze4x+;hR#cX4$bh^!&?q|6khWsRg$trw*y=X)Ba;mh~GSU`R5%h_+} zBZrlGpiHAeQxo;g>k-u0wDa~0==<3R?7HrC@nk#c6A+su2MOe=_ z&JFz*U9??tx|cJXyJ2Pfi4F`CZ?QgWUG8q?$?MirfH}-Yzvv7W(r&&wd5ZiCZCR!O zAwD7Td_zh^BhzkgD({crOwn(THelztj(~k@N|X1udX+M##%P3NRK5A+2O0cw~pzsiK@D&(FMg+lx48dZ|IQ6 z31%fbYxRrqWp^I@g$84t%JcMvpkcp}Qu8 zlzBi^YzQqp5T2QA_|070-C-frNyB`^<+jDmABJUC~o;{HmXSJA5 z%$@=5z2K8|E>4#{6Rnz^Of}#695aqAsw2Ny^ZSenJ=h1dE6@Z$|X` ziJ9R~Q-iCHn)Ir>RL)s6P_s8AhE8}8QsWP3%YDd1iJTT)Zqx9p?&Nh7qW<1|rISB; zeOL4uupta-Nben0H4NG#Q_%4`WG#(f`f~cy?w6Ow67uh1=z13?rBUY}@j-{ovO0Su zfnmK`R{`7Ohi`Dqm;P#@yjSZT#agaaG)-BwJl!v>WcX%s$N3y>^$nMX%7~I%6b(+^ zOt%Aahwt+To!Dm$i>rX38@#VwwC)Mf<`X#Ts2sAgEtreu=V$CUayH$HDya^(izxGn zv=Mk;M_;4t+KyDN{vBol3$)K5|AlxF>Av;o!|a<4kN0qJMDO*3wOBUKb@OZ2;_}im zAFLnTJHE7QF~;^^9kZC!oolpX+G*lsMm6I-#m6V^M;xd`h8k5Ncbu->rHe(l&Tkzd zx518Vq01Mp*75f-H`UV%+-r;>${QN+`YB^uU)|%`}XZR zXN{LG-%-5cookqr;6X3yjJpk%LdIE2DYoRJyT$a^@7Od1M`%k>5kf z81YA&&pqhfWTiyX}y@Wps+S z`=f~3Z5$IQ!^HnstftZR@Do(DcX7y3_D7D=Ye3${6kdJtN9*_Rw#kw=g(%-^&8cF{`3MkE{H?;c5(g5O+U8C!mweQ(&eNJ@QId*5>nlWh#!)R)lJvq^?+s!> z{C#m@C{*rvi3v%Rmiw_P`d*u^GX&S{mV=ZQ201#nT9Smbu6-`FxPCZeUu}U|DZF5i z6D)kM4TD-nd&J1gwwCo$&nbm$N93fWz28EoewKiN1O6Jl$`M%|78VxvOf|9sF|pGW z{+yyw|6v8`gxE~^0Nw!bK|08U2g+i%*ivRh^>dNr98plnSZ)9Eh26tz|JnBBU>_8g zT8tSv95Ffv=%&H?zsD29D*bzSIP?x-Q?g+vtoFdE6YkS0J@Zaz>yBDkmR^d=RpD<@ zH=dZhIU2O^v(2L1o&I{`u1^Qtd#}FNdZ-#ctD+SQ!lLDdIbTza2H(r89)zsD{MyAc z8|gduhP4p_Vszgk7jN7(;rjV$C0Ge^tC=lK{R2?5en?jme*FX#1^zplGW@+72ZX;2 z{4_C%>JEHmNb6Xnsb8l>1~UTQFJ=izYky~|i$5Av7RSiH+)sJrDe4vQEz~corpGr)acm@@bU9xd5?FgPxL-^ zrHa(vLB;!9$gG2{ntl<&S)-oHLl|tFnsU}Zb&AzSgltPh!#%DyH&5h?7~e7P?Pp?0 zzG9sCY-z#iVtz5PJV5LS^{TCgo4Bzy{KYQHpzjPgeV4t?YeeV zSBjlRb8&^n`j<{0uQwz6q88)nPPlpa({0htVD-uC)>T@BMV|TD#rE66XQQ27{#_5e zTgU!rP$IMJR_0o~hHC11<-$rr=6QCfTJ}FUP{oa(6b1hEKJnmVieaQ5Jo~QxJTl%s zJrg3aE%abQLQ-0#oQ)7FCHkJrff! zfaFEDaAs<1>UX!qZ>v7u=0ZLs-j~{G{M7EYNN$pEjohdsf3Fob|m9D|b zzxUqp3uM!mW#su&f7wBse)+aUTY4N{Ng{n0PpZaakuH|10avN)aN~eiV!1Dla190O zC|PZI$cpAXGJTTUe+wx5P{sB1KB?9Pqf;#k6fNEI#Bf z{d^C^f&XDgb#U-_6`O;@NZE;_XE+MYpCicUJb(UNnf*jW^<^;oy%0!OQe0O!$CD3V z`6I!Q111<#q)66KAtOO_p7C57FvGQ+^^yub$Lx0AJ#x;x-Z~N=zJ1$B58j+xTx2qI zLn6Fu*DfkWTR3H9p$ui~#Y&FY9f!)8_{yZ&>fVV*3w% z&`<+)Ch#sXBCv{AB86-~<`BXo_Sr5fs=n&r>h*KH&K#&tcvvV6|vJ-CF5M~^m~9o2;qC64vsl^wgeZ5`t{58ab++!N&QB)2J{GapK7!5 z%{H9DNRCv)sX%JBstR}sXbglhl~>ytQN(exZx0Xmn&=+K!4Dj6__!b!{7ZTNG!IWs zPR`84hu~yF+Itv2pGcj-xnf8e`ThHW@Ja4BF=S*ykYlIZzuylEWmr4K*QIS(&vjSEK4G2|iFAzacy^|B~x{YqcNjWVE zNlCX)d6!3<>F4%RfUI^s1W-;qn@lD)2|fXMPqBo-=l55GJFME#h#Jw4!|=@j>FhS# zP4&^ezns=A0zcgrHFB!Ewv$=R7`N+sN{T7KhVx%v@HOjM!_HIq!Rry-Z~gtR?Hi-< zZTs#L-BtY-uDTm6hP&-qk7_Fh ztmyyE$8m}R{>WvnZ6_WaT}7%KIwj*YfBT&aNwxmU7lz0#abuU%6P3Pms#uhUl17RH z40pq6_Z;9YoJHmfXblLV{b&@U@Id7iRyH;fy^)z2ERhjN7vFt|3{XL>Jl9WzbdkZp zJwwj5Tgz?;cS2pD7YU?P6~UC`Y-Z?`1WQXe3WJ9`C&3@Ca|F{`!H6JK*W9dy#=#MV z!!8OrY=gtWU>cJ#TmzX?ht=)-1<7V^2^ht0WgA&n2XWn<1kF{_@&#Rv&+7acadB}z zlZ4N7hQIK|fVVd8zMC*kJn0n_d?9Il(zG&&`-R6tolT-AoIppgrypa0Bw7C8!Bgf| z@?(>eF-eSoqhMwgEsO!#!JC#t&PmAm0MOBVU#IdogcG@Om0^!@WTe)u_m|X3<=lE` zrVUm^8&BE-o?Kj7Y9yX9Epwj`8>3mJA9xKwmYD{B2th$dSPjAY>A=2y`geFSnge9? zphLsVj0z{~%v?^NzH|Nh^_ZCB0LBx10JKx2M`{zcZegYK>m7p@r|(mvp5wMvQ_klF zg@vBJ4aIu*d;w-Dcmr#u)>Pt4QcY2L_|~R|E%xN$Vkmx52hOQoB_XIhoHI?xanF9j z*2y7+?iMw}7kol(JA`rY{kjPJpDO0wp-VrnZYOORg555Ys3DmW4-yuZneX*=R~CPT zDBgr*7`wvZJ<>%$IKxPMf53v`RDu;F5+Y_OH~`AIx&$gugxml=7ozO6Y-GjyxX6T)Uq*U2MHAU5)Hw zt`NQnLlV@tOvk5B0lLoAy{xW=FWa%^HPtJ#&ONfI$7u#sDU}O;!}U! zY=~xwF=th&ia4pMW3mf%R|?flNrdm+*>=3?EZ0%rj!_ye4T7SXW`H9ya@?pp9i?ePF+}v?Kb4kT^ z^%U#By>QC`OW=myPNAct`#v%f76MASE*|{1SC^e{Yh>28wo*ycYe4$MA=8iCE4|(>N zdz=FQb*O$vDp$0_?8iu+&j3Rk8XF&Ow03nFx(n&#!CMaYX<*^ji&}O0bW->t1xCOb zVq#Q!<^1O6xvWBy{2nxf=6LEswtnk~YZf)E?s1^zt{l$AKC@|q;5EoTn=_|v@YjC42p zdwY3zvGPcSpVvfiE9P`_a|`gyzL((?-q{D|Xm(Gw$DH%a5w@!eGBvr>48gtMdK-sd ziGFKxd?-VD{9}0sa}2Rbq#c7lx^BB8n|88VK0EiEl|Zc9ljF;J`gAU6Mun{A^g zQg^W4N|HO%@x(x2J$mG^IS2-v9|2Dd2K}Xd>|<8qINnpZr~R=>&bA9B44j;?USVCw zxo16{byQ<`^vH|IQVTN9CZ>=5JjqBt0O=^q2-f$W|xTg97lrj6__5W z2Ff$?x*{=RcJyR@6tM8~Mpuhp7eUzS;y~DOu zylNq@N2MY!!oWpUK zxWXdKdip!EicSIycQgW0SD3`kpFjUT&aq>t{`!sBSpBqy4)ZoDhr0j;hA#k~ThSLY z089TE`6~U~oC($hqmufk1NI&=m@z_Ef4UzG|5nyVw{L&O@zhzs@4QWv0Z2z`dWJIk ze}_O=$Hu0*S1TkSDj*~}$|sOi=H`LSLR;h2WfBi+owvv1bI8^O|E{fx>F(2}80lPl zC>O*B?mLMc*WwU&`iCL4dw zC^Y|!AzjHqZ#q+MK&1(%nP*jiuufz&@-f(I&VlewT|!`UeO_Iy)V1Lo#X>&ntP#r= z@^kyOMdZ_oPPipQAlJ(PPyO=f#2y%4VG-+IO>RI_BW#XMnQG@Dh1Gbq(Si$Ylnhi| zvvBN7d~oT~rTT+fpQwbzVGHc?@llq>4F*TEee(UlZ2m;c4##R~h)7Vas*FC!mU!sD z;wm5zv0czVA*&&Zu07KDn|9uJ94iXbI0a(re3NI96nS1FHYsFTg@lCA!B0%p{luQ_ zuOQqpdQjd>p)rxjQP_}kHdS{kT60NozJrc>z}>yaQ_4L0Ssc7BU#8!k5z<{>Pg=X* zevhX;;RxEg5P0ps*NW^&-0^U(?{Ct3Rh?2doF=f>el#bNp6FnUGIdr`Qc4!I?_(A> zZ9W+v`R?u8v&aDfk|zG{Gt$Q$MA=|VlDvOdZ7$j;dryLW&9QGN1CrN@OH0*shLLrm zzl!dB6>@Mu8=ZNv1qVZ4*-SL0pyYJ80y9b{0izPf7VK7sw{cN394%U;&6`@`Mns@j z`OQ^>H}6NW&QF6dSNH;#QXUo0d&{<3q+pwO4{`()Owrzyb9N?%C8D1a$mrz;H00ON z@?UH?U%esZyzMTRgg36Q`Ax<#crWr#KN({0M6#IhNO$c!v!m37!`GN7s_3;ch@79n zR^v1k2x`u?{3LnMf)rep|h0DBkWW|DM#a# zHkC^q?+H47+*7@@naD&E>!hywaT!=KQwH&$+age%lq%-~~fdo$bs z2shFS9(k^=(Hb+jIigk}z}3+H;y=UGf&aEtu3r;=b?khf? zEaHi-jPBN0dN5QhT+<(VuMw-?*2*j@dk2UcuMN*zNdDf{(bL27_Bg2_V`cX%sa=sL zPuFY#S$ELXiZS$U$cl-HsiP`G-6C^{!5c7=s)ALvR$_KV#S=coS@liE#^cd)Uz^H8 z<+k4xLigqfw(KzxUfylmv?rVho0Fq0Nl33cn{Mnu=JmMfCvG1DkryJnyFrzzFec5B z%uIUDx%<}Bh1;lP&tR8DW^_!64hSWzE>8Ee?s?KtyIs{kT)c~ZAm8=Ay4(x5&r-<` zLPEBihmEz}7p@FnCudN`3G(XI)|NIB?mUGe@FYC9)%F4|1dAiC#*iwkAL|OR-RRZP zWlD}QVo~&*`N$f(NLaJ}8yj9mwe78gNhIV{Ov;Bc0us2Ac+#iNaN(3?UM}cOO!Bp$ zN{OJdh0Bq%keC?NUwZZ&toxxKsCtsD?3AmtUukNXeE2wT?BP&SWZ%q;o>;DSl2D6Y zY%~`q=TVqp$h3K4l0a zW}Vn$5H{*rTBhFlEedcFOA2D>t8<}K<>A4btC~r|Mci=Tf~V-fzyOL2Nz;Nmy-VY0 zW72CqvwX?GchHa-dp%j|xB=B*B;E$$68B_SaxL1XH?8bcQc#S{W;}Z)9ZGcTqHfV% zI`H6#&p9-uSEQXYa8H`|S6x}&8AHxY-N`cB2t%`#uK%z z_!+II;Jv{_i97r3LetXHa&tw6R@PTb*M1-oWp1H#^mFYg5LKj6-JlW(36~2A3sXb2 zk#sCqCAZtdA=-8oMK!Ev@?O3?WJ)ZpfL|Z?eu^{$eAfIvR6f?W9>nsPxvb#|YgD8x z&+d~m0e%-BIj4ZUbX#;vkZ$9qq48GdFc%NcR{MyWPW2g4X0#JbeFP~RG=-ns#z6|h zTY(*;DE_CW3OeXXd)RCDlblB+piNi3F`lT7bat-$@cj?;7WTD`4; zsLHP)o+l8m-^6ImMs3sPSIjmN({ZRBlw~$-m6_)jAaoJer--d&SsKU1C2LQqTI}Sg^o4 z+n4vH-A~N(uG|(f5x-@ubr|10SpDd2`xNx)v>JHBqbSy_6-uE{^j&HyUB1fx!Fv4( zQ<%s;kSn8pVUh5E$wAd1DkarkTdR`sEHpF}b<#(WTktyZXv_bQ z+Ip=3Yk0bph{9s`mpzjAdYFzJ1&xxpOcr?s)Sa7UF^)zf7%{&fOIAxxOF*U;IZ&1p zA7!lYiF?L?Hn2v2wB2Woia_m7Ik;nTc5TUR=q)(e2a>~>vHUkc4-Dt|jz5v7`=L(! zSsKYDcl63!sq|U8msS2B^xBD(?8wNjTQoiFf_+abJo<&2r9KZjqQooneK*F zUttjiIT3~Tll5cMuk~D9+{{ipHu?qzR(|?yT;*+5y1 ztgKfmw$`*cxD^m^LKFx9VJ|AN$2IEIbtj$mEG+W9T0&P!-=7;O_NauqpfYfI`^e+i zNvpC8zXv1QB`rJrTGF%bmG8N{)HGuCx4qoe)S-EXdf?5H*r`WaV}EFcHi^x-pU+kW zUU|E}@E+kKk}`;AR3%NiGhKK26LCO{7_Y}O7PVH|sd$}z*I5;PUh|QJ=_I6Fm;-;eKaj+>S zpPq|rdSrx=iHV7g4XC!Ji`1w>!*=v`uu%EcLJ0LJdu1rJX~*wopq+c#BmAU<@skc5 zm2*7o3E)KgO!l16I)sH1;Fq?UD$hh}_FmWY=|*sQ&RzzpEEXKTEWw5MKNnc%jIOn5 zLZTHH6&1KR%8ahWm`kI1)E-dD;of~;mHZ;IgJh}3;46cfDFtIrL)DDj+?(HrM#OH3 z4{I)bU5&XVZleFXywLdr=v=kuU)3f1ipxp7Z|c*r z^Y)OGTy4*Wj<&3dOAY_@%QGtkB0`59DX!#nGqx+r%F+_RC|`Cf3gAR?WR8vS?*O75 zrVxyyUHd~0h}3gW*Y5z_3r1*DP*8B|X?RV+B+E5_R?@ZoJuIz1q@SG9pf`&J@&@)} zeRsEUf>o9bih3-OriO;^1hE4LOpi_5!w#4B{@uHcZ{Ip7ON7A5{hc&VE?M}=hLp|C zzcUC|t6(F7L$wclMr>CqQ6^^Q(n}x4=ZtPU^tSiR&;BN_<+D56J}7(OfMtcfp|7uC z)BQVaQ7z|tu7jR^YoFec znQ_~F>RUSZ%sR`Cci+Az+F2AQ_8g>JActV)pvRZr(;GXLCRbLUTIKtXL@YJ#%}}Od zY91`LIO}rv(w3!hzS9!bk5($2vegm91%3WrWUMZY8NCBIMJBFKPUhjZqphJ{AF8Sq zjNxyNI~v-#GPAOB=H~0~oSEp()w27Fej{*N7>6{yCT`;uN*sLP2QX+l_S0*x42#2|ICvv7|< zA5Q7=M6%Z*4Kd%~`Af^QQidYS?Uj!qH$AeH>b3PSf0$r%Drok+$HJ($bDvXoMf}#V zp8%S9I&U>-c?`=UHC~2k#xuU=Uwaru5tW!Y^wlhwa&Tz2)4@En=cf7sJi-Dt)}7kS z5`-%*CDxH|Y>=`@oAqQ^r}fFZ{hFNQ8!!4bbEZi{L*C7p@$4JSmTwuB+8fQvh*Ka) z`|emSBV|!ir74l(`uq29d)A!{+1zM6^8fL2K7W1-BA()9O_d(M?AfIrno-t$&oHG3 zm$ij)00`JI-=s)1bV|{ctb_m8r=>wU4l^3Z?bmo}&>`?k!JV+Xm2f69Dyo)B_=NRd}eB}nuiql9g88QAL)@j$B*2fdYL-)%FFrm zBjZ}=bs?QT_tpPvwa=u4lTi7AF9)Bd8dmGsKW0b|B=smP9c!D;$jZX}KsGKeMotE6 z-r)8L6CJFK=Y8 zbsB=8IL;${#}2nn*1vr|dC;oblN!X{jVqP?m4A2t;aOi^eGA=@-11%fIjI zW2isdo+f=q$)#~nZ{ z4ia-F6E1067sI^TG5ui(0UP; znfR1x{-3Rg7)Tzt6fSK0I8umCHXP22k(~j>4?s$dLmE*^(R=Fj&<U(w`(oT=QGL@hFA|lS{z+m8I*B>$c zg@+m%6rb{My$Z7X7S8zY?~;45`_h2o4u*8*!>;RtKYu>*d3Nqq&^Zs=3%_2*`0Sf+ zUD|=MCr3TM&)jT;<(~KZCZWGc{r#+M?B0I|E+K$*$*gOTkx@hkCng%Ojf}BgSnO>< zC)j)DYwd@@;2CJq1I0}wY>JeF)-R8Db01ps`OPic-0STh51Ut2eU-~s6MQRF z8>WveTUYw^=LYW4ydHesuld&gvAdU8A!Q>s>-pYwE1z;kX?4Z@Ye}Wv^gRe=|12*L z7P~#eg$Imt?74rZ^K{ik4}JZ8LgI!mzC%z=)|M<~GF&s{aQ1`M?9vh=gN49U!Z|v} zLEL+xsYA^9GmH~1rrK;E6&^CV8S!n=s#a=cWYl@BEP!nGwU0@)+^hQN@D8` z;4O~YMSQ(f0rn*?Dd3Oqeypbm9jZG6U0oNES))uzN~fT%H3e^_8d5S5N5Jn)lqLIA zsVotzIWR zcp&xqGYAVGJO*ECy8pTEf7wm`$*CQr?d>n~P8CWB9;rZy)nY}U|KI5kN>hiq!lAD#hwm93^?e}MjhM!ZK!`nGxB~ba$7!@lYf2jdVYWYkK-&*+x>VyJ~}8s+z&c=7A zDrWlJJkTT4c)oVo&0!r~$-?UCZLldn_*%XEau_0F3dU55q3ry?Fd7ETHKRDYM?~rC*?& z`j*g3W6}{3Le`VZQ>*Wo^Lz5rS%-o;>&OqD8?b)lr45XoZ|<&@s92Ow z9}QT1QT5>1u}aUZwNH**h9Wib-5J|A9<9q50l8bd<*Y93$HJ8Ov#L4c`3}hg&SvIS zPBT#-4_d!?MXeO!XIiTBBc}Yk(PQ%;hA8OJ zQ`4=vd_L=&yv;$HD1UVw(+H3BdlpGW&Zm>4%Gho=Jx9+|Gi@|#^E1qi(eSoMf0Bq z7=MxM^nZng2}FG)@s-2=|B(Ft`!@(K5&t;fL>xh9|3A>5_-2E9oh-Nvan!6UP=^tJ z!>`BnQ6hSp;j!`fKxXh=wu$TN8vn%N1SKv#g6Cl|#{lBzH{N}H->f8Ji5rYtJbr;c z`lA8g2=SZ#vgu)Q8ZwZnwM!(z*Dx)(W~84QIqYTJyh8lSYY|BvGYD!gYz#>&)|x^70qU+I~*VeR->7{NFFAz0enxbTTz`m|)z@wBmc5pI`k; z={+{~Uw(hXeP2_Ym64I_`24YpAyT&DnzYUPSlVN26vS`6XcVx@Pk7r9aZU5?T{f1B z??Vua+?g}-`!5!?JbLz6 zz)^~L$+_3Ug8mc``?+|z#QtAy=(tqp_n~n~y3Y8-kDYq|zA<=-T~?VPA^$y5dV{7$ zqI1K)*MCy%|M%zepO%F9_W#cx`TrmPX=iG7ePiQp5SEaM{-bpg7wSpb)0sm=;>4bV zm_64JeEj%3fVe;r4K^gu)&BC@=NVW*M!Y*fik-SV*%KuV^z-^{$Y|?6Ftf0DBMAUb zH&ne3a#)~+Xex^Z9t7TcrUc}Sf2&hyDqt__#O_P*#B&Hr_@bxbZk=$+a0428Pi3 zjJ4E8^gfA0j z+gC$zso*DdH#Cq*7Zwx%u8!D0j>L?rWdCO%d_P)}-gb5tqw21$tqmMU*f zViruheM0E|PP+r%2T8r8d-OC4CWtg*>fy{yWFRZNK_3v*68oBW@AARDf>AtL01dAd zZY@LRD_dDv*(geHo-AfEfmSIA{TV7WW}QWiKz2fNj`#1?k&~dV%ntei&+QokE7Np; z8+a6~5~r^+YcP02L5gb(0Puqn1zEb_x&#`Kctl^yJ@&+v{o6kq{<4N=6W|ruFkZ6G zhP-=x$`5?Au@C8*zqgrP1x&aB90yNg96erRV#W4=zyIPR)}Kr52u`;)!zZ4C}5@!N(o9&{;&&> z3C0pyc{SrWF;)=gqHq-IEKnRtj3jc`$mMXnBe?DhVTfB=U2jTPANAiHB$QLmH51Z<51uscUubJo(o8 zLOicq!DN5MGY}@8KbL2qr6dgq2mtS5dUEo<7avv|?5S_*b;xW0_L9+ucmtzwna&l$O3(shmn!d z+z+g8(6FLrg0RzY4!nd@h2TK|ac98b3_9fM)G!A*%~{;Rq%Hke%-CdfY>C5Xs7l0N zULdsI+#6GO)APb5AD@cn&(-%mn>7V_Vm4~!1upgle*xC#fZ8=W7>Erql+H&8&9>(%jFklhbIw#9klUsD-1}z212hV+Gtjp*Q zA31U=-_!$5A8l3!s9Lv9$E^_CaSE>+bN96e76+uV+r07hglbCRibg$`-tErKh&kr~ zuwtd`uR;(16FsT1xwW;mJKtJbc0Qhh`cXBEPl)kUET{ktHO=I<%5NIRfgx+Le0RQp zQOm{e?jT5vtn7z*Lk=s4mZ72mZ+Er-lGrY@W&sI{a*1&=AUutoy04~=tAOo3^Yvwz znn+iPLIxKs+lTzYd7142YKh5>^i7lF<9vlzCDicH=%+{aUZi7-&*DE|*=oc4;}wSS zabEdxdke6>BTqukiM7t=Lf&^B87g7W=#BsSwX(Vz_0qfr==a9PM&b$O2d5IgMfG6T zdNR$fk<;6gcgM9fOW0b!IRd{3chQm>dyde55&mIpw*SdV@Qv^D%g0SWc6)FQQq7e%t zEk+O3ZsC}xEZHMI8;rxB=<|1u3!TT{;nO;KLf`P3pGkJ7;o>w)Fre?E%w0rgwCPXP* z2Pao{fa9>2Gl9?m9|W>5xsn_-lb`ah+W}*6WJkOevStbSO7QYp1X(GeQCXH`=(++s zPF9Mu@39{7ZI~lP7}0KQ1F%SD_DGhGZ#(T@{K$AIx%oU*i5ppVl;^ri{_FgFx2}O5 zqdEQ>Cy0A+<=#21Ra6E-gCeqC99AB z6>0BqfmV!P>iQwhwNtADw9_8~)x0+(%*&q0t;3&#Nt%Hj1eeRY?5nu1_v#ola}~V-`N_BHo@d(%m_mm9Cjq?*;eH?W29xMZ&D8% z2_`&Lj>`f~e5C_1-|P2RGjoM`dPHN*CpA(%QL=YoLh~jGOz8+->h2uzhYk0Om|i*5 z951WP|G=7!`$N z2(n(_mbQK#W7LamYv>yD*-y~QrJ_WP zR8Pmy2*e##@G^d8ZI$rt8WH{{o9JpIp?nMhN<7UY*dZcF)(_|tzrw_QS{ z#-IrCh@K<3^$_LrV1e>Cg5<`D&Nxf(AvWT@j_AXQc>Zf$mKHWrVHajtxy6xc_?I}bd{9CuM^BF)!F_lrpzYT% zCsKn0j@srKE#JQbL^RB*GvVpV+S>3sn}?fr`hHEqU2QD?+nDx_jn&YPZFL@Pe8X+5 zQkFH!xQ;{*LPK0u$O?^?eD?>im?9K-LIRTSO9Gq ze~%395_lrB!Fan?_~P$x7FvZws}hAMl7@Rov1gG4bcHi#0t)v5;TWQ#(|au}EJlwd z_@D(L-&G5ppNI?-c`KC#_-~>EWWs;`{ujE9BHm>3r8#$H@2m?W($fgZxqNSU(ewgm-&s5eyF&LFO(rf}#G(NBygnwAIC z51>CI`=ZW?@PY}aT_|EG5NK52A*n&?dUK%hA2VqDx+$z};jqf?=j%WAF3D&m@mSEh zvxi4v2VpC1e*|oH34|xw7MNPXN5c9y%|N~u4<2qWiT9g9pi#An<(QwJmpyn;^MR_C z04gjX*`Uei2~mRBPDNExTAH->Et$7EjG^9Qcmo(7_+5Vg3o#Lm*6#M4)FL`I0^O+S zLd6~U-w#B{<^PZMH}Na~_xis9MSZGGj?T`fq2C{R`x?e?Acg-A8HK+~IYL(stB8CH z=eEQyXG&30HD+izvs|AdF)6ToX}AK^Idm8I(a5d;5EG!yxA@Mdz3>{pnQ##;I*lG> zPFPwM#>amkDx_|ss$t%ALkT|J@vt7;M>v7}4}eC0Mwk70d<2R@NICtQV%hHveztXR z_*m?q>A8YL5VFrMAVU9MI*jb|JyFQ(hqpj(N_3;^YKF@iR!b`SeK-}6OzagB(inFH zxupQoN~|;_!MwpEL@5uxtpWydgC`0tEV@9efB%AyLHp$f$X2#eOFWA>dmKX8YPPTk zH3P{B&M8gt z+s{>Qg$nr}Hdht8naDuf;AOIlbig~Bv^+`LBw;ePeGB;>Yy={1 zQ;tKBe0540&9`h9dj|(172mxM#Jt%Okd5w8*eT6Z4wGS02}~R499cOK_Uc<&T+n>; z{qn-o0iX{a6>n$8MA$y*lz4&~_y?nZos~1~aASrq;FK&b#zB>*|B%F*`&a-}wsl%( zDG7_D&<=xjQCeO?7)DBkO7zEi<2&ZoTQC@W>AUI*r%v~R!hOe%@eOTmTn`G`T$=oZ zaS*#`X|JsOD#j?9Myemzyjozfv2?%UbR{Or96$Bc&Ak8 z$BrGbn0WheT@LUNTCoIMX+5Ht8M_wcpf;lxt0`|(0vOXM31g%^UlgMh4N|G!eN%Xg z@&l-tDWXOctK<+SCrr^riWHKQ@4#U9FCFv_o7S&Lwr)#Uu`@96uX`!{{aWI2)>i+5 zs%l;C$1%uj1>y$F13y=hUgzf*sA{%uU%k|c8)+F6r#Esvv){H_MA(gMU#{ zfS*#VPCrDin)f~1?C9i)^s3TiLrE*8L6dG+@Qfso+AJa{e{lah-knjA={~;}UM-9-8w=+UQ%~&$YVdEKT2wssT_$57)==8t zJeY>%>50}AJXov8S8r>{eGf)9%KTG(lc)wG9S+{f!IooJcGz`OWgg1YA2vj=2)PJ~ zeWEu9{)cF-MrUAdQSB+tVY{_Dc~Y(%+n}Joh}|J#Hn*!n)oGlde8^FP`I)*pM%D0Wnws^IA^|Ff}~Z>V#s(Xi6> z$ApdaS>O3lv&Q)!hc7#eS6Rvhm(O0pggd^DJj>!Y01y&X$Ftk>mlegopnEiQ-9W@| z>B#Vvp3y7bo@-+h6W%}8+AhMQ@7QtkPhggC@2POVFBhcyG*vHjsw>QodQ&y*&84TQ zzGnaR!*-VN@K$_&cB;VoGZ;QUPwWww82z$v+wGt`hg^|O7qu&ynNB7=nQ@NM%hGFJ z=TzEKzWq>AVR(V>`;G%ij{5l@)^2+pkow^+=orAhl*`C3TFC4DHDRKi1H$1%L9WgsQn|9@oKxk`9+Z&DNVrY@qYRMh`_9k%0m^Ehg<(+!WBGmKoqsOS7BKa(bkDuQU0jEP{9M;%RzxqGrOafaQyV(=!zV=t>C zJ_$`9EQ($j)UWOO^XJk}X(}3;zVg6j*#8#a?Dr9J+Vl9sy;DWXn*)j%)JYk)C8oys-Jr)ZKs{f6v>V_)ClWuBwl^7fIw ze)wd9-nupvC%3e@aHCxZnGC5Dx$H z6z?yxIepJvqRL*pSQbB3a8-waagWg}$EdjJ{>br*CQAp7@{?R%8vi)9^2qj3p~V3; z4dQeGR%siqL+%}4l~`ZCuKwK988pARnh>(_zT{5ZgVz`OM(5B*940YXfygkN>gP<~ z%dFhoVdfF;8O37er%#_HDCgQdD}TX!XYTuu17;CWQty^Fd_vddf!_7-E_r$R#;$V% zRgS9|*bCGBLnu++S1~&J&sw(bKH4~cv`O7BOUH(t? z=NqG0Ond36Y?S5vW8Cr{pK2095x0v&lVXRJqF#d`z-rH{PEun-U-60_zl7a|G zmvjmOQqmxeq;yG2cc*koD*}R)fV6;gr_yyUw)cIW=RL2(KlX6LP}cgbZ_I1X&%DQ5 z3N;G{VK}E}r`xj*zfQvvAbB*?4-cyL^E%B+EKJQ3<~+H6Gb|FCS=#OL-R~JawqEFuM49 zam9N7-S6(o_t1{oK4}2e6JT3x0P9k~VCS2jsyIvRN0{V4Dd$UEF;k@$mlw#)b;o8(Xqv49~b(^7rIX{5^S#&D91_$reA`kuA zZaO|9mu@a)XJTS{>OA>y_zs*>Sk<%n#;~%~L_H8>e}OlrIbgWS*APGdic)^_;S4Rq_3Er8pb__ zydK^EK(Aq(CGX3_gO#33Ww)aHbVaVTsScZMRX(s!nj|ZAN?x6v+ zzhD{lB@5+=?;D0)>4l!C8l;JdeZeFb3S{!pf*m~)Bc;xe)?#LK^HHAIXE=z0_gF#O z9b1K(pVRo4t@MLumqr9ac0bpmPY;&#YG1YRVIWB8lIzAwri`&h5jQwrz8YpKDE{u> zG0jDp^E42HSgFdD;{y@(e21+Rg9iT#rOQrDbVz7Emc7k7My5<8>5Em^#j?+(L&vmvcvVs znbqp@k5|PJya#A2gF%s6O*VC6^+9Jy*Kj22x+`=7U4}TVw zatdAORbANLrukk^;VzDr+rB+s)V$8v(lepSjiSGs{`BLOU`QYUT)=#O0}+NLN1_qf zJj*aA1e}x41vh9g;O!@da#*hl5Z7*C)psA659dNA+x$QT&dyzo?En%Ahr{u?pW53C zQLq4TR6t(YC)n#P8~OC2W$UX;y40{tSPz!b@Ou-)USYAigNf_ha{fh)`U>vBufD6T z)37{Q0>V`i?#zsdooF68g48A>!_^o3*iYO&Pr#fl!?FS0p)`RQIHaRPv_cL88Qasf z@oj~-3`|K%J~=;!;6n*xAMAmlJv24A*|As;=vedk zxeA_lKfdftgllh>=it=0jkECSfriwmTr5r0H$L#EXjQ#fu{(H*?ChkLn;vg|XP!~j z`m1^$cG@qFS&P#d0ytmjTZ3z5_JKoIDGsTLWy%B&pVPv}k0;j|-ZX6^<%)`SY0#j% z!hV5nz{TV@Y`^yjt<9@?ZIFMV69vqM>1`(~yjI-eDYOLA@#V+|*U~t(e>#e|{LYRg zHU;$zYa=NHpyZg57cZ=AuGu7dCfl;$Xu@I(+lVHoJ6O6e*s2|lU!9UyK5d5-{I3vN zITzFyPSCi`V-qbM9J_sfL{67H>Lz?y&^>GabR@6XHYh!vqWvFQ0Wxy3D3nBg)_rkN z1KR~=KORQiV%luR9~ofwTw7z{9llSoGuaY0aS@SWUsLI_{-ZTf4qH4$OJ<3%LJ|8@ zB%HUU5vcOCNaC2{z2V9@Q8(B8+(?bIrqwX=K8+FBdrvyW`I}n2RP*d50^-!P%@z)Z zR(|HIFCc4}Wwv@8J|2_$d5)8(@1gFbp5B@cha^3y899w1>{Y$W+uJ5o5}BFeQN|2G z-&*8zyD-j`>zM9{5&c=x!`79+JvnnHoa6^Cy8y}e@_WT&P^uE8SEN}$*RE|>yU#P{ z{jicAGY?(uvC1gZ1NTBg<2goJ^gkGXIxkCFufp(({Sz4y%JxKukNO(WeK&H#FA8Y* zgZl`p!g2Ef<;bd8r&gLgYKNrSNK-M7$#36$d~rV?|Mlyqi{5IEj+pLoT<6{7U$&D+d0w0}peF=jp7rOM85SJyal$QKB-8ft+hC%!#%uAe9XH9C zd0dQ`T^Vi=xj^}M2lE8Xs6A>9Sa-yi@A+l>LrAfe&3&=CTVOi>zBpy7dAK#}Uf z4-YH_mkLyH0u-y{g-$r+ssK(&JUa{MJi**Z)MvM_YL3?@OO2Yw%r+(eG`*V1hfHaf z?!u+JqCf8Wy^A(6jnuuI8A&opZic+OQJ4&>#T~F8zjnU*^_eD>kecZC{^>j1a#A=$ zHf2nlGEaSfjkI@kMLTzgM?ugopCQeCc`!jyI%F`zGtSH3^W~p>^!vqZA$* z9+PdHI(c!*gZ<@+`neoSADKQn?$CN%$)lLEdvqhCLn4;EQ;0(wVR;f#66hfYe3 zu64IB-gN$wA5{?f>8rYD&b1oP_8cKjb}FPeQ*D_YT}nB%>9w)}NzHuuOvU8LCL#`& zNpI{o!&h_>QhZF3??e}Nq^(@9*DiaW>g${HXMV5X9A>?TlKZ}HlsQfdZ-_$$#o(1i zsAFI|x0b8da~lZ{Mxp*&7+ZK@4PM zSZMft<*!Sdx>q*K`3=>~k)Ih0a(8xh^~m;Y4J{S~-}}=3gptdUbOKrCRD6taCOjPqm5*E_G>!+xPHIl+b6j_ zdqFJI?+XS8bU*sHJTd=i7JwH=%gu5Z71NH0=hi7>>{RIJCY>S?&746JEep%fj*~gk ze5DrU&0NdLJ+_0agOJ@l!Ev+Z$2R%u*2;0{pEck7Mdfrke&|a+xWktf+!Q&bQ?ilrI}}`0H5-S zn7}aX_K#~U$yqJ$$57wu@QVAEfLs1ajnAP}sdXzt_Z*ZG=j)r;A#R2gGcOxB7i4w6 z)R~PTnbsUQP!&cA7c&S7tBQ?E1&=4lZWg>^RvF4lz6e}wMzagLUw>6uoDq<<-l2~q z-<^O@z|4kL5X=`Zs}nk0aqbq+(l*6FNv_+8p{buZEY0YU^=pJaWAZmab_2!gx5?^j z_tdXLq@~Bhy}{+y1I5m0zW%4xroTQM54|tAgGp|#)D}_f{8HH})v&0mv&(@0U^>iU z6NVawNpMq{th5~bGkfgeW$?_7HfO zbK!dWm_}G{olW@~xeuUT+V?T;#t9>1ZKHt}A@OT}Z|HreH@k!Lz~Ol?mEpJbxwxV8 zmFeP=5}Fm1Zwbsz)?aOEk{6VevR*vT>(!i7#Fe!gxCqel_Ajp+8w*L`Wf0(GV6A~+ z%T5(zUPhjy8FqTBWaVrR~?( za&W5jtXBpuZ7P=U=rXA@xUA0lkqaE}Ow_tuBr0#*!%KE4ig)y0Uw?J-HjDwEQ>=xM zayg3b8P8^eZkBL&&E@@o0!``HCrv=?1kc*uI{3)&gV*jn)%g}WYI%ONL3P+j&pS$u zX$MtVe#U-oPPx?>>hz{&Xy~Y@BIrv3F2`AZxVug;qU+?BvP;Mwj=Ppwb$VSP?7GCT zfVSVPdKIrJUwDQBS3dB zrRBvMh$asX`y(`jDv_{=5)%^_Vl|b}O>1^`C{!X%pyf?WNc2m)+Wk@rU)g!gEUbTO_1PJNnAYi$1lzz20_#S0#}H2 zZ$CZ#;mnPS)>Bzs{{^A4t)ouphjYiP&aft;Z--n#f(si*yAHpeJemF4)tR*h@(u`( zc;_w9`VOP}oMLzDr7Qwei?+8J9v%wmk4IW8>5)i5U6Q`{I=b8{ST0(ygR;&MNfuOniLh6=o%*wA6Oi~PO~uqktMr-2=8ISeaXSeomJt3qmPUf^>wym z9JlZfdJk6a^N!My!Yg|B4`WO8|1?pQjDIxn+<(xz5`oFzQFbS0s`@$#GDwb2=@b5e zyUH2qGX$3{AEcw(WzPLN_+N{6w2?dDu|$=d&HFl8jH}fOb%%TXx$^gWHzB+nXZgrK zR!QA^kMX3kOTXaA`c>cQ@2NvlI9$sfC1~SL=qIAjz1WYCNd4sQ?u`@dB}m-L)vX_t zk#R#cKtw<|+MO%!?PC~oNoGi?|S$mGbiN>YKN1haN-1(C?SfKIE`y1b4HxEbb=b~<{v#H8LSuf1n+u`y-w z?mf~C2H4%!q>GX?s=SbBl#^KIyoR*>#B^h;TljCTA{~J|CiM@mmrhVYQr*wu!-o3> zKN?jYuE1lyC+dMR zgA76UhyWvHGq<#dCTGw*8Z)4iXCGihuW&ON;XAJ-Wx&`H!a!G5XPl=cUB}TE7EaZt z5ONcBvych5P~RJ)(KW7z5Z@zfM4ueF5lUCNp_o0zE zlH_&jf&v2!xDv`=gc%ZYXVNsic+*>#W`@w|Y&{oHK8}s(>3M2iaSroFm!qG^v9l@l zyKo~R4G5{eJ}~Jul)P)yWi4<_L`u5cle6Q6A;&D&0gw+tESkr8q`qmj1|z&nb`~1t z$->^VT1qb|A}y8<#8Ats^M69P{Hvhwun=Hm=brtI@-n+)JvIi|goNx@-J*GD%XSs* zROmWqaD|4`*dqNui_vS7F2ADgH<1@XN(r5S{WHhLZXR=o9;w7Ix9?UD`!S`EY-5k? z=Di4~%iEY=c(Xr1aEF?PdUT7EDxe}2-uvKlW^V4g^oZ@_R>%qul@em&QI+#MTzS4! z)Yrob=J!-wm?*hIqfAd2ZbGTkRNp21A3hz!D=IG+HeAaD85#51lV!?%NaIu|BfXfw z*SXYzkgcbl?{IC*q`xuzeL?@bh>*(KN@8B)w-Y2RA}=1fK5eTd<-JECH1(q+*EEt% zF1`#;g?chldR@a~Cf;5#qm7Ki?c#$lUCBCKrp0n-w?FlYc(Z|#(F|N^i&X9U>C1Eq z=oGkNCKI&M^h%zjcaBTHUV&9S&xr1s$Yxplur{}46~zD8%kRP1YJIA~&lMXjITr%a zKF>jd@y$~&*UkfxUuGO>_2bo*Psy0g)0~>5q{+8lEuCSXco?6l=cxe)HYhS9Qyo_w zg);f~rs~3LwyX2*ENHF~Wf=V^BIu9C*Gs6j8%r0yvB>SY)?InB235wF=Zxk!3G4*i zOh>!Z?t`s}Fn;@5_oM7N#(s7CAG1a&tB0@G)Pc0t@nz<*3*Oh&ZiC&WB|eKS+8=L> z$Ikw2utjL9V}1$3>^Q-0ixd<03l`nF*2jgf1-0q-4`K(bGKj5W5TB%gX_o}?&c)ar zMigN$p|_EkLVHLou78Ao1qc79!Uv= zFgL4RH?Sr@y0Yv!=)g-1=V5x%Iz%+tAT})_7k??_98(#sToT_8!N=l1ez7}-^3Igp z)<0hETu7jZJ4{StkbKwdLxXBk^O?YYX>sl6ugZ0+yM}N>608_>GvDw!vT1bn#)(y2~sY2x7lCj%zJb(0eLfJ_x$P7wXmJv>3JD+A2Tk=etn?GpOa<&E* zF2R6_j;`y(Y`-1D1FK4S;kSW+vsu{i(^kaieirIX$E18}+QjC`i}VVs34&Xa20XE2 z8PE*(OUvKCx2u0TfL*^>qeu;+p;XIKUh2?H>|5SlT=ZA5ID(KYTtcI#Tg4u8g7>i=<{*j;J)D%%(ir7~A%r*;>w>MZmuPkuhzzKrW0%G_5q$iX7HthO3m zKz2}Z>4+LbGKicI%T12MYdv41lBp|`jTv)@{`ZkYR0SU!?Tl16LMBqpdlr%Rx*uL0 zpL!gT3mAMWHt{yVjq$QscvpoOCK}D8dm|33Z*osQPt-i$L>xly-)IZ`x?${%P{H5o z<)!UQFnnuHKL?NOiN_XrlrCHQ?K1cEvkE%}2w$f*xLv-Qgc~F|mT{UCn{K7sEO|Da%~AgeEbG}JvZGJ;P@NpmmY!}&Hg&Yfv^^&$X> zaDCaMfQ|cV)=lCeIq^R+mfcJ#Y}RV zzH}B;#M(c$m@-)({LBmlzSyT9mJ72*^nTx`XH3PQCtYH|pdUV>@sG6)Soxg0^8B_s zZb^vn=!d{z761&4tA2kw+{4ZCEaYP20mitz{4;2Ic3WI21p%}5_>ZIep=1`T^18y% zdu;Bj7b1STnM~GM%M6S($O)pIY-Ca%t&IK8+srg0Rs2mK z-rk-a)w6~WE+%)4;9=zAGd%TL1!%L0N*>C+vUL5Ra76!4O3p@f{9HNg3#tW!fcL|8 zxRaeL!P<4rHvq9*q`7pNp)nUM($sN1#b69T3i3Ad5EAek>i@9+$mx;$oKnzD z)bZP=WL|SK+v67UKUZYZ0e$Hl%Uz`cX5YRvyaFDU zzbVKzWx7`<<=Z)(14|%`q*^8P`KDsj4_sX(65pWjHHDB+Tx_JQA zPd^}zyBU0}@SE?$bS@=qRn-c@mj4jOPb_pCs_pS({0qC}iOJq4S#fb zYRZS}wpK}fP4p5b@9p@qh_MXaEq$+d6jie&63>4NH%+>nO^fxpT>Rxk{_BS}dm)!% z|E9HJ)J!tSTY%={C7ogSWA;3*F~(QUCpNF!3Fp6s?ZKlFW%hj-r=MWVX309b?}#Xk($M7h z*_tW|m2;?|E*}t2n~tP-exfg_jL1rlcg06+J}0B0BO$Bal%Z)sFf>ws;kd`~keB-L z&9)Oxh-lNM&^i+IVk`t*_z7=4ch^wNe>1z;*RhI9sqOvP-JG=NKSCZ?+1#Hye;|bX zd#ZP@4!@sy|@d#FPr7ZuD`YmeYR_`zM4Zc<5eXWBwtP&w`n3-Bg82v zFBxrYK0PY&fj18ar&YS%iD;d9_VqsFL$=39a@)k^xH$g$-|y{m2mJL_t`!t58rE&R zn~TA1J<)l+^t*vR%PB0WliuUa7WQP5hO>@Ci^_l`hTKJ)!0`Dlb?9RfUZ$i6O-VaZ zw|k!0A~W9RqS=mLt}>h$5gz*~eka4^RqjZmZ$o=*xsZgEIK5-ZE1y0I4*DDn#5AjZ z@2po||4oE5yzjQoiENV_{F29!kRGJYXl7Vgz+;pV8RB!4#W7%{GeOoscp%~YzQfNY z+H&AD(&m+?@rUXl{b$C{e3LOr5x*=R&!O$;&9pyN+zc_LRUzUMn0PR-R&pYa%3|6# z78x%0c>S&Df3*OUh6}0I2QBugZ^+JMB--MVVl*88l-nnuU|(81dC~$n1;z_PHoaEu z!k4#5Hz^OX4)jMxOxZ!$L?dJ>e0T+&%>W86Q!0BGQMPk=eh&yY?712coXuk%XVNT= z+7erVx+3XMXpp-CgV=d>dHG*UCi;3xv3vv+N$`|CZz&cj4yDfX0B}Ov8=Xo~etEj9 zrN!Tr@ug~W&^mNOooe7Qy&Oxwho!<66fpZSo|o&`>j3qtEO=((sQ|V1zSnJCa#m|r zDmu1K#eh%4hKsEo#a^lYNmy<+4U65BQzVer}H2`a3eR zuw48MkOQ>#2L10pXRpr(1m_FBzmBt+Z7g++!#c5^tmAsfK$LX=6L#C#*7rZ{cm8Y% zC|zt0nZD(I_mr^5g@uXw$tgv8EI7XYW2k&xHotLn2BIi8jGXASgM? zipx?)ZF~6$7>3axjTsUHS$(ibbbhrlkifUB5ASVl~U=STyTuqHHvZK;IL! zPv*7R8>~`a?u{QB9#-Lz4>&N{54yS5ywC4{u|G&HCMLFD3QgVf0#DoyYQ&nxOyuZ= z7+c&%zm2L6FI~aE`-`vow;`&p*{9V3j*NLGH%SFy;v2}p+*60;ESj$%Ad!+1YBn10 z*I8??n^~Tp-|5rY)6CGDao(CD#lr)mc|ah>MluoUV0wLp!DZtEIXv7|AX`~yA)H!{ z74q7CUXaAtY{Fw~25t#1?#N(ktIO^TrJ%i*&FYJKn>lD?42pzP=!*GRE>+h{Np6!I z@>aDT9H|J3@sW{o_e_j+yZ6g`1DC%fxi z#&Fe}_o4XT@(Q&okU*Pp*_piF|02a~SppY1nuF^Bbzd-YZESAx*iI3Bf$KkTXWXwY z^1{QN#s|oA%@3BGB}+cT(C=WimpM27xIl3tjxc(+BJCBU@T@3oxyJ zuk@tVe9C)ZsdXoYz;)Oc|IsaV?50em&lliQTD({=-%F5_ra{2*R zg4)w>wVyKYi(kP6A1n|?s^%~(5PvjKL0_;BW)5kpBum^ zoCoy0W#)0&kTy^sUbJ{QoJ8F!ex-IeRJ=h7!3xHIi3+WDOA|etk8HAZ8>Pkv6f;_W z*1Bgzx$@{fq0SSNim0`nE;c&nMY$-`Yx3Dg*|MFxyk6chyDLScTBvmE?)mARj&8S4 zsF4XA*;uQFkKo${Cx_?H zwJ}M)*P9KsGqT3-1qc8Cd_m8S(n?}K<^g=nAVia_)B9LNYy%my_#P|(Oh5+gG^85(L*pm#Ydq?0zTlQ-- zwfS_TiI&z$c3T2fw7;=<$U-M*q}+6LyyiY~+(n48=ugZ)8!GCyx?!a7{;Hn^zfV{K zi)wWb>OQJgcLICJxEs@q9Z{rUtL3iG<66t?9ROBmJoaScqZQA3h~EmKkm!R)2EGNim<=j4k1L& zEcIGRg%hPEYwL8?8`a85T#PmlY$Tg(PVG&wes$8*W={TwaUT@l)$#J8_4d6N&;(mx z$2{1{M@w{?K#U@C9*7&6Srp7BspNk|Mb)Yq$p*zn4QUQD-X~bSgX>Gd``W%5;|klg zH8opXTLY<0-!t{d?Pg@-Sg7b|%4R;ASX#1rA;q5_m7a&ExFqw)yvTo_WAt7U18LG^ zPx=;k|5YoV3b_mDOzL0`Un0l=0=ByQRhexjdzqMQn1sHf?LeP7!DN*IZT#DpCm?N( zX=uz<%O1?OIvgLIRh$e?F4W$h($>Ca(PwQ*nQ2G(T)IbIAr*?pMoUZg?m~IRLiVYJ z`S|E)XT0I@a~+)=5?WolslLt<&7XQLU9&8@#ktYZRL-h#viP9-gjS=YiAd>qwpW9W@wEJD zRSc`en?idTbk+BY%8zr3BQ^Br;5@^?cyqY8Iy|kmRdf6k4%+FAH$(SS_7L^P_N9!X z;yreUiR(52eW^P^%$m3ZIEK@$4v~CU z^NaK$X>`5P%^0JlmRx8NB&7$5cx*^tqf zG)L0>873cR=6`w+LX%^ZDK!E6upO{P)Jwr$e6 z3Ga^|q)!zj42qMmC364djE+Boqeqcd{#{Y^Zx*QwHgUuBJ4Qg<>Fl5tLL|0JI~rdZ zA?Q!e?B`-*tDN&P&&BIOj6nyvbRgl;VD&2dV;8d&$E1U3MX+ayimpFM{>&jsrZK9k zU*&_FO;w{Q_nBS;NT=}f@}RY;Nt;)CoGo#=&x+P0(R}DnpAq#^Hm{Pcth6)yibQ>C z5F8mcK6+Y4X>J}?(`FN0jPuxrBtnrATX|&^+dSy$gN}DwIxK$#bfA+x8G6g&LCM{foS4Y_LI072L#O3l>Vx&?&tRFHcG;!U zCgrk7JUN)yR~02Gjp_dU`RZ46PH^h=9O26O@d2dHr4o~pP|ao4QBjI~rL{Z`B*0mm zxUZ@Qww#YjA|hpps9lsfO4kcB>x*6ktZmq}oUu2tGp! zL9guZghnd218*Os(IFw=u@i zvS_*(9N7y#Q3bVRWqtnqMJn1(+W9n&NrTV+!hgDCTx$geRN!OPt9!;ce;&)IelS_R zs-+E2iFO_Rvm~#DAH+N(I@-^vI~rYfZ}DQW3w!(#a+y~d?%CSjZU*#=kcW6;@~|NX zm%PWfx8)g>$-$6=iLUW`dRP+s;b%jd{JZdat2umt3HN+89c=YG*mXNUF|I%HF1gx# zWSda>f<~7&#-gZ@sQ7*}C8r@bnnsjh2|^Dtsio!oGyOs_pC`ii`T$^7rdtV+g&wSOELPtbFD-rL zCWh#D`*34x(tEF`dKFA-EiTt^Fk-hH|4{buxevl=7#JS95 zSH(1rJEth_0!>ti-g1W$#MGpgCBk%yACG?-C@I0;+OjL`aWTIrby&UB|Gr5tO}k{= zx+9%wN2SKG2uG%1sJT!bKObp5PEW82ZZnHZ>(wV+a9yC7#Ngp7J~LB4WW``6!X9Gp zSG`W}fDI^rNyYV1jt`1p7C{F|`4ZXlV#Ln^+(%b+b z1oe~BG=6@5)=Q00=w1V{QcgPN7g|SVP|QA6XMGMW@SCKUM*`Yr;1CZm47P$wsavDZ~;UrbPg9-$vn7w86_6l{& zM=-nyRcw_;Th1)adk~Pr$V5;>1&wQ)mOo#yl?_8kIL=veZE5MHiFwgO&L`CE6W!86 z+Fln+j8o8Ool4g>v3s{*IZwUwlXgHrP)btrO=Q)lAh;MI;i&cxHpdVLx!WI~qzKrSKKcvE>5SIOgFApd!g1J3f{C z1$Y$5Tc>iH$DFN0UX}GKL6JKcn5nbSkd^xACdG^U6WTZtkB*X$m?^NaeI{91SRhc2X~H6eJP(R=n(~W#@X{F*vkiy#p2wk;I4+KnySPN= z?($k_v72Xq?$FCT@c*wCpjG)L7cxHemNO~_m5_QY3H7N}At7S+49*Eu!~a-Qo);j@sV4i&cXBZb+V2+^ekjbP!SsgC%$KcCZOl6K6_q;%vX>!C8odHuGjN9zkWrLj1~hC`kCja8)RQw@ZC9LTG2D0cR|D#y4MV$@1(a! zZ=eD^&45;d9@||wteXxLZgR5P&Nf5-46tMQnMuT4uTuH!41t`(?{MWl7NNcYO|B47 zhDdzSk3c?qfHj4a@Wf;gHoSw@Ow=lL*#fB4Tv#x)vI1y zvm5;N8huq|rHxjb4QR9_8buu}H=Mwb8?G8;q9CZv9V?RA>bS0AObh`xKaX1rr_i{i zQKBLL{+tfT1#$4|0JbU=GC%;fw|<#9)cFKnI?=P2Ks$!y;d@CTsF8(b6i&|2ValYM z-v?#pz}X7f2U<;6-N(kp(Dzgg6~IhU$-@!I$arYb4nPJ#X$5mYdI*e~5M;yqtBVD5 z`T`TU18`Z<8fIf3CgJHto(w>R+Ft=qbd+A?N&IR}z+P(C7M}&c(|QcV9+WGNcaDhh zkh3@VuvI1pAh#|+62L!@iFOrO-OQSFM1?B6LBjE zaKe$1k-^)<{i=`XSs>3n(9~@wq0d2lbs&ucBe2p*I>0|5fQps+KNP<_cjEQXz@Z!| z_{#}>T2GAj~l-~30$dEUO4`xeT4>X5lWMm{H5FTIxghjyPq=Jw5cCltT zo6v8B%{q9cflzUNeon(N1T`Qa%lymnfO9xa_ru8gX6J1Z>TCF1Lxx(6BqUf6o-X)N zfL>iihb|*6jm54P#ijxfv74&c2ns=_Zo%0qNW`DmnwSLqY6GOm%1THim-@A9FLZG| zf!r{_-6$T}ka6C}Af*#xfGJrd^tC87l4z;H13)S0rUn)8z!3vCfe~}m3?S14W+lAl z;gbfG6Ypow?$QxKW~f~q2WVZpZ<-(601=b}qcACLlMKqtP*6}lc?W!b7AkXRpH&`k z5ctTOPH#R69J4&Aj8D?ysupd#vBM|BD zkHj+B*@?_tbcoMM0+6L(6gxIr?7bmiW0_A>WS#K!fmQ4VFyjPJLltN;heW*5FX*rR zFAqU7$^Zug;2;~rdA&ew5`<3dn;k3>)&O|dIxz`j@CgZnKDGc|>VSrom9<2@BoN6z zO47>O8oD>^fc^oWE7YnW4I6;e0eb=NLO1QdLY@E=0TRbT$Ia?LdrOsi@qWb6$jBx< zdjKZ^uo_VAYGBia?e9a@f4~p1*f-VTrhSP91_sK|?*Z#4jiHO39S0W|z*Is5t1|># z2Il7UsfO-%rwiJ_Bdf2kPZiD$_;a8r!0yuQb?FA6Zs^+e6_*649<-sD7#lmTeW$YC zz9wv{u66*<*4?{zJA}xQCV8-dbOKRfHvQHo_5|G`Q1Flir9J=ag?a23OU7?6?x7$K zY&Ex|EkYZSDasr@x%2HJW@B!76aRN~=HGq+h6J9H7H}HEUJ#>D&dn?$E{q#-g{{o- zhP>3!a1qwi*r*87+h>g)Jqdq*%j$cbQg?Jd!1R|C_x5h2((Q58t8VxB|MmSc--WsxeC67MAgVI`^}c46ITzT znWWnWpphewh8|5ky3ajAws6zQ#E|oe(M-*eg`~y*FUi$b%b4dse?enm;>XAgzyJIX z?@1k#ehUlQzpxU=q?JkBtsJ1Zl4@)J{dW&SbA$COLk44y=6~s~E*Wh%#bR*lrzvu8 zH*teTubYoGe6Sn$h8}7Cg}nY{aS(D!{Y9T#mOL|{|ND7sMf|@A+jWGSs-UyT%r!~E1WO}T9VnZ_K z1I7Y+#f-yam?tn`Yz6|d>*s}W&#oEux6FTkyl+G+tS6S>kOFV%aN_sx6%?MgPtHzJ z*8~5;4!lnf9<1vW45Ui@qRmA_G0GoI-Q3xys8szQvcd&RhS2HORJG!JMvz;sHWE@-=T~$_TKz|Cx(zF$tN$?IIPCjx}5fxwOFxqblInMMX3;wtP#U$%YX@06PAUv9WY6 z2a9D{eE&bIkobfmod)N{_^6@#A0^_&rD-Nq;qFCng%0C|uL|k#A3&`u(Q17GTC??s zQvclwFiOE2<$tZFq=XfN2RA+hZ1ejLv?TvxfV1!BK-k`NAe~+BLm}MCW#(F(&e@VN z;8qJliDES!hJ(QBuyHb2kYOBe(pPA(fMgat+ibmBBeUq}==eR}{pbRDS5Zg;4c}s} zPQA`*CGq9hPh=;H(T}g!tG>FI<6pD1b3=ebq{D0Lq{z+5Vsb)DzuChHCfA8L7>OXi zH@WZn{Egl&X^O4KfHAjz`{yO}l~}WGSDDDxT8;ooe_tHAzj>AY#nGPwdwVD&FLN45 z4XGCh2nt&CgX_A1v6UJOIW$<4Ly|B*Sb(pYO}`~De|Mo%mxQO#)YdfYQXfSQ9%*vIP2RPPBP}gs6teoDzW~efq)3l{~ZXrN#*7GFbZJPZ4EUP`N&-MrL5&V zJp3KZYSwlsAKHG_*A=Lrt2GtoB%}$%JlJ#fUhB34!h*xHV>=S^!78rloBiR#y`e=Y zq)}Fa(GE8ETghKAiBm}Da|Y41$!Vvsyu6_21zJ;%fnQ^>#yW6SV2+20hF11Grx^IE zM-s)Z#M7hn4tbRX9azMm%k0<9MHRW(*KRm6dnRN!?Z z+0)5@d5GcfltW?oL|L}EcPCPSLbPDa?znK{c%GvPO99^Ie3KyRMVHyzMJLBq6ne7!c7 zmm`Mh-Um5Mjjb_IH$%dbxxAID>B2$8WoQ-0PZqM&`~NZ%&bEHGjCXYWsV?80aX*%d zBnuStp}T_>G8__Drs(1Evx{|l-~N9R{}=WM2nZm@tgjqRO-vL*^d3^Ral^4-)Satz zxL1duKl?Y>AKdA*x5trN+1~!8avb6s02K%=Z%a?N*^KY+Bvzh-CMlp%q|luQFp!_E zk*1>BV_a0hYHLCiA3r%=V^it2E!nYzW=qwl2fTZj^LbNpbc}Uvlt1XbL`2|D%75u| z0jiCMhfvta{klE_(;yZ^$+EeRd9rz-UxMzwQw+W~JuUwDk?+~tL=12lappaNr4Zl8y@MWj7M+aZCCt$wsSULs$z0%N}E zrt3^TK@EJyx8LxY!PxY5ZjN%(FS-_B_sXSA*>fU@XYowREOx-%Aeu~D4YqRG7E~&5 z?pOX2B>vyI1=1o+BM|+rwv(B;X}Q6aifFgLA3TE9bN{vt3`?Y?yY;U>R8-b>ZJqvJ z)~&LNbJavYz?MrWABd*;nyCB*eW|zJXk1SOQM%~m_) zKp4R0Am^}Bl9o1Gh`&v5bKe=MPFg$J%9d`78p(=TqZ}O*QzUD&T+@9u-4n1KI0+70 z9YsL>P)L4A;&i(fokqaPEMa=G0UFYuSw;81fX@#L3rmN)#ojv1M?^6$u6MkS+NY*S z5UUO_$6sy+47PezRy88Q)MkQUpN--N2TU51yq{T27kAc?H_bJB(ifHm;n1dlBhbI& z4sR~Zp%$b8f9kk4Qr$FYs?Q=z_U7*hj%satsP;EV@-EvN&8(vGs7s0vvCq1`+@kp{W0gs>ABR`i|HVQ1DnK| z@82`+{LWe$U6i%*pve?z2?`9p+`d;)T|2b&54AE+`PVA~??19wICn)>Ofsh1Z&LKYVm z7V+vXe%jIfV`gSX3-M(m4(H@oF%Rl`T2(P9lI z%{uPe-=BrWwDA!}MD$Blh(PNV_MW$YFL_wft8sVv_f<xEenz*jqlPFL`1QyDW@fmY@1xx89W}TNz~ZV z;Kss8%o}}maCm$K_s7`l=l}^`TG^W*D+cO4#b?gJbA%!U5*hq1B2gv=5gB{|vEi<@ z(qJ5THE>$(*)(=AhobKEbhP=THIX*nfM6eL^9E{P&a!Z+s@|=)96>7y?Ms%Zv)Xt> z#{71&w$|w;VVx-V_!a^47=}nSVlb@)E-5K#mh8(M_aw1Q`nUHs4DzihtP&wn;%orY_O%{ZLxFCM9RUC)+ignRpW*HF9B zhP+poSIv5n1et8=pKq+o-@mbA1BLu^SpL6_sx z3w~Z+g894?94cIrSDgmxa%I{L3sV>=f-ORL>>4!?HF@6GhZi4G8>jERuYCq5W9oO< z)ptb=w_-`Rhi7LqIxKs)x3AlZ8A{-q`zz`tw-P$jecJdoAz`@GX(>|i4@+ex9e2vr zL*-O3J1E=Pd1S5hu)6a*EAmQ4B=C`r2iZ+;|Bpogcyw^Y7QQy zo{>$O1#vrC4Hoa&CmWR3Z&T3`+Ai;4hOuMcgWeE>Ovj=al=0{S2Hh%gc&&1?qY}2b z;Sl%4b&cURmML|hl-lV+UP+i-^gq}C6kU1Tv$o!r#qWjaXYsT37%i(JoX$hzklQ>w zFT%;}d1RX_mZ5{EaLueH8=|_d^D-|ynmsV^ii#1F`_Q3Bmr~emuF>hvWO!y~M~PMT z$in))1ASw8%=<+tT7q1vTw5qhD6qHwO_ql7QOubY6_S(N-xu@Y6hC8p{Fu&`!qo0b z=!2jZK_L>8u;RmC^E9+16i;0Jx&4cZLLvuE<-f%n!IYUaR?N#-M47G-UBt@L0&pG#1!+I#&ozXsdW)D zzmMk(mr+9ZjudeQ7?^0iD5mcKAwhf|ZT&d$xX4cZxo z(=xJ$w}dpOoXM@z%9$Y=ZYKxeoIjj5Gd*Lp$RAMz@1EYCkGgQ4>?s>~s?31b6h*d= zodx0Wgf8fvYXbSv_x6%Y(1!Y1K3%Yni^_1I zmmR^0N{8JDU3Wm1Jvgc;EDkKmy5tGTDZRY5kBG*Ph>OenLqK3+{6~JIrTB4XPxI^5 zolD4A;W2A>3=Ms5Z(o3bi*Km40`_TfcF!%^PF(tWq2P|dP=V;@1P=L=v zlw@&f>Fq1Y{cIbNF(g*+7QZv|*9Y4wHQhk$9ipA6JG^$cX3@H@4;4k5Kgt+e#nqCs zO=V#0VCbe;es94VnQvW6$FNGS>jiM7zRZn5eQdf=PL$bGvbCKZs-r1}?)0qSipid# zTl37+1RSpCd-F6`1!Y4x{aG-P6m6=%-y}gcU*=j+?~~=@F^DYkSp>2GGN$ZW_uE23 zid^r6KDl$poqIx-U2vBE+A#%2rH9+2ErtR13%xL$0%nBV7jZwjk|hS62Ss#XntB+c zJ7V+lB^D(mB^H*MLA2|0FD0cYzFTOMus$%~-)1x~H~4>Yjn95!qoQ6*CKcyLbj>mGMfS-SQy z6-L&H2uX|xjh$m3Ayc~l0_m%p8n_-Dp$ zzpuGH^5WFdl9SsR_q~529F#QConDsN{MB1P!^Qx}zU0+xX^bM}#QV7F_Kc~6Ai01h z*4C?xPB<0x-cl@4OCk9Jfe^IXUh?FLRBS1$;30P1&@>&Q36byEG~kASWLh9@aGy*M zn4B(-HHbuUMX!Q_!hEmj{nJY?=(UZEm#M4f=lKMK#+_Z2ltuV*pmoZmMT^GzR4)!o zP2y4xw>HF4C3oz^3c0&K{=+roY%%WG5P6hpMFtq6_T%9WzX4!SUmGv+JHrKLt;z$A zj8{S8PM`O($bt4lZC+$vbTgeEA+X2j(94dR7w`8!yg?A@n+B-$S98P4)5)eSOwEa;)PYSbn_gs8eONC^rLVB`csE z2bHO^r#h;VlFX4uYeCypA~O`Zo8_-{d4p?bYWH1i_EI{10E~YGdAO7n4o;xeZTH2@6ozKZ z5}30|Qce}(T9=*)@kD?Fu{T#M9Zn5q64|P*r*ta{O)kA^>U#N7A${JOmta-JkLgDo zws$7z#gS?pH(F&a^x5E-o%geEXa!Di(hZe|zvAP5>s4`zx=&EBiZC<&mM9pT0tsS9 zp%2(g$^sGO(s*tUny7M=3T_`UVU|nVAvrk&ACswEGVlUd?6jtmXx3%3!AVI3N9yyO zf7xwjwuCV1f;UT}3@iQo{iUh1G?!{w1EcuAon`)I+s?Au3yn{hAg=AjG2Dz@UKv+L%Ou=Z9i0U>G6cc4M}^UION4emPPDA~dPYjY}h{-8lJB64_aC~zE- znjp25GWl>9gE|6~lY3)>REuD->8SNL0m-pCFP+T2l+&77cT=Ji)&O~<9e(V>?=kP8 zVm#gQhoNi)bbEueO5QD?NZOH%Yw^B5je>Glq^M}>mo{sPSbxQ+NUwm9uj0J z6vg8}o=Rwr1*J;jZ!xwz6sDQXSg7dzPAfauspX4{0Fxr<07phgd%Z8edF&pr7^IY~ zy0)_3D^%Pyu;E!#;X5r|7WrYW$lbL&1*sTotLxN{I6%}1@oDktshRAuR@YR=YU}^9 zgd=_x7^Vbqoj2FK{3gwW0n$8a3fkw?vptCJ^x$vwqaParMw_wPIRo;HAxbalx;UKn z_M=2R{XLIf?B4BD?egn-ijFyy;RTdX$zh5H-7-E=0k!l6(6fVHSA^`)k={0SOW`aHVT~dZ2|S9K zQ*cOfL!nBvUMab$lg=Ee-mnxNyqy#r5SM`|d3tkcEuaiRBC+Xh1S=xsT0~#IYhQ^^ z?+2@nTpxsS(0%kw{D>h*icSJ*%@Z$b@@IZ;Qw~*_lu=wBAr4m)OB7HP~1fa;WTzik==?AOg{Fd~71N zr$|ONi}rJv#a!fvWwHI@@{G`9>gv3BP2U^XyWiVvRgJlzaEW~SzzZ@|g=JFpX?#f> z<@!!xW{h{1xpkhq5PSWyvpsBWe8-kFc`XL)ugrCjwIsDsjM$Y}Ck?1ROSyB>9$jco zEDV#9?p6svw#AUn8qhP3B^l>*dhR9}qx^h)eO2A-8*oYQ0X@mM#?8Y=u`iEap;B+6 zd+kJ34yCF^Sl1PU`g=){!s9IOsN+U|^CHXq_?fncIICsZ#Plef`Wt1hDS0tHL7}Yj z0R;Dv-Mq!9A2MKLkMNsbg75B;>~el4T`q%hLN#KJy7K?Rlic)_CgmdkF7 zfo)XX?t@*GLECQEcTqwApg}tOclFZ5)W~K?AjA~62V#WTWn7#~RAgVk zR`~G#%lB_PZ*ds27kE+8Ez6qu5=`pn#-L5ul;I4%~CDJx+`NOAofj}4EheV0weVMU5 zW2%HFKft2ffn&+Iig`U{^Tk4aBqSvK8>&j$NJ!}JNJywbSSawF zn4f(TNJvCTHu$w{1^Rc+dAC@rz+q3hh`j9{qoN1*=mCL$$zm;2LxudR`A zsB!V7VWu_rH4wZIqJ0py%#e}w)o}TyJ%11W|GYED#P!KfhIjAUeXmqEkQki~opfg` z>q z&J$YW`*O{2l4SAPD=+n@$vMs`^~MYg3`9l}^~RK0w6i3IX?)Yc7#SInFxf(NKMqaW zZVNIlWfrGgnpX)9K{F(kuy-MO*!=zb$<}yJVyPUX}zUDOv0tU6yASs z#~|wI*XKAj&dbHxSpXO!*+8|A)e69 z?cmD`%GcB)%IZfu{c=(7&Rg?g5qwYf)s<+qs2z+AB;axl45%WwK9Upb+SgvcZ7I~f zbni5BVCLHBs9S2o^eGZw7-P%OP`T@`kzgG1$6w!LuSdhz;T`3U^KB;w8!xzs$L*GT z5}bEe2C>S|ikRLh#Z-yivOH(fFEO61^C)jphxMKM3ZqK%aZcKe9 zUE=UUe6OWGm&>J7KMqiGEfu@w8;gU}VcO=1Z_ys{d#r4}E0z}(1?9obcS_-J*l%&f zMTO~h2${EH5!=bjHyt%^MG2~RjJ*6XFtf;5eDVtW#`4_LdlysJJ{Kh6CwV12(Ng>t zj1h)A<$P{p(%4M+7(WmLABT{z!RuhX$gt{RPy7|zu~IHo3{p;wI+ves!bqYf_j?jV zEW2XDg=lwQs3(bsa}h7v^=c=`VZ}t?QVK{&Nj>k_VU1M|vn+f1djg&(eC*4w(UL0r z$^4`UEAicSL6iD0>!qdMq-?CFD@3Xlo~)7=4zV z)+biu?_Iyzyf(X9vd*N5`4~mUu619Ns{{R1*CKL>{+r+DYaZLJO-;!5xF{8mhO)l| z7zMZHXr?6|IMk|IDu|$qG1Y616WulTq#nY$hnFb*Yg2m9B)_NTU1_u`@%0P^9m~TD zvY`qLiNXZrD(cCTq@}D|K~s4g>G5znG)bFEq$lI)&2BuvqL%`DEGs_Cs#%_w$M_ zG=t!I<2rZZFCEdGnkW0ebxl;K2w|IlxxN4UduU9<`Edc1r^n8c-B32Zc+_}lzFyJ2 zw(jr=DhUVEt+_9^VtLTjZ`YGrc7>CgJG%Uya6LWTx);7lvA;I%e0J zJNb9=Od5RP_Kte$3@Q=bNf5JnYhRm|HVrkB$vX88T`Dq7Q14y%i?bwt!^$vKr?s)N zi`6U{_aZLm@`t^mr1)Z4#PvRB&q>=&wwwp+{D!*?lv25pxBJmJaBQh4DdS9hj@Z=` zMPb)VdF>Z&sS`Q*y~;S?w0CIz<m`{Fw)OhKSs| zWH#-1LS4&9l0Y6&Brh*7V!Mt!Y8TB@l{tL-sWwp*OshDw@aVjY!Xmpr#Xz2+pby31 zLJGyOx-`I9KJcMfkH-f9lcBa$NUvUrLJ!7P3 z(XdI$8 z?^}M_WSr`Q%_B~=_<=eP=NPo6YY(JdRt93Yb(rKE3#-b?etye~Uay?v)XUaVOP~}q z-rbmH{EF1|bA3HRyYp&{>C5#WHKg=h1kW>PIGSY3E}&&{Xe3jeC=v3;P_r<#Q*m>y zCH199w|qgc=qVIYUGuC6=hRSLLpnH#pqIW^WzTPpM=NeC;k1Bt8p)%ZZ~LRV40h}a zFWMD+Di0OWT$6_SQo2pHn{U`Ucb5AHyYq^yKk$n!;5o!3WC&7UUtPWT>FMu-jcMG)$>nVIBo_3yLY^X%XY=Q=v-ae0 zM=OJ<<$5<)rauIzbuK0<2v{g+U>`M}WeM>rYbd-rP4Zqz`xZBQI3xIsk+?UvTn^{D z*AsJ!kg${po zR@$l0UXbYkC1FB?bd)3omeJ#N;`Sf1POS_d;#23_Yk(a>E| zs(DNCys}`Yw}cY53)@o}$gEI{ZBQsKK0Ds!CQEC$IG6U?UsF|C_BuUuoV>}(_H+oI zy4Lj<194*te&P?@LP@!B2c(rfn~FKlxGZPk?jar6)3XB}_Yachb59%5i%z`~H;XYni&w(Q#dHQL|#^CDDl zs?LM7Ad-cCoiI$a;^LD1-1$%EPWtZX0+X z3#WFzE?B*#OV1dbeKP)GajeYZ!>19HkI!!r+nk-9ZK1W^O;?Az_5G9ElL~1DE3Moz z%$22%moar7JBS={r(h+_ZIltUrrIyBO{}k1h?N48e3Rwe<^fUJPQ!*Fsy9Y}bkK;^-JYj1l#>14PRxdrrasyzOR^ zcu^RGDI(n*myFBL^4kSm*r0z$`<0v0KBw+vs5#-JtrnE*N*Kw~Yxpiq)syM8kI!3E zuyW9eQ6zX^T>_pXfAL)z$f(x3EoaR~-3#}UI(3gzBe_uz>rOf=!Z}mSvEJHIrfch4 z+Y|;Km7i4=QxF#NWTjD!lRE*dL=te$6gnJQvnel`yVZMqAt86XEwq)z_KhQtp#zPG1P)NQaZj?O9}C#Wu?O-wxx<(wZ`F zoCcK9wD5*H@+%<9Z+SZNgIqeBe(ljD_xw)7RdIhf9k#ir<~7|sI<^@Mi{85L_#LdHH&pb8uzV0zr-|w84JT3*+=YoC>Kj1^`srM zfq-G9+F7_%t1IJVY~DK0qp$BHQ5j_1nS7VJVs9miA?eYG$91bJ%`QI5r+U2G{+cnf zC6*^p$Zc6QEDOnuSb^||TdB+dr>fiT*Q{F(S{btPyg@~Tab7>F9jkAI;!&f#A{->y z(vd&FYCvftdMjvLhh>2!D^h3vqtC$43SAB}brW_IG;1th5(bXcrVol(xVV9#7^qkR zIJQhKN)DR~_5frEULoxd!K62{u=`O>d<`#krL^T9uW7$~#k?BxQz|KeQ$sqM6wXsd zD=RCRqO$MPJ|{(hT*8PmLZdeFn&pCM@#3(}xq|T4o?e`vwfz>~G0(NcPl>CY)fAAF zdLZ#?Q_`_B17!~fUyGVaQQpMC#US)R9{buw)3ME5%o@U`n zVVB@j(V5VBnwH_P`R0MpEUraYBZLI5%#v~h9dEhgQ5Dm2zFm1z&Vzb+{n&hNl0ofC6-VbkVMt)FN}M zJjQj^M(DA~7#KW^ZfF{-fJ>_PW;&mp9uoTy(9s&%N_h9CjjaOccaleYiG!86v((#C zliukdH}}n<0O8WO=eI1a$INNJz^R$aM4ZG#Zz&%+0}H9zPOxVz8Puu{{fh0{jSk;x zGiFB|%YB7v=4#}O-w(Urswb{g>qe2@W3F)e@g8gNqqb1JZ#70D59%q_PT%`==QFe7 z#fz7?-L=*dZ@nXAh*HjLns^OA6Fze~+#&T3EBI_9OR2wOu#unh3SE)GKXDoJK88%q z19_B*+*OJjMaVPZA*nhXb2(Ezx0Q9N-=_xXwbbNJJkJ+aiq_n&W?3dO92-)~y7Umfw z8zg$1X1D4!Q)fjize!YDto`JX%8tzO`NjZ8XJ^tuql8334l~ZxA2|74e%=VKLD7h^ za4E-vR;|ny(!;Iqv5^L-O3I!c_fh}V0%Y#Jze>POdQNEX?4q;6o-RC-&8wSFR;SSV z&^J2`r<^OLb;P#FEfT`+LB=9!qq6R}Oq7lae6sZT|;^JXiP0mEmi37De zF-6omr*I^^<0nc?8Z^>mKQC3HlZ(2Ykn)gvMP_=GSy46R*X0Cw&%GB76>3}?$fs6Z zR8m?2RE1UaUNs8Ag~~`oroGJkVuH*i$Up$APtdRu?<)G5yNj@52p)0Q>C-R~RweG8 z8HR9sIdxnrMJFbybC&oTkDZ4Gs$B06i<6sk5Dyr_-5FXUwN+kbKDljGrXXbETv-FG zuM2%QXoYd65$g*<^lIP_3XK%H8)hrjh%2MtyqozqMv9V*LIT34Nc!TnJSSa#er2vD z5X7p*FcQ>xI2$g!V#=JDE4P@7^O@gfp^iij$2yVTL^tP0+2Q>7JqyzZP6<>8iz4m^<>&uJ5mQ* z-2MmEPa#hk85sw~=EN()O~NA#(ogXS-E*-+#Dm(umszN|xw$biGXB_iT1g+NZ0kok zQBdt_r6exV8}MXov2*}`*i6$gSXGF`6|7KP<(=Q^Daiuc z4y59)CF5)9kNUa7tb0}Mexx-)Y_o9R?Ts<6pItOk#fJw2JRPlxNd?^wNuwnuuhWU7 zt{py%6n>?dbPy;n&R^tDCsR^o`6_v|U+`$SK!282@o7mOlItUoChmE>pT|j%H-2u= zIGpRbt;`S>QXFZGa_{xMi^T0vx^!k;AM)PYt_CB=OEGmQAB%bS^4@zKVZTa@I>^gT zCZ=aoizjLx0ETErt*}D;hdI2qPtdM%J&%jCV9}`TYeeTz~03 zpaNW6?40LFL=xw(L||t>oUglb%aOCofFq_F^up;+ZiLyw-;gD1k?2C?EGQxYI#(6^?eTn9I8U#Pra+bucBSc_gzH?(>3;Z5|gufVtu=@OD` zCC%`~y!7fl)#UuH^pk5HjA-=I?>FI&&TatzO&89U8y@`eQ0bO>WQoS<*}?QfkNYgT zC>G~GL*ob;?@MQ$jz;8=-k?wxhFjHJ@6qZVW)Y`f zoNxDHv*MXWzU4P$nLyR2i=qg+8>vw8iTCG^njKKY(x>NZY^+-Jw~@vS9f};Qrcl zZULB^WtsW0=&&Xho5(})VGKUbuhXNQVfj#wQrFUc5TTfpQ93DHbEPd3GMwItM;d>8 zteb)NRvCLwFOiAO9%&wRg3(^nX#WExLKA&i{WM(ygy2{?(hlOL80eS0=-PHBRR7%i*IwJJa76Nz@)fo zX!Wn8nnWs?hvNrnN*~P~s^5rWxeme~=x?kWg1v&yEfM(zeipOMjh2PR3;;|Ql0U%h z3eCooqiz%TL8!QIFJSjrxDYIM#RjGb#w1aG7LaNKoR9zcRWf4{D1X)MR(;9bF%GrQ zn(pF$zI|qmv)3+IcuyFLs)XX|)3HzOJXnNWwY(BHD8sB#RTRi5ZtHRj zSQj^25cH$({;oAiKP48`R9{gW+6;W4_Q17w^J*($Vd`_=)&4TtlAO*&{SA$vghS>$ zHF8R|JJdnKw?yoP;+cpxMVCK*eHN(y0vQJ@gtbBMf!d2zoUxi1q&<7AK%{rX3myxD z&lYuU3>6O#51EAJ+}4fEXc9!Mras!l)f%3j{wisBu%Lin#Do-3isZ>CCnwkYMA_P| z;8ukmM@O2R+?{I%REb$%U%7OSCRBXzK0DT>zy2sUnTX@*#?-5cM(oGWrHNA|nBQWp zOZS$I3-O6Qp+=&_a_a)&1{0r#O^0Y}tkev(qULz-m*Sw}16pM@vWM@)QodI`ndb<$ z597Lu7zpdV*^eB)**aD4%^O2Fl7Ga^gt!*N7#sQ6A}G{PGL~D1BUzSZe}&7`mAMS$ z;7IPlWikPyL(sRc+W(03XM!?B(U9h=l=0Y>r%+(TZPz9smGIo&*|)4B;_Z@iyO|Ebr&u7ob-M@5gcAn3HV0vYRQediU$WdA(HyfOZ(hsg z%3*OfGs@!|)w$ocp%cd8E8)EpR#5N@T!p#z*ClS1533Kb0udi2!t?E>w{I}Um2V?uWvIx`jqm`r!lKj-TfaG0EaJEfi_ zcI+AuVi37c;Kw=u0h{kk4L|X~xfLrJAj*ZQN4cl`m59ZMkVJ!1q}}#^4ylMZg1sRWQtP%6aSD=06FQzwPfLrUO{jwssOz|8RI+lZ=(np8 zK4>1uw;ZSy6~^klrBCgS6mA~QzM{RV{5-jjNQy>y=0npC?o$0al9Wf6mKh2P3ezWf ztHBd8o3T>nVnZ&=_4RdYKBL(|$}yEtKR-vCoDuVcB;bBzJL`RJ4Ar1hgT5(Nb4SKTBBG-_BC9BhPi#1qu{s(qvBu1!P;(JQ+= zLB$DnO30_0^@9`*4jPu(A(-6KVpzK!`$x^CD_YcSUl&IT-lxB4ySI}n%Rn0T*!nq^ zds~LDPN;Y~+h$*+dOY?Xnr=m{B}o0agwhQz8gxi{QBa{$52{ zMiZ6?THNvPs_A#)RYU%$m=2n6xo!uTBQrllj`9ssINu@sm`=5s>C(dIVCzt>^0?1q z?dCzC0>T5;=pfvFrTQMz+Uvu*;-}$UqzGlXor1RzvnJTZ-S*^Y4l(>c?Y?QAi z`;`wQOJ4t#L+lWX5X#rdiAWxL+#W#>_KJToXF~!@3=)$Xy6ieO^FyUytZ~Zq9*>L{ z^a~b}_}+F0YML#Zs4S{~*Zx`L%%1bt11HhFlc5k9mTOeA4dlmWwD|Y>y3axfF>* zzPl_~%xojb%;d#o)D2cgCXQ#`W3LXPhG=lIDg}}!dJvL-{pwbJkZ$j#%OguJ8^){P z{i_9VUD2?%UIBn&KVAQOWyJvO&Bw#}*a)ofSMDAj=$M$Cx8AB5$VSnOn(mk3k^GO5 zue#PWBzKx^7(Z3RtSih}#uMKqRd&ST_buo@JDrH+`{p*G?@#jeC3=F%CX=JuvdkjC z50O0nx@}5Jr)@z3|3?%+;+D|AVFE-C#{anN|9|rXJr_-Ce}e`u=jVT2CJ5!GB5$zOOm!|M7Z-407K8uGOqA0Hp@>(lt-=trjEUcR{_%JcK{{4OT;5C?SP0&>he z!CW52wMbefs&TH%>j)y+Ce66K{}-&HqIbM45UaRhucW1y z(~eTaEFnRq9TlVT$Jy`b_phX64mu?~%$obuMMOiBC}h?w@lH5*Y%*#mLodTqnvC0MdDeeqgBxSHC&AI&&8W_U#2-CeKRD*0>cUZ?L`2^;8m%q=p zYCBaoJ~45;IopyL4#tLRB$IzhNeQqk;T!q>oK+mbg5ScQ+4(|mo7wyzT*_%Jy+a{xGj^(_r0l6}clQd3hK z&h}|9C2fQHXGg8!q|2SrDo^!H&yM#lz1^p41{sLpbQPv7+wl)Df?{p-!8|E7Z3@CB zh5k7=kfE5^F7@ot0e<;wjwa#3)bzATl@I_aYY@-Dd;_I0h$ZhQtZyeo1m3XS;L$5| zU+$wflXWPx#Tk?Id3e$XBJo7klahz9kUA|P_>h|bZC5`>BL#vQkWZiy6M4`P`I=Gg zajGeZe2}adZSeKo?HArUJ2{Y;2JQD-zOD@zOILD+IQ~>~NU3Uu8BEmAUI)eZKCZUC zqBU#Kh!@HLOra?UP5-Plr8lHQrd&he=3Rq=a>D=-x zfdAf~)>yO?xbOjR2>hW{<75fSymh8S>g*j0a$%-3F!5GeBXhvuSM>l_=bLs$&zAwv zW+AO(8VxQo*cJV~z3S`x(1uYl@ceuUxXqw)u6gZ$~^_#s)$MsKMn0T#z+ z{fFdThQr@5-jzciSy~1Mh6DwLSz`or0M~Xj-d=7B#MH@F`#CeS2_p?s2n4j^cqu|R z-S^k-CdYiUX6j0RF8r_uq#{$SCL&6$+X!k=|L6cG|Jnc=2q92FkGd>waf+i=v_f69 zUm#|dK09(6`+z9ZB3=`={0=NBg6axNL=#wCvv_NhpD4E!l`g=Ev3&AG5H`dc`CYX{ zQSMWZUAE1HL1~5K3g~ZTWeV+YI5inu?t2hAxyjtytTn@6%rPli|HetUbRzrk zyT3dq?@p0E2*#zP0Y^3s0t(l_L4*5N_OkCW+>LvyJhdOv)6-#j||O#cMAXR&?~gJNN9-Wl0>Ws z)&>EpGfTjz{Gf+ppbJq7@N=0$mY_>G%*ZP>?yk?CpPhIg?>_oo`5TC|qvO*^FNf>l zH^3X=K^Q}>NUQ=gh>rMIlB9F?Lv!d7Cwspz%Z=6Ve)e<)?qa&7=qKU4^inOxtPQ9T zGjX3{u~E(W>5isrbYo-VWwHz3ZvD+57v z(^TH3UPT?NOe>x5(j%Hgmr4M|6o{KLSNSlc)qLAtQY$DZZ10aMl~gr2&MW6)gQ;3p zUf!J`lC#8viHTWc=^~v-y-HhIVk5oI3%EF?+^%rY*}b@v5gfn zLxkZ1XqR=I3j#zD8rr`1YZTfep(HD`gbqpIR7#ZKi4e3~KzoNwkBrZ$#4a(kGJ~1V z^AS@prHb!=ny9q1fxglTKW_|H=3+P(q5BD%!}aPk_FHe$8Ks}DQN4XKU60Rbcz;h% zfxs-X=>j(KnWDr}r;<;-L*n#XpAr1jS8_EL$7g;t1BVqGGP!Yq64-Ixn&3!>vBzu$Fpb8V7E|aBY9`Qw|#tkR)oMKDD;^L z{4>{D)%YGNwLn&DW`R{0gIgiHx~ArAyIT;ZrZOLKw#Wz~q}umFHozT=ZFLem2qS)J zwSRMSQwTq3`+lwQXV0^(c1BVTHS4LmqY!*r916b6{q7nKroa48>&e&m`AukKSTFb)RYUR|v!qvzu^%_Fr6F{56jW zYy&Nd0b>69wY!jQTD@fe6D7E+&iiB^)*kUagKw=Qx4*wn z6g+75&Sdzj*u%c$a38|QYlmC&Ly-6oG?C4C#zp2m4;2k>JNRaxhQAD?ZxrO@?0-lk z(;VwQdGaKeB;fC&+QOou1|hAW7;xRI$W7#G32{QUF$?MHSM2gj6%f)E3l(9K$oAR0 z2Hg$|1Cb+7MdbexqOIM#F!gVUDQrVq??MOkVE*O#{c48{00N*7Q$E+pu#aWC@rL%Q zea9l~5K5jqs*{1IiS%>H4yrTm?w+3Yz8A&-Jm_+fpi2FBxpSP*eouT1Yq0+Dc)c=Z9amf5N}f%~5D#l7zo0!CEfz&VX7ZK;nN zVb63T6I-;s^nlPCNNI|Sitzl{XLll6jIfgzHfRjWQmtWt;}ku^CF` z^UIenmf-RaT%Bc}e;8`RKjg)2y>w?-IgFT)QP#!HO+_Eo;~j)eh3}^jXB$@8uS5(S zb)-RTa#+S%5#5&Hy6)Laf(OA+nhHNo_kSlvUG4UXoF=az8SI`Fd{0{BvO6}Q^~~FQ zm^5nlj{H$Zd9J4;Jvt#F;e#d4zsYPqlv|0Jka#8BoPr$D=XWbzDPGJ+B)RwOVmcy|?Dj=X?@r^A$OFQ4Hm5 zMhdqrE#~DZ@?dRYaysHb8ZVU7PbhOMg%rU@!*4P{RxuSm(5k1Py}!)IoY~;3K4&@~Xk=GF=ZEqP#{ORK?WG=T2BHp( zB~J)j0%^tjja()ihQ+I2{7tP6IxIkuh4?TObezWDD!IL@(j~^9rNH9a3LxjXvjUeT zQBgbGn{;(i2$P>d&gW&dQJSnbWV|pwF;*S|1d{~fNOA&|V+?ir?FsfRrVRiglm%#i z=fh`%Hy?8ddhNzaXF+cew(7$R{AfM+4yMsH?_*K4FeqoLX;gC?h^qOgT|kuqe~^%r zOu6Ru6m&dT&9|%x#AYoh!a>2ou@F9nM;Jg8e+p&zYONBsBJ@#}Jn&27p?fQa65vw{ zqdA3)bdwyzO@x7e{A%+V4#&S*faiN?Z7oXYo3p64 zi!fj=f#0F*@87?x?7ok{j)A5NB5}GZ+zxn)dG;D>4gk;q-3l00mzI}{1Ys=XjL561 zDH5pT;NUc0{#xcFY7<5Gy)i~tyW04p9!U+1*g1>WSwj~eib zQ#sa|Wn@l4VV|0sl5|>#Bu)K=l7ak2;eE&zl9ir5u=XKFbX@plGqrm(^@gkvk&*2}MZi3O#Hr9oH@<|UDjr?+GO}cjKFTKF z6>f*VGCJuH5lD*T{Ncgd&VTg;l;TGQ1_oMMky?f0 zV1*kNO8-`fWzI$}GTZq0ghfyOzr!qZ6e{*!xFkDco=rNfIDGCAAtF|Nx!nLa$^Tgk zgqmNuT$`G?`X__<0VGE=$cGz9cpq1+PekElueJB~_O`ck0vU(#`|pKdF+Xf>HcrXa z&cZp5pb=ZmMKrpV;)Nrx2Ev~uRm}U9w&QPraHu5+gR9y2 zrB?QbT4G&!&i=|e9@hk(2|2d#h5<4TE`a0LW2qt-uI1wpd3tQkT?bYv zs-ygp%JFb>c5~C=i1g$L#9?THAm9$`7U*@hLRhIkS#oG}vE_zY_@dKgsuS!wp z4bXTVtX~5#9YzKd*1uHP%&RC4shqQlYP6r-+2GjUpV@yp463R zwmMD%zuwqS5A;-gSOUoRb)}BVnRmyB;k(*$&TAb;f$~)58yId3(7$ zHQLgqvC-FpLwwCVN;KebL6ERXU?SHZ`aG#&$3i@(xrb& z+WHJODU;k2kEI^!qb%$URlIFhGT38~OR|N@{xyhM z)3vSzAQGyYRN5v;Q7M>PW?k%KKAaxgp+Ubtp|AGUb(~f+P3x5J?UzSdpBGxht3Nvu zuIjNr3YOU-mAEJ8PAg$~(0-8G)KU6D<#^t$4$9#~?8#|;!E}~}?f04wHs8@p&H|g? z)V9)UN#D(QsnL`%8<%>laq&yXbn}8x!>yv6VOYX4fv&G#4x?Cl-s3!~WaMsoGQE#$ zQOwo)^1$9N?e)%tKKrdyn=w^@=%og0zr905sXr_7i_zG2{SOD&SRSQx^;%0`0 z9YBXf4d!_Bs`RA*1rlFc8smrYu`wnqm~cOMK%)VC9aAnB0I~q?^^QonD16%d&`TN# z;dt1Pf0YvO4Q>=)J4o`~+)1zP)ZzHL|MIz&E6p_DaDiZx^MS9%f~`n_-D+!}cu50V zP1|dIu6a4dFXh=4{RwRu+EZx4zIk+gX$`^F>$7dQ8g`4HW|d2Kr)g2p*%qbw;;h{n z{CGQD>ARpOztkzaI>~oxJMC_~pGJ0uakt*E+^%!YxitWni0O*&2eXCRdz47c8nb-b30lf4 zWD#3srMRqkrLYW2E+&eKC(}NVWq`2^>)`0TN5B#%a04?B?mn0pGdeq&^SX6C!Kt zomW=Zco%L6Ro>`g=$^LDuHsHx_^LC_{YlRJXcsjNwWVC1d(8Fd*WR*^$B?4+CSP*r z&uyIsL;@W%#j{PE&e*oul7b7*A>?qksl&KVYTxNS-;i4|oj;$gMO?*knQ5!Krr%J% zb7)0|`s|!}PrF)T;@QrH)wh;k{R-at4MT}H2t6LIo$U_tjtw28$&71HQ1_FbEj%`GPk)c43lt1cM&~6yq4wf{=ZohdoqYUMDbPEs*6dMGFZ&h`ASEj!)=9 z6nqALXW$s=78*E$nlv(Ufp^TM{azKEU*IEkz85|na7-+Q`kJSx=nEKUS!xMRop0Dd zHPScvpb9E3!C;Z$)vH&lAeaA|_NvA&*MFO6nM5Hg4H4tR-Ru6P4p)3mLR~)#R|v!{ z%tc>(cGKePmeWB*SjQvIT}nT8MbVJ7jq>)NPQ29&h%`HZ;nZY4$Msaa8^5(VK3scxlGcw~e@b^p^o7nx6l^2X)&dhgX6@v)qO1XjWp%&x zXJ@J&N8F_k2$qxc=t(5U?{uayN$mP22*{pa2zwm|$vWcpyxBHkr4eSYDt}?6TTpsS zO5f0f>9jX>A{C*ihS`OXmv0Q(ur7*4rG|0;_yOSn3P?fXa1`tEV3eghIRY>a%!x@k-83J5qFjTvj z$3q*jrDY+pX%KS7ko8IfYu)-6mHOSn)H?*!NFz6^N94HFylKt5J^H0fE*wkJIq-6$ zWpvHILn%_y9lsgq%vPlU>H)pM`kYn*VQfj(zyYcbCNliy-D~pp9f@KEQFt)k#VRtgg^<0O zLHcRlyqzoj&&&$raA@%DB{iXMK=Qph0bWh_!o!oaYgcz}yyq5O z$&$xthpGHYz{`1OQ7*LOO|xuh8z=ux*2RUsc)H4iTb6>a-)-+IGTrpvPJP{DVaYxx zJ!ZX1=7@uvn#rs^*R073lMO&7$v@qLqyQTmpE3$_>ad!gQGBk(EEF1*G)E;4_n8w>_OaP69$rF_dGCH1VdkBzH*bd zt~Lw*(l*icrE_A4lSJj)!q@j}EN}kv%!zU3p4|9LG?>|HJ+=mW6l`ASN-ZnxlN|Ga!qEBl9>N=mjRVw;KJ|A=HO zfBuptlWI@qqt4d=O{D8xVFDL~;oBRmkD%f=-gDsk}@1mo10RH{YvzVBAu+mg; z8CI^rtOnD~{E}pcvB9a9c%aIl(p{zxbWW(lEDeqWJ+g}h z8VSxL%xwWSHl^&#V~*|j0L>C4vRr=-kgLw?;BR*1vW(;2;%1+ArVFOrT*SbUe^>(K6 zAA*T!@Hun23OLRuQ~8yxtu0&?`Xi*~R)B_k6g@*jJ8(~(c-JU!5D*mtZy(5Q@ViS# zzZh(mUhqhnMd9dkgY$A9)KapzUE+U~+2^If_G;^EKkJ5q0^VoaKx?HWC7b-=xQFc5 z*|7%TJdihV_`(Yj0$|6N$K_#wIq@n=vU;_Gk5%*O69D3J9x^x=`{6oxj3B9H)^z$I zquz`Y_zb5EczFxpVkIRc@aQB;;TLMrhaPOsG=WB_AX!v&aXV&vxqrIaah`x)N}jPv z6NntdGa!p%Aqn;ufK>>(66}K${&(s`=9*t&rP+sr5*swQz}Etw(3vndfp*f*SP+Rk z9x16U-Od4_9fQNgIFodGP;oC!Rj6wq9^QwW8B^+N{f|z=z~WYg!z?*D%g*T5LnJg99QC`EJhmlX2{#%+3HYf|9#AjK@;Q@s zhoJe*s)k!}0zjBeK0UPqgbIlxptx0#SNQz*T6pi|BJsm9Nc2SNiq;sgnZA#YgMkUr z`-jRO9{Cs1(a}|8y9YgtVphcXSCI%(B7A$5dI8?Cr70N1ZQ#zyIxVPzoh~-S`UO6) z!E1K~xr_;J>EWdoB(ZaO`=0ux!5MJf26i(G3sNeoTpyBV)jm~vVy6~xAA!phk_Bz2 zU;$?CRflzl{Dtg$L+@qSx}g5-?(7Wl$1mwYQ9-DoI?)M?DM;bK7XMGsV)HDm>tq@x z6uoC?XcMwK>@pAPIGuz85^kEDuPkhT00OWVD130JBe!D%-^!4hItWqIMqa(-)aHRl3&$*xuo^+Xxpb2{lfgEAIT0tKuqjVC>6o10P#P}K-8qmP?eW4-g_D!b8+J`|YiQR$2Mgy?KPz#Qb-PdJ>T#^DP zkKnW5(IeMhe!_+>e$!bALUlBlNWCnm?nNJzE8XOur@y=)tDwHH`>|H3-vRz8E$0WGlh|0~hRcr=qy z&VK+b;{W#t82w*J)&IAec*{Ll%kW#tAT`2xQ5H6WP7i8H?N6{LA)vIs0|D+OP~aeV z@Ong%Xb3uz3hy%r@t-QO)bVA8!wrXRxdgGS`uckCx%LhYDCJ(jFTnHMYemAF+;*e` zDF8&^&SLJRO(=4RG`#ENdslVZ)VBaP6%05Mxwwl`bH@)*4&T(TT11Juk)PO~rae`@ zgd1+_$xOt5>;S%S2noF9)fa#yn}{QXh@d5iIuc?M(E05>WNQJS0wKSgBmzcTnEr5H z6fPXThfBd1Hli5+0=%QCYDdM^$1}9)dviSXwHyLIZ&XvMWf6RnPcLA*QPpr4(Zg#gNa=#3Zjo(iJ;%Bk6m5VK`4|N} zT;NV_B-6u1xf(t*UO;7DFxs}4A)|KP1;xzT5lb^Cq|n_cF4mN`kL z%%O~-LX;^Xb4Zy>$UH_uilhw5Oca??rX;1zNeD^Ogs4P%_tkxWzw7y}_g(LL*7Mwd zb+;3mS3QWb$eZ1Sd-*InNBz~FM`^H!=O#JU1xe|j&4-klX z)8a7mgpS-j(2A@l@3_(lJVRCE1*#OHu4^1hgFj#-qMX$Kg-IZYZy;~6HZFjch!?nl zM9Hgis)FMn9?dFv8MG?&uNOGUg)=egd&qc#KShl9ETNQT=BWk<`PIxt>s+KRkp}nyREsv6vPbSOt0wR!hAs7XmmDuV$^@y>2WX8=Llcn|oJlX-Vtg=s z)K7G^f|Z+_@Q$Tkl5sb1L@=E5?`K5P>GvvNkgFFbTJah~U9HER*Xa%({Gp{^MVvn5 zGqqj5sjj7agG|PGNP2&Q&E>7^J?}2?@mEIJq@QepKCX8AoeSJM+Xn{^_r|#`KrV4d zn|1lyw~n=$?`^$F&HLusDA702dZnmShTz#pn~D_N(M}U|RWP>--h~o}my2$cd3Ui~ zDBFkA`ArNb=kN3{Ty+hcj%quSm$?qEu4SoE_A?lu>}Gm?p#03EQsb-glvYyrwy65# zUA%bF=y8kq*Au%K$@qFySd4Dd>Kc2`-(#gxW0PJ{Ryov1qxGik#;}Sd^bxO!Caqgi-E5w?cB$YI|_bLbgs(EnnY0A4*RVk zRL;xv(c-k!-wz7NRhq)n2H@BA=ndYy-PL{f2%U#Bcn&f+PVGBRXt7Jpe_Sv*Q#$|I zg??gc`GXur5k%@~y~M-5Gi)CwrJCj&778I@F!9 zolV1kEjiwfaEb6*=Ws+L$>8_iYvelPcmIP0sQ9sI*xnM0q?VTYiHz@YnKVA)BV`h& zvZBCy)heU-q-!#EYNLYI5!2=B3mn%*$Hv;T^{6!NU7!f`Rg+6Mt%iq9(ZO7SB92cl z`FHu{Xq-K?=WQCPTWzQ?Te-uyL*<-+-}~p4HcZv`9XruN@N+tXDC2mnJw0M)482@h z?DAY$@Gp{0`ekfdb7+|t-7l#WlIPMoR!8t<2dN87x%vF zNQy3w>1d^FNdz^XLlqpDu$`~s7xR+@rc$wR^$@nOGzO=mcYwfRN)#`RuMxk5{S zs^ZaVgigD@pvtKnBU#G|Zlj&n^~>At%i3zHDw-_ZAHeZ#>&tG?|iusG|yeFoSrYfeF8Vb-Q#OnpU z%swT#VClJ2e}S`}!;>VW_K92FNV{2-#!znR+^{J;pyV+?Q9lXlwpnf} z<1n2Uh#>Ba?pqi6tB<<7K;N#l1I!m~Dcxr7vK=i`J(=nTy$8HazZw_T(+!_=*Uh|O z`6BrmSr~h$RSxCzElPQ`X{V0lIv9~6+Ks+z0qsHg9 z_OQ-bQ;o)hgXQg}gM3Yu^nv0w^CwRQU2c#>JZQ$Y`rX5Z z>+=5og1sn2%1nMlRMAhc=)7aubJ6tb!dB^K!ghVV&oo&(o%M%(AL;T-Z@zoVl^=A! zf&SB{PkBz=?^8zZ>Q^d`JDGY-zkVt{qIZw*%X&p4h?6^b;KL(RE|>Y5lKP>qe=@fE3#Ea^OsuH?>j*wdn=5d(1>y?D}ExOc;dLy8j-3Urtx$7z|+VF)e6ii zS`_-cq?nvW_vW9|3klKq=^6)NRGTubpJhJ`p)3Hoyy zr$A{I$ZZ??)+)Nrato`?^kGI*umFFh!2^6R8pt8-)Q^&myfyg2OKF$@?WIGk93`R#uuygEy#q z*~wq8hB+o}m5S>J>bfpI#wE60=egC>idf6cy|)zjnI3SbJYqK*9U47k>WuMT$yUAV zLVlEQ)lo1lTT4)Jnu^6-bYSi{z;fO-x$E+^*7LF7#Ggh4G?bRGiEfLsNC7TevSHHzGA+`oYYK*>uUy99|c_phoxY6$8&oS1Z!k zVo~nxO&N;NFHK4ABP(EfzE`59>BB)awp`b^^Tl;LCQQ11GNd#crKmgsSAJHqmMlhi z;+o+%xBe3Xd0|6NdZS7_HQ_5)s4Y|HSb&f0NTB(vK@!}0N0&8>S>qw>9Rq<_Xp}7x z^jc}7T1<^jj>;rRwKZh;vIeGmdMKVij-!{-Fjz8-Q;2ZCm@QZo=PBIA9&sekBT*zL zDyMpzgE8&aRI)epzTQEn7AYJo3mh<%iwr5+q1dVzsYiB~#8Q4{?apj)fC zi|p?iqv_pvoOtESL?3?#7nEy8O74Q& zt9N*~lylU69tuT9Mlydei>V0!HO-dD^&6v9LZYELL*y-X)+OA#-|I&sHFUMBr%b_dP_&UO-IkpYJ< zM6;PQ91&g3;}YHa^5~1~)(CwUrpk*&k>ar@bh*0>C(2%uS6O7eTxfOUXtCO2PLolM zEUT(Go(_PeT-_=%q@qj1_WefcW1$}KPmXl?cWRlF~E*_5_$_n(pHjvN`Sz~+M z(`;m!H_3diaA7~2s7hMC%#fa9h?}|WnAK$_=JZFgu<+p~4d#L9o7=Z#x?kuT)A92M ztX2onTb7o|4S0NoeEd~D=yGtzV2Ht0VUX>^~=9jmzOiWBr zCK4W~0VlW;pZrPKl;j#~q&km)-UbDePL`BUi@D0af)l@^fj@}^Q<({}h>iMWm(MZ| zyZ*GxzNGndo_6CsJFU+-7Rj_Zse;?UexjwpVON}}S8<$geXeUrP3I%vu!O3Mmb^84 zNHQ)!Qb=NoKfk(Ff8SO4tphBR{TB%P9Bf6-$98~l_meE zPS&+1zJ$G+?MA04XEvrT7{RpMh3KA!G)KFmWpq|k0@ zbFysmYkO^yK{=V3$wX#}ap{g0?xw`#fP8(qfLDaQhxRRP;n(TeSw!-L!w)hXzNSu0 z8=mOto{LH_vf%z&8|b}5^m^j?rMVHEiMyAh5=ss#1k~m2KsQag;h!UA!b6!f^v%#+ z(H6l;hi53_2I=w{;Fe2L&7o`ZW0V)=O51o0DrrTpXU*+)?YU&)?WX%e{;)t&usY9M zX#q#s;^v;zvw5tJFI{HmhK~wNh|)TdacUHhk`;!=Gkdbd?7*A%r7~P6ShnWw3SKGs zwXliu?3&UEaq9Yx2Upbs%a*S5?+N8D8UQr&?gc!ZOUfNm+X_=JT2s)bGF-W|ATZTe z&CR^kRJ6s@ZPyG5J(%gJ`$0~#0#jgkqQ|Tb+PWypYE1!Re71?)} zuj>`A-eK5TQajGb(i?R0ukd=xt)ft^kt_c#4=8d%HnIokZrH!-Yj@cekrKy|=Q zLN=RMGHapL!7BUqRL?#UqaP&}BEvp$3v%H0CCtFritmF&{;xYVh&qv1ViLV1 zd}7%70;O+3I%Y01&(4U%X;q3Smv8Dh`b>N1znn7 z^}pCs{PvXWE?o}TsyP$^6=y)l4RE=ejrwa&|}TgY_Zi5}A2Q%rY*U1$TbF zZPzTGv4@n!Ykd2F;T3-g_Zu18Em%rTj&grCQe-+=*eIIg_9A1CF;~Vz&?)D8@~-yO z?=sq@^y;)7y`9b z&xu~#+wy4e^^>VX$zu$s=A9H=1l*nOpOAO@Gf&B-oKhgbQg6Zjz<`aqrkjNU64G`C z(*~dEI9lu07tj(Wxs$iB(g(Mc!?}bg&Dy2RdXDpk8epaZ!I(m~7dIHb*=;#>{;`13 z)))ikTC-tlQ6Wtu3Dr@UB%bj|A@7Vn3pjqyo;?X}&Q^X>5w!G~;6MU46Zo>*i?H&< z=Ud(nXC^`sI%g8gm*{+I8r9~G>=s$>@Q+?4iDu%wAr~AqZOI$^;!z`P^BK>^#x)`_j(f}a-ige^VY7Plk(O~!njtZ>y<$BN z|K6e(QW-vnQ4g8fuyau22&sMYAUNW1=7)+qph8TD1H{8hJ-{!R@^KM}lxj>)&B3p8 zaSNn}xT-*bO7SpW{v*28d#rZ52B#O{B3b6G`)^H66jh`=#B_uYX`T^uoZxNmv!G6- z{&FSfIooxrk)F&PCGC(4ThuwPlegc4xJfH4NY>`8kHK5U%Xc{njD>q!Nfowsm6Kg$ z`5p1_q2_Zsj*`i*?#;m4o|a0ijBr?L=PS%^9H5`ji)%8ij8k5^qkR*SNQy7aWlQa` zbUx>eLYesM;umxt#(dK`T5|hBt5W-R;!JUsiRRGYrJlfEmawD@aGFn$X z;vi*lC9QmMqy5zC>B{UEyewzwcYj!MQy!w^IV;60d1KN%1}kNoxZ ziA$UTA`8dsYg>0y?Y53n&x>!9*=bK@41jMok7;}qhdo*3;W*XB0~cmDHrKxf<%w+C z0-g_$W%)w-x?Q3(jG4OQ?qPp-ZYkFJ;)Fj!C3H{sg}Lu%v#vt0*L{;zC%0!Rp)y{lLc0UAbAcsYdFqH$DKsW0>2HhYiBT6>Do}VZa zrpt0&w8&E>Y^5jY_9QSR%L_&Say-3Kvv|NUTqr8ufW~O&E?Kp4VJRVQ>oW808GWh6 z@e5IxX|Cx%NK1+*JPXdK1}Dj9S*iG$;`P5rTkki~&#v4@1el@w>wA?=iIZIeY<_!_$7 zRA(X^vvnoz$ro_p7{}S2o91_;8Yl0}@r`|}Gmw4C?vd&4yc_*864Dv6y&IZ`mN6i1 z+b&%h(QIuppFkq@WgMN^+b^Sy{>3&_hZihmX{L%%_zF4UQu~Q?g<(3^D|$hu%ZjTb z9PHUPW5plnNf}Iv+=$p!Wv7P>|{&ZpV~Q9NeYt z?okRlTe}@!WN!rde|lZdw4}BxUroj>XHS)gb*-PYBt@lQzO!?QfX@YCs*?J!0$ab9 zy*gsd$~Pvr=v&tZ?+kc96Tp0HDCA}9-pI!dXp6j(mi6Xe+%z_uGu%h-04wIjUqqkf zV6Cn5DLOCjJJv1GZq*2wPvxyhsSau)_7CRe`NsFXV*H+f&>?Zh`*-()1OB>-oKY={ z<kWbTLkZW@UnVNkjv-ZY|o zqcXvGy5__$)$iT*kwskkbUA7E(O(~5dy7O>vO8ucOQdGtf;kEcrQ@Ge`g;`3nHsw2 zU-g>FG){`V+CJYaxc#EpqrU5O$3)tjyE>Z%l-Q13)@IW+zIoQYQp0q9=tq^P-dAIn z61rhe_rdFzN?O({U!TcOif)Klam7<|OOr)p(2dFK2KNRzi|m}^vR~_6 z9mv=tt%EX5SDF>CtMI4xWo_=D0UjN1E|=LF_rjoH*@*7RDgEFBiA#GF+N-wfd^k)O zl%#3wny`f^m`4r!<>l?%oH|2V2KjT~75U{u$KD;`RrK{PSPH4XFi51_M<1epv7#y) z>OO#oh9G|{#n%~}2T8f?tHq-|ee1uGUl&Il_O(|GXJ?txtqAzpN&~{AOgif``7m7Y zP&t1xk$ko>9QuZojFc6_`y~4LeZ$*Ni|RetMRra_O6n7)m>4N9l;Mj{B`myvsoBkF z%u!olgoe^HUt8;hA$;2BCN*~Nes^C~hbKJpc?+0UqZGl~=yj%MosVS2#m7_6m|->z zI#C#sbgDcgLpfs*@GRBBmreG@IR4el+grhC_>JF`u!kN-*?ZFV)_x9i!j0>y*TEug zH;LkmzJqT_m#%z6ZIohN`#DrWsMKAcm@#e6-5t_JV@|W?JL?{sS2ZRX&Hp@aQ;(|o zmU4H6)kPsUVT3=w(@UykBGPW*zUJp%?yfR3*G?4_ZH`KCE2xksxbER)3DMT8kBi!V zRcYI4VeD9W>=Z+_YlOJ{uhtRN4`ARA?hF*9+49HeM4T5Y=451KpjjFU)zzk3 zV-a0-?$+to))U)zL!)ud=h&_-GN-YH$Us(B_Ta&T+Z*z@QK22y{OEMzM0r@^Hi*xb)6uzlu@H140joLAl{HGHIf z!sjs**Rk@-E~pkU1lPH&qxIpW>X?mTtg&1=|)trBp zU3JP!xyc&_Jq3K1nmZhum$!Xuj#}V;@flfpp=)VB#QkQweJx3k_Fh#mIN;j1F7@G`K>N=!{nMI>r$XyDfj+W^A}HbKBG(?r$bFGG~Pwj8x6 zG0jIiv-wB=K`$O+ljpEx&LcEDaLMSaIHIuY8>R3pb)*mTX=#3usO*9>s^pynmzzER zuxXqGudECwLPOGfWA{2}O3TFoS+Vk>(K*~iz8V6j$Z~6Z{KLvM2teYoUeJ*Q9VR^R9%ls_LxIf;C75|pvoG}hZ=b$348>nX<#Z*%ubAC%`pjI$$3^7 zkEbTe^Zi5ktD%Q#1Evly!4tsbzqM3A$unbPpc7U|)us(mz=w2 zlMYXyPyR@SpvA@W66pbf1?N#ZXY8=mxu_Zz5nw!Y zGwE)8f9-9mIP1lj4i@TA#Syj-i%;<9Ql1&^yi^HEnWEo!h)mnc1|s&flQe5|tnZq#v2V4&22s zpZ&acRmUDqBApSMMN)i`@h}c{n1<#*Xg=@MU%GF?Eyr6*Y>|7bK_vmpp^Qh^+z}#Wpj_%CF;2@Fg+wOwv9kUVqFoT5>B$z5vfsNG55j>3V+k^&&Ha} z5*Q;ukKZ`13_%%aOSrXhuR~F`!;J+jBrCnk$lxGJHvzZBo3eT;%kEeJfD@)(be`k} zX^Dsce~63Y1mB0iX>166@;Q*34g&{63Sao`m-;Mvw^ivON=oo`HgMp172Qo?^MrUb zZJRulKF-;^mjhRsb~}@RhSohWwy-d5xQ{C>zj$_?(L4?f57C4OUsR%yKSH0FE1Z0- z3;TqgAc7cEioVH$kzHn4_!tZe+aaSq#j2eE{g}3CGq9Pwal!kx z{QCZRN6QR~4#dJ{#1HIh>pWOkd?1sNRhkoJiXRlN`N^}(D=X|h1Stth@Vw%_z&vgO zHwyTZjRbiSsE~KTjRvzAADFv`ay+n*=t{X;O3FyU9WQ3o6S6!6J7!rI8gNxZL8LQe z0{5MG*}*Htjnm6$jr1YPucx#Y7niIaOi>M!FVJidO}^jelU%2~rPI{hybe_#+#(b) zj73(PZph^DndxK1q7g!$8pU#+xUju5TQ`p?zc~kc7$OtYR+k6j@@>-BiNtNe@D0*5 zG6Q(rZR;c(ItmauU)%j$i=o6ZUKz`Z(d%FHe9f#>xeEE#s#%EP){y>j`y9~`Fe~|& z#eqK}{YsR?2+BfSRTz`=lkDfku9Q^Fmn&hnK{fCR73 zRr`9F0m7BQI--H-khZJT7*ks!e$HZ%M>pOSNLT!6cGesj5R+J#o3Z$jJa!o~(yFTq#G6s^8tuDx^5~Hu z{&`>}EF%M;Pl8eJk_2mg0|RA6YUNL3b>(Sn8It5HNtm_2EzDE@hfqxS*Eh41V3eDe z4^|wknt z!z+Ce#)TO|kqQsdC$APa<$`eYi5MUqJgEq@u#+Hq3N7WGDiI_%Nfputo}y=3YHiko4U(AF=@(N~83G;{@ zykT3^+|Zyk#;kv0I}Fqgp*5}7kU93C!sL$6!qE1{qq;(xLp-JO-Df2JD%cZT|GH8> zyZHN#`zJdVn_M}^sN&*nPRj@hmhVqSX70H8i$rDzzei)mE@S$cH58~IvyVdI4*t*s zlq6oasu<|$YwzAY9PYGBLPA1A!*n!A~ahHsNhs%@uCK8 zmMRxJQ;!aGl){eS42hxc$-d@poObhy=^2Zd50d(x`}~Pac{l;~a_*FWuVZLvh_MQK zb6ena8{i|hjBL9?Lp;M$e|;gG!U|T`S->=uJzVq*8RTG&YX9wHnpYD@f>5U(t#ua; zZ~r>{QBHJ;D;5ra^MsJ$(*Aaj{fd4iiCxU=YSfYvU4#!0N z=XcsJ#_N ziC6O(-kDNf#=u|>wH$noVA5kx3on9HNt&T}uxr7+l@SsmaqaRrKi}DDQ+DW954sw} z$O~SGQ5DA?ZXz3A_;dxS3*WS2d?^zg0TwSOaS<@%|^ULWc+{1Yf4hyc#JdbybCeOn(V^Pv0_VBx!pkBC-A@i45aW&XBS zPFzINaAI9&FAKxY)N`={HJdqcyUhTpWob| zaLVaxl|91xKY#Dbd+EQyg81Q_eE-KvK6#8HFm32a&~#zHYiwEIIh4BMTb ziFy_7ItXH`r#64Q2`}D%dH>56qC0{ze8#xM6<{t73ry}8{s19>@$=YV^W9H`ivNlm z#7;Zz^H;1zpA3tW?ClW!(IM*A)EudCip?g{U2wC_ zdIn!Es3-pOl;J^q0U!4jjLM*T8N+=>?Z3C-?ERo6TsMXzj(vIBo&{)VaEIWsD=eam z(?=;Rrkwuktlz)diZxQHu#`AtvS-)TUv@r2H;(>s3D0LJ16*$y&Y*)Me~K^o8I3i_ zewf}8`O~u*X936)O=#y?QWc1VxD2qyleef_Rw>n9CIV|H3ZwQ!=_3Bxd6&W$8Rgj_ zcs>DPVB%L@1nYO941%$#Jm$kFC+~nN{_h9EHS&@=>7CPMERokn>|XD zPZt-Vd8!_V<^@*|qwAI^Rpkru;l8lLd9nYp>|Ksp+!b&t~Q z)h4PA3R4lf3R=5wo}t~>&56);3cHTYDt*B(5q|Om%qy&y@OA;RX8c!h z=OlM!WuX&=1^l#}LGlB@v}-TfApy_}`1zA_r>Cb4YwGHN7#s)vef3M**cfk^dS@(= z3i}>%BjOS!hc>eO1Txg&7%95M(eo_c#jadP^FBh_fii!qKVZ7us3L6C6(4ZWjzEM& zpwQtlntuOY1&?E%H#?*Oyb1F-U=YqnH!6_W(3#;N4?&v*fZ-kNh)<<#;e@py?Y|cZ zK{5GJyS}29LEkmT%Wa*nc%~QeBL5&o=c=FfBaU52kx{ubUh`~AlZ`HA2rhJui@o3RP*4vu*UwZzc)aa@+AdVGB- z^q_Xk+H)=#XARxKFiaaxoJh*G{Kqa6k3yTDB2C9)NXkVDK3DM0Y1N8e?N) zjJ%43Q{lL>rzY=jSL_n!7HO~C++6n#T!VZMp~MKwSmy*#r2GJGvFl^ZEP$isK@N#o zKuu6!;a^h30|810CIE8a-;_ZR-pPF+IFRfRS*TxSCmIkaBhTSf;`m?rw!Md4bp1)G z9EwVeFH0}&nZpG?hrww0xC)Xe+RBeZMUwTVu(ep`(IVE7?txroengFs5*r+&d@I6 zb<&4V7j(2RF)+X>Q+Oav;&AfUGF%vZYqK}kNPrXbX#~k>Y!GXJyR9|V%I#L$lD*-u ztO+$v2|0>$lWfHgUmyM^3aQBAu0fYc`bE}j*hyAZELqZ zsx8jU!Xj(0VaQQb%=X`RmTE1cNc7&qTg;B+N%#*IK&;!~I{#4o3IVS0|NiO3zx>O8 z|1aTHg0D{WhF=Wk6?|)roUFoo9)#K3zu6#n8qsU~`**}nznyo;l}I}fdVCuU?^N^K zMn;s2&Jm(hM@dh~Xp6K@bUc0e;*FATyP`?T#t_}#AG)>+n9cgyT60JkS_41hbVF;^ zoignne=V;2NxZ8FOG~TKJ*hIr`;Q;rhAQCi2Q4Oj%O);CZn9?r6!D(U?di-^Nf12}snw_Ez`94Q! zSXnknBTY;yB>sNy9B=L&XKtR!XzQ)m7J6m}ts9t-K)f8=hk#`#UL; zM7sX=eMSX}=a9VlJ`lOl z%P>_P+`NWJK;vWyq!m_}ZP-^%w6KR~h)q*KsUjoDoYyVmF&*iy47e7EqQYZ!X}W{j zmdU!o@7?)1Uj#CkCLe7K1zb$zjPzcsM?AtX?&F(>4U9@Ekna@)Ge@(iLyXWl0{pB9^zdYLU37g4=yi0F$ym(PR^n#)MM$V?txx+ z>eU^}55Q=GZ>z8$y~24spK}v+oWx1so5Tcwmc=#*vEfR&Ly~hj?zFq*qulV##7^sq zv-zj`$4h9<4H4|jJQj^+C0FH1C~4Ut*4m=M*(ll0*a!s7khq#@77DgA3ny<91(=>M zb?!AReN5FeL?{n~^+9h2B4XYiU#^636_GC^xZwC>#%_bQvD-obH{J7oQ&sm3Vb%FF zHYL4#LGadX;Yyw}mVPRSI0?X6+h`7O(H*k70fvb&eSyAZx18M}_r}T9rqT3fN?Op` z1?TI;RtpAvSlH|@B65sx^U(16qI~mv)%`ZY@aFWCSF3UBY{^GjR*kYE|O8-wTs4Sj}ZMTEaFhq;Va&&sd)uXA)Kqg zWTZR;pfWIlM3iYf3%+#$i6 zN^;V5dEon&>U6?W@_Q+G@B((gitd(>{NQJtWZs5cr09B5TM2J|?o zETzoLfN>v~z>;u1o7XziQ7J^~9=dzvyDgNkq1Ev6C2*qFN;~Vb0sznR2}8|gT%4O# zeH5k?IM4y;#?chqwCkIZC%;dZu*bU9RSx1=$k3+34q^*}?THfI?>~NMg7ILwLRq_q zGmo$5Swrdc`zf0!>Zn{|LcNy9?XDWgiQxacQ;B$jQ^eS*pGwE_+5v+)vn&AWcQNNPU~?f)r6@ zXa|6o%0oP7`3cKgh_;(fl5i^vy3(5GHB^!|Ngu=y8LW z(Q54-cuNq90A$-pHM_Tr~ix z843k7!~&ng`&xeWyQkKX|kAh7-39VKH3_|xigH9 zx6xtfBk4uf`G`Jsq3^3$K*h|~dWlPg*M^j?tj}R%M0q7*B(#I<4yBY@iJ|Eq*Zmj_ z`>2a%4WVYOy=@eV0FL0-SAXJi5AJ)(;xJ0eotJ^QP4A?tnF4?`(_EL&%Fj<AnUngS*nQ8`O9+0T8^x`$TJ*c*tDrgvFkMx_e$pXpGG8bJcW^R7`tH7?$yL`FIbd1nj z+*PY|7UQf<{ZSbmp6-a>t@V*cB**q<(XidtWmOUqo4%2LTj~Ruftkda)Q!Ye)$t)e zT0i&bMy+_Ji!1O!iOM3GjQ~vk#9$FcrTHzPL-qIUU5>(p!cL(EFLNd&TqeVDd&4Uj zDvKM)(Oh6u@Z{WU``5WvkBp*riM!+G-j~*qhv@fPBZR1I8U9~YP>o9{6G#5VW*dij^01lhvCEv){e9!#HiY#Z;tCXC)-U%Hst z34s~1rgJEM8X5qQtbYHVvdCPd*@hi%fqyp7X&aIJ;0l%-&uVzsPeo!<4N2~jchM?-MOP-;m)}S$Aj)r+ z#T!I1^Q0CSxyDt8!Ezp(TK5|8!FN@8V_1gR9Q(SoF1+{WaX7|P?A+nA2-J_Ncm`!i zg6EJK3r5BVsBBonSVe6 zp&$7pH8nXoC{sOy@edjd`j(#8*s4O{Os!{rrN0fU2e}-1iNZl*8R=w(l!COTG<@8e(-8F-^>TXo3tk%&K&b1 zdDOQK=Gt@LLY1?aF?%PCQSXPEm?l{^2V=e|`_>rhzBdI=R_64s{rdT{JNvOSZe0*j|4+CT}qA zM)|PE)6K&teqBQp)bVP6bQfHV-W3UJya8fFXWezjQxn;?d5%R9&UB{*F76#B z_LiI&>;6t;rp|c=M?WoJI8Xk<4A|k9`xl;(;`~>F35^kv1BQ;U^u>>lopJ7zlDl=J z4)9;+u}Y?WQ^%39hjZb5{7@1DT=uRVJ#tQ+ge>EzjWgZMoc9gZ2D^Jpez5B3(NTSb zxLzsR%l(X4neq-JmlcwRf~i-$Ydz%O@%ABZ13ybO;oe@SKNb@ zToD+-gXh%OKAb(!a>6dYQ?+5Pu8X((E2Dc#i9yK`33>igJ9@*clfdAiqNLmxsFiZ4 z-)j&Q_`MQ}S$OD=PUFB^1d8YrSHFy%xfErjJ!k|Q&Wxk#I(;MaxiFZi+SP6tw#Dcp zRVSlkwKgx3Y~6^7h^twrHc&~lde?;DnL{);>Ezey(ht=Q8`|#&q<_N>5Z(qEo5(gf z(M7$XWkX^~GpZz#TOEW_qj0NYsypS*Ss3vOO$l`*5*7+*lAC{sE0>Gokn0A`f?VNQ z@sr58vTsShw2_O_2L&zSkkRFZ+-v=llLGz9)(1jEW*$!|xB8fm6wczHFiMXdbAbI3Yp%9Dk@y8emRBt36N9nd3mP%x~Z#s{@Ccyka z@2hlfw>)JgY14@ktENlAGd}p-g1h_*vso#VL>O7oU#jU~_IWWhvH&0&Or+!~FY0Q< zD_-_ey#kO12GsY9WX#LiFnAdwUm6G^59Llam`i6VdJLda7yi-O zk-2G&;dio^lha*KGCs;msp8+D1R@y%>~P?*q8q_H`wv=@YAY&6ej;TIEC^UoHzJ-F z8B``V{#<@XS4C=l1#Li78!tCESjC)ym49;r1smIQjWOQ*dq@I#$FqQ|fEkTVQpJI` z9|mrB(;L9LT(y-`Oet2Mcf?9c-8lPNnqXU9Tz&ba(p1dG*4>$1bxpj9*{&_I}2n!qHdmyuWX8 zQ0!zw(UPrvlDC3(7lG|O$uk4d8#g}mmQhw%z^l!D-|{)T(cN;#X1A>nmF%e=xNa^( z>;iP=^euwoLjAq?8oteKpI>15R4b6RX>)kx!(?)otZ;)G3i#K=#?+#G5sgc2LKL<( znE&W=4^X{Ton?IXqxvCi*>FKi0k1bK_#?Bml&}RUx|Oo%OCsrd<$GC<++<&K9=k?LL}F?<|6L-`Ig>!C zL+)z#AKd2ucc10|HEi?0yEyaz^@CFXOi!;_Fdyi8quJWuubrxT5RlL1%a?^}wkQXD ziu=sh?6}@_>i^@frHT3KXiM?l6C%QKQv7F_WF4pfPXMR?-A`UYxn|Qc29M_ zcy~GKr{fjbW1DDb|2v-9IAfjOXNnbOfb;-mqliN6zXQ+}{Vdm92UY-J=3{SfKXbeW zTp-NQi1bJF^@#ScgulDAf&Ti{gLBQ3xfrLR8GqtOe5|KYKGZ@ zum>0j+`M3*cB&=y^>|{91{Zi&S3Vr>&BYE%xCaa)`&eUk!#*%Pyo#sDEKBrb1dxO1 z)H5N2q8npoKtFgF=TIW%`Qq_Ve*kOyv58LucsD4-8DjrqD88Ia_PF=u3rz_L>nw70 z^`pnP836q;Jh>HwTN!)$kZ5M7*Z*1mV#KoabL!c{3f9rH)DY{8^-uah{}i=Cw-h!Q62;8D>a0lCjm( zjyJ0~443(Mdpk02u!;G&znOesvW4Y!&8MeaVX88!sv8aN#LZ`fa3VF+vZBFA80)vR z!^X?eXBxPvzDDUB&2>`Z?%WNO9ZUvWY;j@oJZH1oB4sYVTC9rHOW6q2oPM{AObJA+_?UrFwFwL^&1ARn1500 zNCb1W-@E;V#~S@8J#_#W^jUCV?1%eeqgm%kb%=~21N9QlVDF0;7^nIhZh(V`rS%wO zQkM{SuI$6K^w|b_=m3{K-c+bstI^Rcqck+^^REY~3AYWXW)Yu@t8{FO5rsy{z1m^o*zJ?HWV|PABSG#caSp2j zE3<^KL{<9NDyPXadoc@n{d!wq8GGsBt!IqWCHBq4X#QkUZ>t(8G>M#WdatS%oIr0 zVxYN7eLYF|;TAQ*X~e)I?!*zc3~Y5#v808;zz!7DCw4^NuZfA@s3JtayvHprZInMn;mymcjhHVQ47BhpAAM0saWxLCf z(LsfgTaHA#l;Hmz3;5ddK`IiiiY~E$=!E65zS@jdwb|2*?ceaDaKexch`X$Q5?x%u zeU7{kZ&A$+Bywz-uCQ#OUstiN!Q;pclpPSH*qwa zu1uh+ex3St($(wHomi@%4?s&^fCGBUZ6jtgQ=gO$kb6dS1}Zz+L~RKj@*%za@wGVl za;@M9!~9L~*60X?)TcH?|3zl?KBcMS**<7ELeMPwV+q(}lm6QGW%GFPGTA(?%kyArQ;K6Uio_zKh zD)6+nMJ)mz?7pUQ+cwGVl8R3(EeFm$c+#s#n>aBH+vDVKS{*u*a)VNmN{wud?P*zg zIAj@0d;>s-V#$QUkv_08`Q`(oTb!-TKtZB&c7lYzHrU_46I_Kpr&#%O8ydS9<`zRvS}o$%fuoBZ-UryGM16FGBh->+ZS z7k6(QM9LlOC|HESRqkOxQQcs6Vst$gTPSUzC;&NdqL74@E+z4|>m>y#&;XHC zHuHktx914?_6P%FGxaQmlPp3$t1ixb>rM{V^jaKY=LHvKvVv6V1LxbgST?quM?KK$ zof~)jSLfrc2idGmw^4p(_EAK2_h=jAqn+EguT1`K%oYKoSN8! zHK0=_3#;KkWp#4=Fy=H$H-nV?`-NwFG6YyZT5AX+NyNOfUM4$OC8G7%Y-|F7vxmhhG=Fi?g_Ndxg za5C-Y?JExIJBg|TZC zTmC2*qEy`U>=PIy-H`Wy$9&)mY9mlxLX`~|%bGRUN?^*0ohPUkE6 zCuo*U|mwBGp8NG_iS&plb#NT zmpV3&q}>ks#YTIWmw{jG8CgED7xP*<;g6o|#<`149QGC`v~FMx=^zE&=>}h8*`Y;K z)J6u$D&-gwo5=l6>qb^Oxe}TM_{+UK6@yG-<09Nl|84@E*RnN-mdelhZ)ig_TU8tz zsoap9{p7-eP_DgYm7=`m*6_DE*Y7C3Z%^2##WWAZbpdfmx5>XLx9nlQwH(Ke(C|+P zuvj<79^Y3ElJz$OkWp`%6|!SQy>XRFk9X#7aCaG~J_k1mir=zO6)z_Hs=Z{;yYz;d zd>224js`+1bfo;28kqXDEj;we5B;g3dX4+3{~M~Kk8d_ih9s4oAl=p7+^^2D=xF99 zjLSdt#E`YNJOV}H3>hKWwMn+Uq(y~TM`Fpn`mT|RfsTbHRx&1c zZ`1Y1a`to6ogdJ5c6LVaZ;D8u16Vj~06oUc`@Ai^`r0q9C@HI0j6uCPF zk;`L(`@Auojgm|UWUu(~JBm6xHg(>;+k634BB-LV7mmNk^!m)_@)#{$mv|#FQov1* z!5KKuy5qYGnlqH%%5&#yPmz5|+{RtG@OE!tyoh-KJgYet9@VGz7FuhRvpnz<*l$}+ zO8x!Ok0R|QKO}bJ`^uCSNl-c)fh(7i|oiIpeq-%0vu9MzfPK7wSBsDPU@>hncp^R`wO?xDqLY= z6I)Ufges26&dIJDa!^=WAUYtcDatKI1mE#zVTKIM3(m5`UnQdW&a%6+|%$p5bH2XA9Ve(a$yQ|orjEht%@5o>nXw8u$Z!H?=u%k@h`r)#$ zbd58wxYCXsis1!?i9o^|4|~8R5W&$NJ1=cycTNHkqX<1&NO~DzOYw-BnmMMh_|8;I z*MiMwD_rUapTM6ye+IV59ji||aLgglKfXqbO0fq;A__|c`#2eI7kEX3t)6G!PxV^l za`rP+jhMHC2-jBAjqdSyK)2>qypP+h&lR%t5(H|KgQy|V9a_U3GeFSfE9MKzW%XcJ zeEs@W7goog2$s5bq35){2>^<>@^2Ju-}GN2`~htwwKbcb-!caWHQ@Hb1B|a`of{hke5G zy`amW34jnFzY_nf-0aMpbwhM*ZLRWOHJ--4vtC>k%M&l&<{4-xDb=kkUs|Yrt@>@R zOwQjCjwxlnDVsGixaAiXVgi3J|J0+6hHsjwnan^5!ziL|$;B#ei9}0Kxq;GW?;xU| zX|a_W9@$KQg5dTOdQ>r1pyX|{IA&y9hSlir6}D6A2?Pl%3yLXNZVel5S1_kG5}^YP zuMDLS$5e*;uJgS?=3B+KJasZrY}gK_C5W8lmON;u3Cj6&Q!CZn_f(7KyPY$?emeEN zzIaDg7Nh-WS{@~n%SBj)5w1o&6$Cx3@%9SBHd}R8{p%zyP!>Ya1i}7&2*dx>&%HPnVp`#A7{Uh>XDHg`HHOf>c<)H;^r#^Y5BdDad*Yb0*wFWBC zGhFN>_yqTvQ#hxWZ{yYP!pq>lvSgGsPzLfb27$5^upSGju)%dtr8MKC-NrtWk@LP- z5OP+`K3mSPcj<=5C86Nq7Sndn1NjV+jjR$ zcs+YRl=8r4VwR-vWjWnCOrb&1AuORX;Mna5q~#2G5@GirP^6)&Mz0an5M+3@ww^5{_;t^V zx2w_2(<_TM?Tdf=o#%dTSR-)IfK*ia_;E-onYlBM@mdWe0cew72`RDpLreuA#u#XtZqH!oqA`#rplAw$`%jRv zWa1`Ba&T>$i<;ckpSFD{^8-T6b!LejhnJ>DX~j3PY#Rkc6&jL^rXSu3FCV|TFCi{Y zcUrB;9d{DyV%o^1{_%19B{xffixc;lMocgJ==RnvgHfg1KSlm3JdQBQ78RX;U67jE zi;uAI&DM?9~LGDJ*Q;Ye+H!;RY8kBFO4zdCw;>2Vi3re!{6h{osbti%R`pIhO81DNx=(SjMh~Y4cpr$MB_W zD91uoR@Y2d3Vk$YDlxiUrQoSiQCn%BN~PNJgr8Q3=!Nf5B+D5<*?uzXY&l}=sWPwM z9Ku{rv@dPka?wGT1guntqWErZ|J`; za7D~b+Bpu#Alh>5B(ZeJ79 zCiDwdJ|HO$DgeH8j$z8 z<|8TL1k~C#CtiBjKiau=CukH;gazvI9QtePq-AZFkjf?Co7dH zE2B9VXLkrz4dp?1=E%*3%_>(X&i#Jp>g*iTla3r+6NxOKUBoJdwR@L zx^$1+)IIm|z%$>FY+9R3t^r_a1GWYp(Og?gs=bJI^LHr>S8(kq;^$*y98svjUwr_% zRL*t;e;WF>ErseH#-^zB2zf{FW-^!IcM){kSaiivGw}o}jLKCs8Z}M7&kmY8S!hDA z)G z09`?wluDT|V#k5NLX-074G(HwPQcnq`n7jP|5m1ElGRx>^kdC{lhG}*ybVsi2%T~g zBo_on3NJxq-PsYhZ-PkOAcg-xRPK93ZtbC5M~SreXL2(7g8;*;w{N#b>OdwifyptZ zivvj@n0xoX-cqn(ha^i4pXw%HzR@3)zm1@Rx)S<({*R4GGzy8@gM1R6uCCaB6Vt&R zYR?H+3-KauDDiePTurnnW-_4g@l9~POFU9*>VXra2i$| zeOw=51YmioCg%}_eBQ~`KaV0*ZUh?^&?vp)-@hZ!C4`Em!h3xIUex8tfd--95$!l# zWB3V-bvbt)`tc#V8K}wS1EN;=Ykj=0g~X@6Eh9i-N;?g@vh7|}`B?1{q1$tpSk8ca zjMuu4p$O`AZY3Xl8VInN+6oZ{Eu4d;q&W4X*g0Uc8`~cRrs~p4?|pcr`+659BHc$S z^9u@SYdmRWuQ?p0HTRugm=SoOcZ;-8Sjc%RUs<%<3(^}`8w_8~4TrrP=6wN}pr@qg zXaLnmlQ=Gv&87NOp*7MdvrSA*hcqsR1^u|{5KYeMOD~sF69$Ch!%yCpx8IJsJ3CWz zNn0!$i+f!hh?xD>ewfpck>8x3TsHl{%gM%g_8VK$D*wd-D3dk+GDTZY=IT|~4Ii5S zb67L!TORMqGs(S@RQug*M}B@$o~2stlYg#4PtBO=^Jl##B_@uRLc_b5LJu6s7_=lsSw$n~N+g`pHc1Y>5aj>h-fQFW;v|!JMM7>5&^jA1)Nc;YE6< zS5GDQ(1a*U<+AN5pj;rr;(;mK3xqqPTKWpXI^s_Y4?1mU6j=IQA+r+Tq=AWX4UQgg zz*&9U_%0A9{peJPaq@78~k+0;ztX)EK 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 aoj8_-(ZdL-UzjBRYc&;Z# literal 0 HcmV?d00001 diff --git a/docs/reference/advanced/managed-variables.md b/docs/reference/advanced/managed-variables.md new file mode 100644 index 000000000..25ac801c3 --- /dev/null +++ b/docs/reference/advanced/managed-variables.md @@ -0,0 +1,1320 @@ +# Managed Variables + +!!! warning "Early Access" + The Logfire web UI functionality for managed variables is currently behind a feature flag and not yet generally available. This includes everything related to `RemoteVariablesConfig` — creating and managing variables in the UI, configuring variants and rollouts remotely, and syncing configuration from the server. You can still use managed variables locally with `VariablesConfig` without the feature flag. If you'd like access to the remote functionality, please reach out to us on [Slack][slack] for instructions on how to enable it. + +Managed variables let you define and reference configuration in your code, but control the runtime values from the Logfire UI without redeploying. + +Define a variable once with a sensible default, deploy your application, then iterate on the values in production. You can target specific populations (opted-in beta users, internal developers, enterprise customers, etc.) using flexible targeting rules that integrate with your existing OpenTelemetry attributes. + +Changes take effect quickly, and every variable resolution is visible in your traces. This trace-level visibility means you can correlate application behavior directly with configuration variants, enabling A/B testing, automated prompt optimization, and online evaluations using the same observability data you're already sending to Logfire. + +## What Are Managed Variables? + +Managed variables are a way to externalize runtime configuration from your code. While they're especially powerful for AI applications (where prompt iteration is frequently critical), they work for any configuration you want to change without redeploying: + +- **Any type**: Use primitives (strings, bools, ints) or structured types (dataclasses, Pydantic models, etc.) +- **Observability-integrated**: Every variable resolution creates a span, and using the context manager automatically sets baggage so downstream operations are tagged with which variant was used +- **Variants and rollouts**: Define multiple values (variants) for a variable and control what percentage of requests get each variant +- **Targeting**: Route specific users or segments to specific variants based on attributes + +## Structured Configuration + +While you can use simple primitive types as variables, the real power comes from using **structured types**—Pydantic models that group related configuration together: + +```python +from pydantic import BaseModel + +import logfire + +logfire.configure() + + +class AgentConfig(BaseModel): + """Configuration for an AI agent.""" + + instructions: str + model: str + temperature: float + max_tokens: int + + +# Create a managed variable with this structured type +agent_config = logfire.var( + name='agent_config', + type=AgentConfig, + default=AgentConfig( + instructions='You are a helpful assistant.', + model='openai:gpt-4o-mini', + temperature=0.7, + max_tokens=500, + ), +) +``` + +**Why group configuration together instead of using separate variables?** + +- **Coherent variants**: A variant isn't just "instructions v2", it's a complete configuration where all the pieces work well together. The temperature that works with a detailed prompt might not work as well with a concise one. +- **Atomic changes**: When you roll out a new variant, all settings change together. No risk of mismatched configurations. +- **Holistic A/B testing**: Compare "config v1" vs "config v2" as complete packages, not individual parameters in isolation. +- **Simpler management**: One variable to manage in the UI instead of many. + +!!! tip "When to use primitives" + Simple standalone settings like feature flags (`debug_mode: bool`), rate limits (`max_requests: int`), or even just agent instructions work great as primitive variables. Use structured types when you have multiple settings you want to vary together. + +## Why This Is So Useful For AI Applications + +In AI applications, prompts and model configurations are often critical to application behavior. Some changes are minor tweaks that don't significantly affect outputs, while others can have substantial positive or negative consequences. The traditional iteration process looks like: + +1. Edit the code +2. Open a PR and get it reviewed +3. Merge and deploy +4. Wait to see the effect in production + +This process is problematic for AI configuration because: + +- **Production data is essential**: Useful AI agents often need access to production data and real user interactions. Testing locally or in staging environments rarely captures the full range of inputs your application will encounter. +- **Representative testing is hard**: Even a fast deployment cycle adds significant friction when you're iterating on prompts. What works in a test environment may behave differently with real user queries. +- **Risk affects all users**: Without targeting controls, every change affects your entire user base immediately. + +With managed variables, you can iterate safely in production: + +- **Iteration speed**: Edit prompts in the Logfire UI and see the effect in real traces immediately +- **A/B testing**: Run multiple prompt/model/temperature combinations simultaneously and compare their performance in your traces +- **Gradual rollouts**: Start a new configuration at 5% of traffic, watch the metrics, then gradually increase +- **Emergency rollback**: If a configuration is causing problems, revert to the previous variant in seconds, with no deploy required + +## How It Works + +Here's the typical workflow using the `AgentConfig` example from above: + +1. **Define the variable in code** with your current configuration as the default +2. **Deploy your application**: it starts using the default immediately +3. **Create the variable in the Logfire UI** with your initial value +4. **Add variants**: create additional variants like `v2_detailed` with different configurations +5. **Set up a rollout**: start with 10% of traffic going to the new variant +6. **Monitor in real-time**: filter traces by variant to compare response quality, latency, and token usage +7. **Adjust based on data**: if v2 performs better, gradually increase to 50%, then 100% +8. **Iterate**: create new variants, adjust rollouts, all without code changes + +## Managing Variables in the Logfire UI + +The Logfire web UI provides a complete interface for managing your variables without any code changes. You can find it under **Settings > Variables** in your project. The page includes two tabs: + +- **Variables**: create, edit, and delete managed variables +- **Variable Types**: define reusable JSON schemas for custom types + +![Variables list](images/variables-list.png) + +### Creating a Variable + +To create a new variable, click **New variable** and fill in: + +- **Name**: A valid Python identifier (e.g., `agent_config`, `feature_flag`) +- **Description**: Optional text explaining what the variable controls +- **Type**: Choose from: + - **Text**: Plain text values, ideal for prompts and messages + - **Number**: Numeric values for thresholds, limits, etc. + - **Boolean**: True/false flags for feature toggles + - **JSON**: Complex structured data matching your Pydantic models + - **Custom Types**: Reusable schemas created under the **Variable Types** tab + +For **JSON** variables, you can optionally provide a **JSON Schema** to validate variant values. +For **Custom Types**, the schema is derived from the type and shown read-only; edit the type in the **Variable Types** tab. + +![Create variable form](images/variable-create-form.png) + +### Working with Variants + +Each variable can have multiple **variants**—different values that can be served to different users or traffic segments. + +To add variants: + +1. Click **Add** in the Variants section +2. Enter a unique key for the variant (e.g., `premium`, `experimental`, `v2_detailed`) +3. Provide an optional description +4. Enter the value (the format depends on your value type) + +!!! tip "Using the example value" + When you push a variable from code using `logfire.variables_push()`, the code's default value is stored as an "example". This example appears pre-filled when you create a new variant in the UI, making it easy to start from a working configuration and modify it. + +Each variant tracks its version history, accessible via the **View history** button. You can also browse all variant history using **Browse All History** to see changes over time or restore previous versions. + +!!! note "Variant keys are immutable" + Variant keys must be valid Python identifiers. Once created, variant keys cannot be renamed—create a new variant and delete the old one instead. + +!!! note "No variants = code default" + If a variable has no variants configured, your application uses the code default value. This is the expected state immediately after `logfire.variables_push()`. You create variants in the UI when you want to serve different values to different users or run experiments. + +### Configuring Rollouts + +The **Default Rollout** section controls what percentage of requests receive each variant. The weights must sum to 1.0 or less: + +- Set `default` to `0.5` and `premium` to `0.5` for a 50/50 A/B test +- Set `default` to `0.9` and `experimental` to `0.1` for a 10% canary deployment +- If weights sum to less than 1.0, the remaining percentage uses your code's default value + +The UI offers **Simple** and **Advanced** modes: + +- **Simple**: pick a single active variant or use code default +- **Advanced**: set weighted rollouts, add overrides, and manage aliases + +### Targeting with Override Rules + +**Rollout Overrides** let you route specific users or segments to specific variants based on attributes. Rules are evaluated in order, and the first matching rule determines the rollout. + +To add a targeting rule: + +1. Click **Add Rule** in the Rollout Overrides section +2. Add one or more conditions (all conditions must match): + - Choose an attribute name (e.g., `plan`, `region`, `is_beta_user`) + - Select an operator (`equals`, `does not equal`, `is in`, `is not in`, `matches regex`, etc.) + - Enter the value to match +3. Configure the rollout percentages when this rule matches + +For example, to give enterprise customers the premium variant: + +- Condition: `plan` equals `enterprise` +- Rollout: `premium` = 100% + +![Variable edit with variants and rollout](images/variable-edit-with-variants.png) + +!!! important "Variable names must match" + The variable name in the UI must exactly match the `name` parameter in your `logfire.var()` call. If they don't match, your application will use the code default instead of the remote configuration. + +## Quick Start + +### Define a Variable + +Use `logfire.var()` to define a managed variable. Here's an example using a structured configuration: + +```python +from pydantic import BaseModel + +import logfire + +logfire.configure() + + +class AgentConfig(BaseModel): + """Configuration for a customer support agent.""" + + instructions: str + model: str + temperature: float + max_tokens: int + + +# Define the variable with a sensible default +agent_config = logfire.var( + name='support_agent_config', + type=AgentConfig, + default=AgentConfig( + instructions='You are a helpful customer support agent. Be friendly and concise.', + model='openai:gpt-4o-mini', + temperature=0.7, + max_tokens=500, + ), +) +``` + +### Use the Variable + +The recommended pattern is to use the variable's `.get()` method as a context manager. This automatically: + +- Creates a span for the variable resolution +- Sets baggage with the variable name and selected variant + +When using the Logfire SDK, baggage values are automatically added as attributes to all downstream spans. This means any spans created inside the context manager will be tagged with which variant was used, making it easy to filter and compare behavior by variant in the Logfire UI. + +```python skip="true" +from pydantic_ai import Agent + + +async def handle_support_ticket(user_id: str, message: str) -> str: + """Handle a customer support request.""" + # Get the configuration - same user always gets the same variant + with agent_config.get(targeting_key=user_id) as config: + # Inside this context, baggage is set: + # logfire.variables.support_agent_config = + + agent = Agent( + config.value.model, + system_prompt=config.value.instructions, + ) + result = await agent.run( + message, + model_settings={ + 'temperature': config.value.temperature, + 'max_tokens': config.value.max_tokens, + }, + ) + return result.output +``` + +The `targeting_key` ensures deterministic variant selection: the same user always gets the same variant, which is essential for application behavior consistency when A/B testing. + +In practice, depending on your application structure, you may want to use `tenant_id` or another identifier for `targeting_key` instead of `user_id`. If no `targeting_key` is provided and there's an active trace, the `trace_id` is used automatically to ensure consistent behavior within a single request. + +### Variable Parameters + +| Parameter | Description | +|-----------|-------------------------------------------------------------------------| +| `name` | Unique identifier for the variable | +| `type` | Expected type for validation; can be a primitive type or Pydantic model | +| `default` | Default value when no configuration is found (can also be a function) | + +## A/B Testing Configurations + +Here's a complete example showing how to A/B test two complete agent configurations: + +```python skip="true" +from pydantic import BaseModel +from pydantic_ai import Agent + +import logfire +from logfire.variables.config import ( + Rollout, + VariableConfig, + VariablesConfig, + Variant, +) + +logfire.configure() + + +class AgentConfig(BaseModel): + """Configuration for a customer support agent.""" + + instructions: str + model: str + temperature: float + max_tokens: int + + +# For local development/testing, you can define variants in code +# In production, you'd typically configure these in the Logfire UI +# and configure logfire to retrieve and sync with the remotely-managed config. +variables_config = VariablesConfig( + variables={ + 'support_agent_config': VariableConfig( + name='support_agent_config', + variants={ + 'v1_concise': Variant( + key='v1_concise', + serialized_value="""{ + "instructions": "You are a helpful support agent. Be brief and direct.", + "model": "openai:gpt-4o-mini", + "temperature": 0.7, + "max_tokens": 300 + }""", + description='Concise responses with faster model', + ), + 'v2_detailed': Variant( + key='v2_detailed', + serialized_value="""{ + "instructions": "You are an expert support agent. Provide thorough explanations with examples. Always acknowledge the customer's concern before providing assistance.", + "model": "openai:gpt-4o", + "temperature": 0.3, + "max_tokens": 800 + }""", + description='Detailed responses with more capable model', + ), + }, + # 50/50 A/B test + rollout=Rollout(variants={'v1_concise': 0.5, 'v2_detailed': 0.5}), + overrides=[], + json_schema={ + 'type': 'object', + 'properties': { + 'instructions': {'type': 'string'}, + 'model': {'type': 'string'}, + 'temperature': {'type': 'number'}, + 'max_tokens': {'type': 'integer'}, + }, + }, + ), + } +) + +logfire.configure( + variables=logfire.VariablesOptions(config=variables_config), +) + +# Define the variable +agent_config = logfire.var( + name='support_agent_config', + type=AgentConfig, + default=AgentConfig( + instructions='You are a helpful assistant.', + model='openai:gpt-4o-mini', + temperature=0.7, + max_tokens=500, + ), +) + + +async def handle_ticket(user_id: str, message: str) -> str: + """Handle a support ticket with A/B tested configuration.""" + with agent_config.get(targeting_key=user_id) as config: + # The variant (v1_concise or v2_detailed) is now in baggage + # All spans created below, including those from the call to agent.run, will be tagged with the variant + + agent = Agent(config.value.model, system_prompt=config.value.instructions) + result = await agent.run( + message, + model_settings={ + 'temperature': config.value.temperature, + 'max_tokens': config.value.max_tokens, + }, + ) + return result.output +``` + +**Analyzing the A/B test in Logfire:** + +After running traffic through both variants, you can: + +1. Filter traces by the variant baggage to see only requests that used a specific variant +2. Compare metrics like response latency, token usage, and error rates between variants +3. Look at actual responses to qualitatively assess which variant performs better +4. Make data-driven decisions about which configuration to roll out to 100% + +## Targeting Users and Segments + +### Targeting Key + +The `targeting_key` parameter ensures deterministic variant selection. The same key always produces the same variant, which is useful for: + +- **Consistent user experience**: You typically want users to see consistent configuration behavior within a session, or even across sessions. You may also want all users within a single tenant to receive the same variant. +- **Debugging**: By controlling the `targeting_key`, you can deterministically get the same configuration variant that a user received. Note that this reproduces the *configuration*, not the exact behavior; if your application includes stochastic elements like LLM calls, outputs will still vary. + +```python skip="true" +# User-based targeting +with agent_config.get(targeting_key=user_id) as config: + ... + +# Request-based targeting (if no targeting_key provided and there's an active trace, +# the trace ID is used automatically) +with agent_config.get() as config: + ... +``` + +### Setting Targeting Key via Context + +Instead of passing `targeting_key` to every `.get()` call, you can set it once at a higher level using `targeting_context`. This is useful when you want to set the targeting key early in your request lifecycle (e.g., in middleware) and have it apply to all variable resolutions within that context: + +```python skip="true" +from logfire.variables import targeting_context + +async def handle_request(user_id: str, message: str) -> str: + # Set targeting key once for all variables in this context + with targeting_context(user_id): + # All variable resolutions here use user_id as the targeting key + with agent_config.get() as config: + ... + with another_variable.get() as other: + ... +``` + +**Variable-specific targeting:** + +Different variables may need different targeting strategies. For example, you might want to target by `user_id` for personalization features but by `organization_id` for billing-related features. You can specify which variables a targeting context applies to: + +```python skip="true" +from logfire.variables import targeting_context + +# Define variables +personalization_config = logfire.var(name='personalization', type=PersonalizationConfig, default=...) +billing_config = logfire.var(name='billing', type=BillingConfig, default=...) + +async def handle_request(user_id: str, org_id: str) -> None: + # Set different targeting keys for different variables + with targeting_context(org_id, variables=[billing_config]): + with targeting_context(user_id, variables=[personalization_config]): + # billing_config uses org_id as targeting key + # personalization_config uses user_id as targeting key + with billing_config.get() as billing: + ... + with personalization_config.get() as personalization: + ... +``` + +**Combining default and variable-specific targeting:** + +You can set a default targeting key for all variables while overriding it for specific ones. Variable-specific targeting always takes precedence over the default, regardless of nesting order: + +```python skip="true" +from logfire.variables import targeting_context + +# Set default targeting for all variables, but use org_id for billing +with targeting_context(user_id): # default for all variables + with targeting_context(org_id, variables=[billing_config]): # specific override + # billing_config uses org_id + # all other variables use user_id + ... + +# Order doesn't matter - specific always wins +with targeting_context(org_id, variables=[billing_config]): + with targeting_context(user_id): + # Same result: billing_config uses org_id, others use user_id + ... +``` + +**Priority order:** + +When resolving the targeting key for a variable, the following priority order is used: + +1. **Call-site explicit**: `variable.get(targeting_key='explicit')` - always wins +2. **Variable-specific context**: Set via `targeting_context(key, variables=[var])` +3. **Default context**: Set via `targeting_context(key)` without specifying variables +4. **Trace ID fallback**: If there's an active trace and no targeting key is set, the trace ID is used + +### Attributes for Conditional Rules + +Pass attributes to enable condition-based targeting: + +```python skip="true" +with agent_config.get( + targeting_key=user_id, + attributes={ + 'plan': 'enterprise', + 'region': 'us-east', + 'is_beta_user': True, + }, +) as config: + ... +``` + +These attributes can be used in override rules to route specific segments to specific variants: + +```python skip="true" +from logfire.variables.config import ( + Rollout, + RolloutOverride, + ValueEquals, + VariableConfig, + VariablesConfig, + Variant, +) + +variables_config = VariablesConfig( + variables={ + 'support_agent_config': VariableConfig( + name='support_agent_config', + variants={ + 'standard': Variant( + key='standard', + serialized_value='{"instructions": "Be helpful and concise.", ...}', + ), + 'premium': Variant( + key='premium', + serialized_value='{"instructions": "Provide detailed, thorough responses...", ...}', + ), + }, + # Default: everyone gets 'standard' + rollout=Rollout(variants={'standard': 1.0}), + overrides=[ + # Enterprise plan users always get the premium variant + RolloutOverride( + conditions=[ValueEquals(attribute='plan', value='enterprise')], + rollout=Rollout(variants={'premium': 1.0}), + ), + ], + json_schema={'type': 'object'}, + ), + } +) + +# Now when you call get() with attributes: +with agent_config.get( + targeting_key=user_id, + attributes={'plan': 'enterprise'}, # Matches the override condition +) as config: + # config.variant will be 'premium' because of the override + ... + +with agent_config.get( + targeting_key=user_id, + attributes={'plan': 'free'}, # Does not match override +) as config: + # config.variant will be 'standard' (the default rollout) + ... +``` + +### Automatic Context Enrichment + +By default, Logfire automatically includes additional context when resolving variables: + +- **Resource attributes**: OpenTelemetry resource attributes (service name, version, environment) +- **Baggage**: Values set via `logfire.set_baggage()` + +This means your targeting rules can match against service identity or request-scoped baggage without explicitly passing them. + +**Example: Plan-based targeting with baggage** + +If your application sets the user's plan as baggage early in the request lifecycle, you can use it for targeting without passing it explicitly to every variable resolution: + +```python skip="true" +# In your middleware or request handler, set the plan once +with logfire.set_baggage(plan='enterprise'): + # ... later in your application code ... + with agent_config.get(targeting_key=user_id) as config: + # The variable resolution automatically sees plan='enterprise' + # If you have an override targeting enterprise users, it will match + ... +``` + +This is useful when you want different configurations based on user plan. For example, enterprise users might get a prompt variant that references tools only available to them. + +**Example: Environment-based targeting with resource attributes** + +Resource attributes like `deployment.environment` are automatically included, allowing you to use different configurations in different environments without code changes: + +- Use a more experimental prompt on staging to test changes before production +- Enable verbose logging in development but not in production +- Route all staging traffic to a "debug" variant that includes extra context + +To disable automatic context enrichment: + +```python skip="true" +logfire.configure( + variables=logfire.VariablesOptions( + include_resource_attributes_in_context=False, + include_baggage_in_context=False, + ), +) +``` + +## Remote Variables + +When connected to Logfire, variables are managed through the Logfire UI. This is the recommended setup for production. + +To enable remote variables, you need to explicitly opt in using `VariablesOptions`: + +```python skip="true" +import logfire +from logfire.variables.config import RemoteVariablesConfig + +# Enable remote variables +logfire.configure( + variables=logfire.VariablesOptions( + config=RemoteVariablesConfig(), + ), +) + +# Define your variables +agent_config = logfire.var( + name='support_agent_config', + type=AgentConfig, + default=AgentConfig(...), +) +``` + +!!! note "API Key Required" + Remote variables require an API key with the `project:read_variables` scope. This is different from the write token (`LOGFIRE_TOKEN`) used to send traces and logs. Set the API key via the `LOGFIRE_API_KEY` environment variable or pass it directly to `RemoteVariablesConfig(api_key=...)`. + +**How remote variables work:** + +1. Your application connects to Logfire using your API key +2. Variable configurations are fetched from the Logfire API +3. A background thread polls for updates (default: every 30 seconds) +4. If available, the SDK listens for Server-Sent Events (SSE) on `GET /v1/variable-updates/` and triggers an immediate refresh +5. When you change a variant or rollout in the UI, running applications pick up the change automatically via SSE or the next poll + +**Configuration options:** + +```python skip="true" +from datetime import timedelta + +from logfire.variables.config import RemoteVariablesConfig + +logfire.configure( + variables=logfire.VariablesOptions( + config=RemoteVariablesConfig( + # Block until first fetch completes (default: True) + # Set to False if you want the app to start immediately using defaults + block_before_first_resolve=True, + # How often to poll for updates (default: 30 seconds) + polling_interval=timedelta(seconds=30), + ), + ), +) +``` + +### OpenFeature (OFREP) Endpoints + +Logfire exposes managed variables via the OpenFeature Remote Evaluation Protocol (OFREP). These endpoints evaluate variables as feature flags using a targeting context. + +**Endpoints (API base URL + paths):** + +```text +POST /v1/ofrep/v1/evaluate/flags/{key} +POST /v1/ofrep/v1/evaluate/flags +``` + +**Request body (single or bulk):** + +```json +{ + "context": { + "targetingKey": "user-123", + "plan": "enterprise", + "region": "us-east" + } +} +``` + +- `targetingKey` is required and is used for deterministic rollout selection. +- Any additional fields in `context` become attributes for override rules. + +**Caching (bulk endpoint):** + +- The bulk endpoint returns an `ETag` header. +- If the client sends `If-None-Match` with the same value, the server returns `304 Not Modified`. + +These endpoints require an API key with the `project:read_variables` scope. + +### Pushing Variables from Code + +Instead of manually creating variables in the Logfire UI, you can push your variable definitions directly from your code using `logfire.variables_push()`. + +The primary benefit of pushing from code is **automatic JSON schema generation**. When you use a Pydantic model as your variable type, `logfire.variables_push()` automatically generates the JSON schema from your model definition. This means the Logfire UI will validate variant values against your schema, catching type errors before they reach production. Creating these schemas manually in the UI would be tedious and error-prone, especially for complex nested models. + +```python skip="true" +from pydantic import BaseModel + +import logfire +from logfire.variables.config import RemoteVariablesConfig + +logfire.configure( + variables=logfire.VariablesOptions( + config=RemoteVariablesConfig(), + ), +) + + +class AgentConfig(BaseModel): + """Configuration for an AI agent.""" + + instructions: str + model: str + temperature: float + max_tokens: int + + +# Define your variables +agent_config = logfire.var( + name='agent_config', + type=AgentConfig, + default=AgentConfig( + instructions='You are a helpful assistant.', + model='openai:gpt-4o-mini', + temperature=0.7, + max_tokens=500, + ), +) + +# Push all registered variables to the remote provider +if __name__ == '__main__': + logfire.variables_push() +``` + +When you run this script, it will: + +1. Compare your local variable definitions with what exists in Logfire +2. Show you a diff of what will be created or updated +3. Prompt for confirmation before applying changes + +!!! note "No variants created by push" + When `logfire.variables_push()` creates a new variable, it does **not** create any variants. Instead, it stores your code's default value as an "example" that can be used as a template when creating variants in the Logfire UI. Until you create variants, your application will use the code default. + +**Example output:** + +``` +=== Variables to CREATE === + + agent_config + Example value: {"instructions":"You are a helpful assistant.","model":"openai:gpt-4o-mini","temperature":0.7,"max_tokens":500} + +Apply these changes? [y/N] y + +Applying changes... +Successfully applied changes. +``` + +**Options:** + +| Parameter | Description | +|-----------|-------------| +| `variables` | List of specific variables to push. If not provided, all registered variables are pushed. | +| `dry_run` | If `True`, shows what would change without actually applying changes. | +| `yes` | If `True`, skips the confirmation prompt. | +| `strict` | If `True`, fails if any existing variants in Logfire are incompatible with your new schema. | + +**Pushing specific variables:** + +```python skip="true" +feature_flag = logfire.var(name='feature_enabled', type=bool, default=False) +max_retries = logfire.var(name='max_retries', type=int, default=3) + +# Push only the feature flag +logfire.variables_push([feature_flag]) + +# Dry run to see what would change +logfire.variables_push(dry_run=True) + +# Skip confirmation prompt (useful in CI/CD) +logfire.variables_push(yes=True) +``` + +!!! note "Schema Updates" + When you push a variable that already exists in Logfire, `logfire.variables_push()` will update the JSON schema if it has changed but will preserve existing variants and rollout configurations. If existing variant values are incompatible with the new schema, you'll see a warning (or an error if using `strict=True`). + +!!! note "Write scope required" + `logfire.variables_push()` and `logfire.variables_push_types()` require an API key with the `project:write_variables` scope. + +### Pushing Variable Types + +When you have multiple variables that share the same type (e.g., several variables all using the same `AgentConfig` Pydantic model), you can push the type definition itself as a reusable schema. This is done with `logfire.variables_push_types()`. + +**Why push variable types?** + +- **Schema reuse**: Define a schema once and reference it from multiple variables +- **Centralized management**: Update the schema in one place when your type definition changes +- **Documentation**: Types serve as documentation for the expected structure of variable values + +```python skip="true" +from pydantic import BaseModel + +import logfire +from logfire.variables.config import RemoteVariablesConfig + +logfire.configure( + variables=logfire.VariablesOptions( + config=RemoteVariablesConfig(), + ), +) + + +class FeatureConfig(BaseModel): + """Configuration for a feature flag with additional settings.""" + + enabled: bool = False + max_retries: int = 3 + timeout_seconds: float = 30.0 + + +class UserSettings(BaseModel): + """User preference settings.""" + + theme: str = 'light' + notifications_enabled: bool = True + + +if __name__ == '__main__': + # Push type definitions using their class names + logfire.variables_push_types([FeatureConfig, UserSettings]) +``` + +**Explicit naming:** + +By default, types are named using their `__name__` attribute (e.g., `FeatureConfig`). You can provide explicit names using tuples: + +```python skip="true" +logfire.variables_push_types([ + (FeatureConfig, 'my-feature-config'), + (UserSettings, 'my-user-settings'), +]) +``` + +**Options:** + +| Parameter | Description | +|-----------|-------------| +| `types` | List of types to push. Items can be a type (uses `__name__`) or a tuple of `(type, name)` for explicit naming. | +| `dry_run` | If `True`, shows what would change without actually applying changes. | +| `yes` | If `True`, skips the confirmation prompt. | + +**Example output:** + +``` +Variable Types Push Summary +======================================== + +New types (2): + + FeatureConfig + + UserSettings + +Apply these changes? [y/N] y + +Applying changes... + +Done! Variable types synced successfully. +``` + +When updating existing types, the output shows which types have schema changes: + +``` +Variable Types Push Summary +======================================== + +Schema updates (1): + ~ FeatureConfig + +Unchanged (1): + = UserSettings +``` + +### Validating Variables + +You can validate that your remote variable configurations match your local type definitions using `logfire.variables_validate()`: + +```python skip="true" +from logfire.variables import ValidationReport + +# Validate all registered variables +report: ValidationReport = logfire.variables_validate() + +if report.has_errors: + print('Validation errors found:') + print(report.format()) +else: + print('All variables are valid!') + +# Check specific issues +if report.variables_not_on_server: + print(f'Variables missing from server: {report.variables_not_on_server}') +``` + +The `ValidationReport` provides detailed information about validation results: + +| Property | Description | +|----------|-------------| +| `has_errors` | `True` if any validation errors were found | +| `errors` | List of variant validation errors with details | +| `variables_checked` | Number of variables that were validated | +| `variables_not_on_server` | Names of local variables not found on the server | +| `description_differences` | Variables where local and server descriptions differ | +| `format()` | Returns a human-readable string of the validation results | + +This is useful in CI/CD pipelines to catch configuration drift where someone may have edited a variant value in the UI that no longer matches your expected type. + +### Config Push Workflow (Programmatic) + +For more control over your variable configurations, you can work with config data directly. This workflow allows you to: + +- Generate a template config from your code +- Edit the config locally (add variants, rollouts, overrides) +- Push the complete config to Logfire +- Pull existing configs for backup or migration + +**Generating a config template:** + +```python skip="true" +import json + +import logfire +from logfire.variables import VariablesConfig + +# Define your variables +agent_config = logfire.var(name='agent_config', type=AgentConfig, default=AgentConfig(...)) +feature_flag = logfire.var(name='feature_enabled', type=bool, default=False) + +# Build a config with name, schema, and example for each variable +config = logfire.variables_build_config() + +# Save to a JSON file +with open('variables.json', 'w', encoding='utf-8') as f: + f.write(config.model_dump_json(indent=2)) +``` + +The generated file will look like: + +```json +{ + "variables": { + "agent_config": { + "name": "agent_config", + "variants": {}, + "rollout": {"variants": {}}, + "overrides": [], + "json_schema": { + "type": "object", + "properties": { + "instructions": {"type": "string"}, + "model": {"type": "string"}, + "temperature": {"type": "number"}, + "max_tokens": {"type": "integer"} + } + }, + "example": "{\"instructions\":\"You are a helpful assistant.\",\"model\":\"openai:gpt-4o-mini\",\"temperature\":0.7,\"max_tokens\":500}" + }, + "feature_enabled": { + "name": "feature_enabled", + "variants": {}, + "rollout": {"variants": {}}, + "overrides": [], + "json_schema": {"type": "boolean"}, + "example": "false" + } + } +} +``` + +**Editing and pushing:** + +Edit the JSON file to add variants and rollouts: + +```json +{ + "variables": { + "agent_config": { + "name": "agent_config", + "variants": { + "concise": { + "key": "concise", + "serialized_value": "{\"instructions\":\"Be brief.\",\"model\":\"openai:gpt-4o-mini\",\"temperature\":0.7,\"max_tokens\":300}" + }, + "detailed": { + "key": "detailed", + "serialized_value": "{\"instructions\":\"Provide thorough explanations.\",\"model\":\"openai:gpt-4o\",\"temperature\":0.3,\"max_tokens\":1000}" + } + }, + "rollout": {"variants": {"concise": 0.8, "detailed": 0.2}}, + "overrides": [], + "json_schema": {"type": "object"} + } + } +} +``` + +Then push to Logfire: + +```python skip="true" +from logfire.variables import VariablesConfig + +# Read the edited config +with open('variables.json', 'r', encoding='utf-8') as f: + config = VariablesConfig.model_validate_json(f.read()) + +# Sync to the server +logfire.variables_push_config(config) +``` + +**Push modes:** + +| Mode | Description | +|------|-------------| +| `'merge'` (default) | Only create/update variables in the config. Other variables on the server are unchanged. | +| `'replace'` | Make the server match the config exactly. Variables not in the config will be deleted. | + +```python skip="true" +# Partial push - only update variables in the config +logfire.variables_push_config(config, mode='merge') + +# Full push - delete server variables not in config +logfire.variables_push_config(config, mode='replace') + +# Preview changes without applying +logfire.variables_push_config(config, dry_run=True) +``` + +**Pulling existing config:** + +```python skip="true" +# Fetch current config from server +server_config = logfire.variables_pull_config() + +# Save for backup or migration +with open('backup.json', 'w', encoding='utf-8') as f: + f.write(server_config.model_dump_json(indent=2)) + +# Merge with local changes +merged = server_config.merge(local_config) +``` + +**VariablesConfig methods:** + +| Method | Description | +|--------|-------------| +| `config.merge(other)` | Merge with another config (other takes precedence) | +| `VariablesConfig.from_variables(vars)` | Create minimal config from Variable instances | + +## Local Variables + +For development, testing, or self-hosted deployments, you can configure variables locally using `VariablesConfig`: + +```python +import logfire +from logfire.variables.config import ( + Rollout, + RolloutOverride, + ValueEquals, + VariableConfig, + VariablesConfig, + Variant, +) + +variables_config = VariablesConfig( + variables={ + 'support_agent_config': VariableConfig( + name='support_agent_config', + variants={ + 'default': Variant( + key='default', + serialized_value='{"instructions": "...", "model": "...", "temperature": 0.7, "max_tokens": 500}', + ), + 'premium': Variant( + key='premium', + serialized_value='{"instructions": "...", "model": "...", "temperature": 0.3, "max_tokens": 1000}', + ), + }, + # Default: everyone gets 'default' + rollout=Rollout(variants={'default': 1.0}), + overrides=[ + # Enterprise users get 'premium' + RolloutOverride( + conditions=[ValueEquals(attribute='plan', value='enterprise')], + rollout=Rollout(variants={'premium': 1.0}), + ), + ], + json_schema={'type': 'object'}, + ), + } +) + +logfire.configure( + variables=logfire.VariablesOptions(config=variables_config), +) +``` + +**When to use local variables:** + +- **Development**: Test different configurations without connecting to Logfire +- **Testing**: Use fixed configurations in your test suite +- **Self-hosted**: Full control over variable configuration without external dependencies +- **Optimization harnesses**: Build automated optimization loops that monitor performance metrics and programmatically update variable values + +The local provider exposes methods to create, update, and delete variables and variants programmatically. This makes it possible to build optimization harnesses that: + +1. Run your application with different configurations +2. Collect performance metrics from traces +3. Use the metrics to decide on new configurations to try +4. Update variable values via the local provider's API +5. Repeat until optimal configuration is found + +This workflow is particularly useful for automated prompt optimization, where you want to systematically explore different prompt variations and measure their effectiveness. + +## Configuration Reference + +### Variants and Rollouts + +**VariableConfig** - Full configuration for a variable: + +| Field | Description | +|-------|-------------| +| `name` | Variable name (must match the name in `logfire.var()`) | +| `variants` | Dict of variant key to `Variant` objects | +| `rollout` | Default `Rollout` specifying variant weights | +| `overrides` | List of `RolloutOverride` for conditional targeting | +| `json_schema` | JSON Schema for validation (optional) | +| `description` | Human-readable description (optional) | +| `aliases` | Alternative names that resolve to this variable (optional, for migrations) | +| `example` | JSON-serialized example value, used as template in UI (optional) | + +**Variant** - A single variant value: + +| Field | Description | +|-------|-------------| +| `key` | Unique identifier for this variant | +| `serialized_value` | JSON-serialized value | +| `description` | Human-readable description (optional) | + +**Rollout** - Variant selection weights: + +| Field | Description | +|-------|-------------| +| `variants` | Dict of variant key to weight (0.0-1.0). Weights should sum to 1.0 or less. | + +If weights sum to less than 1.0, there's a chance no variant is selected and the code default is used. + +### VariableTypeConfig + +**VariableTypeConfig** - Configuration for a reusable type definition: + +| Field | Description | +|-------|-------------| +| `name` | Unique name identifying this type | +| `json_schema` | JSON Schema describing the type structure | +| `description` | Human-readable description (optional) | +| `source_hint` | Hint about where this type is defined in code, e.g., `'myapp.config.FeatureConfig'` (optional) | + +### Condition Types + +Overrides use conditions to match against attributes: + +| Condition | Description | +|-----------|-------------| +| `ValueEquals` | Attribute equals a specific value | +| `ValueDoesNotEqual` | Attribute does not equal a specific value | +| `ValueIsIn` | Attribute is in a list of values | +| `ValueIsNotIn` | Attribute is not in a list of values | +| `ValueMatchesRegex` | Attribute matches a regex pattern | +| `ValueDoesNotMatchRegex` | Attribute does not match a regex pattern | +| `KeyIsPresent` | Attribute key exists | +| `KeyIsNotPresent` | Attribute key does not exist | + +### Override Example + +```python +from logfire.variables.config import ( + KeyIsPresent, + Rollout, + RolloutOverride, + ValueEquals, + ValueIsIn, +) + +overrides = [ + # Beta users in US/UK get the experimental variant + RolloutOverride( + conditions=[ + ValueEquals(attribute='is_beta', value=True), + ValueIsIn(attribute='country', values=['US', 'UK']), + ], + rollout=Rollout(variants={'experimental': 1.0}), + ), + # Anyone with a custom config attribute gets the custom variant + RolloutOverride( + conditions=[KeyIsPresent(attribute='custom_config')], + rollout=Rollout(variants={'custom': 1.0}), + ), +] +``` + +Conditions within an override are AND-ed together. Overrides are evaluated in order; the first matching override's rollout is used. + +## Advanced Usage + +### Contextual Overrides + +Use `variable.override()` to temporarily override a variable's value within a context. This is useful for testing: + +```python skip="true" +def test_premium_config_handling(): + """Test that premium configuration works correctly.""" + premium_config = AgentConfig( + instructions='Premium instructions...', + model='openai:gpt-4o', + temperature=0.3, + max_tokens=1000, + ) + + with agent_config.override(premium_config): + # Inside this context, agent_config.get() returns premium_config + with agent_config.get() as config: + assert config.value.model == 'openai:gpt-4o' + + # Back to normal after context exits +``` + +### Dynamic Override Functions + +Override with a function that computes the value based on context: + +```python skip="true" +from collections.abc import Mapping +from typing import Any + + +def get_config_for_context( + targeting_key: str | None, attributes: Mapping[str, Any] | None +) -> AgentConfig: + """Compute configuration based on context.""" + if attributes and attributes.get('mode') == 'creative': + return AgentConfig( + instructions='Be creative and expressive...', + model='openai:gpt-4o', + temperature=1.0, + max_tokens=1000, + ) + return AgentConfig( + instructions='Be precise and factual...', + model='openai:gpt-4o-mini', + temperature=0.2, + max_tokens=500, + ) + + +with agent_config.override(get_config_for_context): + # Configuration will be computed based on the attributes passed to get() + with agent_config.get(attributes={'mode': 'creative'}) as config: + assert config.value.temperature == 1.0 +``` + +### Refreshing Variables + +Variables are automatically refreshed in the background when using the remote provider. You can also manually trigger a refresh: + +```python skip="true" +# Synchronous refresh +agent_config.refresh_sync(force=True) + +# Async refresh +await agent_config.refresh(force=True) +``` + +The `force=True` parameter bypasses the polling interval check and fetches the latest configuration immediately. + +### Migrating Variable Names + +Variable names serve as the identifier used to reference the variable in your code. You can rename a variable in the UI or API, but any deployed code still using the old name will fall back to its code default. For zero-downtime migrations, use **aliases**. + +Aliases allow a variable to be found by alternative names. When your code requests a variable by name, if that name isn't found directly, the system checks if it matches any alias of an existing variable and returns that variable's value instead. + +**Migration workflow:** + +1. **Create the new variable** with your desired name and copy the configuration (variants, rollouts, overrides) from the old variable +2. **Add the old name as an alias** on the new variable +3. **Update your code** to use the new variable name +4. **Deploy gradually**: Applications using the old name will still work because the alias resolves to the new variable +5. **Delete the old variable** once all code has been updated and deployed +6. **Remove the alias** (optional) once you're confident no code uses the old name + +**Example:** + +Suppose you have a variable named `agent_config` and want to rename it to `support_agent_config`: + +1. Create `support_agent_config` with the same variants and rollout configuration +2. Add `agent_config` as an alias on `support_agent_config` +3. Old code using `logfire.var(name='agent_config', ...)` continues to work +4. Update your code to use `name='support_agent_config'` +5. After deployment, delete the old `agent_config` variable +6. Optionally remove `agent_config` from the aliases list + +This approach ensures zero-downtime migrations—existing deployed applications continue to receive the correct configuration while you update and redeploy. + +**In the UI:** + +You can manage aliases in the **Aliases** section at the bottom of the variable create/edit form. Add the old variable name(s) that should resolve to this variable. + +**In code (local config):** + +```python skip="true" +from logfire.variables.config import VariableConfig, VariablesConfig + +config = VariablesConfig( + variables={ + 'support_agent_config': VariableConfig( + name='support_agent_config', + variants={...}, + rollout=Rollout(variants={...}), + overrides=[], + # Old name resolves to this variable + aliases=['agent_config'], + ), + } +) +``` + +[slack]: https://logfire.pydantic.dev/docs/join-slack/ diff --git a/logfire-api/logfire_api/__init__.py b/logfire-api/logfire_api/__init__.py index 8bd6e56dd..13a9c4c37 100644 --- a/logfire-api/logfire_api/__init__.py +++ b/logfire-api/logfire_api/__init__.py @@ -203,6 +203,30 @@ def instrument_mcp(self, *args, **kwargs) -> None: ... def shutdown(self, *args, **kwargs) -> None: ... + def var(self, *args, **kwargs): + return MagicMock() + + def variables_get(self, *args, **kwargs) -> list[Any]: + return [] + + def variables_push(self, *args, **kwargs) -> bool: + return False + + def variables_push_types(self, *args, **kwargs) -> bool: + return False + + def variables_validate(self, *args, **kwargs) -> Any: + return MagicMock() + + def variables_push_config(self, *args, **kwargs) -> bool: + return False + + def variables_pull_config(self, *args, **kwargs) -> Any: + return MagicMock() + + def variables_build_config(self, *args, **kwargs) -> Any: + return MagicMock() + DEFAULT_LOGFIRE_INSTANCE = Logfire() span = DEFAULT_LOGFIRE_INSTANCE.span log = DEFAULT_LOGFIRE_INSTANCE.log @@ -254,6 +278,21 @@ def shutdown(self, *args, **kwargs) -> None: ... instrument_mcp = DEFAULT_LOGFIRE_INSTANCE.instrument_mcp shutdown = DEFAULT_LOGFIRE_INSTANCE.shutdown suppress_scopes = DEFAULT_LOGFIRE_INSTANCE.suppress_scopes + var = DEFAULT_LOGFIRE_INSTANCE.var + variables_get = DEFAULT_LOGFIRE_INSTANCE.variables_get + variables_push = DEFAULT_LOGFIRE_INSTANCE.variables_push + variables_push_types = DEFAULT_LOGFIRE_INSTANCE.variables_push_types + variables_validate = DEFAULT_LOGFIRE_INSTANCE.variables_validate + variables_push_config = DEFAULT_LOGFIRE_INSTANCE.variables_push_config + variables_pull_config = DEFAULT_LOGFIRE_INSTANCE.variables_pull_config + variables_build_config = DEFAULT_LOGFIRE_INSTANCE.variables_build_config + + # Stub module for variables submodule + class _VariablesModule: + """Stub for logfire.variables submodule.""" + pass + + variables = _VariablesModule() def loguru_handler() -> dict[str, Any]: return {} @@ -285,6 +324,9 @@ def __init__(self, *args, **kwargs) -> None: ... class MetricsOptions: def __init__(self, *args, **kwargs) -> None: ... + class VariablesOptions: + def __init__(self, *args, **kwargs) -> None: ... + class PydanticPlugin: def __init__(self, *args, **kwargs) -> None: ... diff --git a/logfire/__init__.py b/logfire/__init__.py index af0efb8ac..bde0969cf 100644 --- a/logfire/__init__.py +++ b/logfire/__init__.py @@ -7,11 +7,20 @@ from logfire.propagate import attach_context, get_context from logfire.sampling import SamplingOptions +from . import variables as variables from ._internal.auto_trace import AutoTraceModule from ._internal.auto_trace.rewrite_ast import no_auto_trace from ._internal.baggage import get_baggage, set_baggage from ._internal.cli import logfire_info -from ._internal.config import AdvancedOptions, CodeSource, ConsoleOptions, MetricsOptions, PydanticPlugin, configure +from ._internal.config import ( + AdvancedOptions, + CodeSource, + ConsoleOptions, + MetricsOptions, + PydanticPlugin, + VariablesOptions, + configure, +) from ._internal.constants import LevelName from ._internal.main import Logfire, LogfireSpan from ._internal.scrubbing import ScrubbingOptions, ScrubMatch @@ -85,6 +94,16 @@ metric_gauge_callback = DEFAULT_LOGFIRE_INSTANCE.metric_gauge_callback metric_up_down_counter_callback = DEFAULT_LOGFIRE_INSTANCE.metric_up_down_counter_callback +# Variables +var = DEFAULT_LOGFIRE_INSTANCE.var +variables_get = DEFAULT_LOGFIRE_INSTANCE.variables_get +variables_push = DEFAULT_LOGFIRE_INSTANCE.variables_push +variables_push_types = DEFAULT_LOGFIRE_INSTANCE.variables_push_types +variables_validate = DEFAULT_LOGFIRE_INSTANCE.variables_validate +variables_push_config = DEFAULT_LOGFIRE_INSTANCE.variables_push_config +variables_pull_config = DEFAULT_LOGFIRE_INSTANCE.variables_pull_config +variables_build_config = DEFAULT_LOGFIRE_INSTANCE.variables_build_config + def loguru_handler() -> Any: """Create a **Logfire** handler for Loguru. @@ -171,6 +190,16 @@ def loguru_handler() -> Any: 'loguru_handler', 'SamplingOptions', 'MetricsOptions', + 'VariablesOptions', + 'variables', + 'var', + 'variables_get', + 'variables_push', + 'variables_push_types', + 'variables_validate', + 'variables_push_config', + 'variables_pull_config', + 'variables_build_config', 'logfire_info', 'get_baggage', 'set_baggage', diff --git a/logfire/_internal/client.py b/logfire/_internal/client.py index 38c473587..9bd9c77de 100644 --- a/logfire/_internal/client.py +++ b/logfire/_internal/client.py @@ -67,6 +67,17 @@ def _post_raw(self, endpoint: str, body: Any | None = None) -> Response: UnexpectedResponse.raise_for_status(response) return response + def _put_raw(self, endpoint: str, body: Any | None = None) -> Response: # pragma: no cover + response = self._session.put(urljoin(self.base_url, endpoint), json=body) + UnexpectedResponse.raise_for_status(response) + return response + + def _put(self, endpoint: str, *, body: Any | None = None, error_message: str) -> Any: # pragma: no cover + try: + return self._put_raw(endpoint, body).json() + except UnexpectedResponse as e: + raise LogfireConfigError(error_message) from e + def _post(self, endpoint: str, *, body: Any | None = None, error_message: str) -> Any: try: return self._post_raw(endpoint, body).json() diff --git a/logfire/_internal/config.py b/logfire/_internal/config.py index 79126af8d..44a97bf7c 100644 --- a/logfire/_internal/config.py +++ b/logfire/_internal/config.py @@ -13,6 +13,7 @@ from collections.abc import Sequence from contextlib import suppress from dataclasses import dataclass, field +from datetime import timedelta from pathlib import Path from threading import RLock, Thread from typing import TYPE_CHECKING, Any, Callable, ClassVar, Literal, TypedDict @@ -57,13 +58,14 @@ from opentelemetry.sdk.trace.sampling import ParentBasedTraceIdRatio, Sampler from rich.console import Console from rich.prompt import Confirm, Prompt -from typing_extensions import Self, Unpack +from typing_extensions import Self, Unpack, assert_type from logfire._internal.auth import PYDANTIC_LOGFIRE_TOKEN_PATTERN, REGIONS from logfire._internal.baggage import DirectBaggageAttributesSpanProcessor from logfire.exceptions import LogfireConfigError from logfire.sampling import SamplingOptions from logfire.sampling._tail_sampling import TailSamplingProcessor +from logfire.variables.abstract import NoOpVariableProvider, VariableProvider from logfire.version import VERSION from ..propagate import NoExtractTraceContextPropagator, WarnOnExtractTraceContextPropagator @@ -116,6 +118,8 @@ if TYPE_CHECKING: from typing import TextIO + from logfire.variables import VariablesConfig + from .main import Logfire @@ -302,6 +306,34 @@ class CodeSource: """ +@dataclass +class RemoteVariablesConfig: + block_before_first_resolve: bool = True + """Whether the remote variables should be fetched before first resolving a value.""" + polling_interval: timedelta | float = timedelta(seconds=30) + """The time interval for polling for updates to the variables config.""" + api_key: str | None = None + """API key for accessing the variables endpoint. + + If not provided, will be loaded from LOGFIRE_API_KEY environment variable. + This key should have at least the 'project:read_variables' scope. + """ + + +@dataclass +class VariablesOptions: + """Configuration of managed variables.""" + + config: VariablesConfig | RemoteVariablesConfig | VariableProvider | None = None + """A local or remote variables config, or an arbitrary variable provider.""" + include_resource_attributes_in_context: bool = True + """Whether to include OpenTelemetry resource attributes when resolving variables.""" + include_baggage_in_context: bool = True + """Whether to include OpenTelemetry baggage when resolving variables.""" + instrument: bool = True + """Whether to create spans when resolving variables.""" + + class DeprecatedKwargs(TypedDict): # Empty so that passing any additional kwargs makes static type checkers complain. pass @@ -326,6 +358,7 @@ def configure( min_level: int | LevelName | None = None, add_baggage_to_attributes: bool = True, code_source: CodeSource | None = None, + variables: VariablesOptions | None = None, distributed_tracing: bool | None = None, advanced: AdvancedOptions | None = None, **deprecated_kwargs: Unpack[DeprecatedKwargs], @@ -391,6 +424,7 @@ def configure( add_baggage_to_attributes: Set to `False` to prevent OpenTelemetry Baggage from being added to spans as attributes. See the [Baggage documentation](https://logfire.pydantic.dev/docs/reference/advanced/baggage/) for more details. code_source: Settings for the source code of the project. + variables: Options related to managed variables. distributed_tracing: By default, incoming trace context is extracted, but generates a warning. Set to `True` to disable the warning. Set to `False` to suppress extraction of incoming trace context. @@ -527,14 +561,21 @@ def configure( sampling=sampling, add_baggage_to_attributes=add_baggage_to_attributes, code_source=code_source, + variables=variables, distributed_tracing=distributed_tracing, advanced=advanced, ) if local: - return Logfire(config=config) + logfire_instance = Logfire(config=config) else: - return DEFAULT_LOGFIRE_INSTANCE + logfire_instance = DEFAULT_LOGFIRE_INSTANCE + + # Start the variable provider now that we have the logfire instance + # Pass None if instrumentation is disabled to avoid logging errors via logfire + config.get_variable_provider().start(logfire_instance if config.variables.instrument else None) + + return logfire_instance @dataclasses.dataclass @@ -591,6 +632,9 @@ class _LogfireConfigData: code_source: CodeSource | None """Settings for the source code of the project.""" + variables: VariablesOptions + """Settings related to managed variables.""" + distributed_tracing: bool | None """Whether to extract incoming trace context.""" @@ -618,6 +662,7 @@ def _load_configuration( min_level: int | LevelName | None, add_baggage_to_attributes: bool, code_source: CodeSource | None, + variables: VariablesOptions | None, distributed_tracing: bool | None, advanced: AdvancedOptions | None, ) -> None: @@ -685,6 +730,20 @@ def _load_configuration( code_source = CodeSource(**code_source) # type: ignore self.code_source = code_source + if isinstance(variables, dict): + # This is particularly for deserializing from a dict as in executors.py + config = variables.pop('config', None) # type: ignore + if isinstance(config, dict): # pragma: no branch + if 'variables' in config: + config = VariablesConfig(**config) # type: ignore # pragma: no cover + else: + config = RemoteVariablesConfig(**config) # type: ignore + variables = VariablesOptions(config=config, **variables) # type: ignore + + elif variables is None: + variables = VariablesOptions() + self.variables = variables + if isinstance(advanced, dict): # This is particularly for deserializing from a dict as in executors.py advanced = AdvancedOptions(**advanced) # type: ignore @@ -728,6 +787,7 @@ def __init__( sampling: SamplingOptions | None = None, min_level: int | LevelName | None = None, add_baggage_to_attributes: bool = True, + variables: VariablesOptions | None = None, code_source: CodeSource | None = None, distributed_tracing: bool | None = None, advanced: AdvancedOptions | None = None, @@ -757,6 +817,7 @@ def __init__( min_level=min_level, add_baggage_to_attributes=add_baggage_to_attributes, code_source=code_source, + variables=variables, distributed_tracing=distributed_tracing, advanced=advanced, ) @@ -766,6 +827,7 @@ def __init__( # note: this reference is important because the MeterProvider runs things in background threads # thus it "shuts down" when it's gc'ed self._meter_provider = ProxyMeterProvider(NoOpMeterProvider()) + self._variable_provider: VariableProvider = NoOpVariableProvider() self._logger_provider = ProxyLoggerProvider(NoOpLoggerProvider()) # This ensures that we only call OTEL's global set_tracer_provider once to avoid warnings. self._has_set_providers = False @@ -790,6 +852,7 @@ def configure( min_level: int | LevelName | None, add_baggage_to_attributes: bool, code_source: CodeSource | None, + variables: VariablesOptions | None, distributed_tracing: bool | None, advanced: AdvancedOptions | None, ) -> None: @@ -812,6 +875,7 @@ def configure( min_level, add_baggage_to_attributes, code_source, + variables, distributed_tracing, advanced, ) @@ -1134,6 +1198,35 @@ def fix_pid(): # pragma: no cover ) # note: this may raise an Exception if it times out, call `logfire.shutdown` first self._meter_provider.set_meter_provider(meter_provider) + self._variable_provider.shutdown() + if self.variables.config is None: + self._variable_provider = NoOpVariableProvider() + else: + # Need to move the imports here to prevent errors if pydantic is not installed + from logfire.variables import LocalVariableProvider, LogfireRemoteVariableProvider, VariablesConfig + + if isinstance(self.variables.config, VariableProvider): + self._variable_provider = self.variables.config + elif isinstance(self.variables.config, VariablesConfig): + self._variable_provider = LocalVariableProvider(self.variables.config) + else: + assert_type(self.variables.config, RemoteVariablesConfig) + remote_config = self.variables.config + # Load api_key from config or environment variable + # Only API keys can be used for the variables API (not write tokens) + api_key = remote_config.api_key or self.param_manager.load_param('api_key') + if not api_key: + raise LogfireConfigError( # pragma: no cover + 'Remote variables require an API key. ' + 'Set the LOGFIRE_API_KEY environment variable or pass api_key to RemoteVariablesConfig.' + ) + # Determine base URL: prefer config, then advanced settings, then infer from token + base_url = self.advanced.base_url or get_base_url_from_token(api_key) + self._variable_provider = LogfireRemoteVariableProvider( + base_url=base_url, + token=api_key, + config=remote_config, + ) multi_log_processor = SynchronousMultiLogRecordProcessor() for processor in log_record_processors: multi_log_processor.add_log_record_processor(processor) @@ -1217,6 +1310,16 @@ def get_logger_provider(self) -> ProxyLoggerProvider: """ return self._logger_provider + def get_variable_provider(self) -> VariableProvider: + """Get a variable provider from this `LogfireConfig`. + + This is used internally and should not be called by users of the SDK. + + Returns: + The variable provider. + """ + return self._variable_provider + def warn_if_not_initialized(self, message: str): ignore_no_config_env = os.getenv('LOGFIRE_IGNORE_NO_CONFIG', '') ignore_no_config = ignore_no_config_env.lower() in ('1', 'true', 't') or self.ignore_no_config @@ -1340,7 +1443,7 @@ class LogfireCredentials: """Credentials for logfire.dev.""" token: str - """The Logfire API token to use.""" + """The Logfire write token to use.""" project_name: str """The name of the project.""" project_url: str diff --git a/logfire/_internal/config_params.py b/logfire/_internal/config_params.py index 6d3339a59..995b39b14 100644 --- a/logfire/_internal/config_params.py +++ b/logfire/_internal/config_params.py @@ -59,7 +59,9 @@ class _DefaultCallback: MIN_LEVEL = ConfigParam(env_vars=['LOGFIRE_MIN_LEVEL'], allow_file_config=True, default=None, tp=LevelName) """Minimum log level for logs and spans to be created. By default, all logs and spans are created.""" TOKEN = ConfigParam(env_vars=['LOGFIRE_TOKEN'], tp=list[str]) -"""Token for the Logfire API. Can be a comma-separated list for multi-project export.""" +"""Token for sending application telemetry data to Logfire, also known as a "write token". Can be a comma-separated list for multi-project export.""" +API_KEY = ConfigParam(env_vars=['LOGFIRE_API_KEY']) +"""API key for Logfire API access (used for managed variables and other public APIs).""" SERVICE_NAME = ConfigParam(env_vars=['LOGFIRE_SERVICE_NAME', OTEL_SERVICE_NAME], allow_file_config=True, default='') """Name of the service emitting spans. For further details, please refer to the [Service section](https://opentelemetry.io/docs/specs/semconv/resource/#service).""" SERVICE_VERSION = ConfigParam(env_vars=['LOGFIRE_SERVICE_VERSION', 'OTEL_SERVICE_VERSION'], allow_file_config=True) @@ -118,6 +120,7 @@ class _DefaultCallback: 'send_to_logfire': SEND_TO_LOGFIRE, 'min_level': MIN_LEVEL, 'token': TOKEN, + 'api_key': API_KEY, 'service_name': SERVICE_NAME, 'service_version': SERVICE_VERSION, 'environment': ENVIRONMENT, diff --git a/logfire/_internal/main.py b/logfire/_internal/main.py index 04c38d8a1..08eff45df 100644 --- a/logfire/_internal/main.py +++ b/logfire/_internal/main.py @@ -5,19 +5,21 @@ import json import sys import warnings -from collections.abc import Iterable, Sequence +from collections.abc import Iterable, Mapping, Sequence from contextlib import AbstractContextManager from contextvars import Token from enum import Enum from functools import cached_property from time import time -from typing import ( +from typing import ( # NOQA UP035 TYPE_CHECKING, Any, Callable, Literal, + Type, TypeVar, Union, + cast, overload, ) @@ -111,6 +113,12 @@ from ..integrations.redis import RequestHook as RedisRequestHook, ResponseHook as RedisResponseHook from ..integrations.sqlalchemy import CommenterOptions as SQLAlchemyCommenterOptions from ..integrations.wsgi import RequestHook as WSGIRequestHook, ResponseHook as WSGIResponseHook + from ..variables import ( + ResolveFunction, + ValidationReport, + Variable, + VariablesConfig, + ) from .integrations.asgi import ASGIApp, ASGIInstrumentKwargs from .integrations.aws_lambda import LambdaEvent, LambdaHandler from .integrations.mysql import MySQLConnection @@ -127,6 +135,8 @@ # 3. The argument name exc_info is very suggestive of the sys function. ExcInfo = Union[SysExcInfo, BaseException, bool, None] +T = TypeVar('T') + class Logfire: """The main logfire class.""" @@ -145,11 +155,16 @@ def __init__( self._sample_rate = sample_rate self._console_log = console_log self._otel_scope = otel_scope + self._variables: dict[str, Variable[Any]] = {} @property def config(self) -> LogfireConfig: return self._config + @property + def resource_attributes(self) -> Mapping[str, Any]: + return self._tracer_provider.resource.attributes + @cached_property def _tracer_provider(self) -> ProxyTracerProvider: self._config.warn_if_not_initialized('No logs or spans will be created') @@ -2371,23 +2386,329 @@ def shutdown(self, timeout_millis: int = 30_000, flush: bool = True) -> bool: # `False` if the timeout was reached before the shutdown was completed, `True` otherwise. """ start = time() - if flush: # pragma: no branch - self._tracer_provider.force_flush(timeout_millis) - remaining = max(0, timeout_millis - (time() - start)) + + self.config.get_variable_provider().shutdown() + remaining = max(0, timeout_millis - 1000 * (time() - start)) if not remaining: # pragma: no cover return False - self._tracer_provider.shutdown() - remaining = max(0, timeout_millis - (time() - start)) + if flush: # pragma: no branch + self._tracer_provider.force_flush(int(remaining)) + remaining = max(0, timeout_millis - 1000 * (time() - start)) + if not remaining: # pragma: no cover + return False + + self._tracer_provider.shutdown() + remaining = max(0, timeout_millis - 1000 * (time() - start)) if not remaining: # pragma: no cover return False + if flush: # pragma: no branch self._meter_provider.force_flush(remaining) - remaining = max(0, timeout_millis - (time() - start)) + remaining = max(0, timeout_millis - 1000 * (time() - start)) + if not remaining: # pragma: no cover + return False + + self._meter_provider.shutdown(remaining) + remaining = max(0, timeout_millis - 1000 * (time() - start)) if not remaining: # pragma: no cover return False - self._meter_provider.shutdown(remaining) - return (start - time()) < timeout_millis + + return (time() - start) * 1000 < timeout_millis + + @overload + def var( + self, + name: str, + *, + default: T, + description: str | None = None, + ) -> Variable[T]: ... + + @overload + def var( + self, + name: str, + *, + type: type[T], + default: T | ResolveFunction[T], + description: str | None = None, + ) -> Variable[T]: ... + + def var( + self, + name: str, + *, + type: type[T] | None = None, + default: T | ResolveFunction[T], + description: str | None = None, + ) -> Variable[T]: + from logfire.variables.variable import Variable, is_resolve_function + + if type is None: + if is_resolve_function(default): + raise TypeError( + 'When `default` is a resolve function (callable with targeting_key and attributes parameters), ' + '`type` must be provided to specify the variable value type.' + ) + tp = cast(Type[T], default.__class__) # noqa UP006 + else: + tp = type + + variable = Variable[T](name, default=default, type=tp, logfire_instance=self, description=description) + self._variables[name] = variable + return variable + + def variables_get(self) -> list[Variable[Any]]: + """Get all variables registered with this Logfire instance.""" + return list(self._variables.values()) + + def variables_push( + self, + variables: list[Variable[Any]] | None = None, + *, + dry_run: bool = False, + yes: bool = False, + strict: bool = False, + ) -> bool: + """Push variable definitions to the configured variable provider. + + This method syncs local variable definitions with the provider: + - Creates new variables that don't exist in the provider + - Updates JSON schemas for existing variables if they've changed + - Warns about existing variants that are incompatible with new schemas + + The provider is determined by the Logfire configuration. For remote providers, + this requires proper authentication (via RemoteVariablesConfig or LOGFIRE_API_KEY). + + Args: + variables: Variable instances to push. If None, all variables + registered with this Logfire instance will be pushed. + dry_run: If True, only show what would change without applying. + yes: If True, skip confirmation prompt. + strict: If True, fail if any existing variants are incompatible with new schemas. + + Returns: + True if changes were applied (or would be applied in dry_run mode), False otherwise. + + Example: + ```python + import logfire + + feature_enabled = logfire.var(name='feature_enabled', type=bool, default=False) + max_retries = logfire.var(name='max_retries', type=int, default=3) + + if __name__ == '__main__': + # Push all registered variables + logfire.variables_push() + + # Or push specific variables only + logfire.variables_push([feature_enabled]) + ``` + """ + if variables is None: + variables = self.variables_get() # pragma: no cover + + provider = self.config.get_variable_provider() + return provider.push_variables(variables, dry_run=dry_run, yes=yes, strict=strict) + + def variables_push_types( + self, + types: Sequence[type[Any] | tuple[type[Any], str]], + *, + dry_run: bool = False, + yes: bool = False, + ) -> bool: + """Push variable type definitions to the configured variable provider. + + Variable types are reusable schema definitions that can be referenced by variables. + They help organize and standardize variable schemas across your project. + + This method syncs local Python types with the provider: + - Creates new types that don't exist in the provider + - Updates schemas for existing types if they've changed + - Shows a diff of changes before applying + + The provider is determined by the Logfire configuration. For remote providers, + this requires proper authentication (via RemoteVariablesConfig or LOGFIRE_API_KEY). + + Args: + types: Types to push. Items can be: + - A type (name defaults to __name__ or str(type)) + - A tuple of (type, name) for explicit naming + dry_run: If True, only show what would change without applying. + yes: If True, skip confirmation prompt. + + Returns: + True if changes were applied (or would be applied in dry_run mode), False otherwise. + + Example: + ```python + import logfire + from pydantic import BaseModel + + + class FeatureConfig(BaseModel): + enabled: bool = False + max_retries: int = 3 + timeout_seconds: float = 30.0 + + + class UserSettings(BaseModel): + theme: str = 'light' + notifications_enabled: bool = True + + + if __name__ == '__main__': + # Push type definitions using their class names + logfire.variables_push_types([FeatureConfig, UserSettings]) + + # Or push with explicit names + logfire.variables_push_types( + [ + (FeatureConfig, 'my-feature-config'), + (UserSettings, 'my-user-settings'), + ] + ) + ``` + """ + provider = self.config.get_variable_provider() + return provider.push_variable_types(types, dry_run=dry_run, yes=yes) + + def variables_validate( + self, + variables: list[Variable[Any]] | None = None, + ) -> ValidationReport: + """Validate that provider-side variable variants match local type definitions. + + This method fetches the current variable configuration from the provider and + validates that all variant values can be deserialized to the expected types + defined in the local Variable instances. + + Args: + variables: Variable instances to validate. If None, all variables + registered with this Logfire instance will be validated. + + Returns: + True if all variables validated successfully, False if there were errors. + + Example: + ```python + import logfire + + feature_enabled = logfire.var(name='feature_enabled', type=bool, default=False) + max_retries = logfire.var(name='max_retries', type=int, default=3) + + if __name__ == '__main__': + # Validate all registered variables + logfire.variables_validate() + + # Or validate specific variables only + report = logfire.variables_validate([feature_enabled]) + assert report.is_valid + ``` + """ + if variables is None: + variables = self.variables_get() # pragma: no cover + + provider = self.config.get_variable_provider() + return provider.validate_variables(variables) + + def variables_push_config( + self, + config: VariablesConfig, + *, + mode: Literal['merge', 'replace'] = 'merge', + dry_run: bool = False, + yes: bool = False, + ) -> bool: # pragma: no cover + """Push a VariablesConfig to the configured provider. + + This method pushes a complete VariablesConfig (including variants and rollouts) + to the provider. It's useful for: + - Pushing configs generated or modified locally + - Pushing configs read from files + - Partial updates (merge mode) or full replacement (replace mode) + + Args: + config: The VariablesConfig to sync. + mode: 'merge' updates/creates only variables in config (leaves others unchanged). + 'replace' makes the server match the config exactly (deletes missing variables). + dry_run: If True, only show what would change without applying. + yes: If True, skip confirmation prompt. + + Returns: + True if changes were applied (or would be applied in dry_run mode), False otherwise. + + Example: + ```python skip="true" + import logfire + from logfire.variables import VariablesConfig + + # Push config to server + logfire.variables_push_config(config) + + # Or merge just a subset of variables + logfire.variables_push_config(config, mode='merge') + ``` + """ + provider = self.config.get_variable_provider() + return provider.push_config(config, mode=mode, dry_run=dry_run, yes=yes) + + def variables_pull_config(self) -> VariablesConfig: # pragma: no cover + """Pull the current variable configuration from the provider. + + This method fetches the complete configuration from the provider, + useful for generating local copies of the config that can be modified. + + Returns: + The current VariablesConfig from the provider. + + Example: + ```python skip="true" + import logfire + + # Pull config from the provider + config = logfire.variables_pull_config() + print(config.model_dump_json(indent=2)) + ``` + """ + provider = self.config.get_variable_provider() + return provider.pull_config() + + def variables_build_config( + self, + variables: list[Variable[Any]] | None = None, + ) -> VariablesConfig: + """Build a VariablesConfig from registered Variable instances. + + This creates a minimal config with just the name, schema, and example for each variable. + No variants are created - use this to build a template config that can be edited. + + Args: + variables: Variable instances to include. If None, uses all registered variables. + + Returns: + A VariablesConfig with minimal configs for each variable. + + Example: + ```python skip="true" + import logfire + + feature_enabled = logfire.var(name='feature_enabled', type=bool, default=False) + max_retries = logfire.var(name='max_retries', type=int, default=3) + + # Build config from registered variables + config = logfire.variables_build_config() + print(config.model_dump_json(indent=2)) + ``` + """ + if variables is None: + variables = self.variables_get() # pragma: no cover + + from logfire.variables.config import VariablesConfig + + return VariablesConfig.from_variables(variables) class FastLogfireSpan: diff --git a/logfire/variables/__init__.py b/logfire/variables/__init__.py new file mode 100644 index 000000000..38481d455 --- /dev/null +++ b/logfire/variables/__init__.py @@ -0,0 +1,124 @@ +# pyright: reportUnusedImport=false +# ruff: noqa: F401 +from __future__ import annotations as _annotations + +from importlib.util import find_spec +from typing import TYPE_CHECKING + +from logfire.variables.abstract import ( + NoOpVariableProvider, + ResolvedVariable, + SyncMode, + ValidationReport, + VariableAlreadyExistsError, + VariableNotFoundError, + VariableProvider, + VariableWriteError, +) + +if TYPE_CHECKING: + # We use a TYPE_CHECKING block here because we need to do these imports lazily to prevent issues due to loading the + # logfire pydantic plugin. + # If you change the imports here, you need to update the __getattr__ definition below to match. + from logfire.variables.config import ( + KeyIsNotPresent, + KeyIsPresent, + RemoteVariablesConfig, + Rollout, + RolloutOverride, + ValueDoesNotEqual, + ValueDoesNotMatchRegex, + ValueEquals, + ValueIsIn, + ValueIsNotIn, + ValueMatchesRegex, + VariableConfig, + VariablesConfig, + VariableTypeConfig, + Variant, + ) + from logfire.variables.local import LocalVariableProvider + from logfire.variables.remote import LogfireRemoteVariableProvider + from logfire.variables.variable import ( + ResolveFunction, + Variable, + targeting_context, + ) + +__all__ = [ + # Variable classes + 'Variable', + 'ResolvedVariable', + 'ResolveFunction', + # Configuration classes + 'VariablesConfig', + 'VariableConfig', + 'VariableTypeConfig', + 'RemoteVariablesConfig', + # Variant and rollout configuration + 'Variant', + 'Rollout', + 'RolloutOverride', + # Targeting conditions + 'KeyIsPresent', + 'KeyIsNotPresent', + 'ValueEquals', + 'ValueDoesNotEqual', + 'ValueIsIn', + 'ValueIsNotIn', + 'ValueMatchesRegex', + 'ValueDoesNotMatchRegex', + # Providers + 'VariableProvider', + 'LocalVariableProvider', + 'LogfireRemoteVariableProvider', + 'NoOpVariableProvider', + # Context managers and utilities + 'targeting_context', + # Types + 'SyncMode', + 'ValidationReport', + # Exceptions + 'VariableAlreadyExistsError', + 'VariableNotFoundError', + 'VariableWriteError', +] + + +def __getattr__(name: str): + if name not in __all__: + raise AttributeError(f'module {__name__!r} has no attribute {name!r}') + + if not find_spec('pydantic'): # pragma: no cover + raise ImportError( + 'Using managed variables requires the `pydantic` package.\n' + 'You can install this with:\n' + " pip install 'logfire[variables]'" + ) + + from logfire.variables.config import ( + KeyIsNotPresent, + KeyIsPresent, + RemoteVariablesConfig, + Rollout, + RolloutOverride, + ValueDoesNotEqual, + ValueDoesNotMatchRegex, + ValueEquals, + ValueIsIn, + ValueIsNotIn, + ValueMatchesRegex, + VariableConfig, + VariablesConfig, + VariableTypeConfig, + Variant, + ) + from logfire.variables.local import LocalVariableProvider + from logfire.variables.remote import LogfireRemoteVariableProvider + from logfire.variables.variable import ( + ResolveFunction, + Variable, + targeting_context, + ) + + return locals()[name] diff --git a/logfire/variables/abstract.py b/logfire/variables/abstract.py new file mode 100644 index 000000000..d742e1edf --- /dev/null +++ b/logfire/variables/abstract.py @@ -0,0 +1,1314 @@ +from __future__ import annotations as _annotations + +import json +import sys +import warnings +from abc import ABC, abstractmethod +from collections.abc import Mapping, Sequence +from contextlib import ExitStack +from dataclasses import dataclass +from typing import TYPE_CHECKING, Any, Generic, Literal, TypeVar + +SyncMode = Literal['merge', 'replace'] + +if TYPE_CHECKING: + import logfire + from logfire.variables.config import VariableConfig, VariablesConfig, VariableTypeConfig + from logfire.variables.variable import Variable + +# ANSI color codes for terminal output +ANSI_RESET = '\033[0m' +ANSI_BOLD = '\033[1m' +ANSI_DIM = '\033[2m' +ANSI_RED = '\033[31m' +ANSI_GREEN = '\033[32m' +ANSI_YELLOW = '\033[33m' +ANSI_CYAN = '\033[36m' +ANSI_GRAY = '\033[90m' + +__all__ = ( + 'ResolvedVariable', + 'SyncMode', + 'ValidationReport', + 'VariableProvider', + 'NoOpVariableProvider', + 'VariableWriteError', + 'VariableNotFoundError', + 'VariableAlreadyExistsError', +) + +T = TypeVar('T') +T_co = TypeVar('T_co', covariant=True) + +if not TYPE_CHECKING: # pragma: no branch + if sys.version_info < (3, 10): # pragma: no cover + _dataclass = dataclass + + # Prevent errors when using kw_only with dataclasses in Python<3.10 + # Note: When we drop support for python 3.9, drop this + def dataclass(*args, **kwargs): + kwargs.pop('kw_only', None) + return _dataclass(*args, **kwargs) + + +class VariableWriteError(Exception): + """Base exception for variable write operation failures.""" + + pass + + +class VariableNotFoundError(VariableWriteError): + """Raised when a variable is not found.""" + + pass + + +class VariableAlreadyExistsError(VariableWriteError): + """Raised when trying to create a variable that already exists.""" + + pass + + +@dataclass(kw_only=True) +class ResolvedVariable(Generic[T_co]): + """Details about a variable resolution including value, variant, and any errors. + + This class can be used as a context manager. When used as a context manager, it + automatically sets baggage with the variable name and variant, enabling downstream + spans and logs to be associated with the variable resolution that was active at the time. + + Example: + ```python skip="true" + my_var = logfire.var(name='my_var', type=str, default='default') + with my_var.get() as details: + # Inside this context, baggage is set with: + # logfire.variables.my_var = (or '' if no variant) + value = details.value + # Any spans/logs created here will have the baggage attached + ``` + """ + + name: str + """The name of the variable.""" + value: T_co + """The resolved value of the variable.""" + _reason: Literal[ + 'resolved', + 'context_override', + 'missing_config', + 'unrecognized_variable', + 'validation_error', + 'other_error', + 'no_provider', + ] # we might eventually make this public, but I didn't want to yet + """Internal field indicating how the value was resolved.""" + # Note: I had to put _reason before fields with defaults due to lack of kw_only + # Note: When we drop support for python 3.9, move _reason to the end + variant: str | None = None + """The key of the selected variant, if any.""" + exception: Exception | None = None + """Any exception that occurred during resolution.""" + + def __post_init__(self): + self._exit_stack = ExitStack() + + def __enter__(self): + self._exit_stack.__enter__() + + import logfire + + self._exit_stack.enter_context( + logfire.set_baggage(**{f'logfire.variables.{self.name}': self.variant or ''}) + ) + + return self + + def __exit__(self, exc_type: type[BaseException] | None, exc_val: BaseException | None, exc_tb: Any) -> None: + self._exit_stack.__exit__(exc_type, exc_val, exc_tb) + + +# --- Dataclasses for push/validate operations --- + + +@dataclass +class VariantCompatibility: + """Result of checking a variant's compatibility with a schema.""" + + variant_key: str + serialized_value: str + is_compatible: bool + error: str | None = None + + +@dataclass +class VariableChange: + """Represents a change to be made to a variable.""" + + name: str + change_type: str # 'create', 'update_schema', 'update_description', 'no_change' + local_schema: dict[str, Any] | None = None + server_schema: dict[str, Any] | None = None + initial_variant_value: str | None = None # JSON serialized + incompatible_variants: list[VariantCompatibility] | None = None + server_id: str | None = None # For updates + local_description: str | None = None + server_description: str | None = None + description_differs: bool = False # True if descriptions differ (for warning) + + +@dataclass +class VariableDiff: + """Represents the diff between local and server variables.""" + + changes: list[VariableChange] + orphaned_server_variables: list[str] # Variables on server not in local code + + @property + def has_changes(self) -> bool: + """Return True if there are any changes to apply.""" + return any(c.change_type != 'no_change' for c in self.changes) + + +@dataclass +class VariantValidationError: + """Represents a validation error for a specific variant.""" + + variable_name: str + variant_key: str | None + error: Exception + + +@dataclass +class DescriptionDifference: + """Represents a description difference between local and server.""" + + variable_name: str + local_description: str | None + server_description: str | None + + +@dataclass +class ValidationReport: + """Report of variable validation results. + + This class contains the results of validating variable definitions against + a provider's configuration. It can be used to check for errors programmatically + or formatted for human-readable output. + + Example: + ```python skip="true" + report = provider.validate_variables(variables) + if not report.is_valid: + print(report.format()) + sys.exit(1) + ``` + """ + + errors: list[VariantValidationError] + """List of validation errors found.""" + variables_checked: int + """Total number of variables that were checked.""" + variables_not_on_server: list[str] + """Names of variables that exist locally but not on the server.""" + description_differences: list[DescriptionDifference] + """List of variables where local and server descriptions differ.""" + + @property + def is_valid(self) -> bool: + """Return False if there are any validation errors or any variables not defined in the (possibly remote) config.""" + return len(self.errors) == 0 and len(self.variables_not_on_server) == 0 + + def format(self, *, colors: bool = True) -> str: + """Format the validation report for human-readable output. + + Args: + colors: If True, include ANSI color codes in output. + + Returns: + A formatted string representation of the report. + """ + reset = ANSI_RESET if colors else '' + red = ANSI_RED if colors else '' + green = ANSI_GREEN if colors else '' + yellow = ANSI_YELLOW if colors else '' + cyan = ANSI_CYAN if colors else '' + + lines: list[str] = [] + + if self.errors: + lines.append(f'\n{red}=== Validation Errors ==={reset}') + for error in self.errors: + if error.variant_key is None: # pragma: no cover + lines.append(f' {red}✗ {error.variable_name}: {error.error}{reset}') + else: + lines.append(f' {red}✗ {error.variable_name} (variant: {error.variant_key}){reset}') + # Format the error message, indenting each line + error_lines = str(error.error).split('\n') + for line in error_lines[:5]: # Limit to first 5 lines + lines.append(f' {line}') + if len(error_lines) > 5: + lines.append(f' ... ({len(error_lines) - 5} more lines)') + + if self.variables_not_on_server: + lines.append(f'\n{yellow}=== Variables Not Found on Server ==={reset}') + for name in self.variables_not_on_server: + lines.append(f' {yellow}? {name}{reset}') + + valid_count = self.variables_checked - len(self.errors) - len(self.variables_not_on_server) + if valid_count > 0: + lines.append(f'\n{green}=== Valid ({valid_count} variables) ==={reset}') + + # Show description differences as informational warnings + if self.description_differences: + lines.append(f'\n{cyan}=== Description differences (informational) ==={reset}') + lines.append(f'{cyan}Note: Different descriptions may be intentional for different codebases.{reset}') + for diff in self.description_differences: + lines.append(f' {cyan}! {diff.variable_name}{reset}') + local_desc = diff.local_description or '(none)' + server_desc = diff.server_description or '(none)' + lines.append(f' Local: {local_desc}') + lines.append(f' Server: {server_desc}') + + # Summary line + if not self.is_valid: + error_count = len(self.errors) + len(self.variables_not_on_server) + lines.append(f'\n{red}Validation failed: {error_count} error(s) found.{reset}') + else: + lines.append(f'\n{green}Validation passed: All {self.variables_checked} variable(s) are valid.{reset}') + + return '\n'.join(lines) + + +# --- Helper functions for push/validate operations --- + + +def _get_json_schema(variable: Variable[object]) -> dict[str, Any]: + """Get the JSON schema for a variable's type.""" + return variable.type_adapter.json_schema() + + +def _get_default_serialized(variable: Variable[object]) -> str | None: + """Get the serialized default value for a variable. + + Returns None if the default is a ResolveFunction (can't serialize a function). + """ + from logfire.variables.variable import is_resolve_function + + if is_resolve_function(variable.default): + return None + # Serialize the default value using Pydantic + return variable.type_adapter.dump_json(variable.default).decode('utf-8') + + +def _check_variant_compatibility( + variable: Variable[object], + variant_key: str, + serialized_value: str, +) -> VariantCompatibility: + """Check if a variant's value is compatible with the variable's type.""" + from pydantic import ValidationError + + try: + variable.type_adapter.validate_json(serialized_value) + return VariantCompatibility( + variant_key=variant_key, + serialized_value=serialized_value, + is_compatible=True, + ) + except ValidationError as e: + return VariantCompatibility( + variant_key=variant_key, + serialized_value=serialized_value, + is_compatible=False, + error=str(e), + ) + + +def _compute_diff( + variables: Sequence[Variable[object]], + server_config: VariablesConfig, +) -> VariableDiff: + """Compute the diff between local variables and server config. + + Args: + variables: Local variable definitions. + server_config: Server variable configurations (from provider.get_all_variables_config()). + + Returns: + A VariableDiff describing the changes needed. + """ + changes: list[VariableChange] = [] + local_names = {v.name for v in variables} + + for variable in variables: + local_schema = _get_json_schema(variable) + local_description = variable.description + server_var = server_config.variables.get(variable.name) + + if server_var is None: + # New variable - needs to be created + default_serialized = _get_default_serialized(variable) + changes.append( + VariableChange( + name=variable.name, + change_type='create', + local_schema=local_schema, + initial_variant_value=default_serialized, + local_description=local_description, + ) + ) + else: + # Variable exists - check if schema changed + server_schema = server_var.json_schema + server_description = server_var.description + + # Normalize schemas for comparison (remove $defs if empty, etc.) + local_normalized = json.dumps(local_schema, sort_keys=True) + server_normalized = json.dumps(server_schema, sort_keys=True) if server_schema else '{}' + + schema_changed = local_normalized != server_normalized + + # Check if description differs (for warning purposes) + # Normalize: treat None and empty string as equivalent + local_desc_normalized = local_description or None + server_desc_normalized = server_description or None + description_differs = local_desc_normalized != server_desc_normalized + + if schema_changed: + # Schema changed - check variant compatibility + incompatible: list[VariantCompatibility] = [] + for variant_key, variant in server_var.variants.items(): + compat = _check_variant_compatibility( + variable, + variant_key, + variant.serialized_value, + ) + if not compat.is_compatible: + incompatible.append(compat) + + changes.append( + VariableChange( + name=variable.name, + change_type='update_schema', + local_schema=local_schema, + server_schema=server_schema, + incompatible_variants=incompatible if incompatible else None, + local_description=local_description, + server_description=server_description, + description_differs=description_differs, + ) + ) + else: + # No schema change needed + changes.append( + VariableChange( + name=variable.name, + change_type='no_change', + local_description=local_description, + server_description=server_description, + description_differs=description_differs, + ) + ) + + # Find orphaned server variables (on server but not in local code) + orphaned = [name for name in server_config.variables.keys() if name not in local_names] + + return VariableDiff(changes=changes, orphaned_server_variables=orphaned) + + +def _format_diff(diff: VariableDiff) -> str: + """Format the diff for display to the user.""" + lines: list[str] = [] + + creates = [c for c in diff.changes if c.change_type == 'create'] + updates = [c for c in diff.changes if c.change_type == 'update_schema'] + unchanged = [c for c in diff.changes if c.change_type == 'no_change'] + description_diffs = [c for c in diff.changes if c.description_differs] + + if creates: + lines.append(f'\n{ANSI_GREEN}=== Variables to CREATE ==={ANSI_RESET}') + for change in creates: + lines.append(f' {ANSI_GREEN}+ {change.name}{ANSI_RESET}') + if change.local_description: + lines.append(f' Description: {change.local_description}') + if change.initial_variant_value: + lines.append(f' Example value: {change.initial_variant_value}') + else: + lines.append(' (No example value - default is a function)') + + if updates: + lines.append(f'\n{ANSI_YELLOW}=== Variables to UPDATE (schema changed) ==={ANSI_RESET}') + for change in updates: + lines.append(f' {ANSI_YELLOW}~ {change.name}{ANSI_RESET}') + if change.incompatible_variants: + lines.append(f' {ANSI_RED}Warning: Incompatible variants:{ANSI_RESET}') + for compat in change.incompatible_variants: + lines.append(f' - {compat.variant_key}: {compat.error}') + + if unchanged: + lines.append(f'\n{ANSI_GRAY}=== No changes needed ({len(unchanged)} variables) ==={ANSI_RESET}') + for change in unchanged: + lines.append(f' {ANSI_GRAY} {change.name}{ANSI_RESET}') + + if diff.orphaned_server_variables: + lines.append(f'\n{ANSI_GRAY}=== Server-only variables (not in local code) ==={ANSI_RESET}') + for name in diff.orphaned_server_variables: + lines.append(f' {ANSI_GRAY}? {name}{ANSI_RESET}') + + # Show description differences as informational warnings + if description_diffs: + lines.append(f'\n{ANSI_CYAN}=== Description differences (informational) ==={ANSI_RESET}') + lines.append(f'{ANSI_CYAN}Note: Different descriptions may be intentional for different codebases.{ANSI_RESET}') + for change in description_diffs: + lines.append(f' {ANSI_CYAN}! {change.name}{ANSI_RESET}') + local_desc = change.local_description or '(none)' + server_desc = change.server_description or '(none)' + lines.append(f' Local: {local_desc}') + lines.append(f' Server: {server_desc}') + + return '\n'.join(lines) + + +def _apply_changes( + provider: VariableProvider, + diff: VariableDiff, + server_config: VariablesConfig, +) -> None: + """Apply the changes using the provider.""" + for change in diff.changes: + if change.change_type == 'create': + _create_variable(provider, change) + elif change.change_type == 'update_schema': # pragma: no branch + _update_variable_schema(provider, change, server_config) + + +def _create_variable( + provider: VariableProvider, + change: VariableChange, +) -> None: + """Create a new variable via the provider.""" + from logfire.variables.config import Rollout, VariableConfig + + # No variants are created - the code default is used when no variants exist + # The example field stores the serialized default for use as a template in the UI + config = VariableConfig( + name=change.name, + description=change.local_description, + variants={}, + rollout=Rollout(variants={}), + overrides=[], + json_schema=change.local_schema, + example=change.initial_variant_value, # Store the code default as an example for the UI + ) + + provider.create_variable(config) + print(f' {ANSI_GREEN}Created: {change.name}{ANSI_RESET}') + + +def _update_variable_schema( + provider: VariableProvider, + change: VariableChange, + server_config: VariablesConfig, +) -> None: + """Update an existing variable's schema via the provider.""" + from logfire.variables.config import VariableConfig + + # Get the existing config to preserve variants, rollout, overrides + existing = server_config.variables.get(change.name) + if existing is None: # pragma: no cover + # Should not happen, but handle gracefully + print(f' {ANSI_RED}Warning: Could not find existing config for {change.name}{ANSI_RESET}') + return + + # Create updated config with new schema but preserve everything else + config = VariableConfig( + name=existing.name, + description=existing.description, + variants=existing.variants, + rollout=existing.rollout, + overrides=existing.overrides, + json_schema=change.local_schema, + ) + + provider.update_variable(change.name, config) + print(f' {ANSI_YELLOW}Updated schema: {change.name}{ANSI_RESET}') + + +class VariableProvider(ABC): + """Abstract base class for variable value providers.""" + + @abstractmethod + def get_serialized_value( + self, + variable_name: str, + targeting_key: str | None = None, + attributes: Mapping[str, Any] | None = None, + ) -> ResolvedVariable[str | None]: + """Retrieve the serialized value for a variable. + + Args: + variable_name: The name of the variable to resolve. + targeting_key: Optional key for deterministic variant selection (e.g., user ID). + attributes: Optional attributes for condition-based targeting rules. + + Returns: + A ResolvedVariable containing the serialized value (or None if not found). + """ + raise NotImplementedError + + def get_serialized_value_for_variant( + self, + variable_name: str, + variant_key: str, + ) -> ResolvedVariable[str | None]: + """Retrieve the serialized value for a specific variant of a variable. + + This method bypasses rollout weights and targeting, directly selecting the + specified variant. Used for explicit variant selection. + + Args: + variable_name: The name of the variable to resolve. + variant_key: The key of the variant to select. + + Returns: + A ResolvedVariable containing the serialized value (or None if not found). + + Note: + The default implementation uses get_variable_config to look up the variant. + Subclasses may override this for more efficient implementations. + """ + config = self.get_variable_config(variable_name) + if config is None: + return ResolvedVariable(name=variable_name, value=None, _reason='unrecognized_variable') + + variant = config.variants.get(variant_key) + if variant is None: + return ResolvedVariable(name=variable_name, value=None, _reason='resolved') + + return ResolvedVariable( + name=variable_name, + value=variant.serialized_value, + variant=variant.key, + _reason='resolved', + ) + + def refresh(self, force: bool = False): + """Refresh the value provider. + + Only relevant to remote providers where initial retrieval may be asynchronous. + Calling this method is intended to block until an initial retrieval happens, but is not guaranteed + to eagerly retrieve any updates if the provider implements some kind of caching; the `force` argument + is provided as a way to ignore any caching. + + Args: + force: Whether to force refresh. If using a provider with caching, setting this to `True` triggers a refresh + ignoring the cache. + """ + pass + + def shutdown(self): + """Clean up any resources used by the provider.""" + pass + + def start(self, logfire_instance: logfire.Logfire | None) -> None: + """Start any background tasks for this provider. + + This is called after the provider is created and the Logfire instance is available. + Providers that need to run background tasks (like polling) should override this method + to start those tasks, using the provided logfire instance for error logging. + + Args: + logfire_instance: The Logfire instance to use for error logging, or None if + variable instrumentation is disabled. + """ + pass + + def get_variable_config(self, name: str) -> VariableConfig | None: + """Retrieve the full configuration for a variable. + + Args: + name: The name of the variable. + + Returns: + The VariableConfig if found, or None if the variable doesn't exist. + + Note: + Subclasses should override this method to provide actual implementations. + The default implementation returns None. + """ + return None # pragma: no cover + + def get_all_variables_config(self) -> VariablesConfig: + """Retrieve all variable configurations. + + This is used by push_variables() to compute diffs. + + Returns: + A VariablesConfig containing all variable configurations. + Returns an empty VariablesConfig if no configs are available. + """ + from logfire.variables.config import VariablesConfig + + return VariablesConfig(variables={}) + + def create_variable(self, config: VariableConfig) -> VariableConfig: + """Create a new variable configuration. + + Args: + config: The configuration for the new variable. + + Returns: + The created VariableConfig. + + Raises: + VariableAlreadyExistsError: If a variable with this name already exists. + + Note: + Subclasses should override this method to provide actual implementations. + The default implementation emits a warning and returns the config unchanged. + """ + warnings.warn( + f'{type(self).__name__} does not persist variable writes', + stacklevel=2, + ) + return config + + def update_variable(self, name: str, config: VariableConfig) -> VariableConfig: + """Update an existing variable configuration. + + Args: + name: The name of the variable to update. + config: The new configuration for the variable. + + Returns: + The updated VariableConfig. + + Raises: + VariableNotFoundError: If the variable does not exist. + + Note: + Subclasses should override this method to provide actual implementations. + The default implementation emits a warning and returns the config unchanged. + """ + warnings.warn( + f'{type(self).__name__} does not persist variable writes', + stacklevel=2, + ) + return config + + def delete_variable(self, name: str) -> None: + """Delete a variable configuration. + + Args: + name: The name of the variable to delete. + + Raises: + VariableNotFoundError: If the variable does not exist. + + Note: + Subclasses should override this method to provide actual implementations. + The default implementation emits a warning. + """ + warnings.warn( + f'{type(self).__name__} does not persist variable writes', + stacklevel=2, + ) + + def batch_update(self, updates: dict[str, VariableConfig | None]) -> None: + """Update multiple variables atomically. + + This default implementation processes updates sequentially. Subclasses + (especially remote providers) may override this to batch operations + into a single API call for better performance. + + Args: + updates: A mapping of variable names to their new configurations. + Unrecognized names will be created. + A None value means the variable should be deleted. + All others will be updated. + """ + for name, config in updates.items(): + if config is None: + self.delete_variable(name) + elif self.get_variable_config(name) is None: + self.create_variable(config) + else: + self.update_variable(name, config) + + def push_config( # pragma: no cover + self, + config: VariablesConfig, + *, + mode: SyncMode = 'merge', + dry_run: bool = False, + yes: bool = False, + ) -> bool: + """Push a VariablesConfig to this provider. + + This method pushes a complete VariablesConfig (including variants and rollouts) + to the provider. It's useful for: + - Pushing configs generated or modified locally + - Pushing configs read from files + - Partial updates (merge mode) or full replacement (replace mode) + + Args: + config: The VariablesConfig to push. + mode: 'merge' updates/creates only variables in config (leaves others unchanged). + 'replace' makes the server match the config exactly (deletes missing variables). + dry_run: If True, only show what would change without applying. + yes: If True, skip confirmation prompt. + + Returns: + True if changes were applied (or would be applied in dry_run mode), False otherwise. + """ + if not config.variables: + print('No variables in config to push.') + return False + + # Refresh the provider to ensure we have the latest config + try: + self.refresh(force=True) + except Exception as e: + print(f'{ANSI_YELLOW}Warning: Could not refresh provider: {e}{ANSI_RESET}') + + # Get current variable configs from provider + try: + server_config = self.get_all_variables_config() + except Exception as e: + print(f'{ANSI_RED}Error fetching current config: {e}{ANSI_RESET}') + return False + + # Compute changes + creates: list[str] = [] + updates: list[str] = [] + deletes: list[str] = [] + unchanged: list[str] = [] + + for name, var_config in config.variables.items(): + server_var = server_config.variables.get(name) + if server_var is None: + creates.append(name) + elif var_config.model_dump() != server_var.model_dump(): + updates.append(name) + else: + unchanged.append(name) + + # In replace mode, variables on server but not in config should be deleted + if mode == 'replace': + for name in server_config.variables: + if name not in config.variables: + deletes.append(name) + + # Show diff + lines: list[str] = [] + + if creates: + lines.append(f'\n{ANSI_GREEN}=== Variables to CREATE ==={ANSI_RESET}') + for name in creates: + lines.append(f' {ANSI_GREEN}+ {name}{ANSI_RESET}') + var_config = config.variables[name] + if var_config.description: + lines.append(f' Description: {var_config.description}') + if var_config.variants: + lines.append(f' Variants: {", ".join(var_config.variants.keys())}') + + if updates: + lines.append(f'\n{ANSI_YELLOW}=== Variables to UPDATE ==={ANSI_RESET}') + for name in updates: + lines.append(f' {ANSI_YELLOW}~ {name}{ANSI_RESET}') + + if deletes: + lines.append(f'\n{ANSI_RED}=== Variables to DELETE ==={ANSI_RESET}') + for name in deletes: + lines.append(f' {ANSI_RED}- {name}{ANSI_RESET}') + + if unchanged: + lines.append(f'\n{ANSI_GRAY}=== No changes needed ({len(unchanged)} variables) ==={ANSI_RESET}') + for name in unchanged: + lines.append(f' {ANSI_GRAY} {name}{ANSI_RESET}') + + print('\n'.join(lines)) + + has_changes = bool(creates or updates or deletes) + if not has_changes: + print(f'\n{ANSI_GREEN}No changes needed. Provider is up to date.{ANSI_RESET}') + return False + + if dry_run: + print(f'\n{ANSI_YELLOW}Dry run mode - no changes applied.{ANSI_RESET}') + return True + + # Confirm with user + if not yes: # pragma: no cover + print() + try: + response_input = input('Apply these changes? [y/N] ') + except (EOFError, KeyboardInterrupt): + print('\nAborted.') + return False + + if response_input.lower() not in ('y', 'yes'): + print('Aborted.') + return False + + # Apply changes + print('\nApplying changes...') + try: + # Build batch update map + batch: dict[str, VariableConfig | None] = {} + for name in creates + updates: + batch[name] = config.variables[name] + for name in deletes: + batch[name] = None + + self.batch_update(batch) + except Exception as e: + print(f'{ANSI_RED}Error applying changes: {e}{ANSI_RESET}') + return False + + print(f'\n{ANSI_GREEN}Done! Variables pushed successfully.{ANSI_RESET}') + return True + + def pull_config(self) -> VariablesConfig: # pragma: no cover + """Pull the current variable configuration from the provider. + + This method fetches the complete configuration from the provider, + useful for generating local copies of the config that can be modified. + + Returns: + The current VariablesConfig from the provider. + """ + self.refresh(force=True) + return self.get_all_variables_config() + + def push_variables( + self, + variables: Sequence[Variable[object]], + *, + dry_run: bool = False, + yes: bool = False, + strict: bool = False, + ) -> bool: + """Push variable definitions to this provider. + + This method syncs local variable definitions with the provider: + - Creates new variables that don't exist in the provider + - Updates JSON schemas for existing variables if they've changed + - Warns about existing variants that are incompatible with new schemas + + Args: + variables: Variable instances to push. + dry_run: If True, only show what would change without applying. + yes: If True, skip confirmation prompt. + strict: If True, fail if any existing variants are incompatible with new schemas. + + Returns: + True if changes were applied (or would be applied in dry_run mode), False otherwise. + """ + if not variables: + print('No variables to push. Create variables using logfire.var() first.') + return False + + # Refresh the provider to ensure we have the latest config + try: + self.refresh(force=True) + except Exception as e: + print(f'{ANSI_YELLOW}Warning: Could not refresh provider: {e}{ANSI_RESET}') + + # Get current variable configs from provider + try: + server_config = self.get_all_variables_config() + except Exception as e: + print(f'{ANSI_RED}Error fetching current config: {e}{ANSI_RESET}') + return False + + # Compute diff + diff = _compute_diff(variables, server_config) + + # Show diff + print(_format_diff(diff)) + + if not diff.has_changes: + print(f'\n{ANSI_GREEN}No changes needed. Provider is up to date.{ANSI_RESET}') + return False + + # Check for incompatible variants + incompatible_changes = [c for c in diff.changes if c.change_type == 'update_schema' and c.incompatible_variants] + if incompatible_changes: + message = 'Some changes will result in variants incompatible with the new schema.' + if strict: + print(f'\n{ANSI_RED}Error: {message}\nRemove --strict flag to proceed anyway.{ANSI_RESET}') + return False + else: + print(f'\n{ANSI_YELLOW}Warning: {message}{ANSI_RESET}') + + if dry_run: + print(f'\n{ANSI_YELLOW}Dry run mode - no changes applied.{ANSI_RESET}') + return True + + # Confirm with user + if not yes: # pragma: no cover + print() + try: + response_input = input('Apply these changes? [y/N] ') + except (EOFError, KeyboardInterrupt): + print('\nAborted.') + return False + + if response_input.lower() not in ('y', 'yes'): + print('Aborted.') + return False + + # Apply changes + print('\nApplying changes...') + try: + _apply_changes(self, diff, server_config) + except Exception as e: + print(f'{ANSI_RED}Error applying changes: {e}{ANSI_RESET}') + return False + + print(f'\n{ANSI_GREEN}Done! Variables synced successfully.{ANSI_RESET}') + return True + + def validate_variables( + self, + variables: Sequence[Variable[object]], + ) -> ValidationReport: + """Validate that provider-side variable variants match local type definitions. + + This method fetches the current variable configuration from the provider and + validates that all variant values can be deserialized to the expected types + defined in the local Variable instances. + + Args: + variables: Variable instances to validate. + + Returns: + A ValidationReport containing any errors found. Use `report.is_valid` to check + if validation passed, and `report.format()` to get a human-readable summary. + + Example: + ```python skip="true" + report = provider.validate_variables(variables) + if not report.is_valid: + print(report.format()) + sys.exit(1) + ``` + """ + if not variables: + return ValidationReport( + errors=[], + variables_checked=0, + variables_not_on_server=[], + description_differences=[], + ) + + # Refresh the provider to ensure we have the latest config + self.refresh(force=True) + + # Get current variable configs from provider + server_config = self.get_all_variables_config() + + # Find variables not on server + variables_not_on_server = [v.name for v in variables if v.name not in server_config.variables] + + # Filter to variables that are on the server + variables_on_server = [v for v in variables if v.name in server_config.variables] + + # Get validation errors + error_dict = server_config.get_validation_errors(variables_on_server) + + # Build report + errors: list[VariantValidationError] = [] + for var_name, variant_errors in error_dict.items(): + for variant_key, error in variant_errors.items(): + errors.append( + VariantValidationError( + variable_name=var_name, + variant_key=variant_key, + error=error, + ) + ) + + # Check for description differences + description_differences: list[DescriptionDifference] = [] + for variable in variables_on_server: + server_var = server_config.variables.get(variable.name) + if server_var is not None: # pragma: no branch + # Normalize: treat None and empty string as equivalent + local_desc = variable.description or None + server_desc = server_var.description or None + if local_desc != server_desc: + description_differences.append( + DescriptionDifference( + variable_name=variable.name, + local_description=variable.description, + server_description=server_var.description, + ) + ) + + return ValidationReport( + errors=errors, + variables_checked=len(variables), + variables_not_on_server=variables_not_on_server, + description_differences=description_differences, + ) + + # --- Variable Types API --- + + def list_variable_types(self) -> dict[str, VariableTypeConfig]: + """List all variable types from the provider. + + Returns: + A dictionary mapping type names to their configurations. + """ + warnings.warn( + f'{type(self).__name__} does not support variable types', + stacklevel=2, + ) + return {} + + def get_variable_type(self, name: str) -> VariableTypeConfig | None: + """Get a variable type by name. + + Args: + name: The name of the type to retrieve. + + Returns: + The VariableTypeConfig if found, None otherwise. + """ + return self.list_variable_types().get(name) + + def upsert_variable_type(self, config: VariableTypeConfig) -> VariableTypeConfig: + """Create or update a variable type. + + If a type with the given name exists, it will be updated. + Otherwise, a new type will be created. + + Args: + config: The type configuration to upsert. + + Returns: + The created or updated VariableTypeConfig. + """ + warnings.warn( + f'{type(self).__name__} does not persist variable type writes', + stacklevel=2, + ) + return config + + def push_variable_types( + self, + types: Sequence[type[Any] | tuple[type[Any], str]], + *, + dry_run: bool = False, + yes: bool = False, + ) -> bool: + """Push variable type definitions to this provider. + + This method syncs local type definitions with the provider: + - Creates new types that don't exist in the provider + - Updates JSON schemas for existing types if they've changed + - Warns about schema changes + + Args: + types: Types to push. Items can be: + - A type (name defaults to __name__ or str(type)) + - A tuple of (type, name) for explicit naming + dry_run: If True, only show what would change without applying. + yes: If True, skip confirmation prompt. + + Returns: + True if changes were applied (or would be applied in dry_run mode), False otherwise. + + Example: + ```python skip="true" + from pydantic import BaseModel + + + class FeatureConfig(BaseModel): + enabled: bool + max_items: int = 10 + + + # Push using __name__ as type name + provider.push_variable_types([FeatureConfig]) + + # Push with explicit name + provider.push_variable_types([(FeatureConfig, 'my_feature_config')]) + ``` + """ + from pydantic import TypeAdapter + + from logfire.variables.config import VariableTypeConfig, get_default_type_name, get_source_hint + + if not types: + print('No types to push.') + return False + + # Refresh the provider to ensure we have the latest config + try: + self.refresh(force=True) + except Exception as e: + print(f'{ANSI_YELLOW}Warning: Could not refresh provider: {e}{ANSI_RESET}') + + # Get current types from provider + try: + server_types = self.list_variable_types() + except Exception as e: + print(f'{ANSI_RED}Error fetching current types: {e}{ANSI_RESET}') + return False + + # Build list of type configs to push + type_configs: list[VariableTypeConfig] = [] + for item in types: + if isinstance(item, tuple): + t, name = item + else: + t = item + name = get_default_type_name(t) + + adapter = TypeAdapter(t) + json_schema = adapter.json_schema() + source_hint = get_source_hint(t) + + type_configs.append( + VariableTypeConfig( + name=name, + json_schema=json_schema, + source_hint=source_hint, + ) + ) + + # Compute diff + creates: list[str] = [] + updates: list[str] = [] + unchanged: list[str] = [] + + for config in type_configs: + existing = server_types.get(config.name) + if existing is None: + creates.append(config.name) + elif existing.json_schema != config.json_schema: + updates.append(config.name) + else: + unchanged.append(config.name) + + # Show diff + print(f'\n{ANSI_BOLD}Variable Types Push Summary{ANSI_RESET}') + print('=' * 40) + + if creates: + print(f'\n{ANSI_GREEN}New types ({len(creates)}):{ANSI_RESET}') + for name in creates: + print(f' + {name}') + + if updates: + print(f'\n{ANSI_YELLOW}Schema updates ({len(updates)}):{ANSI_RESET}') + for name in updates: + print(f' ~ {name}') + + if unchanged: + print(f'\n{ANSI_DIM}Unchanged ({len(unchanged)}):{ANSI_RESET}') + for name in unchanged: + print(f' = {name}') + + if not creates and not updates: + print(f'\n{ANSI_GREEN}No changes needed. Types are up to date.{ANSI_RESET}') + return False + + if dry_run: + print(f'\n{ANSI_YELLOW}Dry run mode - no changes applied.{ANSI_RESET}') + return True + + # Confirm with user + if not yes: # pragma: no cover + print() + try: + response_input = input('Apply these changes? [y/N] ') + except (EOFError, KeyboardInterrupt): + print('\nAborted.') + return False + + if response_input.lower() not in ('y', 'yes'): + print('Aborted.') + return False + + # Apply changes + print('\nApplying changes...') + try: + for config in type_configs: + if config.name in creates or config.name in updates: + self.upsert_variable_type(config) + except Exception as e: + print(f'{ANSI_RED}Error applying changes: {e}{ANSI_RESET}') + return False + + print(f'\n{ANSI_GREEN}Done! Variable types synced successfully.{ANSI_RESET}') + return True + + +@dataclass +class NoOpVariableProvider(VariableProvider): + """A variable provider that always returns None, used when no provider is configured.""" + + def get_serialized_value( + self, + variable_name: str, + targeting_key: str | None = None, + attributes: Mapping[str, Any] | None = None, + ) -> ResolvedVariable[str | None]: + """Return None for all variable lookups. + + Args: + variable_name: The name of the variable to resolve (ignored). + targeting_key: Optional key for deterministic variant selection (ignored). + attributes: Optional attributes for condition-based targeting rules (ignored). + + Returns: + A ResolvedVariable with value=None. + """ + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') + + def get_variable_config(self, name: str) -> VariableConfig | None: + """Return None for all variable lookups. + + Args: + name: The name of the variable (ignored). + + Returns: + Always None since no provider is configured. + """ + return None + + def push_variables( + self, + variables: Sequence[Variable[Any]], + *, + dry_run: bool = False, + yes: bool = False, + strict: bool = False, + ) -> bool: + """No-op implementation that prints a message about missing provider configuration. + + Returns: + Always False since no provider is configured. + """ + print('No variable provider configured. Configure a provider using logfire.configure(variables=...).') + return False + + def validate_variables( + self, + variables: Sequence[Variable[Any]], + ) -> ValidationReport: + """No-op implementation that returns an empty validation report. + + Returns: + An empty ValidationReport since there's no provider to validate against. + """ + return ValidationReport( + errors=[], + variables_checked=0, + variables_not_on_server=[], + description_differences=[], + ) diff --git a/logfire/variables/config.py b/logfire/variables/config.py new file mode 100644 index 000000000..3ab4ec622 --- /dev/null +++ b/logfire/variables/config.py @@ -0,0 +1,551 @@ +from __future__ import annotations as _annotations + +import random +import re +from collections.abc import Mapping, Sequence +from functools import cached_property +from typing import Annotated, Any, Literal, Union + +from pydantic import BaseModel, Field, ValidationError, WithJsonSchema, field_validator, model_validator +from typing_extensions import TypeAliasType + +from logfire._internal.config import RemoteVariablesConfig as RemoteVariablesConfig +from logfire.variables.abstract import ResolvedVariable +from logfire.variables.variable import Variable + +try: + from pydantic import Discriminator +except ImportError: # pragma: no cover + # This is only used in an annotation, so if you have Pydantic < 2.5, just treat it as a no-op + def Discriminator(*args: Any, **kwargs: Any) -> Any: + pass + + +__all__ = ( + 'KeyIsNotPresent', + 'KeyIsPresent', + 'RemoteVariablesConfig', + 'Rollout', + 'RolloutOverride', + 'ValueDoesNotEqual', + 'ValueDoesNotMatchRegex', + 'ValueEquals', + 'ValueIsIn', + 'ValueIsNotIn', + 'ValueMatchesRegex', + 'VariableConfig', + 'VariablesConfig', + 'VariableTypeConfig', + 'Variant', +) + + +class ValueEquals(BaseModel): + """Condition that matches when an attribute equals a specific value.""" + + attribute: str + """The name of the attribute to check.""" + value: Any + """The value the attribute must equal.""" + kind: Literal['value-equals'] = 'value-equals' + """Discriminator field for condition type.""" + + def matches(self, attributes: Mapping[str, Any]) -> bool: + """Check if the attribute equals the expected value.""" + return attributes.get(self.attribute, object()) == self.value + + +class ValueDoesNotEqual(BaseModel): + """Condition that matches when an attribute does not equal a specific value.""" + + attribute: str + """The name of the attribute to check.""" + value: Any + """The value the attribute must not equal.""" + kind: Literal['value-does-not-equal'] = 'value-does-not-equal' + """Discriminator field for condition type.""" + + def matches(self, attributes: Mapping[str, Any]) -> bool: + """Check if the attribute does not equal the specified value.""" + # If attribute is missing, use object() sentinel which won't equal any value + return attributes.get(self.attribute, object()) != self.value + + +class ValueIsIn(BaseModel): + """Condition that matches when an attribute value is in a set of values.""" + + attribute: str + """The name of the attribute to check.""" + values: Sequence[Any] + """The set of values the attribute must be in.""" + kind: Literal['value-is-in'] = 'value-is-in' + """Discriminator field for condition type.""" + + def matches(self, attributes: Mapping[str, Any]) -> bool: + """Check if the attribute value is in the allowed set.""" + value = attributes.get(self.attribute, object()) + return value in self.values + + +class ValueIsNotIn(BaseModel): + """Condition that matches when an attribute value is not in a set of values.""" + + attribute: str + """The name of the attribute to check.""" + values: Sequence[Any] + """The set of values the attribute must not be in.""" + kind: Literal['value-is-not-in'] = 'value-is-not-in' + """Discriminator field for condition type.""" + + def matches(self, attributes: Mapping[str, Any]) -> bool: + """Check if the attribute value is not in the excluded set.""" + # If attribute is missing, use object() sentinel which won't be in the list + value = attributes.get(self.attribute, object()) + return value not in self.values + + +class ValueMatchesRegex(BaseModel): + """Condition that matches when an attribute value matches a regex pattern.""" + + attribute: str + """The name of the attribute to check.""" + pattern: str | re.Pattern[str] + """The regex pattern the attribute value must match.""" + kind: Literal['value-matches-regex'] = 'value-matches-regex' + """Discriminator field for condition type.""" + + def matches(self, attributes: Mapping[str, Any]) -> bool: + """Check if the attribute value matches the regex pattern.""" + value = attributes.get(self.attribute) + if not isinstance(value, str): + return False + return bool(re.search(self.pattern, value)) + + +class ValueDoesNotMatchRegex(BaseModel): + """Condition that matches when an attribute value does not match a regex pattern.""" + + attribute: str + """The name of the attribute to check.""" + pattern: str | re.Pattern[str] + """The regex pattern the attribute value must not match.""" + kind: Literal['value-does-not-match-regex'] = 'value-does-not-match-regex' + """Discriminator field for condition type.""" + + def matches(self, attributes: Mapping[str, Any]) -> bool: + """Check if the attribute value does not match the regex pattern.""" + value = attributes.get(self.attribute) + if not isinstance(value, str): + # Missing or non-string values cannot match the pattern, + # so they satisfy the "does not match" condition. + return True + return not re.search(self.pattern, value) + + +class KeyIsPresent(BaseModel): + """Condition that matches when an attribute key is present.""" + + attribute: str + """The name of the attribute key that must be present.""" + kind: Literal['key-is-present'] = 'key-is-present' + """Discriminator field for condition type.""" + + def matches(self, attributes: Mapping[str, Any]) -> bool: + """Check if the attribute key exists in the attributes.""" + return self.attribute in attributes + + +class KeyIsNotPresent(BaseModel): + """Condition that matches when an attribute key is not present.""" + + attribute: str + """The name of the attribute key that must not be present.""" + kind: Literal['key-is-not-present'] = 'key-is-not-present' + """Discriminator field for condition type.""" + + def matches(self, attributes: Mapping[str, Any]) -> bool: + """Check if the attribute key does not exist in the attributes.""" + return self.attribute not in attributes + + +Condition = TypeAliasType( + 'Condition', + Annotated[ + Union[ + ValueEquals, + ValueDoesNotEqual, + ValueIsIn, + ValueIsNotIn, + ValueMatchesRegex, + ValueDoesNotMatchRegex, + KeyIsPresent, + KeyIsNotPresent, + ], + Discriminator('kind'), + ], +) + + +# Note: We've added the WithJsonSchema to simplify the schema to just {"type": "string"} +# to work around shortcomings in some API client generators. +VariantKey = Annotated[str, Field(pattern=r'^[a-zA-Z_][a-zA-Z0-9_]*$'), WithJsonSchema({'type': 'string'})] +"""The identifier of a variant value for a variable. + +At least for now, must be a valid Python identifier.""" +VariableName = Annotated[str, Field(pattern=r'^[a-zA-Z_][a-zA-Z0-9_]*$'), WithJsonSchema({'type': 'string'})] +"""The name of a variable. + +At least for now, must be a valid Python identifier.""" + + +class Rollout(BaseModel): + """Configuration for variant selection with weighted probabilities.""" + + variants: dict[VariantKey, float] + """Mapping of variant keys to their selection weights (must sum to at most 1.0).""" + + @cached_property + def _population_and_weights(self) -> tuple[list[VariantKey | None], list[float]]: + # Note that the caching means that the `variants` field should be treated as immutable + population: list[VariantKey | None] = [] + weights: list[float] = [] + for k, v in self.variants.items(): + population.append(k) + weights.append(v) + + p_code_default = 1 - sum(weights) + if p_code_default > 0: + population.append(None) + weights.append(p_code_default) + return population, weights + + @field_validator('variants') + @classmethod + def _validate_variant_proportions(cls, v: dict[VariantKey, float]): + # Note: if the values sum to _less_ than 1, the remaining proportion corresponds to the probability of using + # the code default. + if any(weight < 0 for weight in v.values()): + raise ValueError('Variant proportions must not be negative.') + if sum(v.values()) > 1: + raise ValueError('Variant proportions must not sum to more than 1.') + return v + + def select_variant(self, seed: str | None) -> VariantKey | None: + """Select a variant based on configured weights using optional seeded randomness. + + Args: + seed: Optional seed for deterministic variant selection. If provided, the same seed + will always select the same variant. + + Returns: + The key of the selected variant, or None if no variant is selected (when weights sum to less than 1.0). + """ + rand = random.Random(seed) + population, weights = self._population_and_weights + return rand.choices(population, weights)[0] + + +class Variant(BaseModel): + """A specific variant of a managed variable with its serialized value.""" + + key: VariantKey + """Unique identifier for this variant.""" + serialized_value: str + """The JSON-serialized value for this variant.""" + description: str | None = None + """Optional human-readable description of this variant.""" + version: int | None = None + """Optional version identifier for this variant.""" + + +class RolloutOverride(BaseModel): + """An override of the default rollout when specific conditions are met.""" + + conditions: list[Condition] + """List of conditions that must all match for this override to apply.""" + rollout: Rollout + """The rollout configuration to use when all conditions match.""" + + +class VariableConfig(BaseModel): + """Configuration for a single managed variable including variants and rollout rules.""" + + # A note on migrations: + # * To migrate value types, copy the variable using a new name, update the values, and use the new variable name in updated code + # * To migrate variable names, update the "aliases" field on the VariableConfig + name: VariableName + """Unique name identifying this variable.""" + variants: dict[VariantKey, Variant] + """Mapping of variant keys to their configurations.""" + rollout: Rollout + """Default rollout configuration for variant selection.""" + overrides: list[RolloutOverride] + """Conditional overrides evaluated in order; first match takes precedence.""" + description: str | None = ( + None # Note: When we drop support for python 3.9, move this field immediately after `name` + ) + """Description of the variable.""" + json_schema: dict[str, Any] | None = None + """JSON schema describing the expected type of this variable's values.""" + aliases: list[VariableName] | None = None + """Alternative names that resolve to this variable; useful for name migrations.""" + example: str | None = None + """JSON-serialized example value from code; used as a template when creating new variants in the UI.""" + # NOTE: Context-based targeting_key can be set via targeting_context() from logfire.variables. + # TODO(DavidM): Consider adding remotely-managed targeting_key_attribute for automatic attribute-based targeting. + + @model_validator(mode='after') + def _validate_variants(self): + # Validate lookup keys on variants dict + for k, v in self.variants.items(): + if v.key != k: + raise ValueError(f'`variants` has invalid lookup key {k!r} for value with key {v.key!r}.') + + # Validate rollout variant references + for k, v in self.rollout.variants.items(): + if k not in self.variants: + raise ValueError(f'Variant {k!r} present in `rollout.variants` is not present in `variants`.') + + # Validate rollout override variant references + for i, override in enumerate(self.overrides): # pragma: no branch + for k, v in override.rollout.variants.items(): # pragma: no branch + if k not in self.variants: # pragma: no branch + raise ValueError(f'Variant {k!r} present in `overrides[{i}].rollout` is not present in `variants`.') + + return self + + def resolve_variant( + self, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> Variant | None: + """Evaluate a managed variable configuration and return the selected variant. + + The resolution process: + 1. Check if there's an active rollout schedule with a current stage + 2. If a schedule stage is active, use that stage's rollout and overrides + 3. Otherwise, use the base rollout and overrides from this config + 4. Evaluate overrides in order; the first match takes precedence + 5. Select a variant based on the rollout weights (deterministic if targeting_key is provided) + + Args: + targeting_key: A string identifying the subject of evaluation (e.g., user ID). + When provided, ensures deterministic variant selection for the same key. + attributes: Additional attributes for condition matching in override rules. + + Returns: + The selected Variant, or None if no variant is selected (can happen when + rollout weights sum to less than 1.0). + """ + if attributes is None: + attributes = {} + + # Step 1: Determine the rollout and overrides to use (from schedule or base config) + base_rollout = self.rollout + base_overrides = self.overrides + + # Step 2: Find the first matching override, or use the base rollout + selected_rollout = base_rollout + for override in base_overrides: + if _matches_all_conditions(override.conditions, attributes): + selected_rollout = override.rollout + break # First match takes precedence + + seed = None if targeting_key is None else f'{self.name!r}:{targeting_key!r}' + selected_variant_key = selected_rollout.select_variant(seed) + + if selected_variant_key is None: + return None + + return self.variants[selected_variant_key] + + +class VariablesConfig(BaseModel): + """Container for all managed variable configurations.""" + + variables: dict[VariableName, VariableConfig] + """Mapping of variable names to their configurations.""" + + @model_validator(mode='after') + def _validate_variables(self): + # Validate lookup keys on variants dict + for k, v in self.variables.items(): + if v.name != k: + raise ValueError(f'`variables` has invalid lookup key {k!r} for value with name {v.name!r}.') + return self + + @property + def _alias_map(self) -> dict[VariableName, str]: + # Build alias lookup map for efficient lookups + alias_map: dict[VariableName, VariableName] = {} + for var_config in self.variables.values(): + if var_config.aliases: + for alias in var_config.aliases: + alias_map[alias] = var_config.name + return alias_map + + def resolve_serialized_value( + self, name: VariableName, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + """Evaluate a managed variable configuration and resolve the selected variant's serialized value.""" + variable_config = self._get_variable_config(name) + if variable_config is None: + return ResolvedVariable(name=name, value=None, _reason='unrecognized_variable') + + variant = variable_config.resolve_variant(targeting_key, attributes) + if variant is None: + return ResolvedVariable(name=variable_config.name, value=None, _reason='resolved') + else: + return ResolvedVariable( + name=variable_config.name, value=variant.serialized_value, variant=variant.key, _reason='resolved' + ) + + def _get_variable_config(self, name: VariableName) -> VariableConfig | None: + # First try direct lookup + config = self.variables.get(name) + if config is not None: + return config + + # Fall back to alias lookup (aliases are stored on each VariableConfig) + if name in self._alias_map: + return self.variables.get(self._alias_map[name]) + + return None + + def get_validation_errors(self, variables: list[Variable[Any]]) -> dict[str, dict[str | None, Exception]]: + """Validate that all variable variants can be deserialized to their expected types. + + Args: + variables: List of Variable instances to validate against this configuration. + + Returns: + A dict mapping variable names to dicts of variant keys (or None for general errors) to exceptions. + """ + errors: dict[str, dict[str | None, Exception]] = {} + for variable in variables: + try: + config = self._get_variable_config(variable.name) + if config is None: + raise ValueError(f'No config for variable with name {variable.name!r}') + for k, v in config.variants.items(): + try: + variable.type_adapter.validate_json(v.serialized_value) + except ValidationError as e: + errors.setdefault(variable.name, {})[k] = e + except Exception as e: + errors.setdefault(variable.name, {})[None] = e + return errors + + @staticmethod + def from_variables(variables: list[Variable[Any]]) -> VariablesConfig: + """Create a VariablesConfig from a list of Variable instances. + + This creates a minimal config with just the name, schema, and example for each variable. + No variants are created - use this to generate a template config that can be edited. + + Args: + variables: List of Variable instances to create configs from. + + Returns: + A VariablesConfig with minimal configs for each variable. + """ + from logfire.variables.variable import is_resolve_function + + variable_configs: dict[VariableName, VariableConfig] = {} + for variable in variables: + # Get JSON schema from the type adapter + json_schema = variable.type_adapter.json_schema() + + # Get the serialized default value as an example (if not a function) + example: str | None = None + if not is_resolve_function(variable.default): + example = variable.type_adapter.dump_json(variable.default).decode('utf-8') + + config = VariableConfig( + name=variable.name, + description=variable.description, + variants={}, + rollout=Rollout(variants={}), + overrides=[], + json_schema=json_schema, + example=example, + ) + variable_configs[variable.name] = config + + return VariablesConfig(variables=variable_configs) + + def merge(self, other: VariablesConfig) -> VariablesConfig: + """Merge another VariablesConfig into this one. + + Variables in `other` will override variables with the same name in this config. + + Args: + other: Another VariablesConfig to merge. + + Returns: + A new VariablesConfig with variables from both configs. + """ + merged_variables = dict(self.variables) + merged_variables.update(other.variables) + return VariablesConfig(variables=merged_variables) + + +def _matches_all_conditions(conditions: list[Condition], attributes: Mapping[str, Any]) -> bool: + """Check if all conditions match the provided attributes. + + Args: + conditions: List of conditions to evaluate. + attributes: Attributes to match against. + + Returns: + True if all conditions match, False otherwise. + """ + for condition in conditions: + if not condition.matches(attributes): + return False + return True + + +class VariableTypeConfig(BaseModel): + """Configuration for a variable type (reusable schema definition).""" + + name: str + """Unique name identifying this type. Defaults to __name__ or str(type).""" + json_schema: dict[str, Any] + """JSON schema describing the type structure.""" + description: str | None = None + """Human-readable description of this type.""" + source_hint: str | None = None + """Optional hint about where this type is defined in code (e.g., 'myapp.config.FeatureConfig').""" + + +def get_default_type_name(t: Any) -> str: + """Get the default name for a Python type. + + For regular classes, returns __name__ (e.g., 'FeatureConfig'). + For unions, generics, or other complex types, returns str(type) (e.g., 'FeatureConfig | None'). + + Args: + t: The Python type to get a name for. + + Returns: + A string name for the type. + """ + if isinstance(t, type): + return t.__name__ + return str(t) + + +def get_source_hint(t: Any) -> str | None: + """Get a source hint for a type based on its module and qualname. + + Args: + t: The Python type to get a source hint for. + + Returns: + A source hint string like 'myapp.config.FeatureConfig', or None if not available. + """ + if isinstance(t, type): + module = getattr(t, '__module__', None) + qualname = getattr(t, '__qualname__', None) + if module and qualname: + return f'{module}.{qualname}' + return None diff --git a/logfire/variables/local.py b/logfire/variables/local.py new file mode 100644 index 000000000..2840cd0bd --- /dev/null +++ b/logfire/variables/local.py @@ -0,0 +1,119 @@ +from __future__ import annotations as _annotations + +from collections.abc import Mapping +from typing import Any + +from logfire.variables.abstract import ( + ResolvedVariable, + VariableAlreadyExistsError, + VariableNotFoundError, + VariableProvider, +) +from logfire.variables.config import VariableConfig, VariablesConfig + +__all__ = ('LocalVariableProvider',) + + +class LocalVariableProvider(VariableProvider): + """Variable provider that resolves values from a local in-memory configuration. + + This provider stores a mutable `VariablesConfig` and supports both read and write operations. + """ + + def __init__(self, config: VariablesConfig): + """Create a new local variable provider. + + Args: + config: A VariablesConfig instance to use for variable resolution and mutation. + """ + self._config = config + + def get_serialized_value( + self, + variable_name: str, + targeting_key: str | None = None, + attributes: Mapping[str, Any] | None = None, + ) -> ResolvedVariable[str | None]: + """Resolve a variable's serialized value from the local configuration. + + Args: + variable_name: The name of the variable to resolve. + targeting_key: Optional key for deterministic variant selection (e.g., user ID). + If not provided and there is an active trace, its trace ID is used to ensure + the same value is used across a trace. + attributes: Optional attributes for condition-based targeting rules. + + Returns: + A ResolvedVariable containing the serialized value (or None if not found). + """ + return self._config.resolve_serialized_value(variable_name, targeting_key, attributes) + + def get_variable_config(self, name: str) -> VariableConfig | None: + """Retrieve the full configuration for a variable. + + This method supports alias-based lookup, so you can pass either the + variable's current name or any of its configured aliases. + + Args: + name: The name (or alias) of the variable. + + Returns: + The VariableConfig if found, or None if the variable doesn't exist. + """ + return self._config._get_variable_config(name) # pyright: ignore[reportPrivateUsage] + + def get_all_variables_config(self) -> VariablesConfig: + """Retrieve all variable configurations. + + Returns: + A VariablesConfig containing all variable configurations. + """ + return self._config + + def create_variable(self, config: VariableConfig) -> VariableConfig: + """Create a new variable configuration. + + Args: + config: The configuration for the new variable. + + Returns: + The created VariableConfig. + + Raises: + VariableAlreadyExistsError: If a variable with this name already exists. + """ + if config.name in self._config.variables: + raise VariableAlreadyExistsError(f"Variable '{config.name}' already exists") + self._config.variables[config.name] = config + return config + + def update_variable(self, name: str, config: VariableConfig) -> VariableConfig: + """Update an existing variable configuration. + + Args: + name: The name of the variable to update. + config: The new configuration for the variable. + + Returns: + The updated VariableConfig. + + Raises: + VariableNotFoundError: If the variable does not exist. + """ + if name not in self._config.variables: + raise VariableNotFoundError(f"Variable '{name}' not found") + self._config.variables[name] = config + return config + + def delete_variable(self, name: str) -> None: + """Delete a variable configuration. + + Args: + name: The name of the variable to delete. + + Raises: + VariableNotFoundError: If the variable does not exist. + """ + if name not in self._config.variables: + raise VariableNotFoundError(f"Variable '{name}' not found") + del self._config.variables[name] diff --git a/logfire/variables/remote.py b/logfire/variables/remote.py new file mode 100644 index 000000000..5928c45d6 --- /dev/null +++ b/logfire/variables/remote.py @@ -0,0 +1,592 @@ +from __future__ import annotations as _annotations + +import json +import os +import threading +import warnings +import weakref +from collections.abc import Mapping +from datetime import datetime, timedelta, timezone +from typing import TYPE_CHECKING, Any +from urllib.parse import urljoin + +from opentelemetry.util._once import Once +from pydantic import ValidationError +from requests import Session + +from logfire._internal.client import UA_HEADER +from logfire._internal.config import RemoteVariablesConfig +from logfire._internal.utils import UnexpectedResponse +from logfire.variables.abstract import ( + ResolvedVariable, + VariableAlreadyExistsError, + VariableNotFoundError, + VariableProvider, + VariableWriteError, +) +from logfire.variables.config import VariableConfig, VariablesConfig + +if TYPE_CHECKING: + import logfire + from logfire.variables.config import VariableTypeConfig + + +__all__ = ('LogfireRemoteVariableProvider',) + + +class LogfireRemoteVariableProvider(VariableProvider): + """Variable provider that fetches configuration from a remote Logfire API. + + The threading implementation draws heavily from opentelemetry.sdk._shared_internal.BatchProcessor. + """ + + def __init__(self, base_url: str, token: str, config: RemoteVariablesConfig): + """Create a new remote variable provider. + + Args: + base_url: The base URL of the Logfire API. + token: Authentication token for the Logfire API. + config: Config for retrieving remote variables. + """ + block_before_first_resolve = config.block_before_first_resolve + polling_interval = config.polling_interval + + self._base_url = base_url + self._token = token + self._session = Session() + self._session.headers.update({'Authorization': f'bearer {token}', 'User-Agent': UA_HEADER}) + self._block_before_first_fetch = block_before_first_resolve + self._polling_interval: timedelta = ( + timedelta(seconds=polling_interval) if isinstance(polling_interval, (float, int)) else polling_interval + ) + + self._reset_once = Once() + self._has_attempted_fetch: bool = False + self._last_fetched_at: datetime | None = None + + self._config: VariablesConfig | None = None + + self._shutdown = False + self._shutdown_timeout_exceeded = False + self._refresh_lock = threading.Lock() + self._worker_awaken = threading.Event() + self._force_next_refresh = False # Set by SSE listener to force immediate refresh + + # SSE listener for real-time updates + self._sse_connected = False + self._sse_thread: threading.Thread | None = None + + # Logfire instance for error logging, set via start() + # If None, errors are reported via warnings instead. + self._logfire: logfire.Logfire | None = None + self._started = False + + # Worker thread is created but not started until start() is called + self._worker_thread: threading.Thread | None = None + self._pid = os.getpid() + + def _at_fork_reinit(self): # pragma: no cover + # Recreate all things threading related + self._refresh_lock = threading.Lock() + self._worker_awaken = threading.Event() + # Only restart threads if we were started before the fork + if self._started: + self._worker_thread = threading.Thread( + name='LogfireRemoteProvider', + target=self._worker, + daemon=True, + ) + self._worker_thread.start() + # Restart SSE listener + self._sse_connected = False + self._start_sse_listener() + self._pid = os.getpid() + + def start(self, logfire_instance: logfire.Logfire | None) -> None: + """Start background polling with the given logfire instance for error logging. + + Args: + logfire_instance: The Logfire instance to use for error logging, or None if + variable instrumentation is disabled (errors will be reported via warnings). + """ + if logfire_instance is not None: + self._logfire = logfire_instance.with_settings(custom_scope_suffix='variables.provider') + if self._started: + return + self._started = True + + # Start the worker thread + self._worker_thread = threading.Thread( + name='LogfireRemoteProvider', + target=self._worker, + daemon=True, + ) + self._worker_thread.start() + + # Start the SSE listener + self._start_sse_listener() + + # Register at_fork handler + if hasattr(os, 'register_at_fork'): # pragma: no branch + weak_reinit = weakref.WeakMethod(self._at_fork_reinit) + + def _after_in_child() -> None: + method = weak_reinit() + if method is not None: + method() + + os.register_at_fork(after_in_child=_after_in_child) + + def _log_error(self, message: str, exc: Exception) -> None: + """Log an error using logfire if available, otherwise warnings. + + Args: + message: The error message. + exc: The exception that occurred. + """ + if self._logfire is not None: + self._logfire.error('{message}: {error}', message=message, error=str(exc), _exc_info=exc) + else: + warnings.warn(f'{message}: {exc}', category=RuntimeWarning) + + def _start_sse_listener(self): # pragma: no cover + """Start the SSE listener thread for real-time updates.""" + if self._sse_thread is not None and self._sse_thread.is_alive(): + return # Already running + + self._sse_thread = threading.Thread( + name='LogfireRemoteProviderSSE', + target=self._sse_listener, + daemon=True, + ) + self._sse_thread.start() + + def _sse_listener(self): # pragma: no cover + """Listen for SSE updates from the server and trigger refresh on events.""" + sse_url = urljoin(self._base_url, '/v1/variable-updates/') + reconnect_delay = 1.0 # Start with 1 second delay + max_reconnect_delay = 60.0 # Max 60 seconds between reconnects + + while not self._shutdown: + try: + # Use a separate session for SSE to avoid conflicts with polling + with Session() as sse_session: + sse_session.headers.update( + { + 'Authorization': f'bearer {self._token}', + 'User-Agent': UA_HEADER, + 'Accept': 'text/event-stream', + 'Cache-Control': 'no-cache', + } + ) + + # Open streaming connection + response = sse_session.get(sse_url, stream=True, timeout=(10, None)) + if response.status_code != 200: + # Server doesn't support SSE or auth failed, back off + self._sse_connected = False + self._wait_for_reconnect(reconnect_delay) + reconnect_delay = min(reconnect_delay * 2, max_reconnect_delay) + continue + + # Connected successfully, reset delay + self._sse_connected = True + reconnect_delay = 1.0 + + # Process SSE events + for line in response.iter_lines(decode_unicode=True): + if self._shutdown: + break + + if line is None: + continue + + line = line.strip() + if not line: + continue + + # SSE format: "data: {...json...}" + if line.startswith('data:'): + data_str = line[5:].strip() + try: + event_data = json.loads(data_str) + event_type = event_data.get('event') + # On any variable event, trigger a forced refresh + if event_type in ('created', 'updated', 'deleted'): + # Set flag to force refresh and wake up the worker + self._force_next_refresh = True + self._worker_awaken.set() + except (json.JSONDecodeError, TypeError): + # Invalid JSON, ignore + pass + + except Exception: + # Connection error, will retry + self._sse_connected = False + if not self._shutdown: + self._wait_for_reconnect(reconnect_delay) + reconnect_delay = min(reconnect_delay * 2, max_reconnect_delay) + + def _wait_for_reconnect(self, delay: float): # pragma: no cover + """Wait for a delay before reconnecting, checking for shutdown.""" + # Wait in small increments to allow quick shutdown + elapsed = 0.0 + while elapsed < delay and not self._shutdown: + wait_time = min(0.5, delay - elapsed) + threading.Event().wait(wait_time) + elapsed += wait_time + + def _worker(self): + while not self._shutdown: # pragma: no branch + # Note: Ideally we'd be able to terminate while the following request was going even if it takes a while, + # it's far more reasonable to terminate this worker thread "gracelessly" than an OTel exporter's. + # But given this is pretty unlikely to cause issues, Alex and I decided are okay leaving this as-is. + # We can change this if we run into issues, but it doesn't seem to be causing any now. + + # Check if SSE event requested a forced refresh + force = self._force_next_refresh + self._force_next_refresh = False + + self.refresh(force=force) + self._worker_awaken.clear() + self._worker_awaken.wait(self._polling_interval.total_seconds()) + if self._shutdown: # pragma: no branch + break + + def refresh(self, force: bool = False): + """Fetch the latest variable configuration from the remote API. + + Args: + force: If True, fetch configuration even if the polling interval hasn't elapsed. + """ + if self._refresh_lock.locked(): # pragma: no cover + # If we're already fetching, we'll get a new value, so no need to force + force = False + + # Note: Eventually we may want to rework the client and server implementations to use a NotModifiedResponse + # to reduce the amount of overhead from polling. We could also use a websocket/SSE to get real time updates + # when the user makes changes. + with self._refresh_lock: # Make at most one request at a time + if ( + not force + and self._last_fetched_at is not None + and self._last_fetched_at > datetime.now(tz=timezone.utc) - self._polling_interval + ): + return # nothing to do + + try: + variables_response = self._session.get(urljoin(self._base_url, '/v1/variables/')) + UnexpectedResponse.raise_for_status(variables_response) + variables_config_data = variables_response.json() + except Exception as e: + # Catch all request/HTTP/JSON exceptions (ConnectionError, Timeout, UnexpectedResponse, + # JSONDecodeError, etc.) to prevent crashing the user's application on failures. + self._log_error('Error retrieving variables', e) + return + + try: + self._config = VariablesConfig.model_validate(variables_config_data) + except ValidationError as e: + self._log_error('Failed to parse variables configuration from Logfire API', e) + finally: + self._has_attempted_fetch = True + + self._last_fetched_at = datetime.now(tz=timezone.utc) + + def get_serialized_value( + self, + variable_name: str, + targeting_key: str | None = None, + attributes: Mapping[str, Any] | None = None, + ) -> ResolvedVariable[str | None]: + """Resolve a variable's serialized value from the remote configuration. + + Args: + variable_name: The name of the variable to resolve. + targeting_key: Optional key for deterministic variant selection (e.g., user ID). + attributes: Optional attributes for condition-based targeting rules. + + Returns: + A ResolvedVariable containing the serialized value (or None if not found). + """ + if self._pid != os.getpid(): # pragma: no cover + self._reset_once.do_once(self._at_fork_reinit) + + if not self._has_attempted_fetch and self._block_before_first_fetch: + # Block while waiting for the request to be sent + self.refresh() + + if self._config is None: + return ResolvedVariable(name=variable_name, value=None, _reason='missing_config') + + return self._config.resolve_serialized_value(variable_name, targeting_key, attributes) + + def shutdown(self): + """Stop the background polling thread and clean up resources.""" + if self._shutdown: + return + self._shutdown = True + self._worker_awaken.set() + + # Join the threads so that resources get cleaned up in tests + # It might be reasonable to modify this so this _only_ happens in tests, but for now it seems fine. + if self._worker_thread is not None: + self._worker_thread.join(timeout=5) + if self._sse_thread is not None: + self._sse_thread.join(timeout=2) + + def get_variable_config(self, name: str) -> VariableConfig | None: + """Retrieve the full configuration for a variable from the cached config. + + This method supports alias-based lookup, so you can pass either the + variable's current name or any of its configured aliases. + + Args: + name: The name (or alias) of the variable. + + Returns: + The VariableConfig if found, or None if the variable doesn't exist. + """ + if self._config is None: + return None + return self._config._get_variable_config(name) # pyright: ignore[reportPrivateUsage] + + def get_all_variables_config(self) -> VariablesConfig: + """Retrieve all variable configurations from the cached config. + + Returns: + A VariablesConfig containing all variable configurations. + Returns an empty VariablesConfig if no config has been fetched yet. + """ + if self._config is None: + return VariablesConfig(variables={}) + return self._config + + def create_variable(self, config: VariableConfig) -> VariableConfig: + """Create a new variable configuration via the remote API. + + Args: + config: The configuration for the new variable. + + Returns: + The created VariableConfig. + + Raises: + VariableAlreadyExistsError: If a variable with this name already exists. + VariableWriteError: If the API request fails. + """ + body = self._config_to_api_body(config) + try: + response = self._session.post(urljoin(self._base_url, '/v1/variables/'), json=body) + if response.status_code == 409: + raise VariableAlreadyExistsError(f"Variable '{config.name}' already exists") + UnexpectedResponse.raise_for_status(response) + except UnexpectedResponse as e: + raise VariableWriteError(f'Failed to create variable: {e}') from e + + # Refresh cache after successful write + self.refresh(force=True) + return config + + def update_variable(self, name: str, config: VariableConfig) -> VariableConfig: + """Update an existing variable configuration via the remote API. + + Args: + name: The name of the variable to update. + config: The new configuration for the variable. + + Returns: + The updated VariableConfig. + + Raises: + VariableNotFoundError: If the variable does not exist. + VariableWriteError: If the API request fails. + """ + variants_to_send: dict[str, Any] | None = None + if self._config is not None: + existing = self._config.variables.get(name) + if existing is not None: + variants_to_send = {} + for key, variant in config.variants.items(): + existing_variant = existing.variants.get(key) + existing_description = existing_variant.description if existing_variant else None + new_description = variant.description + if ( + existing_variant is None + or existing_variant.serialized_value != variant.serialized_value + or existing_description != new_description + ): + variants_to_send[key] = variant + body = self._config_to_api_body(config, variants_override=variants_to_send) + try: + response = self._session.put(urljoin(self._base_url, f'/v1/variables/{name}/'), json=body) + if response.status_code == 404: + raise VariableNotFoundError(f"Variable '{name}' not found") + UnexpectedResponse.raise_for_status(response) + except UnexpectedResponse as e: + raise VariableWriteError(f'Failed to update variable: {e}') from e + + # Refresh cache after successful write + self.refresh(force=True) + return config + + def delete_variable(self, name: str) -> None: + """Delete a variable configuration via the remote API. + + Args: + name: The name of the variable to delete. + + Raises: + VariableNotFoundError: If the variable does not exist. + VariableWriteError: If the API request fails. + """ + try: + response = self._session.delete(urljoin(self._base_url, f'/v1/variables/{name}/')) + if response.status_code == 404: + raise VariableNotFoundError(f"Variable '{name}' not found") + UnexpectedResponse.raise_for_status(response) + except UnexpectedResponse as e: + raise VariableWriteError(f'Failed to delete variable: {e}') from e + + # Refresh cache after successful write + self.refresh(force=True) + + def _config_to_api_body( + self, config: VariableConfig, *, variants_override: dict[str, Any] | None = None + ) -> dict[str, Any]: + """Convert a VariableConfig to the API request body format. + + Args: + config: The VariableConfig to convert. + variants_override: Optional mapping of variants to send instead of all variants. + + Returns: + A dictionary suitable for the API request body. + """ + body: dict[str, Any] = {'name': config.name} + + # description and overrides are always required by the API + body['description'] = config.description + + if config.json_schema is not None: + body['json_schema'] = config.json_schema + + if variants_override is None: + body['variants'] = { + key: { + 'key': variant.key, + 'serialized_value': variant.serialized_value, + **({'description': variant.description} if variant.description else {}), + } + for key, variant in config.variants.items() + } + elif variants_override: + body['variants'] = { + key: { + 'key': variant.key, + 'serialized_value': variant.serialized_value, + **({'description': variant.description} if variant.description else {}), + } + for key, variant in variants_override.items() + } + + body['rollout'] = {'variants': config.rollout.variants} + + body['overrides'] = [ + { + 'conditions': [ + {'kind': cond.kind, 'attribute': cond.attribute, **self._condition_extra_fields(cond)} + for cond in override.conditions + ], + 'rollout': {'variants': override.rollout.variants}, + } + for override in config.overrides + ] + + # Include aliases if present + if config.aliases is not None: + body['aliases'] = config.aliases + + # Include example value if present + if config.example is not None: + body['example'] = config.example + + return body + + def _condition_extra_fields(self, condition: Any) -> dict[str, Any]: + """Extract extra fields from a condition based on its type. + + Args: + condition: The condition object. + + Returns: + A dictionary of extra fields for the condition. + """ + if hasattr(condition, 'value'): + return {'value': condition.value} + elif hasattr(condition, 'values'): + return {'values': list(condition.values)} + elif hasattr(condition, 'pattern'): + pattern = condition.pattern + return {'pattern': pattern.pattern if hasattr(pattern, 'pattern') else pattern} + return {} + + # --- Variable Types API --- + + def list_variable_types(self) -> dict[str, VariableTypeConfig]: + """List all variable types from the remote API. + + Returns: + A dictionary mapping type names to their configurations. + """ + from logfire.variables.config import VariableTypeConfig + + try: + response = self._session.get(urljoin(self._base_url, '/v1/variable-types/')) + UnexpectedResponse.raise_for_status(response) + except UnexpectedResponse as e: + raise VariableWriteError(f'Failed to list variable types: {e}') from e + + types_data = response.json() + result: dict[str, VariableTypeConfig] = {} + for type_data in types_data: + config = VariableTypeConfig( + name=type_data['name'], + json_schema=type_data.get('json_schema', {}), + description=type_data.get('description'), + source_hint=type_data.get('source_hint'), + ) + result[config.name] = config + return result + + def upsert_variable_type(self, config: VariableTypeConfig) -> VariableTypeConfig: + """Create or update a variable type via the remote API. + + If a type with the given name exists, it will be updated. + Otherwise, a new type will be created. + + Args: + config: The type configuration to upsert. + + Returns: + The created or updated VariableTypeConfig. + + Raises: + VariableWriteError: If the API request fails. + """ + body: dict[str, Any] = { + 'name': config.name, + 'json_schema': config.json_schema, + 'description': config.description, + } + if config.source_hint is not None: + body['source_hint'] = config.source_hint + + try: + # POST endpoint is an upsert (create or update by name) + response = self._session.post(urljoin(self._base_url, '/v1/variable-types/'), json=body) + UnexpectedResponse.raise_for_status(response) + except UnexpectedResponse as e: + raise VariableWriteError(f'Failed to upsert variable type: {e}') from e + + return config diff --git a/logfire/variables/variable.py b/logfire/variables/variable.py new file mode 100644 index 000000000..dd56760b8 --- /dev/null +++ b/logfire/variables/variable.py @@ -0,0 +1,503 @@ +from __future__ import annotations as _annotations + +import inspect +from collections.abc import Iterator, Mapping, Sequence +from contextlib import ExitStack, contextmanager +from contextvars import ContextVar +from dataclasses import dataclass, field, replace +from functools import lru_cache +from importlib.util import find_spec +from typing import TYPE_CHECKING, Any, Generic, Protocol, TypeVar + +from opentelemetry.trace import get_current_span +from pydantic import TypeAdapter, ValidationError +from typing_extensions import TypeIs + +if TYPE_CHECKING: + from logfire.variables.config import VariableConfig + +if find_spec('anyio') is not None: # pragma: no branch + # Use anyio for running sync functions on separate threads in an event loop if it is available + from anyio.to_thread import run_sync as to_thread +else: + from asyncio import to_thread # pragma: no cover + +import logfire +from logfire.variables.abstract import ResolvedVariable + +__all__ = ( + 'ResolveFunction', + 'is_resolve_function', + 'Variable', + 'targeting_context', +) + +T_co = TypeVar('T_co', covariant=True) + + +_VARIABLE_OVERRIDES: ContextVar[dict[str, Any] | None] = ContextVar('_VARIABLE_OVERRIDES', default=None) + +# Context var for explicit variant selection (bypasses rollout) +_VARIANT_OVERRIDES: ContextVar[dict[str, str] | None] = ContextVar('_VARIANT_OVERRIDES', default=None) + + +@dataclass +class _TargetingContextData: + """Internal data structure for targeting context.""" + + default: str | None = None + """Default targeting key for all variables.""" + by_variable: dict[str, str] = field(default_factory=dict[str, str]) + """Variable-specific targeting keys (variable name -> targeting key).""" + + +_TARGETING_CONTEXT: ContextVar[_TargetingContextData | None] = ContextVar('_TARGETING_CONTEXT', default=None) + + +class ResolveFunction(Protocol[T_co]): + """Protocol for functions that resolve variable values based on context.""" + + def __call__(self, targeting_key: str | None, attributes: Mapping[str, Any] | None) -> T_co: + """Resolve the variable value given a targeting key and attributes.""" + raise NotImplementedError + + +def is_resolve_function(f: Any) -> TypeIs[ResolveFunction[Any]]: + """Check if a callable matches the ResolveFunction signature. + + A resolve function is any callable that can be called with exactly two positional arguments + (targeting_key and attributes). This includes: + - Functions/lambdas with exactly 2 parameters + - Functions with 2+ parameters where all after the first 2 have defaults + - Functions with *args or **kwargs + + Args: + f: The object to check. + + Returns: + True if the callable can be invoked with two positional arguments. + """ + if not callable(f): + return False + try: + signature = inspect.signature(f) + except (ValueError, TypeError): + # Can't get signature (e.g., built-in), assume not a resolve function + return False + + params = list(signature.parameters.values()) + if not params: + return False + + # Count required positional parameters and check for *args + required_positional = 0 + has_var_positional = False + optional_positional = 0 + + for param in params: + if param.kind == inspect.Parameter.VAR_POSITIONAL: + has_var_positional = True + elif param.kind == inspect.Parameter.VAR_KEYWORD: + # **kwargs doesn't affect positional argument count + pass + elif param.kind in (inspect.Parameter.POSITIONAL_ONLY, inspect.Parameter.POSITIONAL_OR_KEYWORD): + if param.default is inspect.Parameter.empty: + required_positional += 1 + else: + optional_positional += 1 + elif param.kind == inspect.Parameter.KEYWORD_ONLY: + # Keyword-only params don't affect positional argument count + pass + + # Can be called with exactly 2 positional args if: + # - Has *args (can accept any number), OR + # - Required positional params <= 2 AND total positional params >= 2 + total_positional = required_positional + optional_positional + if has_var_positional: + return required_positional <= 2 + else: + return required_positional <= 2 and total_positional >= 2 + + +class Variable(Generic[T_co]): + """A managed variable that can be resolved dynamically based on configuration.""" + + name: str + """Unique name identifying this variable.""" + value_type: type[T_co] + """The expected type of this variable's values.""" + default: T_co | ResolveFunction[T_co] + """Default value or function to compute the default.""" + description: str | None + """Description of the variable.""" + + logfire_instance: logfire.Logfire + """The Logfire instance this variable is associated with.""" + + def __init__( + self, + name: str, + *, + type: type[T_co], + default: T_co | ResolveFunction[T_co], + description: str | None = None, + logfire_instance: logfire.Logfire, + ): + """Create a new managed variable. + + Args: + name: Unique name identifying this variable. + type: The expected type of this variable's values, used for validation. + default: Default value to use when no configuration is found, or a function + that computes the default based on targeting_key and attributes. + description: Optional human-readable description of what this variable controls. + logfire_instance: The Logfire instance this variable is associated with. Used to determine config, etc. + """ + self.name = name + self.value_type = type + self.default = default + self.description = description + + self.logfire_instance = logfire_instance.with_settings(custom_scope_suffix='variables') + self.type_adapter = TypeAdapter[T_co](type) + + # Create a cached deserialization function for this variable instance. + # Returns T | Exception to cache both successful deserializations and errors. + @lru_cache(maxsize=128) + def _deserialize_cached(serialized_value: str) -> T_co | Exception: + try: + return self.type_adapter.validate_json(serialized_value) + except Exception as e: + return e + + self._deserialize_cached = _deserialize_cached + + @contextmanager + def override(self, value: T_co | ResolveFunction[T_co]) -> Iterator[None]: + """Context manager to temporarily override this variable's value. + + Args: + value: The value to use within this context, or a function that computes + the value based on targeting_key and attributes. + """ + current = _VARIABLE_OVERRIDES.get() or {} + token = _VARIABLE_OVERRIDES.set({**current, self.name: value}) + try: + yield + finally: + _VARIABLE_OVERRIDES.reset(token) + + @contextmanager + def use_variant(self, variant_key: str) -> Iterator[None]: + """Context manager to select a specific variant, bypassing rollout weights. + + This allows you to explicitly select a configured variant by key, regardless of + the rollout configuration. Useful for testing specific variants or for playground + scenarios where you want to preview a particular variant. + + Args: + variant_key: The key of the variant to select. If the variant doesn't exist + in the configuration, resolution will fall back to the default behavior. + + Example: + ```python skip="true" + # Select the "experimental" variant for all resolutions within this context + with my_variable.use_variant('experimental'): + value = my_variable.get().value # Always gets "experimental" variant + ``` + """ + current = _VARIANT_OVERRIDES.get() or {} + token = _VARIANT_OVERRIDES.set({**current, self.name: variant_key}) + try: + yield + finally: + _VARIANT_OVERRIDES.reset(token) + + async def refresh(self, force: bool = False): + """Asynchronously refresh the variable.""" + await to_thread(self.refresh_sync, force) + + def refresh_sync(self, force: bool = False): + """Synchronously refresh the variable.""" + self.logfire_instance.config.get_variable_provider().refresh(force=force) + + def get( + self, + targeting_key: str | None = None, + attributes: Mapping[str, Any] | None = None, + *, + variant: str | None = None, + ) -> ResolvedVariable[T_co]: + """Resolve the variable and return full details including variant and any errors. + + Args: + targeting_key: Optional key for deterministic variant selection (e.g., user ID). + If not provided, falls back to contextvar targeting key (set via targeting_context), + then to the current trace ID if there is an active trace. + attributes: Optional attributes for condition-based targeting rules. + variant: Optional explicit variant key to select. If provided, bypasses rollout + weights and targeting, directly selecting the specified variant. If the variant + doesn't exist in the configuration, falls back to default resolution. + + Returns: + A ResolvedVariable object containing the resolved value, selected variant, + and any errors that occurred. + """ + # Check for variant override from context if not specified at call-site + if variant is None: + variant = _get_contextvar_variant_override(self.name) + merged_attributes = self._get_merged_attributes(attributes) + + # Targeting key resolution: call-site > contextvar > trace_id + if targeting_key is None: + targeting_key = _get_contextvar_targeting_key(self.name) + + if targeting_key is None and (current_trace_id := get_current_span().get_span_context().trace_id): + # If there is no active trace, the current_trace_id will be zero + targeting_key = f'trace_id:{current_trace_id:032x}' + + # Include the variable name directly here to make the span name more useful, + # it'll still be low cardinality. This also prevents it from being scrubbed from the message. + # Don't inline the f-string to avoid f-string magic. + span_name = f'Resolve variable {self.name}' + with ExitStack() as stack: + span: logfire.LogfireSpan | None = None + if self.logfire_instance.config.variables.instrument: + span = stack.enter_context( + self.logfire_instance.span( + span_name, + name=self.name, + targeting_key=targeting_key, + attributes=merged_attributes, + ) + ) + result = self._resolve(targeting_key, merged_attributes, span, variant) + if span is not None: + # Serialize value safely for OTel span attributes, which only support primitives. + # Try to JSON serialize the value; if that fails, fall back to string representation. + try: + serialized_value = self.type_adapter.dump_json(result.value).decode('utf-8') + except Exception: + serialized_value = repr(result.value) + span.set_attributes( + { + 'name': result.name, + 'value': serialized_value, + 'variant': result.variant, + 'reason': result._reason, # pyright: ignore[reportPrivateUsage] + } + ) + if result.exception: + span.record_exception( + result.exception, + ) + return result + + def _resolve( + self, + targeting_key: str | None, + attributes: Mapping[str, Any] | None, + span: logfire.LogfireSpan | None, + variant: str | None = None, + ) -> ResolvedVariable[T_co]: + serialized_result: ResolvedVariable[str | None] | None = None + try: + if (context_overrides := _VARIABLE_OVERRIDES.get()) is not None and self.name in context_overrides: + context_value = context_overrides[self.name] + if is_resolve_function(context_value): + context_value = context_value(targeting_key, attributes) + return ResolvedVariable(name=self.name, value=context_value, _reason='context_override') + + provider = self.logfire_instance.config.get_variable_provider() + + # If explicit variant is requested, try to get that specific variant + if variant is not None: + serialized_result = provider.get_serialized_value_for_variant(self.name, variant) + if serialized_result.value is not None: + # Successfully got the explicit variant + value_or_exc = self._deserialize_cached(serialized_result.value) + if isinstance(value_or_exc, Exception): + if span: # pragma: no branch + span.set_attribute('invalid_serialized_variant', serialized_result.variant) + span.set_attribute('invalid_serialized_value', serialized_result.value) + default = self._get_default(targeting_key, attributes) + reason: str = 'validation_error' if isinstance(value_or_exc, ValidationError) else 'other_error' + return ResolvedVariable(name=self.name, value=default, exception=value_or_exc, _reason=reason) + return ResolvedVariable( + name=self.name, value=value_or_exc, variant=serialized_result.variant, _reason='resolved' + ) + # Variant not found - fall through to default resolution + + serialized_result = provider.get_serialized_value(self.name, targeting_key, attributes) + + if serialized_result.value is None: + default = self._get_default(targeting_key, attributes) + return _with_value(serialized_result, default) + + # Use cached deserialization - returns T | Exception + value_or_exc = self._deserialize_cached(serialized_result.value) + if isinstance(value_or_exc, Exception): + if span: # pragma: no branch + span.set_attribute('invalid_serialized_variant', serialized_result.variant) + span.set_attribute('invalid_serialized_value', serialized_result.value) + default = self._get_default(targeting_key, attributes) + reason: str = 'validation_error' if isinstance(value_or_exc, ValidationError) else 'other_error' + return ResolvedVariable(name=self.name, value=default, exception=value_or_exc, _reason=reason) + + return ResolvedVariable( + name=self.name, value=value_or_exc, variant=serialized_result.variant, _reason='resolved' + ) + + except Exception as e: + if span and serialized_result is not None: # pragma: no cover + span.set_attribute('invalid_serialized_variant', serialized_result.variant) + span.set_attribute('invalid_serialized_value', serialized_result.value) + default = self._get_default(targeting_key, attributes) + return ResolvedVariable(name=self.name, value=default, exception=e, _reason='other_error') + + def _get_default( + self, targeting_key: str | None = None, merged_attributes: Mapping[str, Any] | None = None + ) -> T_co: + if is_resolve_function(self.default): + return self.default(targeting_key, merged_attributes) + else: + return self.default + + def _get_merged_attributes(self, attributes: Mapping[str, Any] | None = None) -> Mapping[str, Any]: + result = dict(attributes) if attributes else {} + variables_options = self.logfire_instance.config.variables + if variables_options.include_baggage_in_context: + result.update(logfire.get_baggage()) + if variables_options.include_resource_attributes_in_context: + result.update(self.logfire_instance.resource_attributes) + return result + + def to_config(self) -> VariableConfig: + """Create a VariableConfig from this Variable instance. + + This creates a minimal config with just the name, schema, and example. + No variants are created - use this to generate a template config that can be edited. + + Returns: + A VariableConfig with minimal configuration. + """ + from logfire.variables.config import Rollout, VariableConfig + + # Get JSON schema from the type adapter + json_schema = self.type_adapter.json_schema() + + # Get the serialized default value as an example (if not a function) + example: str | None = None + if not is_resolve_function(self.default): + example = self.type_adapter.dump_json(self.default).decode('utf-8') + + return VariableConfig( + name=self.name, + description=self.description, + variants={}, + rollout=Rollout(variants={}), + overrides=[], + json_schema=json_schema, + example=example, + ) + + +def _with_value(details: ResolvedVariable[Any], new_value: T_co) -> ResolvedVariable[T_co]: + """Return a copy of the provided resolution details, just with a different value. + + Args: + details: Existing resolution details to modify. + new_value: The new value to use. + + Returns: + A new ResolvedVariable with the given value. + """ + return replace(details, value=new_value) + + +@contextmanager +def targeting_context( + targeting_key: str, + variables: Sequence[Variable[Any]] | None = None, +) -> Iterator[None]: + """Set the targeting key for variable resolution within this context. + + The targeting key is used for deterministic variant selection - the same targeting key + will always resolve to the same variant for a given variable configuration. + + Args: + targeting_key: The targeting key to use for deterministic variant selection + (e.g., user ID, organization ID). + variables: If provided, only apply this targeting key to these specific variables. + If not provided, this becomes the default targeting key for all variables. + + Variable-specific targeting always takes precedence over the default, regardless + of nesting order. Call-site explicit targeting_key still wins over everything. + + Example: + # Set default targeting for all variables + with targeting_context("user123"): + value = my_variable.get() # uses "user123" + + # Set targeting for specific variables + with targeting_context("org456", variables=[org_variable]): + org_value = org_variable.get() # uses "org456" + other_value = other_variable.get() # uses default or trace_id + + # Combine default and specific - order doesn't matter for precedence + with targeting_context("user123"): + with targeting_context("org456", variables=[org_variable]): + org_value = org_variable.get() # uses "org456" (specific wins) + other_value = other_variable.get() # uses "user123" (default) + """ + current = _TARGETING_CONTEXT.get() + + # Build new context by merging with current + new_data = _TargetingContextData( + default=current.default if current else None, + by_variable=dict(current.by_variable) if current else {}, + ) + + if variables is None: + new_data.default = targeting_key + else: + for var in variables: + new_data.by_variable[var.name] = targeting_key + + token = _TARGETING_CONTEXT.set(new_data) + try: + yield + finally: + _TARGETING_CONTEXT.reset(token) + + +def _get_contextvar_targeting_key(variable_name: str) -> str | None: + """Get the targeting key from context for a specific variable. + + Args: + variable_name: The name of the variable to get the targeting key for. + + Returns: + The targeting key if one is set in context, None otherwise. + Variable-specific targeting takes precedence over the default. + """ + ctx = _TARGETING_CONTEXT.get() + if ctx is None: + return None + # Variable-specific takes precedence over default + return ctx.by_variable.get(variable_name, ctx.default) + + +def _get_contextvar_variant_override(variable_name: str) -> str | None: + """Get the variant override from context for a specific variable. + + Args: + variable_name: The name of the variable to get the variant override for. + + Returns: + The variant key if one is set in context, None otherwise. + """ + ctx = _VARIANT_OVERRIDES.get() + if ctx is None: + return None + return ctx.get(variable_name) diff --git a/mkdocs.yml b/mkdocs.yml index 9c5d6ea0f..04713f4d5 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -198,6 +198,7 @@ nav: - Reference: - SQL: reference/sql.md - Advanced: + - Managed Variables: reference/advanced/managed-variables.md - Baggage: reference/advanced/baggage.md - Generators: reference/advanced/generators.md - Testing Logfire Instrumentation: reference/advanced/testing.md diff --git a/pyproject.toml b/pyproject.toml index b966a02b7..62c4536fd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -83,6 +83,7 @@ aws-lambda = ["opentelemetry-instrumentation-aws-lambda >= 0.42b0"] google-genai = ["opentelemetry-instrumentation-google-genai >= 0.4b0"] litellm = ["openinference-instrumentation-litellm >= 0"] dspy = ["openinference-instrumentation-dspy >= 0"] +variables = ["pydantic>=2"] [project.urls] Homepage = "https://logfire.pydantic.dev/" diff --git a/tests/otel_integrations/test_openai.py b/tests/otel_integrations/test_openai.py index ef52853d0..05b180e8b 100644 --- a/tests/otel_integrations/test_openai.py +++ b/tests/otel_integrations/test_openai.py @@ -2370,10 +2370,10 @@ def test_dont_suppress_httpx(exporter: TestExporter) -> None: 'http.status_code': 200, 'net.peer.name': 'api.openai.com', }, - 'total': IsNumeric, + 'total': IsNumeric(), } ], - 'total': IsNumeric, + 'total': IsNumeric(), }, 'http.client.request.duration': { 'details': [ diff --git a/tests/otel_integrations/test_requests.py b/tests/otel_integrations/test_requests.py index db643ac91..10ddb4f91 100644 --- a/tests/otel_integrations/test_requests.py +++ b/tests/otel_integrations/test_requests.py @@ -6,7 +6,7 @@ import pytest import requests -from dirty_equals import IsFloat, IsStr +from dirty_equals import IsFloat, IsNumeric, IsStr from inline_snapshot import snapshot from opentelemetry.instrumentation.requests import RequestsInstrumentor @@ -79,10 +79,10 @@ async def test_requests_instrumentation(exporter: TestExporter): 'net.peer.name': 'example.org', 'net.peer.port': 8080, }, - 'total': 0, + 'total': IsNumeric(), } ], - 'total': 0, + 'total': IsNumeric(), }, 'http.client.request.duration': { 'details': [ @@ -127,10 +127,10 @@ async def test_requests_instrumentation(exporter: TestExporter): 'net.peer.name': 'example.org', 'net.peer.port': 8080, }, - 'total': 0, + 'total': IsNumeric(), } ], - 'total': 0, + 'total': IsNumeric(), }, 'http.client.request.duration': { 'details': [ diff --git a/tests/test_configure.py b/tests/test_configure.py index 31b9b41d5..a980642ab 100644 --- a/tests/test_configure.py +++ b/tests/test_configure.py @@ -3,6 +3,7 @@ import dataclasses import json import os +import pickle import sys import threading from collections.abc import Iterable, Sequence @@ -52,6 +53,7 @@ ConsoleOptions, LogfireConfig, LogfireCredentials, + RemoteVariablesConfig, get_base_url_from_token, sanitize_project_name, ) @@ -841,42 +843,54 @@ def test_config_serializable(): they get serialized to dicts (which dataclasses.asdict does automatically), and deserialized back to dataclasses (which we have to do manually). """ - logfire.configure( - send_to_logfire=False, - console=logfire.ConsoleOptions(verbose=True), - sampling=logfire.SamplingOptions(), - scrubbing=logfire.ScrubbingOptions(), - code_source=logfire.CodeSource(repository='https://github.com/pydantic/logfire', revision='main'), - advanced=logfire.AdvancedOptions(id_generator=SeededRandomIdGenerator(seed=42)), - ) - - for field in dataclasses.fields(GLOBAL_CONFIG): - # Check that the full set of dataclass fields is known. - # If a new field appears here, make sure it gets deserialized properly in configure, and tested here. - assert dataclasses.is_dataclass(getattr(GLOBAL_CONFIG, field.name)) == ( - field.name in ['console', 'sampling', 'scrubbing', 'advanced', 'code_source'] + # Mock the remote variables endpoint to prevent real network requests + with requests_mock.Mocker() as m: + m.get(requests_mock.ANY, json={'variables': {}, 'aliases': None}) + + logfire.configure( + send_to_logfire=False, + console=logfire.ConsoleOptions(verbose=True), + sampling=logfire.SamplingOptions(), + scrubbing=logfire.ScrubbingOptions(), + code_source=logfire.CodeSource(repository='https://github.com/pydantic/logfire', revision='main'), + variables=logfire.VariablesOptions( + config=RemoteVariablesConfig(block_before_first_resolve=False, api_key='test_api_key'), + include_baggage_in_context=False, + ), + advanced=logfire.AdvancedOptions(id_generator=SeededRandomIdGenerator(seed=42)), ) - serialized = serialize_config() - assert serialized is not None # Config should be picklable in this test - GLOBAL_CONFIG._initialized = False # type: ignore # ensure deserialize_config actually configures - deserialize_config(serialized) - serialized2 = serialize_config() - assert serialized2 is not None # Config should be picklable in this test - - def normalize(s: dict[str, Any]) -> dict[str, Any]: - for value in s.values(): - assert not dataclasses.is_dataclass(value) - return s - - assert normalize(serialized) == normalize(serialized2) + for field in dataclasses.fields(GLOBAL_CONFIG): + # Check that the full set of dataclass fields is known. + # If a new field appears here, make sure it gets deserialized properly in configure, and tested here. + assert dataclasses.is_dataclass(getattr(GLOBAL_CONFIG, field.name)) == ( + field.name in ['console', 'sampling', 'scrubbing', 'advanced', 'code_source', 'variables'] + ) - assert isinstance(GLOBAL_CONFIG.console, logfire.ConsoleOptions) - assert isinstance(GLOBAL_CONFIG.sampling, logfire.SamplingOptions) - assert isinstance(GLOBAL_CONFIG.scrubbing, logfire.ScrubbingOptions) - assert isinstance(GLOBAL_CONFIG.advanced, logfire.AdvancedOptions) - assert isinstance(GLOBAL_CONFIG.advanced.id_generator, SeededRandomIdGenerator) - assert GLOBAL_CONFIG.advanced.id_generator.seed == 42 + serialized = serialize_config() + assert serialized is not None # Config should be picklable in this test + GLOBAL_CONFIG._initialized = False # type: ignore # ensure deserialize_config actually configures + deserialize_config(pickle.loads(pickle.dumps(serialized))) + serialized2 = pickle.loads(pickle.dumps(serialize_config())) + assert serialized2 is not None # Config should be picklable in this test + + def normalize(s: dict[str, Any]) -> dict[str, Any]: + for value in s.values(): + assert not dataclasses.is_dataclass(value) + return s + + assert normalize(serialized) == normalize(serialized2) + + assert isinstance(GLOBAL_CONFIG.console, logfire.ConsoleOptions) + assert isinstance(GLOBAL_CONFIG.sampling, logfire.SamplingOptions) + assert isinstance(GLOBAL_CONFIG.scrubbing, logfire.ScrubbingOptions) + assert isinstance(GLOBAL_CONFIG.advanced, logfire.AdvancedOptions) + assert isinstance(GLOBAL_CONFIG.advanced.id_generator, SeededRandomIdGenerator) + assert isinstance(GLOBAL_CONFIG.variables, logfire.VariablesOptions) + assert GLOBAL_CONFIG.advanced.id_generator.seed == 42 + + # Clean up the remote variable provider to stop the background thread + logfire.configure(send_to_logfire=False) def test_config_serializable_console_false(): diff --git a/tests/test_logfire_api.py b/tests/test_logfire_api.py index c0d5b65c7..8117e973d 100644 --- a/tests/test_logfire_api.py +++ b/tests/test_logfire_api.py @@ -12,6 +12,7 @@ from pydantic import __version__ as pydantic_version from logfire._internal.utils import get_version +from logfire.variables import VariablesConfig pydantic_pre_2_5 = get_version(pydantic_version) < get_version('2.5.0') @@ -128,6 +129,42 @@ def test_runtime(logfire_api_factory: Callable[[], ModuleType], module_name: str logfire_api.ConsoleOptions(colors='auto') logfire__all__.remove('ConsoleOptions') + assert hasattr(logfire_api, 'VariablesOptions') + logfire_api.VariablesOptions() + logfire__all__.remove('VariablesOptions') + + assert hasattr(logfire_api, 'var') + logfire_api.var(name='test_var', default='default', type=str) + logfire__all__.remove('var') + + assert hasattr(logfire_api, 'variables_get') + logfire_api.variables_get() + logfire__all__.remove('variables_get') + + assert hasattr(logfire_api, 'variables_push') + logfire_api.variables_push([]) + logfire__all__.remove('variables_push') + + assert hasattr(logfire_api, 'variables_push_types') + logfire_api.variables_push_types([int]) + logfire__all__.remove('variables_push_types') + + assert hasattr(logfire_api, 'variables_validate') + logfire_api.variables_validate([]) + logfire__all__.remove('variables_validate') + + assert hasattr(logfire_api, 'variables_push_config') + logfire_api.variables_push_config(VariablesConfig(variables={})) + logfire__all__.remove('variables_push_config') + + assert hasattr(logfire_api, 'variables_pull_config') + logfire_api.variables_pull_config() + logfire__all__.remove('variables_pull_config') + + assert hasattr(logfire_api, 'variables_build_config') + logfire_api.variables_build_config() + logfire__all__.remove('variables_build_config') + assert hasattr(logfire_api, 'PydanticPlugin') logfire_api.PydanticPlugin() logfire__all__.remove('PydanticPlugin') @@ -289,6 +326,10 @@ def func() -> None: ... pass logfire__all__.remove('attach_context') + # logfire.variables is a submodule, not a function - just verify it exists + assert hasattr(logfire_api, 'variables') + logfire__all__.remove('variables') + # If it's not empty, it means that some of the __all__ members are not tested. assert logfire__all__ == set(), logfire__all__ diff --git a/tests/test_push_variables.py b/tests/test_push_variables.py new file mode 100644 index 000000000..1d74f472e --- /dev/null +++ b/tests/test_push_variables.py @@ -0,0 +1,442 @@ +"""Tests for the push_variables functionality.""" + +# pyright: reportPrivateUsage=false +from __future__ import annotations + +from dataclasses import dataclass +from typing import Any + +import pytest + +import logfire +from logfire.variables.abstract import ( + ValidationReport, + VariableChange, + VariableDiff, + VariantValidationError, + _check_variant_compatibility, + _compute_diff, + _format_diff, + _get_default_serialized, + _get_json_schema, +) +from logfire.variables.config import Rollout, VariableConfig, VariablesConfig, Variant +from logfire.variables.variable import Variable + + +@dataclass +class MockLogfire: + """Mock Logfire instance for testing.""" + + config: Any = None + + def with_settings(self, **kwargs: Any) -> MockLogfire: + """Return self for chaining.""" + return self + + +@pytest.fixture +def mock_logfire_instance() -> MockLogfire: + """Create a mock Logfire instance.""" + return MockLogfire() + + +def test_get_json_schema_bool(mock_logfire_instance: MockLogfire) -> None: + """Test JSON schema generation for boolean type.""" + var = Variable[bool]( + name='test_bool', + default=False, + type=bool, + logfire_instance=mock_logfire_instance, # type: ignore + ) + schema = _get_json_schema(var) + assert schema == {'type': 'boolean'} + + +def test_get_json_schema_int(mock_logfire_instance: MockLogfire) -> None: + """Test JSON schema generation for integer type.""" + var = Variable[int]( + name='test_int', + default=42, + type=int, + logfire_instance=mock_logfire_instance, # type: ignore + ) + schema = _get_json_schema(var) + assert schema == {'type': 'integer'} + + +def test_get_json_schema_str(mock_logfire_instance: MockLogfire) -> None: + """Test JSON schema generation for string type.""" + var = Variable[str]( + name='test_str', + default='hello', + type=str, + logfire_instance=mock_logfire_instance, # type: ignore + ) + schema = _get_json_schema(var) + assert schema == {'type': 'string'} + + +def test_get_default_serialized_static(mock_logfire_instance: MockLogfire) -> None: + """Test serialization of static default values.""" + var = Variable[int]( + name='test', + default=42, + type=int, + logfire_instance=mock_logfire_instance, # type: ignore + ) + serialized = _get_default_serialized(var) + assert serialized == '42' + + +def test_get_default_serialized_bool(mock_logfire_instance: MockLogfire) -> None: + """Test serialization of boolean default values.""" + var = Variable[bool]( + name='test', + default=True, + type=bool, + logfire_instance=mock_logfire_instance, # type: ignore + ) + serialized = _get_default_serialized(var) + assert serialized == 'true' + + +def test_get_default_serialized_function(mock_logfire_instance: MockLogfire) -> None: + """Test that function defaults return None.""" + var = Variable[int]( + name='test', + default=lambda targeting_key, attributes: 10, + type=int, + logfire_instance=mock_logfire_instance, # type: ignore + ) + serialized = _get_default_serialized(var) + assert serialized is None + + +def test_check_variant_compatibility_valid(mock_logfire_instance: MockLogfire) -> None: + """Test variant compatibility check with valid value.""" + var = Variable[int]( + name='test', + default=0, + type=int, + logfire_instance=mock_logfire_instance, # type: ignore + ) + result = _check_variant_compatibility(var, 'test-variant', '42') + assert result.is_compatible is True + assert result.error is None + + +def test_check_variant_compatibility_invalid(mock_logfire_instance: MockLogfire) -> None: + """Test variant compatibility check with invalid value.""" + var = Variable[int]( + name='test', + default=0, + type=int, + logfire_instance=mock_logfire_instance, # type: ignore + ) + result = _check_variant_compatibility(var, 'test-variant', '"not an int"') + assert result.is_compatible is False + assert result.error is not None + + +def test_compute_diff_new_variable(mock_logfire_instance: MockLogfire) -> None: + """Test diff computation for a new variable.""" + var = Variable[bool]( + name='new_feature', + default=False, + type=bool, + logfire_instance=mock_logfire_instance, # type: ignore + ) + server_config = VariablesConfig(variables={}) + + diff = _compute_diff([var], server_config) + + assert len(diff.changes) == 1 + assert diff.changes[0].name == 'new_feature' + assert diff.changes[0].change_type == 'create' + assert diff.changes[0].initial_variant_value == 'false' + assert diff.has_changes is True + + +def test_compute_diff_no_change(mock_logfire_instance: MockLogfire) -> None: + """Test diff computation when variable exists with same schema.""" + var = Variable[bool]( + name='existing_feature', + default=False, + type=bool, + logfire_instance=mock_logfire_instance, # type: ignore + ) + server_config = VariablesConfig( + variables={ + 'existing_feature': VariableConfig( + name='existing_feature', + json_schema={'type': 'boolean'}, + variants={}, + rollout=Rollout(variants={}), + overrides=[], + ) + } + ) + + diff = _compute_diff([var], server_config) + + assert len(diff.changes) == 1 + assert diff.changes[0].name == 'existing_feature' + assert diff.changes[0].change_type == 'no_change' + assert diff.has_changes is False + + +def test_compute_diff_schema_change(mock_logfire_instance: MockLogfire) -> None: + """Test diff computation when schema has changed.""" + var = Variable[int]( + name='config_value', + default=10, + type=int, + logfire_instance=mock_logfire_instance, # type: ignore + ) + server_config = VariablesConfig( + variables={ + 'config_value': VariableConfig( + name='config_value', + json_schema={'type': 'string'}, # Was string, now int + variants={ + 'default': Variant(key='default', serialized_value='"hello"'), + }, + rollout=Rollout(variants={'default': 1.0}), + overrides=[], + ) + } + ) + + diff = _compute_diff([var], server_config) + + assert len(diff.changes) == 1 + assert diff.changes[0].name == 'config_value' + assert diff.changes[0].change_type == 'update_schema' + assert diff.changes[0].incompatible_variants is not None + assert len(diff.changes[0].incompatible_variants) == 1 + assert diff.has_changes is True + + +def test_compute_diff_orphaned_variables(mock_logfire_instance: MockLogfire) -> None: + """Test detection of orphaned server variables.""" + var = Variable[bool]( + name='my_feature', + default=False, + type=bool, + logfire_instance=mock_logfire_instance, # type: ignore + ) + server_config = VariablesConfig( + variables={ + 'my_feature': VariableConfig( + name='my_feature', + json_schema={'type': 'boolean'}, + variants={}, + rollout=Rollout(variants={}), + overrides=[], + ), + 'orphan_feature': VariableConfig( + name='orphan_feature', + json_schema={'type': 'boolean'}, + variants={}, + rollout=Rollout(variants={}), + overrides=[], + ), + } + ) + + diff = _compute_diff([var], server_config) + + assert 'orphan_feature' in diff.orphaned_server_variables + assert 'my_feature' not in diff.orphaned_server_variables + + +def test_format_diff_creates() -> None: + """Test diff formatting for creates.""" + diff = VariableDiff( + changes=[ + VariableChange( + name='new_feature', + change_type='create', + local_schema={'type': 'boolean'}, + initial_variant_value='false', + ) + ], + orphaned_server_variables=[], + ) + output = _format_diff(diff) + assert 'CREATE' in output + assert 'new_feature' in output + + +def test_format_diff_updates() -> None: + """Test diff formatting for updates.""" + diff = VariableDiff( + changes=[ + VariableChange( + name='updated_feature', + change_type='update_schema', + local_schema={'type': 'integer'}, + server_schema={'type': 'string'}, + ) + ], + orphaned_server_variables=[], + ) + output = _format_diff(diff) + assert 'UPDATE' in output + assert 'updated_feature' in output + + +def test_variable_diff_has_changes_true() -> None: + """Test has_changes when there are changes.""" + diff = VariableDiff( + changes=[ + VariableChange(name='test', change_type='create'), + ], + orphaned_server_variables=[], + ) + assert diff.has_changes is True + + +def test_variable_diff_has_changes_false() -> None: + """Test has_changes when there are no changes.""" + diff = VariableDiff( + changes=[ + VariableChange(name='test', change_type='no_change'), + ], + orphaned_server_variables=[], + ) + assert diff.has_changes is False + + +def test_push_variables_no_variables() -> None: + """Test push_variables with no variables.""" + # Use an explicit empty list to avoid picking up variables from the global DEFAULT_LOGFIRE_INSTANCE + result = logfire.variables_push([]) + assert result is False + + +def test_var_registers_variable() -> None: + """Test that var() registers variables with the logfire instance.""" + from logfire._internal.main import Logfire + + lf = Logfire() + assert lf.variables_get() == [] + + var1 = lf.var(name='test_var_1', default=True, type=bool) + assert len(lf.variables_get()) == 1 + assert lf.variables_get()[0] is var1 + + var2 = lf.var(name='test_var_2', default=42, type=int) + assert len(lf.variables_get()) == 2 + assert var2 in lf.variables_get() + + +def test_get_variables_returns_all_registered() -> None: + """Test that get_variables returns all registered variables.""" + from logfire._internal.main import Logfire + + lf = Logfire() + var1 = lf.var(name='feature_a', default=False, type=bool) + var2 = lf.var(name='feature_b', default='hello', type=str) + var3 = lf.var(name='feature_c', default=100, type=int) + + variables = lf.variables_get() + assert len(variables) == 3 + assert var1 in variables + assert var2 in variables + assert var3 in variables + + +# --- Validation tests --- + + +def test_validation_report_is_valid_false_with_errors() -> None: + """Test is_valid when there are validation errors.""" + report = ValidationReport( + errors=[ + VariantValidationError( + variable_name='test', + variant_key='default', + error=ValueError('invalid'), + ) + ], + variables_checked=1, + variables_not_on_server=[], + description_differences=[], + ) + assert not report.is_valid + + +def test_validation_report_is_valid_false_with_missing() -> None: + """Test is_valid when there are missing variables.""" + report = ValidationReport( + errors=[], + variables_checked=1, + variables_not_on_server=['missing-var'], + description_differences=[], + ) + assert not report.is_valid + + +def test_validation_report_is_valid_true() -> None: + """Test is_valid when there are no errors.""" + report = ValidationReport( + errors=[], + variables_checked=2, + variables_not_on_server=[], + description_differences=[], + ) + assert report.is_valid + + +def test_format_validation_report_with_errors() -> None: + """Test validation report formatting with errors.""" + report = ValidationReport( + errors=[ + VariantValidationError( + variable_name='my_feature', + variant_key='default', + error=ValueError('value is not valid'), + ) + ], + variables_checked=1, + variables_not_on_server=[], + description_differences=[], + ) + output = report.format() + assert 'Validation Errors' in output + assert 'my_feature' in output + assert 'default' in output + + +def test_format_validation_report_with_missing() -> None: + """Test validation report formatting with missing variables.""" + report = ValidationReport( + errors=[], + variables_checked=2, + variables_not_on_server=['missing-feature'], + description_differences=[], + ) + output = report.format() + assert 'Not Found on Server' in output + assert 'missing-feature' in output + + +def test_format_validation_report_all_valid() -> None: + """Test validation report formatting when all valid.""" + report = ValidationReport( + errors=[], + variables_checked=3, + variables_not_on_server=[], + description_differences=[], + ) + output = report.format() + assert 'Valid (3 variables)' in output + + +def test_validate_variables_no_variables() -> None: + """Test validate_variables with no variables.""" + # Use an explicit empty list to avoid picking up variables from the global DEFAULT_LOGFIRE_INSTANCE + result = logfire.variables_validate([]) + assert result.errors == [] # No variables to validate means no errors diff --git a/tests/test_variables.py b/tests/test_variables.py new file mode 100644 index 000000000..4537bff5e --- /dev/null +++ b/tests/test_variables.py @@ -0,0 +1,3439 @@ +"""Tests for managed variables.""" +# pyright: reportPrivateUsage=false + +from __future__ import annotations + +import time +import warnings +from collections.abc import Mapping +from datetime import timedelta +from typing import Any + +import pytest +import requests_mock as requests_mock_module +from pydantic import BaseModel, ValidationError + +import logfire +from logfire._internal.config import RemoteVariablesConfig, VariablesOptions +from logfire.testing import TestExporter +from logfire.variables.abstract import NoOpVariableProvider, ResolvedVariable, VariableProvider +from logfire.variables.config import ( + KeyIsNotPresent, + KeyIsPresent, + Rollout, + RolloutOverride, + ValueDoesNotEqual, + ValueDoesNotMatchRegex, + ValueEquals, + ValueIsIn, + ValueIsNotIn, + ValueMatchesRegex, + VariableConfig, + VariablesConfig, + Variant, +) +from logfire.variables.local import LocalVariableProvider +from logfire.variables.remote import LogfireRemoteVariableProvider +from logfire.variables.variable import is_resolve_function + +# ============================================================================= +# Test Condition Classes +# ============================================================================= + + +class TestValueEquals: + def test_matches_when_equal(self): + condition = ValueEquals(attribute='plan', value='enterprise') + assert condition.matches({'plan': 'enterprise'}) is True + + def test_no_match_when_different(self): + condition = ValueEquals(attribute='plan', value='enterprise') + assert condition.matches({'plan': 'free'}) is False + + def test_no_match_when_missing(self): + condition = ValueEquals(attribute='plan', value='enterprise') + assert condition.matches({}) is False + + def test_kind_discriminator(self): + condition = ValueEquals(attribute='plan', value='enterprise') + assert condition.kind == 'value-equals' + + +class TestValueDoesNotEqual: + def test_matches_when_different(self): + condition = ValueDoesNotEqual(attribute='plan', value='enterprise') + assert condition.matches({'plan': 'free'}) is True + + def test_no_match_when_equal(self): + condition = ValueDoesNotEqual(attribute='plan', value='enterprise') + assert condition.matches({'plan': 'enterprise'}) is False + + def test_matches_when_missing(self): + # When missing, uses object() sentinel which won't equal any value + condition = ValueDoesNotEqual(attribute='plan', value='enterprise') + assert condition.matches({}) is True + + def test_kind_discriminator(self): + condition = ValueDoesNotEqual(attribute='plan', value='enterprise') + assert condition.kind == 'value-does-not-equal' + + +class TestValueIsIn: + def test_matches_when_in_list(self): + condition = ValueIsIn(attribute='country', values=['US', 'UK', 'CA']) + assert condition.matches({'country': 'US'}) is True + + def test_no_match_when_not_in_list(self): + condition = ValueIsIn(attribute='country', values=['US', 'UK', 'CA']) + assert condition.matches({'country': 'DE'}) is False + + def test_no_match_when_missing(self): + condition = ValueIsIn(attribute='country', values=['US', 'UK', 'CA']) + assert condition.matches({}) is False + + def test_kind_discriminator(self): + condition = ValueIsIn(attribute='country', values=['US', 'UK']) + assert condition.kind == 'value-is-in' + + +class TestValueIsNotIn: + def test_matches_when_not_in_list(self): + condition = ValueIsNotIn(attribute='country', values=['blocked', 'restricted']) + assert condition.matches({'country': 'US'}) is True + + def test_no_match_when_in_list(self): + condition = ValueIsNotIn(attribute='country', values=['blocked', 'restricted']) + assert condition.matches({'country': 'blocked'}) is False + + def test_matches_when_missing(self): + # When missing, uses object() sentinel which won't be in the list + condition = ValueIsNotIn(attribute='country', values=['blocked', 'restricted']) + assert condition.matches({}) is True + + def test_kind_discriminator(self): + condition = ValueIsNotIn(attribute='country', values=['blocked']) + assert condition.kind == 'value-is-not-in' + + +class TestValueMatchesRegex: + def test_matches_regex(self): + condition = ValueMatchesRegex(attribute='email', pattern=r'@example\.com$') + assert condition.matches({'email': 'user@example.com'}) is True + + def test_no_match_regex(self): + condition = ValueMatchesRegex(attribute='email', pattern=r'@example\.com$') + assert condition.matches({'email': 'user@other.com'}) is False + + def test_no_match_when_missing(self): + condition = ValueMatchesRegex(attribute='email', pattern=r'@example\.com$') + assert condition.matches({}) is False + + def test_no_match_when_not_string(self): + condition = ValueMatchesRegex(attribute='email', pattern=r'@example\.com$') + assert condition.matches({'email': 123}) is False + + def test_kind_discriminator(self): + condition = ValueMatchesRegex(attribute='email', pattern=r'.*') + assert condition.kind == 'value-matches-regex' + + +class TestValueDoesNotMatchRegex: + def test_matches_when_no_match(self): + """Condition matches (returns True) when the value does NOT match the regex pattern.""" + condition = ValueDoesNotMatchRegex(attribute='email', pattern=r'@blocked\.com$') + # user@other.com does NOT match @blocked.com$, so condition returns True + assert condition.matches({'email': 'user@other.com'}) is True + + def test_no_match_when_pattern_matches(self): + """Condition does not match (returns False) when the value DOES match the regex pattern.""" + condition = ValueDoesNotMatchRegex(attribute='email', pattern=r'@blocked\.com$') + # user@blocked.com DOES match @blocked.com$, so condition returns False + assert condition.matches({'email': 'user@blocked.com'}) is False + + def test_match_when_missing(self): + """Missing attributes cannot match the pattern, so they satisfy 'does not match'.""" + condition = ValueDoesNotMatchRegex(attribute='email', pattern=r'.*') + assert condition.matches({}) is True + + def test_match_when_not_string(self): + """Non-string values cannot match the pattern, so they satisfy 'does not match'.""" + condition = ValueDoesNotMatchRegex(attribute='email', pattern=r'.*') + assert condition.matches({'email': 123}) is True + + def test_kind_discriminator(self): + condition = ValueDoesNotMatchRegex(attribute='email', pattern=r'.*') + assert condition.kind == 'value-does-not-match-regex' + + +class TestKeyIsPresent: + def test_matches_when_present(self): + condition = KeyIsPresent(attribute='custom_prompt') + assert condition.matches({'custom_prompt': 'value'}) is True + + def test_matches_when_present_with_none(self): + condition = KeyIsPresent(attribute='custom_prompt') + assert condition.matches({'custom_prompt': None}) is True + + def test_no_match_when_missing(self): + condition = KeyIsPresent(attribute='custom_prompt') + assert condition.matches({}) is False + + def test_kind_discriminator(self): + condition = KeyIsPresent(attribute='key') + assert condition.kind == 'key-is-present' + + +class TestKeyIsNotPresent: + def test_matches_when_missing(self): + condition = KeyIsNotPresent(attribute='deprecated_flag') + assert condition.matches({}) is True + + def test_no_match_when_present(self): + condition = KeyIsNotPresent(attribute='deprecated_flag') + assert condition.matches({'deprecated_flag': True}) is False + + def test_kind_discriminator(self): + condition = KeyIsNotPresent(attribute='key') + assert condition.kind == 'key-is-not-present' + + +# ============================================================================= +# Test Rollout +# ============================================================================= + + +class TestRollout: + def test_select_variant_deterministic_with_seed(self): + rollout = Rollout(variants={'v1': 0.5, 'v2': 0.5}) + # With a seed, the result should be deterministic + result1 = rollout.select_variant('user123') + result2 = rollout.select_variant('user123') + assert result1 == result2 + + def test_select_variant_different_seeds_can_differ(self): + rollout = Rollout(variants={'v1': 0.5, 'v2': 0.5}) + # Different seeds may produce different results + results = {rollout.select_variant(f'user{i}') for i in range(100)} + # With 50/50 split, we should see both variants + assert results == {'v1', 'v2'} + + def test_select_variant_can_return_none(self): + rollout = Rollout(variants={'v1': 0.3}) # 70% chance of None + results = {rollout.select_variant(f'user{i}') for i in range(100)} + # Should include None in results + assert None in results + assert 'v1' in results + + def test_select_variant_full_probability(self): + rollout = Rollout(variants={'v1': 1.0}) + for i in range(10): + assert rollout.select_variant(f'user{i}') == 'v1' + + def test_select_variant_without_seed(self): + rollout = Rollout(variants={'v1': 0.5, 'v2': 0.5}) + # Without seed, still works but isn't deterministic + result = rollout.select_variant(None) + assert result in {'v1', 'v2'} + + def test_validation_sum_exceeds_one(self): + # Note: Validation only runs when using TypeAdapter (not direct instantiation) + with pytest.raises(ValidationError, match='Variant proportions must not sum to more than 1'): + VariableConfig.model_validate({'rollout': {'variants': {'v1': 0.6, 'v2': 0.6}}}) + + +# ============================================================================= +# Test Variant +# ============================================================================= + + +class TestVariant: + def test_basic_variant(self): + variant = Variant(key='v1', serialized_value='"hello"') + assert variant.key == 'v1' + assert variant.serialized_value == '"hello"' + assert variant.description is None + assert variant.version is None + + def test_variant_with_metadata(self): + variant = Variant( + key='v1', + serialized_value='"hello"', + description='Test variant', + version=1, + ) + assert variant.description == 'Test variant' + assert variant.version == 1 + + +# ============================================================================= +# Test RolloutOverride +# ============================================================================= + + +class TestRolloutOverride: + def test_single_condition_override_applies_when_matched(self): + """Test that override applies when single condition matches.""" + config = VariableConfig( + name='test_var', + variants={ + 'default': Variant(key='default', serialized_value='"default_value"'), + 'premium': Variant(key='premium', serialized_value='"premium_value"'), + }, + rollout=Rollout(variants={'default': 1.0}), + overrides=[ + RolloutOverride( + conditions=[ValueEquals(attribute='plan', value='enterprise')], + rollout=Rollout(variants={'premium': 1.0}), + ), + ], + ) + + # Without matching attribute, default rollout applies + variant = config.resolve_variant(targeting_key='user1') + assert variant is not None + assert variant.key == 'default' + + # With matching attribute, override applies + variant = config.resolve_variant(targeting_key='user1', attributes={'plan': 'enterprise'}) + assert variant is not None + assert variant.key == 'premium' + + # With non-matching attribute, default rollout applies + variant = config.resolve_variant(targeting_key='user1', attributes={'plan': 'free'}) + assert variant is not None + assert variant.key == 'default' + + def test_multiple_conditions_require_all_to_match(self): + """Test that all conditions must match for an override to apply (AND logic).""" + config = VariableConfig( + name='test_var', + variants={ + 'default': Variant(key='default', serialized_value='"default_value"'), + 'premium': Variant(key='premium', serialized_value='"premium_value"'), + }, + rollout=Rollout(variants={'default': 1.0}), + overrides=[ + RolloutOverride( + conditions=[ + ValueEquals(attribute='plan', value='enterprise'), + ValueIsIn(attribute='country', values=['US', 'UK']), + ], + rollout=Rollout(variants={'premium': 1.0}), + ), + ], + ) + + # Both conditions match -> override applies + variant = config.resolve_variant( + targeting_key='user1', + attributes={'plan': 'enterprise', 'country': 'US'}, + ) + assert variant is not None + assert variant.key == 'premium' + + # Only first condition matches -> override does not apply + variant = config.resolve_variant( + targeting_key='user1', + attributes={'plan': 'enterprise', 'country': 'DE'}, + ) + assert variant is not None + assert variant.key == 'default' + + # Only second condition matches -> override does not apply + variant = config.resolve_variant( + targeting_key='user1', + attributes={'plan': 'free', 'country': 'UK'}, + ) + assert variant is not None + assert variant.key == 'default' + + # Neither condition matches -> override does not apply + variant = config.resolve_variant( + targeting_key='user1', + attributes={'plan': 'free', 'country': 'DE'}, + ) + assert variant is not None + assert variant.key == 'default' + + # No attributes -> override does not apply + variant = config.resolve_variant(targeting_key='user1') + assert variant is not None + assert variant.key == 'default' + + +# ============================================================================= +# Test VariableConfig +# ============================================================================= + + +class TestVariableConfig: + @pytest.fixture + def simple_config(self) -> VariableConfig: + return VariableConfig( + name='test_var', + variants={ + 'default': Variant(key='default', serialized_value='"default value"'), + 'experimental': Variant(key='experimental', serialized_value='"experimental value"'), + }, + rollout=Rollout(variants={'default': 0.8, 'experimental': 0.2}), + overrides=[], + ) + + @pytest.fixture + def config_with_overrides(self) -> VariableConfig: + return VariableConfig( + name='test_var', + variants={ + 'default': Variant(key='default', serialized_value='"default value"'), + 'premium': Variant(key='premium', serialized_value='"premium value"'), + }, + rollout=Rollout(variants={'default': 1.0}), + overrides=[ + RolloutOverride( + conditions=[ValueEquals(attribute='plan', value='enterprise')], + rollout=Rollout(variants={'premium': 1.0}), + ), + ], + ) + + def test_resolve_variant_basic(self, simple_config: VariableConfig): + # Deterministic selection with targeting_key + variant = simple_config.resolve_variant(targeting_key='user123') + assert variant is not None + assert variant.key in {'default', 'experimental'} + + def test_resolve_variant_with_override(self, config_with_overrides: VariableConfig): + # Without matching attributes, uses default rollout + variant = config_with_overrides.resolve_variant(targeting_key='user1') + assert variant is not None + assert variant.key == 'default' + + # With matching attributes, uses override rollout + variant = config_with_overrides.resolve_variant( + targeting_key='user1', + attributes={'plan': 'enterprise'}, + ) + assert variant is not None + assert variant.key == 'premium' + + def test_resolve_variant_can_return_none(self): + config = VariableConfig( + name='test_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 0.5}), # 50% chance of None + overrides=[], + ) + # Try many times to get None + results = [config.resolve_variant(targeting_key=f'user{i}') for i in range(100)] + keys = {v.key if v else None for v in results} + assert None in keys + + def test_validation_invalid_variant_key(self): + with pytest.raises(ValidationError, match='invalid lookup key'): + VariableConfig.model_validate( + { + 'name': 'test', + 'variants': { + 'wrong_key': {'key': 'correct_key', 'serialized_value': '"value"'}, + }, + 'rollout': {'variants': {'correct_key': 1.0}}, + 'overrides': [], + } + ) + + def test_validation_rollout_references_missing_variant(self): + with pytest.raises(ValidationError, match="Variant 'missing' present in `rollout.variants` is not present"): + VariableConfig.model_validate( + { + 'name': 'test', + 'variants': { + 'v1': {'key': 'v1', 'serialized_value': '"value"'}, + }, + 'rollout': {'variants': {'missing': 1.0}}, + 'overrides': [], + } + ) + + def test_validation_override_references_missing_variant(self): + with pytest.raises(ValidationError, match="Variant 'missing' present in `overrides"): + VariableConfig.model_validate( + { + 'name': 'test', + 'variants': { + 'v1': {'key': 'v1', 'serialized_value': '"value"'}, + }, + 'rollout': {'variants': {'v1': 1.0}}, + 'overrides': [ + { + 'conditions': [], + 'rollout': {'variants': {'missing': 1.0}}, + } + ], + } + ) + + +# ============================================================================= +# Test VariablesConfig +# ============================================================================= + + +class TestVariablesConfig: + def test_basic_config(self): + config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + } + ) + assert 'my_var' in config.variables + + def test_validation_invalid_variable_key(self): + with pytest.raises(ValidationError, match='invalid lookup key'): + VariablesConfig.model_validate( + { + 'variables': { + 'wrong_key': { + 'name': 'correct_name', + 'variants': {'v1': {'key': 'v1', 'serialized_value': '"value"'}}, + 'rollout': {'variants': {'v1': 1.0}}, + 'overrides': [], + } + } + } + ) + + def test_validate_python(self): + config = VariablesConfig.model_validate( + { + 'variables': { + 'my_var': { + 'name': 'my_var', + 'variants': {'v1': {'key': 'v1', 'serialized_value': '"value"'}}, + 'rollout': {'variants': {'v1': 1.0}}, + 'overrides': [], + } + } + } + ) + assert isinstance(config, VariablesConfig) + assert 'my_var' in config.variables + + def test_get_validation_errors_no_errors(self, config_kwargs: dict[str, Any]): + """Test that get_validation_errors returns empty dict when all variants are valid.""" + lf = logfire.configure(**config_kwargs) + config = VariablesConfig( + variables={ + 'valid_var': VariableConfig( + name='valid_var', + variants={'v1': Variant(key='v1', serialized_value='"valid_string"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + } + ) + var = lf.var(name='valid_var', default='default', type=str) + errors = config.get_validation_errors([var]) + assert errors == {} + + def test_get_validation_errors_missing_config(self, config_kwargs: dict[str, Any]): + """Test that get_validation_errors reports missing variable configs.""" + lf = logfire.configure(**config_kwargs) + config = VariablesConfig(variables={}) + var = lf.var(name='missing_var', default='default', type=str) + errors = config.get_validation_errors([var]) + assert 'missing_var' in errors + assert None in errors['missing_var'] + assert 'No config for variable' in str(errors['missing_var'][None]) + + def test_get_validation_errors_invalid_type(self, config_kwargs: dict[str, Any]): + """Test that get_validation_errors reports type validation errors.""" + lf = logfire.configure(**config_kwargs) + config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'v1': Variant(key='v1', serialized_value='"not_an_int"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + } + ) + var = lf.var(name='my_var', default=0, type=int) + errors = config.get_validation_errors([var]) + assert 'my_var' in errors + assert 'v1' in errors['my_var'] + + def test_from_variables(self, config_kwargs: dict[str, Any]): + """Test that from_variables creates minimal configs from Variable instances.""" + lf = logfire.configure(**config_kwargs) + var1 = lf.var(name='str_var', default='hello', type=str, description='A string variable') + var2 = lf.var(name='int_var', default=42, type=int) + + config = VariablesConfig.from_variables([var1, var2]) + + # Check that configs were created for both variables + assert 'str_var' in config.variables + assert 'int_var' in config.variables + + # Check that the configs have the right structure + str_config = config.variables['str_var'] + assert str_config.name == 'str_var' + assert str_config.description == 'A string variable' + assert str_config.variants == {} # No variants created + assert str_config.rollout.variants == {} # Empty rollout + assert str_config.json_schema is not None + assert str_config.example == '"hello"' # Default value as example + + int_config = config.variables['int_var'] + assert int_config.name == 'int_var' + assert int_config.example == '42' + + def test_from_variables_with_function_default(self, config_kwargs: dict[str, Any]): + """Test that from_variables handles function defaults (no example).""" + lf = logfire.configure(**config_kwargs) + + def resolve_default(targeting_key: str | None, attributes: Mapping[str, Any] | None) -> str: + return 'computed' # pragma: no cover + + var = lf.var(name='fn_var', default=resolve_default, type=str) + + config = VariablesConfig.from_variables([var]) + + fn_config = config.variables['fn_var'] + assert fn_config.example is None # No example for function defaults + + def test_merge_basic(self): + """Test that merge combines two configs with other taking precedence.""" + config1 = VariablesConfig( + variables={ + 'var_a': VariableConfig( + name='var_a', + variants={'v1': Variant(key='v1', serialized_value='"value_a1"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + 'var_b': VariableConfig( + name='var_b', + variants={'v1': Variant(key='v1', serialized_value='"value_b1"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + } + ) + config2 = VariablesConfig( + variables={ + 'var_b': VariableConfig( + name='var_b', + variants={'v2': Variant(key='v2', serialized_value='"value_b2"')}, + rollout=Rollout(variants={'v2': 1.0}), + overrides=[], + ), + 'var_c': VariableConfig( + name='var_c', + variants={'v1': Variant(key='v1', serialized_value='"value_c1"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + } + ) + + merged = config1.merge(config2) + + # Should have all three variables + assert len(merged.variables) == 3 + assert 'var_a' in merged.variables + assert 'var_b' in merged.variables + assert 'var_c' in merged.variables + + # var_b should be from config2 (overwritten) + assert 'v2' in merged.variables['var_b'].variants + assert 'v1' not in merged.variables['var_b'].variants + + +# ============================================================================= +# Test NoOpVariableProvider +# ============================================================================= + + +class TestNoOpVariableProvider: + def test_returns_none(self): + provider = NoOpVariableProvider() + result = provider.get_serialized_value('any_variable') + assert result.value is None + assert result._reason == 'no_provider' + + def test_with_targeting_key_and_attributes(self): + provider = NoOpVariableProvider() + result = provider.get_serialized_value( + 'any_variable', + targeting_key='user123', + attributes={'plan': 'enterprise'}, + ) + assert result.value is None + + def test_refresh_does_nothing(self): + provider = NoOpVariableProvider() + provider.refresh() # Should not raise + provider.refresh(force=True) # Should not raise + + def test_shutdown_does_nothing(self): + provider = NoOpVariableProvider() + provider.shutdown() # Should not raise + + +# ============================================================================= +# Test ResolvedVariable +# ============================================================================= + + +class TestResolvedVariable: + def test_basic_details(self): + details = ResolvedVariable(name='test_var', value='test', _reason='resolved') + assert details.name == 'test_var' + assert details.value == 'test' + assert details.variant is None + assert details.exception is None + + def test_with_variant(self): + details = ResolvedVariable(name='test_var', value='test', variant='v1', _reason='resolved') + assert details.variant == 'v1' + + def test_with_exception(self): + error = ValueError('test error') + details = ResolvedVariable(name='test_var', value='default', exception=error, _reason='validation_error') + assert details.exception is error + + def test_context_manager_sets_baggage(self, config_kwargs: dict[str, Any]): + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='context_test_var', default='default', type=str) + details = var.get() + + # Before entering context, check that baggage is not set + baggage_before = logfire.get_baggage() + assert 'logfire.variables.context_test_var' not in baggage_before + + # Inside context, baggage should be set + with details: + baggage_inside = logfire.get_baggage() + assert 'logfire.variables.context_test_var' in baggage_inside + # Value should be '' since no variant was selected (no config) + assert baggage_inside['logfire.variables.context_test_var'] == '' + + # After exiting context, baggage should be unset + baggage_after = logfire.get_baggage() + assert 'logfire.variables.context_test_var' not in baggage_after + + def test_context_manager_sets_variant_name_in_baggage(self, config_kwargs: dict[str, Any]): + variables_config = VariablesConfig( + variables={ + 'cm_var': VariableConfig( + name='cm_var', + variants={ + 'my_variant': Variant(key='my_variant', serialized_value='"variant_value"'), + }, + rollout=Rollout(variants={'my_variant': 1.0}), + overrides=[], + ), + } + ) + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='cm_var', default='default', type=str) + details = var.get() + + assert details.variant == 'my_variant' + + with details: + baggage = logfire.get_baggage() + assert baggage['logfire.variables.cm_var'] == 'my_variant' + + def test_context_manager_returns_self(self, config_kwargs: dict[str, Any]): + lf = logfire.configure(**config_kwargs) + var = lf.var(name='cm_return_test', default='default', type=str) + details = var.get() + + with details as entered_details: + assert entered_details is details + + def test_context_manager_nested(self, config_kwargs: dict[str, Any]): + variables_config = VariablesConfig( + variables={ + 'var_a': VariableConfig( + name='var_a', + variants={'a1': Variant(key='a1', serialized_value='"value_a"')}, + rollout=Rollout(variants={'a1': 1.0}), + overrides=[], + ), + 'var_b': VariableConfig( + name='var_b', + variants={'b1': Variant(key='b1', serialized_value='"value_b"')}, + rollout=Rollout(variants={'b1': 1.0}), + overrides=[], + ), + } + ) + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + + var_a = lf.var(name='var_a', default='default_a', type=str) + var_b = lf.var(name='var_b', default='default_b', type=str) + + details_a = var_a.get() + details_b = var_b.get() + + with details_a: + baggage = logfire.get_baggage() + assert 'logfire.variables.var_a' in baggage + assert 'logfire.variables.var_b' not in baggage + + with details_b: + baggage = logfire.get_baggage() + assert 'logfire.variables.var_a' in baggage + assert 'logfire.variables.var_b' in baggage + + baggage = logfire.get_baggage() + assert 'logfire.variables.var_a' in baggage + assert 'logfire.variables.var_b' not in baggage + + def test_context_manager_with_exception(self, config_kwargs: dict[str, Any]): + lf = logfire.configure(**config_kwargs) + var = lf.var(name='exc_test_var', default='default', type=str) + details = var.get() + + # Ensure the context manager properly cleans up even when an exception is raised + try: + with details: + baggage = logfire.get_baggage() + assert 'logfire.variables.exc_test_var' in baggage + raise ValueError('test exception') + except ValueError: + pass + + # Baggage should be cleaned up + baggage = logfire.get_baggage() + assert 'logfire.variables.exc_test_var' not in baggage + + +# ============================================================================= +# Test LocalVariableProvider +# ============================================================================= + + +class TestLocalVariableProvider: + @pytest.fixture + def simple_config(self) -> VariablesConfig: + return VariablesConfig( + variables={ + 'test_var': VariableConfig( + name='test_var', + variants={ + 'default': Variant(key='default', serialized_value='"default_value"'), + 'premium': Variant(key='premium', serialized_value='"premium_value"'), + }, + rollout=Rollout(variants={'default': 1.0}), + overrides=[ + RolloutOverride( + conditions=[ValueEquals(attribute='plan', value='enterprise')], + rollout=Rollout(variants={'premium': 1.0}), + ), + ], + ), + } + ) + + def test_get_serialized_value_basic(self, simple_config: VariablesConfig): + provider = LocalVariableProvider(simple_config) + result = provider.get_serialized_value('test_var') + assert result.value == '"default_value"' + assert result.variant == 'default' + assert result._reason == 'resolved' + + def test_get_serialized_value_with_override(self, simple_config: VariablesConfig): + provider = LocalVariableProvider(simple_config) + result = provider.get_serialized_value( + 'test_var', + attributes={'plan': 'enterprise'}, + ) + assert result.value == '"premium_value"' + assert result.variant == 'premium' + + def test_get_serialized_value_unrecognized(self, simple_config: VariablesConfig): + provider = LocalVariableProvider(simple_config) + result = provider.get_serialized_value('unknown_var') + assert result.value is None + assert result._reason == 'unrecognized_variable' + + def test_rollout_returns_none(self): + config = VariablesConfig( + variables={ + 'partial_var': VariableConfig( + name='partial_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 0.0}), # 0% chance + overrides=[], + ), + } + ) + provider = LocalVariableProvider(config) + result = provider.get_serialized_value('partial_var') + assert result.value is None + assert result._reason == 'resolved' + + +# ============================================================================= +# Test LogfireRemoteVariableProvider (using requests-mock) +# ============================================================================= + + +REMOTE_BASE_URL = 'http://localhost:8000/' +REMOTE_TOKEN = 'pylf_v1_local_test_token' + + +@pytest.mark.filterwarnings('ignore::pytest.PytestUnhandledThreadExceptionWarning') +class TestLogfireRemoteVariableProvider: + def test_get_serialized_value_basic(self) -> None: + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={ + 'variables': { + 'test_var': { + 'name': 'test_var', + 'variants': { + 'default': { + 'key': 'default', + 'serialized_value': '"remote_value"', + 'description': None, + 'version': None, + } + }, + 'rollout': {'variants': {'default': 1.0}}, + 'overrides': [], + 'json_schema': {'type': 'string'}, + } + } + }, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=True, + polling_interval=timedelta(seconds=60), + ), + ) + try: + result = provider.get_serialized_value('test_var') + assert result.value == '"remote_value"' + assert result.variant == 'default' + finally: + provider.shutdown() + + def test_get_serialized_value_missing_config_no_block(self) -> None: + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={'variables': {}}, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=False, + polling_interval=timedelta(seconds=60), + ), + ) + try: + # Without blocking, config might not be fetched yet + result = provider.get_serialized_value('test_var') + # Should return missing_config if not fetched + assert result._reason in ('missing_config', 'resolved', 'unrecognized_variable') + finally: + provider.shutdown() + + def test_unrecognized_variable(self) -> None: + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={ + 'variables': { + 'other_var': { + 'name': 'other_var', + 'variants': { + 'default': { + 'key': 'default', + 'serialized_value': '"value"', + } + }, + 'rollout': {'variants': {'default': 1.0}}, + 'overrides': [], + } + } + }, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=True, + polling_interval=timedelta(seconds=60), + ), + ) + try: + result = provider.get_serialized_value('nonexistent_var') + assert result.value is None + assert result._reason == 'unrecognized_variable' + finally: + provider.shutdown() + + def test_shutdown_idempotent(self) -> None: + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={'variables': {}}, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=False, + polling_interval=timedelta(seconds=60), + ), + ) + provider.shutdown() + provider.shutdown() # Should not raise + + def test_refresh_with_force(self) -> None: + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={'variables': {}}, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=False, + polling_interval=timedelta(seconds=60), + ), + ) + try: + provider.refresh(force=True) + result = provider.get_serialized_value('test_var') + assert result._reason == 'unrecognized_variable' + finally: + provider.shutdown() + + def test_rollout_returns_none_variant(self) -> None: + """Test case where rollout returns None (no variant selected).""" + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={ + 'variables': { + 'partial_var': { + 'name': 'partial_var', + 'variants': { + 'v1': { + 'key': 'v1', + 'serialized_value': '"value"', + } + }, + # 0% rollout means no variant is ever selected + 'rollout': {'variants': {'v1': 0.0}}, + 'overrides': [], + } + } + }, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=True, + polling_interval=timedelta(seconds=60), + ), + ) + try: + result = provider.get_serialized_value('partial_var') + assert result.value is None + assert result._reason == 'resolved' + finally: + provider.shutdown() + + +@pytest.mark.filterwarnings('ignore::pytest.PytestUnhandledThreadExceptionWarning') +class TestLogfireRemoteVariableProviderErrors: + def test_handles_unexpected_response(self) -> None: + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + status_code=500, + json={'error': 'Internal Server Error'}, + ) + with warnings.catch_warnings(), request_mocker: + warnings.simplefilter('ignore', RuntimeWarning) + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=True, + polling_interval=timedelta(seconds=60), + ), + ) + try: + # The mock returns an error, so config should not be set + result = provider.get_serialized_value('test_var') + assert result._reason == 'missing_config' + finally: + provider.shutdown() + + def test_handles_validation_error(self) -> None: + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={'invalid_field': 'this is not valid VariablesConfig data'}, + ) + with warnings.catch_warnings(), request_mocker: + warnings.simplefilter('ignore', RuntimeWarning) + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=True, + polling_interval=timedelta(seconds=60), + ), + ) + try: + # The mock returns invalid data, so validation error happens + result = provider.get_serialized_value('test_var') + assert result._reason == 'missing_config' + finally: + provider.shutdown() + + +# ============================================================================= +# Test LogfireRemoteVariableProvider start() method +# ============================================================================= + + +@pytest.mark.filterwarnings('ignore::pytest.PytestUnhandledThreadExceptionWarning') +class TestLogfireRemoteVariableProviderStart: + """Tests for the start() method of LogfireRemoteVariableProvider.""" + + def test_start_called_twice_is_noop(self) -> None: + """Calling start() twice should be a no-op (early return).""" + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={'variables': {}}, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=False, + polling_interval=timedelta(seconds=60), + ), + ) + try: + # First start + provider.start(None) + assert provider._started is True + worker_thread = provider._worker_thread + + # Second start should be a no-op + provider.start(None) + assert provider._worker_thread is worker_thread # Same thread + finally: + provider.shutdown() + + def test_start_with_logfire_instance(self, config_kwargs: dict[str, Any]) -> None: + """start() with a logfire instance should set up error logging via logfire.""" + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={'variables': {}}, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=False, + polling_interval=timedelta(seconds=60), + ), + ) + try: + # Create a logfire instance + lf = logfire.configure(**config_kwargs) + + # Start with the logfire instance + provider.start(lf) + + # Verify logfire instance is set + assert provider._logfire is not None + assert provider._started is True + finally: + provider.shutdown() + + def test_error_logged_via_logfire_when_instrumented(self, config_kwargs: dict[str, Any]) -> None: + """When started with a logfire instance, _log_error should call logfire.error().""" + from unittest.mock import MagicMock + + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={'variables': {}}, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=False, + polling_interval=timedelta(seconds=60), + ), + ) + try: + # Create a logfire instance and start the provider + lf = logfire.configure(**config_kwargs) + provider.start(lf) + + # Mock the logfire error method + mock_error = MagicMock() + provider._logfire.error = mock_error # type: ignore + + # Directly call _log_error to test the logfire.error path + test_exc = ValueError('Test error') + provider._log_error('Test message', test_exc) + + # Verify logfire.error was called + mock_error.assert_called_once() + call_args = mock_error.call_args + assert call_args[0][0] == '{message}: {error}' + assert call_args[1]['message'] == 'Test message' + assert call_args[1]['error'] == 'Test error' + assert call_args[1]['_exc_info'] is test_exc + finally: + provider.shutdown() + + def test_refresh_skips_when_recently_fetched(self) -> None: + """refresh() should skip if we've fetched recently and force=False.""" + request_mocker = requests_mock_module.Mocker() + adapter = request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={'variables': {}}, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=False, + polling_interval=timedelta(seconds=60), # Long polling interval + ), + ) + try: + assert adapter.call_count == 0 + provider.start(None) + # Starting should result in a call in a background thread, so we need to wait for it + start_time = time.time() + while adapter.call_count < 1: + if time.time() - start_time > 5: # pragma: no cover + raise AssertionError(f'Timed out waiting for call_count to reach 1, got {adapter.call_count}') + # Need the below or it can be flaky + time.sleep(0.01) # pragma: no cover + assert adapter.call_count == 1 + + # First refresh should make a request + provider.refresh(force=True) + assert adapter.call_count == 2 + + # Second refresh without force should skip (recently fetched) + provider.refresh(force=False) + assert adapter.call_count == 2 # No additional request + + # Third refresh with force should make a request + provider.refresh(force=True) + assert adapter.call_count == 3 + finally: + provider.shutdown() + + +# ============================================================================= +# Test API Key Support +# ============================================================================= + + +@pytest.mark.filterwarnings('ignore::pytest.PytestUnhandledThreadExceptionWarning') +class TestApiKeySupport: + def test_api_key_in_config(self) -> None: + """Test that api_key can be specified in RemoteVariablesConfig.""" + api_key = 'test_api_key_12345' + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={ + 'variables': { + 'test_var': { + 'name': 'test_var', + 'variants': { + 'default': { + 'key': 'default', + 'serialized_value': '"api_key_value"', + 'description': None, + 'version': None, + } + }, + 'rollout': {'variants': {'default': 1.0}}, + 'overrides': [], + 'json_schema': {'type': 'string'}, + } + } + }, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url='http://localhost:8000/', + token=api_key, + config=RemoteVariablesConfig( + block_before_first_resolve=True, + polling_interval=timedelta(seconds=60), + api_key=api_key, + ), + ) + try: + result = provider.get_serialized_value('test_var') + assert result.value == '"api_key_value"' + assert result.variant == 'default' + # Verify that the api_key was used in the request header + assert request_mocker.last_request is not None + assert request_mocker.last_request.headers['Authorization'] == f'bearer {api_key}' + finally: + provider.shutdown() + + def test_api_key_from_env(self, monkeypatch: pytest.MonkeyPatch) -> None: + """Test that api_key can be loaded from LOGFIRE_API_KEY environment variable.""" + from logfire._internal.config_params import ParamManager + + api_key = 'env_api_key_67890' + monkeypatch.setenv('LOGFIRE_API_KEY', api_key) + + param_manager = ParamManager.create() + loaded_key = param_manager.load_param('api_key') + assert loaded_key == api_key + + +# ============================================================================= +# Test Variable +# ============================================================================= + + +class TestVariable: + @pytest.fixture + def variables_config(self) -> VariablesConfig: + return VariablesConfig( + variables={ + 'string_var': VariableConfig( + name='string_var', + variants={ + 'default': Variant(key='default', serialized_value='"hello"'), + 'alt': Variant(key='alt', serialized_value='"world"'), + }, + rollout=Rollout(variants={'default': 1.0}), + overrides=[ + RolloutOverride( + conditions=[ValueEquals(attribute='use_alt', value=True)], + rollout=Rollout(variants={'alt': 1.0}), + ), + ], + ), + 'int_var': VariableConfig( + name='int_var', + variants={'default': Variant(key='default', serialized_value='42')}, + rollout=Rollout(variants={'default': 1.0}), + overrides=[], + ), + 'model_var': VariableConfig( + name='model_var', + variants={ + 'default': Variant( + key='default', + serialized_value='{"name": "test", "value": 123}', + ) + }, + rollout=Rollout(variants={'default': 1.0}), + overrides=[], + ), + 'invalid_var': VariableConfig( + name='invalid_var', + variants={'default': Variant(key='default', serialized_value='"not_an_int"')}, + rollout=Rollout(variants={'default': 1.0}), + overrides=[], + ), + } + ) + + def test_get_string_variable(self, config_kwargs: dict[str, Any], variables_config: VariablesConfig): + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='string_var', default='default_value', type=str) + details = var.get() + assert details.value == 'hello' + + def test_get_int_variable(self, config_kwargs: dict[str, Any], variables_config: VariablesConfig): + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='int_var', default=0, type=int) + details = var.get() + assert details.value == 42 + + def test_get_model_variable(self, config_kwargs: dict[str, Any], variables_config: VariablesConfig): + class MyModel(BaseModel): + name: str + value: int + + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='model_var', default=MyModel(name='default', value=0), type=MyModel) + details = var.get() + assert details.value.name == 'test' + assert details.value.value == 123 + + def test_get_with_attributes(self, config_kwargs: dict[str, Any], variables_config: VariablesConfig): + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='string_var', default='default_value', type=str) + + # Without override condition + assert var.get().value == 'hello' + + # With override condition + assert var.get(attributes={'use_alt': True}).value == 'world' + + def test_get_details(self, config_kwargs: dict[str, Any], variables_config: VariablesConfig): + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='string_var', default='default_value', type=str) + details = var.get() + assert details.value == 'hello' + assert details.variant == 'default' + assert details.exception is None + + def test_get_details_with_validation_error(self, config_kwargs: dict[str, Any], variables_config: VariablesConfig): + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='invalid_var', default=999, type=int) + details = var.get() + # Falls back to default when validation fails + assert details.value == 999 + assert details.exception is not None + assert details._reason == 'validation_error' + + def test_get_uses_default_when_no_config(self, config_kwargs: dict[str, Any]): + config_kwargs['variables'] = VariablesOptions(config=VariablesConfig(variables={})) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='unconfigured', default='my_default', type=str) + value = var.get().value + assert value == 'my_default' + + def test_override_context_manager(self, config_kwargs: dict[str, Any], variables_config: VariablesConfig): + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='string_var', default='default_value', type=str) + + assert var.get().value == 'hello' + + with var.override('overridden'): + assert var.get().value == 'overridden' + + assert var.get().value == 'hello' + + def test_override_nested(self, config_kwargs: dict[str, Any], variables_config: VariablesConfig): + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='string_var', default='default_value', type=str) + + with var.override('outer'): + assert var.get().value == 'outer' + with var.override('inner'): + assert var.get().value == 'inner' + assert var.get().value == 'outer' + + def test_override_with_function(self, config_kwargs: dict[str, Any], variables_config: VariablesConfig): + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='string_var', default='default_value', type=str) + + def resolve_fn(targeting_key: str | None, attributes: Mapping[str, Any] | None) -> str: + if attributes and attributes.get('mode') == 'creative': + return 'creative_value' + return 'default_fn_value' + + with var.override(resolve_fn): + assert var.get().value == 'default_fn_value' + assert var.get(attributes={'mode': 'creative'}).value == 'creative_value' + + def test_default_as_function(self, config_kwargs: dict[str, Any]): + config_kwargs['variables'] = VariablesOptions(config=VariablesConfig(variables={})) + lf = logfire.configure(**config_kwargs) + + def resolve_default(targeting_key: str | None, attributes: Mapping[str, Any] | None) -> str: + if targeting_key: + return f'default_for_{targeting_key}' + return 'generic_default' + + var = lf.var(name='with_fn_default', default=resolve_default, type=str) + assert var.get().value == 'generic_default' + assert var.get(targeting_key='user123').value == 'default_for_user123' + + def test_refresh_sync(self, config_kwargs: dict[str, Any], variables_config: VariablesConfig): + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='string_var', default='default_value', type=str) + var.refresh_sync() # Should not raise + + @pytest.mark.anyio + async def test_refresh_async(self, config_kwargs: dict[str, Any], variables_config: VariablesConfig): + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='string_var', default='default_value', type=str) + await var.refresh() # Should not raise + + def test_get_creates_span_when_instrumented( + self, config_kwargs: dict[str, Any], variables_config: VariablesConfig, exporter: TestExporter + ): + """Test that var.get() creates a span when instrument=True.""" + config_kwargs['variables'] = VariablesOptions(config=variables_config, instrument=True) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='string_var', default='default_value', type=str) + exporter.clear() # Clear any spans from configure + + details = var.get() + + # Verify the variable was resolved correctly + assert details.value == 'hello' + assert details.variant == 'default' + + # Verify a "Resolve variable string_var" span was created + spans = exporter.exported_spans + resolve_spans = [s for s in spans if s.name == 'Resolve variable string_var'] + assert len(resolve_spans) >= 1 + span = resolve_spans[-1] # Get the most recent one + # Verify span attributes + attrs = dict(span.attributes or {}) + assert attrs.get('name') == 'string_var' + # Value is JSON serialized for OTel-safe span attributes + assert attrs.get('value') == '"hello"' + assert attrs.get('variant') == 'default' + + def test_get_records_exception_on_span_when_validation_error( + self, config_kwargs: dict[str, Any], variables_config: VariablesConfig, exporter: TestExporter + ): + """Test that validation errors are recorded on the span when instrument=True.""" + config_kwargs['variables'] = VariablesOptions(config=variables_config, instrument=True) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='invalid_var', default=999, type=int) + exporter.clear() # Clear any spans from configure + + details = var.get() + + # Verify fallback to default + assert details.value == 999 + assert details.exception is not None + + # Verify the span was created and has the exception recorded + spans = exporter.exported_spans + resolve_spans = [s for s in spans if s.name == 'Resolve variable invalid_var'] + assert len(resolve_spans) >= 1 + span = resolve_spans[-1] # Get the most recent one + # Check that an exception event was recorded + events = span.events or [] + exception_events = [e for e in events if e.name == 'exception'] + assert len(exception_events) == 1 + + def test_get_no_span_when_not_instrumented( + self, config_kwargs: dict[str, Any], variables_config: VariablesConfig, exporter: TestExporter + ): + """Test that var.get() does NOT create a span when instrument=False.""" + config_kwargs['variables'] = VariablesOptions(config=variables_config, instrument=False) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='string_var', default='default_value', type=str) + exporter.clear() # Clear any spans from configure + + details = var.get() + + # Verify the variable was resolved correctly + assert details.value == 'hello' + assert details.variant == 'default' + + # Verify NO "Resolve variable" span was created + spans = exporter.exported_spans + resolve_spans = [s for s in spans if s.name.startswith('Resolve variable')] + assert len(resolve_spans) == 0 + + +# ============================================================================= +# Test targeting_context +# ============================================================================= + + +class TestTargetingContext: + """Tests for the targeting_context context manager.""" + + @pytest.fixture + def rollout_config(self) -> VariablesConfig: + """Config with deterministic rollout based on targeting_key.""" + return VariablesConfig( + variables={ + 'var_a': VariableConfig( + name='var_a', + variants={ + 'v1': Variant(key='v1', serialized_value='"value_1"'), + 'v2': Variant(key='v2', serialized_value='"value_2"'), + }, + # 50/50 split - targeting_key determines which variant + rollout=Rollout(variants={'v1': 0.5, 'v2': 0.5}), + overrides=[], + ), + 'var_b': VariableConfig( + name='var_b', + variants={ + 'v1': Variant(key='v1', serialized_value='"b_value_1"'), + 'v2': Variant(key='v2', serialized_value='"b_value_2"'), + }, + rollout=Rollout(variants={'v1': 0.5, 'v2': 0.5}), + overrides=[], + ), + } + ) + + def test_targeting_context_default_for_all_variables( + self, config_kwargs: dict[str, Any], rollout_config: VariablesConfig + ): + """targeting_context without variables sets targeting for all variables.""" + from logfire.variables.variable import targeting_context + + config_kwargs['variables'] = VariablesOptions(config=rollout_config) + lf = logfire.configure(**config_kwargs) + + var_a = lf.var(name='var_a', default='default', type=str) + var_b = lf.var(name='var_b', default='default', type=str) + + # Without targeting_context, each call may get different results (trace-based or random) + # With targeting_context, both variables use the same targeting_key + with targeting_context('user123'): + result_a = var_a.get() + result_b = var_b.get() + + # Verify targeting_key was used (results should be consistent for same key) + with targeting_context('user123'): + assert var_a.get().value == result_a.value + assert var_b.get().value == result_b.value + + def test_targeting_context_for_specific_variables( + self, config_kwargs: dict[str, Any], rollout_config: VariablesConfig + ): + """targeting_context with variables list only affects those variables.""" + from logfire.variables.variable import targeting_context + + config_kwargs['variables'] = VariablesOptions(config=rollout_config) + lf = logfire.configure(**config_kwargs) + + var_a = lf.var(name='var_a', default='default', type=str) + + # Set targeting only for var_a + with targeting_context('user123', variables=[var_a]): + # var_a should use the targeting_key + result_a_1 = var_a.get() + result_a_2 = var_a.get() + # Should be consistent + assert result_a_1.value == result_a_2.value + + def test_targeting_context_nested_specific_wins_over_default( + self, config_kwargs: dict[str, Any], rollout_config: VariablesConfig + ): + """Variable-specific targeting wins over default, regardless of nesting order.""" + from logfire.variables.variable import targeting_context + + config_kwargs['variables'] = VariablesOptions(config=rollout_config) + lf = logfire.configure(**config_kwargs) + + var_a = lf.var(name='var_a', default='default', type=str) + var_b = lf.var(name='var_b', default='default', type=str) + + # Get expected results for each targeting_key + with targeting_context('user_default'): + expected_b_default = var_b.get().value + with targeting_context('org456'): + expected_specific = var_a.get().value + + # Nested: default first, then specific + with targeting_context('user_default'): + with targeting_context('org456', variables=[var_a]): + # var_a uses specific targeting (org456) + assert var_a.get().value == expected_specific + # var_b uses default targeting (user_default) + assert var_b.get().value == expected_b_default + + def test_targeting_context_reverse_nesting_order( + self, config_kwargs: dict[str, Any], rollout_config: VariablesConfig + ): + """Specific targeting wins even when set before default in nesting.""" + from logfire.variables.variable import targeting_context + + config_kwargs['variables'] = VariablesOptions(config=rollout_config) + lf = logfire.configure(**config_kwargs) + + var_a = lf.var(name='var_a', default='default', type=str) + var_b = lf.var(name='var_b', default='default', type=str) + + # Get expected results + with targeting_context('org456'): + expected_specific = var_a.get().value + with targeting_context('user_default'): + expected_default = var_b.get().value + + # Reverse nesting: specific first, then default + with targeting_context('org456', variables=[var_a]): + with targeting_context('user_default'): + # var_a still uses specific targeting (org456) + assert var_a.get().value == expected_specific + # var_b uses default targeting (user_default) + assert var_b.get().value == expected_default + + def test_targeting_context_call_site_wins(self, config_kwargs: dict[str, Any], rollout_config: VariablesConfig): + """Call-site targeting_key overrides contextvar targeting.""" + from logfire.variables.variable import targeting_context + + config_kwargs['variables'] = VariablesOptions(config=rollout_config) + lf = logfire.configure(**config_kwargs) + + var_a = lf.var(name='var_a', default='default', type=str) + + # Get expected result for call-site key + result_for_explicit = var_a.get(targeting_key='explicit_key').value + + with targeting_context('context_key'): + # Call-site targeting_key should win + assert var_a.get(targeting_key='explicit_key').value == result_for_explicit + + def test_targeting_context_multiple_specific_variables( + self, config_kwargs: dict[str, Any], rollout_config: VariablesConfig + ): + """Multiple variables can have specific targeting set.""" + from logfire.variables.variable import targeting_context + + config_kwargs['variables'] = VariablesOptions(config=rollout_config) + lf = logfire.configure(**config_kwargs) + + var_a = lf.var(name='var_a', default='default', type=str) + var_b = lf.var(name='var_b', default='default', type=str) + + # Get expected results + with targeting_context('key_for_both'): + expected_a = var_a.get().value + expected_b = var_b.get().value + + # Set same targeting for both variables explicitly + with targeting_context('key_for_both', variables=[var_a, var_b]): + assert var_a.get().value == expected_a + assert var_b.get().value == expected_b + + def test_targeting_context_different_keys_for_different_variables( + self, config_kwargs: dict[str, Any], rollout_config: VariablesConfig + ): + """Different variables can have different targeting keys.""" + from logfire.variables.variable import targeting_context + + config_kwargs['variables'] = VariablesOptions(config=rollout_config) + lf = logfire.configure(**config_kwargs) + + var_a = lf.var(name='var_a', default='default', type=str) + var_b = lf.var(name='var_b', default='default', type=str) + + # Get expected results + with targeting_context('key_a'): + expected_a = var_a.get().value + with targeting_context('key_b'): + expected_b = var_b.get().value + + # Nest specific contexts for different variables + with targeting_context('key_a', variables=[var_a]): + with targeting_context('key_b', variables=[var_b]): + assert var_a.get().value == expected_a + assert var_b.get().value == expected_b + + def test_targeting_context_resets_after_exit(self, config_kwargs: dict[str, Any], rollout_config: VariablesConfig): + """Targeting context is properly reset after exiting the context manager.""" + from logfire.variables.variable import _get_contextvar_targeting_key, targeting_context + + config_kwargs['variables'] = VariablesOptions(config=rollout_config) + logfire.configure(**config_kwargs) + + # No context set initially + assert _get_contextvar_targeting_key('var_a') is None + + with targeting_context('user123'): + assert _get_contextvar_targeting_key('var_a') == 'user123' + + # Context is reset after exit + assert _get_contextvar_targeting_key('var_a') is None + + def test_targeting_context_specific_resets_after_exit( + self, config_kwargs: dict[str, Any], rollout_config: VariablesConfig + ): + """Variable-specific targeting is properly reset after exiting.""" + from logfire.variables.variable import _get_contextvar_targeting_key, targeting_context + + config_kwargs['variables'] = VariablesOptions(config=rollout_config) + lf = logfire.configure(**config_kwargs) + var_a = lf.var(name='var_a', default='default', type=str) + + with targeting_context('default_key'): + assert _get_contextvar_targeting_key('var_a') == 'default_key' + + with targeting_context('specific_key', variables=[var_a]): + assert _get_contextvar_targeting_key('var_a') == 'specific_key' + # Other variables still get default + assert _get_contextvar_targeting_key('var_b') == 'default_key' + + # After exiting specific context, var_a goes back to default + assert _get_contextvar_targeting_key('var_a') == 'default_key' + + # After exiting all contexts + assert _get_contextvar_targeting_key('var_a') is None + + +# ============================================================================= +# Test Variable with Baggage and Resource Attributes +# ============================================================================= + + +class TestVariableContextEnrichment: + @pytest.fixture + def config_with_targeting(self) -> VariablesConfig: + return VariablesConfig( + variables={ + 'targeted_var': VariableConfig( + name='targeted_var', + variants={ + 'default': Variant(key='default', serialized_value='"default"'), + 'premium': Variant(key='premium', serialized_value='"premium"'), + }, + rollout=Rollout(variants={'default': 1.0}), + overrides=[ + RolloutOverride( + conditions=[ValueEquals(attribute='plan', value='enterprise')], + rollout=Rollout(variants={'premium': 1.0}), + ), + ], + ), + } + ) + + def test_baggage_included_in_resolution( + self, config_kwargs: dict[str, Any], config_with_targeting: VariablesConfig + ): + config_kwargs['variables'] = VariablesOptions( + config=config_with_targeting, + include_baggage_in_context=True, + ) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='targeted_var', default='fallback', type=str) + + # Without baggage + assert var.get().value == 'default' + + # With baggage + with logfire.set_baggage(plan='enterprise'): + assert var.get().value == 'premium' + + def test_baggage_can_be_disabled(self, config_kwargs: dict[str, Any], config_with_targeting: VariablesConfig): + config_kwargs['variables'] = VariablesOptions( + config=config_with_targeting, + include_baggage_in_context=False, + ) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='targeted_var', default='fallback', type=str) + + # With baggage but disabled + with logfire.set_baggage(plan='enterprise'): + # Should NOT match override since baggage is disabled + assert var.get().value == 'default' + + def test_resource_attributes_can_be_disabled( + self, config_kwargs: dict[str, Any], config_with_targeting: VariablesConfig + ): + config_kwargs['variables'] = VariablesOptions( + config=config_with_targeting, + include_resource_attributes_in_context=False, + ) + lf = logfire.configure(**config_kwargs) + + var = lf.var(name='targeted_var', default='fallback', type=str) + # Just verify it works with this setting + assert var.get().value == 'default' + + +# ============================================================================= +# Test is_resolve_function +# ============================================================================= + + +class TestIsResolveFunction: + def test_valid_resolve_function(self): + def valid_fn(targeting_key: str | None, attributes: Mapping[str, Any] | None) -> str: + return 'value' # pragma: no cover + + assert is_resolve_function(valid_fn) is True + + def test_different_param_names(self): + """A callable with 2 positional params should be detected regardless of parameter names.""" + + def fn_with_different_names(key: str | None, attrs: Mapping[str, Any] | None) -> str: + return 'value' # pragma: no cover + + assert is_resolve_function(fn_with_different_names) is True + + def test_wrong_param_count(self): + def wrong_count(targeting_key: str | None) -> str: + return 'value' # pragma: no cover + + assert is_resolve_function(wrong_count) is False + + def test_not_callable(self): + assert is_resolve_function('not a function') is False + assert is_resolve_function(42) is False + + +# ============================================================================= +# Test __init__.py lazy imports +# ============================================================================= + + +class TestLazyImports: + def test_all_exports_accessible(self): + from logfire import variables + + # All items in __all__ should be accessible + for name in variables.__all__: + assert hasattr(variables, name) + getattr(variables, name) # Should not raise + + def test_attribute_error_for_unknown(self): + from logfire import variables + + with pytest.raises(AttributeError, match="has no attribute 'NonExistent'"): + variables.NonExistent + + +# ============================================================================= +# Test Integration with logfire.var() +# ============================================================================= + + +class TestLogfireVarIntegration: + def test_var_with_implicit_type(self, config_kwargs: dict[str, Any]): + config_kwargs['variables'] = VariablesOptions( + config=VariablesConfig( + variables={ + 'default_var': VariableConfig( + name='default_var', + variants={'v1': Variant(key='v1', serialized_value='"string_value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + } + ) + ) + lf = logfire.configure(**config_kwargs) + + # not specifying type of default uses the type of the default + var = lf.var(name='default_var', default='default') + assert var.get().value == 'string_value' + + def test_exception_handling_in_get_details(self, config_kwargs: dict[str, Any]): + # Create a provider that raises an exception + class FailingProvider(VariableProvider): + def get_serialized_value( + self, + variable_name: str, + targeting_key: str | None = None, + attributes: Mapping[str, Any] | None = None, + ) -> ResolvedVariable[str | None]: + raise RuntimeError('Provider failed!') + + lf = logfire.configure(variables=VariablesOptions(config=FailingProvider())) + + var = lf.var(name='failing_var', default='fallback', type=str) + details = var.get() + assert details.value == 'fallback' + assert details._reason == 'other_error' + assert isinstance(details.exception, RuntimeError) + + +# ============================================================================= +# Test LocalVariableProvider Write Operations +# ============================================================================= + + +class TestLocalVariableProviderWriteOperations: + @pytest.fixture + def empty_config(self) -> VariablesConfig: + return VariablesConfig(variables={}) + + @pytest.fixture + def config_with_var(self) -> VariablesConfig: + return VariablesConfig( + variables={ + 'existing_var': VariableConfig( + name='existing_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + } + ) + + def test_get_variable_config_existing(self, config_with_var: VariablesConfig): + provider = LocalVariableProvider(config_with_var) + result = provider.get_variable_config('existing_var') + assert result is not None + assert result.name == 'existing_var' + + def test_get_variable_config_missing(self, config_with_var: VariablesConfig): + provider = LocalVariableProvider(config_with_var) + result = provider.get_variable_config('nonexistent') + assert result is None + + def test_get_all_variables_config(self, config_with_var: VariablesConfig): + provider = LocalVariableProvider(config_with_var) + result = provider.get_all_variables_config() + assert 'existing_var' in result.variables + + def test_create_variable_success(self, empty_config: VariablesConfig): + provider = LocalVariableProvider(empty_config) + new_config = VariableConfig( + name='new_var', + variants={'v1': Variant(key='v1', serialized_value='"new_value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ) + result = provider.create_variable(new_config) + assert result.name == 'new_var' + assert 'new_var' in provider._config.variables + + def test_create_variable_already_exists(self, config_with_var: VariablesConfig): + from logfire.variables.abstract import VariableAlreadyExistsError + + provider = LocalVariableProvider(config_with_var) + duplicate_config = VariableConfig( + name='existing_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ) + with pytest.raises(VariableAlreadyExistsError, match="Variable 'existing_var' already exists"): + provider.create_variable(duplicate_config) + + def test_update_variable_success(self, config_with_var: VariablesConfig): + provider = LocalVariableProvider(config_with_var) + updated_config = VariableConfig( + name='existing_var', + variants={'v2': Variant(key='v2', serialized_value='"updated_value"')}, + rollout=Rollout(variants={'v2': 1.0}), + overrides=[], + ) + result = provider.update_variable('existing_var', updated_config) + assert result.variants['v2'].serialized_value == '"updated_value"' + + def test_update_variable_not_found(self, empty_config: VariablesConfig): + from logfire.variables.abstract import VariableNotFoundError + + provider = LocalVariableProvider(empty_config) + new_config = VariableConfig( + name='nonexistent', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ) + with pytest.raises(VariableNotFoundError, match="Variable 'nonexistent' not found"): + provider.update_variable('nonexistent', new_config) + + def test_delete_variable_success(self, config_with_var: VariablesConfig): + provider = LocalVariableProvider(config_with_var) + provider.delete_variable('existing_var') + assert 'existing_var' not in provider._config.variables + + def test_delete_variable_not_found(self, empty_config: VariablesConfig): + from logfire.variables.abstract import VariableNotFoundError + + provider = LocalVariableProvider(empty_config) + with pytest.raises(VariableNotFoundError, match="Variable 'nonexistent' not found"): + provider.delete_variable('nonexistent') + + +# ============================================================================= +# Test LogfireRemoteVariableProvider Write Operations +# ============================================================================= + + +@pytest.mark.filterwarnings('ignore::pytest.PytestUnhandledThreadExceptionWarning') +class TestLogfireRemoteVariableProviderWriteOperations: + def test_get_variable_config_existing(self) -> None: + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={ + 'variables': { + 'my_var': { + 'name': 'my_var', + 'variants': {'v1': {'key': 'v1', 'serialized_value': '"value"'}}, + 'rollout': {'variants': {'v1': 1.0}}, + 'overrides': [], + } + } + }, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=True, polling_interval=timedelta(seconds=60)), + ) + try: + provider.refresh(force=True) + result = provider.get_variable_config('my_var') + assert result is not None + assert result.name == 'my_var' + finally: + provider.shutdown() + + def test_get_variable_config_missing_when_no_config(self) -> None: + request_mocker = requests_mock_module.Mocker() + # First call to get variables returns empty, so _config stays None + request_mocker.get('http://localhost:8000/v1/variables/', status_code=500) + with warnings.catch_warnings(), request_mocker: + warnings.simplefilter('ignore', RuntimeWarning) + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=True, polling_interval=timedelta(seconds=60)), + ) + try: + result = provider.get_variable_config('my_var') + assert result is None + finally: + provider.shutdown() + + def test_get_all_variables_config_when_none(self) -> None: + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', status_code=500) + with warnings.catch_warnings(), request_mocker: + warnings.simplefilter('ignore', RuntimeWarning) + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=True, polling_interval=timedelta(seconds=60)), + ) + try: + result = provider.get_all_variables_config() + assert result.variables == {} + finally: + provider.shutdown() + + def test_get_all_variables_config_with_data(self) -> None: + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={ + 'variables': { + 'my_var': { + 'name': 'my_var', + 'variants': {'v1': {'key': 'v1', 'serialized_value': '"value"'}}, + 'rollout': {'variants': {'v1': 1.0}}, + 'overrides': [], + } + } + }, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=True, polling_interval=timedelta(seconds=60)), + ) + try: + provider.refresh(force=True) + result = provider.get_all_variables_config() + assert 'my_var' in result.variables + finally: + provider.shutdown() + + def test_create_variable_success(self) -> None: + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + request_mocker.post('http://localhost:8000/v1/variables/', json={'name': 'new_var'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableConfig( + name='new_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + description='Test variable', + json_schema={'type': 'string'}, + ) + result = provider.create_variable(config) + assert result.name == 'new_var' + finally: + provider.shutdown() + + def test_create_variable_with_aliases_and_example(self) -> None: + """Test creating a variable with aliases and example fields.""" + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + post_adapter = request_mocker.post('http://localhost:8000/v1/variables/', json={'name': 'new_var'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableConfig( + name='new_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + description='Test variable', + json_schema={'type': 'string'}, + aliases=['old_name', 'legacy_name'], + example='"example_value"', + ) + result = provider.create_variable(config) + assert result.name == 'new_var' + + # Verify the request body included aliases and example + assert post_adapter.last_request is not None + request_body = post_adapter.last_request.json() + assert request_body['aliases'] == ['old_name', 'legacy_name'] + assert request_body['example'] == '"example_value"' + finally: + provider.shutdown() + + def test_create_variable_already_exists(self) -> None: + from logfire.variables.abstract import VariableAlreadyExistsError + + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + request_mocker.post('http://localhost:8000/v1/variables/', status_code=409, json={'error': 'Conflict'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableConfig( + name='existing_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ) + with pytest.raises(VariableAlreadyExistsError, match="Variable 'existing_var' already exists"): + provider.create_variable(config) + finally: + provider.shutdown() + + def test_create_variable_api_error(self) -> None: + from logfire.variables.abstract import VariableWriteError + + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + request_mocker.post('http://localhost:8000/v1/variables/', status_code=500, json={'error': 'Server error'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableConfig( + name='new_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ) + with pytest.raises(VariableWriteError, match='Failed to create variable'): + provider.create_variable(config) + finally: + provider.shutdown() + + def test_update_variable_success(self) -> None: + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + request_mocker.put('http://localhost:8000/v1/variables/my_var/', json={'name': 'my_var'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableConfig( + name='my_var', + variants={'v2': Variant(key='v2', serialized_value='"updated"')}, + rollout=Rollout(variants={'v2': 1.0}), + overrides=[], + ) + result = provider.update_variable('my_var', config) + assert result.name == 'my_var' + finally: + provider.shutdown() + + def test_update_variable_not_found(self) -> None: + from logfire.variables.abstract import VariableNotFoundError + + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + request_mocker.put('http://localhost:8000/v1/variables/nonexistent/', status_code=404) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableConfig( + name='nonexistent', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ) + with pytest.raises(VariableNotFoundError, match="Variable 'nonexistent' not found"): + provider.update_variable('nonexistent', config) + finally: + provider.shutdown() + + def test_update_variable_api_error(self) -> None: + from logfire.variables.abstract import VariableWriteError + + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + request_mocker.put('http://localhost:8000/v1/variables/my_var/', status_code=500) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableConfig( + name='my_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ) + with pytest.raises(VariableWriteError, match='Failed to update variable'): + provider.update_variable('my_var', config) + finally: + provider.shutdown() + + def test_delete_variable_success(self) -> None: + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + request_mocker.delete('http://localhost:8000/v1/variables/my_var/', status_code=204) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + provider.delete_variable('my_var') # Should not raise + finally: + provider.shutdown() + + def test_delete_variable_not_found(self) -> None: + from logfire.variables.abstract import VariableNotFoundError + + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + request_mocker.delete('http://localhost:8000/v1/variables/nonexistent/', status_code=404) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + with pytest.raises(VariableNotFoundError, match="Variable 'nonexistent' not found"): + provider.delete_variable('nonexistent') + finally: + provider.shutdown() + + def test_delete_variable_api_error(self) -> None: + from logfire.variables.abstract import VariableWriteError + + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + request_mocker.delete('http://localhost:8000/v1/variables/my_var/', status_code=500) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + with pytest.raises(VariableWriteError, match='Failed to delete variable'): + provider.delete_variable('my_var') + finally: + provider.shutdown() + + def test_config_to_api_body_with_overrides(self) -> None: + """Test _config_to_api_body with various condition types.""" + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + request_mocker.post('http://localhost:8000/v1/variables/', json={'name': 'test_var'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableConfig( + name='test_var', + variants={'v1': Variant(key='v1', serialized_value='"value"', description='variant desc')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[ + RolloutOverride( + conditions=[ + ValueEquals(attribute='attr1', value='val1'), + ValueIsIn(attribute='attr2', values=['a', 'b']), + ValueMatchesRegex(attribute='attr3', pattern=r'test.*'), + ], + rollout=Rollout(variants={'v1': 1.0}), + ) + ], + description='Test description', + json_schema={'type': 'string'}, + ) + provider.create_variable(config) + + # Find the POST request + post_request = None + for req in request_mocker.request_history: # pragma: no branch + if req.method == 'POST': # pragma: no branch + post_request = req + break + + assert post_request is not None + body = post_request.json() + assert body['name'] == 'test_var' + assert body['description'] == 'Test description' + assert body['json_schema'] == {'type': 'string'} + assert 'overrides' in body + assert len(body['overrides']) == 1 + finally: + provider.shutdown() + + def test_config_to_api_body_with_key_conditions(self) -> None: + """Test _config_to_api_body with KeyIsPresent/KeyIsNotPresent conditions.""" + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + request_mocker.post('http://localhost:8000/v1/variables/', json={'name': 'test_var'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableConfig( + name='test_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[ + RolloutOverride( + conditions=[ + KeyIsPresent(attribute='must_exist'), + KeyIsNotPresent(attribute='must_not_exist'), + ], + rollout=Rollout(variants={'v1': 1.0}), + ) + ], + ) + provider.create_variable(config) + + # Find the POST request + post_request = None + for req in request_mocker.request_history: # pragma: no branch + if req.method == 'POST': # pragma: no branch + post_request = req + break + + assert post_request is not None + body = post_request.json() + assert 'overrides' in body + # Check that key conditions are serialized correctly (no value/values/pattern) + conditions = body['overrides'][0]['conditions'] + assert len(conditions) == 2 + assert conditions[0]['kind'] == 'key-is-present' + assert conditions[1]['kind'] == 'key-is-not-present' + finally: + provider.shutdown() + + +# ============================================================================= +# Test VariablesConfig Alias Cycle Detection +# ============================================================================= + + +class TestVariablesConfigAliases: + def test_alias_resolution_success(self): + """Test that aliases resolve correctly when defined on VariableConfig.""" + config = VariablesConfig( + variables={ + 'new_name': VariableConfig( + name='new_name', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + aliases=['old_name'], # Aliases are now defined on each variable + ), + }, + ) + # Access via alias + result = config.resolve_serialized_value('old_name') + assert result.value == '"value"' + assert result._reason == 'resolved' + + def test_multiple_aliases(self): + """Test that multiple aliases resolve correctly.""" + config = VariablesConfig( + variables={ + 'actual_name': VariableConfig( + name='actual_name', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + aliases=['alias1', 'alias2', 'alias3'], + ), + }, + ) + # Access via any alias + for alias in ['alias1', 'alias2', 'alias3']: + result = config.resolve_serialized_value(alias) + assert result.value == '"value"' + assert result._reason == 'resolved' + + def test_nonexistent_variable_returns_unrecognized(self): + """Test that nonexistent variable returns unrecognized.""" + config = VariablesConfig( + variables={ + 'real_var': VariableConfig( + name='real_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + }, + ) + result = config.resolve_serialized_value('nonexistent') + assert result.value is None + assert result._reason == 'unrecognized_variable' + + def test_direct_name_takes_precedence(self): + """Test that direct variable name takes precedence over alias lookup.""" + config = VariablesConfig( + variables={ + 'var_name': VariableConfig( + name='var_name', + variants={'v1': Variant(key='v1', serialized_value='"direct"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + aliases=['some_alias'], + ), + }, + ) + # Direct name access + result = config.resolve_serialized_value('var_name') + assert result.value == '"direct"' + + +# ============================================================================= +# Test Base VariableProvider Write Methods (warnings) +# ============================================================================= + + +class TestBaseVariableProviderWriteMethods: + def test_get_variable_config_returns_none(self): + """Test default implementation returns None.""" + provider = NoOpVariableProvider() + assert provider.get_variable_config('any') is None + + def test_get_all_variables_config_returns_empty(self): + """Test default implementation returns empty config.""" + + class MinimalProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + provider = MinimalProvider() + result = provider.get_all_variables_config() + assert result.variables == {} + + def test_create_variable_warns(self): + """Test default create_variable emits warning.""" + + class MinimalProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + provider = MinimalProvider() + config = VariableConfig( + name='test', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ) + with pytest.warns(UserWarning, match='does not persist variable writes'): + result = provider.create_variable(config) + assert result.name == 'test' + + def test_update_variable_warns(self): + """Test default update_variable emits warning.""" + + class MinimalProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + provider = MinimalProvider() + config = VariableConfig( + name='test', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ) + with pytest.warns(UserWarning, match='does not persist variable writes'): + result = provider.update_variable('test', config) + assert result.name == 'test' + + def test_delete_variable_warns(self): + """Test default delete_variable emits warning.""" + + class MinimalProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + provider = MinimalProvider() + with pytest.warns(UserWarning, match='does not persist variable writes'): + provider.delete_variable('test') + + def test_batch_update_delegates(self): + """Test batch_update calls individual methods.""" + + class TrackingProvider(VariableProvider): + def __init__(self): + self.created: list[str] = [] + self.updated: list[str] = [] + self.deleted: list[str] = [] + self.configs: dict[str, VariableConfig] = {} + + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + def get_variable_config(self, name: str) -> VariableConfig | None: + return self.configs.get(name) + + def create_variable(self, config: VariableConfig) -> VariableConfig: + self.created.append(config.name) + self.configs[config.name] = config + return config + + def update_variable(self, name: str, config: VariableConfig) -> VariableConfig: + self.updated.append(name) + self.configs[name] = config + return config + + def delete_variable(self, name: str) -> None: + self.deleted.append(name) + self.configs.pop(name, None) + + provider = TrackingProvider() + # Pre-create an existing var + provider.configs['existing'] = VariableConfig( + name='existing', + variants={'v1': Variant(key='v1', serialized_value='"old"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ) + + updates: dict[str, VariableConfig | None] = { + 'new_var': VariableConfig( + name='new_var', + variants={'v1': Variant(key='v1', serialized_value='"new"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + 'existing': VariableConfig( + name='existing', + variants={'v2': Variant(key='v2', serialized_value='"updated"')}, + rollout=Rollout(variants={'v2': 1.0}), + overrides=[], + ), + 'to_delete': None, + } + # Add to_delete to configs first + provider.configs['to_delete'] = VariableConfig( + name='to_delete', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ) + + provider.batch_update(updates) + + assert 'new_var' in provider.created + assert 'existing' in provider.updated + assert 'to_delete' in provider.deleted + + +# ============================================================================= +# Test NoOpVariableProvider push/validate +# ============================================================================= + + +class TestNoOpVariableProviderPushValidate: + def test_push_variables_prints_message(self, capsys: pytest.CaptureFixture[str], config_kwargs: dict[str, Any]): + lf = logfire.configure(**config_kwargs) + provider = NoOpVariableProvider() + var = lf.var(name='test', default='default', type=str) + result = provider.push_variables([var]) + assert result is False + captured = capsys.readouterr() + assert 'No variable provider configured' in captured.out + + def test_validate_variables_returns_empty_report(self, config_kwargs: dict[str, Any]): + lf = logfire.configure(**config_kwargs) + provider = NoOpVariableProvider() + var = lf.var(name='test', default='default', type=str) + result = provider.validate_variables([var]) + # NoOpVariableProvider returns an empty report (is_valid=True, no variables checked) + assert result.is_valid + assert result.variables_checked == 0 + assert result.errors == [] + assert result.variables_not_on_server == [] + + +# ============================================================================= +# Test push_variables Method +# ============================================================================= + + +class TestPushVariables: + def test_push_variables_empty_list(self, capsys: pytest.CaptureFixture[str]): + """Test push_variables with empty variables list.""" + provider = LocalVariableProvider(VariablesConfig(variables={})) + result = provider.push_variables([]) + assert result is False + captured = capsys.readouterr() + assert 'No variables to push' in captured.out + + def test_push_variables_no_changes(self, capsys: pytest.CaptureFixture[str], config_kwargs: dict[str, Any]): + """Test push_variables when server is up to date.""" + server_config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + json_schema={'type': 'string'}, + ), + } + ) + provider = LocalVariableProvider(server_config) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='my_var', default='default', type=str) + result = provider.push_variables([var]) + assert result is False + captured = capsys.readouterr() + assert 'No changes needed' in captured.out + + def test_push_variables_create_new(self, capsys: pytest.CaptureFixture[str], config_kwargs: dict[str, Any]): + """Test push_variables creating a new variable.""" + provider = LocalVariableProvider(VariablesConfig(variables={})) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='new_var', default='default', type=str, description='A new variable for testing') + result = provider.push_variables([var], yes=True) + assert result is True + captured = capsys.readouterr() + assert 'Variables to CREATE' in captured.out + assert 'new_var' in captured.out + assert 'A new variable for testing' in captured.out or 'Description' in captured.out + assert 'new_var' in provider._config.variables + + def test_push_variables_create_with_function_default( + self, capsys: pytest.CaptureFixture[str], config_kwargs: dict[str, Any] + ): + """Test push_variables with a function default (no default variant).""" + + def resolve_fn(targeting_key: str | None, attributes: Mapping[str, Any] | None) -> str: + return 'computed' # pragma: no cover + + provider = LocalVariableProvider(VariablesConfig(variables={})) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='fn_var', default=resolve_fn, type=str) + result = provider.push_variables([var], yes=True) + assert result is True + captured = capsys.readouterr() + assert 'No example value' in captured.out + + def test_push_variables_update_schema(self, capsys: pytest.CaptureFixture[str], config_kwargs: dict[str, Any]): + """Test push_variables updating schema.""" + server_config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'v1': Variant(key='v1', serialized_value='123')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + json_schema={'type': 'integer'}, # Old schema + ), + } + ) + provider = LocalVariableProvider(server_config) + lf = logfire.configure(**config_kwargs) + # Now we want it to be a string + var = lf.var(name='my_var', default='default', type=str) + result = provider.push_variables([var], yes=True) + assert result is True + captured = capsys.readouterr() + assert 'Variables to UPDATE' in captured.out + + def test_push_variables_update_with_incompatible_variants( + self, capsys: pytest.CaptureFixture[str], config_kwargs: dict[str, Any] + ): + """Test push_variables with incompatible variants warning.""" + server_config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'v1': Variant(key='v1', serialized_value='"not_an_int"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + json_schema={'type': 'string'}, + ), + } + ) + provider = LocalVariableProvider(server_config) + lf = logfire.configure(**config_kwargs) + # Changing from string to int - existing variant is incompatible + var = lf.var(name='my_var', default=0, type=int) + result = provider.push_variables([var], yes=True) + assert result is True + captured = capsys.readouterr() + assert 'Warning' in captured.out or 'Incompatible' in captured.out + + def test_push_variables_strict_mode_fails_with_incompatible( + self, capsys: pytest.CaptureFixture[str], config_kwargs: dict[str, Any] + ): + """Test push_variables in strict mode fails with incompatible variants.""" + server_config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'v1': Variant(key='v1', serialized_value='"not_an_int"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + json_schema={'type': 'string'}, + ), + } + ) + provider = LocalVariableProvider(server_config) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='my_var', default=0, type=int) + result = provider.push_variables([var], strict=True) + assert result is False + captured = capsys.readouterr() + # Error message may go to stdout or stderr depending on implementation + all_output = captured.out + captured.err + assert 'Error' in all_output or 'strict' in all_output.lower() + + def test_push_variables_dry_run(self, capsys: pytest.CaptureFixture[str], config_kwargs: dict[str, Any]): + """Test push_variables dry run mode.""" + provider = LocalVariableProvider(VariablesConfig(variables={})) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='new_var', default='default', type=str) + result = provider.push_variables([var], dry_run=True) + assert result is True + captured = capsys.readouterr() + assert 'Dry run mode' in captured.out + # Variable should NOT be created + assert 'new_var' not in provider._config.variables + + def test_push_variables_orphaned_server_variables( + self, capsys: pytest.CaptureFixture[str], config_kwargs: dict[str, Any] + ): + """Test push_variables shows orphaned server variables.""" + server_config = VariablesConfig( + variables={ + 'orphaned_var': VariableConfig( + name='orphaned_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + } + ) + provider = LocalVariableProvider(server_config) + lf = logfire.configure(**config_kwargs) + # Push a different variable, orphaned_var is not in local code + var = lf.var(name='local_var', default='default', type=str) + result = provider.push_variables([var], yes=True) + assert result is True + captured = capsys.readouterr() + assert 'Server-only variables' in captured.out or 'orphaned_var' in captured.out + + def test_push_variables_description_differences( + self, capsys: pytest.CaptureFixture[str], config_kwargs: dict[str, Any] + ): + """Test push_variables shows description differences.""" + server_config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + description='Old description', + json_schema={'type': 'string'}, + ), + } + ) + provider = LocalVariableProvider(server_config) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='my_var', default='default', type=str, description='New description') + provider.push_variables([var], yes=True) + captured = capsys.readouterr() + assert 'Description differences' in captured.out or 'description' in captured.out.lower() + + +# ============================================================================= +# Test validate_variables Method +# ============================================================================= + + +class TestValidateVariables: + def test_validate_variables_empty_list(self): + """Test validate_variables with empty variables list.""" + provider = LocalVariableProvider(VariablesConfig(variables={})) + result = provider.validate_variables([]) + assert result.is_valid + assert result.variables_checked == 0 + assert result.errors == [] + assert result.variables_not_on_server == [] + + def test_validate_variables_all_valid(self, config_kwargs: dict[str, Any]): + """Test validate_variables with all valid variants.""" + server_config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'v1': Variant(key='v1', serialized_value='"valid_string"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + } + ) + provider = LocalVariableProvider(server_config) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='my_var', default='default', type=str) + result = provider.validate_variables([var]) + assert result.is_valid + assert result.variables_checked == 1 + assert result.errors == [] + assert result.variables_not_on_server == [] + + def test_validate_variables_with_errors(self, config_kwargs: dict[str, Any]): + """Test validate_variables with validation errors.""" + server_config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'v1': Variant(key='v1', serialized_value='"not_an_int"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + } + ) + provider = LocalVariableProvider(server_config) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='my_var', default=0, type=int) + result = provider.validate_variables([var]) + assert not result.is_valid + assert len(result.errors) == 1 + assert result.errors[0].variable_name == 'my_var' + assert result.errors[0].variant_key == 'v1' + # Check that format() produces output about the error + formatted = result.format(colors=False) + assert 'my_var' in formatted + assert 'v1' in formatted + + def test_validate_variables_not_on_server(self, config_kwargs: dict[str, Any]): + """Test validate_variables with variables not on server.""" + provider = LocalVariableProvider(VariablesConfig(variables={})) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='missing_var', default='default', type=str) + result = provider.validate_variables([var]) + assert not result.is_valid + assert 'missing_var' in result.variables_not_on_server + # Check that format() produces output about missing variable + formatted = result.format(colors=False) + assert 'missing_var' in formatted + assert 'Not Found' in formatted or 'not on server' in formatted.lower() + + def test_validate_variables_description_differences(self, config_kwargs: dict[str, Any]): + """Test validate_variables shows description differences.""" + server_config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + description='Server description', + ), + } + ) + provider = LocalVariableProvider(server_config) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='my_var', default='default', type=str, description='Local description') + result = provider.validate_variables([var]) + # The variable is valid (variants match) but has description differences + assert result.is_valid # No validation errors + assert len(result.description_differences) == 1 + assert result.description_differences[0].variable_name == 'my_var' + assert result.description_differences[0].local_description == 'Local description' + assert result.description_differences[0].server_description == 'Server description' + # Check that format() produces output about description differences + formatted = result.format(colors=False) + assert 'description' in formatted.lower() or 'my_var' in formatted + + +# ============================================================================= +# Test Error Handling in push_variables and validate_variables +# ============================================================================= + + +class TestPushValidateErrorHandling: + """Test error handling in push_variables and validate_variables methods.""" + + def test_push_variables_refresh_error(self, capsys: pytest.CaptureFixture[str], config_kwargs: dict[str, Any]): + """Test push_variables handles refresh errors gracefully.""" + + class FailingRefreshProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + def refresh(self, force: bool = False): + raise RuntimeError('Refresh failed!') + + def get_all_variables_config(self) -> VariablesConfig: + return VariablesConfig(variables={}) + + provider = FailingRefreshProvider() + lf = logfire.configure(**config_kwargs) + var = lf.var(name='test_var', default='default', type=str) + # Should not crash, should print warning + provider.push_variables([var], yes=True) + captured = capsys.readouterr() + # Output may go to stdout or stderr depending on implementation + all_output = captured.out + captured.err + assert 'Could not refresh provider' in all_output or 'Warning' in all_output + + def test_push_variables_get_all_config_error( + self, capsys: pytest.CaptureFixture[str], config_kwargs: dict[str, Any] + ): + """Test push_variables handles get_all_variables_config errors.""" + + class FailingConfigProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + def get_all_variables_config(self) -> VariablesConfig: + raise RuntimeError('Config fetch failed!') + + provider = FailingConfigProvider() + lf = logfire.configure(**config_kwargs) + var = lf.var(name='test_var', default='default', type=str) + result = provider.push_variables([var]) + assert result is False + captured = capsys.readouterr() + # Output may go to stdout or stderr depending on implementation + all_output = captured.out + captured.err + assert 'Error fetching current config' in all_output + + def test_push_variables_apply_changes_error( + self, capsys: pytest.CaptureFixture[str], config_kwargs: dict[str, Any] + ): + """Test push_variables handles apply changes errors.""" + + class FailingApplyProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + def get_all_variables_config(self) -> VariablesConfig: + return VariablesConfig(variables={}) + + def create_variable(self, config: VariableConfig) -> VariableConfig: + raise RuntimeError('Create failed!') + + provider = FailingApplyProvider() + lf = logfire.configure(**config_kwargs) + var = lf.var(name='new_var', default='default', type=str) + result = provider.push_variables([var], yes=True) + assert result is False + captured = capsys.readouterr() + # Output may go to stdout or stderr depending on implementation + all_output = captured.out + captured.err + assert 'Error applying changes' in all_output + + def test_validate_variables_refresh_error(self, config_kwargs: dict[str, Any]): + """Test validate_variables propagates refresh errors.""" + + class FailingRefreshProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + def refresh(self, force: bool = False): + raise RuntimeError('Refresh failed!') + + def get_all_variables_config(self) -> VariablesConfig: + return VariablesConfig(variables={}) # pragma: no cover + + provider = FailingRefreshProvider() + lf = logfire.configure(**config_kwargs) + var = lf.var(name='test_var', default='default', type=str) + # Exception should propagate for CI automation + with pytest.raises(RuntimeError, match='Refresh failed'): + provider.validate_variables([var]) + + def test_validate_variables_get_all_config_error(self, config_kwargs: dict[str, Any]): + """Test validate_variables propagates get_all_variables_config errors.""" + + class FailingConfigProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + def get_all_variables_config(self) -> VariablesConfig: + raise RuntimeError('Config fetch failed!') + + provider = FailingConfigProvider() + lf = logfire.configure(**config_kwargs) + var = lf.var(name='test_var', default='default', type=str) + # Exception should propagate for CI automation + with pytest.raises(RuntimeError, match='Config fetch failed'): + provider.validate_variables([var]) + + +# ============================================================================= +# Test Additional Edge Cases for Coverage +# ============================================================================= + + +class TestAdditionalEdgeCases: + def test_push_variables_with_compatible_variants( + self, capsys: pytest.CaptureFixture[str], config_kwargs: dict[str, Any] + ): + """Test push_variables when existing variants are compatible with the new schema.""" + # Server has a string variable with string variants + server_config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'v1': Variant(key='v1', serialized_value='"compatible_value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + json_schema={'type': 'integer'}, # Old schema is integer + ), + } + ) + provider = LocalVariableProvider(server_config) + lf = logfire.configure(**config_kwargs) + # Local expects a string - variant is compatible since it's a valid JSON string + var = lf.var(name='my_var', default='default', type=str) + result = provider.push_variables([var], yes=True) + # This should succeed since the variant can deserialize to string + assert result is True + captured = capsys.readouterr() + # The variant '"compatible_value"' should be compatible with type str + assert 'Variables to UPDATE' in captured.out + + def test_variable_get_with_active_trace(self, config_kwargs: dict[str, Any]): + """Test that variable.get() uses trace_id as targeting_key when in active span.""" + from opentelemetry import trace + + lf = logfire.configure(**config_kwargs) + var = lf.var(name='test_var', default='default', type=str) + + # Create a real trace context using the logfire instance + with lf.span('test_span'): + current_span = trace.get_current_span() + trace_id = current_span.get_span_context().trace_id + # Verify we have an active trace + assert trace_id != 0 + + # Call get() - should use trace_id as targeting_key + result = var.get() + + # The targeting_key should be set from the trace_id + # We can't easily verify the exact targeting_key used internally, + # but we can verify the call succeeded and the span was created + assert result.value == 'default' # Falls back to default since no config + + def test_format_validation_report_with_missing_variable(self, config_kwargs: dict[str, Any]): + """Test validate_variables when variable is not on server.""" + # Create a config that will report "not on server" + server_config = VariablesConfig(variables={}) + provider = LocalVariableProvider(server_config) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='missing_var', default='default', type=str) + result = provider.validate_variables([var]) + assert not result.is_valid + assert 'missing_var' in result.variables_not_on_server + # Test formatting + formatted = result.format(colors=False) + assert 'missing_var' in formatted + + def test_format_validation_report_with_many_error_lines(self, config_kwargs: dict[str, Any]): + """Test validate_variables formatting when error has many lines.""" + # Create a config where variant validation will produce a multi-line error + server_config = VariablesConfig( + variables={ + 'complex_var': VariableConfig( + name='complex_var', + variants={ + 'v1': Variant( + key='v1', + # This JSON won't validate against a complex Pydantic model + serialized_value='{"invalid": "structure", "with": "many", "fields": "that", "are": "wrong"}', + ) + }, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + } + ) + provider = LocalVariableProvider(server_config) + lf = logfire.configure(**config_kwargs) + + # Create a variable with a complex type that will generate multi-line errors + class ComplexModel(BaseModel): + required_field: str + another_required: int + yet_another: list[str] + nested: dict[str, int] + + var = lf.var( + name='complex_var', + default=ComplexModel(required_field='x', another_required=1, yet_another=[], nested={}), + type=ComplexModel, + ) + result = provider.validate_variables([var]) + assert not result.is_valid + assert len(result.errors) > 0 + # Check formatting with multi-line error + formatted = result.format(colors=False) + assert 'complex_var' in formatted + assert 'v1' in formatted + + +class TestVariableToConfig: + """Tests for Variable.to_config() method.""" + + def test_to_config(self, config_kwargs: dict[str, Any]): + """Test converting a Variable to VariableConfig.""" + lf = logfire.configure(**config_kwargs) + var = lf.var(name='my_var', type=str, default='hello', description='Test desc') + config = var.to_config() + assert config.name == 'my_var' + assert config.description == 'Test desc' + assert config.example == '"hello"' + assert config.variants == {} + assert config.rollout.variants == {} + assert config.overrides == [] + + def test_to_config_with_function_default(self, config_kwargs: dict[str, Any]): + """Test to_config when default is a function.""" + lf = logfire.configure(**config_kwargs) + + def my_resolver(targeting_key: str | None, attributes: Mapping[str, Any] | None) -> int: + return 99 # pragma: no cover + + var = lf.var(name='func_var', type=int, default=my_resolver) + config = var.to_config() + assert config.name == 'func_var' + # Example should be None when default is a function + assert config.example is None + + +# ============================================================================= +# Test use_variant (explicit variant selection) +# ============================================================================= + + +class TestUseVariant: + """Tests for the use_variant context manager and variant parameter.""" + + @pytest.fixture + def variant_config(self) -> VariablesConfig: + """Config with multiple variants.""" + return VariablesConfig( + variables={ + 'feature_var': VariableConfig( + name='feature_var', + variants={ + 'default': Variant(key='default', serialized_value='"default_value"'), + 'experimental': Variant(key='experimental', serialized_value='"experimental_value"'), + 'legacy': Variant(key='legacy', serialized_value='"legacy_value"'), + }, + rollout=Rollout(variants={'default': 1.0}), # 100% default + overrides=[], + ), + } + ) + + def test_get_with_variant_parameter(self, config_kwargs: dict[str, Any], variant_config: VariablesConfig): + """Test getting a specific variant via the variant parameter.""" + config_kwargs['variables'] = VariablesOptions(config=variant_config) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='feature_var', default='code_default', type=str) + + # Without variant param, uses rollout (100% default) + assert var.get().value == 'default_value' + assert var.get().variant == 'default' + + # With variant param, bypasses rollout + result = var.get(variant='experimental') + assert result.value == 'experimental_value' + assert result.variant == 'experimental' + + result = var.get(variant='legacy') + assert result.value == 'legacy_value' + assert result.variant == 'legacy' + + def test_get_with_nonexistent_variant(self, config_kwargs: dict[str, Any], variant_config: VariablesConfig): + """Test that nonexistent variant falls back to normal resolution.""" + config_kwargs['variables'] = VariablesOptions(config=variant_config) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='feature_var', default='code_default', type=str) + + # Nonexistent variant should fall through to normal resolution + result = var.get(variant='nonexistent') + assert result.value == 'default_value' # Falls back to rollout resolution + assert result.variant == 'default' + + def test_use_variant_context_manager(self, config_kwargs: dict[str, Any], variant_config: VariablesConfig): + """Test the use_variant context manager.""" + config_kwargs['variables'] = VariablesOptions(config=variant_config) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='feature_var', default='code_default', type=str) + + assert var.get().value == 'default_value' + + with var.use_variant('experimental'): + assert var.get().value == 'experimental_value' + assert var.get().variant == 'experimental' + + assert var.get().value == 'default_value' + + def test_use_variant_nested(self, config_kwargs: dict[str, Any], variant_config: VariablesConfig): + """Test nested use_variant contexts.""" + config_kwargs['variables'] = VariablesOptions(config=variant_config) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='feature_var', default='code_default', type=str) + + with var.use_variant('experimental'): + assert var.get().value == 'experimental_value' + + with var.use_variant('legacy'): + assert var.get().value == 'legacy_value' + + assert var.get().value == 'experimental_value' + + assert var.get().value == 'default_value' + + def test_variant_param_overrides_context(self, config_kwargs: dict[str, Any], variant_config: VariablesConfig): + """Test that call-site variant param overrides context.""" + config_kwargs['variables'] = VariablesOptions(config=variant_config) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='feature_var', default='code_default', type=str) + + with var.use_variant('experimental'): + # Context says experimental, but call-site says legacy + result = var.get(variant='legacy') + # Call-site variant wins (variant param is checked first in get method) + # Actually, checking the code - the call-site variant is used directly + assert result.value == 'legacy_value' diff --git a/tests/type_checking.py b/tests/type_checking.py new file mode 100644 index 000000000..cc91797d5 --- /dev/null +++ b/tests/type_checking.py @@ -0,0 +1,13 @@ +from typing import assert_type + +import logfire +from logfire.variables import Variable + +# Documenting the current behavior: including a default of an incompatible type extends the union rather than producing +# a type error. This is arguably a feature, not a bug — the `type` is only used for validating provider values, not the +# code default, so this behavior makes it more ergonomic to do things like sentinel patterns if you want to easily +# detect whether you got a variable-provider-provided value. +# Anyway, the _main_ reason it works this way is not because we prefer it, but because we can't see a way to make it a +# type error, so the above argument is just a way of turning lemons into lemonade. +my_variable_2 = logfire.Logfire().var(name='my-variable-2', default=None, type=int) +assert_type(my_variable_2, Variable[int | None]) diff --git a/uv.lock b/uv.lock index a4fc02729..94aa78197 100644 --- a/uv.lock +++ b/uv.lock @@ -3242,6 +3242,9 @@ starlette = [ system-metrics = [ { name = "opentelemetry-instrumentation-system-metrics" }, ] +variables = [ + { name = "pydantic" }, +] wsgi = [ { name = "opentelemetry-instrumentation-wsgi" }, ] @@ -3406,11 +3409,12 @@ requires-dist = [ { name = "packaging", marker = "extra == 'psycopg'" }, { name = "packaging", marker = "extra == 'psycopg2'" }, { name = "protobuf", specifier = ">=4.23.4" }, + { name = "pydantic", marker = "extra == 'variables'", specifier = ">=2" }, { name = "rich", specifier = ">=13.4.2" }, { name = "tomli", marker = "python_full_version < '3.11'", specifier = ">=2.0.1" }, { name = "typing-extensions", specifier = ">=4.1.0" }, ] -provides-extras = ["system-metrics", "asgi", "wsgi", "aiohttp", "aiohttp-client", "aiohttp-server", "celery", "django", "fastapi", "flask", "httpx", "starlette", "sqlalchemy", "asyncpg", "psycopg", "psycopg2", "pymongo", "redis", "requests", "mysql", "sqlite3", "aws-lambda", "google-genai", "litellm", "dspy"] +provides-extras = ["system-metrics", "asgi", "wsgi", "aiohttp", "aiohttp-client", "aiohttp-server", "celery", "django", "fastapi", "flask", "httpx", "starlette", "sqlalchemy", "asyncpg", "psycopg", "psycopg2", "pymongo", "redis", "requests", "mysql", "sqlite3", "aws-lambda", "google-genai", "litellm", "dspy", "variables"] [package.metadata.requires-dev] dev = [ From 871f11310b50a8ecbf5e5da92d5ab43bd2b872d5 Mon Sep 17 00:00:00 2001 From: David Montague <35119617+dmontagu@users.noreply.github.com> Date: Thu, 5 Feb 2026 12:36:21 -0700 Subject: [PATCH 02/19] Add on-change callbacks --- docs/reference/advanced/managed-variables.md | 23 ++ logfire/_internal/config.py | 2 + logfire/_internal/main.py | 26 +- logfire/variables/abstract.py | 27 +- logfire/variables/config.py | 4 +- logfire/variables/local.py | 32 ++- logfire/variables/remote.py | 80 +++--- logfire/variables/variable.py | 36 ++- tests/test_variables.py | 259 +++++++++++++++++++ 9 files changed, 444 insertions(+), 45 deletions(-) diff --git a/docs/reference/advanced/managed-variables.md b/docs/reference/advanced/managed-variables.md index 25ac801c3..40fae6f70 100644 --- a/docs/reference/advanced/managed-variables.md +++ b/docs/reference/advanced/managed-variables.md @@ -1317,4 +1317,27 @@ config = VariablesConfig( ) ``` +### Change Notifications + +You can register callbacks that fire when a variable's remote configuration changes: + +```python skip="true" +feature_enabled = logfire.var('feature_enabled', default=False) + + +@feature_enabled.on_change +def on_feature_change(): + new_value = feature_enabled.get().value + logfire.info('feature_enabled changed to {new_value}', new_value=new_value) + invalidate_cache() +``` + +Key points: + +- Callbacks run on the provider's polling thread -- keep them fast and non-blocking +- Callbacks receive no arguments; call `variable.get()` to see the new value +- Multiple callbacks can be registered on the same variable +- Exceptions in callbacks are caught and logged (they don't crash the polling thread) +- For local providers, callbacks fire on `create_variable`, `update_variable`, and `delete_variable` + [slack]: https://logfire.pydantic.dev/docs/join-slack/ diff --git a/logfire/_internal/config.py b/logfire/_internal/config.py index 44a97bf7c..c3ce770aa 100644 --- a/logfire/_internal/config.py +++ b/logfire/_internal/config.py @@ -570,6 +570,8 @@ def configure( logfire_instance = Logfire(config=config) else: logfire_instance = DEFAULT_LOGFIRE_INSTANCE + logfire_instance._variables.clear() # pyright: ignore[reportPrivateUsage] + logfire_instance._change_notifications_setup = False # pyright: ignore[reportPrivateUsage] # Start the variable provider now that we have the logfire instance # Pass None if instrumentation is disabled to avoid logging errors via logfire diff --git a/logfire/_internal/main.py b/logfire/_internal/main.py index 08eff45df..0bbf5f6a6 100644 --- a/logfire/_internal/main.py +++ b/logfire/_internal/main.py @@ -156,6 +156,7 @@ def __init__( self._console_log = console_log self._otel_scope = otel_scope self._variables: dict[str, Variable[Any]] = {} + self._change_notifications_setup = False @property def config(self) -> LogfireConfig: @@ -2455,10 +2456,32 @@ def var( else: tp = type + if name in self._variables: + raise ValueError( + f"A variable with name '{name}' has already been registered. Each variable must have a unique name." + ) + variable = Variable[T](name, default=default, type=tp, logfire_instance=self, description=description) self._variables[name] = variable + + if not self._change_notifications_setup: + self._setup_variable_change_notifications() + self._change_notifications_setup = True + return variable + def _setup_variable_change_notifications(self) -> None: + """Set up the on_config_change callback on the provider to dispatch to variables.""" + provider = self.config.get_variable_provider() + + def on_config_change(changed_names: set[str]) -> None: + for name in changed_names: + variable = self._variables.get(name) + if variable is not None: + variable._notify_change() # pyright: ignore[reportPrivateUsage] + + provider.set_on_config_change(on_config_change) + def variables_get(self) -> list[Variable[Any]]: """Get all variables registered with this Logfire instance.""" return list(self._variables.values()) @@ -2590,7 +2613,8 @@ def variables_validate( registered with this Logfire instance will be validated. Returns: - True if all variables validated successfully, False if there were errors. + A ValidationReport containing any errors found. Use `report.is_valid` to check + if validation passed, and `report.format()` to get a human-readable summary. Example: ```python diff --git a/logfire/variables/abstract.py b/logfire/variables/abstract.py index d742e1edf..4f747bb85 100644 --- a/logfire/variables/abstract.py +++ b/logfire/variables/abstract.py @@ -4,7 +4,7 @@ import sys import warnings from abc import ABC, abstractmethod -from collections.abc import Mapping, Sequence +from collections.abc import Callable, Mapping, Sequence from contextlib import ExitStack from dataclasses import dataclass from typing import TYPE_CHECKING, Any, Generic, Literal, TypeVar @@ -213,6 +213,11 @@ class ValidationReport: description_differences: list[DescriptionDifference] """List of variables where local and server descriptions differ.""" + @property + def has_errors(self) -> bool: + """Return True if there are any validation errors.""" + return not self.is_valid + @property def is_valid(self) -> bool: """Return False if there are any validation errors or any variables not defined in the (possibly remote) config.""" @@ -537,6 +542,26 @@ def _update_variable_schema( class VariableProvider(ABC): """Abstract base class for variable value providers.""" + _on_config_change: Callable[[set[str]], None] | None = None + + def set_on_config_change(self, callback: Callable[[set[str]], None]) -> None: + """Set a callback that will be called when variable configurations change. + + Args: + callback: Called with the set of variable names whose configs changed. + """ + self._on_config_change = callback + + def _notify_config_change(self, changed_names: set[str]) -> None: + """Notify the registered callback about changed variables.""" + if self._on_config_change and changed_names: + try: + self._on_config_change(changed_names) + except Exception: + import logging + + logging.getLogger('logfire').exception('Error in on_config_change callback') + @abstractmethod def get_serialized_value( self, diff --git a/logfire/variables/config.py b/logfire/variables/config.py index 3ab4ec622..1a799b4e3 100644 --- a/logfire/variables/config.py +++ b/logfire/variables/config.py @@ -226,7 +226,7 @@ def _validate_variant_proportions(cls, v: dict[VariantKey, float]): # the code default. if any(weight < 0 for weight in v.values()): raise ValueError('Variant proportions must not be negative.') - if sum(v.values()) > 1: + if sum(v.values()) > 1.0 + 1e-9: raise ValueError('Variant proportions must not sum to more than 1.') return v @@ -372,7 +372,7 @@ def _validate_variables(self): raise ValueError(f'`variables` has invalid lookup key {k!r} for value with name {v.name!r}.') return self - @property + @cached_property def _alias_map(self) -> dict[VariableName, str]: # Build alias lookup map for efficient lookups alias_map: dict[VariableName, VariableName] = {} diff --git a/logfire/variables/local.py b/logfire/variables/local.py index 2840cd0bd..c498503de 100644 --- a/logfire/variables/local.py +++ b/logfire/variables/local.py @@ -1,5 +1,6 @@ from __future__ import annotations as _annotations +import threading from collections.abc import Mapping from typing import Any @@ -27,6 +28,7 @@ def __init__(self, config: VariablesConfig): config: A VariablesConfig instance to use for variable resolution and mutation. """ self._config = config + self._lock = threading.Lock() def get_serialized_value( self, @@ -46,7 +48,8 @@ def get_serialized_value( Returns: A ResolvedVariable containing the serialized value (or None if not found). """ - return self._config.resolve_serialized_value(variable_name, targeting_key, attributes) + with self._lock: + return self._config.resolve_serialized_value(variable_name, targeting_key, attributes) def get_variable_config(self, name: str) -> VariableConfig | None: """Retrieve the full configuration for a variable. @@ -60,7 +63,8 @@ def get_variable_config(self, name: str) -> VariableConfig | None: Returns: The VariableConfig if found, or None if the variable doesn't exist. """ - return self._config._get_variable_config(name) # pyright: ignore[reportPrivateUsage] + with self._lock: + return self._config._get_variable_config(name) # pyright: ignore[reportPrivateUsage] def get_all_variables_config(self) -> VariablesConfig: """Retrieve all variable configurations. @@ -82,9 +86,11 @@ def create_variable(self, config: VariableConfig) -> VariableConfig: Raises: VariableAlreadyExistsError: If a variable with this name already exists. """ - if config.name in self._config.variables: - raise VariableAlreadyExistsError(f"Variable '{config.name}' already exists") - self._config.variables[config.name] = config + with self._lock: + if config.name in self._config.variables: + raise VariableAlreadyExistsError(f"Variable '{config.name}' already exists") + self._config.variables[config.name] = config + self._notify_config_change({config.name}) return config def update_variable(self, name: str, config: VariableConfig) -> VariableConfig: @@ -100,9 +106,11 @@ def update_variable(self, name: str, config: VariableConfig) -> VariableConfig: Raises: VariableNotFoundError: If the variable does not exist. """ - if name not in self._config.variables: - raise VariableNotFoundError(f"Variable '{name}' not found") - self._config.variables[name] = config + with self._lock: + if name not in self._config.variables: + raise VariableNotFoundError(f"Variable '{name}' not found") + self._config.variables[name] = config + self._notify_config_change({name}) return config def delete_variable(self, name: str) -> None: @@ -114,6 +122,8 @@ def delete_variable(self, name: str) -> None: Raises: VariableNotFoundError: If the variable does not exist. """ - if name not in self._config.variables: - raise VariableNotFoundError(f"Variable '{name}' not found") - del self._config.variables[name] + with self._lock: + if name not in self._config.variables: + raise VariableNotFoundError(f"Variable '{name}' not found") + del self._config.variables[name] + self._notify_config_change({name}) diff --git a/logfire/variables/remote.py b/logfire/variables/remote.py index 5928c45d6..36d172c88 100644 --- a/logfire/variables/remote.py +++ b/logfire/variables/remote.py @@ -60,6 +60,7 @@ def __init__(self, base_url: str, token: str, config: RemoteVariablesConfig): timedelta(seconds=polling_interval) if isinstance(polling_interval, (float, int)) else polling_interval ) + self._session_lock = threading.Lock() self._reset_once = Once() self._has_attempted_fetch: bool = False self._last_fetched_at: datetime | None = None @@ -70,7 +71,7 @@ def __init__(self, base_url: str, token: str, config: RemoteVariablesConfig): self._shutdown_timeout_exceeded = False self._refresh_lock = threading.Lock() self._worker_awaken = threading.Event() - self._force_next_refresh = False # Set by SSE listener to force immediate refresh + self._force_refresh_event = threading.Event() # Set by SSE listener to force immediate refresh # SSE listener for real-time updates self._sse_connected = False @@ -88,7 +89,9 @@ def __init__(self, base_url: str, token: str, config: RemoteVariablesConfig): def _at_fork_reinit(self): # pragma: no cover # Recreate all things threading related self._refresh_lock = threading.Lock() + self._session_lock = threading.Lock() self._worker_awaken = threading.Event() + self._force_refresh_event = threading.Event() # Only restart threads if we were started before the fork if self._started: self._worker_thread = threading.Thread( @@ -214,7 +217,7 @@ def _sse_listener(self): # pragma: no cover # On any variable event, trigger a forced refresh if event_type in ('created', 'updated', 'deleted'): # Set flag to force refresh and wake up the worker - self._force_next_refresh = True + self._force_refresh_event.set() self._worker_awaken.set() except (json.JSONDecodeError, TypeError): # Invalid JSON, ignore @@ -244,8 +247,9 @@ def _worker(self): # We can change this if we run into issues, but it doesn't seem to be causing any now. # Check if SSE event requested a forced refresh - force = self._force_next_refresh - self._force_next_refresh = False + force = self._force_refresh_event.is_set() + if force: + self._force_refresh_event.clear() self.refresh(force=force) self._worker_awaken.clear() @@ -275,9 +279,10 @@ def refresh(self, force: bool = False): return # nothing to do try: - variables_response = self._session.get(urljoin(self._base_url, '/v1/variables/')) - UnexpectedResponse.raise_for_status(variables_response) - variables_config_data = variables_response.json() + with self._session_lock: + variables_response = self._session.get(urljoin(self._base_url, '/v1/variables/')) + UnexpectedResponse.raise_for_status(variables_response) + variables_config_data = variables_response.json() except Exception as e: # Catch all request/HTTP/JSON exceptions (ConnectionError, Timeout, UnexpectedResponse, # JSONDecodeError, etc.) to prevent crashing the user's application on failures. @@ -285,14 +290,27 @@ def refresh(self, force: bool = False): return try: - self._config = VariablesConfig.model_validate(variables_config_data) + old_config = self._config + new_config = VariablesConfig.model_validate(variables_config_data) + self._config = new_config + self._last_fetched_at = datetime.now(tz=timezone.utc) + + # Detect changed variables and notify + if old_config is not None: + changed: set[str] = set() + all_names = set(old_config.variables.keys()) | set(new_config.variables.keys()) + for name in all_names: + old_var = old_config.variables.get(name) + new_var = new_config.variables.get(name) + if old_var != new_var: + changed.add(name) + if changed: + self._notify_config_change(changed) except ValidationError as e: self._log_error('Failed to parse variables configuration from Logfire API', e) finally: self._has_attempted_fetch = True - self._last_fetched_at = datetime.now(tz=timezone.utc) - def get_serialized_value( self, variable_name: str, @@ -377,10 +395,11 @@ def create_variable(self, config: VariableConfig) -> VariableConfig: """ body = self._config_to_api_body(config) try: - response = self._session.post(urljoin(self._base_url, '/v1/variables/'), json=body) - if response.status_code == 409: - raise VariableAlreadyExistsError(f"Variable '{config.name}' already exists") - UnexpectedResponse.raise_for_status(response) + with self._session_lock: + response = self._session.post(urljoin(self._base_url, '/v1/variables/'), json=body) + if response.status_code == 409: + raise VariableAlreadyExistsError(f"Variable '{config.name}' already exists") + UnexpectedResponse.raise_for_status(response) except UnexpectedResponse as e: raise VariableWriteError(f'Failed to create variable: {e}') from e @@ -419,10 +438,11 @@ def update_variable(self, name: str, config: VariableConfig) -> VariableConfig: variants_to_send[key] = variant body = self._config_to_api_body(config, variants_override=variants_to_send) try: - response = self._session.put(urljoin(self._base_url, f'/v1/variables/{name}/'), json=body) - if response.status_code == 404: - raise VariableNotFoundError(f"Variable '{name}' not found") - UnexpectedResponse.raise_for_status(response) + with self._session_lock: + response = self._session.put(urljoin(self._base_url, f'/v1/variables/{name}/'), json=body) + if response.status_code == 404: + raise VariableNotFoundError(f"Variable '{name}' not found") + UnexpectedResponse.raise_for_status(response) except UnexpectedResponse as e: raise VariableWriteError(f'Failed to update variable: {e}') from e @@ -441,10 +461,11 @@ def delete_variable(self, name: str) -> None: VariableWriteError: If the API request fails. """ try: - response = self._session.delete(urljoin(self._base_url, f'/v1/variables/{name}/')) - if response.status_code == 404: - raise VariableNotFoundError(f"Variable '{name}' not found") - UnexpectedResponse.raise_for_status(response) + with self._session_lock: + response = self._session.delete(urljoin(self._base_url, f'/v1/variables/{name}/')) + if response.status_code == 404: + raise VariableNotFoundError(f"Variable '{name}' not found") + UnexpectedResponse.raise_for_status(response) except UnexpectedResponse as e: raise VariableWriteError(f'Failed to delete variable: {e}') from e @@ -542,12 +563,12 @@ def list_variable_types(self) -> dict[str, VariableTypeConfig]: from logfire.variables.config import VariableTypeConfig try: - response = self._session.get(urljoin(self._base_url, '/v1/variable-types/')) - UnexpectedResponse.raise_for_status(response) + with self._session_lock: + response = self._session.get(urljoin(self._base_url, '/v1/variable-types/')) + UnexpectedResponse.raise_for_status(response) + types_data = response.json() except UnexpectedResponse as e: raise VariableWriteError(f'Failed to list variable types: {e}') from e - - types_data = response.json() result: dict[str, VariableTypeConfig] = {} for type_data in types_data: config = VariableTypeConfig( @@ -583,9 +604,10 @@ def upsert_variable_type(self, config: VariableTypeConfig) -> VariableTypeConfig body['source_hint'] = config.source_hint try: - # POST endpoint is an upsert (create or update by name) - response = self._session.post(urljoin(self._base_url, '/v1/variable-types/'), json=body) - UnexpectedResponse.raise_for_status(response) + with self._session_lock: + # POST endpoint is an upsert (create or update by name) + response = self._session.post(urljoin(self._base_url, '/v1/variable-types/'), json=body) + UnexpectedResponse.raise_for_status(response) except UnexpectedResponse as e: raise VariableWriteError(f'Failed to upsert variable type: {e}') from e diff --git a/logfire/variables/variable.py b/logfire/variables/variable.py index dd56760b8..9a21a136a 100644 --- a/logfire/variables/variable.py +++ b/logfire/variables/variable.py @@ -1,7 +1,7 @@ from __future__ import annotations as _annotations import inspect -from collections.abc import Iterator, Mapping, Sequence +from collections.abc import Callable, Iterator, Mapping, Sequence from contextlib import ExitStack, contextmanager from contextvars import ContextVar from dataclasses import dataclass, field, replace @@ -160,6 +160,7 @@ def __init__( self.logfire_instance = logfire_instance.with_settings(custom_scope_suffix='variables') self.type_adapter = TypeAdapter[T_co](type) + self._on_change_callbacks: list[Callable[[], None]] = [] # Create a cached deserialization function for this variable instance. # Returns T | Exception to cache both successful deserializations and errors. @@ -221,6 +222,39 @@ def refresh_sync(self, force: bool = False): """Synchronously refresh the variable.""" self.logfire_instance.config.get_variable_provider().refresh(force=force) + def on_change(self, callback: Callable[[], None]) -> Callable[[], None]: + """Register a callback to be called when this variable's remote configuration changes. + + The callback receives no arguments. Call `variable.get()` inside the callback + to see the new value. Callbacks run on the provider's polling thread, so they + should be fast and non-blocking. + + Can be used as a decorator: + + @my_var.on_change + def handle_change(): + new_value = my_var.get().value + invalidate_cache() + + Args: + callback: A no-argument callable to invoke when the variable's config changes. + + Returns: + The callback (for use as a decorator). + """ + self._on_change_callbacks.append(callback) + return callback + + def _notify_change(self) -> None: + """Internal: fire all registered on_change callbacks.""" + for callback in self._on_change_callbacks: + try: + callback() + except Exception: + import logging + + logging.getLogger('logfire').exception(f'Error in on_change callback for variable {self.name!r}') + def get( self, targeting_key: str | None = None, diff --git a/tests/test_variables.py b/tests/test_variables.py index 4537bff5e..15a548e33 100644 --- a/tests/test_variables.py +++ b/tests/test_variables.py @@ -3437,3 +3437,262 @@ def test_variant_param_overrides_context(self, config_kwargs: dict[str, Any], va # Call-site variant wins (variant param is checked first in get method) # Actually, checking the code - the call-site variant is used directly assert result.value == 'legacy_value' + + +# ============================================================================= +# Test on_change callbacks +# ============================================================================= + + +class TestOnChangeCallbacks: + def test_on_change_callback(self, config_kwargs: dict[str, Any]): + """Test that on_change callbacks fire when variable config changes.""" + config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'a': Variant(key='a', serialized_value='"hello"')}, + rollout=Rollout(variants={'a': 1.0}), + overrides=[], + ), + } + ) + provider = LocalVariableProvider(config) + config_kwargs['variables'] = VariablesOptions(config=provider) + lf = logfire.configure(**config_kwargs) + + my_var = lf.var('my_var', default='default', type=str) + + changes: list[str] = [] + + @my_var.on_change + def on_change(): # pyright: ignore[reportUnusedFunction] + changes.append(my_var.get().value) + + # Update the variable + provider.update_variable( + 'my_var', + VariableConfig( + name='my_var', + variants={'a': Variant(key='a', serialized_value='"world"')}, + rollout=Rollout(variants={'a': 1.0}), + overrides=[], + ), + ) + + assert changes == ['world'] + + def test_on_change_decorator_returns_callback(self, config_kwargs: dict[str, Any]): + """Test that on_change can be used as a decorator and returns the callback.""" + config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'a': Variant(key='a', serialized_value='"hello"')}, + rollout=Rollout(variants={'a': 1.0}), + overrides=[], + ), + } + ) + provider = LocalVariableProvider(config) + config_kwargs['variables'] = VariablesOptions(config=provider) + lf = logfire.configure(**config_kwargs) + + my_var = lf.var('my_var', default='default', type=str) + + @my_var.on_change + def callback(): + pass + + assert callback is not None + assert callable(callback) + + def test_on_change_callback_exception_doesnt_break_provider(self, config_kwargs: dict[str, Any]): + """Test that exceptions in callbacks are caught and logged.""" + config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'a': Variant(key='a', serialized_value='"hello"')}, + rollout=Rollout(variants={'a': 1.0}), + overrides=[], + ), + } + ) + provider = LocalVariableProvider(config) + config_kwargs['variables'] = VariablesOptions(config=provider) + lf = logfire.configure(**config_kwargs) + + my_var = lf.var('my_var', default='default', type=str) + + good_changes: list[str] = [] + + def bad_callback(): + raise ValueError('boom') + + def good_callback(): + good_changes.append(my_var.get().value) + + my_var.on_change(bad_callback) + my_var.on_change(good_callback) + + # Update the variable -- bad callback raises, but good callback still runs + provider.update_variable( + 'my_var', + VariableConfig( + name='my_var', + variants={'a': Variant(key='a', serialized_value='"world"')}, + rollout=Rollout(variants={'a': 1.0}), + overrides=[], + ), + ) + + assert good_changes == ['world'] + + def test_on_change_multiple_callbacks(self, config_kwargs: dict[str, Any]): + """Test that multiple on_change callbacks fire.""" + config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'a': Variant(key='a', serialized_value='"hello"')}, + rollout=Rollout(variants={'a': 1.0}), + overrides=[], + ), + } + ) + provider = LocalVariableProvider(config) + config_kwargs['variables'] = VariablesOptions(config=provider) + lf = logfire.configure(**config_kwargs) + + my_var = lf.var('my_var', default='default', type=str) + + calls_1: list[str] = [] + calls_2: list[str] = [] + + @my_var.on_change + def callback_1(): # pyright: ignore[reportUnusedFunction] + calls_1.append('called') + + @my_var.on_change + def callback_2(): # pyright: ignore[reportUnusedFunction] + calls_2.append('called') + + provider.update_variable( + 'my_var', + VariableConfig( + name='my_var', + variants={'a': Variant(key='a', serialized_value='"world"')}, + rollout=Rollout(variants={'a': 1.0}), + overrides=[], + ), + ) + + assert calls_1 == ['called'] + assert calls_2 == ['called'] + + def test_on_change_fires_on_create_variable(self, config_kwargs: dict[str, Any]): + """Test that on_change fires when a variable is created via the provider.""" + config = VariablesConfig(variables={}) + provider = LocalVariableProvider(config) + config_kwargs['variables'] = VariablesOptions(config=provider) + lf = logfire.configure(**config_kwargs) + + # Register a variable that doesn't exist yet in the provider + my_var = lf.var('new_var', default='default', type=str) + + changes: list[str] = [] + + @my_var.on_change + def on_change(): # pyright: ignore[reportUnusedFunction] + changes.append('changed') + + # Create the variable in the provider + provider.create_variable( + VariableConfig( + name='new_var', + variants={'a': Variant(key='a', serialized_value='"hello"')}, + rollout=Rollout(variants={'a': 1.0}), + overrides=[], + ), + ) + + assert changes == ['changed'] + + def test_on_change_fires_on_delete_variable(self, config_kwargs: dict[str, Any]): + """Test that on_change fires when a variable is deleted via the provider.""" + config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'a': Variant(key='a', serialized_value='"hello"')}, + rollout=Rollout(variants={'a': 1.0}), + overrides=[], + ), + } + ) + provider = LocalVariableProvider(config) + config_kwargs['variables'] = VariablesOptions(config=provider) + lf = logfire.configure(**config_kwargs) + + my_var = lf.var('my_var', default='default', type=str) + + changes: list[str] = [] + + @my_var.on_change + def on_change(): # pyright: ignore[reportUnusedFunction] + changes.append('deleted') + + provider.delete_variable('my_var') + + assert changes == ['deleted'] + + def test_on_change_only_fires_for_changed_variable(self, config_kwargs: dict[str, Any]): + """Test that on_change only fires for the variable that actually changed.""" + config = VariablesConfig( + variables={ + 'var_a': VariableConfig( + name='var_a', + variants={'x': Variant(key='x', serialized_value='"a_value"')}, + rollout=Rollout(variants={'x': 1.0}), + overrides=[], + ), + 'var_b': VariableConfig( + name='var_b', + variants={'x': Variant(key='x', serialized_value='"b_value"')}, + rollout=Rollout(variants={'x': 1.0}), + overrides=[], + ), + } + ) + provider = LocalVariableProvider(config) + config_kwargs['variables'] = VariablesOptions(config=provider) + lf = logfire.configure(**config_kwargs) + + var_a = lf.var('var_a', default='default', type=str) + var_b = lf.var('var_b', default='default', type=str) + + a_changes: list[str] = [] + b_changes: list[str] = [] + + @var_a.on_change + def on_a_change(): # pyright: ignore[reportUnusedFunction] + a_changes.append('a_changed') + + @var_b.on_change + def on_b_change(): # pyright: ignore[reportUnusedFunction] + b_changes.append('b_changed') + + # Only update var_a + provider.update_variable( + 'var_a', + VariableConfig( + name='var_a', + variants={'x': Variant(key='x', serialized_value='"new_a"')}, + rollout=Rollout(variants={'x': 1.0}), + overrides=[], + ), + ) + + assert a_changes == ['a_changed'] + assert b_changes == [] From 4e299edcff46c0e9574d9f5f658857a98b445455 Mon Sep 17 00:00:00 2001 From: David Montague <35119617+dmontagu@users.noreply.github.com> Date: Thu, 5 Feb 2026 15:03:33 -0700 Subject: [PATCH 03/19] More improvements --- logfire/_internal/config.py | 6 +++++- logfire/variables/config.py | 4 ++++ logfire/variables/local.py | 3 +++ logfire/variables/remote.py | 24 +++++++++++++++++++----- logfire/variables/variable.py | 20 ++++++++++++++++---- 5 files changed, 47 insertions(+), 10 deletions(-) diff --git a/logfire/_internal/config.py b/logfire/_internal/config.py index c3ce770aa..19a5cda1e 100644 --- a/logfire/_internal/config.py +++ b/logfire/_internal/config.py @@ -570,13 +570,17 @@ def configure( logfire_instance = Logfire(config=config) else: logfire_instance = DEFAULT_LOGFIRE_INSTANCE - logfire_instance._variables.clear() # pyright: ignore[reportPrivateUsage] logfire_instance._change_notifications_setup = False # pyright: ignore[reportPrivateUsage] # Start the variable provider now that we have the logfire instance # Pass None if instrumentation is disabled to avoid logging errors via logfire config.get_variable_provider().start(logfire_instance if config.variables.instrument else None) + # Re-wire change notifications if there are existing variables from a previous configure() call + if logfire_instance._variables and not logfire_instance._change_notifications_setup: # pyright: ignore[reportPrivateUsage] + logfire_instance._setup_variable_change_notifications() # pyright: ignore[reportPrivateUsage] + logfire_instance._change_notifications_setup = True # pyright: ignore[reportPrivateUsage] + return logfire_instance diff --git a/logfire/variables/config.py b/logfire/variables/config.py index 1a799b4e3..1d9363b25 100644 --- a/logfire/variables/config.py +++ b/logfire/variables/config.py @@ -382,6 +382,10 @@ def _alias_map(self) -> dict[VariableName, str]: alias_map[alias] = var_config.name return alias_map + def _invalidate_alias_map(self) -> None: + """Invalidate the cached alias map so it gets rebuilt on next access.""" + self.__dict__.pop('_alias_map', None) # pyright: ignore[reportUnknownMemberType,reportAttributeAccessIssue] + def resolve_serialized_value( self, name: VariableName, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None ) -> ResolvedVariable[str | None]: diff --git a/logfire/variables/local.py b/logfire/variables/local.py index c498503de..9ce0d0330 100644 --- a/logfire/variables/local.py +++ b/logfire/variables/local.py @@ -90,6 +90,7 @@ def create_variable(self, config: VariableConfig) -> VariableConfig: if config.name in self._config.variables: raise VariableAlreadyExistsError(f"Variable '{config.name}' already exists") self._config.variables[config.name] = config + self._config._invalidate_alias_map() # pyright: ignore[reportPrivateUsage] self._notify_config_change({config.name}) return config @@ -110,6 +111,7 @@ def update_variable(self, name: str, config: VariableConfig) -> VariableConfig: if name not in self._config.variables: raise VariableNotFoundError(f"Variable '{name}' not found") self._config.variables[name] = config + self._config._invalidate_alias_map() # pyright: ignore[reportPrivateUsage] self._notify_config_change({name}) return config @@ -126,4 +128,5 @@ def delete_variable(self, name: str) -> None: if name not in self._config.variables: raise VariableNotFoundError(f"Variable '{name}' not found") del self._config.variables[name] + self._config._invalidate_alias_map() # pyright: ignore[reportPrivateUsage] self._notify_config_change({name}) diff --git a/logfire/variables/remote.py b/logfire/variables/remote.py index 36d172c88..1188c36ab 100644 --- a/logfire/variables/remote.py +++ b/logfire/variables/remote.py @@ -2,6 +2,7 @@ import json import os +import re import threading import warnings import weakref @@ -24,7 +25,18 @@ VariableProvider, VariableWriteError, ) -from logfire.variables.config import VariableConfig, VariablesConfig +from logfire.variables.config import ( + KeyIsNotPresent, + KeyIsPresent, + ValueDoesNotEqual, + ValueDoesNotMatchRegex, + ValueEquals, + ValueIsIn, + ValueIsNotIn, + ValueMatchesRegex, + VariableConfig, + VariablesConfig, +) if TYPE_CHECKING: import logfire @@ -543,13 +555,15 @@ def _condition_extra_fields(self, condition: Any) -> dict[str, Any]: Returns: A dictionary of extra fields for the condition. """ - if hasattr(condition, 'value'): + if isinstance(condition, (ValueEquals, ValueDoesNotEqual)): return {'value': condition.value} - elif hasattr(condition, 'values'): + elif isinstance(condition, (ValueIsIn, ValueIsNotIn)): return {'values': list(condition.values)} - elif hasattr(condition, 'pattern'): + elif isinstance(condition, (ValueMatchesRegex, ValueDoesNotMatchRegex)): pattern = condition.pattern - return {'pattern': pattern.pattern if hasattr(pattern, 'pattern') else pattern} + return {'pattern': pattern.pattern if isinstance(pattern, re.Pattern) else pattern} + elif isinstance(condition, (KeyIsPresent, KeyIsNotPresent)): + return {} return {} # --- Variable Types API --- diff --git a/logfire/variables/variable.py b/logfire/variables/variable.py index 9a21a136a..68b4028b8 100644 --- a/logfire/variables/variable.py +++ b/logfire/variables/variable.py @@ -5,7 +5,6 @@ from contextlib import ExitStack, contextmanager from contextvars import ContextVar from dataclasses import dataclass, field, replace -from functools import lru_cache from importlib.util import find_spec from typing import TYPE_CHECKING, Any, Generic, Protocol, TypeVar @@ -163,13 +162,26 @@ def __init__( self._on_change_callbacks: list[Callable[[], None]] = [] # Create a cached deserialization function for this variable instance. - # Returns T | Exception to cache both successful deserializations and errors. - @lru_cache(maxsize=128) + # Returns T | Exception. Only successful results are cached; exceptions are + # returned but not cached so that transient errors don't persist permanently. + _cache: dict[str, T_co] = {} + _cache_order: list[str] = [] + _cache_maxsize = 128 + def _deserialize_cached(serialized_value: str) -> T_co | Exception: + if serialized_value in _cache: + return _cache[serialized_value] try: - return self.type_adapter.validate_json(serialized_value) + result = self.type_adapter.validate_json(serialized_value) except Exception as e: return e + # Evict oldest entry if cache is full + if len(_cache) >= _cache_maxsize: + oldest = _cache_order.pop(0) + _cache.pop(oldest, None) + _cache[serialized_value] = result + _cache_order.append(serialized_value) + return result self._deserialize_cached = _deserialize_cached From 4c16ad737dd0ba1bdc0669f27e764c777ec63711 Mon Sep 17 00:00:00 2001 From: David Montague <35119617+dmontagu@users.noreply.github.com> Date: Thu, 5 Feb 2026 23:58:35 -0700 Subject: [PATCH 04/19] Minor docs tweak --- docs/reference/advanced/managed-variables.md | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/docs/reference/advanced/managed-variables.md b/docs/reference/advanced/managed-variables.md index 40fae6f70..b3813555f 100644 --- a/docs/reference/advanced/managed-variables.md +++ b/docs/reference/advanced/managed-variables.md @@ -1,8 +1,5 @@ # Managed Variables -!!! warning "Early Access" - The Logfire web UI functionality for managed variables is currently behind a feature flag and not yet generally available. This includes everything related to `RemoteVariablesConfig` — creating and managing variables in the UI, configuring variants and rollouts remotely, and syncing configuration from the server. You can still use managed variables locally with `VariablesConfig` without the feature flag. If you'd like access to the remote functionality, please reach out to us on [Slack][slack] for instructions on how to enable it. - Managed variables let you define and reference configuration in your code, but control the runtime values from the Logfire UI without redeploying. Define a variable once with a sensible default, deploy your application, then iterate on the values in production. You can target specific populations (opted-in beta users, internal developers, enterprise customers, etc.) using flexible targeting rules that integrate with your existing OpenTelemetry attributes. @@ -20,7 +17,7 @@ Managed variables are a way to externalize runtime configuration from your code. ## Structured Configuration -While you can use simple primitive types as variables, the real power comes from using **structured types**—Pydantic models that group related configuration together: +While you can use simple primitive types as variables, you can also use them with **structured types** that group related configuration together: ```python from pydantic import BaseModel @@ -119,7 +116,7 @@ To create a new variable, click **New variable** and fill in: - **JSON**: Complex structured data matching your Pydantic models - **Custom Types**: Reusable schemas created under the **Variable Types** tab -For **JSON** variables, you can optionally provide a **JSON Schema** to validate variant values. +For **JSON** variables, you can optionally provide a **JSON Schema** to validate variant values in the UI. For **Custom Types**, the schema is derived from the type and shown read-only; edit the type in the **Variable Types** tab. ![Create variable form](images/variable-create-form.png) @@ -144,7 +141,7 @@ Each variant tracks its version history, accessible via the **View history** but Variant keys must be valid Python identifiers. Once created, variant keys cannot be renamed—create a new variant and delete the old one instead. !!! note "No variants = code default" - If a variable has no variants configured, your application uses the code default value. This is the expected state immediately after `logfire.variables_push()`. You create variants in the UI when you want to serve different values to different users or run experiments. + If a variable has no variants configured, your application will use the code default value. This is the expected state immediately after `logfire.variables_push()`. You create variants in the UI when you want to serve different values to different users or run experiments. ### Configuring Rollouts @@ -1292,7 +1289,7 @@ Suppose you have a variable named `agent_config` and want to rename it to `suppo 5. After deployment, delete the old `agent_config` variable 6. Optionally remove `agent_config` from the aliases list -This approach ensures zero-downtime migrations—existing deployed applications continue to receive the correct configuration while you update and redeploy. +This approach ensures zero-downtime migrations. Existing deployed applications continue to receive the correct configuration while you update and redeploy. **In the UI:** From cab12e48d6e84c22a8cd6ee3a16b8caf0e6ca117 Mon Sep 17 00:00:00 2001 From: David Montague <35119617+dmontagu@users.noreply.github.com> Date: Fri, 6 Feb 2026 00:21:59 -0700 Subject: [PATCH 05/19] fix failing tests, hopefully --- logfire-api/logfire_api/__init__.py | 4 ++++ logfire/__init__.py | 2 ++ logfire/_internal/main.py | 10 ++++++++++ tests/conftest.py | 1 + tests/test_logfire_api.py | 4 ++++ 5 files changed, 21 insertions(+) diff --git a/logfire-api/logfire_api/__init__.py b/logfire-api/logfire_api/__init__.py index 13a9c4c37..c426bbcf3 100644 --- a/logfire-api/logfire_api/__init__.py +++ b/logfire-api/logfire_api/__init__.py @@ -206,6 +206,9 @@ def shutdown(self, *args, **kwargs) -> None: ... def var(self, *args, **kwargs): return MagicMock() + def variables_clear(self, *args, **kwargs) -> None: + pass + def variables_get(self, *args, **kwargs) -> list[Any]: return [] @@ -279,6 +282,7 @@ def variables_build_config(self, *args, **kwargs) -> Any: shutdown = DEFAULT_LOGFIRE_INSTANCE.shutdown suppress_scopes = DEFAULT_LOGFIRE_INSTANCE.suppress_scopes var = DEFAULT_LOGFIRE_INSTANCE.var + variables_clear = DEFAULT_LOGFIRE_INSTANCE.variables_clear variables_get = DEFAULT_LOGFIRE_INSTANCE.variables_get variables_push = DEFAULT_LOGFIRE_INSTANCE.variables_push variables_push_types = DEFAULT_LOGFIRE_INSTANCE.variables_push_types diff --git a/logfire/__init__.py b/logfire/__init__.py index bde0969cf..70696da92 100644 --- a/logfire/__init__.py +++ b/logfire/__init__.py @@ -96,6 +96,7 @@ # Variables var = DEFAULT_LOGFIRE_INSTANCE.var +variables_clear = DEFAULT_LOGFIRE_INSTANCE.variables_clear variables_get = DEFAULT_LOGFIRE_INSTANCE.variables_get variables_push = DEFAULT_LOGFIRE_INSTANCE.variables_push variables_push_types = DEFAULT_LOGFIRE_INSTANCE.variables_push_types @@ -193,6 +194,7 @@ def loguru_handler() -> Any: 'VariablesOptions', 'variables', 'var', + 'variables_clear', 'variables_get', 'variables_push', 'variables_push_types', diff --git a/logfire/_internal/main.py b/logfire/_internal/main.py index 0bbf5f6a6..089a9c8ca 100644 --- a/logfire/_internal/main.py +++ b/logfire/_internal/main.py @@ -2482,6 +2482,16 @@ def on_config_change(changed_names: set[str]) -> None: provider.set_on_config_change(on_config_change) + def variables_clear(self) -> None: + """Clear all registered variables from this Logfire instance. + + This removes all variables previously registered via [`var()`][logfire.Logfire.var], + allowing them to be re-registered. This is primarily intended for use in tests + to ensure a clean state between test cases. + """ + self._variables.clear() + self._change_notifications_setup = False + def variables_get(self) -> list[Variable[Any]]: """Get all variables registered with this Logfire instance.""" return list(self._variables.values()) diff --git a/tests/conftest.py b/tests/conftest.py index afdeabdf8..56ba82786 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -112,6 +112,7 @@ def config_kwargs( @pytest.fixture(autouse=True) def config(config_kwargs: dict[str, Any], metrics_reader: InMemoryMetricReader) -> None: + logfire.variables_clear() configure( **config_kwargs, metrics=logfire.MetricsOptions( diff --git a/tests/test_logfire_api.py b/tests/test_logfire_api.py index 8117e973d..476f44fb1 100644 --- a/tests/test_logfire_api.py +++ b/tests/test_logfire_api.py @@ -137,6 +137,10 @@ def test_runtime(logfire_api_factory: Callable[[], ModuleType], module_name: str logfire_api.var(name='test_var', default='default', type=str) logfire__all__.remove('var') + assert hasattr(logfire_api, 'variables_clear') + logfire_api.variables_clear() + logfire__all__.remove('variables_clear') + assert hasattr(logfire_api, 'variables_get') logfire_api.variables_get() logfire__all__.remove('variables_get') From 082d0bbe8760b6606541689492cf3b42df6e9c0e Mon Sep 17 00:00:00 2001 From: David Montague <35119617+dmontagu@users.noreply.github.com> Date: Fri, 6 Feb 2026 01:01:13 -0700 Subject: [PATCH 06/19] Add tests for managed variables coverage gaps Add comprehensive tests covering uncovered lines across the variables module: is_resolve_function edge cases, variant deserialization errors, remote provider change detection, force refresh, variant diffing, variable type operations, push_variable_types, and more. Add pragmas for genuinely untestable code paths (fork handler, unreachable fallback). --- logfire/_internal/main.py | 35 + logfire/variables/remote.py | 4 +- tests/test_variables.py | 1258 +++++++++++++++++++++++++++++++++++ 3 files changed, 1295 insertions(+), 2 deletions(-) diff --git a/logfire/_internal/main.py b/logfire/_internal/main.py index 089a9c8ca..8404b0241 100644 --- a/logfire/_internal/main.py +++ b/logfire/_internal/main.py @@ -2444,6 +2444,41 @@ def var( default: T | ResolveFunction[T], description: str | None = None, ) -> Variable[T]: + """Define a managed variable. + + Managed variables let you externalize runtime configuration from your code, + controlling values from the Logfire UI without redeploying. Use `.get()` on the + returned `Variable` to resolve the current value. + + See the [managed variables guide](https://logfire.pydantic.dev/docs/reference/advanced/managed-variables/) + for more details. + + ```py + import logfire + + logfire.configure() + + # Simple primitive variable (type inferred from default) + feature_enabled = logfire.var('feature_enabled', default=False) + + # Use the variable + with feature_enabled.get(targeting_key='user-123') as resolved: + if resolved.value: + ... + ``` + + Args: + name: Unique identifier for the variable. Must match the name configured in the + Logfire UI when using remote variables. + type: Expected type for validation and JSON schema generation. Can be a primitive + type or a Pydantic model. If not provided, the type is inferred from `default`. + Required when `default` is a resolve function. + default: Default value used when no remote configuration is found. + When `type` is not provided, the type is inferred from this value. + Can also be a callable with `targeting_key` and `attributes` parameters + (requires `type` to be set explicitly). + description: Optional human-readable description of what the variable controls. + """ from logfire.variables.variable import Variable, is_resolve_function if type is None: diff --git a/logfire/variables/remote.py b/logfire/variables/remote.py index 1188c36ab..2b7441e2a 100644 --- a/logfire/variables/remote.py +++ b/logfire/variables/remote.py @@ -145,7 +145,7 @@ def start(self, logfire_instance: logfire.Logfire | None) -> None: if hasattr(os, 'register_at_fork'): # pragma: no branch weak_reinit = weakref.WeakMethod(self._at_fork_reinit) - def _after_in_child() -> None: + def _after_in_child() -> None: # pragma: no cover method = weak_reinit() if method is not None: method() @@ -564,7 +564,7 @@ def _condition_extra_fields(self, condition: Any) -> dict[str, Any]: return {'pattern': pattern.pattern if isinstance(pattern, re.Pattern) else pattern} elif isinstance(condition, (KeyIsPresent, KeyIsNotPresent)): return {} - return {} + return {} # pragma: no cover # --- Variable Types API --- diff --git a/tests/test_variables.py b/tests/test_variables.py index 15a548e33..f5ea2181b 100644 --- a/tests/test_variables.py +++ b/tests/test_variables.py @@ -3696,3 +3696,1261 @@ def on_b_change(): # pyright: ignore[reportUnusedFunction] assert a_changes == ['a_changed'] assert b_changes == [] + + +# ============================================================================= +# Tests for additional coverage +# ============================================================================= + + +class TestIsResolveFunctionEdgeCases: + """Test edge cases in is_resolve_function.""" + + def test_uninspectable_callable(self): + """Callables that raise ValueError from inspect.signature return False.""" + + class Uninspectable: + def __call__(self) -> None: + pass # pragma: no cover + + __signature__: Any = 'not a signature' + + assert is_resolve_function(Uninspectable()) is False + + def test_no_params(self): + """A callable with no parameters is not a resolve function.""" + + def no_args(): + pass # pragma: no cover + + assert is_resolve_function(no_args) is False + + def test_var_positional(self): + """A callable with *args counts as a resolve function.""" + + def with_args(*args: Any): + pass # pragma: no cover + + assert is_resolve_function(with_args) is True + + def test_var_positional_with_required(self): + """A callable with 3 required args + *args is not a resolve function.""" + + def three_required(a: Any, b: Any, c: Any, *args: Any): + pass # pragma: no cover + + assert is_resolve_function(three_required) is False + + def test_var_keyword_only(self): + """**kwargs doesn't count toward positional.""" + + def two_pos_with_kwargs(a: Any, b: Any, **kwargs: Any): + pass # pragma: no cover + + assert is_resolve_function(two_pos_with_kwargs) is True + + def test_optional_positional(self): + """A callable with one required and one optional positional param.""" + + def one_required_one_optional(a: Any, b: Any = None): + pass # pragma: no cover + + assert is_resolve_function(one_required_one_optional) is True + + def test_all_optional(self): + """A callable with two optional positional params.""" + + def both_optional(a: Any = 1, b: Any = 2): + pass # pragma: no cover + + assert is_resolve_function(both_optional) is True + + def test_keyword_only_param(self): + """Keyword-only params don't affect positional count.""" + + def with_keyword_only(a: Any, b: Any, *, c: Any): + pass # pragma: no cover + + assert is_resolve_function(with_keyword_only) is True + + +class TestDeserializationCacheEviction: + """Test cache eviction in Variable._deserialize_cached.""" + + def test_cache_eviction(self, config_kwargs: dict[str, Any]): + """Test that cache evicts oldest entries when full.""" + variables_config = VariablesConfig(variables={}) + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='cached_var', default='default', type=int) + + # Fill the cache beyond _cache_maxsize (128) + for i in range(140): + result = var._deserialize_cached(str(i)) + assert result == i + + # Verify cache eviction happened — first entries should have been evicted + # but re-calling should still work (just re-parses) + result = var._deserialize_cached('0') + assert result == 0 + + +class TestVariableGetReprFallback: + """Test that variable.get() falls back to repr() when dump_json fails.""" + + def test_repr_fallback_when_dump_json_fails(self, config_kwargs: dict[str, Any]): + """When type_adapter.dump_json raises, we fall back to repr().""" + from unittest.mock import patch + + variables_config = VariablesConfig( + variables={ + 'repr_var': VariableConfig( + name='repr_var', + variants={'v1': Variant(key='v1', serialized_value='"hello"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ), + } + ) + config_kwargs['variables'] = VariablesOptions(config=variables_config, instrument=True) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='repr_var', default='default', type=str) + + # Patch dump_json to raise an exception + with patch.object(var.type_adapter, 'dump_json', side_effect=RuntimeError('Cannot serialize')): + result = var.get() + # Value should still be resolved correctly + assert result.value == 'hello' + + +class TestValidationReportHasErrors: + """Test the has_errors property of ValidationReport.""" + + def test_has_errors_with_errors(self): + """has_errors returns True when there are validation errors.""" + from logfire.variables.abstract import ValidationReport, VariantValidationError + + report = ValidationReport( + errors=[VariantValidationError(variable_name='test', variant_key='v1', error=ValueError('bad'))], + variables_checked=1, + variables_not_on_server=[], + description_differences=[], + ) + assert report.has_errors is True + + def test_has_errors_without_errors(self): + """has_errors returns False when validation passed.""" + from logfire.variables.abstract import ValidationReport + + report = ValidationReport( + errors=[], + variables_checked=1, + variables_not_on_server=[], + description_differences=[], + ) + assert report.has_errors is False + + def test_has_errors_with_variables_not_on_server(self): + """has_errors returns True when variables are not on the server.""" + from logfire.variables.abstract import ValidationReport + + report = ValidationReport( + errors=[], + variables_checked=1, + variables_not_on_server=['missing'], + description_differences=[], + ) + assert report.has_errors is True + + +class TestNotifyConfigChangeError: + """Test _notify_config_change when the callback raises.""" + + def test_callback_exception_is_caught(self): + """When the on_config_change callback raises, it's caught and logged.""" + + class SimpleProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + provider = SimpleProvider() + called = False + + def bad_callback(changed_names: set[str]) -> None: + nonlocal called + called = True + raise RuntimeError('Callback failed!') + + provider.set_on_config_change(bad_callback) + + # The _notify_config_change method catches exceptions and logs them + provider._notify_config_change({'test'}) + assert called + + +class TestGetSerializedValueForVariantUnknown: + """Test get_serialized_value_for_variant when the variable doesn't exist.""" + + def test_unknown_variable_returns_unrecognized(self): + """Default implementation returns unrecognized when variable config is None.""" + provider = NoOpVariableProvider() + result = provider.get_serialized_value_for_variant('nonexistent', 'v1') + assert result.value is None + assert result._reason == 'unrecognized_variable' + + +class TestBaseVariableProviderTypesMethods: + """Test base VariableProvider methods for variable types.""" + + def test_list_variable_types_warns(self): + """Default list_variable_types emits warning and returns empty dict.""" + + class MinimalProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + provider = MinimalProvider() + with pytest.warns(UserWarning, match='does not support variable types'): + result = provider.list_variable_types() + assert result == {} + + def test_get_variable_type(self): + """Default get_variable_type delegates to list_variable_types.""" + + class MinimalProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + provider = MinimalProvider() + with pytest.warns(UserWarning, match='does not support variable types'): + result = provider.get_variable_type('some_type') + assert result is None + + def test_upsert_variable_type_warns(self): + """Default upsert_variable_type emits warning and returns config.""" + from logfire.variables.config import VariableTypeConfig + + class MinimalProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + provider = MinimalProvider() + config = VariableTypeConfig(name='test_type', json_schema={'type': 'string'}) + with pytest.warns(UserWarning, match='does not persist variable type writes'): + result = provider.upsert_variable_type(config) + assert result.name == 'test_type' + + +class TestNegativeRolloutWeights: + """Test that negative rollout weights are rejected.""" + + def test_negative_weight_raises_validation_error(self): + """Negative variant proportions should raise.""" + with pytest.raises(ValidationError, match='Variant proportions must not be negative'): + VariableConfig.model_validate( + { + 'name': 'test', + 'variants': {'v1': {'key': 'v1', 'serialized_value': '"value"'}}, + 'rollout': {'variants': {'v1': -0.5}}, + 'overrides': [], + } + ) + + +class TestGetDefaultTypeName: + """Test get_default_type_name function.""" + + def test_class_type(self): + from logfire.variables.config import get_default_type_name + + assert get_default_type_name(int) == 'int' + + def test_non_class_type(self): + from typing import Union + + from logfire.variables.config import get_default_type_name + + # Union types are not `type` instances + result = get_default_type_name(Union[int, str]) + assert isinstance(result, str) + assert result # Should be a non-empty string + + +class TestGetSourceHint: + """Test get_source_hint function.""" + + def test_class_with_module(self): + from pydantic import BaseModel + + from logfire.variables.config import get_source_hint + + class MyModel(BaseModel): + x: int + + hint = get_source_hint(MyModel) + assert hint is not None + assert 'MyModel' in hint + + def test_non_class(self): + from logfire.variables.config import get_source_hint + + assert get_source_hint('not a type') is None + + +class TestReconfigureWithExistingVariables: + """Test re-wiring change notifications after reconfigure.""" + + def test_reconfigure_rewires_change_notifications(self, config_kwargs: dict[str, Any]): + """When variables exist and logfire is reconfigured, change notifications should be re-wired.""" + config = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'a': Variant(key='a', serialized_value='"hello"')}, + rollout=Rollout(variants={'a': 1.0}), + overrides=[], + ), + } + ) + provider = LocalVariableProvider(config) + config_kwargs['variables'] = VariablesOptions(config=provider) + lf = logfire.configure(**config_kwargs) + + my_var = lf.var('my_var', default='default', type=str) + + changes: list[str] = [] + + @my_var.on_change + def on_change(): # pyright: ignore[reportUnusedFunction] + changes.append(my_var.get().value) + + # Now reconfigure with a new provider — this should re-wire the callback + config2 = VariablesConfig( + variables={ + 'my_var': VariableConfig( + name='my_var', + variants={'a': Variant(key='a', serialized_value='"reconfigured"')}, + rollout=Rollout(variants={'a': 1.0}), + overrides=[], + ), + } + ) + provider2 = LocalVariableProvider(config2) + config_kwargs['variables'] = VariablesOptions(config=provider2) + # Manually reset flag so reconfigure can re-wire + lf._change_notifications_setup = False + logfire.configure(**config_kwargs) + + # Now update via the new provider — should trigger the callback + provider2.update_variable( + 'my_var', + VariableConfig( + name='my_var', + variants={'a': Variant(key='a', serialized_value='"after_reconfigure"')}, + rollout=Rollout(variants={'a': 1.0}), + overrides=[], + ), + ) + + assert changes == ['after_reconfigure'] + + +@pytest.mark.filterwarnings('ignore::pytest.PytestUnhandledThreadExceptionWarning') +class TestRemoteProviderChangeDetection: + """Test change detection and notification in remote provider refresh.""" + + def test_change_detection_notifies_callback(self): + """When remote config changes between fetches, on_config_change callback fires.""" + request_mocker = requests_mock_module.Mocker() + responses: list[dict[str, Any]] = [ + { + 'json': { + 'variables': { + 'my_var': { + 'name': 'my_var', + 'variants': {'v1': {'key': 'v1', 'serialized_value': '"initial"'}}, + 'rollout': {'variants': {'v1': 1.0}}, + 'overrides': [], + } + } + } + }, + { + 'json': { + 'variables': { + 'my_var': { + 'name': 'my_var', + 'variants': {'v1': {'key': 'v1', 'serialized_value': '"updated"'}}, + 'rollout': {'variants': {'v1': 1.0}}, + 'overrides': [], + } + } + } + }, + ] + request_mocker.get('http://localhost:8000/v1/variables/', responses) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + changed_vars: list[set[str]] = [] + provider.set_on_config_change(lambda names: changed_vars.append(names)) + + # First fetch + provider.refresh(force=True) + assert changed_vars == [] # No old config to compare to + + # Second fetch — config changed + provider.refresh(force=True) + assert len(changed_vars) == 1 + assert 'my_var' in changed_vars[0] + finally: + provider.shutdown() + + def test_no_notification_when_config_unchanged(self): + """No notification when remote config is the same between fetches.""" + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={ + 'variables': { + 'my_var': { + 'name': 'my_var', + 'variants': {'v1': {'key': 'v1', 'serialized_value': '"same"'}}, + 'rollout': {'variants': {'v1': 1.0}}, + 'overrides': [], + } + } + }, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + changed_vars: list[set[str]] = [] + provider.set_on_config_change(lambda names: changed_vars.append(names)) + + provider.refresh(force=True) + provider.refresh(force=True) + assert changed_vars == [] # No changes + finally: + provider.shutdown() + + +@pytest.mark.filterwarnings('ignore::pytest.PytestUnhandledThreadExceptionWarning') +class TestRemoteProviderForceRefreshEvent: + """Test the force refresh event (SSE trigger).""" + + def test_force_refresh_via_worker(self): + """When _force_refresh_event is set, the worker makes a forced fetch.""" + request_mocker = requests_mock_module.Mocker() + adapter = request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=False, + polling_interval=timedelta(seconds=60), # Long poll so worker won't auto-refresh + ), + ) + try: + # Start the provider to launch the worker thread + provider.start(None) + + # Wait for initial fetch + start_time = time.time() + while adapter.call_count < 1: + if time.time() - start_time > 5: # pragma: no cover + raise AssertionError(f'Timed out, call_count={adapter.call_count}') + time.sleep(0.01) # pragma: no cover + + initial_count = adapter.call_count + + # Simulate an SSE event triggering a force refresh + provider._force_refresh_event.set() + provider._worker_awaken.set() # Wake the worker + + # Wait for the forced fetch + start_time = time.time() + while adapter.call_count <= initial_count: + if time.time() - start_time > 5: # pragma: no cover + raise AssertionError(f'Timed out, call_count={adapter.call_count}') + time.sleep(0.01) # pragma: no cover + + # Force refresh event should have been cleared by the worker + assert not provider._force_refresh_event.is_set() + assert adapter.call_count > initial_count + finally: + provider.shutdown() + + +@pytest.mark.filterwarnings('ignore::pytest.PytestUnhandledThreadExceptionWarning') +class TestRemoteProviderUpdateVariantDiff: + """Test update_variable with existing config (variant diff logic).""" + + def test_update_sends_only_changed_variants(self): + """When updating a variable, only changed variants are sent.""" + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={ + 'variables': { + 'my_var': { + 'name': 'my_var', + 'variants': { + 'v1': {'key': 'v1', 'serialized_value': '"old_value"'}, + 'v2': {'key': 'v2', 'serialized_value': '"unchanged"'}, + }, + 'rollout': {'variants': {'v1': 0.5, 'v2': 0.5}}, + 'overrides': [], + } + } + }, + ) + put_adapter = request_mocker.put('http://localhost:8000/v1/variables/my_var/', json={'name': 'my_var'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=True, polling_interval=timedelta(seconds=60)), + ) + try: + provider.refresh(force=True) + + # Update with v1 changed and v2 unchanged + new_config = VariableConfig( + name='my_var', + variants={ + 'v1': Variant(key='v1', serialized_value='"new_value"'), + 'v2': Variant(key='v2', serialized_value='"unchanged"'), + }, + rollout=Rollout(variants={'v1': 0.5, 'v2': 0.5}), + overrides=[], + ) + provider.update_variable('my_var', new_config) + + assert put_adapter.call_count == 1 + assert put_adapter.last_request is not None + body = put_adapter.last_request.json() + # Only v1 should be in the variants (v2 is unchanged) + assert 'variants' in body + assert 'v1' in body['variants'] + assert 'v2' not in body['variants'] + finally: + provider.shutdown() + + def test_update_sends_new_variant(self): + """When updating with a new variant not in existing config, it's sent.""" + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={ + 'variables': { + 'my_var': { + 'name': 'my_var', + 'variants': {'v1': {'key': 'v1', 'serialized_value': '"value"'}}, + 'rollout': {'variants': {'v1': 1.0}}, + 'overrides': [], + } + } + }, + ) + put_adapter = request_mocker.put('http://localhost:8000/v1/variables/my_var/', json={'name': 'my_var'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=True, polling_interval=timedelta(seconds=60)), + ) + try: + provider.refresh(force=True) + + # Add v2 which doesn't exist on server + new_config = VariableConfig( + name='my_var', + variants={ + 'v1': Variant(key='v1', serialized_value='"value"'), + 'v2': Variant(key='v2', serialized_value='"new_variant"'), + }, + rollout=Rollout(variants={'v1': 0.5, 'v2': 0.5}), + overrides=[], + ) + provider.update_variable('my_var', new_config) + + assert put_adapter.call_count == 1 + assert put_adapter.last_request is not None + body = put_adapter.last_request.json() + # v2 is new, should be sent. v1 unchanged, should not be sent. + assert 'variants' in body + assert 'v2' in body['variants'] + assert 'v1' not in body['variants'] + finally: + provider.shutdown() + + def test_update_sends_variant_with_changed_description(self): + """When variant description changes, the variant is sent.""" + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={ + 'variables': { + 'my_var': { + 'name': 'my_var', + 'variants': { + 'v1': {'key': 'v1', 'serialized_value': '"value"', 'description': 'Old description'}, + }, + 'rollout': {'variants': {'v1': 1.0}}, + 'overrides': [], + } + } + }, + ) + put_adapter = request_mocker.put('http://localhost:8000/v1/variables/my_var/', json={'name': 'my_var'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=True, polling_interval=timedelta(seconds=60)), + ) + try: + provider.refresh(force=True) + + new_config = VariableConfig( + name='my_var', + variants={ + 'v1': Variant(key='v1', serialized_value='"value"', description='New description'), + }, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ) + provider.update_variable('my_var', new_config) + + assert put_adapter.call_count == 1 + assert put_adapter.last_request is not None + body = put_adapter.last_request.json() + assert 'variants' in body + assert 'v1' in body['variants'] + assert body['variants']['v1']['description'] == 'New description' + finally: + provider.shutdown() + + +@pytest.mark.filterwarnings('ignore::pytest.PytestUnhandledThreadExceptionWarning') +class TestRemoteProviderConditionExtraFields: + """Test _condition_extra_fields with various condition types.""" + + def test_value_does_not_equal_condition(self): + """Test ValueDoesNotEqual serialization.""" + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + post_adapter = request_mocker.post('http://localhost:8000/v1/variables/', json={'name': 'test'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableConfig( + name='test', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[ + RolloutOverride( + conditions=[ + ValueDoesNotEqual(attribute='status', value='blocked'), + ValueIsNotIn(attribute='region', values=['eu', 'us']), + ValueDoesNotMatchRegex(attribute='email', pattern=r'@test\.com$'), + ], + rollout=Rollout(variants={'v1': 1.0}), + ) + ], + ) + provider.create_variable(config) + + assert post_adapter.last_request is not None + body = post_adapter.last_request.json() + conditions = body['overrides'][0]['conditions'] + assert len(conditions) == 3 + assert conditions[0]['kind'] == 'value-does-not-equal' + assert conditions[0]['value'] == 'blocked' + assert conditions[1]['kind'] == 'value-is-not-in' + assert conditions[1]['values'] == ['eu', 'us'] + assert conditions[2]['kind'] == 'value-does-not-match-regex' + assert conditions[2]['pattern'] == r'@test\.com$' + finally: + provider.shutdown() + + def test_compiled_regex_pattern(self): + """Test that compiled regex patterns are serialized correctly.""" + import re + + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + post_adapter = request_mocker.post('http://localhost:8000/v1/variables/', json={'name': 'test'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableConfig( + name='test', + variants={'v1': Variant(key='v1', serialized_value='"value"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[ + RolloutOverride( + conditions=[ + ValueMatchesRegex(attribute='name', pattern=re.compile(r'^test_\d+')), + ], + rollout=Rollout(variants={'v1': 1.0}), + ) + ], + ) + provider.create_variable(config) + + assert post_adapter.last_request is not None + body = post_adapter.last_request.json() + conditions = body['overrides'][0]['conditions'] + assert conditions[0]['pattern'] == r'^test_\d+' + finally: + provider.shutdown() + + +@pytest.mark.filterwarnings('ignore::pytest.PytestUnhandledThreadExceptionWarning') +class TestRemoteProviderVariableTypes: + """Test remote provider variable type operations.""" + + def test_list_variable_types(self): + """Test listing variable types from remote API.""" + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + request_mocker.get( + 'http://localhost:8000/v1/variable-types/', + json=[ + { + 'name': 'FeatureConfig', + 'json_schema': {'type': 'object', 'properties': {'enabled': {'type': 'boolean'}}}, + 'description': 'Feature configuration', + 'source_hint': 'myapp.config.FeatureConfig', + }, + { + 'name': 'SimpleType', + 'json_schema': {'type': 'string'}, + }, + ], + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + types = provider.list_variable_types() + assert len(types) == 2 + assert 'FeatureConfig' in types + assert types['FeatureConfig'].description == 'Feature configuration' + assert types['FeatureConfig'].source_hint == 'myapp.config.FeatureConfig' + assert 'SimpleType' in types + assert types['SimpleType'].description is None + finally: + provider.shutdown() + + def test_list_variable_types_api_error(self): + """Test listing variable types when API fails.""" + from logfire.variables.abstract import VariableWriteError + + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + request_mocker.get('http://localhost:8000/v1/variable-types/', status_code=500) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + with pytest.raises(VariableWriteError, match='Failed to list variable types'): + provider.list_variable_types() + finally: + provider.shutdown() + + def test_upsert_variable_type(self): + """Test creating/updating a variable type via remote API.""" + from logfire.variables.config import VariableTypeConfig + + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + post_adapter = request_mocker.post('http://localhost:8000/v1/variable-types/', json={'name': 'MyType'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableTypeConfig( + name='MyType', + json_schema={'type': 'object'}, + description='My type', + source_hint='myapp.MyType', + ) + result = provider.upsert_variable_type(config) + assert result.name == 'MyType' + + assert post_adapter.last_request is not None + body = post_adapter.last_request.json() + assert body['name'] == 'MyType' + assert body['json_schema'] == {'type': 'object'} + assert body['description'] == 'My type' + assert body['source_hint'] == 'myapp.MyType' + finally: + provider.shutdown() + + def test_upsert_variable_type_without_source_hint(self): + """Test upsert without source_hint.""" + from logfire.variables.config import VariableTypeConfig + + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + post_adapter = request_mocker.post('http://localhost:8000/v1/variable-types/', json={'name': 'MyType'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableTypeConfig(name='MyType', json_schema={'type': 'string'}) + provider.upsert_variable_type(config) + + assert post_adapter.last_request is not None + body = post_adapter.last_request.json() + assert 'source_hint' not in body + finally: + provider.shutdown() + + def test_upsert_variable_type_api_error(self): + """Test upsert variable type when API fails.""" + from logfire.variables.abstract import VariableWriteError + from logfire.variables.config import VariableTypeConfig + + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + request_mocker.post('http://localhost:8000/v1/variable-types/', status_code=500) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableTypeConfig(name='MyType', json_schema={'type': 'string'}) + with pytest.raises(VariableWriteError, match='Failed to upsert variable type'): + provider.upsert_variable_type(config) + finally: + provider.shutdown() + + +class TestPushVariableTypes: + """Test the push_variable_types method on VariableProvider.""" + + @staticmethod + def _make_types_provider( + existing_types: dict[str, Any] | None = None, + ) -> VariableProvider: + """Create a provider that supports variable types for testing push_variable_types.""" + from logfire.variables.config import VariableTypeConfig + + class TypesProvider(VariableProvider): + def __init__(self) -> None: + self._types: dict[str, VariableTypeConfig] = {} + if existing_types: + for name, schema in existing_types.items(): + self._types[name] = VariableTypeConfig(name=name, json_schema=schema) + + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + def list_variable_types(self) -> dict[str, VariableTypeConfig]: + return dict(self._types) + + def upsert_variable_type(self, config: VariableTypeConfig) -> VariableTypeConfig: + self._types[config.name] = config + return config + + return TypesProvider() + + def test_push_variable_types_empty(self, capsys: pytest.CaptureFixture[str]): + """Test pushing empty types list.""" + provider = self._make_types_provider() + result = provider.push_variable_types([]) + assert result is False + captured = capsys.readouterr() + assert 'No types to push' in captured.out + + def test_push_variable_types_create(self, capsys: pytest.CaptureFixture[str]): + """Test pushing new types.""" + from pydantic import BaseModel + + class FeatureConfig(BaseModel): + enabled: bool + max_items: int = 10 + + provider = self._make_types_provider() + result = provider.push_variable_types([FeatureConfig], yes=True) + assert result is True + captured = capsys.readouterr() + assert 'FeatureConfig' in captured.out + assert 'New types' in captured.out + + def test_push_variable_types_with_explicit_name(self, capsys: pytest.CaptureFixture[str]): + """Test pushing types with explicit names.""" + from pydantic import BaseModel + + class FeatureConfig(BaseModel): + enabled: bool + + provider = self._make_types_provider() + result = provider.push_variable_types([(FeatureConfig, 'my_feature')], yes=True) + assert result is True + captured = capsys.readouterr() + assert 'my_feature' in captured.out + + def test_push_variable_types_no_changes(self, capsys: pytest.CaptureFixture[str]): + """Test pushing when types are already up to date.""" + from pydantic import BaseModel, TypeAdapter + + class FeatureConfig(BaseModel): + enabled: bool + + adapter = TypeAdapter(FeatureConfig) + existing_schema = adapter.json_schema() + + provider = self._make_types_provider(existing_types={'FeatureConfig': existing_schema}) + + result = provider.push_variable_types([FeatureConfig]) + assert result is False + captured = capsys.readouterr() + assert 'No changes needed' in captured.out + + def test_push_variable_types_schema_update(self, capsys: pytest.CaptureFixture[str]): + """Test pushing when type schema has changed.""" + from pydantic import BaseModel + + class FeatureConfig(BaseModel): + enabled: bool + new_field: str = 'default' + + # Existing schema is different from current + provider = self._make_types_provider(existing_types={'FeatureConfig': {'type': 'object'}}) + + result = provider.push_variable_types([FeatureConfig], yes=True) + assert result is True + captured = capsys.readouterr() + assert 'Schema updates' in captured.out + + def test_push_variable_types_dry_run(self, capsys: pytest.CaptureFixture[str]): + """Test pushing types in dry run mode.""" + from pydantic import BaseModel + + class FeatureConfig(BaseModel): + enabled: bool + + provider = self._make_types_provider() + result = provider.push_variable_types([FeatureConfig], dry_run=True) + assert result is True + captured = capsys.readouterr() + assert 'Dry run mode' in captured.out + + def test_push_variable_types_refresh_error(self, capsys: pytest.CaptureFixture[str]): + """Test pushing types when refresh fails.""" + from pydantic import BaseModel + + class FeatureConfig(BaseModel): + enabled: bool + + class FailingRefreshProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + def refresh(self, force: bool = False): + raise RuntimeError('Refresh failed!') + + def list_variable_types(self) -> dict[str, Any]: + return {} + + provider = FailingRefreshProvider() + provider.push_variable_types([FeatureConfig], yes=True) + captured = capsys.readouterr() + assert 'Could not refresh provider' in captured.out or 'Warning' in captured.out + + def test_push_variable_types_list_error(self, capsys: pytest.CaptureFixture[str]): + """Test pushing types when listing types fails.""" + from pydantic import BaseModel + + class FeatureConfig(BaseModel): + enabled: bool + + class FailingListProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + def list_variable_types(self) -> dict[str, Any]: + raise RuntimeError('List failed!') + + provider = FailingListProvider() + result = provider.push_variable_types([FeatureConfig]) + assert result is False + captured = capsys.readouterr() + assert 'Error fetching current types' in captured.out + + def test_push_variable_types_apply_error(self, capsys: pytest.CaptureFixture[str]): + """Test pushing types when applying changes fails.""" + from pydantic import BaseModel + + class FeatureConfig(BaseModel): + enabled: bool + + class FailingApplyProvider(VariableProvider): + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + def list_variable_types(self) -> dict[str, Any]: + return {} + + def upsert_variable_type(self, config: Any) -> Any: + raise RuntimeError('Upsert failed!') + + provider = FailingApplyProvider() + result = provider.push_variable_types([FeatureConfig], yes=True) + assert result is False + captured = capsys.readouterr() + assert 'Error applying changes' in captured.out + + +@pytest.mark.filterwarnings('ignore::pytest.PytestUnhandledThreadExceptionWarning') +class TestRemoteProviderVariantsOverrideBody: + """Test _config_to_api_body with non-empty variants_override.""" + + def test_variants_override_non_empty(self): + """When variants_override is non-empty, only those variants are serialized.""" + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableConfig( + name='test', + variants={ + 'v1': Variant(key='v1', serialized_value='"a"', description='Variant 1'), + 'v2': Variant(key='v2', serialized_value='"b"'), + }, + rollout=Rollout(variants={'v1': 0.5, 'v2': 0.5}), + overrides=[], + ) + + # Test with variants_override containing only v1 + override = {'v1': Variant(key='v1', serialized_value='"new_a"', description='Updated')} + body = provider._config_to_api_body(config, variants_override=override) + assert 'variants' in body + assert len(body['variants']) == 1 + assert 'v1' in body['variants'] + assert body['variants']['v1']['description'] == 'Updated' + finally: + provider.shutdown() + + def test_variants_override_empty_dict(self): + """When variants_override is an empty dict, no variants key in body.""" + request_mocker = requests_mock_module.Mocker() + request_mocker.get('http://localhost:8000/v1/variables/', json={'variables': {}}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=False, polling_interval=timedelta(seconds=60)), + ) + try: + config = VariableConfig( + name='test', + variants={'v1': Variant(key='v1', serialized_value='"a"')}, + rollout=Rollout(variants={'v1': 1.0}), + overrides=[], + ) + + # Empty override dict — no variants sent + body = provider._config_to_api_body(config, variants_override={}) + assert 'variants' not in body + finally: + provider.shutdown() + + +class TestResolveVariantDeserializationError: + """Test the error path when deserialization fails for an explicitly requested variant.""" + + def test_variant_deserialization_error_falls_back_to_default(self, config_kwargs: dict[str, Any]): + """When an explicit variant value can't be deserialized, resolve falls back to the default.""" + variables_config = VariablesConfig( + variables={ + 'typed_var': VariableConfig( + name='typed_var', + json_schema={'type': 'integer'}, + variants={ + 'bad_variant': Variant(key='bad_variant', serialized_value='"not_an_int"'), + }, + rollout=Rollout(variants={'bad_variant': 1.0}), + overrides=[], + ) + } + ) + config_kwargs['variables'] = VariablesOptions(config=variables_config) + lf = logfire.configure(**config_kwargs) + var = lf.var(name='typed_var', default=99, type=int) + + result = var.get(variant='bad_variant') + # Should fall back to default because the variant value is invalid + assert result.value == 99 + assert result.exception is not None + + +@pytest.mark.filterwarnings('ignore::pytest.PytestUnhandledThreadExceptionWarning') +class TestRemoteProviderUpdateVariableNotInExistingConfig: + """Test update_variable when the variable is in _config but not in the variables dict.""" + + def test_update_variable_not_in_existing_config(self): + """When _config is set but variable isn't in it, all variants should be sent.""" + request_mocker = requests_mock_module.Mocker() + # Server returns config with a DIFFERENT variable, not the one we're updating + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={ + 'variables': { + 'other_var': { + 'name': 'other_var', + 'variants': {'v1': {'key': 'v1', 'serialized_value': '"x"'}}, + 'rollout': {'variants': {'v1': 1.0}}, + 'overrides': [], + } + } + }, + ) + put_adapter = request_mocker.put('http://localhost:8000/v1/variables/my_var/', json={'name': 'my_var'}) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig(block_before_first_resolve=True, polling_interval=timedelta(seconds=60)), + ) + try: + provider.refresh(force=True) + + new_config = VariableConfig( + name='my_var', + variants={ + 'v1': Variant(key='v1', serialized_value='"hello"'), + 'v2': Variant(key='v2', serialized_value='"world"'), + }, + rollout=Rollout(variants={'v1': 0.5, 'v2': 0.5}), + overrides=[], + ) + provider.update_variable('my_var', new_config) + + assert put_adapter.call_count == 1 + assert put_adapter.last_request is not None + body = put_adapter.last_request.json() + # Since 'my_var' is not in existing config, all variants should be sent (no diff optimization) + assert 'variants' in body + assert 'v1' in body['variants'] + assert 'v2' in body['variants'] + finally: + provider.shutdown() + + +class TestGetSourceHintNoModule: + """Test get_source_hint when a type has no module attribute.""" + + def test_type_without_module(self): + """A type with no __module__ should return None.""" + from logfire.variables.config import get_source_hint + + # Create a type-like object without __module__ + t = type('NoModule', (), {}) + # Remove __module__ to simulate edge case + t.__module__ = '' # empty module + assert get_source_hint(t) is None + + +class TestPushVariableTypesWithUnchangedTypes: + """Test push_variable_types with a mix of changed and unchanged types to cover loop skip.""" + + def test_push_with_unchanged_and_new_types(self, capsys: pytest.CaptureFixture[str]): + """When pushing multiple types where some are unchanged, unchanged ones are skipped in apply.""" + from pydantic import BaseModel, TypeAdapter + + from logfire.variables.config import VariableTypeConfig + + class ExistingType(BaseModel): + value: int + + class NewType(BaseModel): + name: str + + # ExistingType is already on server with same schema + adapter = TypeAdapter(ExistingType) + existing_schema = adapter.json_schema() + + class TypesProvider(VariableProvider): + def __init__(self) -> None: + self._types: dict[str, VariableTypeConfig] = { + 'ExistingType': VariableTypeConfig(name='ExistingType', json_schema=existing_schema), + } + self.upserted: list[str] = [] + + def get_serialized_value( + self, variable_name: str, targeting_key: str | None = None, attributes: Mapping[str, Any] | None = None + ) -> ResolvedVariable[str | None]: + return ResolvedVariable(name=variable_name, value=None, _reason='no_provider') # pragma: no cover + + def list_variable_types(self) -> dict[str, VariableTypeConfig]: + return dict(self._types) + + def upsert_variable_type(self, config: VariableTypeConfig) -> VariableTypeConfig: + self.upserted.append(config.name) + self._types[config.name] = config + return config + + provider = TypesProvider() + result = provider.push_variable_types([ExistingType, NewType], yes=True) + assert result is True + # Only NewType should be upserted; ExistingType is unchanged + assert 'NewType' in provider.upserted + assert 'ExistingType' not in provider.upserted From 7f20a68f0550680d03460b39e2cf99aab4d3c186 Mon Sep 17 00:00:00 2001 From: David Montague <35119617+dmontagu@users.noreply.github.com> Date: Fri, 6 Feb 2026 01:06:39 -0700 Subject: [PATCH 07/19] Fix threading issue in deserialization cache --- logfire/variables/variable.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/logfire/variables/variable.py b/logfire/variables/variable.py index 68b4028b8..92c1c8629 100644 --- a/logfire/variables/variable.py +++ b/logfire/variables/variable.py @@ -1,6 +1,7 @@ from __future__ import annotations as _annotations import inspect +import threading from collections.abc import Callable, Iterator, Mapping, Sequence from contextlib import ExitStack, contextmanager from contextvars import ContextVar @@ -167,20 +168,23 @@ def __init__( _cache: dict[str, T_co] = {} _cache_order: list[str] = [] _cache_maxsize = 128 + _cache_lock = threading.Lock() def _deserialize_cached(serialized_value: str) -> T_co | Exception: - if serialized_value in _cache: - return _cache[serialized_value] + with _cache_lock: + if serialized_value in _cache: + return _cache[serialized_value] try: result = self.type_adapter.validate_json(serialized_value) except Exception as e: return e - # Evict oldest entry if cache is full - if len(_cache) >= _cache_maxsize: - oldest = _cache_order.pop(0) - _cache.pop(oldest, None) - _cache[serialized_value] = result - _cache_order.append(serialized_value) + with _cache_lock: + # Evict oldest entry if cache is full + if len(_cache) >= _cache_maxsize: + oldest = _cache_order.pop(0) + _cache.pop(oldest, None) + _cache[serialized_value] = result + _cache_order.append(serialized_value) return result self._deserialize_cached = _deserialize_cached From 0fe82fab1d40c03f965a97a86e1fe8284a282ab4 Mon Sep 17 00:00:00 2001 From: David Montague <35119617+dmontagu@users.noreply.github.com> Date: Fri, 6 Feb 2026 01:19:37 -0700 Subject: [PATCH 08/19] Add tests for remaining coverage gaps in var() and is_resolve_function Covers: resolve function default without type, duplicate variable name, on_config_change with unknown variable, and multiple keyword-only params. --- tests/test_variables.py | 47 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/tests/test_variables.py b/tests/test_variables.py index f5ea2181b..9f3ac80b6 100644 --- a/tests/test_variables.py +++ b/tests/test_variables.py @@ -4954,3 +4954,50 @@ def upsert_variable_type(self, config: VariableTypeConfig) -> VariableTypeConfig # Only NewType should be upserted; ExistingType is unchanged assert 'NewType' in provider.upserted assert 'ExistingType' not in provider.upserted + + +class TestVarResolveFunctionWithoutType: + """Test that var() raises when default is a resolve function but type is not provided.""" + + def test_resolve_function_default_without_type(self, config_kwargs: dict[str, Any]): + lf = logfire.configure(**config_kwargs) + + def resolver(targeting_key: str | None, attributes: Mapping[str, Any] | None) -> str: + return 'value' # pragma: no cover + + with pytest.raises(TypeError, match='`type` must be provided'): + lf.var(name='my_var', default=resolver) + + +class TestVarDuplicateName: + """Test that var() raises when registering a variable with a duplicate name.""" + + def test_duplicate_name_raises(self, config_kwargs: dict[str, Any]): + lf = logfire.configure(**config_kwargs) + lf.var(name='dup_var', default='hello', type=str) + + with pytest.raises(ValueError, match="A variable with name 'dup_var' has already been registered"): + lf.var(name='dup_var', default='world', type=str) + + +class TestOnConfigChangeUnknownVariable: + """Test on_config_change callback when changed names include unknown variables.""" + + def test_unknown_variable_name_is_ignored(self, config_kwargs: dict[str, Any]): + lf = logfire.configure(**config_kwargs) + # Register a variable so on_config_change gets set up + lf.var(name='known_var', default='default', type=str) + + provider = lf.config.get_variable_provider() + # Trigger the callback with a name that has no registered variable + provider._notify_config_change({'unknown_var'}) + + +class TestIsResolveFunctionMultipleKeywordOnly: + """Test is_resolve_function with multiple keyword-only params (covers 108->97 branch).""" + + def test_multiple_keyword_only_params(self): + def with_multiple_kw_only(a: Any, b: Any, *, c: Any, d: Any): + pass # pragma: no cover + + assert is_resolve_function(with_multiple_kw_only) is True From c82374b23e0ea1169b91d5c24dbc781e6300783a Mon Sep 17 00:00:00 2001 From: David Montague <35119617+dmontagu@users.noreply.github.com> Date: Fri, 6 Feb 2026 01:21:57 -0700 Subject: [PATCH 09/19] Update logfire/variables/remote.py Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- logfire/variables/remote.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/logfire/variables/remote.py b/logfire/variables/remote.py index 2b7441e2a..a05eceddb 100644 --- a/logfire/variables/remote.py +++ b/logfire/variables/remote.py @@ -365,6 +365,8 @@ def shutdown(self): if self._sse_thread is not None: self._sse_thread.join(timeout=2) + with self._session_lock: + self._session.close() def get_variable_config(self, name: str) -> VariableConfig | None: """Retrieve the full configuration for a variable from the cached config. From ab7dfeea0fd2e45608e6b4129084031329e4a049 Mon Sep 17 00:00:00 2001 From: David Montague <35119617+dmontagu@users.noreply.github.com> Date: Fri, 6 Feb 2026 01:30:44 -0700 Subject: [PATCH 10/19] Add configurable HTTP timeout for remote variables and bounded shutdown Add a `timeout` field to `RemoteVariablesConfig` (default `(10, 10)`) so that both the polling thread and the blocking first-resolve path use a bounded `Session.get` call. Also propagate `timeout_millis` through `VariableProvider.shutdown()` so thread joins respect the shutdown budget. --- logfire/_internal/config.py | 2 + logfire/_internal/main.py | 2 +- logfire/variables/abstract.py | 8 +- logfire/variables/remote.py | 21 +++-- logfire/variables/variable.py | 2 +- tests/test_variables.py | 145 ++++++++++++++++++++++++++++++++++ 6 files changed, 171 insertions(+), 9 deletions(-) diff --git a/logfire/_internal/config.py b/logfire/_internal/config.py index 19a5cda1e..b74beb3f3 100644 --- a/logfire/_internal/config.py +++ b/logfire/_internal/config.py @@ -318,6 +318,8 @@ class RemoteVariablesConfig: If not provided, will be loaded from LOGFIRE_API_KEY environment variable. This key should have at least the 'project:read_variables' scope. """ + timeout: tuple[float, float] = (10, 10) + """Timeout for HTTP requests to the variables API as (connect_timeout, read_timeout) in seconds.""" @dataclass diff --git a/logfire/_internal/main.py b/logfire/_internal/main.py index 8404b0241..bcabdf45c 100644 --- a/logfire/_internal/main.py +++ b/logfire/_internal/main.py @@ -2388,7 +2388,7 @@ def shutdown(self, timeout_millis: int = 30_000, flush: bool = True) -> bool: # """ start = time() - self.config.get_variable_provider().shutdown() + self.config.get_variable_provider().shutdown(timeout_millis=timeout_millis) remaining = max(0, timeout_millis - 1000 * (time() - start)) if not remaining: # pragma: no cover return False diff --git a/logfire/variables/abstract.py b/logfire/variables/abstract.py index 4f747bb85..66f251635 100644 --- a/logfire/variables/abstract.py +++ b/logfire/variables/abstract.py @@ -631,8 +631,12 @@ def refresh(self, force: bool = False): """ pass - def shutdown(self): - """Clean up any resources used by the provider.""" + def shutdown(self, timeout_millis: float = 5000): + """Clean up any resources used by the provider. + + Args: + timeout_millis: The timeout budget in milliseconds for shutdown operations. + """ pass def start(self, logfire_instance: logfire.Logfire | None) -> None: diff --git a/logfire/variables/remote.py b/logfire/variables/remote.py index a05eceddb..9fc5fbb19 100644 --- a/logfire/variables/remote.py +++ b/logfire/variables/remote.py @@ -67,6 +67,7 @@ def __init__(self, base_url: str, token: str, config: RemoteVariablesConfig): self._token = token self._session = Session() self._session.headers.update({'Authorization': f'bearer {token}', 'User-Agent': UA_HEADER}) + self._timeout = config.timeout self._block_before_first_fetch = block_before_first_resolve self._polling_interval: timedelta = ( timedelta(seconds=polling_interval) if isinstance(polling_interval, (float, int)) else polling_interval @@ -292,7 +293,9 @@ def refresh(self, force: bool = False): try: with self._session_lock: - variables_response = self._session.get(urljoin(self._base_url, '/v1/variables/')) + variables_response = self._session.get( + urljoin(self._base_url, '/v1/variables/'), timeout=self._timeout + ) UnexpectedResponse.raise_for_status(variables_response) variables_config_data = variables_response.json() except Exception as e: @@ -351,8 +354,12 @@ def get_serialized_value( return self._config.resolve_serialized_value(variable_name, targeting_key, attributes) - def shutdown(self): - """Stop the background polling thread and clean up resources.""" + def shutdown(self, timeout_millis: float = 5000): + """Stop the background polling thread and clean up resources. + + Args: + timeout_millis: The timeout budget in milliseconds for shutdown operations. + """ if self._shutdown: return self._shutdown = True @@ -360,13 +367,17 @@ def shutdown(self): # Join the threads so that resources get cleaned up in tests # It might be reasonable to modify this so this _only_ happens in tests, but for now it seems fine. + # Split the budget: 70% for worker (does HTTP), 30% for SSE. + worker_timeout = max(timeout_millis * 0.7, 0) / 1000 + sse_timeout = max(timeout_millis * 0.3, 0) / 1000 if self._worker_thread is not None: - self._worker_thread.join(timeout=5) + self._worker_thread.join(timeout=worker_timeout) if self._sse_thread is not None: - self._sse_thread.join(timeout=2) + self._sse_thread.join(timeout=sse_timeout) with self._session_lock: self._session.close() + def get_variable_config(self, name: str) -> VariableConfig | None: """Retrieve the full configuration for a variable from the cached config. diff --git a/logfire/variables/variable.py b/logfire/variables/variable.py index 92c1c8629..94e5fb748 100644 --- a/logfire/variables/variable.py +++ b/logfire/variables/variable.py @@ -105,7 +105,7 @@ def is_resolve_function(f: Any) -> TypeIs[ResolveFunction[Any]]: required_positional += 1 else: optional_positional += 1 - elif param.kind == inspect.Parameter.KEYWORD_ONLY: + elif param.kind == inspect.Parameter.KEYWORD_ONLY: # pragma: no branch # Keyword-only params don't affect positional argument count pass diff --git a/tests/test_variables.py b/tests/test_variables.py index 9f3ac80b6..bbc90a80a 100644 --- a/tests/test_variables.py +++ b/tests/test_variables.py @@ -4,6 +4,7 @@ from __future__ import annotations import time +import unittest.mock import warnings from collections.abc import Mapping from datetime import timedelta @@ -12,6 +13,7 @@ import pytest import requests_mock as requests_mock_module from pydantic import BaseModel, ValidationError +from requests import Session import logfire from logfire._internal.config import RemoteVariablesConfig, VariablesOptions @@ -1014,6 +1016,34 @@ def test_shutdown_idempotent(self) -> None: provider.shutdown() provider.shutdown() # Should not raise + def test_shutdown_passes_timeout_to_thread_joins(self) -> None: + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={'variables': {}}, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=False, + polling_interval=timedelta(seconds=60), + ), + ) + # Replace threads with mocks so we can inspect join() calls + mock_worker = unittest.mock.MagicMock() + mock_sse = unittest.mock.MagicMock() + provider._worker_thread = mock_worker + provider._sse_thread = mock_sse + + provider.shutdown(timeout_millis=10000) + + # 70% of 10000ms = 7000ms = 7.0s for worker + mock_worker.join.assert_called_once_with(timeout=7.0) + # 30% of 10000ms = 3000ms = 3.0s for SSE + mock_sse.join.assert_called_once_with(timeout=3.0) + def test_refresh_with_force(self) -> None: request_mocker = requests_mock_module.Mocker() request_mocker.get( @@ -1075,6 +1105,121 @@ def test_rollout_returns_none_variant(self) -> None: provider.shutdown() +@pytest.mark.filterwarnings('ignore::pytest.PytestUnhandledThreadExceptionWarning') +class TestLogfireRemoteVariableProviderTimeout: + def test_refresh_passes_timeout_default(self) -> None: + """refresh() should pass the default timeout=(10, 10) to Session.get.""" + request_mocker = requests_mock_module.Mocker() + adapter = request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={'variables': {}}, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=False, + polling_interval=timedelta(seconds=60), + ), + ) + try: + provider.refresh(force=True) + assert adapter.call_count == 1 + assert adapter.last_request is not None + # Verify the timeout was passed by checking the provider's stored value + assert provider._timeout == (10, 10) + finally: + provider.shutdown() + + def test_refresh_passes_custom_timeout(self) -> None: + """refresh() should pass a custom timeout to Session.get.""" + request_mocker = requests_mock_module.Mocker() + adapter = request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={'variables': {}}, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=False, + polling_interval=timedelta(seconds=60), + timeout=(5, 15), + ), + ) + try: + provider.refresh(force=True) + assert adapter.call_count == 1 + assert provider._timeout == (5, 15) + finally: + provider.shutdown() + + def test_refresh_timeout_passed_to_session_get(self, monkeypatch: pytest.MonkeyPatch) -> None: + """Verify that the timeout kwarg is actually forwarded to Session.get.""" + captured_kwargs: dict[str, Any] = {} + original_get = Session.get + + def patched_get(self: Any, url: Any, **kwargs: Any) -> Any: + captured_kwargs.update(kwargs) + return original_get(self, url, **kwargs) + + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={'variables': {}}, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=False, + polling_interval=timedelta(seconds=60), + timeout=(3, 7), + ), + ) + try: + monkeypatch.setattr(Session, 'get', patched_get) + provider.refresh(force=True) + assert captured_kwargs['timeout'] == (3, 7) + finally: + provider.shutdown() + + def test_blocking_first_resolve_uses_timeout(self, monkeypatch: pytest.MonkeyPatch) -> None: + """The first-resolve blocking path should also use the timeout.""" + captured_kwargs: dict[str, Any] = {} + original_get = Session.get + + def patched_get(self: Any, url: Any, **kwargs: Any) -> Any: + captured_kwargs.update(kwargs) + return original_get(self, url, **kwargs) + + request_mocker = requests_mock_module.Mocker() + request_mocker.get( + 'http://localhost:8000/v1/variables/', + json={'variables': {}}, + ) + with request_mocker: + provider = LogfireRemoteVariableProvider( + base_url=REMOTE_BASE_URL, + token=REMOTE_TOKEN, + config=RemoteVariablesConfig( + block_before_first_resolve=True, + polling_interval=timedelta(seconds=60), + timeout=(2, 5), + ), + ) + try: + monkeypatch.setattr(Session, 'get', patched_get) + # get_serialized_value triggers blocking refresh on first call + provider.get_serialized_value('some_var') + assert captured_kwargs['timeout'] == (2, 5) + finally: + provider.shutdown() + + @pytest.mark.filterwarnings('ignore::pytest.PytestUnhandledThreadExceptionWarning') class TestLogfireRemoteVariableProviderErrors: def test_handles_unexpected_response(self) -> None: From a5048eef89ccd60a4e17eccde375723b51cb9eb4 Mon Sep 17 00:00:00 2001 From: David Montague <35119617+dmontagu@users.noreply.github.com> Date: Fri, 6 Feb 2026 01:35:54 -0700 Subject: [PATCH 11/19] Fix remaining time calculation --- logfire/_internal/main.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/logfire/_internal/main.py b/logfire/_internal/main.py index bcabdf45c..17a571dfc 100644 --- a/logfire/_internal/main.py +++ b/logfire/_internal/main.py @@ -2388,34 +2388,37 @@ def shutdown(self, timeout_millis: int = 30_000, flush: bool = True) -> bool: # """ start = time() - self.config.get_variable_provider().shutdown(timeout_millis=timeout_millis) - remaining = max(0, timeout_millis - 1000 * (time() - start)) + def remaining_ms() -> int: + return max(0, int(timeout_millis - (time() - start) * 1000)) + + self.config.get_variable_provider().shutdown() + remaining = remaining_ms() if not remaining: # pragma: no cover return False if flush: # pragma: no branch - self._tracer_provider.force_flush(int(remaining)) - remaining = max(0, timeout_millis - 1000 * (time() - start)) + self._tracer_provider.force_flush(remaining) + remaining = remaining_ms() if not remaining: # pragma: no cover return False self._tracer_provider.shutdown() - remaining = max(0, timeout_millis - 1000 * (time() - start)) + remaining = remaining_ms() if not remaining: # pragma: no cover return False if flush: # pragma: no branch self._meter_provider.force_flush(remaining) - remaining = max(0, timeout_millis - 1000 * (time() - start)) + remaining = remaining_ms() if not remaining: # pragma: no cover return False self._meter_provider.shutdown(remaining) - remaining = max(0, timeout_millis - 1000 * (time() - start)) + remaining = remaining_ms() if not remaining: # pragma: no cover return False - return (time() - start) * 1000 < timeout_millis + return remaining_ms() > 0 @overload def var( From 39535fe8913eef064a72cb6e1a3822d00030d1b5 Mon Sep 17 00:00:00 2001 From: David Montague <35119617+dmontagu@users.noreply.github.com> Date: Sat, 7 Feb 2026 21:31:15 -0700 Subject: [PATCH 12/19] Rework implementation --- .../advanced/images/variable-create-form.png | Bin 80729 -> 64363 bytes .../images/variable-detail-editor.png | Bin 0 -> 74924 bytes .../images/variable-detail-labels.png | Bin 0 -> 70587 bytes .../images/variable-detail-routing.png | Bin 0 -> 99088 bytes .../images/variable-edit-with-variants.png | Bin 140289 -> 0 bytes .../advanced/images/variables-list.png | Bin 77468 -> 67458 bytes docs/reference/advanced/managed-variables.md | 433 ++++--- logfire/_internal/main.py | 14 +- logfire/variables/__init__.py | 11 +- logfire/variables/abstract.py | 163 +-- logfire/variables/config.py | 307 +++-- logfire/variables/local.py | 2 +- logfire/variables/remote.py | 55 +- logfire/variables/variable.py | 108 +- tests/test_push_variables.py | 48 +- tests/test_variables.py | 1058 +++++------------ 16 files changed, 972 insertions(+), 1227 deletions(-) create mode 100644 docs/reference/advanced/images/variable-detail-editor.png create mode 100644 docs/reference/advanced/images/variable-detail-labels.png create mode 100644 docs/reference/advanced/images/variable-detail-routing.png delete mode 100644 docs/reference/advanced/images/variable-edit-with-variants.png diff --git a/docs/reference/advanced/images/variable-create-form.png b/docs/reference/advanced/images/variable-create-form.png index ead4f5f702414f316bca8b69e551b5f15c402603..a8c50e6c90b082e010567ccaef4e0f72f7477b19 100644 GIT binary patch literal 64363 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
Y|m8huxfs}PC8qsLv%PQXUije9U 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�cng&Ig(Q(884cPg6Qm@0S-NrtV^5N^9R( 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%0Dxraoo>$0!S}!58GBL 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 literal 0 HcmV?d00001 diff --git a/docs/reference/advanced/images/variable-edit-with-variants.png b/docs/reference/advanced/images/variable-edit-with-variants.png deleted file mode 100644 index 743e6240a5f7fd1f0af1b01517dc5c17be3b1938..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140289 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�u53-Wk636Q0E`3VMxRAcNzeP#(y)PLC;vwUoFD_F9Jo4XoMtunS4S|3D93S zk%iFM-|>AXDP=cxwAnY$Y5<2AKuQ@9Zw@*}`udi4h`JobF(C+FWY{;ewH3r`JBN3Ni42qo%qh3#@9(#zC%}B>udI6H=#T*+TD3H&+>evYYo(-s3dE=+VPX)vG1d$UMWO*{z((lr)oQ{sV<^m;`O&Cba0Pvr2SE&eF==?FVwxj!H5om&gy z8xVW;l<%g6qQdSreQ>mwVMTlpOLY4V?Jpe53%FwJ+JQ6nniQ!s-+$MMx`NbT`MRUs(86L_{Buq+yKkTBwIX9(tnyd4P>Yt++lvUk*hNB-nT? zx|-DGfS+ovz=06$;&R?|C5Ybwq{t*F)#BpgbL9LFpyi{cHz$p{^8E)@{;8+&+R7r> zzZ?`ReLLxlE1_E}mz-NyZC^B+T|GGF-IIVMz51(1_xtqE*;qb2xlG4Z_9`KNgH6rfY(v(y9iRhZsq>KlC> z|4}SCq(H18ssCz8jWN)SzMka_2OC?f@|i#Yp;ocU+C)0l2g0jgKPo&PLeM-~Y4-Xj`WvPcDt0Nv79c-FA^N~C|JA;JCW+WFo>9N_`_aal7#ClgA z2KH?I#5lqxsnzQz3!5r#JRmvEKmdN;s-};Oei!_Zgr16(g@sm?DmK%DXZUyS6nYNn zqfD)=7<~_Qc^rP#?*ASMjM3Mh$lM|5NWK++$CyR0G9bhKrQ09+E#5A@FDQ+D7TbwB zl~}T7HCuA>{(!xzDV7D_(Ec_uM)DT6IH*-Q>mhq*zXe z&*2C#m~@8ec&2z?6C&Uq(3DqlhHS(n#0ltizi3VS8HK@Q-QO$J!_B_k^Mm$;7QV~c zgvP|#21Y8}@D>1({mNxhYc*e$HPrL|l$ylky2qb$y?keugJj z0Hs!-q1>zD9#GeBOoqusacLEL%%sM5K(+47yHntMOc*ya2@Y(R;)}+_?`P7b{Hf*8nxC03TD$yvf=%o zVbjU=9stsMc{zSmc8sf8Ln~ZFvD^-!2Gr`bE*!h+l86GJIv#_D;>7t zqYMR{YuD-=)-Ukpg;uLuVY=A6KIXE1C!Il!F612Cl8ls33niBNrc`Np#)1)9zK4;}VetYy$R| z^|cRk`~nsy)w47&Fn*}RDVe7IKr&ElWmZGl8$#UQ2N*1f1laCaR^>*l`HnvCS-v8koUOyH3zj?m55q16!8C*pD7ocxGj1cIyA=Ly*!x!>emU{YF_}H%huc8 ze*JPc+FZVdAE6xn)~^(7B99JSfEjAi9!Dc@x!62kbrN{5py9ws{2HjNegAf0_iK00 zuZ3BNO>|^N>?NdZwRp7<3sYYDy=Ky4pKpsL#SbSbw@H&HK)v@~QsT(T{aBosXI)77 zR=@6La2Q=f%5`!oc&x19{%bi@tiq1=vn?NFE`M%KX1!%;@KH#+O3HDbMOWm?-KprU z26M60jyLa=`03R-M)4)7NOo^T(kR`Fin%2IpwLhm<@pvP=B9Wjgza49^7Z$zX(rk10=%3F3BATgK|~4LbEnGTFnaYV zm<%}{`4q0DP2E1#x7>v4)>>!T&st|?>h_NfrVO~;(opK^z%z2ICcVFs9%kq_Lu25Woi01_ zZp#LMRN6sj+w#oUvZ?vTBMVA>d|;t6mVSd$60?{-Eggq2xk4Ykj}|>B)9C^ls=@!~VdGsD;7g2uMW0 zA`l@~2go##hvr(si~-RC-KEgmnjq{*DIOs8X&0!w9~lY&gmDHl!KTuC6ggpc7k=xM zPfy>aewb;Dqjz>6L8mQrEnrYxeJihqH#hxGtiB8nJI%;`cacz(2 z9yzO)>T1-I!5-qCnc1}eWUihHrk|>U*MVD6g8oppmOx|PAZ|r)aA~AVhXjr7Pz2|& z2RE;Y%g+f+=4b8Uv%fUP1Cqx1s;etOdsAmDn2T!!$-Y_s=bv7{Sn&Diqw^&FuH!uN z-6n3ssG37>Rwce?CO`6mxp+$7=B#HW6v*nyE^icAhc%5JC9BCInhy|KVV!A-&xZeC z_o|Yljc4Wyth#XB$m-1GZ1pH7v@JMtmW@DV=Ch!*`XuxZ!|xUhO8LJ~`P`kYo*rIf zRe57`Kr^6PgN;|UW74KkE+FUOxk>tI{_f(q3hwmg-3;}Uz2@rm9Xj2X3{BCc`gNOqcuxrTFdLqtExlhrwijHGP4Uv3&D#m)IIfnpYpWx5I&pt#3& zsjAmYW2onVwc-id0KNQK5)h5m^>_F8ftFbu$pP%GbOjo=tpN=Ku>38}-2qNXC>zj# zUN|}JZfux?*eI-IX`hyTqinRn)f&3PnTA%CB`NOmgcuxgzwP;pon~R%QdtJAhvqi7Zmo7G3VK?e za|f%w+as4^sgdP>{Botj;En;plf8szZh7EF-UJ zxWzMV&tyG9x+~L0#HG|U7GWdHE4|NO=OtPPkTB{%VVr^rQN5m+V4uJiY4FC!Rz8_i z!(BRCdMiD7G-Uc$+Nn}Q`Omu3D>vfrd#(%{=Zi7uXm@nm_7t?U=-muwN^$m(r=^c2 zd+ew={^$7C{cusKIv8n}M~pKX=j+yfCaCK3G6UsNdF1Odhu$PM@dpo5%(@ZeWI#j- zxf;^4x~R36-s|r#jZ{;}*P%fe91OW0wLj6I)*Z-G$uaStYD-(m;G}3Ax9T`qjh=ny z=O^HdKiBIzG(%PSY+T|{s?2gkuFY!6kTt!MwAy*H(p@89ersnYtM6O6jdYk04==GG z#i)8qjFSH0R@=PzDE;*?+*#xLTxnx(;(ALj4E_648^ZTjK1L*r7UUep9JN* zgO<9l&Kg|yf3u}ZhOTo##23I((w<8kX!e3J_Lgl5iZyGzvVz*>4wxqw#l&cgGDc|u z%m#+v^t%>7PevS!*Sc%?#W3s8gaBI>Sx*jxCRf0CI~$T{RcxoNzq*chaGZ_Z+aDS_ zBglmmKRK8V@jhD2K+`%wRsbL>*FsC37Kd%-Rt}SIk;U~5a5C}hCS^;ywm*}vBR>YF zMc&EK@#@;5!6&?CloVY$1HF)X{(&Da(x^9bvDm@=CF!+1w06ujZNz57l+Ta`AStS>PS32t~oFFK2exjC0$t_%1dkNBIt~hOJviLXiNUK zHEZC|ktEP~`rDwaqoK9$Sx3@Pv5pyn6ug)j?lSrzO(cKJ;q{9^?z)Acr?dBa6c&2xEU2JVeQ0s`8c1+|oasLdC+CuP3UE$9iK z)|!XpCqCn4!}$lNP5s-Nm^NwxUtmQVk91T^4M-m=f-kQAK*N@KXMMi5KNFF zPn(N#BtT!Fx-;&P!JeP$tBY~m%DtT)uw3J&E^J)7&T(FG;cMR)WPNL~)Yd!TSM4sn zHIeh;HW!otGA>b8hBS3VGf;@yV`6{-0}S8l1hpVyP8k~D>O6sMH?Wo_vlX*u1C4Gd z0Dsdadr&IYpP#uS4r`jt;9zP(h&gPnLjuaeqqG&z&#amm+JDr)+z0CZ;+CG_*gy;7 z?fjirK5+!O0F;$zZ7cs=U z@+Te~_*NXaYQ!|V81vna9JbZpGWf`%mRqe_hU}HE`+Y0qy`xLJ1-l?<#HYm=u`P?dNEt z5U|WigO3~W`SV_Qt9rNIhU{WEf*PYm-JF?dXJ9DVdn@e3DLj~c(Lcu7r*q7rh{VTs zT+nIBk@<)8M(=EWtC!Wp4zqRZ)=r_*$L6(bcZ>G$+$CD}fazx?5Yd-3oPhdJQmEW4UnO0jYlXI&H3-rjR7Zpk+f9yT^wq8HWoj~;I~ ze<()yd2;^r7&Em1Xkk|EI6aGjm2g1y(8o>mg7XCF2#Z0K@=J9?mSC688S|LVu*l=h zcc;|0Bn9HnxX(_`+_~GnulAlVDj0jmadezuv@BpgI?}=jeNav=M$j_7H{3cCB4;8N znKnIru4!r)eKI80`)O2#BRHq!V+7tkGO{`l$|&{8Jo%QVlJNm=gv@>Y9a@kCgw0o5 zsZ#8KNwj5~lyK{Gt6Yh?-`t8m0V!#b;ZL9_ zI-DHc-HJN-T2L2l+c&V>#poAO=D8#rp(4B;(SxU0kIGVv#)@*Z?J`z8?tN^_<<@GF zgII4Rw5Yd}4dV4DWMr zj_-N&yI-Mg;QAQK!N>tw63b!Q^yN=l-KmYo*dX(xQ4)i)?;fjj7E02KiM3A4&ROAz zC{=>^rXc!oDveclqdM%O5{`*AyqJQ2oka($(FNEtF$`f{Y9D2d=Sj#{pFGh(&1j}i zku+H-=>@jV?@w0u2#O}JaqMNZGW14ZMK#wxxrSkaE1Q3t!S6#F{fC$ed~0U}hCCoY z(RC%LBJXBJ4o!F+uL626Th9@ha~niuD*>L1PJ)k;eA(z3Y{sHbsA6G62eKF4HA9)w zZmHp&sxd1FkG_pN_V?0r674wog_Lk7e1|-Tz*T`Afi@-#qe*K7oLKrjS zWI5jG?F+y;0lm8$6oX7m(4HM8*w;4t&wQ>KevX)W)eujsVACSj+8BmH;jz*l8-=m1 z&)62c$uRa1nlNiN`oN2Eexp|HDl^Y*8RGkb9SgX~T81VIsiRbp;-}DNjUxtB^Ncs2AuN3ZFy#Rj{&baD}{`M!8OCsoBf6`+< zK>xZBS&E6lnhUK+6pDJ*|6@n|(@*@R9oh;n#Uv#eyW>}WR8&;#$i=1zPz44D1cWz# z{75)E;{N6${VCsh{Rq5O63*+}!s>T$agUC(2S)pLNw_9!h!Xag`pi0l-@kuI?)_k6 z>c_htqBxi1J-sV8$<&h~%bGHD6^^8Fj{juPFD4uu_^Y%P+npW-8^q*Fbw@5vK7u;m zxaq9It`E&JEI3*1-jSbq#^$3^f*E2+)}|nx%*=x96-OehkutYO9QH z$CXkGa_uE&$H?6$JL?`z7of4|^9b%?V=KCyrZrW<)zZKo+aH5`?o)=}WEBz;5|fw~ zjWTJqY-}AI+)KMPA#3+qd)kzx^bNG|vlk?t7$Wjy3&R+ka)P&`R(KJJUcb!DcOlVt zb4q`?(h^3Hnj@Jx^oKfs>i|&<2x;`X!x^T5pDo8sL_x%$bfh#mYPKUzKqy0}OZ`G8 zrZyME&+eMbfde<#cw9wex9{-;MZ5OV!DdMi7<19L^#lB3kXTIx`db!$jXcZu1gn5?Q5)$oGlWapSQ)J($VGXw=qhaaw9BCeC(@IE)g{E{0JxgJ#-2 zJjZnTbety!*`I|a7^j~K6S8Rexf|hs0Wx%!{XC!CfEKDlSC31Nx z%qv*$lRw5IyHogl#1>dzqlFITn}ZfQ*1auPZizhWNLXH63=^pKS$WMWNKP^GY%t+4 zpM?e5zP4jr6!jW{*80-laa*aQsvh%|+74-FTLZwpV|MKfN`7M_W2?bT%Nlot6|?3+ zPD2We@VF=F&R@Q@pIg>0cK*>BU(WUX7qUv#zxMcMi%kNr_2-C)2p=EOF)rqT5mTX- z2^Q^=mO*Pi#yaJ1R58^-;L%zD%_u-{x~%+CDX_7QpfX!7BV}RfvaQkAckZ{XKOZTU zj48QA?RH%v=>GKlJfnPPY+tF~*em(?@>Y^s(`9F^imGjdbytGGWa9`hLEPD2@8wHx zf0j>XUXLr$y5Y4Y*d}Aj!~QGX;h0&+rRBxjt%A#wRUqnPg<`vgfzf>ty_;#BQU>$1 zXIlQywVF+y`Q)>7+3+}EUE+vPeP}W)cXytRK&S}6wT(^~6n>naGteqUgI!oI>60$eZt7p-B@Oon-%otY;L73r5(Yk~pWTYQ$YI@c&OrCye^wU}VxlXZu z@2A1+V3Kn60`0@un06V88mHy5z5Ld1>ieDAXJ@9=O;?Ct#>xT=qPkKbJeh z)DKAMHc8^IjG75_ZeTH}1cPyghZ{&}Oa?<~kD%uzee9~)H3v1-uS)kJ6aBj`>%VFp zdCb>p!~;^Ok|P_b~Ny?sCGTF@$vC~ zg(O^iR0Hq|(0A|PV1^|UDWF38aP3NblX^u}RZChw2I6|_D;NSvd$;4=`NF_3J913$=OctH>=t0R-KP7pjlpm4AJrUv%xf$Q1R7c0j0A8P`;P zlwzO~^DsgsqK08TSGBieD2fvJJZ_N(w1$dv;f79TZTX=dKxhX-PdKYB8MZGn40X5IX_lX2?qu=XnpS(=I?#in%D*ChKqUp=p= z${`nr1mAVDH$0tjK!C!4T*`RnY7CXwUX7UKWsFzzzQR{2aza%dfX%?O8qE;UfX}lF zVS&ePy#8Dm^J8G3!_V1Izufo{Xz8QuDH43t1ir_kL+*FS`{Yc@xtaaddncue%)g}b z-*fg)p>C_TWPHN2q@<)06`k=;q1lcLEuo@aPUI_%KuCoH6w>U)1~Wa63|2g^CrBi5 z&*Icc?swq|NqF%!ReVXy>+$uyi~aD2-_6Ke5KLw)gE@w13Tp<`+ag>sh{iy8pPL*@N$*&0wQ-&o%5{JF?SOa64oZF zHOihZ@;Ka+0fkYSH3nPF($+94V}1ACS=hQVClU0sn}t`xv8_l*B4o2=yOBa}~#|Y3*`{e7&vwL(ZHnMNjVLEg^-yj#c`%pIzo>raV)T6rusdS&{x(%S-zBRjm6sxo2_Q04i21PhW$oYeV?!naE^^x0CfE^f z@=_Z)x{JZdvj$VJ(pfOozFXpLW--~6Js zE2j<@PSbvtOQdJZRraYWvfOq`PeFBftu#bh6sM9))StcNNzX)9t2>Qs3skwd?c#e& z8?mvm;aVXO49|dC>2^3ft?Qfu4 z(87I_bhI?OxhJjJdwcgcuajk)V3;qxchha@I-O4A`0(g>1igJ(Zu4EC4D zbS_~0J}fL+Ii|Aaen_U$DSTlAH8p*AYHC_fFM*tI_RpsVukG;j?~YkUl+6*1g8&=J=qVXbRd*XXmUgtFA94mzWbiGU=}7 zTj&q4>8D};aH20x-?Jpv*=#T&K@1QUC|f194yF&cd<~2Np(ca1QVmdktvvtwU^Se! zm%o(znGEx}SuCw$qM+weZvQ6ILT^hj@^{=`RWC*77cM1`V$ln`mVt82BCD>fRLeT? z_{q!F%WmfS+&aSzVq1qB9j3u>2WbcS%yd&=_RV+a#CA3rg9&2JNu zD5vm_k}CB+DQV=rgtr=3mk0B#5-`w6iam08EDzF3Z{7%kdNl_GSTiful)=Ot`lQVtSi(VJPO zB8Sg3s#QfT=LLw+a+)BlfVO5c?$4nhj3|DG*UifPd^i-6J;(s*h1IvnRng^5(mg1# zc3q8M`oBT)a4gDXYr~|mxY$AAA}ebF2<~J!XB0US0|x|{fF&6)(zNqxXl<1y&D5)Q z4%qGjY&K-8ko{m_@RPj6_Jxj5lqCJF&mS)agI3Oi?@s}Z4n~{MK~iB?gcds)aW2pW zKs;_~1I{me^y?0~wd^VSy#&Djsk2+~SdQ(|_g$>T!yAUs;GFb6_hc59dAXkJ5qha8w27+&(O9eurqcdvK8Sp7V*|r$R z00aZsf!?47omTJpE>a=~AmKtFfVoc*G@GC&H3sum-XZwOfY#q`BC*|B8d!!N>EBB` ziGO?LJM`~0MV@MEYJRw{Xn(_{RTZ?dqF=+kcV6s8P*D6nUay}7hVG{)J|;5&RHF6^ zM$er>AHW^Z0U~q|8W?=(q5lWqhUwIKxIKOP^rbplNGcYIOuzIUE$V59bf*X55zyO* zF<00y5iTwun(xvxE5va?wNwT@5M1;S4scq9pcWQ8-rZdQwfmCV))L^#K#ku*6fQ^b z;P=JL==*xsX;i@e5)f5z=ISu2W%q*$85-`_MFb*g{7=7PIAH@&Il7 zl2K9$%~d!xG*nepy?#-v+Nh!<2#UQ?er)hsB#7GjWK^M#Cd=jKgYNf;}HSLRe<=y{fdv#e<_`9y$D^LKQbuLm|@=lw{;nTFK|Av^LrjS zx+Ms>ml;*yF2d~xdbEY9Dd&sdUm-9zG&D#BL@*@RFc58Za!>XXsDY0P-&j7LVsLIp_}NJOW|8}lc`!LpI5=}&6= z5~TbNG*zuz-yv;()w-7hcM|jjFfsd6(M?`hG2)60nq84p@&z6{C|z9JNG^8Y3GVA*l!lG;HSp`Gi~+Y| z+3>X#ql#h=s1;S*cMIqBY7o* z2-!fM3dVCF;n>jJ>}KNzGN(BY)tL zSJA)nivO?m#_(R>{-3^Fi?PZPwB;ex(WC#}C*zkmzMxeJ3#r;|`!goRG;~YmGlvlVWGa1$|vE zu0g27OrT%)$;{4flWQ>g_U9e^tB4y|mo9ODs~eEhLAg-Tn!VK)I*Bj|<0e}K`x~fH z9+@dV+s0VH0Zu5O(gCJAmLTT}yjp0~(y~HVoH^u{#Z% z02aHD7E)6qQ_IfyPcNVb)Ec9kMnPBz95Ho23BLwMlPqKKzNQO|;&NObTm|7r_PKHh zN)YBswCWC~uD7PLPlLoO>Mgw6@obC%9>sE)ty&S^usA>^1%f`W(?M7Ysi-&z{rQmR z-0n-c3ey`kxggWM<8WkB{|>kvF{nKOu$ucm@Q`$CU&7FjXO##nP?X?&18wnhXg4FJ z(5ffAbr8USI9C9Z1fv51LvR`e`!D(wWh{^`Us*Zhp#XItaL3Ar!yUMg9&j>&8SxS@ z1IF4-aA^Q~$iVpnKvyj-kRa@W#4z}97lnd&TQU$02dg2V!8(K^Ee9=jaE~=wGY3N} zW{c)Eq zG=qdkOa0;>Sd1`1W87|2@%Hx4V#(Jo&4$Al_wUIFfGz+l$Zr1Z>)VFdAFgeh4i*A{ z(^h+xD@d!6GP;<8w*beP6~9DMTT64-W3UUycE`Pp zFB)qH>JxDKmf=jop%-skrv)TE)kC;HfKqr2WQ2aqlm?zwdq}(>!AQo#H4Rd|o|c-5 z>c~`hakyn#s!q=-?4N~u74gk^;pdYk53uH2uRpI#PBwra%;&PkR4RYDWfUcn2^-}1 zWs}0!8-Vu#m}Au@A$=R@d9bZkqD3Rf$j%z?8Gw>pejgE9nMWS zE5RO^RyI_480HW#BF{PlF`6cmHaK$Hm)`jJ!0f!hSrL}C0T=-|I_|*t(|tdJH7)Fo zztJUhgo*36I^1qp)JyofGmB_3R||lb_a(_v#-a*<4V|NyZZZ!T9{_j5gFsB9Xn4%J z?q}VtJ6g(Ntv@LW3=A~shkOyt;5Q-^1;h6GK?$}k$hPkAbFOL<*jl&iLK?8Mu@Nc- zcTrEPpjChwt{R{yn)Z?fKt2OB$-A)|uuiEI`;r9d=`8>>0u9lDCg8t9UanM~-*Fdm z>b)!E9u#h@92}02t0EsoBGHT8L~kpcS009|%{&?(a*8P7>6~zw_?-1A3JKWHyx%kdiWY!PhVqsErn9kKM%6*jv}pEg3BjKo zl8zF0d`l3yM@L%>*XYdKf@UDjy0^Ov<`$^Gqmgswf6qMd^d!)^+W&AS@?XXM|6-)_ zpT3;w!EHZ3ak{V98wVPt(H|&@o52_T=|8EcLk0c!Duul>|Fb#HfBL5XgE7$m?#rzj zMZlH1r~B*BkOnC{h|Irt+O>g!hDM^$9CjoSQ;O2k(*Az?p;00JcRXt#z5&4mG9Db*jF0R6P5Wh2(u4``-ktvQCrrrOi^v9KL!r41dV7dV;MwtOa^kwCoy%}{D;>JDg~4-KJHS~zT@-fM!~%HPej)39aBXUM|D z)X~@|?oLcZwD|k?C#SoA|1R;T@xO8*x~e7izboyb#Q)jk=)c$`k)=k95I2F|+7BTh zQxTq1KKcqVm;`Tw6>`_)q&J)(P_mmt`C)X`7lfkZt&dPB6eR5tVef8|YJ;KMzZOH| z_ltkPR2auT7Z9?Vv2H<0}^GVZ`5eZ>CIZEFVPLeW~h&}0B&FoSZc7+g1irs-Kd z0saI6oqr!(&10tXvb)J7=86N8w*_NC`W2$_d`D~_IMTxzvD5;9l-4v~(SN-=UGy(g z)qvMKWP3TCjL=%FNfs~n z*(bjrICg)}sBf@dg`kRz)jK76fWDnIpI`(HGT(=JpMsRH`&j()5UIsaX*x&;HlRX0 zmpnsoI71*FJuV3eBh~gytHaTb#dh^Q^!o@Cm=(T$C>j&YhL#PxF9G#`YHdHLlS8)# z>}5(oVGdxn&j+%jfc8(wms_DFBJuX^Ths2OaX`eonm`HE3ZqX9 zjFzc?f?c%t7&iJl!U6w$=f9hR|L=yse-4!Ys!;Hv0N0uC&=dIe>la#09sOZ2$O_e& zMnU$tEtm8Uz_{r#qzI5mGC#`HDxQP4MMb*610#xU3IY*7SXJ|oU@iA& z^#KGKa^JQV$RVDAWZcpvC}ThY0S(6h=nJq$t07$}s6XR<`0xujltFGAgAMh>FsSmO z;d|?o1~*dC_aZc1)0G0fD;QKWe?meI;TMD;7NKhbLqX_rBtv>ZK{b@86EhkFdhX$; zkQQ?TOc11&;ditM1gH*+5u_?mU@IBvL*y+0D0C?R<=VmD0Zm$GN9$F=42YTqoN~;e zBL%rNEUlIW#k=VE{adT}Bqzwr=956J<6frbA9 zIy*u~3u&MX^3v564x1XN-bWii0}u2LLFk`OIn|dxswf52`$78G#1$YyaB@Y38v~5w zZxCr=hsG!R_QI3rB@AO@2hs5<+4KY!SDp(hDXJ6j_LZ6F8ecXY!C{pf_%jS64?q`vly08U}Rzf1LkVp~|NETpD6 z$n*f{6+tdLi}oghK4uj14>ZB_3-kr(85q#74vo@mY-pfs;RlGeV_PEK!I>0DEH5t@vcp z0GU<&;T*{-&{1b{3hIdQ@pmr;qJ#J=rpCWHpAsA+5S-fjDgmhlB92hPn^`B`PXaSO zv``rkxS?E!!}m>}MobSZPS74zjOSW~#0+3L7hb@2fnLaZ-En?>y*D7+q53i94=gV) z2ca@9d&m%>0`4b3T!isqSfz=677-0KHKcFlu+7=^16+T=ExwH*E%rn;S_|;Sr2&r( zzx%?z`d0-NwZM2A4GLmoL%St{A|SFE@`QgM=q@fULg3W}`h-=WtU^j^%^yQ8Opnv{ z6~JFWd7@EP(uoXO1R**oHB9sw85yy?&^48qSnN~K1KR>)HQwDqNb>%k$tH-SYrYJy zi(4b+0fi5a8!;;y(0YWLxH=_&^Y z2P;UK`8y%o`SblPG$B}jK+8O;!JNM^B0>djDv+_zt>_OV++7Fhut0C!y5-aaJz(%A z(7^%@S2ZLukV)f^aLK)yf{r5;oqvP0FhN?MFr9ckL>Va8^;Y>tq4S?L&1pNqFDU2* z;(w6f()7u`y3b|=SR_>B-QZ@8Or>ulBd`{hVCD;|fDz$okj%l6vA4Aqt__Z3v4x;# z_pf`#2B`_hg9qQ%?_j$(u}b$8Kwu1?6vLuMAn0SiwYABhW5Y(xovWL!mN(_t zm6CV~vMqit-9g8PuMQ#<4aS)~8~w3?cfHO`SDOStHK9#~QLndLu|VA#b4goACjuLO z!mIheJMIE9<@2{ro&EBq1Gn&So>Os7TNmrI)gjO4&!4xT%gL_}hItrS5gZ>wLw}xc zZ^kBJHSX{*dh3-vfFiTlEAA@%8wydT%Jv25#=rtgy9xIgh#yXHo$zM)S&36S@8F;Z8~SSaub>|uq~Bl#iF|kQ;zg+EVqruB@`{=0 z4qSzKPip@hP*7{^XJx<)2R>ZnJOe}iojj835+(_OF~PrWN7HMOBRy7&xjz-;oZ@On1o|&UvmvZ^ua$7_`I#Pc17KZ9|HFCK3DYQ?L zl9J~7a&^i9f9@`Hc90f1J!7#s)oA({3~&4pL@=9_OrV^!mYjDKE%~ORg7i--CCD7KJ68PPK0gwc}ygaB!;<>EBedhsMbSiwN z7Ggripcl*lLIjUm+S}2|1vWM|x;be|adGJqv}*&I%s{KRmr!d6Y$5tLVMqewi!?bN zs90iqObTgMHG04GQO!qNUzs?3+CNNw&+}(SXAbK<4In#*jWcHy^Xe9f{dtn?=-}d_ zmMkOKu|C^6AckJGOi;W3Y-}`z`iPkL+KD&c2FQAWr24p%6YNX0xBS|U5R=)h?0&-_BvXG=@8ri89BK~ zO*%F?hEQOW*aNKaA&oJ*(`pFQ!3kMofCo&G@w-wO{*@}`NjC(;t*|J_Nj3FB%eE+} z6^u|CM5KMT!h`r-H=csEEcjd3ou3`U$%8}8(c=1g4laKFi4-V&rM$jZ04*E|G5$!l zTK6(dcH5aCf1kR;>~en3dKW9jTjd2;_QU^x*EX}kW6O?~TQfaPeyJR=2tw5smYa6M zzm?JF~|MBMo3*L^@V`omQbFwIT}&)(IZhJ7I2w^`IpJ>;%>nRy7c#vmk#$KoWz^Vpm9?mC~V zWov-E@~yP;g7_tkhU1k=3UqW6Cis*lOxKzX+a0&IKLdAwnCrPYJHQjfL4yc|ik~Tm zjV+W6!fImkw+RJw6b$8D$PvjT%;#eWf$4~l+ZO6D2l`x)X#{-u5dHk~ z2Oj5@VOXWGYOTSF;f^dR5fM?=O-&sgkQW_-LPEfCArx;G^`6#Lc>40u!2#iwheXko zhEURm+k`7aw!k_oI2{H@+Sc~=SfTN|oSYn0;vYYLsKf&re-No0xfm=7u2({dtKPXN z>c)`~wvFD>Y8TO?n+JmY{Mix%8W&mhTpS!)|9q?gx3Ape`pG}LOXI1=M(~{ep7Aa0 z2Tz9Tr5c%Fk%4)XGF2ZqhJiFK#JUthmWRdAVuDYfb^35%@f>(q0G(IDLOIhqaqTj& z7x_XfBPYf-3vl{kxgf9Hz5&k#+#MmB=J1#P{P`2|BWdDD-%7}II6glIadVJFg~*q~ zUsV&lsV1QEyxt#g{q}IGMQ7)Ee2IG>&iaYl=k7B-``;DG1bLc|;ll0m;)ZTs52>JtX)LFv)G_4+PG#2x4!>1bnPIRiDK!y&Eh-B zLFUz&0U4!1*>f!z-Ui|`f&m^);Rb}50~jgIq`!Lg%E0@y6zq*5I4`a5_~K1I>rP@8 z7m9rhr<$cwBs~HJH)S14VDzZZb<+rB(GlbXbV^U5h1jH#>t^)B?*^bf(BobcW_p|V z62!L&2@giC3beGeczAiCn>lcROr|fJ{3y4gfqK>2Vi27lbKW6&R^{PSn>hYsper7SWTs-)@C6g>)uF5XfEtm&s{(a?)T*3GfTf z%CS)BeP*+T5dw5*JUuB-gyQ! z-L+}l@(32dLK6@v(o3S$hmIh)b?= zYzS#Gxgs<}wE52k-oI8d`u|t|-)_(Rvk>^d^tq=uQM%(|<1LTY#4*^a7GqT1#u@m? zQ9~Xq96jKlIJ)s4ehDX_%X*GT9*p>kzux8JaMP~Y4vs7b|Jjf42zc+I3DaXv9z zA{4}sapB|7G4D<8OEa4rgQ)r>*GButD| zgCkR2r0)7bwh1NS!G7BH7tY;FTyGQ1rA-Rxo9OP<$IE=Iv)_dR?G|+4k#xY8=jr5> zL3G^MI5Sm0^?XPqS*SrkNXUlcxuIzFOX(u^o~EDjpt4;ft)(-x`6-ka1|A1>|EY?2 zpc`f;x(7NX4GatbS3H;zC1xENO1C(V(*eDaT&)A~ngF(pzm`AmV3Ja$uC&PS#g$Mh zH+FxUMsSw-$ENc?fA9nD9%$2Qm_PbDr)_6M5iK~Ng!7IG|$nZ;&z=^zD*pT z!4T@T7273tcFR^oZ_L)LnG33Izon!<36EPgC^cwuC3OGI7A|*hAd;T1_3Jc1o;{p; z<1w$jHKvQL)QZn)c4z)(%lih+#8*_51*ONKogU6X4TAkh>DyC#joH34)wT`yi)g=e z8tUm6Mu>w%anuZ2Fn+Se`k*f48;5m^{n!La$%(f;QuArR%lKV3i-J-RonNR+f!$mb z_4wN1-}6GUe#gV3y0i0KBh$TKnbKuwy@IZ2VPk+W-oBk>Ov+f2l#>gX`(8@9*^HRyh)1Uvs&{NEH!nBs*}XuDQ)JY0*_7yuBEmoCGrrXNv{tuu>LwF3z!=y%zx1 zo_J4luG^zzv3gr~7ReD_U%DECo5YARQa(TO_ArdQ*DWD|XCC7-X~0q+s27H8_Tt%{ z>IZR;k}e+TnaXn1#UR4)O!#sZ3iuEixKxR6JXZGY?7jr71z)%%<+#3t$a=02GV@MT zXD}On)TG)UdHcS>w7R?40&Gy_DFH4vkeZ&UNq3rzm5C740(MgjE0$kqccUre zkFNtOksIKT$X2s+b2o&~A9;`?4skmALP3Anz<)e%zs&J?Zi@hI)h!MqBbJ+2pdsV|(i83Bi%2a*2i zV(a+_YWue_5)TsG??+5r5LuMHc(7PAm4me=j7e=e@I>W8(n6oTi;_i-7buQ3?0lZE;Yg z?rK`UeviFa0?aM&H?P*$TQ?&>#82G1<2ey#UJcgAPC*!`|Dn_@S3-Suhho@|+oH_* z%0WcDxHpLXI-O*f__K9Wce!OYk&30!&qw5m2*0bTfgl=Fzj9sV$etBPEisYu@_e4l zXuDk#ibuDlRqMJ*utWY5i!<+`^Pe3UXAXB)Auiqr_h!1mM7x=InC|I&GmU1r?}KS=fWrX_oocNc9r#F9niaaI;LSE} z##Fo$_-+#f*ev8`alnXqlLiI!7(HnSbp!xt9KhZXA;|o7Kt-pj?8lclpnkOCKyTb1c% zs#1+6?47p1k$M1aP#%jpu0G+y_t@lMrBMH1y6~=U%q7~mK|*Er^?Ys}qgC%Xc#{!b zf&H71_5lacqDkpL*C;fwN~ z(=*i%t_23R%nQSCrZ|7VnjAlSZ95CeM5dJ-PgVG z*BSqz3_vTKZAEri!8tN1-;(m%hf%LZvOj?t-}wd82x=^`_1xnipAdb%y8A^>`jar_ zCWo>L*#Q7~>N{4)9PVZHrY0`{qZk%YHYc-TU%$*3sg~yVn-u5(rMFF0_T{_&%BYIX z^F$8R_V5e%I^kFR`?oz0tvX-O=)+hww_u|h4{yC+3pz)Q_@on;hUS^@CVnk;bx6wu z+jurqe^|=Xvw@N7Rw&`p4NKF{lK6F0MTzOLbVZ-DWjc#y{b0L}e{}v&aB#54=hs?p zW!{10yEBgf>rP2gk!ioWD(@?gV(5bFi8-(X>IDTXEY}@6p~R3s1eq=Zxh%r zb?78#n*grWUe}7oH?6(CnD^3a{Rc1{1A-6ib~u3@ub$S$6}#YrcnKyqrwMPS5&ld5iFxK({TwsQP=wnJdKf6GB2t8{V0ph^(+*9*oGcJ zyS%N9!CBf+yj0s`j=w$k?$U{(0L&TOW1D0Xk_EHdewt3UgqL?{uwqh<PQ*Jt4D-A!q zrn^kfvJl?`eH}nqV)FX&kIeEGWWZDH{6RkvxBxgo*ikN4fjuyX4hSY$3sL48B@DXy z={DbsuIXrM_SD$5LkPMGPQM2-49;4_@y&S5N#*r%H18D~V^qJC zxC`UBK!n(5yH=Tt0ugvGta~k<1tI_#4u|e0LDN~e2oLq+&{_fwx$_inqqhdLK9hPj z*Uaf-{(0q~)!#7YGB(KC7{KR<8m}xY{3cdG@#?YPd$CP{8np|7r#yu3+rM^QhXw^ z!?E>>tr3^JRI5dres}Jzen1w%-#0TGe^)3D+hhw_#4AyL)+TYQiIT~2v$T7o zC1$tDYNz4Q8-h-RSL@I6Y9JqL?2oN$yo#b;aNEh&Rr;YPG%ogZaNbP%?jbq=dbYP* z+?9CFY^;zNB=wW#IQ;jlTUOmj`1jrP$0nH*g z5ZV`THAN%6G;f(PxUP;oN}OmIk8-rE^7HGIMww~c{VsiAlwaf-d+Fp^R!XY6*TFI( z1z_T0^cNwMm9j$yIa4n1(X^G#5c7at;NG)jEI zbQx8Gp#D8L_c>_2)Q3_{UYqc}{O#zj%UvI5#-vyZBNtFqo;kj>@6oYsyCQ&cVc4T= z7Hb_aT~U_t+imeF&n2${Y>r;#s)g>9#SHtR=m5q^0V{|L{Pp?Q*m0hH?|j$VaM4_R zmh3hY6J;teK#nRILr|kvFSft-LH;IAxgK&p`SxnFygPBZG)rI9**mdmYj)DE{%}X@ zd4X%sv2W4q-Sir1R70#$C$baWW%!&^k|}#~FoBxGMB6!-YU26p#bqf>%to|hqd()v zf$2Gd;APZK@2>e4d#sy>=~y*|B>_5>^L;fX1GnN)aj93{gNS&Y0(+xM4*g8-lov}+ z`({~Pj=>pm9}?S9XZaCQqr;UbFFuT2Y| z1md9@tN=1%$^U-JcPYd05*wSU_q)41-rlg}+laz6Qil1!L(#N9Y>>RWC$U84(4U!W z_Bbw=k0_IZ?i!VlC5RQa;I~@n<$SC_McF*sZXC6E%B}-zEXudP*1F&iY$7WB%3z42 z4`Hr}d?I_qjAQVOrwm!`9=W^Nu zFsU>S(1N%U`g8kn_*1tTL&w1`w%D}oRO&BKC+rp?x49~rvpo133vHPw; zi;MNRgA?dOT=B|=As5{-XcT)p{$3oolH>-sbeFZBi@rOt0uS;VJG}*AiL)LaQMBWv z2|!i2jaWcY-&w_CDk2mFJQisx7^BhJKrFNdO@mYpN z6;$V!w3pNCWA7_^ z1Jn;MPv#_Z(0t{Pd#Gjr@)BDa>sUe7^P!S2O9oYFZ;2r~Tf^u37F-*;Xxl%__EOQe z9(|-^OcnUHuwYjIur3K4rw8(CYQP%U3tvkP2xz8Yh#_Mg$AOS7?ffC5{y8?&u0Sqh%C-xlK%MrOyH)ajs=nb)KvIN-cGh0!!f(l78Ejuaw0Af_H1{~{(IvB z&)MKSqd5rT0rfi}eh~XP*~|`oW(Z{tWwepZXs>Z^M4im}?Jv`X!brS(2p5u{HT6x+ zj2`zgAdZeNUY@NoLDnmFZgc>&-;kG2IehZ2p?kptyiw*I3L2LnBq{Iuyu+(G5J72%h)-XT!+v9GCHwDETZhhT`2yvKX?q)V>;1t|Hm{nihGR2%dHM2I+Y4=n z;<1LI_vyhQ`tzl9#f~XvA=rBr(_$v=zC>wYHg)%54Ns#JiOJ{XLW_P#AwqDOQh91?V z62UTzgfK*P=Jhs2vhl{JzRP5{lGKqE+Bd8u7@iD)*cHFf>lycqO@^h^3LAD!U!U0r zN$ko=kc(uNO08B@RXxQ0()h=+xBeP`<#eF7aM$LJ*3dYlq>uFt%gLhPb7x7x(#Z!? z_HIKbbL$vvxn+D+7AsAwtt#s#Uf(Gf`ck$(hf=I6Q4e1GdN4`!=fYYzf8AoSeixaN zf)O^N`g|+vyH?5;xZz{+#X>T@TI^@bg=3F~C@1K<2cFh>4Nn1!uv;MKIJ$`KG-0Dp z;nPAe7N*{=(B8Y0&C+5fdD2JlvLiQwEv0rFn-`$yQ-onA{>=FnI=+7 z^kUjAxt0+p%B&Pg^l8LCP85=LfFIEg=L53o=ytc|=?^HW3Jzy|rty0_@ss8#9g>f1 z+z6w>Kh$FA-{%;jI4c;PEtrlx9mntvxS&{&2M0f{yi!NX>wk%?`WHLn{)hTM4K$r- lw7ylA3h>_Oj<%qa$9&7htDrmN4@d7>Ps{jLjmDiP{{~xRVXFWD literal 77468 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%0A9{peJPaq@78~k+0;ztX)EK z#5TK{NWIhVxRkA$SKl6y{Tq0jTe9`5*O9$@{{DX6yLe=v=T6OXRr6mzoyaX<-DB4U z)?4wC-H%7|6>%-KG%qt?0-K;onDRWkzAHtz6mi5`}=K3x=hfH%qOaBX8l!?)J^+ve5N`n)YI z2VA}v?=ug26lX#xo7*y{r>0{6G}{dkgUrAo>}fRtoFBo4`O5VB!xLzC70n2176i|L zg;AbSMfKaz5}Cte2Umi4Ky0%^Ndh#?7nLGJZ;zlEWQ zc<|SEr8I{xBBdApOUw(r=4xxlh!XU@V^&cI_sCPQdBGC27Ux{Q^eZ?Sufw)s8Cnk&-3 z1!mjk=BxUP>kGKQee9<=PiaRYzlo%hMoMBTb#+Olp3mj;7dy*8~JpYCF$7uI^0Q+E(xL^|50HGt%%Ycj5)*kQLg;$RShkqe9`?_&Q z^DGl9>oSa7>d1bAw$Jyh%6g14YR?g4^P9&<7N$U1D#*`AjM>$_Uwm0rT+IathzwTI zA3v8JxMj)jlEZb}@#yMY`H+$l1516&6DJ%_JekfE($X3|w)!F?WAN7JQ^#p(HOP-+ z3`)i{7kQ0^4=*mJKXEIAKy>m)7NYPZwTqmAMv0h|>1Js%j_PMsy_Y>}VPOIG{tA$F zitHI9Kyb+O0|NuA-J`!<_XkwT&C0iskkr+G{4k|cbho9c$l{zGz6&iaZNi-;w+B31 zq^H=EWScAn3)~r6gYEzW@&_&eNL3wD1AJBP?3$sEe{qICI4t2pLPJB*f)yYcqaSki z^lTn9{Pyh|7z}`AGi6f>W3{$!*#a8aQpH3S#I_h}-ruP8`%jbFyLXymffAXCX{YC1 zIoyGw#8y`)4Nr_&~n05A6rhSso71Hs(a2kr-0^)j(;BPD4ilsAH3R_ zAL05&?X75ATU!YZ!EfLA)7ik#Q1%xiS&KC6;BDC<+k2;`wrfF6>4cf@VQzaRC8f>` z*V{Hnj-UKgv%H9leNgdh-&V1zH1?*7s`B!3J`$1)#U`eY_Pn9VBB~u}eVyXF$5b)` z)H5jRax+TL+x%T!zKN@>7Zpj+H-p&c^P{tb6LU&4US?llNeku68N`abj_D3K*z^Il zSF5schl-G||9F_SwTVEv(3NIJdi+xOdN>jD+aT{=UL zcsV3~IV3=Oux>tV>y6ic4u7_pTHDg~_O8zX4BEBAV!C!6;^k z%ZX5kSC9VL@$S4h+0z)31HRr)(zh#THHCRLo$-BITOixQ4b=@UyrUNHu>lW}2@Fwo zc6M}$0>)2r?tHkJ2=gj-{}ZE^8;XMB;^HcwAcuiMz;f6_b0Megi>6Zw;O%IGThfvtgKE#ZQhKh_neTRprlTgR6vzf$bxK1NrLq+lS8Ew zUqw!_y+}yNOi#J>xhy(*zfrjZ$8!hM0tpC8AF14^G03AUNSYa8$9Jr+`n`pc)@}MA zW)Gmmz!PHXmU9Oc9UWKT7K~0XQgAI9#)}#&S+%;d*z5Nvs;cv}({lnyz&tDS6yXpQ z8v+u_Qv~)YHi#;GB`qG8S*AG*yvsHcx$oYN z;>NRo-835tzWhaLl<#&gXv%IdCp;?ZYD7dyX=z*<`@s0-cK?SzS~-Pv?q=)~h;>&y zYnBp`l5)QJ?oG$8!MQv-Ez7fKcMVuLI;L=F>4qR4GK@wx7P-|LDZ;c79;9ihq#md* zF}RGYWZS=Aw;<+)7UE<)_MHm8DRwad1xG(!eI^JD=6G2F*z@Wha72}B$HsqS>bnDq z1z;=**;6(-KsZK)+Ou``605>Kr;&Kce{$;KGkWSq7vxT zgN9D6r3DS!@=w1FBqWnvR>K})ZM3}5!=>}h59hLtBj9bArj^S3BXHimx&KT8 z-Nz`vrrPi##1}5k7j!xPt&si+IE$#!F_VJMq61M=^|2QCah1~Go6qnjYGIaY>e2k= zi!YA&!nxw_z^<_P4l!&9hO?qrRk{qRRZ9z+fp~yY5YXZQx0}0=lHgZoXcy1PiEyiX zx$k<-`2=SBo60NVVzy9%-KA;DC$D(zJ(Ph-zrR7*9TU_Crw9Ei7_nxMf;|>HZL#{e zQ;FNQWv2~L5j-7Q@TmyJ7T8Gj3rKiW^z=N>Jv-AgGc%Q#^>wr3SaF`v>!J_kI|z0v z(NCW^5g&U#_COueos<+nnWyn)|LyU0!a?TiQc_Xzgq6?Hqbp#)Bo62Y@AT%sGKxV8 z9_A6NI;v%k;_tCOz=`CH)k%L>@01@qzEqdce&J6WZhg_p7aY3FikIN^k!0csfOwE5K04ZYb2#!^7lmd^{lqnYkd12{8=+2-CpKs3+K@ z1Ype#qu`ITh;)SOX=V#T3@|bry3V&~)IrOWaO}#^7BT`piAP%BVePt|_@-8}o%d|s z$JdKA+)@^2==q}WGb7^383tC*=FOXVpOG=asy~BmJSJ`lRV^mk#M<5d&6G)BLzCqt zrKQbU5%nWNLaKq0#=nz-lH9=|pKId+6W^69SIpt<=bwD*)*K3DMCaoNg7FOV5@_Nj z4q_p%itNK`6Gq*Ky!6deI zxYEk6ykT@1pO%qH)#SB@o9{>+-)`+Tc;3&ik`CjmLZ>_RU)n%B)ZPP&f6G%z^Yv%m zr^<@lz+LJ1RCgg~2H-?u@ZiQs;eD#=>iW#+j!y4+(W3TwlZw$TeuV22t@ zCusUi{Ec$EC=+9j(c`R|-MIZwQ&eqcoT{y^uHLow>Ef1Faq?r&r$@p7>BkG3`k>!O z!2?~QT_)B#17d?l`OEcUuo)ZMf8`y>o6mA{bNe-K zf}~emT>QYKym;XW!aE2y^I+nD7E0jsxuOyho*o`IbB?`ugKksfNz8AGcm!*-Zq~Y=O)hxuSg~!8zkB=p4H5K;^Nb&Ig|FbLINFv zUPk?-tc=Xp>gxL_Nl`|`AHf2+DU?y;!^0lvoHPshkvI?%A^G@ zWga1yIP5#kSj1^@Ne2HKn~62JMPrmWu^II#v4Gj$ew^YEmuRRG|6aezSNJ%PLn?rj zL!^fNUt5B%mnRwd`2`a%|B^<5(QNv^Sis0;k)~AHm zsDBjJ`XYr2K&Cx7m|^uEZnmKLv;+UC7lgG8bm6DrMS*woM1iq8Xg}yU#P59lU4C?R z=??-v{1)mvJB^A%K=*xdzDk~qlWY4ZdP5j{;aNa~Ch*1G-93Tgb#3iAbb(n}jLUKa z83acNTqA-B47ng4BjVRqbiqF5u3wJsxS@;h5EK~U$C@CL85tuM5fx={?FwkGwa3LO z8&t0(vZdb5pjgNzBO?Q4IM%Ro`lk+;Jg;urOL8HO(@)y#mpIUHbaZsk#PiBs_gEfI znX=Y6SLJVM*%sCJWyk!FpMO51E+%<7J|nqQA9Ce}2AzQAx!H|pH?CCqJ-7P(THV9a zN2t@McReCP&5$m8mAhRc8`)Ez7ZgOrax$2sr!dl5 zsri2E#T0Ql_R9DT;+MGM|I;7NJ|L0XVQpuZ93P)ST#i({Uw4AYbM-^GEVj4BPo9Kd zk1)XR2eGJE{c1=wvyv+LAl*@(4g_g{Y?S|!D_w6vsu65i*0B$GNG<*wb& zTxAdNOD7gY5qD%zaO#-EzI}(V#hd%KXmOgw1MOsyWxTYV>=$5g5OwVuI-ty{286yq z*jQpn$VXy!Q}O7c?_b5Mbo{oCDL;eF@ZagnRI6b#cl&dA(4ZKe&~6I)VJKK?7^3~; z$FLUad1YlA%a1d*U>tNb!*-+W*|UJT{wruGB0UU2-$oxxmw-~HMEfoDows@(4E_Y@ zY`kG|yF-4#)KC+x-(t^wm3|`MM03_9o}P~sFn4n-9vT%NsBlXMGLtKScYE~bPa&gf z*S7~zyLbWF(ht9Wy$8k%p1uB_2%(7F{6@KG2Jr^yHKKJzKI}m#ZqEjitVd#%Y4Y^Y z&E30iyiS$zn*Ll{YuvDJ-#+3a&p5=!#SMHLxPSj_e!d|2VJYKNRv-2}M=xm3;jHtRP1sJ=utsN?TpMO?Jy9 zQ(bD`#`!aQ;_LA6IrT&5YUD$#q+E>KnwlKp_QLqCJNglX z%>a16<5Sl_ov_QOy6euO0pKPdfx$!94~)hMT>KgvKYs(*=vPIma)^lB2FAZlQ!=;6 zF5Ddiy@sn5c%1l8SyLiK6*Cv#1KTL$!XY5kX=%g+6bWtubCTj#P!BZ9@f%ZQr;Lr& zZ|@D5v%m*T>G@5!svvj};1mpOnGZSS6w2RB!DJBaa%MnHI5oxy$AcsymZT0z*chtf z%dy!rj{g+G#LNt#2N6ikNY*|?+Ps>)9I68u!v`nS_GB{m<{sx6{Rt=?A*>4nHUJhS zUGLt$ecRmZgag!e1!?gwFtr-_vFg{aA>`#X{o8zW5!|}~kYQF)kjK+QVLkxL5oV*H z`L-hH|M~kjahI~Pa+d8ZR#5|?4*&-}R^F9Q&WYe!<1~ z{CPtZU=UBUBHY^{cr&xIK8IY5hlj^I7gGr|mWi9W{#3Ac%45INQ{=Qr`T`2|&=GvSHRWH*iB1mOO(;_@9-FajQKlZT66mU;Ba#htF`qo(9C(lw7wxWOnkOw5UnkKWPPOvS=t0-6QVm3oweG#8hW z%T~VLXYLw%fPZzut?-~V6=90$JD22%svajUk1r(J@%c>0Y5iQMhp^^rQil&p2iOaubLJ@87yQU`afOsb|!RZ5flY)Ud*j!wq=P_9$UMrHI zj%)jD5fBRX?uWT8W(uNPDvf@Z0Rn8`O#4ZFIC)Lsm4ZT2=-|{ej?UEF!hOgB18oZsCb;#)V+b=Je+zAjlyD{7{TaqU#i zT8S^e1LUdJK(%Mjui@b=M1$yZaHYTm zF*Oi6vWl~%<~uX%g%?tXS|CSHbvOabPv0;N=AIZ!-6P|r+v9?}gz_SzL-jp}sC?vd z{2bc=rCJu7(<~q*z$8;yTvka^u378%FbnrkH=Bn+@?syV3@n+f`8LyQc`}A zbaZhj>=q8|tb_|5Y*ZfSD*}j$zfv$K?}l5{+fxXV)@I z!?;h6-eu_RT)4Nh6e@yj4&mpVcw|F5V)DOKSH9SsGo$Hz4K64aZjeAT>i>`YNxOxrQt(c^^4~J6- znv^{xW|n_{QSRJ{J=r&;lQRFk(W5lWsAHF>Kj<)KPyly0Y1V?-E{1&^c?mA-#U1|N z7`C7Yhs?~k!9>w`(uztL6>_}>VnDo=1#)1+V+|fSp%JFiXr}6+3;kKz3&);Jc&IJt z?*o2ihbWCk^w0FPLu>lw&>e{5y!sick>_Z_3EF*}&e7k0{s@>p0}Nu1aho*{9{bS5 zgveEyzoaZUY>8I#9>r)laEB&774?Gr@lR`EJ@r+rzcUi3KQIeY%6%ieMX1?78oqsa zKva|<7ZA{_m`e097~TWgi%;AIWXwL`-UjMe^_n+tq$DM+0%CAHIt_Suvgy?oiMN8J zj*F9=DfCWT^FO5_@q0@e*F=*@-cJJB+hL_FOtyfSHB;6LDcT-WJqh0x$)}Q|#3^mZn=-_7f%^-q|>oJt?jbOAvPzY~F?(&dW zsrveQNC3C(*wKSY!1L$N*B;^>-s;Yn!Hy?Wdj3~{ijib%J z-rnUE6|xexryysC;PB5-<0sUc;zf7&(=jvKTU%#Zy+)ki|NRQ06g+~wBA{@HQgKO1 zo&SX^MI(}G_@hJ_dTvs7QQmQ1|7%csAeZ7BLM`ltz=f(NF&X#F$IA-?qkpc9f#Cz! zMnE31r|uz1$SzOEr8D2!4_`{P-5IBab7krK$K@s-U!JTkJl zq(tknvz**ZP-;MaD3H1F;>9X5VJ6||UA=&iq?Sdvhttx=0XtGZ%5gg0vlR~#A~DCF z%6ULv@c{lH-Gp3OzX!n##ad=m{7|F(hHyY8`FDX?1%4GSaPx>e&B0apQ-&uPj4TyYjP6JKLh0b~Y9 z&*(;JG~sBH4cKrEvLdN{$#v+Ep(rUbPTQXs_@;p5W)j-Yiooy;_&-A6t)v7lZtmO= z`sollNN#&D{6xLV_l()#f$1_1VB=X(vNHbkqLRdu;eYn!G~Od(l!ZtbHhv=U0X`bi zU08gWMo>5Yiv=8A7~xctGk)s8Cjz{-0?l`>r=sD|(2zT_C=xD0bS~@}ri8h=N4}I6 zRr1fjhJPch)(LEr^5|S&2;F_IwWv_{^x8S4YP`OKdJBVL33elCRq>3(3Y@plwQ$LD z>cHTE+u~AHl+wTTAG?+@K){b|Bc7ejr|_{+_4XzJRx)=)3Ry} zY(<#3sLDJ73`mec!@}??nVA~k+(XyN!Tts#b*zj>s2ThIJ$vm^&QPE#h<06>g1h(8 zYIS7)WsM|=jg3dY?8QF6Rx!}MhKGltjx#ii%Agp#FCD0a`Xx3t)~f0K`}f6h`2#aMHdE&W5zeaqdTl?H=ms&SdqH_EN z-%=n{AXpZ5z~SB=rvy~U6Feqfg~%SGrJyUcK5WBOue;lH^c@mgbIJ zFosB>4W3FUH(=fUFWO^Y;*4sX%QO0BtYpr?-Me=aj%#1b|9~EWdWitZ5q#?Q@ULA8 z!=|&z6fW?CgS-#&E@Iv0^yie6l%GF-00)h)e}hhwb@%R@9AF^)y^EDiPO7Tm=`o0@ zu;zw;d@hOxuob(3ZgSUQFXPPQqtaY%&rR*nF7Guol!7XfGRD$5HG;nn#GG-ekWl6i5-o)_mzKD9X!-?rf z)!%}jxE|!Z0EI-K-MnQB{`v(VW%y$6mc(h-zL}NH@b(pM(Cc(GHG%PS^8t53ANTf* z(%KIsEfkzgYkx85+_wK&KNOp`TwESz-6Ge)YgGAgEutCK6JcZRrjfL4Ow?Zc;v`K} z@B<-!{g3_O7QeD3MkI%tPn|wJ-UyBTdK9hOqe%=2?}M9_gphb8G!&Mv1hR(%a#%E( znvxO9?Ud|n8&IPO`U*r#B?qLXeZX2rbV*o%lMgl|pW=tESr2@66f+Qtlw$c19509P zlQDGPSaM;c2p7)vs?O|E>sCs51S4HkDUs1gaB*?DA)N>dYmb3BiS1i=iAg;)xM)6M zhj_DLZf*`UjCVk<(C$M8xrlli%QV=2*Pz84%EWwiJ)M#iy&MrqiN+EPta34Hm@>n= z4Dx6)&|>U)>xH(!@i8(EUY2%hxgw?#izd!f!GK^%DcG75$(DR)vyki{AkdE+g zCj}v=sHo`rUG~}{WpO6%`bSRF8t@T;&`)>v|iIQC%mT0?A2M z1{sJ6O(3p_=+I+xgJn%Pjsl^Dxx28iz%P=C0tBTf8aB7uCOnbMk=oosc63q2KH=KE`RJLu#YtF<$lU{fDlm1g+hlU5l3WRanQ z(jMaqj{@VPaOwb@gsCLBVOSwN2+mJgnIudnmZkOQ#`22(dE}8XrqX(F^nn;+cKnkQ znwTj!^eIVpaJ35aKJe2(AcE<&w~>v$erye;{w)}>isNSN zvlyqRNZh*KeB$ut*&D-4G07* z08xU+bka>s{y|aIGz+B^NQcMTX12{|m+CL6*V`vH|m6eqp>g1;38!5W2+ejmxGbFAS zKDj7+IW&~vkfhh-89*8I81C=h4e+WQQ!ESyQ1gi#v~B4_r-JF<2lVml?Pzr5Z!OaK zNT3kykIt%8CnF*=nZ@8~-2gBWu=M*app-|&#j%Niu+pjq2L>La>GJIHwn0z;E^u<~ zs$R+_)zsGVD|3XD?`hZI(N8pggAZV3Wo>FYeohqNOIB7E;OF)GHpc^?aqXYU9r{~q zD!ra*i+6ysNBnA``2XjJYkH&riXA>b_bsJ^WE}1D=^^({h@C+Sb2zd7#mm#&rU*m4R$<0dbo||hHpFd1g`pf z!;|baHK+14+7=AC)jQC)_iAdb(l@C#u=&z3F+EtjbwM`xmx}OKmmzk+_&?Zm;d!~!JrQ{2+}(b@V0H4g}Z0n-vTYNH*fe^(ZU7J@Lt4JJLPBI!1Q z0qWz7Dwx&=uFQYOu%i8(v$Jzs7F0F*D8pgiaGj2j=?@KApFb}Jo-*p*lXl>kV`O7> z?%W|@a%#eG8!7ggv0HoLgCwr~?sm6CD+rMfi;UO9_#p!QQq$JHsa=(udtP6^jY#r3 zU}by)Eb+aNpM%2^?-Qn}vBl-(^UboWOMoA-pCJd$AFlN#iNY8XEAy^h+~X1^E!EWn zc-XPFs7Z1T{x|&s{TR9_J4Z*T4o2{@tv`fHH6mL+efl(ZpVGK0JD~Em(nLYF0|(mP zz5DUWJTPJ5T?R!u{<>WQ8|XKL*EeV?^<9Wc>DO;i=}%5iW8tz~ZC(0)3)I%rT z_)p}(-ja!hWj$a_?h`Gh{@(*!;#=S=TxgxSxko3q$1tMfYEMK9Gl*J5Zx7JM1$;g1 zme85Hj7}TbigRG*AKHUxzAVUVz@XLxe-A?~ow#PZUfh-==B&pO4=NoymUQbDZ_&Fq zZ!!TQ(1>E3eUO7A9moY^smQ5^X_=WrsKwaGE?Yd`cX;h>527Z*0Hgx*lvq|bMvAC`Jw$lqG@_trLv*0gb1yZ%AMpt&c+Sb9yFhT)N}`v{)waX7 z7$+ZhtKO~uBE#?jpq_!==fsQ-Y`3S@9@2!{VBBD@|L zd$?*P7zfAoaIev9BfQ}>XLqLI;Gu+tWBVnUh7TBB5%@LU6VNHZiG*_}PDDkG5Zi8lqNC5*GLbrrOskphmNQ$mm1^57Sb6y%68va_gwmAjY*T2f`x3~U* zGozarJAVqTy+Cpv{~?p>|9f-uxSv2(Bqn%Cik0iXU0!<(b?W=@{MQpl(C#v~_43y? z3@mEm*Z;I1YEOu|APNv7I4i4+*n>D=C4e>mDOG|+w@|_rf!MYZ*?>TR95DgEqJ~Ce zKm~X$F*BhMz?8ZT*ccySeg=ubdV-eQ$FLku3g{C@AA}t>ZzJGbQBhIwbuG2X93)4! zPJ9g@QWD(ae?JUO7yu0*$_*$6kmOn*Blcg0fh90b=DmAGhCm$j_VL+`mIEaLVXpQF zODArl3WT~!+1wQf4L*NyZcf!3Sq^R4@o}t{V^4tf7(u8@O-=o%THB8q&;@Q`;X+J? zfQH}h^1>t+^EiXG$Lkfx01-xX^hE&I85vxJ++j(h*}R|^oJ;%`<_Tcd5_BRonQC9z zq7c3KBjh3z@ZUI#@faf7*l{veWab#zzyLn9uA!GNtMwx$q)5B-n^!I2<}r)gvW*kI zDS!}%49M6rUSYD1uT*yS?GATtkbj|mO#bJ!tN~bkL`6jfuqDc*2Ra0Mj-HPgvSOnA z13t<~Z-lx-jT^?+MRbkosuoU8t4MJg=z_fQC~1yl*ggh@QjL+I_Mn>vCFdV97JN88lg0 zI%kuCVyTwxhxuK?7@?{YmFFcLgZY%BTI0y9`G3Cxbs->-cNK_P` zW}SlD=me@GvZhwIT*p9P-+tH?(9IB|+7rk|yV~SB1iuiaFTevN0gZpFff$JMQ7G5T zxw*MTk^<`{&J!MQ#+RZFR5S1@8U+@Dh8B}A4>vbr4S2G^MC<*x5Ly5ug%Mr!LOY%q zwv~^gRRB{dhUFC)8DJ0XmcX&rP37J)TfzW^|sF;+D4#ikj z)kjP`ahX0oKK#%0cHyhT|Gz3=>-y)p-Xdyrr?BW~Dm4D$ilOvV@Os13ASWkZf9IDz zFw=>z{pFzioA>vHY+n0$RrvqWY|WNWO3KJv2rtIk;gg$1=5frSR-6)3@6i3T#lJ!B z>)Hi&Qp#@DR5nv~y^))NPp;Xs{Qz zA8YYks4O@~xpqd`eD@m!os5f*7yn*iZsyv+c68P9{D~7!9F|L(|U~gU9Z4=`2NX+76y4@Atn_}Li-%9xjG@Iu#4`x6j*A@AQ z1-dr1-S3^M=7;l&s+jhlc?m-@?92+lcG`MYuy}3W-MUwqkFj07x-!TtR%>E6MEt1^ zpj9~MuHd}$!Ol!+zI3@_d8w?-YuWK&Qtn#5FWz((izS>^)iux()hkEELR-rL>|F&p)+vzPi-p?o&1O zDvyEprLy^_U!2$RiOM@EV4iI_^hVZ6&&=urg$?mtgB-ZOn|v+2-rro-gsBMJ;_>9{ zPD#PU27|7>U^+A)Y>j~?x{?X`1i%sG(mb7$1;*`Z@|*DRFz^93Vr++5Xr?@pIv2e@ zIClvRpFf|95X;a4YU+z27Zp{SxdnI-)_Wly;S-TMe0Tz!Wr9R~nd!IBT#6ZR-+6Qf0bEK6iCtC{u;$%ILwP*xlzglbLCe2}@U}7t0+e z8HlvY@Lreg$Y;@(|HyHU|#BW8|jg z;(G|_;x*n0D*-fKb65ZmL1OD;8=ZqeU zL~x-YX4$nX!IBoY@X-@SDA|C{P7ODWW2OfBgSh9ukbtVnsgd7tDmOTTox06u#&^&j zr`@{MH@Ec3lR3YsKF-BN2jk^qkF(q}vrO$v^{Rd7ga=0|1{TNK8_+0GFb=w&`E=v$ za-#qI{6ztQ^^Al$+e{nT5inv$CuKoV^XE_LLFzmFycWMx-Y0f zK#m4oU7AfkNX8MHrNMfXlaqtR?SUTJ^PJvFP`+dm{&H){u(T)E1!yB-#ha>(Uby`x zjT~MplkKrL@T6=}4^C7q7Gk=L=2&pisPxx|JpmY65BjS`Rgza1VCArBY&g2u+zEo} zLsORXNP9RbIr*bY0oN+apYK0^4J|UMXAXXx5sN`THP$prtSfm z`*#&IHLsPFluYSkKNgqG90dLQp8q9m5$rz+H=V=F0yc9{@_}uxu75x&VCYFW9!p)q zmNJW+`|*K+hQFP)HMfx*Y(BAREJqpNbUAs~BXOVPS!c`o>rg&7hv)6?xy* zmhM+hW3I`(@3M?X`EKC_^R71ejhFSz?;i0yw&LznaehF#P*&&*lizrNiOEv^hd_;x z>cAB5#(`00aS5@*{kK?FE!IOjZ*QcP4kEI zblh)<-UDM@ps58TwYE3}OBh|FJxAvYm@n*+2Brry)(}P1)F|=gq{<=ZP<#^6Q-~C5 zI1F0YG^p>WY);@mvGeF$8k&#>^2msY)6YG=m+4f+x%4YsKi%OsFDdh_`N$PV#{znh zTU3mULO@?SbNYkX)wqw|-v3Z9gz4#_jzdokPY3=zPQ++T`bWOo>WU8 z89M-W9L8wIu3@qboPYp18_-~BF6NLa;1?n#sK1XfJ0UxOC8VE0m-yau<35le1m>$N z*?Lj%BLbxQ<6Wyehgu5C`zEH?|pZR{ilf&1t$A`yc+oY zc~1LCtzq5=)0Kq6wv`W~S64obbiUuoIC%W2=A)-6vN`${!dtWqIYu!#B(e#xW0K%ObjaX_Y%E+ z1EZt4+7-MR`Y%*5+5+7Rx~equ7a0sR7kQ2Pz+#DgOuXJ6M9Ge+o5x%^eJse_>bp4) zpP$k^bLLFsr9H(DKuc(7fR2INs20U%2DG@;LtE4?=zgw$^zitKKKJ&&V;#jFP3o7j zh1Kn-F3x>i+$25psL`N~Z?)}mT(X3(bZ*UZ^p(roheb|i-AYQzEhunzaQHefSr@rW z{m_NMbxiY`(hf4F15#Qc8JqU{Pq*5n`a|oV0i=?EHG2aV9ida^4kENK;?aA26%<~h z-iGbqPi%n4!(T2&(!t`bR!mPIhanU~ z_6Hf?&~3qGrddN_WyzYgyFWm@UE=(%aJbanQMyS>EG=O;&U zoL!Mx{HI?wZ}k-MnVYNszHFa*-!gj=s1J;>100p5M!{mp4L`p z)Mo(PL>)Kz>_a)n)wHm6XLZH&%IA(+X;D7DLx;2r zu0=$QciB|pfcV@Cz5VGWg5>K|rE?Dh$jM#Zb;H(!{vJ(=Z1%cg7~oMl^%A0Z_qMmN zMjx>`MFpHXPw#%M>!*EJ>wJsg!!t%M%vC_lWaHwFk0k;$K~*}G`7!0R(e3Ge%F|(2 zt{j$>#bNRl@2r`*qh)$>OhZ(UdNU zI0@~4+L2JeG<6raY@>CRgTsox7bVZkxD3q{H^(jJ^y>RA%77-*oN{*!|D5z`IZ`d4 z_q~s0$?UuOE_J@5Pj&33jt=>ZU=!h2=XUu`W_P>lCB(!Yqo|l27cCOAXE>1K+I!cL z;h(=knW){Dz%`yDc2G&>t>52)XFm^bdT&~mWffI9>p?kYFy2+3tAR(ygevi58C0iFI*g} z1_9&R(IZLQBAl}R6_O#*S^M=r?FWpobTu{KLFNLFhqWX`5}gA0f{KCRGlnDxa*g-# z3xi##NW{zr5lB!JuIFaC4za8>c2N4u-=oDO%o^sWtf8m#^!$4ZMet2{3oZWlEP3V{ zpKWyI%eQZBU=m8qT(Yq#l&IUWvd0rOy*Df?j$rmeFeT6i0NY2saA zM4)LI!{`k`APKIm*0~-;NzW6ujKKsYU2%}h}UUf0| zw`<|TD~?gCC2hpz62W-Fal!20u8DAYfu$HGVHhO>vxH%YAU5+Uv><0RlH#`V6lK+eRY?>EZQ`DjG5!Uq}Kpx z+O6d4IB0}(JYz7)O}An}WfvDEj3sX0$d((pZxF*pD;6{n>k|~Ofh1K=W6?u2RFJ3> zuFD8c2l92awRccby1Ti3G(UYWF*^FpxpP@XH^RdSF3MN=`X?Cj*VWZQb(ER&7jp5b zDJD1xt)D{XX5Nr6hi|wh#DFh|X8_LHN14|TL^b0FtLRQG;EpgE#p708Qwx#kimoSb z%)O}p<0(^FktvuaPp(b1MSz|vAX1348q1V3gjoX~p%Z3IV;?Z;=Ush@1MfE8 zLF|5pw&BFuC+*j+l~$<+PLC-O#$vJa<4hnkq0TS7i4dFu4FUr-cab? zdvM$V7=R|n)s5aTOfcbh7|LEwf%sqgwv^%*)OX(pIPZ zo}ONU0BSwI7E=z8GkuH)qk(Mf1ATH9`w`fAK(bB&C(g-qylc?6#?-O7KPH5L%DP~A z6;&-X)YN2Ph5*KxuK6>Nm$Op??9QE=#rq2iVLp-)>Tf=ivPrm*K`sP%sSgt*tB33u zXc4@L?Nhu?O>J#pZyFmOJ@b;pXbFB7SZkP;mp2Y*2lp=jf?n*lz`#{Z>(&_zR?M|- zqoFH@Xzdyx2^s$N>w?!zs1+3=xqj{q_5BOOII+bAFDr5mF{P^tX@#;ws~_F%7}|g<{(_Vu0nt z9BXa8jQm7woatwwq!FiJKBOsxPT!!1(8gl&D58T<0zFIuf~3IOdBDYrr_0l9o)K+g zk=J6R>+a@_r|04e8r--OAaOdeVk#H+SKNV?j*gC%RfyHMqzR87w`yWyqR5Hu)fMAt zDuSf}oJ>E}*vJTiO4X^$niuM#`-Nm00q%epSx^5lTR-}t;#!prhHMr!W$vHL02zG5 zzKmj~y^aNVd(Y3$tMQlzhk;LWy!T5W``E2;;8YBTNJ%}Dxtl4cKBJ+hYpkuQ0UuXG z-v6VR#Oi8u$H$N2f0z$gfnzrJ1mzSG{SusWskklie<~PcVgY@@+Fe7X zH)P5~k^4cM_k5IR-T&(DE5o8(*S2-Jl%r=-&I!cO2jM^LvlIez^=7p69-=IIr_OFBt%w;RFEb z{sN;4^6(4rAIOG@aZUr8NMXMjz`Kd!I4k8-^g_bI@hwlEJ|(-9{45IwV8D$S1L{5$ z7Jn!f<+NFpbOWgtg=}3@g|pjaUQ(ZOVr2%yz? z0I`@4x^_!Q>FcaQ-*usCgZ8-&axlzIu5fVVRG(_2mcuVrJb3T`s+oViePN)p&SBc0 zh5!awW?FGYLgG94NWftNfe29#2c=`UJ;;XUV4(>}C^)EKxdhQ~q+xfG6srQ)1O{b( zq>w{hf!hqzLVqWilLTkhy;TAB=f8iVc&gc@$k;z}IKUs*+gU+cJUIz-10h!*upou; zaTAV7bR;Ior%mL^lPB;4!JThdfC0kqyl`DC9yC_s@O0tQz%rxldub+NlD}U>E34#e zUl@ach{!v*mnu#y5AVdPP@}D^Uq4Dy~ljOjY zBt}4}_5VCe5Xwm^G{Id?6?IAi_#X_ZWvbUe$_|ttD1aSq?ZJX^rxO7GFF^gRs~fWq z3t`N2)?vKQZJfgoCV^(CP6!&1F$SToh6DSrf%3Xy-SW(mBM zve23nz^o&B#z8`c$ped;GL*4Ul9kw+85$ZwsD|~KaANFSyQpZ0FXe%_hW0;nK(}ML z{~$Hh{QC6=urb;*IHZDTy#txS0O-HrCLC8{z7i)CMEG!Lr_p;MX_`WP21rm{n7swD~uUbLkHh50wD1>zmt z&jd03BqXPvDky_Lv;KL7Khgyw@6tdd30T2!GOjR5K{b&OMAR>DlBcH%an(+cC3`A4Q$ydoSUVh?i_Uj>8*h>;Lp)UNeHz=8(-PYk3v5f5|6FEqP&yhb+xep0BT z22IqXF>s84H~_rM+xEtBP#95I^-${Hf^r*%n~;Zc=Ufd7e74{K@fsbWa2y`Y8@M3P_;^~bGUkC5& z+k>R)I+N2te(b?BnbAt8tz^u*R%g8&@RdkauhiVF(Tf^k}CXbZdwB$!wi zB&dD@jUjyNUIIIJaQ*z`By#|Unc-Ua-QENuj`@+cpP}?BQeWC_nyzFse0otSvNd_?P(=1ex#Q7X# zCrGP6-_6aeyN8A3N3^zv!tB9=V?Xx)h~NjCiQUhLf|>f{t8Y-ilF?jy1v7c5DuJ&0 zFA$qG;9u1^*|U2>t$?^lNJu~;%z|s(cL!?Us)`C2HtJuY24{ODe2wr|3caHNHZVzq zUOxN=?0S+0QWH^G2drD5vcT6*WN8{490Xwg-_At@{C5bG@P{tEyu9ApBw$-(10e>A z03a~Le^nHE3ff*6_uu@T;y%#OblS%F!y`0Wxj=;DA@uX!U?s}WIaM(58rZLlqjoIA z_qiD1iTnv4Q?~;Zl%md2QNb?XTHx71FD$gtulf5S$E2n3?k0ocMP5+wJ`8lSf72@- zFa-an*?RV03h@260+;_~KbN49$IH*zwtr4CSO%E&xUVQE&t<9p`*;2?1lgHRa=Of! zmewp4OV7POn%-l4^{-LRYP6X%xJM!WGus^=f3n1NQa1p5G-#C%CjLIn=p1^B_eXSD zS(%wT$YZRif6T$UB3|{ia|Jq)cL~Ic$TBNPv=8%$37}-1?rpoArEn%1udLc&t+#?x zx!^cy-6*ruVR>B;P{M)4WvO=F4FCn|4q?P*XcbW)RaUNoVC2>WaZ{Vk{A^az9h>wc z1}O3dwHiZ8eoqYgHk%{wK7GN=#vM!rA4lW;Sv0!>dG>D@9ZM)~gI5*fFP3NlSyQF?hT6;p4~JQ~ zH!uEaWujXqE@?+_*tP0&^GEc^iyp)bKBTeuBTpf)8ep|Db!f>r?Q}cl-=D(fs3MTF z!q7?Wm%5#rVl3w?DaH3B1;&j@(W0||c+SS&0o9^Kba;;OEbuk7@$koGo5H zDyBYn&Tn>ERx*jo)NGrIm521vrv98i~%!*a?f0!Z^wEBE@Eysz7kR;_c8sR)Cs7g`P4nqS#*glW$=--qTFfjTV}VCc#O&|e)L(TYq_`}c2D?`ms-`q zx8jl1o{mp;z1@Gs)vfv-hddHHZtZ*Qu4)hi5uE)|V11mLde*1JJSEj(BH-DxXEGj} z?*p<<(FMhY5~S>JyIK|4ocuy#>u$lgN||p_U~_apL3@=caAAA2ZpU%R!zf1lGSD*r zU;#%Q>zw{;eRhsSx}(o77jqPyUX|v(lVB)|;Z_Jf$~=w7>Hw-JANLBKFrsjTnY1OR z?b+ETcepixygz74b}_hsT=>1OLRxXJJBQ=PH=)I1F)nRq$Wzs{=B;Xj#y2~1pWps? zEwQI;-Y7Ri)$I*(KOs}JVkiNMAHH@gw z=08p8c`u6&?8lH`Sx6#$bulD{%74s#&!^QaMoWQwN1gIfW zR(okkLIeBy)1}e3gGfU4IW$IUQ4U`U5iMvDGkvntoVIIP=2csZV=9*<{TDyaxHLx7 zN@}9+{b(Ot5O-PXuP_gnO-N8!dZ$4-F}KBS zT+9-k37%NL0qympU^hZdz{;j6g7R?X)uWRPiHpjaMes4zDRuWBu5V6c-5mdV*u`(+ zT4t}6hz_1O{;H&xEwtScJFs85Af9wkFLXsJ_og^AM~4ht(qzOC#;B|`L_vulCwq}C zcI|#;P=8Vo%HN(r#Nq(o_whj!!KO#ITAOc=^ND%28(PYH=4F|^sku2fcq(?&pA%7i z`YM;~(pGu{!dw5;VbOZrQV(HEv9fm9F8mxx$j;4c&ep!MPbRWY+`B>%GHUP{HPm_0T$wE2jOt?;>&fa(T4d4MeeN}n6W zB&i4Z^-$s9!YRzq_!|^p8KhNSPF|N~+k{WO`X29GrL&;HTcs0w$=5i5u_A z6;IQ#r_GI4m|q^fe#~=}yXTcB^}v^%#SNFC+MJ^t%-cqCp-T9z64RwN!(cqd6fB*e|fC3B4~|-lKF6b;b)_O<=e`) zv2IIl)h-;INli>L&t+$agD?TbmW^urclv0Zma&&pI>a|FSu_NG8Tcx)I)Ix{I=W+b zPts|dAxy*8RL#8VuwiO9?87Rj4v!I+0JBNB9!-cnYAZ51ujOHIDBN#jj9KN(SUMnX z)MjDESNZs0qwtt;akt-7dYh`H%f-z;1+8(fYwyX-vytgB;8HNjglkp`^v1q zYn?q0JN9esPHts)r$07@>gnl$F`r(>Oh@WYlU@^cF0P!xGMOLIi*y}w8@U=VT==Bg z*63ywQ+&qH+Q`(YsY$H$DsI3kibG|mEg-n7b7)uWA~6ibXpq3C?+lXqNV9|?TNii@LNH<*-p&}I|M_2$eZfvw40Qfwi#6fbC7O_ z&ZzKktA_QVaYmmg{3=lm&?W_<5bhd>FX7mLojD%n#Uz(uYp-9B9l8_8uVfVp!c$XrQLDVmXz zLDKon;`4*+X+=h(+jwUCTzibaSFHSQk#QMncQuybJj#Ddmt>$7F%y|uJ%&Lxs!k|c zN+GR_|2}5>EAk(@O=>Nfw9PelWjgYiFEmMr&A-kxZOj*RzooaTh_O*^OmB!N+V!%iZMAf0xYkegbEQqe^5XazcU0mfNx>{xI5#tJYj;XVe`8D<#g>(sjRss| zdUU4`u=!-fVrXf4i;am1j(AnNmYHsxC{F&lgmCgLf zQab*@i;>w#i#8H2^MvQGo>V(v)pg2_$5Jkh?2#VgStSjwEH2E20mFM>x-rd%Eq0_&RDPL`Rg?1Z*$YD;m7l|3;&+#Q~FdL^}`{FbB zkh7gPP`$Olb-cl#;hO5b*x}`sWcCwC1)jVa{e?1fS9G96$tHQ zHPZ$kDBf@RU)?v!3AjKMz=569}zW$HQVV1%_cja&2F2u^8M-km03r>QeZzSTVilUVpW{BeJQ|;;t0cmd9htzbGRwns)f49>)H1BG(q*96--tl@IV zI0&S#6OSVrwY74(&$R-Z;6Pv~h=4&3oK{eNLGs`V{}F1ht-qLk4RY>7PMr=;?!4a{&QDjX9j&YO zu)R(^NEP%hfASxP&$`?vPzF$DQxu-ZUHvi=OdOk&wzD8B)sCMNUBm%$4S z_q5*U+m=$gNhp0>So`Tey3f=gm#lVwt3_i)E&Sw`N$wn{>oK7iX=Lfsr>fkow2dF) z^QcC*zCyuaBu!82g<_WR-5sTjz?xS|)f?}7191rOwEa_pf)MQqx3-;oYWRk$(AN$c zt7^Rqr#9>^c>HC0Mzm16V=AL=JC}lPn*Lz!tq$RVYI5J_fp_M~U5;EVEqgAHZ(&p41pJ*D|fwIFyUo>wK4eba$ARg0$9#3o+2jgknS-D8Vbgk~o zoYr>Z%Oe<0*{>oyZ*q$|x-0{7J9qmkZ+PS4=f+L-tOK|I ztSl1wb>)@L`+*Cs<%BO07mbeg`UT8$zn1(O4lkt~`8?YBs$rAd@}@?wR_Ct2lnEY1 zdFz(h=P&IaSA7SbzMg-~rr;rTI62-}I{KF4!FjX!>+mtf`t6XAklgAJ5y~)XDQ(xk$K&LwA-UzsVODo?e*H2J&lU2sz_#5% zuDP}Gl*v(`*M|@-R$MpZnRO5Sy)PZC#@FvS8Wj!XTP=x_k+lALuC|s!?f$i_fjz*^ z-m#E*n6)MPKqXGG?fe&xirwi7-1=M9`de=m{SJW(R)F1nb-4s@ntRh_!|RRG%2VnW z#S=BcjM+2>t9@z@{~Rieu|;$7re{bc~R))ac(MJWejd=Rhy){|qQOM0`W^;4X0*4TTr=V^W-l%l?wt9EHkxjiJ?vlF~S-|R> zg9@=YWvXlMi!J>rk&_i{dRH0-SsnYTsHMIr~-iaGm*iZyvb+Raz34cR7cyBG6yfU zR1xO!ZS(7oSA4@kJFYWp(G|ILvD$jat3#Gu$s5hz-(3l66nPXfZHwx4C*)K(IND?~ ze{Xo4nl^Ii)*(I8 zyTA&n1QEihXpF$IW8{8BjQ~Y`<}8y*(U7Zz|Kj79)5(pN7kLt3TheOHf~N5iL3gpg zB6V?Z?E>de@$eg;(dJ%evX1#ZV_^w<%>;Cie>eUbIONMS;Xj6bFo-k$3e^^L-_L0F znSrDFU~_u+1IS5bDY2l_9@m-Ov?ldMYAMmsuvdm4h$Paa0{P+7_=w+Zc=EAr5_ zOr?T+-YvJo$5t+^g$n4|y2n_g_Z!P7+QREFm6+(1f2o0{5ST2Y$@y_kzj z!nXwHTHdDQR$O_h93%Nc&K0h?m;T~saO|xGVuw4vZC9sLo$ysIj)Mm+cTY-^INjSL zWJRomK5pN^4`4`fGPy`5N~Z-10x;=YQBt&^AV3 zeE4?1E&Zs-EkNHY9eq;%!u4_F46~hVtIt*{EkkcgSjeM-8N@u~EEt#hZ+gHkw_esKgUPNV zWZ#${i^Hmti8YTPtM>h{%Wh+2#-Z}r+*`+AU6xE4`I?3MHcrSlsjdnPxyYN)k;a?6 z*=A5(e}5{s;i~l2MyGYBxUuf#iL91;uKe8G*y99`Myi4wKh^BggkVlE)&1CXlcF~2 zZBSn%R9@=|G zNhEeV=h*5#_IptWbVc=_`PkE~Y+u*OKMA_jW|FtkpNkxQ9OqaXD&l6iCe>X{Pw~0O zB=`N78I9s=D!#7~sS}zhV`F2|#UpBn0M&OI%@ zQrBx;mk>dgoGXfAZ|z5K>=lzu#eHqH=HNw}#;0uL3(Nx;P+sCR^kOu69L8ouvkQ4Gaq{Iwk{D}qUmR%hRY315Rhgw+^0pl!irSroH5t*wOfk&b~4V8Nc~HEMet%dnrF+Ps4XN{@SQl zh=+$&#?bB_$xCu6ffk1kui5(E8hV!QZ_PUsrgThe2Jj>daskVM;RhN5ohPoF1LVoh zv9`5g;+0I_+SSV67Bz}N65_f0v7tF)@n>(hWYpc6nk2%ZF8HY0%5W|DT`mG)Ijk|7c3jM5uf(U5koG=Fdj@}EJa%;VS5venwtT6-2#+MCRztm3)Gjge<=dU$-201f z7*%973dc{zt+O(?%aR7a#u?8UXlr-vL*Y&FjGPW|GF(%!u&CeEKN5ETpz#u=<;gLx zdKP>l3%k+G|Ft=ZEesV+)SlIizW%e1GZ4m(gtWD(`U{mgt+N39(^h zoqvotwUuAYl7GP>+Z^b(G!EIaH|n7N203%>-L~>^!fyY_S557+b>faJ=7wIv+`eKi zSMl6}NepjGMJ+Zp+9U&UYEh{Yl7fN-ihJez=GNhWua}O$!+t9n-u7GfTKQ>;an74C z-vZ$s7seDvt3HIh-Z+Mfyn9XNm`FyXqMeHiUtSg(f5)LI#I4P(M;aBNmRaHaMZi8c z*ENz(WaDn8nA5;2Tu@iC;my}CHIgxoGkfpkf-@}7tZPhQac}SUe*@^`6b4TaFGhtS z!Uy_f*!zkTluF%JmWzT+@w3aA^)`*k3%=`K;o@=66K)mQsO-Jw`q}pD{rPmJNUU(i zYTE!H%nO5~4!Cv1(f68R!N%a}Yyc~AstR-)EMTZCm$8?qleeukLa!zvy;HY>jfuC; zMAd!E>psO@yT|D7wQ$f;wqR1cZ}g}jgnWLez{udwId9MLuOvky_5){<&!29a7^u5B zbU;A?%`)Sa5aD?2u^lFvwB**sk~{}?q4XCD=%KL9xPR1mnRbF|tH^%l-{BVaYaex& zQ*G*CPH-@gp_@6mPtQN^);X6tZ=dAIX<9O{6JxLv7xYntmps{Mr)Tt+eM|vTb8nVh zRLD1)JKs&R^I~nDC%$c9(@nu8-bP^yvw#%n6i@$%SAQ$Ua#HdwZQz2B`)bLEPYqVH zVB(O?>gnb!MWrTSpvUZ~Ok0c`#>6~2d8U43>w`IZI0!pmIUsKOEId4pDIolx>yyvk zzrS^O;Ft26`9=Dp`hK88nACsb-BK@~?A!br_s<^jIeHXK})G|*_6}UfA{>q60a#Yo<-iG zZsguqRle~b)4$NYYYHjJWA}4t4iW}OA%mODBb4?mul4F>K)m|-^Jn&vOop;@c8zb6 z`u(rZpgD+BsIBy|rTEo7KP=U$1Tj!>0qV@`ZXZ5|;S+=y2l2-}(L#Yed zHBXm0Q@3?^IujK9{CCu6Yo6tpX8vweHs30Z)Cl0 zxxRl(qRpy7m-UXm?HSxwbHBNaMh^08J(nLI=oT@wlJ3gEZDG?RvsVW+I1OQf(uI4@ zdSBI3IT%)}qMADzUXp3QQPN>7jPdVzeAKTYNb~pgQ_vVvyU#uKtmFwn3Vx7 zv`QNgSlW@*%~8kx6}5Mf4Y~i-R70aE{9-#$WLW}QAF|QKS!y}UW>|@=i3mx=u@pSq zU%^?jdle|m2dHJI2yo38$9Rk4pKhMmQlk}$8B3%V5Trc$;M0?rQuD6&!o-aMX_!X5 z5D@io%bxzHYp{?9zOHmzil>N#<*Jdy3eE aoj8_-(ZdL-UzjBRYc&;Z# diff --git a/docs/reference/advanced/managed-variables.md b/docs/reference/advanced/managed-variables.md index b3813555f..33178ba7c 100644 --- a/docs/reference/advanced/managed-variables.md +++ b/docs/reference/advanced/managed-variables.md @@ -4,16 +4,46 @@ Managed variables let you define and reference configuration in your code, but c Define a variable once with a sensible default, deploy your application, then iterate on the values in production. You can target specific populations (opted-in beta users, internal developers, enterprise customers, etc.) using flexible targeting rules that integrate with your existing OpenTelemetry attributes. -Changes take effect quickly, and every variable resolution is visible in your traces. This trace-level visibility means you can correlate application behavior directly with configuration variants, enabling A/B testing, automated prompt optimization, and online evaluations using the same observability data you're already sending to Logfire. +Changes take effect quickly, and every variable resolution is visible in your traces. This trace-level visibility means you can correlate application behavior directly with specific configuration versions, enabling A/B testing, automated prompt optimization, and online evaluations using the same observability data you're already sending to Logfire. ## What Are Managed Variables? Managed variables are a way to externalize runtime configuration from your code. While they're especially powerful for AI applications (where prompt iteration is frequently critical), they work for any configuration you want to change without redeploying: - **Any type**: Use primitives (strings, bools, ints) or structured types (dataclasses, Pydantic models, etc.) -- **Observability-integrated**: Every variable resolution creates a span, and using the context manager automatically sets baggage so downstream operations are tagged with which variant was used -- **Variants and rollouts**: Define multiple values (variants) for a variable and control what percentage of requests get each variant -- **Targeting**: Route specific users or segments to specific variants based on attributes +- **Observability-integrated**: Every variable resolution creates a span, and using the context manager automatically sets baggage so downstream operations are tagged with which label and version was used +- **Versions and labels**: Create immutable version snapshots of your variable's value, and assign labels (like `production`, `staging`, `canary`) that point to specific versions +- **Rollouts and targeting**: Control what percentage of requests receive each labeled version, and route specific users or segments based on attributes + +### Versions and Labels + +Managed variables use a **versions + labels** model inspired by how Docker tags and git branches work: + +- **Versions** are immutable, sequentially numbered snapshots of a variable's value (v1, v2, v3, ...). Once created, a version's value never changes. +- **Labels** are mutable pointers that reference a specific version. You can move a label to point to a different version at any time — instantly changing what value is served to traffic assigned to that label. + +For example, you might have a prompt variable with three versions: + +| Version | Value | +|---------|-------| +| v1 | "You are a helpful assistant." | +| v2 | "You are a helpful assistant. Be concise." | +| v3 | "You are an expert assistant. Provide thorough, well-structured responses." | + +And two labels pointing to those versions: + +| Label | Points to | Effect | +|-------|-----------|--------| +| `production` | v2 | Most users get the concise prompt | +| `canary` | v3 | 10% of traffic tests the detailed prompt | + +To roll out v3 to everyone, just move the `production` label from v2 to v3. To roll back, move it back to v2. No new versions need to be created — the label is just a pointer. + +!!! tip "Latest version" + If no labels are configured in the rollout, or if rollout weights sum to less than 1.0, the remaining traffic automatically receives the **latest version** (the most recently created version). This is the simplest setup: just keep creating new versions and all traffic gets the latest one. + +!!! note "Code default as safety net" + The `default` value you pass to `logfire.var()` serves as an always-available fallback hard-coded into your source code. If no versions have been created yet, or if the remote configuration is unreachable due to a networking issue, or if a remote value fails validation against your type, the SDK returns the code default instead of raising an error. This means your application always has a working value — the remote configuration improves it, but never breaks it. ## Structured Configuration @@ -51,8 +81,8 @@ agent_config = logfire.var( **Why group configuration together instead of using separate variables?** -- **Coherent variants**: A variant isn't just "instructions v2", it's a complete configuration where all the pieces work well together. The temperature that works with a detailed prompt might not work as well with a concise one. -- **Atomic changes**: When you roll out a new variant, all settings change together. No risk of mismatched configurations. +- **Coherent versions**: A version isn't just "instructions v2", it's a complete configuration where all the pieces work well together. The temperature that works with a detailed prompt might not work as well with a concise one. +- **Atomic changes**: When you create a new version, all settings change together. No risk of mismatched configurations. - **Holistic A/B testing**: Compare "config v1" vs "config v2" as complete packages, not individual parameters in isolation. - **Simpler management**: One variable to manage in the UI instead of many. @@ -76,10 +106,11 @@ This process is problematic for AI configuration because: With managed variables, you can iterate safely in production: -- **Iteration speed**: Edit prompts in the Logfire UI and see the effect in real traces immediately -- **A/B testing**: Run multiple prompt/model/temperature combinations simultaneously and compare their performance in your traces -- **Gradual rollouts**: Start a new configuration at 5% of traffic, watch the metrics, then gradually increase -- **Emergency rollback**: If a configuration is causing problems, revert to the previous variant in seconds, with no deploy required +- **Iteration speed**: Create a new version in the Logfire UI and see the effect in real traces immediately +- **A/B testing**: Assign labels to different versions and split traffic between them to compare performance +- **Gradual rollouts**: Point a `canary` label at a new version with 5% of traffic, watch the metrics, then move `production` to the same version +- **Instant rollback**: If a version is causing problems, move the label back to the previous version in seconds, with no deploy required +- **Full history**: Every version is immutable and preserved, so you can always see exactly what was served and when ## How It Works @@ -87,25 +118,27 @@ Here's the typical workflow using the `AgentConfig` example from above: 1. **Define the variable in code** with your current configuration as the default 2. **Deploy your application**: it starts using the default immediately -3. **Create the variable in the Logfire UI** with your initial value -4. **Add variants**: create additional variants like `v2_detailed` with different configurations -5. **Set up a rollout**: start with 10% of traffic going to the new variant -6. **Monitor in real-time**: filter traces by variant to compare response quality, latency, and token usage -7. **Adjust based on data**: if v2 performs better, gradually increase to 50%, then 100% -8. **Iterate**: create new variants, adjust rollouts, all without code changes +3. **Push the variable to Logfire** using `logfire.variables_push()` to sync metadata and schemas +4. **Create versions** in the Logfire UI: add your initial value as version 1, then create additional versions with different configurations +5. **Assign labels**: create labels like `production` and `canary`, pointing them at specific versions +6. **Set up a rollout**: configure 90% of traffic to the `production` label and 10% to `canary` +7. **Monitor in real-time**: filter traces by label to compare response quality, latency, and token usage +8. **Adjust based on data**: if the canary version performs better, move the `production` label to that version ## Managing Variables in the Logfire UI The Logfire web UI provides a complete interface for managing your variables without any code changes. You can find it under **Settings > Variables** in your project. The page includes two tabs: -- **Variables**: create, edit, and delete managed variables -- **Variable Types**: define reusable JSON schemas for custom types +- **Variables**: browse, create, and manage your managed variables +- **Types**: define reusable JSON schemas for custom variable types + +Clicking a variable opens its **detail page**, which has five tabs: **Versions**, **Editor**, **Labels**, **Targeting**, and **Settings**. ![Variables list](images/variables-list.png) ### Creating a Variable -To create a new variable, click **New variable** and fill in: +To create a new variable, click **New variable** to open the create page and fill in: - **Name**: A valid Python identifier (e.g., `agent_config`, `feature_flag`) - **Description**: Optional text explaining what the variable controls @@ -114,67 +147,91 @@ To create a new variable, click **New variable** and fill in: - **Number**: Numeric values for thresholds, limits, etc. - **Boolean**: True/false flags for feature toggles - **JSON**: Complex structured data matching your Pydantic models - - **Custom Types**: Reusable schemas created under the **Variable Types** tab + - **Custom Types**: Reusable schemas created under the **Types** tab -For **JSON** variables, you can optionally provide a **JSON Schema** to validate variant values in the UI. -For **Custom Types**, the schema is derived from the type and shown read-only; edit the type in the **Variable Types** tab. +For **JSON** variables, you can optionally provide a **JSON Schema** to validate version values in the UI. +For **Custom Types**, the schema is derived from the type and shown read-only; edit the type in the **Types** tab. ![Create variable form](images/variable-create-form.png) -### Working with Variants +### Working with Versions + +Each variable has a **linear version history** — an append-only sequence of immutable value snapshots. Versions are numbered sequentially (1, 2, 3, ...) and once created, a version's value never changes. + +The variable detail page provides two tabs for working with versions: -Each variable can have multiple **variants**—different values that can be served to different users or traffic segments. +**Editor tab** — where you create new versions: -To add variants: +1. Edit the value in the editor (the format depends on your value type) +2. Use the **Edit/Diff** toggle to switch between editing and viewing changes against a reference version +3. Select a different reference version from the **Comparing against** dropdown to compare against older versions +4. Click **Revert** to discard your edits and restore the reference version's value +5. Click **Save new version** and optionally add a description (like a commit message explaining what changed) -1. Click **Add** in the Variants section -2. Enter a unique key for the variant (e.g., `premium`, `experimental`, `v2_detailed`) -3. Provide an optional description -4. Enter the value (the format depends on your value type) +![Variable detail editor](images/variable-detail-editor.png) + +**Versions tab** — where you browse version history: + +- Each version card shows its number, creation time, author, assigned labels, and description +- Expand a version to see its full value +- Use the action buttons on each version to **edit from that version** (loads its value into the Editor tab) or **assign a label** directly +- Filter versions by label using the dropdown at the top !!! tip "Using the example value" - When you push a variable from code using `logfire.variables_push()`, the code's default value is stored as an "example". This example appears pre-filled when you create a new variant in the UI, making it easy to start from a working configuration and modify it. + When you push a variable from code using `logfire.variables_push()`, the code's default value is stored as an "example". This example appears pre-filled when you create a new version in the UI, making it easy to start from a working configuration and modify it. -Each variant tracks its version history, accessible via the **View history** button. You can also browse all variant history using **Browse All History** to see changes over time or restore previous versions. +### Working with Labels -!!! note "Variant keys are immutable" - Variant keys must be valid Python identifiers. Once created, variant keys cannot be renamed—create a new variant and delete the old one instead. +**Labels** are mutable pointers to specific versions. They work like Docker tags or git branch names — you can move them to point at any version at any time. -!!! note "No variants = code default" - If a variable has no variants configured, your application will use the code default value. This is the expected state immediately after `logfire.variables_push()`. You create variants in the UI when you want to serve different values to different users or run experiments. +Common label patterns: -### Configuring Rollouts +- **`production`** / **`staging`** / **`canary`**: Environment-based labels for gradual rollouts +- **`control`** / **`treatment`**: A/B testing labels +- **`stable`** / **`experimental`**: Risk-based labels + +The **Labels tab** on the variable detail page lets you: -The **Default Rollout** section controls what percentage of requests receive each variant. The weights must sum to 1.0 or less: +1. **Create** new labels with a name, target version, and optional description +2. **Move** labels to different versions using the edit button +3. **Delete** labels that are no longer needed +4. **View label history** (toggle the history icon) to see when labels were moved between versions and by whom -- Set `default` to `0.5` and `premium` to `0.5` for a 50/50 A/B test -- Set `default` to `0.9` and `experimental` to `0.1` for a 10% canary deployment -- If weights sum to less than 1.0, the remaining percentage uses your code's default value +![Variable detail labels](images/variable-detail-labels.png) + +!!! note "No labels = latest version" + If a variable has no labels configured in its rollout, your application serves the latest version (or the code default if no versions exist). This is the simplest mode — just keep creating versions and all traffic automatically gets the newest one. + +### Configuring Rollouts -The UI offers **Simple** and **Advanced** modes: +The **Targeting tab > Default Rollout** section controls what percentage of requests receive each labeled version. The weights are entered as percentages (0–100%) and must sum to 100% or less: -- **Simple**: pick a single active variant or use code default -- **Advanced**: set weighted rollouts, add overrides, and manage aliases +- Set `production` to `90` and `canary` to `10` for a 10% canary deployment +- Set `control` to `50` and `treatment` to `50` for a 50/50 A/B test +- You can explicitly assign a percentage to **latest** alongside labels — for example, `control` at `50` and latest at `10` sends 10% of traffic to the latest version, 50% to the control label, and the remaining 40% falls back to the code default +- If weights sum to less than 100% and no explicit latest weight is set, the remaining percentage uses the **code default** +- If no labels are in the rollout (empty) and no latest weight is set, all traffic gets the latest version ### Targeting with Override Rules -**Rollout Overrides** let you route specific users or segments to specific variants based on attributes. Rules are evaluated in order, and the first matching rule determines the rollout. +The **Targeting tab > Override Rules** section lets you route specific users or segments to specific labels based on attributes. Rules are evaluated in order, and the first matching rule determines the rollout. To add a targeting rule: -1. Click **Add Rule** in the Rollout Overrides section -2. Add one or more conditions (all conditions must match): +1. Click **Add Rule** in the Override Rules section +2. Give the rule a name and optional description +3. Add one or more conditions (all conditions must match): - Choose an attribute name (e.g., `plan`, `region`, `is_beta_user`) - Select an operator (`equals`, `does not equal`, `is in`, `is not in`, `matches regex`, etc.) - - Enter the value to match -3. Configure the rollout percentages when this rule matches + - Enter the value to match and its type (`str`, `int`, `float`, `bool`) +4. Configure the rollout percentages (by label) when this rule matches -For example, to give enterprise customers the premium variant: +For example, to give enterprise customers the production experience: - Condition: `plan` equals `enterprise` -- Rollout: `premium` = 100% +- Rollout: `production` = 100% -![Variable edit with variants and rollout](images/variable-edit-with-variants.png) +![Variable detail targeting](images/variable-detail-routing.png) !!! important "Variable names must match" The variable name in the UI must exactly match the `name` parameter in your `logfire.var()` call. If they don't match, your application will use the code default instead of the remote configuration. @@ -220,9 +277,9 @@ agent_config = logfire.var( The recommended pattern is to use the variable's `.get()` method as a context manager. This automatically: - Creates a span for the variable resolution -- Sets baggage with the variable name and selected variant +- Sets baggage with the variable name, selected label, and version -When using the Logfire SDK, baggage values are automatically added as attributes to all downstream spans. This means any spans created inside the context manager will be tagged with which variant was used, making it easy to filter and compare behavior by variant in the Logfire UI. +When using the Logfire SDK, baggage values are automatically added as attributes to all downstream spans. This means any spans created inside the context manager will be tagged with which label and version was used, making it easy to filter and compare behavior in the Logfire UI. ```python skip="true" from pydantic_ai import Agent @@ -230,10 +287,9 @@ from pydantic_ai import Agent async def handle_support_ticket(user_id: str, message: str) -> str: """Handle a customer support request.""" - # Get the configuration - same user always gets the same variant + # Get the configuration - same user always gets the same label with agent_config.get(targeting_key=user_id) as config: - # Inside this context, baggage is set: - # logfire.variables.support_agent_config = + # Inside this context, baggage is set with the label and version info agent = Agent( config.value.model, @@ -249,10 +305,26 @@ async def handle_support_ticket(user_id: str, message: str) -> str: return result.output ``` -The `targeting_key` ensures deterministic variant selection: the same user always gets the same variant, which is essential for application behavior consistency when A/B testing. +The `targeting_key` ensures deterministic label selection: the same user always gets the same label, which is essential for application behavior consistency when A/B testing. In practice, depending on your application structure, you may want to use `tenant_id` or another identifier for `targeting_key` instead of `user_id`. If no `targeting_key` is provided and there's an active trace, the `trace_id` is used automatically to ensure consistent behavior within a single request. +**Requesting a specific label:** + +You can explicitly request a specific label when calling `.get()`: + +```python skip="true" +# Always get the production version for this call +with agent_config.get(targeting_key=user_id, label='production') as config: + ... + +# Get the staging version for testing +with agent_config.get(label='staging') as config: + ... +``` + +This bypasses the rollout weights and directly resolves the value from the specified label. + ### Variable Parameters | Parameter | Description | @@ -263,7 +335,7 @@ In practice, depending on your application structure, you may want to use `tenan ## A/B Testing Configurations -Here's a complete example showing how to A/B test two complete agent configurations: +Here's a complete example showing how to A/B test two complete agent configurations. In this example, we use local configuration for development — in production, you'd create the versions and labels in the Logfire UI instead. ```python skip="true" from pydantic import BaseModel @@ -271,10 +343,11 @@ from pydantic_ai import Agent import logfire from logfire.variables.config import ( + LabeledValue, + LatestVersion, Rollout, VariableConfig, VariablesConfig, - Variant, ) logfire.configure() @@ -289,37 +362,40 @@ class AgentConfig(BaseModel): max_tokens: int -# For local development/testing, you can define variants in code -# In production, you'd typically configure these in the Logfire UI -# and configure logfire to retrieve and sync with the remotely-managed config. +# For local development/testing, you can define versions and labels in code. +# In production, you'd configure these in the Logfire UI. variables_config = VariablesConfig( variables={ 'support_agent_config': VariableConfig( name='support_agent_config', - variants={ - 'v1_concise': Variant( - key='v1_concise', + # The latest version (what traffic gets if no label matches) + latest_version=LatestVersion( + version=2, + serialized_value="""{ + "instructions": "You are an expert support agent. Provide thorough explanations with examples. Always acknowledge the customer's concern before providing assistance.", + "model": "openai:gpt-4o", + "temperature": 0.3, + "max_tokens": 800 + }""", + ), + # Labels pointing to specific versions + labels={ + 'control': LabeledValue( + version=1, serialized_value="""{ "instructions": "You are a helpful support agent. Be brief and direct.", "model": "openai:gpt-4o-mini", "temperature": 0.7, "max_tokens": 300 }""", - description='Concise responses with faster model', ), - 'v2_detailed': Variant( - key='v2_detailed', - serialized_value="""{ - "instructions": "You are an expert support agent. Provide thorough explanations with examples. Always acknowledge the customer's concern before providing assistance.", - "model": "openai:gpt-4o", - "temperature": 0.3, - "max_tokens": 800 - }""", - description='Detailed responses with more capable model', + 'treatment': LabeledValue( + version=2, + ref='latest', # Points to the same value as latest_version ), }, - # 50/50 A/B test - rollout=Rollout(variants={'v1_concise': 0.5, 'v2_detailed': 0.5}), + # 50/50 A/B test between control and treatment + rollout=Rollout(labels={'control': 0.5, 'treatment': 0.5}), overrides=[], json_schema={ 'type': 'object', @@ -354,8 +430,8 @@ agent_config = logfire.var( async def handle_ticket(user_id: str, message: str) -> str: """Handle a support ticket with A/B tested configuration.""" with agent_config.get(targeting_key=user_id) as config: - # The variant (v1_concise or v2_detailed) is now in baggage - # All spans created below, including those from the call to agent.run, will be tagged with the variant + # The label (control or treatment) and version are now in baggage. + # All spans created below will be tagged with this info. agent = Agent(config.value.model, system_prompt=config.value.instructions) result = await agent.run( @@ -370,21 +446,21 @@ async def handle_ticket(user_id: str, message: str) -> str: **Analyzing the A/B test in Logfire:** -After running traffic through both variants, you can: +After running traffic through both labels, you can: -1. Filter traces by the variant baggage to see only requests that used a specific variant -2. Compare metrics like response latency, token usage, and error rates between variants -3. Look at actual responses to qualitatively assess which variant performs better -4. Make data-driven decisions about which configuration to roll out to 100% +1. Filter traces by the label baggage to see only requests that used a specific version +2. Compare metrics like response latency, token usage, and error rates between labels +3. Look at actual responses to qualitatively assess which configuration performs better +4. Make data-driven decisions about which version to promote to all traffic ## Targeting Users and Segments ### Targeting Key -The `targeting_key` parameter ensures deterministic variant selection. The same key always produces the same variant, which is useful for: +The `targeting_key` parameter ensures deterministic label selection. The same key always produces the same label, which is useful for: -- **Consistent user experience**: You typically want users to see consistent configuration behavior within a session, or even across sessions. You may also want all users within a single tenant to receive the same variant. -- **Debugging**: By controlling the `targeting_key`, you can deterministically get the same configuration variant that a user received. Note that this reproduces the *configuration*, not the exact behavior; if your application includes stochastic elements like LLM calls, outputs will still vary. +- **Consistent user experience**: You typically want users to see consistent configuration behavior within a session, or even across sessions. You may also want all users within a single tenant to receive the same label. +- **Debugging**: By controlling the `targeting_key`, you can deterministically get the same configuration that a user received. Note that this reproduces the *configuration*, not the exact behavior; if your application includes stochastic elements like LLM calls, outputs will still vary. ```python skip="true" # User-based targeting @@ -483,39 +559,44 @@ with agent_config.get( ... ``` -These attributes can be used in override rules to route specific segments to specific variants: +These attributes can be used in override rules to route specific segments to specific labels: ```python skip="true" from logfire.variables.config import ( + LabeledValue, + LatestVersion, Rollout, RolloutOverride, ValueEquals, VariableConfig, VariablesConfig, - Variant, ) variables_config = VariablesConfig( variables={ 'support_agent_config': VariableConfig( name='support_agent_config', - variants={ - 'standard': Variant( - key='standard', + latest_version=LatestVersion( + version=2, + serialized_value='{"instructions": "Provide detailed, thorough responses...", ...}', + ), + labels={ + 'standard': LabeledValue( + version=1, serialized_value='{"instructions": "Be helpful and concise.", ...}', ), - 'premium': Variant( - key='premium', - serialized_value='{"instructions": "Provide detailed, thorough responses...", ...}', + 'premium': LabeledValue( + version=2, + ref='latest', ), }, # Default: everyone gets 'standard' - rollout=Rollout(variants={'standard': 1.0}), + rollout=Rollout(labels={'standard': 1.0}), overrides=[ - # Enterprise plan users always get the premium variant + # Enterprise plan users always get the premium label RolloutOverride( conditions=[ValueEquals(attribute='plan', value='enterprise')], - rollout=Rollout(variants={'premium': 1.0}), + rollout=Rollout(labels={'premium': 1.0}), ), ], json_schema={'type': 'object'}, @@ -528,14 +609,14 @@ with agent_config.get( targeting_key=user_id, attributes={'plan': 'enterprise'}, # Matches the override condition ) as config: - # config.variant will be 'premium' because of the override + # config.label will be 'premium' because of the override ... with agent_config.get( targeting_key=user_id, attributes={'plan': 'free'}, # Does not match override ) as config: - # config.variant will be 'standard' (the default rollout) + # config.label will be 'standard' (the default rollout) ... ``` @@ -562,7 +643,7 @@ with logfire.set_baggage(plan='enterprise'): ... ``` -This is useful when you want different configurations based on user plan. For example, enterprise users might get a prompt variant that references tools only available to them. +This is useful when you want different configurations based on user plan. For example, enterprise users might get a prompt version that references tools only available to them. **Example: Environment-based targeting with resource attributes** @@ -570,7 +651,7 @@ Resource attributes like `deployment.environment` are automatically included, al - Use a more experimental prompt on staging to test changes before production - Enable verbose logging in development but not in production -- Route all staging traffic to a "debug" variant that includes extra context +- Route all staging traffic to a `staging` label that points at the latest version To disable automatic context enrichment: @@ -614,10 +695,10 @@ agent_config = logfire.var( **How remote variables work:** 1. Your application connects to Logfire using your API key -2. Variable configurations are fetched from the Logfire API +2. Variable configurations (including all versions and labels) are fetched from the Logfire API 3. A background thread polls for updates (default: every 30 seconds) 4. If available, the SDK listens for Server-Sent Events (SSE) on `GET /v1/variable-updates/` and triggers an immediate refresh -5. When you change a variant or rollout in the UI, running applications pick up the change automatically via SSE or the next poll +5. When you create a new version, move a label, or change a rollout in the UI, running applications pick up the change automatically via SSE or the next poll **Configuration options:** @@ -664,6 +745,7 @@ POST /v1/ofrep/v1/evaluate/flags - `targetingKey` is required and is used for deterministic rollout selection. - Any additional fields in `context` become attributes for override rules. +- The OFREP response maps labels to the `variant` field for compatibility with OpenFeature clients. **Caching (bulk endpoint):** @@ -676,7 +758,7 @@ These endpoints require an API key with the `project:read_variables` scope. Instead of manually creating variables in the Logfire UI, you can push your variable definitions directly from your code using `logfire.variables_push()`. -The primary benefit of pushing from code is **automatic JSON schema generation**. When you use a Pydantic model as your variable type, `logfire.variables_push()` automatically generates the JSON schema from your model definition. This means the Logfire UI will validate variant values against your schema, catching type errors before they reach production. Creating these schemas manually in the UI would be tedious and error-prone, especially for complex nested models. +The primary benefit of pushing from code is **automatic JSON schema generation**. When you use a Pydantic model as your variable type, `logfire.variables_push()` automatically generates the JSON schema from your model definition. This means the Logfire UI will validate version values against your schema, catching type errors before they reach production. Creating these schemas manually in the UI would be tedious and error-prone, especially for complex nested models. ```python skip="true" from pydantic import BaseModel @@ -723,8 +805,8 @@ When you run this script, it will: 2. Show you a diff of what will be created or updated 3. Prompt for confirmation before applying changes -!!! note "No variants created by push" - When `logfire.variables_push()` creates a new variable, it does **not** create any variants. Instead, it stores your code's default value as an "example" that can be used as a template when creating variants in the Logfire UI. Until you create variants, your application will use the code default. +!!! note "Metadata only" + `logfire.variables_push()` syncs **metadata only** — the variable name, description, JSON schema, rollout configuration, and overrides. It does **not** create versions or labels. Instead, it stores your code's default value as an "example" that can be used as a template when creating versions in the Logfire UI. You create versions and assign labels through the UI. **Example output:** @@ -746,7 +828,7 @@ Successfully applied changes. | `variables` | List of specific variables to push. If not provided, all registered variables are pushed. | | `dry_run` | If `True`, shows what would change without actually applying changes. | | `yes` | If `True`, skips the confirmation prompt. | -| `strict` | If `True`, fails if any existing variants in Logfire are incompatible with your new schema. | +| `strict` | If `True`, fails if any existing label values in Logfire are incompatible with your new schema. | **Pushing specific variables:** @@ -765,7 +847,7 @@ logfire.variables_push(yes=True) ``` !!! note "Schema Updates" - When you push a variable that already exists in Logfire, `logfire.variables_push()` will update the JSON schema if it has changed but will preserve existing variants and rollout configurations. If existing variant values are incompatible with the new schema, you'll see a warning (or an error if using `strict=True`). + When you push a variable that already exists in Logfire, `logfire.variables_push()` will update the JSON schema if it has changed but will preserve existing versions, labels, and rollout configurations. If existing label values are incompatible with the new schema, you'll see a warning (or an error if using `strict=True`). !!! note "Write scope required" `logfire.variables_push()` and `logfire.variables_push_types()` require an API key with the `project:write_variables` scope. @@ -888,20 +970,20 @@ The `ValidationReport` provides detailed information about validation results: | Property | Description | |----------|-------------| | `has_errors` | `True` if any validation errors were found | -| `errors` | List of variant validation errors with details | +| `errors` | List of label validation errors with details | | `variables_checked` | Number of variables that were validated | | `variables_not_on_server` | Names of local variables not found on the server | | `description_differences` | Variables where local and server descriptions differ | | `format()` | Returns a human-readable string of the validation results | -This is useful in CI/CD pipelines to catch configuration drift where someone may have edited a variant value in the UI that no longer matches your expected type. +This is useful in CI/CD pipelines to catch configuration drift where someone may have edited a version value in the UI that no longer matches your expected type. ### Config Push Workflow (Programmatic) For more control over your variable configurations, you can work with config data directly. This workflow allows you to: - Generate a template config from your code -- Edit the config locally (add variants, rollouts, overrides) +- Edit the config locally (add rollouts, overrides) - Push the complete config to Logfire - Pull existing configs for backup or migration @@ -932,8 +1014,9 @@ The generated file will look like: "variables": { "agent_config": { "name": "agent_config", - "variants": {}, - "rollout": {"variants": {}}, + "labels": {}, + "latest_version": null, + "rollout": {"labels": {}}, "overrides": [], "json_schema": { "type": "object", @@ -948,8 +1031,9 @@ The generated file will look like: }, "feature_enabled": { "name": "feature_enabled", - "variants": {}, - "rollout": {"variants": {}}, + "labels": {}, + "latest_version": null, + "rollout": {"labels": {}}, "overrides": [], "json_schema": {"type": "boolean"}, "example": "false" @@ -958,34 +1042,7 @@ The generated file will look like: } ``` -**Editing and pushing:** - -Edit the JSON file to add variants and rollouts: - -```json -{ - "variables": { - "agent_config": { - "name": "agent_config", - "variants": { - "concise": { - "key": "concise", - "serialized_value": "{\"instructions\":\"Be brief.\",\"model\":\"openai:gpt-4o-mini\",\"temperature\":0.7,\"max_tokens\":300}" - }, - "detailed": { - "key": "detailed", - "serialized_value": "{\"instructions\":\"Provide thorough explanations.\",\"model\":\"openai:gpt-4o\",\"temperature\":0.3,\"max_tokens\":1000}" - } - }, - "rollout": {"variants": {"concise": 0.8, "detailed": 0.2}}, - "overrides": [], - "json_schema": {"type": "object"} - } - } -} -``` - -Then push to Logfire: +**Pushing:** ```python skip="true" from logfire.variables import VariablesConfig @@ -994,7 +1051,7 @@ from logfire.variables import VariablesConfig with open('variables.json', 'r', encoding='utf-8') as f: config = VariablesConfig.model_validate_json(f.read()) -# Sync to the server +# Sync to the server (metadata only — versions and labels are managed via UI) logfire.variables_push_config(config) ``` @@ -1044,35 +1101,40 @@ For development, testing, or self-hosted deployments, you can configure variable ```python import logfire from logfire.variables.config import ( + LabeledValue, + LatestVersion, Rollout, RolloutOverride, ValueEquals, VariableConfig, VariablesConfig, - Variant, ) variables_config = VariablesConfig( variables={ 'support_agent_config': VariableConfig( name='support_agent_config', - variants={ - 'default': Variant( - key='default', + latest_version=LatestVersion( + version=2, + serialized_value='{"instructions": "...", "model": "...", "temperature": 0.3, "max_tokens": 1000}', + ), + labels={ + 'production': LabeledValue( + version=1, serialized_value='{"instructions": "...", "model": "...", "temperature": 0.7, "max_tokens": 500}', ), - 'premium': Variant( - key='premium', - serialized_value='{"instructions": "...", "model": "...", "temperature": 0.3, "max_tokens": 1000}', + 'canary': LabeledValue( + version=2, + ref='latest', # Same as latest_version ), }, - # Default: everyone gets 'default' - rollout=Rollout(variants={'default': 1.0}), + # Default: everyone gets 'production' + rollout=Rollout(labels={'production': 1.0}), overrides=[ - # Enterprise users get 'premium' + # Enterprise users get 'canary' RolloutOverride( conditions=[ValueEquals(attribute='plan', value='enterprise')], - rollout=Rollout(variants={'premium': 1.0}), + rollout=Rollout(labels={'canary': 1.0}), ), ], json_schema={'type': 'object'}, @@ -1092,52 +1154,64 @@ logfire.configure( - **Self-hosted**: Full control over variable configuration without external dependencies - **Optimization harnesses**: Build automated optimization loops that monitor performance metrics and programmatically update variable values -The local provider exposes methods to create, update, and delete variables and variants programmatically. This makes it possible to build optimization harnesses that: +The local provider exposes methods to create, update, and delete variables programmatically. This makes it possible to build optimization harnesses that: 1. Run your application with different configurations 2. Collect performance metrics from traces 3. Use the metrics to decide on new configurations to try -4. Update variable values via the local provider's API +4. Create new versions and move labels via the local provider's API 5. Repeat until optimal configuration is found This workflow is particularly useful for automated prompt optimization, where you want to systematically explore different prompt variations and measure their effectiveness. ## Configuration Reference -### Variants and Rollouts +### Versions, Labels, and Rollouts -**VariableConfig** - Full configuration for a variable: +**VariableConfig** — Full configuration for a variable: | Field | Description | |-------|-------------| | `name` | Variable name (must match the name in `logfire.var()`) | -| `variants` | Dict of variant key to `Variant` objects | -| `rollout` | Default `Rollout` specifying variant weights | +| `labels` | Dict of label name to `LabeledValue` objects | +| `latest_version` | `LatestVersion` with the most recent version's number and value | +| `enabled` | Whether the variable is enabled (disabled variables return the code default) | +| `rollout` | Default `Rollout` specifying label weights | | `overrides` | List of `RolloutOverride` for conditional targeting | | `json_schema` | JSON Schema for validation (optional) | | `description` | Human-readable description (optional) | | `aliases` | Alternative names that resolve to this variable (optional, for migrations) | | `example` | JSON-serialized example value, used as template in UI (optional) | -**Variant** - A single variant value: +**LabeledValue** — A label pointing to a specific version: | Field | Description | |-------|-------------| -| `key` | Unique identifier for this variant | +| `version` | The version number this label points to | +| `serialized_value` | JSON-serialized value for this version (None if `ref` is set) | +| `ref` | Reference to another label or `'latest'` for deduplication (None if `serialized_value` is set) | + +Either `serialized_value` or `ref` must be set, but not both. When `ref` is set, the SDK follows the reference to get the actual value. This avoids duplicating large values when multiple labels point to the same version. + +**LatestVersion** — The most recent version of a variable: + +| Field | Description | +|-------|-------------| +| `version` | The version number | | `serialized_value` | JSON-serialized value | -| `description` | Human-readable description (optional) | -**Rollout** - Variant selection weights: +**Rollout** — Label selection weights: | Field | Description | |-------|-------------| -| `variants` | Dict of variant key to weight (0.0-1.0). Weights should sum to 1.0 or less. | +| `labels` | Dict of label name to weight (0.0–1.0). Weights should sum to 1.0 or less. | +| `latest_weight` | Optional weight (0.0–1.0) for explicitly routing traffic to the latest version. Combined with `labels` weights, the total must not exceed 1.0. | -If weights sum to less than 1.0, there's a chance no variant is selected and the code default is used. +If the `labels` dict is empty and no `latest_weight` is set, all traffic receives the latest version. If label weights (plus `latest_weight` if set) sum to less than 1.0, the remaining percentage falls back to the code default. ### VariableTypeConfig -**VariableTypeConfig** - Configuration for a reusable type definition: +**VariableTypeConfig** — Configuration for a reusable type definition: | Field | Description | |-------|-------------| @@ -1173,18 +1247,18 @@ from logfire.variables.config import ( ) overrides = [ - # Beta users in US/UK get the experimental variant + # Beta users in US/UK get the experimental label RolloutOverride( conditions=[ ValueEquals(attribute='is_beta', value=True), ValueIsIn(attribute='country', values=['US', 'UK']), ], - rollout=Rollout(variants={'experimental': 1.0}), + rollout=Rollout(labels={'experimental': 1.0}), ), - # Anyone with a custom config attribute gets the custom variant + # Anyone with a custom config attribute gets the custom label RolloutOverride( conditions=[KeyIsPresent(attribute='custom_config')], - rollout=Rollout(variants={'custom': 1.0}), + rollout=Rollout(labels={'custom': 1.0}), ), ] ``` @@ -1271,7 +1345,7 @@ Aliases allow a variable to be found by alternative names. When your code reques **Migration workflow:** -1. **Create the new variable** with your desired name and copy the configuration (variants, rollouts, overrides) from the old variable +1. **Create the new variable** with your desired name and copy the configuration (versions, labels, rollouts, overrides) from the old variable 2. **Add the old name as an alias** on the new variable 3. **Update your code** to use the new variable name 4. **Deploy gradually**: Applications using the old name will still work because the alias resolves to the new variable @@ -1282,7 +1356,7 @@ Aliases allow a variable to be found by alternative names. When your code reques Suppose you have a variable named `agent_config` and want to rename it to `support_agent_config`: -1. Create `support_agent_config` with the same variants and rollout configuration +1. Create `support_agent_config` with the same versions, labels, and rollout configuration 2. Add `agent_config` as an alias on `support_agent_config` 3. Old code using `logfire.var(name='agent_config', ...)` continues to work 4. Update your code to use `name='support_agent_config'` @@ -1293,7 +1367,7 @@ This approach ensures zero-downtime migrations. Existing deployed applications c **In the UI:** -You can manage aliases in the **Aliases** section at the bottom of the variable create/edit form. Add the old variable name(s) that should resolve to this variable. +You can manage aliases in the **Aliases** section of the **Settings** tab on the variable detail page. Add the old variable name(s) that should resolve to this variable. **In code (local config):** @@ -1304,8 +1378,9 @@ config = VariablesConfig( variables={ 'support_agent_config': VariableConfig( name='support_agent_config', - variants={...}, - rollout=Rollout(variants={...}), + labels={...}, + latest_version=LatestVersion(...), + rollout=Rollout(labels={...}), overrides=[], # Old name resolves to this variable aliases=['agent_config'], @@ -1331,7 +1406,7 @@ def on_feature_change(): Key points: -- Callbacks run on the provider's polling thread -- keep them fast and non-blocking +- Callbacks run on the provider's polling thread — keep them fast and non-blocking - Callbacks receive no arguments; call `variable.get()` to see the new value - Multiple callbacks can be registered on the same variable - Exceptions in callbacks are caught and logged (they don't crash the polling thread) diff --git a/logfire/_internal/main.py b/logfire/_internal/main.py index 17a571dfc..eb06669f5 100644 --- a/logfire/_internal/main.py +++ b/logfire/_internal/main.py @@ -2542,12 +2542,12 @@ def variables_push( yes: bool = False, strict: bool = False, ) -> bool: - """Push variable definitions to the configured variable provider. + """Push variable definitions (metadata only) to the configured variable provider. This method syncs local variable definitions with the provider: - Creates new variables that don't exist in the provider - Updates JSON schemas for existing variables if they've changed - - Warns about existing variants that are incompatible with new schemas + - Warns about existing label values that are incompatible with new schemas The provider is determined by the Logfire configuration. For remote providers, this requires proper authentication (via RemoteVariablesConfig or LOGFIRE_API_KEY). @@ -2557,7 +2557,7 @@ def variables_push( registered with this Logfire instance will be pushed. dry_run: If True, only show what would change without applying. yes: If True, skip confirmation prompt. - strict: If True, fail if any existing variants are incompatible with new schemas. + strict: If True, fail if any existing label values are incompatible with new schemas. Returns: True if changes were applied (or would be applied in dry_run mode), False otherwise. @@ -2650,10 +2650,10 @@ def variables_validate( self, variables: list[Variable[Any]] | None = None, ) -> ValidationReport: - """Validate that provider-side variable variants match local type definitions. + """Validate that provider-side variable label values match local type definitions. This method fetches the current variable configuration from the provider and - validates that all variant values can be deserialized to the expected types + validates that all label values can be deserialized to the expected types defined in the local Variable instances. Args: @@ -2696,7 +2696,7 @@ def variables_push_config( ) -> bool: # pragma: no cover """Push a VariablesConfig to the configured provider. - This method pushes a complete VariablesConfig (including variants and rollouts) + This method pushes a complete VariablesConfig (including labels and rollouts) to the provider. It's useful for: - Pushing configs generated or modified locally - Pushing configs read from files @@ -2755,7 +2755,7 @@ def variables_build_config( """Build a VariablesConfig from registered Variable instances. This creates a minimal config with just the name, schema, and example for each variable. - No variants are created - use this to build a template config that can be edited. + No labels or versions are created - use this to build a template config that can be edited. Args: variables: Variable instances to include. If None, uses all registered variables. diff --git a/logfire/variables/__init__.py b/logfire/variables/__init__.py index 38481d455..5d5f02ce8 100644 --- a/logfire/variables/__init__.py +++ b/logfire/variables/__init__.py @@ -23,6 +23,8 @@ from logfire.variables.config import ( KeyIsNotPresent, KeyIsPresent, + LabeledValue, + LatestVersion, RemoteVariablesConfig, Rollout, RolloutOverride, @@ -35,7 +37,6 @@ VariableConfig, VariablesConfig, VariableTypeConfig, - Variant, ) from logfire.variables.local import LocalVariableProvider from logfire.variables.remote import LogfireRemoteVariableProvider @@ -55,8 +56,9 @@ 'VariableConfig', 'VariableTypeConfig', 'RemoteVariablesConfig', - # Variant and rollout configuration - 'Variant', + # Label and rollout configuration + 'LabeledValue', + 'LatestVersion', 'Rollout', 'RolloutOverride', # Targeting conditions @@ -99,6 +101,8 @@ def __getattr__(name: str): from logfire.variables.config import ( KeyIsNotPresent, KeyIsPresent, + LabeledValue, + LatestVersion, RemoteVariablesConfig, Rollout, RolloutOverride, @@ -111,7 +115,6 @@ def __getattr__(name: str): VariableConfig, VariablesConfig, VariableTypeConfig, - Variant, ) from logfire.variables.local import LocalVariableProvider from logfire.variables.remote import LogfireRemoteVariableProvider diff --git a/logfire/variables/abstract.py b/logfire/variables/abstract.py index 66f251635..5d0ec96fc 100644 --- a/logfire/variables/abstract.py +++ b/logfire/variables/abstract.py @@ -71,10 +71,10 @@ class VariableAlreadyExistsError(VariableWriteError): @dataclass(kw_only=True) class ResolvedVariable(Generic[T_co]): - """Details about a variable resolution including value, variant, and any errors. + """Details about a variable resolution including value, label, version, and any errors. This class can be used as a context manager. When used as a context manager, it - automatically sets baggage with the variable name and variant, enabling downstream + automatically sets baggage with the variable name and label, enabling downstream spans and logs to be associated with the variable resolution that was active at the time. Example: @@ -82,7 +82,7 @@ class ResolvedVariable(Generic[T_co]): my_var = logfire.var(name='my_var', type=str, default='default') with my_var.get() as details: # Inside this context, baggage is set with: - # logfire.variables.my_var = (or '' if no variant) + # logfire.variables.my_var =