From 80944f2caf2cc78598c6ce5f0ac035b0b9feea7d Mon Sep 17 00:00:00 2001 From: Hemang Date: Mon, 19 May 2025 12:01:52 +0200 Subject: [PATCH] Add traceback to debug 500 gemini error in test_generate_content_with_image. --- .github/workflows/tests_ci.yml | 2 +- ...est_generate_content_without_tool_calls.py | 97 ++++++++++-------- .../integration/resources/images/two-cats.jpg | Bin 0 -> 28251 bytes tests/integration/utils.py | 6 +- 4 files changed, 59 insertions(+), 46 deletions(-) create mode 100644 tests/integration/resources/images/two-cats.jpg diff --git a/.github/workflows/tests_ci.yml b/.github/workflows/tests_ci.yml index 8641eb7..b40825b 100644 --- a/.github/workflows/tests_ci.yml +++ b/.github/workflows/tests_ci.yml @@ -42,7 +42,7 @@ jobs: ANTHROPIC_API_KEY: ${{ secrets.INVARIANT_TESTING_ANTHROPIC_KEY }} GEMINI_API_KEY: ${{ secrets.INVARIANT_TESTING_GEMINI_KEY }} INVARIANT_API_KEY: ${{ secrets.INVARIANT_TESTING_GUARDRAILS_KEY }} - run: ./run.sh integration-tests -s -vv + run: ./run.sh integration-tests gemini/test_generate_content_without_tool_calls.py::test_generate_content_with_image -s -vv continue-on-error: true - name: Check test results diff --git a/tests/integration/gemini/test_generate_content_without_tool_calls.py b/tests/integration/gemini/test_generate_content_without_tool_calls.py index cfb4242..0095b64 100644 --- a/tests/integration/gemini/test_generate_content_without_tool_calls.py +++ b/tests/integration/gemini/test_generate_content_without_tool_calls.py @@ -16,6 +16,7 @@ import pytest import PIL.Image import requests from google import genai +from google.genai import types # Pytest plugins pytest_plugins = ("pytest_asyncio",) @@ -103,59 +104,65 @@ async def test_generate_content( @pytest.mark.skipif(not os.getenv("GEMINI_API_KEY"), reason="No GEMINI_API_KEY set") @pytest.mark.parametrize("push_to_explorer", [True, False]) -@pytest.mark.skip(reason="Skipping this test: 500 error from Gemini API") async def test_generate_content_with_image( explorer_api_url, gateway_url, push_to_explorer ): """Test that generate content gateway calls work with image.""" dataset_name = f"test-dataset-gemini-{uuid.uuid4()}" - client = get_gemini_client(gateway_url, push_to_explorer, dataset_name) - - - image_path = Path(__file__).parent.parent / "resources" / "images" / "two-cats.png" - image = PIL.Image.open(image_path) - - chat_response = client.models.generate_content( - model="gemini-2.0-flash", - contents=["How many cats are there in this image?", image], - config={"maxOutputTokens": 100}, + client = get_gemini_client( + gateway_url, push_to_explorer, dataset_name, api_version="v1" ) - assert ( - "TWO" in chat_response.candidates[0].content.parts[0].text.upper() - or "2" in chat_response.candidates[0].content.parts[0].text - ) - - if push_to_explorer: - # Wait for the trace to be saved - # This is needed because the trace is saved asynchronously - time.sleep(2) - # Fetch the trace ids for the dataset - traces_response = requests.get( - f"{explorer_api_url}/api/v1/dataset/byuser/developer/{dataset_name}/traces", - timeout=5, + image_path = Path(__file__).parent.parent / "resources" / "images" / "two-cats.jpg" + with open(image_path.absolute(), "rb") as f: + image_bytes = f.read() + chat_response = client.models.generate_content( + model="gemini-2.0-flash", + contents=[ + "How many cats are there in this image?", + types.Part.from_bytes( + data=image_bytes, + mime_type="image/jpg", + ), + ], + config={"maxOutputTokens": 100}, ) - traces = traces_response.json() - assert len(traces) == 1 - trace_id = traces[0]["id"] - # Fetch the trace - trace_response = requests.get( - f"{explorer_api_url}/api/v1/trace/{trace_id}", timeout=5 + assert ( + "TWO" in chat_response.candidates[0].content.parts[0].text.upper() + or "2" in chat_response.candidates[0].content.parts[0].text ) - trace = trace_response.json() - # Verify the trace messages - assert len(trace["messages"]) == 2 - assert trace["messages"][0]["role"] == "user" - assert trace["messages"][0]["content"][0] == { - "type": "text", - "text": "How many cats are there in this image?", - } - assert trace["messages"][0]["content"][1]["type"] == "image_url" - assert trace["messages"][1] == { - "role": "assistant", - "content": chat_response.candidates[0].content.parts[0].text, - } + + if push_to_explorer: + # Wait for the trace to be saved + # This is needed because the trace is saved asynchronously + time.sleep(2) + # Fetch the trace ids for the dataset + traces_response = requests.get( + f"{explorer_api_url}/api/v1/dataset/byuser/developer/{dataset_name}/traces", + timeout=5, + ) + traces = traces_response.json() + assert len(traces) == 1 + trace_id = traces[0]["id"] + + # Fetch the trace + trace_response = requests.get( + f"{explorer_api_url}/api/v1/trace/{trace_id}", timeout=5 + ) + trace = trace_response.json() + # Verify the trace messages + assert len(trace["messages"]) == 2 + assert trace["messages"][0]["role"] == "user" + assert trace["messages"][0]["content"][0] == { + "type": "text", + "text": "How many cats are there in this image?", + } + assert trace["messages"][0]["content"][1]["type"] == "image_url" + assert trace["messages"][1] == { + "role": "assistant", + "content": chat_response.candidates[0].content.parts[0].text, + } @pytest.mark.skipif(not os.getenv("GEMINI_API_KEY"), reason="No GEMINI_API_KEY set") @@ -213,7 +220,9 @@ async def test_generate_content_with_invariant_key_in_gemini_key_header( assert trace["messages"] == [ { "role": "user", - "content": [{"text": "What is the capital of Denmark?", "type": "text"}], + "content": [ + {"text": "What is the capital of Denmark?", "type": "text"} + ], }, { "role": "assistant", diff --git a/tests/integration/resources/images/two-cats.jpg b/tests/integration/resources/images/two-cats.jpg new file mode 100644 index 0000000000000000000000000000000000000000..efe65eaf27f4ece3266b75a43dbf8d6bdb642232 GIT binary patch literal 28251 zcmbTdb8sb5*Y~ZVL<#H1&{y$kdROi|9P4J z1~d#5ECeJRJOJVEHUR$rUU-<;k>Mg(b;LrnSSiA^_R>{J#>sK0@}NA1VZa-^OfOn= zj1x|)PsbJxBH~Qf&0d2E=^u+QGdB}!1wh$5T5g)uyKuYBU~>-(vfIs{JnJ=*pom~q zGr1gIJHqAKv#;_53N)l#syRhq1pI!AI+Ee~Y#?2+Y;LE3ovUnSxl|qw)rqLBTyA<) zuvhs#W}l@3U6)hyj*(K;gu9L7&`HfurcJzw$=Bg%ujOfwz0#VCMB(Q(HD{QqBAgyg zaPIm-EfsvWy%s=N*hp<=;f^r8owLk{qDADw@F3ffAXEHAG1cy-z*d4BBZN>HvPXZ{4< zQ9f7uvt~ho8Wx-{Lk@zGCfFYK6r;VQahggcyB-k;@;6EI4Ch0ZR@qqA>X1(S_W9x4!mCY32L#1UiqA5h(;I zQABorgs+fP=$y zhrz}k*m>`QKiIVJHEm=x5=8{J;DkmcXe3g903^e;jBiO?N)_HpVAcY~)L5X``_-#H zihC!gJIii{(Inj5JzI^%O8@A+eNIx}Z(%fOT&tp3FJ6I%Elf`wH~D&8EI5Hmqg>>z zsq$v$Pet~N#>H2N1esE#fw$OMBXzi8#_`9DG9FYo_049ZfCfr2q+Xz=Ct`)7C7n3c zg?=FEppz2DdVr@PcdWy2yE)#}{P*kz$hu$bmsrL_EMu6i+6t=q*}7@?YVDhOOY-c& zRq~86uYY#u6h8_2xkbxdo7mEk(~@!MrsKy_zuZw%w!6?fZSD0**6_<>YOqt{j(alu z3_#Y7XA^c_uj3|st}XOYstWtMq;XC6-h!qpxm+o&cD4%Ud+1%8+QX-CTIEI9KM$L>$-gVdQ954oo((bi)`E?5Rmf&sGXbDP9Y zffb)6d4b$Q6Ln+LIp}kE#=>v@^J=a!az({$ZIJ z9%euGma6K6dj}`hsG)W5<8t?N1e9sI^ILG$u_cN@cWEGa;uETp#3TTbz`*}_BI)kA z&h5~`7n(t;YvDVBQE~a#q%sk;(BKP{p461M{+z8oLzp!WjEQx5Yv(g!+42DBN8sgJ z!6_^6wX3Qg-a(ar8&1m$__+gIX`P5C6%6^Od)4^8FHU+1d~Rv!irAJb*64am2cvmg z2NO_!b&55P?XjaXl|pldj#wFt)aiaISWxaigTDQ3k9M!R*r7{Q$~(iUi(;AnGr&O6 z`50FuzCzi-GIgO}uXSS*DouKwm_ki9L?Ba(xu@Y77IrBDXXeD4rE|y1-Of6hGWKd4 zULd*-VLQv%Fc3#~xWm^JG0$~^uvE@>pjzAANYU&~20pqM0$xI|p)R1Wyh-|^X;OD= zvX-6Iiap*#kti(a>*-%WNlHIGOWvWy-6+{~$;FP|yO?i@wvftlxo;2ES1cD7ix^d8 znkX_90=*F%nDJZYa>5jwJ_&!84`WP^`Yy-D$yG3&T3h{B%DPjGCGzO z{_|fNs(Hb^u^AQv;^Sy%-eyqeDy@&D%6GUaft=f&D#t-5FZDg01F@!=#k>1IVEU@Q z;NR-YTCzADd;Zxh3)vUwE)+Tq>*h@6$7T2S+*3K#W7_^u1b>=po-^KPOY=_Na<_rU z7MFL~O*FGPe=tQUzt}7?<9e7fXeh=K_mMgNTsPSaWkd8$jNrc)*36D759zZO`(A{% z=Hlwa5;w2t+P^%-x*R-Ewt9TJ?{qfCxe_-nyM12c^|q{4!Mqj@CwYd&l?6-DY3+6* zZ4fZ_Fv2@L#|cSOa5*rW79@<7q17|&Ua=7qEM$Acrm^4pR(cq&s6-KS*Y1!plRZ~B0PpMA`h)s2+<3OAm*$Jt1D#v(>$Uq`7H zJI>xaC)l^H?E*P(PGkk;Ax43xrLN+snP)?KGT`@gBAZz5)(tOu!*BM%ynK84O!@gU zZPtt@f7a$EVceTQ`#fBSTzN+GL&EkMzD9Co?)VV9CNH&~^Squ-GQA&n)6TUA`0`#& z08VV7-n5s`+xPa61WDXv&{%2P2%<^wklhqj5?XsFK}7-%u6{M&K=Iv-{a1S{HeiZB zijliL_T0jNk&7+JuRZN_`m%#Z4`=m_mB_Rsg6VC!mns`r3elqE10D!|a=E!0)HC7) zVy=xhEXoIa_I=Oe%NVNcjDia?DQ`Lo@sh828s>uTI;6{|PA5ysdYM&UADF+Bls!*e z($Rs<$>i_iy6`3Pj`3SHATG38&g4d$E$l!(XqZBlcGr(flYy3QcWzR)q1+3V4bj%p zH;InchZC{3%&h$>`$BbqDdQr~_kQ>UhbD>r2_i;E9Z6MEanl2%pU@W3-IBMBSR1vu zD{V=ugx!`CP1t!jKF*LG6VDrUk`Zdag~xm&<=9L*bMl({f&e|Yk-SJ~|8%XZa^BzM z{myedcXdWMv`{7hU)g7ic~qEYwQutDiy~oA?`1r9jDE3vNHUlcf5Viua}t05!ZZdT%8~yEad+`NQK`)X>KpZrUXMqM`ca4_AZ32vs&dN;~qfXU)N4YHMHOVz|@# ztmc`}@{{>FTEu3tKpOv9-d{jn;9A_YZN_i$Aj@y5e(3cIJXDZIL65)5__uslP%2(s ziVLwHHoeLlwg73x zggNpx{oX0d!Q}QlXC9LLF1W~IJWLojij!JDh=!6mzHjUa{n0-TcfG0L^x`y630JtGl- z+L_2d>VA4x+GqEg?;|PZ zWGX{@RHjXifI9S_ktT!y{KrTCuZ#Y7hJ*q@K*PZPkBf#x|2J@!$0xp-+01YcF320b z$jcT3*?6m1GW`%?);FH^+4I||-9zPNA7!aqCEP(Bj)c`B-ShX_Q1EPp(5W9~Tx)ow>nub3T$! z9fyG#OcL$w*dY?sFQtbh939ounJ~NHG?g5*gZeI$CJ(7*XQ%WxjRkc+VWEN5HZui{ zYVH@}-}wjAm&(h%bvi z7gh?0I{K}Qx-0x@Hwil(vUrH+6G2%7ZIf1gh4bb<(kCA1tYX?WP|Ld1*@Z?kw<}cR za&SOfbCN0Qexu!$o-&(Ba7%J$wIs04SkLpl%s866QLvUN6Z^52zOHxokYH1Pzr39u zfI!#|hsQ5!qOBx3Dk7#)1(GFTrXAk020};fI%jDpjL6;aXW<3x~aspH@$ow+n2g zC^ZN%BY+k1qi~QbZ0SF;AbL40{RwYP5}Jq^dH|$)+21#C3Z)s@zmfPHFL9w4iCx=GZdT`bgD|Bi!5E^^e*T@ z{xxCNETiH(*K*}zV1=XUaL*_dsgq`;6~3l*?tpNeeGc+ceiTZSb>4E3C(WF6T;1h# z%Rkk0D){Q@4tGP$-}j12r`VMyj;r0Hve{@~2{f8X|9H1u54WnYKxyR<+fFDM-E2rB z`}a{P(f>j7|HbD2PWXRQ9~uCIfeDL_g^hzt{$Fy2fP|PV-t?a^={3q%%_Sey!p<~P zb|Hc?U$--qE=uDlp>D((*J~z69oCO_Lc(<>=N=I5d5D{ggdBoKKKJ29VKNh9VWQg!*WaU&u&b4F{8;&58U*3{p z%`K~vTkeQ4a(BsrC^5G~T*9|*=sy*{t#mG6DR#0G7jY8#_S|7f0 zBgG72n}63<2anSHXHPH%#=HJwXBrVB*op2w>z#8)D7H{irY0a9w*e>62K7Qr1DA0f2Q3m zi?tL);OUT7PX-89`k!Lfv9)rcIwhx-W z2xI7sgxk$)X1iHYJGqU%TWxyeS0{w9eak<%uaKjv4Ts!-=blbNgp|eX8a=3qW{#Pm zNWsis?ro(JVU{p`OqdxGU#W@(j!Gm`bCSr=hP?3P7&`wNVLLM# zwxK&(TYsq6-ZGda9i0_fGFG9YQNqNXZvYdo8(P=-DV++s5(<}B*aT6o>O~kq+pbKu zW)t^{L+6;Z7lD{i69;3Gz1Z-wA%7FMUsxDN!1ElJfr-Kf)5qy&x)c9l!b}T|&Ut#X z4_@bX0XL*o3yOlkCnA|e)NCKj-@m|u;8`>x#4l$cSR^#u4HM(P-( zun=oHIBC|QViD79tVk)*=TW$!-H4Z_d7m#Mrol@lqO59l`YXxz#d`Eh+JubMAd5Ou z{5XUK*)b*J+n%I;XNfos)~GEGsCEf9q^QNpVweJP2`WQf=i9}5a=?am$U5-nS2RW@ zU_z-M;05fc^r~>hG)y|aN{C_62c>4wMJ`W$&ZUU&&=YU z%2?Of_y}(6P_1u}WvxDI$Xkh-^Nn@&x@J@0X=5t?v1Z)dmV^pEMwUA1WUl}14u{h4 zhcgehbK^I0E$B2H^af%V#=ZJPu__P=PeaRu2#PTykg5{irq>W?xPy$?QCV&S1*;-7 zwVn|EDwIJREEpa&$)R-SUAwVe(BQ8Oo~&Ym^N`Zv_F-%qzznKYoxW0bYphwTH70}$ z=OL)?LLJohd?JA%BJ@+Id7Qw8s@OW^`C(0v9b6^wD^3DZxtcB#CzG|(U?kOHW^fTO zm0{1(7#y->Xye>%qVF*0-(WCjP%6c?>%_4ks(k~wT=c7p=R4sr3r z_*r32fjXPR0{XUtnSb!78e4-^9w~*vVD_#bv)z9zZ`15GcCF;b1sv^`&k#Qhl`PgN<@A-RHEm$o$#oc&WrKTK4f%EH1dj#9GO&DQ}WVx=@B38&kEr_D;Wb*Cw3 zlDW}r+ELoNzGRMA25A7JZwbR0o`6p+E+sabu(1qv#CTPc=I|OYxKliT7edv%q>qsq zo1wj6QY|r3oP)Vs+TL8Ut6k#OWPdmRF6i3cpf!u=^qaoX9p4?%fQ||W16r8ItOqR% z8ci?7mbrPdbM(#@<}aX@hUsG_&|TjvWt<>*{N9O(4ZFb2Tc3VACk4E>aU;>G;5bCv zHJ~w=%Lbv>5GC#gHHsXUBqb}CLWdgI$HU&!z{$T6Kfg69>+F%%EuHlXHe+}Vqb5&a zyXS{5RyJ@QaaBH9uJ%F0kuX`T1wIb+3?CPF9GAj3FHFpR>$2I*Aw>xtVVgTuyhK=$ zqPW}DKr2yYP=oW_(UnE#s8CeeY*O5`%CMH_N$fSnQV$$68w@{JPod&FPT~6th?vXW z*u7=e3!S&j%gvjdD%R#g>#@|hAn|g%F!UZ$X$Xo6;+5{rAWRH2jL&~=@P zt5*JW(`<0Y2(z#ikCU!Z{_*C)!8tzxzeq2uA@crci|S^FXWUfWP{L?tt>Wd{kWL?Q zRFJV>Ek)V(fK5;X#7y(&p7_S0bz|9UQEGMg#$|5NlAnGm}eP1ZVN@zR}T% zTI#_${7;fFXD=QEHtr)1vFkZ;wH7sNudOeJ&N+~s+%nr=OvuCD^WqE5#lyv4C^PO< z+e7Vrj#2rJERb>`bS2|3K(-g+Q(D99QX2_}hR5gx55QyPC5!J@CMG!pUO*R}K6 zAgRI3Vs@f-)~ODj3)2WNjc}ozx((iz4%NUgkY%&uH-`M{@GPoHh) z?Pk`yjWC**yXT<6hhfg(ND7gy{Lqth_jGos36mELeBKR&}x5vK1-wPdddPxx?gesu0VabVeys+~C2v-RtC)U&n8; z+1<&(~Lt4B& zkz52#D9@-68-zI&!Kon;0Vl>#Kpev@XL?bLz{xqW(h&ulrAB9?1=&vkxef6aVwOg` z7BY)W39}ASTQ76OB1pmn)oWYzN0|de+>G*f<6Ay-^>w(2DWh0D;v>b5w2$Mkq1KNY zryP%INR7=z{L-S}06Z8L!C3orox|I^TSamK$D%q1H_POM7>7{~VSm!$Ya6qu*@Kn@ zcn-^oq$qQ=8qz>(t?~ZOQzb-Z7Jv>)WS^n6prWo0avg$D*GTI=DiNJH*s?J^U2t-v z*$4uilho7^*#=U?jn92hl|A!<{3(SBiHeGQYjaa-N=tlnJ%)5z*QsfR>$rhsmE+gL zgf?_U`-DYLoO}12#w9$mr04X)Y8)!IX9g9CC3TBF&Fq56^P7gA{!>C*N!FI7Pr^LV z+OtJHo*86PBp~IfF_2K_?oZ{@=~f4k4p(e0TWl3|WJ^bdNX38VL6_=I;y2y=`!AsH z#qXK=dattY7~?qG?uO|^f}B{ge35a&R(xRn#1~D>y zg-90jH58A}+mA{A$@}??1AcSsyF+NiH{vfueKlytW&xALo{{|XjUy+B-{=1VKF&M- z#9sdf&ov?;QBCYWqLD*kW;*s8niUxN{5T18-6f*hYBpE&S5W)jkWoGPUFma%gP?5- zb>@?7ea|E*>AZUxp>-Tp#S=fFvWD4BdUZp~(bgzAq&&-r*p7bzg$V(M*Mk|Dt?dGVR!*Z4L9t#AC=?qoR?xO=MnfuIW)BNO;d2qL zm1$&lz)!TRwk_k&kko$BpJS!lx;vp2p=qGE%}^;H)1^P4;QepY7lyodLeZaxyVcW- z{txdV*WRjTfluu7=`j2YLNAbf4ClGe1Q?7)t#O^ap|01zIW3qZPrv(xe*f`-aQ~x& zx1VgC(DiquO>D;gqr{YC!VLEe-#b8VP)Y^EC+>=hF^%~4A7zT510bNFApev1g@S{I z`bV1omY6W0Fe#wf(XlASIn>SFVaO%Iv8goD*-Be+s5vDyEj)&n4)3`vGs^x;pirU^ z6M$;^@cpj|?_F zaJ{y$T4z-gqYtEzMd_JCktq|hsKWFP zB-kn*I#?>HVl^nt(Nps~KWkmCJn~_x=+otW>(X|Q;32?N}pzCtWX%fn(l4s9X*8Pk;&E~t$<={t6%}am_k|I-}8rB zafu?7jKkOJHcqCAJwOvHbH=ic*>f8R6b*R_Bidyb4MlN)L3R5C8n}K&jcifmYKPHK zF(UTIFpzueYFW(2(hAY^d`vYC)b3DiPExc6+RgMm5`y=*O_ie7Z{OlH9XH98Bc3iG z{{jT^vIoP8SLW>aZt{%#$8&x2Jx%sqj=$x~N?dLs$hzS*7(vj~Za*BIdpDKP6qy@w^H_)Q=%BCOU8 zx|2?Sd9lgDLqk3Rx?+g7svnSl)(x8dP6(!pA5pnhZC=q{-f*51&Ta+Q^~d087K7@S zBN|j1P2|-elZxWih!uNjurUn}8s9Y2E{t@(=olBk z0v799>kR9QHqk>ddUY5X-#da38!k>gV-0hf5HnJ(HN>!vj#~6W)AZO^fLFc5vlGFegLL_Sp%uODYpy zJROqSIQj>*3~sq(Nojo`+8MqICzN%=TfsJiW@pjIx!)+!gI=zb8t1PjrJ9RTzojubvC#)wP$&N1}DBA`SxHAQp1 zQqN`yCseG%fes zi$gU3^{|+u#GiTFZi^O^C=CMGZdpTz}eKM9pt=>)cr;@W3dKBi1l;q{4zar!Z zla|$lI3UUFEus3#r@lhdn#2D~o>an{D9C7)m4`EomWjwAs*6%Hz(?D|>m#0%k{AJu z)xJC!+a+YT#?o^nGPHFoO0k%@_Hx}g`=+a;A_vkD6lI7ZFMuZvn9Z6myGqDbK6(4T3Iern%uYpm6*4Asgd5&#^5-UGaR~MZ}7p9n_ z)S6SX%BNg2Ayl>Q%~>bJSeJdj5BL{=)Mzd4&3Wjzg``yj#FapCAayVbM}qIDrWzqN z$3S%%!xfh@HwM=>|ARPWScT4{Ql-N(3Xe_HQ`w}j$hiheZG*pnBOx;D+Be$Vt4p08 zsF?RgXF`jnc9{dA7@gRo)dh+r-9DAehE;)YzExMIU-%^K+b>~HRbI8+BnB#DFI}eQ z*SL!!;(AW;m2FNnXvyoGOOD;KPU<=efPAT1K!Lz4SY9=CdJq{CQv(CSS|?Xcw=WpW z>!!4_Y(HNK<@JgFTURg+@F!}Hp^Dz!?;+Ji2UF>NvWoX8sw7Ib!k-dAabqb;h0{Y! zHD-k9b-`gx{Rr>@1H!C*Q?jhdeeMt^Mw_#)^po%!p_EtrlTN>F$YM;ntoSiAj-F~q z-E8QIM(-#R#5UfG%@@UoU=p)EMT#}O?`N@NTmsJ8R2R-zxKZ+!|rg_g?qMrX?_-k52HoD}R>bou#zocb83 z#mo-$kBuY#%d+s8M<2?@6}O+x=7-2#t#OB%GF@F2n~o;tIi#|- zb%9XuL=>bGRWwSP8LlVy3SK!PhIm1QeMuDuf)Gc!H`vdJh4CnRPg7#8C{fkyblrhX zW%YI|_AG+TB5~XwVcXkZSY}mD&&j4j{TzvJ6xxpnt5DZShW&i;l~#q&1;&r(U_0P* zRsC`KwE>#mswcHpYZ0fiDrV`V)7h1!v#EaKVWW%zGKWSS|HQGtJ9N_VQ~xbkfMyH+ z8G0Hy*wzLA8-e)t%Idk6JLk@nX46h2G4P4S>ju)=HQpfZQ(xlBuR3 zZ3VuXMTDn4EdX!ztBwOJwbx9NKTJqf`(01($^G;&omuf!l2AK6qWHXX)02wj2_#(p z*Ch=j93C!+mAfJ}Zw|wYI?XD=ZI`Im!$yj!j@hqAKN!>x8GcyS?nR{XZClliwfPzq ztz19WbliE~e34EGi6}{kY%1ttJo;f@vLq9UFl9eodY_LA#meul)P!UXn=yF0o~J5y ze}MeLP*&S*?WVCRnUEz|6~zY)H+dAG(^kY|KN8?TK>Z?JT~{x|392rIz7i9;%G9%| zyaK6X-;sH(>vj}pf<5b2+qs4qIvJidol>PM8kT{J_Kd3XOY&XS4vvIe<*VbW`_ZOWcNJt!HYo3%Gece1Pon=bS^El+cvT(kfbCoW0^ zjso=covV5+UXC8oHAj0VUV~O9Kf1-bP9l5cs?hwvBB7V`D;ym@l;4?km-~mu(dBQ} zj*P3_>g9qt(3GJFW1s83{1o ztTW0_iy`_E(dt=qjle8SVYf}uGRJdG=b6`k0aj#x@HXo@gG|AJfwo?QPwIc7*-K)M zw;(OF+ZH{dqTgt>kX<$ZQ~*~=Bwxi#n*hO?lb3Fy-prc|WmGZ@kT(S>Zn-3m1)+Df z!kZNv0rFZ@wb`Gcry8DNRjRvm8N?T_$l?bjvSAsu6Pitcw* zjqEZSW{1-w02nkWX}o9Y>%$`LXHu=EpAST>vkZZR;WXHO);LJ;#dv%YrWz7KkK+2OhknkFxjA?;+I53h1JPLVhsw&V?#A&rLN?O5T= z+Euo@bdY|_1cXD`FyRN?E|9DCsfp)6qS555&11m~YKJYKOyAU>x(Q>3H8JOI=w->N z-y2L$#pe>?xnjS8nZB-1TH6#^@hWcM5@+_!S7{L3;l-2b-Wm=8O5JraZ@2lYfk8^N z%=+f1jurNFzQE6FYOya|bL;}il95-$RS+$j2f&*9YW-C#`%DkVmnax{0;QG9NtOr+ z)|zv?dF?Aa1uu}0)k6x*1j0wcTyKxo_PjFhvlOuOd+t#(tUwVkR;2dMjN2p+dKMs2 z$$}B)d6WOb=VXTU7a(odD~Z64l()<)Q($#hsCtT=34dwAptK$ERiV_ln%VwFC$e2&+MbB-xac@Q-rvg!o|Cv$+Z+6~4eD)t)CiJS2*q+_C1l`QHbCE^QzNI= z`IMrfVNCIe*A<}0`gd%`+Dg|1fncNNLx@i4X3eun2kyTg+8{Gs4PEv*Fr6L!RL#jP z&PEC(^)qMl&tzvY*ZF|BX~IfxWz_+jwh#ZDci*d50&a3B27kl&^pFvRlq}XdP@~v~EFAT22Bds`w8U zqO>?4HEPUJh894@Fi{rl^9IW63jGvXu_ub?zUqA7W-2>K(Ep){;PZy7Pqd*_PhMf%XCBNv>Rf%tgh;x z4_b)b&qFk^=sHAHaS0*ls-9Q{o8m00+K@LfE-Roj$1)a?TK_li>JlRVp5i$Jflf(N zPtIlID2g=CwjwM;VHYGd7I*wykQ$@`o112hU6I-`!gIZ%Y^}ReNXg?5NQ+=iqxIO1 z9GDqP5+$(!R*D530l7Wyg)NQ(I3?PE`n@ns`_Gy!J?gCA(u#!v5|3Lje9?LQ%KQ|Z zY)$u_WLzK4QdT$l64xrU8_<#o_UO;bRT5zp=z(?j=bAO*HxjFC*#qT&0bYLrtLlQq z7}4|{_gN&v4#?!wo`|oo!(0p*u-dwQfhBTZzqc)J#1{UXW#$g}_^nwRIVIEuQ?aqW zY!4&SE${ymLR7w%FrbMxu?U6EO`@^1W}5Z3yY1}q#{Rq2wAM`F{>m%Tm&z76BPlU0 zJG*aRSKAI-rVJpAZ>{yH-%O}plq~_|WY&RD;vX$oH6x~NXUnaUC-qX~NL^l5A{P{Qr=9zeg&;lVmqfvajhO_fkhn>h?rp2~*2w~A?<*wl*3F-4{RMbH5~+QX zPJzL!RdQ$_!P+1o`*96fhAL!Bq90`9KFOBHr5X9vsI0d?MBTU*-L9fiwOu`%HVO6l zR;cwg(1D5NEu;bYPYyGc>XE&J!QPDVJ`S_Bfl^t39oXnEfFsXTv7}+>pA&HCj7${;T4I?_G{(D`B)L@BYww7W4)}7^6z@Wyyp1j1v}+-G+xsas`@2Gu#hXXi#x4W&p+}|3Q z6CTd+QHQOszK=Z})ODob5>vaH%Y%?LezjLqPc2mNTig^ONc)!&Tfj*G>us_$s-ZG# z?B(qK!;u!@zA><|h7y1kb&eF_-rLp)&oIsECYw9+EkHQb<}I_UGV|F~nwf?RN=~*W zKTA(XI`Aqyu6%Q(n+0iVFK%ouEDlAT=XrQC;K^X^sLf+Z^HXYb1lVX#ESdR}m+ys~ z%32f9_tfaARliBs>9A*^JRIF&@t^)2^^dlPCXNCk5Zwbs^tL>KkP?oBTgEgZPt)df zi@-IuEA!Y5vNirHQ`^6Qu7>zijEjR#)O!uD0O)OOn;OdM%=8*3Xj+cMb`FkWQ)iJ0 z3X$c#BnCfo&cY_mLgHn}u8!X;%7(15fsM@gwFc$Jm*DD|U;WT>SxeOsVgAu9@j3t+ zBW%zXe3ntz^zddVUe>2kD>DPgo`1CnjZERpXalt*o<;)o{iFs{;WEbw&xRv-O*g3@ zHjAEk!*^4mQfn;Lw|00LMz!%=S8rkAh|adYvJ0JBo@h`p=aacC*^Fnz zOb0kgz)dsX)&7%0ZOZDsN|0;sMX+oIl^AV~)lSDO&m%qa3k_dV15#3`)*wyR*uE9B zNwuh|uPDmz7Xt;lo7U}J0GP|*48XLCq>V{fEUkCW@ZKIm1VDQwm;~W)#{E3 zZILCarEm8JJUX`j0wS+!dlDmAtlm2{{{qf~R75}WH3`IL%O=Tgl|3IPat&-W=I~-& z8_4T+q#jTWqHOorIqI1NBc$ zYPMUnNO}&*v^zUJdnT}mV&&*bn>+aHlopqVeS3lKGmb&~QF~(1R-{>8d+8lX4B_|B z@*4N%8h31l8(6wU=noVWd}{NrxeK3-%DnRYUFV^bFRIQNiwZt%nR)JZeDs%_+fo^j z=BW1mq;)l(M!>GE$eYq%3CXdea(6ffJIlu%PTCG6)EVFDfUqcC{2sOGoD{g2+j$Nc z%p5r5kapK(9-72Xu2H@!4QGob6kn%LTN}iarMDQ-aRKkVfACKELp-nAEqk6dqeUr5 zztNke*4%R)&R>$PiPW=f)#!u@4B%r)LNRm^;+$Oq{F@T(;axpdKpD~MfIt5x#%Q~gdakn8@iJo=t8lS}Rw zfg@7%Edv{D{2kn4@Wd?k$C)b1eqLlM>tokVd)C*%`B9g*w0LUHmZv4+Zqg;$H}^go z6scSN7gJTZXY7{Af$mgAVS<9~~pC=X1LEk+u{{7ZZ3Nsjh&KR7J_<|2xq+RX}w%%VrtIjvlL-s~j zm;Es~GUs7m%Vo{l?z!4(3i)oItRooM+y1I$;t89*2x~T^A{Ie3>W};N+daUh#%VMt zI=YRG&szL|4+ayDViYs~Y)7;@Dh#@3dLc{w$YCW$-DZYGQ)T+h1W9z&?@Ry!F-+v&5C$p$p$>m+pBPe(=-hz)oXd zaLch6n|iN;wX#z%o;)rvQMC_e-F01(eq~gjQHOs9)}UAhy52Qf3n=eqF~q3bu4DvF zhbON!#lK3X%NKoL4bEa4+C3z-q&}b>sOk9`wWll#d&6h&%0%14Xpp~-TqTn7t}0Nl zt<{%z7R}3*`WxOaB!i~@LZ{*ejpB#H(9 z+Bdb~E|sP@&q5-iF_9u!GvMA`YV(!^;hq!p1= zCP$zdWEJdcTQl_8v3_)RSt;959Gs=roA{bw>_N4~XkOY?W)F9Am}nFjc^K)-Id2K=A+M(B zu>PK~0)@<|Q=&p^lS}o%vQnt0JB3W3gXXKoYcYX%W%U}IjynwGGL2%PcHN)?*QWIJ z*_226a!4yfY1Zr=mN@uiqt{!iTz$+*EmndP(d*%v+jyN9pI%PSkirh3w0%!f4cSZ& z0}QegsT)ojoKAW~Q-e0;HH3A&F) zVnpQYRu&)j(B){~N4+S#XC#&&cB`}ulb|s_KN-}}!hTZ0+7w8G$Al!wTD#iPp9Z9geL=4YoghqZ#j zB@osAAg5ta`e9N-U$G*L8p9V)%4O|HL`347)eouEssWPA)HLI@UOg)C4bTT9>|L}+#bipSQHFqn=EA3o+VXMQ#Gi3GX4S-<+V~JUdDLO0)xdLl2WKAQ7l}tgbw+xx zDMLUD-5y+^Oq_74CNK%4(Rz$Z23!v%GH_-+18r&TZByjCoo%q^qz@Bfg$)z&faLk zNKMk)a+9#h($<^YZ8(|gcX~*LE%;Ygc?y-XRGTjM>0lWjDoHjU!EqL@)H!9>{<%>mzMhEzl#MN zofqP0aOf&w%Tz9E%lK*+?csf+V_4l9&=ynArPotG7d@FqZ>+&yGS`DI`v%r}(RDDr zYw0?~-n&U0pisksF}H>mjiiqj9h`tHewCD}Tb;}XIdUvVB1m8rp7`fXU~WK$+p6mg z=@V$i0j+Oc(Ze*pn3O{qBqK7T?m5MxI@6&^zq!VP)5tW)p(aZAr(4zq`t+P-{9wq) z58>YWJA@XW#9k%7ov-3+0eh6WD{D4St1!5_4aTh-L8huKHM1}>)v9h0@EPa;F1j5a zknWM|*GGKB<)updYETtZpdzp7)<-u7IZ4k)N&YKb_Ovs;Bd;nQBZNOoCPV65;&m?@ z0CG4=X}Y?0Wfc|EJcLNspwP)rbxz3h3B}l5sc4O33r)Q}ozDAvZrpa6-(LW`X#2|M zfsq?Jc7bwH8o>dvkK~jlp}-~En@xE+`-@td9=}RAiCb=M!UK(K5MIJv9UHZjoyU9VAN$wWA!)hXrzxLXb>j~ z5?^|CmRZ@^S)mc1QSW!eTBAW@x%Gmqb!s-Q-vpwUH)Q!NGozA82NsK;DN0ICbg7Sj zz3g_|avyAq0pFNe$JVdG8ntHPA&^QrRQ~NEy;Pl-!O>G#UPF!Da;QXA=qzH+N4Wh? zv6&X}3L28i+2fv?oK~^3IcPVF%4=}L$gMV6mKh|D81I#Vn^!)%Rz>I5@vVkgq-Y&E zhw?9AF0L21pIom!dbt)Y&VEZ+1FR3%Moy`a7OAJ0G9%;owSOtP-0m*`r(XU~je+X3 zL}_igBbg}I{d8(h;Tsr(NL#hK*uwEDLFyERfq;ha98EiP4cPoKrghelUul0~Z!mAw zLmOIyo7Z&8f22)!dBw$N1)Ohq+{mSIkX_fQ{w>i-M?Bmq+R&&|T*6c*qiMG^&}sAm zstVGqR>RDP(;Qw!Vf+g~exq@?76O+~0l!@VzvXE!c+|gxYO1wU_puz*EXiU4F~o`K zD%Nx|_nn{t=C_1c6ksL;TmKoBH!V>cJbFw_;zj!}SxB5<$^COYyq*_>jU`skLdd#_ z>?e|FHNQISplKR(5mjv=%M(wfjz-yQgUDyP$WU)n&1=L)yum$($vlH^-1Q{ub&+y~ zjlrX_p!&ccEF7IKqo5k?U)kkTx{uobtW)!cPGduR9d21-^YliJynD34S0ZA>`VYj~ z|84*JejkX9(t{m1(l?Gkm)a})&Rby+t@4Kr-e)Fc-n^852 zG3dw-z~WE{9pyHY41#DSXT#a{*bHd8*Na1s;D^ zo*GgEbUM&3EnhncAXbWC=J6y{YdBWBX2_DnP_IltE!G7g^a!O4UmPwUqE~DTJp1+-#Woz!i+#|F3d9g?*!kvS^Xn}!vlcLTXY>Uw&ak#vD zLep<3A)EF1PQhuo3KWkGkYaFJ8R_V=8d0njdrTeTOP`}&YdY^1sarY3dK9?5j>Rabaz(J@-AmCUN%y==Zy1Dd>VJZ472}a+x zX4^2G2W=Tjt0Ik`Uf(Mo#bnF&k^Et62p>paDsLhOrhp+cHXefWj;I7AqQLj@uAkz{&VR(ToJqsEO39 zIU&jTpyVs82P7^*_!&*Sh$i2iqOc*4l&&nPUoq}W1rmO_K6)l`_ISjDd=U3|@kPR94oo%7OPQxdnXY;;xS8+ z6WIg|-F(R<0i0~`ZH23QN^(9%V6_MBGr&a95FXQ&uXo7H!hlA>?66MmN#_Qzwd?qp zgtXpSgA{~28*U|lw+$>qESgBQYK{CM;kZU5P?34+)xbwAn9fhUk?Q4>mvQql8`!Zc z+Avyb8_!G#*Aud0LkwAjxpwd9@7Xpxw?7@e7C`rCfU@_-+iX^e+YZ<8cu45b81c)&JljXO> z9X(Ida4bGajB=hW7t5P4cR0vnVy_3C7{k)_<(2c&m%nR~OkSjN8(}$rY!i-t^5sVM zfPBb4$tMFy^*N-3k6z7xc`kJypq%@RroHl9{JTNX&uRuX;-F$7q) z=ZWwP=Zh${f_d8#(rlxt8abHt4=n4UDaPHzU9CsNaa^b-r>JY;ILJI7V{kXm`C;dE zWP~x2oN#bo9l=lb+6RDKfB_iV4yDlaK^*#(6M|rA>{kVSSq*E)Jb`+e=5kXjz@W^=lF2_z)~U zGtG~XY4}KhYO$uJwWrP42fm`|_jUb8t~>>X;JO@UZT_vCQ&kMdV=VKpMR~Vhr@bZQ zR&zB>m|m< zf$+!)@pKZ*M>Xs|262P})a?76aWM6}3j;Um)av2x1IixPwvX!7;xOj-$-m2Kf3TA6 z=J=DE+Z4P2KT)2dAGKydOK8Gwa|-=Q(&NGM!tv%fT(f?mMicRnP6Zx7^35{{V0LY= z>ICUL6OVk(oGn%#gD;z)zXV9LlWAc4m^`rfY}>4$J{Eq^=McZxAwXl?8-E=7F9C`h zE5yu%@+Bd09;b6`+S&3)FG<}Gx>^+LvNcznqHTl$AxL=%;I-ICsB~muKZ1IFC$MI^ zDfK&^3WCYQC|)|LG&5L}&}sA+Lh{@5@nH5IA!r;2>S%DhA2$dva3pO7XVrt~o~eIU z9zMA3ptIALczGBdxb)7ZM$dGplGgdQ4#f6XQPB~ol^{by{#ygjv)eT+-A|)c#~{cS z3#E87y9(rv&4w$fQ>}`{Lt$=1<^;3qd9OCqCh_?`t_9%d>(z@}1b=LB9Gvo#oO01= z_<4FCQeeKmduW2_73dg z76L8FAhq(8AL37B3*rI(T7`au3 zht8KX_X%;@xg11%?@8#x1RtQb`%foD!H{#?k|~qg%nY~)*KCHv zPCy?ltKWnF0JF<|8(5P7@CW`0!N-DqFymi1`((mu&E@Q86Kr_PF(0@eR>ytEPuu~Q z)soEd;4^`v!tNGVqwj?6AG}9m@P{~<%L|I;Vrdc_`#EpI-97o}>3R{882g#k3_5 z1DJ)HUHB(}+xJHn*uCavMvCALpD{d_fSgf;EiU9BUP1`6%fj^6CrRk8w%pPxhx}gXBvv{V^&J`z?IK@Q2F4 ztS673L=)_PU)BNxp8JHeMxf_bWdag@;AbJ7Ud@dJekW^aL?eFYAoC6QfhISjzHd4i zz_0#nU{Cws^3T)gb~OI9at`bC2maqABh~`my1q6vXvw-i?Y^9Jc$%XV!p+l=EkwL6 zeT7}IJu}N{jQDIC$i`(D9q=w(fwrdlxdsoF?T_6Zs?&vepbK2*H)f*ZIYDoV-SlsV=ax~91-AW&Pp6(g#qicaL<2&^Y~}H`;>hx&Pad{ zMS_wC)Td`vnx`x<4IK&J8SRb`%$RM5iUbHA9>`#|@;xQ;kH@XDboJsAp~pPiZ~Pp; zMr&x)-|znIxv;onZwt4U>m$SEZN=$2Wr$!ew1oPOL4Tx7gN!&eFOm*n{{UI22hD&J zf%N5eYdCvoivd6`Gr2j7b>xJ!HE(q~pw0Ib=9|l8c&>o_3R<+c@jrDzmDdN8}DuA{=fNPJlX7k^@!8VP`~KmB7^rIgdX`Xj!W8X z2e&$@Wq{vYH{bU0xbR2bFH_-yM3`mSeu>q8bFX+39k3eSAQ^+n-wWz7r)%+rm^$ku z+lH5eVUp2ocUH+F2*4IoQ-)%01-%IJVR9l+-AwG z9r9b~p8PY66C4&ObRJ0g+?c|wd7tglcs_8Nr1aFJwR|ko4JP|6 zi%E3uuZV2nwE0CRGtMu#qm>;CS+Cpz`Ttj!-$uRPv-fE^=t*+MGDGv*?lOdoM#oltC5 zk!krM3Z96@0g1(S(_k+t#_gAd=`D|`f6{fHJN{ZdVXd%MFJsIqQ1T$w!f%n(t@9rc zvO&OFNG>{cBQpUJ#mF#@-0-lDy9d6%79uj&e4@AD3wUe9%fg;uMm_26x&h<;TtIKh z*dQD8l8u5fRl|FRn2z%9cbp(q5GHUomx}blde_6v_POc{d9BK2W9DxvYn(QIIq4Jo zxfuXHUjG2~WIO(c{ISFQvseLXlUPiAT)7>*j&71bn?uudlf~n390qoN*?y7i@I>LO z2V}Ur?Pq%X1l;*}Tjk?V5C1Po%(UISBsFK!70gVZx5OI2<#rj>wD8|*67D@M_x>w z^9Liv#F;cx-NUa@4o`@{gCGY{O!c-{#66fv05LEi2a@Z3`LPd(5xJgt;bQ#uLk?}# z_?%C*vU9`8*0VRZ0P=DGo-rv=*X2J4OdSI%P(1Rd_C=v?lp~s$zi|#&$-X9?PR?{W zXZD0C)<8eqAipI zeUq%-9wSm-gV*6t!0a&QLxeudt;l{Q7vcpuW3Ny&@dbzlk>E!;4&<-i=^V>(&;2Co z!Sf^jv z$|nnge#_ItW4+0rc^Du!zZ2gq2h5Ef2lS#ao4~&CO6*HOAeb~BBNs+TvN=0@#@LV_ zQ)J1IEc|xLcT%Vs+p+23h;Pf-%K*1rGS@SY7b7KaB)t#BI4PHkc#&rn?l-nP!8gfE z1zK@p(scg-C+b_c_u-z*uaZZMFPPp}N@>y&(a*O3NBZkEQ=T-0X29J?q@~4Y)@6_D|?ASa`h98URy}4s) zFbBjy-2&uk+e3Ojp^*kVc*r~A{Tn7lw%Q#1&zWBAE}U(A+jS1za)zkhKtB*IfG3Fw z@#JIlctU2lIpawG0NWr$_P72wV^igrq&x%&_Xj*rCc1qfY2HNYhk`Dyc*H~=KTLQ| zC&4@O5M{nFK)hy&A}|H;WDEwwhpDsY%0oU*L4ZJvp9JO4+hBmTcD*z3j z+B8-@H|o|Uy7==fO?-^`w9LsFQ&5M7=h_NX8)acED)a z8C^c107Vk_1i|3E@3`n9Zcc_rtSyaBAh2;hjq3VNyWD?vssfKvN;PQjw7&#gZ)fI@ ztXd*5gO{Ue_&>+q5&&xW$e0Yg9h}aq$E1X7^Us(T{axSUQuyJy{yc_z_eNi(g3!71 z{;GfC3$$QmembxBX+5z8f3VH0IVz6)C(XX506tQsF_qXRaNFvd2^k`u(CO@P;M+ok97<>t^lj}}0@ z#pXIt0ruJ)w$u%dpn)FReEtA^GI_~8ODD?H=G)x!JxnH#_SzbJ$?jFx{v#Ot2d(Ca zy+^U-Hs=?w!x+L`i9=Tcjx>jwByeRA2u<1ygT(`BOAs08>s#; z{{YwW`kx))IQsS&rVLNMhW)(7^?(`U{{Vt$J9Y2P)?g#y<=SbFiId6CA`N=do)wq_ z$Jlt4jO+gZY5g+Cw7P#GgX3q2yc5akVZGm>)SJ(KkHv=A?_@H={{YOl)9koJ5cwkV z&UL=kDejXEASMAo^?dIa_j!H~J&bM}awkU0Z&@B+O^=Y%;;+M!aj6@AKTqG^h71vq-o&@;9V+RQ6#9ss z#vd1<;z{706X}=B@gxUxZXPG@MEHScya$LM)x!F0Ch{Er0K?+k95__@8{m2$1(!%X zux>pN-e_oj#L7OWcHhUnopd7@kOCUAx1B_y9~a2iEbD>R?JjRk{-u+tXVm)1d9CpZ z-)B<%9{PPYkUd92M3ZKvkM5v{aew2r`+z6dw((;9A8i?$>rJddS}G;JTp)U#A$7j znUWw!OP0;Kd(=|hOjv}J>EQb=#6AP*g&VE?+4!Ed>9&;X-FcSw8+69>gUx7X%J`H1 zZe5Git-O)>L)`07YJ0o{yhXR2$YLxHyB`cY5xluJbopDRT90hEwl7%uIWq(>JiHkB zl20oJOP&3oRC77=z9sLi7qiRyJQL&TpZ$n(xr0nb2EU;jL&XQk(e=wip6nClWIK(3 z>;_*~jgHy3BapRu?VIrSdR6lMyJCH!PM73ZHZHH`0Qn`Y{G;_NW3MIN&jQ82636W= zt}E|h^Ao7X^iB4dXg=mo;Tpet%V!$~NuFmd$QFKuzvP3_cVu0i8+ktv*6|Rg-n$io z*~|4GBnBV9i)inve%M85AGBt`ty9@P<%AwVXXU~AS&TeK`ExIpf8<@*?U50O#Lcd{ z+fSb?o9`wn`o0h?fuM@Od8wO&Nu)u1~W;KRSa$2?=wA4|YQ z47|sPT|HnylYCWk;AA|=XInk}QEpG!30*Y3sSLOmHMhkv9LRbzWi@X<9@fNhkA;-} z4D&YIKbZ(8y)n<^$35Zw?Z|kx?_%olT38>EZm8v?_zxlg#BK55V0WfR82Gw9&m-pE zuK{k#0rvv>B$9B?1m1Dw+m1LCd@R6xsHuEuW}cEf<*Lhjk@ES=Yxf=(Cjt0!)O^<@ zMSCmu+4I9j<2DD~w^&VJ-cd0cRf#j(2irQbFq-nqt%u2A>EZ_R5iQTgJ3Hx1O?JVb zji%?7{{X*+ml1dkz!u#^QzGawcqH4oFtEPF?4o$n^cW6j7U}{FTORO;+8)7zCnlH5 zQ9eVzO`L~E^m<{d?nIYm^4puyd&&-*=5^l5P7o${!*hgC4;HHNZb^99a~=aG?1{Xb zF%;Mw+HS-JED+uq)t?1{mv6?>&*vfdlW?aVr_($Yu-)?BWr-I!<-{5x#e zyePmpNWL;(I!|sP4=*VBWv9KJW6u$=b(JF|fYd+Ob@d9*g8u-oQgra}exfJa#q-SO zPtORJ84VC}$RAMk@IW`p4seNdjfPu^7)w5OiykM&0lFWpxGypVvnD(xd@_$%LSWFhK5%KUtzvBS8^%4>)9F%`?A-0I2_hcuzv`;7!aUfHS%&!>Zb{*%$kA!h*@IaJbjNw3(#O(t)y0%yF8$C)U6OhyMZ z{7M5e)c%$&(H{iQs}{=$VEQukS1$nh*%nKO@!~c30F@(_yFUYP1iaYCn*!`*s|>Q^ z8?nE;@r-~j09F&n2{9J?EQsTx53I&GN$X8mYG=#id1hTrp&*U(kWafg9EKCRo7`*; zw#D~v`308Cwqw3YNVx;$u&H1bDV74h^%?wo{a8bq>b;SuXI6;Pxij&@{^}z~15LCyLC58Nx!Z zA#EMWX#7re&bM~xecLaKJjaQVXL|w`#ZKF|b8+uh0PvzezC?ImtOzaUIUA*#!@#kC zwC3Bmg%rz$!I6f>vL^Tk$CdluRGyE*|lJLlK<9zNo^>#BpFM;^K z?C0>#+GM%rNIaL4l3tLL&hxf9l3{fXJ8I6x1Y@|%_<4R(XqE%VE}mm|vHZY>mQQk*v2|~zPBI&J*$2AM$9fPRXMy*LS>4DJ zAkV|z6W{TI3L|;y36z0Zs|<4U1e=h&$T-9?)S+S4KOc8I`}_}QnQ@<1mB@jEnXg1g z=X^*HiR_-U-NTqZuePkbncvrR$P__#f5h22czHWR$D#=22)_#`DL)5WV?cYB7-EZC zeekIKx}+hS9#~9td8uT+Wzaf55Pkk2M}5T4FzkN;#|F;bzE{f_VO~z2E!Q3VK2tH< zX{_gseiZTJx1%}uAK7sz=c0Sc4v;`5c^K@O!bZ7#p54cUf%bk&zXTMd87q%Da&{c# zskbZ;df54Z&BnVMq02megb3RR(iarZ)@Ae&fA;ehLxqEbta$KZ+>bQ3k0#z1wWwGI z-s`hMc_4X>Jd-l`NcpwCYX^#R@BRML8np_L=i6QZ9mw#CB8o(pF4C&4@mSLA}l zthHU^c78XKg~NSEZlGx<%G<_=>oDp&;rKh`jQE=wbh6xRHkQFGKmqdxXCXL%op)&` z)U${7AHe;Q@9n_rkj);9*%DL&8QtAh#ZmWW!QJoZoUSqylKPL+uD*E%bT2 zGpYL737Q`ZcDB?Raz0!3vW|f?F9$y(5qW~z++W*QRGV9mWFyrh+>H`uPZ>{X-Q2)V zK4U&b@v@Y4zGB70<%V|^j~b`u-rIvbp`*J9N70|9KDC^?56z~BAud}CQaJ|*pf z=-BFcEHc%|y-KvgIV-G`u6jFTZpIPT6WK>9&x9v(_)<>=@Jr$T52tJBgC0Kkh|C+{hUsXj2?kRb-;9uocP8eq%M7u0F|!gY9&Md7WdNRTSul!bto10*K{%Wl zmZ2s}Fym+DzyHJlD-i$!0s;a900II51Oov80003301*Qr5-|i2K_XETAYla*Ffubj zfpP!Z00;pB0RcY%UB(p^{zWq+!n=+D7a0p|%uW^RWJF*MO)CnXMjz$GTkOY`@jn70 z<$Q~|hYB)+W_47;#4N_dxib!3(U~#xV9^4p3ZrHp64bCJAYjyEuvV#Hi=QB2>0gW| zlu}j#S|Z9bjm1te`jvX0#=|AlAn_5<-zkqd3RK5MIm>^TuBvM09KdShk(CO>@zF2$ zIMzt^s3(ersfdS5Q^~w;7=4+~BVf!%#3l~q!e=N_z%doBAfhf31mqw$>Vzu2kq8uS zWzL|HKa-Kvbzt#O3MOF)#*}Um{9*?srvY4}5aOmDDU5M3+p%*w2e@#nTvgyejHDQ| zAB~aw)Xn0YYsisM#Zqn-DBFva6^9`vS%T}i$_6l-ncaZm4&lP=Y|I`%My7NZsGmWe zGJx^WF`{6^snk1JwY#708B_puGI=Jimf`YQ+OA@8c1+dSoWtvPJbWrCzQh0t=C|NQ zjmDw&3Ym~NBu~f?3{6oo#01n;srD>ImVMci^ zT}E<5ZNrE!7x-mWP>SZ`WGdR%?s&Ph13=o;@(61TCPY6cHa$<|ctIxRej=hJnfz2B zu8eydUZytv#^{(3vs_?Q2)~@kh{Rqo#jGf9bdw?$gBiN3Fsf-?NND(Nae>e~iR0b3 z!YD`a*Aj9D$s#^0ztA%aGSDV2c2OTGCI-1<)`RB>R=Jc{4Q z>-d@x)%&9{;deU}COjclrEzARi0*krw-Bz3RU(3kkphlYxV}q=qtt&amaIv-+{iKp z4A(O*ZzCP!78LAEShBWHRQJs4J$-BFHEy6xbe*^{He`j^n6Yw`MrAMq+T9n9i;kZ_<%_ z5S2Ewf~cheWJ+pqc^Jly%bUo$CuY{>P-zx!Y|24BUv=v*p1AWI2mx>` z*{R}rU+(dLCmJ_ivZ&dBZV%K900IMI5xG#PFoQS~xD$JWsN9qCPyUE=qbUT@B4oZs zwk{BFVrEiKgcw|yxQL==6&wDHiv7d*h^=$X{{Tu)FF4E@v7G~58lE?gkHy5e&~*%9 zVsIRZjA+buSV0H;9$Hnf@9gedRRcH*{{S%oy@*6W0Eg8HsKsV74*hS_3J~`hK`{kY zKtH8Q^dZT`_@0dNTI@=xewBsBVKFtzxJ65Z(276Ej5v@g0%2e~fL~oklvu)_;v#+j z0Ef!zJJ=R_oQ>)LPjJoNqXK3h)KglGxJ5!PpcM&dI*PU|!T^oAX6Qu*wqn=xl^h3zo%0(>85Ojr4ufUQV5K| z7(s=1vjE&{EM^m`_B3EHpGVV~a~UVuyYxLbQ$9|>gxgQG3hn?!!m+Yc<_Qy!8-c;O ziT?m74g07;{+T}9S`ZQYnX!z? z#$;XutONHN4^>jNaEZ7;zNZ2DoK$uoD{~w3Q4Dtqvz!?Xh@=$;36a9%HZBrxs4n6V zz(OpTz0duO)Jwh0$QvUP4{)YAlu@PX1GrA7D(XW6+!?{CneMp5e?+;9DO0|p(XtF;6q7%Y@-rUA+-Fo9GcT4+s)13mG1Tw4 zK)F(&YJ;zKK@kaIMj*U|94N-&5?zZF)?-^m>Ay}q2O2rjILXTsrOqYQsH1EKW)4L-g zQ9~5k6rAHsP@%@8Nz_s4Vyn9wxmoL>aE3&-oiR3Mvrz)e>`Y%m`{{T#Lah+O;mQu?K>$G}#bbCAZfAIAZX*FcLidD=jl*?m$ zrfHDJ3b*84Ri59wFB%pF75bunSc+UT8fr>@D`rgDGS9Y2wnHUG$ji1yL8xB-4B0ML zRqS!0LdT*Pe}X#8&sRbk8t^7tANf&=9bmL&lcy9oyV+DKG&EBw{TorFLQWI2E=Mb& zkz+eh_C=&$F?8(12<62OZb??!JyL{n%cD>3xQC~5g2_8kekjj_*_C#^36P3%O_y=v zQEk}OGRr$LG&%haLoU$W4okp^6~uoCO~L59WR)0wYr}~}r6us0n>4dY$%stt`lN`f zMD(bZ-|)z-q$Nn9t|L|W#x1mEgrTSP&w?yhL}f(X?Ty>~pAIRj8n!5ZrA3Av_dSm7BMHqaH~W9hL_;Q_(zGa z%?Sx4G=}zh;>YB!F|Nem;vpsUOF~<|5Y35?!2I!Fg8LFSO6YNDi)mP$*qxF)7iJch zlPr^3d?vI@XiJ4dVniUmM+Db|O;h1)X(huqNXGue)9_@n?5jG^syw7(gj{W&+)2SC zCV4`FX);*pHeU)Bj*Wb?+n3pzE-hG=#T}F4G~`k#BsJ7(GKnapM@FCHiLSm&UuIm5 zw-w-ALF;7N>iDx1_to)#*_uvs{{TWnTST3mS-86tyjf(nh^8g6@kCY4C*W8yRi4f< zVu!;$q-2AHn&J?1V#0@sZlp;x+I(Y=X|2$)s{a5cI4}N*#l}v>L#imzA{Zekrzf#` zXc=IkDqc8lF)rQm(T;Gcns#L9*Xw3CQm1r&p9z^U_SzOELJ^DIn*Pd<_D>R)qC8D_ zF+nSG5{KI=23&BG)!De|k^QM2+&bOto2wFXYK(XxAKG&qo4Rg_x3P?R5V>3|lB3*^ uvP-bcA2Z?>95Usa*bOp~@iPh3cUhyU5hZKXf} literal 0 HcmV?d00001 diff --git a/tests/integration/utils.py b/tests/integration/utils.py index 3c6d3bd..246d272 100644 --- a/tests/integration/utils.py +++ b/tests/integration/utils.py @@ -43,7 +43,10 @@ def get_anthropic_client( def get_gemini_client( - gateway_url: str, push_to_explorer: bool, dataset_name: str + gateway_url: str, + push_to_explorer: bool, + dataset_name: str, + api_version: str = "v1beta", ) -> genai.Client: """Create a Gemini client for integration tests.""" return genai.Client( @@ -55,6 +58,7 @@ def get_gemini_client( "headers": { "Invariant-Authorization": f"Bearer {os.getenv('INVARIANT_API_KEY')}" }, + "api_version": api_version, }, )