From b8bde7350ef2ae941317a61a0c2072b2838fbfc3 Mon Sep 17 00:00:00 2001 From: coconut49 Date: Tue, 17 Oct 2023 22:28:31 +0800 Subject: [PATCH 01/15] Add .idea/ directory to .gitignore to exclude IDE settings from version control. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3009cea1cd3..403935b6ca1 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ secrets.toml .gitignore litellm/proxy/litellm_secrets.toml litellm/proxy/api_log.json +.idea/ \ No newline at end of file From 5ab1312b628984c0a1caed42f555cc6eb167ecb3 Mon Sep 17 00:00:00 2001 From: coconut49 Date: Tue, 17 Oct 2023 22:34:39 +0800 Subject: [PATCH 02/15] Add '*.pyc' to .gitignore to ignore Python compiled files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 403935b6ca1..47fccd9c5d7 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .env litellm_uuid.txt __pycache__/ +*.pyc bun.lockb **/.DS_Store .aider* From 5c1a460fd53f128f470cc12cfb78ba0972adf7f9 Mon Sep 17 00:00:00 2001 From: coconut49 Date: Tue, 17 Oct 2023 22:36:06 +0800 Subject: [PATCH 03/15] rm litellm/__pycache__/ --- litellm/__pycache__/__init__.cpython-311.pyc | Bin 13690 -> 0 bytes litellm/__pycache__/main.cpython-311.pyc | Bin 53849 -> 0 bytes litellm/__pycache__/timeout.cpython-311.pyc | Bin 5336 -> 0 bytes litellm/__pycache__/utils.cpython-311.pyc | Bin 170871 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 litellm/__pycache__/__init__.cpython-311.pyc delete mode 100644 litellm/__pycache__/main.cpython-311.pyc delete mode 100644 litellm/__pycache__/timeout.cpython-311.pyc delete mode 100644 litellm/__pycache__/utils.cpython-311.pyc diff --git a/litellm/__pycache__/__init__.cpython-311.pyc b/litellm/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 2c81620388cc3eb72a4004dd8caa8f225b34f69e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13690 zcmdT~*>fAmnQxE;F(3($1n)~cMTwF?+?RYr)Md%0WZ9G~dwd`ROoN0t13&|S5@E@v z6DMX8Ii_tTW)jC?9LG^M5BoPHf50xlVwGm6DplIrr@T?+JY@5*wcpn>07!wd>4$w- zvhhQIM}OV@_5G25u-Tdj{QSqiAESSD67pY2lz&={%vXPDA>s=j-JLzCkwgX1S4Xlr6l)ggW&SCtG=|iOdtei8fFRZKm~!y1ue~Qq9p8vEfPJ zgQo2pHO+>m{TnqKQB$<=t)huw zCf)#T6#rA%1mOcvXOOiq^hg^IW4Su= z3=yZ^CE^iEu7%6RzN`lu@X>$x2-uB0V)wXs6l#0|X7-ctc?v#H!{O7--2K6kX{08+LqXGss z%c!71U0_tmpe`~hj1&!QJa2S**Vpd8pC)T{uitsCju8G5{{nqs7P#wQu{UD)yiG7WO~exBb%<`{%xe{eRoH{WBH& z&wUH~|FduVXDjw+_iexK&h)UZG4o5;M9AWwfGg07he@$6JHnK5To$>UHBE?HzvkK@l!kh zU8YN!ZUXuxuo~x)hBhof8)A%;WEv;LYf@Z}^KrN#pAZ)%@iKl(5|tBtLZ0X6ij6Uz(zs>R)=`Hzf{%w}OF0IJ#@b9p^B7IN(KL34|&r0vg zKj44B@;T{;@_YPyET5NF5lw9|31s#lzu9Iz<pj4gVW?gWr&U%l}sXoc~<@9sfJ|3;qjM=C<^E`AZ%)b@1z3(jVk|{5{B< z=E&6Be}ge07pKe`cS?{XAtq6+VK$k~Y25RfTr!;!B(33eGM>}SS5iPunKbh$A-+I0 zdoq>D=b~{a6%*o%T3a?BkJD^+2PYvUrMyBboU@vl%D~gix%47UUH%(^ON3?-GRf#7 zUDle?8JZIGyj3V*No3oERBk~@XOeN9RA@#@#)X_NZHlKCsG-RTNw0?~+0m4e&gZDY z=+=e&{CqMspAh1DG5Zo#a`a|2qol7<=v}KpOKGqS{nQ+}^gPXhX=qTnfz2@?OLH`( zn-nCPS%?Z!W*@JDNsg`3e>UWAruO;l0RN)#+-wQfNaqltVfj!lo| z(%3CIlhf>a{n0Fp3wFw|oG`{L8`tgX*Z^O6HU4T7;1if0w~3YHD%U(hu2u54$nFcm zZPP8&M&**Bo6~Xk1=B=8uX6oT*LOUpKIoFZh|N+x9gK6UiS(- zu5Z`BRX=BZ-!Pfr5rh0WaF!Lcd_v5LN1rd9(TDE;l}hlcs?J4QBvaR6pU(a zI-ZtYC&8`Bne#3wnWK^5}ylq5{>sE`t)ti;V6j9yAi-(f^`(x9t&WLRPUYI} zbEBKwXo(x&;>L^Ixa#Qt#QBl)L)Tr`szq(>UbX+@ugx7>%?GxcUE9QDc2q%aZC|xk zfBykL+jXE(;R7Q(1PyrishK+R=eo|B$@)Kcn`VaU|J-B3{E!7ubHwx6Tv|3}c~pe$ zY1d3H&(p6u!PF;&5)8}mb)pF#cJ(66tf_jt~=5sJH(j!;XiX_5z*nl$#zq3?IWYOA);s?~Yvdar?MqSfo&J4)2HUMyR=jdv~ z9p;p;fB{=^1C~q)GL1&HrYMe6Uc!7!GJ-(mcuwkSd|8^r_6&*UT@1I%B=pqly?f6+1X}jwN;OrvaOw`k-@XasHmjli{;~` z&DaZY-7JBJ6|GS}aSPp8le6j~r_R?Jbr)#XO5gQET0dF;X>$Dy$Gy;H^iW7TnIXOY zLVuMVhraKU?I?o2az3WW4w=?~9?-0nu4~OZ`m9-u&KBC?w4TmT1xEX3GPgV}B((v( zJ8TZX=?-_CC{2l(bP_hoDNEti%8kMWHy~MXdYvJ6%!zd$_l6=tN+bTTFYZf-Awlp` zPsk(s!U=y|@OZrekKl6$-4TD#C&m+^KQ4xXA-6B#_0mW%E+z`E37%lVnM@@Vp<>dB~#g)l8@(NQZnPz>%c1F z{&>JoebC8B2>R)cdqr=8#v?K6gNlNIK+qSDCqkm%7Yc_Gu}CBl_Im=JSU4E+gu)40 z_*YR7QgD+>r(6k1NI7!>rz9xz^mrUb!yEG@f}x042!z}rzW^;4eUVTEJPpnXMnZ6h z@=`x_dxMc+%onFHm~O9E^uvHAsvZ&3lC?L@*3Zbtgj9?S_H&`vc*KFW`35K;ac;IOo#8U;lEl>5Bb0JX}+FQcbABg+*5W|RJ$peoOeO*ypUXLkSUU?|*+QW1x zR_Nc8&DLw7dk+~-zJa~@k1qu6*t1Z%eVSwElfv+DXJNGbY{1PFpC6S)UoKb}{5qAw zaE)|!R=6;Od(ug#&-+~AaIHdlB$?&*=}Zv+(db=Xb$9SYZ=`J(~&#YD%7h6`;>dpFdVO^!4&; zR}X%J;-%%>LONBji!_m*cV(|bPvQJ49JrX5V{nb0gX=lGk6bB`=*xroyD)S$Sr8O) z_JT{#VCxj8CvejFl4sgonAlUS*X8v24XyEu>3sG@nx)uv7ZT2MRFP@c$vO%<3Cz#_ z8Mx9Wv$87=Pu)~H>x7pls-Ubdp8>zkQ`g+{vokL`-RyMo1Y^luq5qK<%w7PYUT^gU zi+3Png2KJ``qGm7CcO?B*eKHB8=A%E5pOEje44%dyfqHvz6|UZQWnl_L3V+Q;M_b( zrTo0$)f(AM@=kRtm*E1S*^CRhe$FaafTz5K0&8Ux(wcXy7p=KGUeGq>D$}f77PN+p zAVDYxxfY{InwiA|G;0?8APbA|NP8XS4NLGwQ(nbvquyH0noh@rSUNo~!1abTQ?rVc zX4nx7HyZYI&}`*9P*j3o$CQorquOv~0Zb}Mglh;g0=83GM8LMO1}N7tmj%!qy4Rwy z<;wl4&_18ZIepUsXD+YA(oRosvCv(^a=LwP&z}6C$5*hTz8_ZpV!>X?LJ^OD7mcc1 zToUqdfOrdbw#H&fI0#uu2Tu1#c;h%&`bEyAkDIHeX@#L3N|igHt6a~NyOFguhfOuJt`wTsm)@Il9>r}&4Y&_MwN6jL@hE57TWG5GXlIX4z$pv#t{y}AT{P1f z-qE?eJW!b2p-|KNa@&?X+L)A1%|oQA92H`h#~}loDeQ`y4_x_ z7wfA!vgh6$3SR3ZmK0C5W+!7)hk5r6laT z7&?JAE>L(hF&T^GwPEeB&s5g6*8OPxF!G7yJb1C)IPWmfc&f~7ohe5!tE?Bxx3dbX z7bcfZ}x$+)cQEGXfZKMX>ptaA)LLr^HoP^b>GqpCIRc*7@WpH-)U32K{U7fAh zTAqhxP;P|QuTz)dReGxOZZ|4wpTWrRPW35^)-jWZSS^GM^yuvw42^0X=TmGD%ON(# zw7&@BJ)4x1IbEq|jwJ-ntM$^wzeR9e5uWTR09|A|RyMtL(tt)ozFEDhDe|1A*(V^7co z3V&mvIR!%R7+5yeOEUxwGUYXHR#2|szdb2!2<-?CgboA@lqp>Z-3UDhy$Bd5Qu+}F z5C#!2vZovX&>G-?mXu+nM-WC4#t<-YrAz>5=7f|Ma+)m~&npTBig3eF4x)S#;SefW z=Je3Eg7G01#Du=URxjz=7{AgQFhHo8F|;q~VX{-GjG-ls!`MDvGBnEqgs9*y2w??a zfwx%1yd|y73n{n-vOfwm$Jvqw=j0Z&t}KP^38SZMgpF9gau#hrgK!SvJi@aG&mqhr zTtK*pfd7=CTtavO0sr4ZGehJVcGr6R+lLt@aGokhk>4m}V2y~HnQeAji@xW9OK{q} zfyFUaseBhfK%f9{(P8Vo90RiHSE4d$_zE{wWeLmNK)8vpj8H&$697&M*j%9|&76nh zC9B*<$y*3-Bdj32gYZ3s?<2g6@B@S&BD{yNitr0PVcxa zMj;fQgF#U~K(U>PE61_2R%KQ$o63jCY-XDJ;ir6r9IIXy;z-KJNVhS1=Uwz}RgK+3 ze}=SPWhL;W{JdIrM+i#!1lf9}y3>{QYH65Iuz}!p_ZL-W^)~y@R( zZEF*2`SrPt!|Sha^&H)D94ivwdP>CeO=5e;O7nIjFt_2zp0o!dn+4yi=O_vGzmum8Xbw|aQZ zcgI;I2OyQm0d-^o9LcSB+_e?S1f&v~P)850w6688kKcvH9fVXO2luTvakxkvYvrt3#tJ&8si3#qYeXk7J39?peuRo$KfY$DA&bUPvX48)tJ!)I~icRh4(pyljVHmW#*Bh#(oF3-G-mN};8kXnT*d+7g1lBMKsYE8X8=Fn= z_pu7}68lKeHe9leZrMg*k{mpQ?(?tLuU}rb-u+II0DY)L4sAEonc#0ZwXmAJlg8;d z_V=o=iFEX@9r|$U?$k=_c4NIMuuUppCoOF&oZ4hxv8Z+j%*fV`l@^wJ&^rh&d~j$A zX2u5e4!);KWJ;}Jboas(%vDFEZ-A|~B7yIL5*bkY!BG2}zewPFutWyc0hmaRwbNDq zkBotX*E@>@zQ;;rY#$n(-7tqPgXbZYNVi&3YfU9ReYi&yNgt#V=~Eqp_Z?%KjWQ+CDm&Gpzp_h#g2m|>*SVovUud=ruAgedUBuo_YQAby+x~6<+|>3gPYvo`do<{ z-Qq@zEIn%e-qB5KplA)KTN&jHqH=xrxsgq7WMlB2@WpV6^K5aRBIkk3qgIMXW;U%eMeB^p_3M8F-WV@& zlUv+mk(-1}t^V0f>)E39tjZ1F=O#C~$&GA@JG#XkEpkU8Q>*`fYyaNlrqx}v!Vq@c z=lVCf{&io88{UFH8FJ9?;YXYEbv_1X*Qh%;t)Zedv`^>Uo7%McidLV>b>HWPHo2j7 zm``I{+*pwt`|oXzn0vSD>kihz5?a5E3!NP|b-1+awp(odK$d~6HXu<2;33N$uni(< z09$S~D&r_EgP}5xRsbF%Y|olVZ=~20hNQ0@Jfce^jK|>!w6DEx#kLLSo^3~dTy30q zSZ^{Pe9+kO&|GKk1Z7LlLrcB62f770YXjt(h^6;ovl)8XLM(j`ZH?x>Z9C>#Es$%& zTssFj2eCLFc39z`2s)A1)dak5V(EI=(`@eA?nPc-3-J2U@_-F24-!k~!y!A=djR!@ zTS2d$n3}gIdwQU6WxzcPDC{o4LzeTCR%g+5p=7_H+6UD3QA`~NF|`hs1|NkRJ4osr?fVAm2Tyb{|pu zrym@eRi`g(AM7{=MFC(F+&B$6v;^>w<&Kf@CyJv_z&^V^Q6%vFM2S41j>ttl>HDW# zByx$!57<_#Z@4B9RL6T diff --git a/litellm/__pycache__/main.cpython-311.pyc b/litellm/__pycache__/main.cpython-311.pyc deleted file mode 100644 index a153c493047a2ac9ad2786b83f4eff8ea5320a8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53849 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 diff --git a/litellm/__pycache__/timeout.cpython-311.pyc b/litellm/__pycache__/timeout.cpython-311.pyc deleted file mode 100644 index 60c6b65bdfb5926304a3ddd52fdda41e9718b203..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5336 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 F{~wgb9K!$r diff --git a/litellm/__pycache__/utils.cpython-311.pyc b/litellm/__pycache__/utils.cpython-311.pyc deleted file mode 100644 index 6fd96bed601209b6e066679b2bb788f60dbf3d89..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170871 zcmd443wRvIeJ40?%m6dM02ly+Cx>_uZ-6BD0>uZ22MInviUcVU5(N#=0}$k30QC$= z5gy32EnA?LPGDQIAcu+(TXv|3KJ&71mb>eGp)A|0P2x)r(pt{Ve%Rxetadla-7U1V z?-cEQyZ8H7zXt$C$=*OF^roW*F<>!?> z5B`J0WO~hX+QgYSbJ#Q}-OYn$_G}rnu)B58%I>y78@t;F?drjT23SP0XJiZk}ivY+?SKaO*_dU>p1<&Kur5v1M>8^XG=!C$Gb_rzm^k4@|u+%vIvaPP#v!F}x8{P6yX&cV)!1A_-9 zx(2%@x(B-_dIoz~TE1}a#KFOXtUk;a4k_jTK0I$L4<^Jk2mA1U82?A`e-!`6@ZXRB zXc`>m zN-0;a>_yw)2#Z~g*cG8|X|Xx>ZUf#0R=o?ccN_7pa@D(0_O1%=s#m=mWAAG4u6EVC z^X%OwysKOFZk($J!gKwWKr(LNaEKF{q$j2Keb!L^T> zxOQ&Kr~|PNAjU4ln0A>S_Qzf29>e#S*q49;e;v%lxB|G^Wq0AmmQGh8q8AB6vN+#!@auEETGQO@x! zayiTO;s0=GmOB!f9d&a@k;@C*mk`4U&#}+^?`aP6G-XcLq?r#65w~IqpRk{$%L$9C`&ei1$wJDWrN0sXqOpIruVn z4)OlUxM|ePJ%e1Xb6@6$aQ`azEW&?_3&Q;J;6^-OvR1{uY|Nfch__@ zHaVe2%03#5jP*`OwXEGo$75*S;b|GTtm6Qrv#*EeCka-!^mu&uLTDsbpP9<Y6&r{ChQR)jZ1NcxKIpGM^jnhNkkeNq4*<&7s^i=K_65gg2g&=4ZpqM`68-+<)#MmQ*vQ0GxVhe%vPNTk$~HYc&ZX?+w!dYP;GsgIV#Y#|5RWcDG|utV z3Ss<5OW~k3vI^hGe`Dar;OkG{csfzsAQm?yvKj+`l3UAjK+NM#(8`%eZJ8Vyc|V<{IV4-7QHNUVRvrlxB$QHy5b{{at&dcMVEXj8Qv zO{fCnoTarfXC61jZEu=?%WRfL4h3El8#&bc;#Q0!>gd7xzNKHPJqO(pMk zPSjp}39+L4;7~7i)_m3e)v@_l!dWKLRUIVqEAeMo|6T?xT53*&TMXk2A@#O?z7t7cHf19U8_Jy$@|{GugnTq? zv*A5u2h|vQUK*!}{7|rw#(w@ZITXr&0ycW(`d0DrEBGi%1JWaoMOpq8lhswXym8Cz zJ&BE-;>OOoZqZ#KxGU~&+{C=ef)Wf+nZVq+eaoelH`|5MwnS;0SlUK7Jcqyg5;~Jt z!CKb*>tHUc4RXFru&%<~OncRe=~Flo=2ChF%vGBD!4|wR&UBnLWDVK$e4#w|c?K~H zg5Gstigu*Dr(&4iC&nXV2Bc2eIU4BJ#_dI9_L*_}ktaWS#8dH?Fj9}d-v<B8O7AjVGVxB1xH{#P2}3PWXXU$^>tHW(XA_3HA4Bxe}TqO_i5BZw^f=lrm^IkQ)GyMU@Md}2<`W(;T zo$(BWsO3NjG3#p2aT}i8NyM1mcr$h}iv>k@M4$iz!!VVmJf|KxAwtCoKl}ArA;&$XkYD zBod0Ia<$KuAa`ss22p_&K_aMgQ;ta{O5q7{K~76Ed@4g`eN+BPh+l?+<3noR#C(Rr zQJw~6##p5+V8N{8M1;p67(pT!Ss_LM55~*LJ2U~A6#EXm8nNus`1CX-K^?X}QzF+# zDS)~UKTgg?a>8&@4lsKdu2WgM6m`=lwI?Ix)5-ZlLmyJdsy7fnYC+GTu_`Nf#pHBt zN|tQKNONSltSM2}B9^rXrLEE&ct6MYMuzC$DdfP zTi8vJlUbg*j^)D2uSH&o;Q8R(!TW`N^2ifx#T&63S6=_zjn5@Y8^zK_Iemp-ETjRj zCK*7u=q?xB<@W>C%qtI(D-M&lV8!b2WY6`?_28+pHd#}j3{X+xcX;|GfToI zbSaGy>`r6%90Ym8#kRRoHfVIi+EoBGiLoY%k?6# z3Y0cvYPqq=ArA63VCBd(A059Gg51l}(w1__SWhEjK;p_j&U}m{Zq$eN&TKUz(W+!x z9%C}N=w5h~kKRFA(P}tXO+rz>bltwR;JD{+Tk^Lh{98o-7WIWRbr9ZzL2SZ}e~ugq zc+1LqM#{`dYzsAv%CS-lxh#SzUF@9Df6I|R^RoGtfxG6U`!q7<$+mPrbQ4%1FD; z^h?RI>6b=95^-S~Q1etL6}5NBlZyIGXsk`ZY>J_VWj{6vSo%{o!lil}Ka5cR0-ThM z1pI7Jtam+pyyPe7qX;=f&qZmTq@j`hbkdHJRpnHN$e+=7)T9_83(LSHWI<}S?f~U0 zWa18qo0!X-%UnIIP?b?39}wqG6w9wWtk7`5*CVldi>}i!vB~OQQnk9ItNQW(g0!ME zfq%4KPf|$xm}iKD^C2cWCrp>+o1jY&N%@BV65jk3{-Z>^qnQef?B1Olit#+eaYPN ztB2`N`iSBiprz)b--B*AdT60l1iWwoF*K(ZFa}@=I4gUya&|m9I49@8J%e*`8Mr%H z*)mfZq*w!eXkZl_NS`u$kc|q0%-Tltu^vOx=i^Ieeivt1RH_r7YCjB`5B=6ide1ry z7-x&yeg}psaVPLD&8X#zn9?yODwXn3k#O9Om{cnEW22|WE;#T`Wt13cuQCa2)Ky7; znbC=GNn8NpLE z&s58;qK>U=5e$EWn9&kAAQ;N_O4rTq1t=-hM}|lb-xDuRsvJy5xI?SOMI$U5TuO-kK4o_YVaRF9wQ4B0utShB#7beFe zsmwD}pOPMysQ;8x*6~Hzl$OfG5W|DVAwI*UCY;KV*%hckkr&vJtkLNRQ_9kVS7IK} zFNPQ+6;-BB#$SAcDum6KuafT-a=uB5^*9#W~61O5C!O8(K)pQl=^(0|*wKQKO0Z_q%Y4hF2l+xk;3D2c#<4vj`;3Q0@cGAZlbha~L~aMCWZo`f2yoV3@e zYz5h5WfEZwFpAomeFmi@)XF^ZnEdaM^CfZ^no-nL9%F($gqVXF@*eG^0Cwy zn@X*t(QT=+=_!zbp`lRZ(l|dEq1hI=$&Zu$LR1@S9v16ABSj`g25KtkAFN|vJv+GIGC-UfkP4C(p}SVyEZwc&$j(OO2zkjNB`gjowm^i$0Dk;vQl zmwszYwIpWK#dMGtRNUvRkKrT2XYb_(M#&FJD~uy|HJllqG;+)3ejI+t_l z->+2~yjQWDzYxojNMfE%F8}^l2M&nmzQ>3HH6jLQpCQ~(}F|&39 zyqN}hn>u+K>v^qmoP~UB*8YM$0!v!DUp8MhJ#Rg0x@>pvm0l`bd@@jzz!r zPV;fOT%OUA0NeIMBVwu*t4t(iH09SPP5w?>VQI z=OfowQLJ4n(^@&`-~WG8UxqUIwK5sPi?#5WRsg~uGNEC=TP5GeX#KW2zhXRj9yMJm z*YxJtP9-Mhvj#)Gm!;!nY?l_7E9WZouu!dW8*T-R7Q@J`(=a+_8q?&r#5%Mz7j?3D zEfl$^y%~PB$Le#}m;Tm9V?QPAy8iB}F*JfPR5vnQP{$wR$YeIo43&m&KE+6DsM)I6 zeyx0K;+yV0pA+lUV#n>q8Z?`fF?`-~eS7*SPSjMDDXk2jdA9g9%8>WTWjMu3a!Q_m z>Z|)_>Sc00&@Gu!22SvyW>{_pNH`D}o#YwU5*X(KDd&lkJwsicM~{+Le+pKg8NsRX zp^Kp_sT`d-W{@9?rrc9}Xo%ht8v;6Ua%?Dci3l{}ei(80v5ygdQtC4C*Ae)*SC+H1 z$Y3!Bs3Y)H|74{30EEjI!MmIbkR>T2RRfbFkYMxRqAs5w4~GIo&>}`4WfTe#MYR?G zO!j#MZAAua=iJ24a=KLxXH2h|&8F)fvMmND+lMbCb1RvxWwr`>Zt-K+V`Npmg^Eta*73GVB&<#`Mf;KLf5P8Y(~8M7Y(8btZZqaii!eMcT!@OpF)i2_Y4sDM zBj2(~G`B<2elbx^DpOW;5trzMZ78!+{9#xpm`7h&dvolW$p5PS{+B#wPhIl8LQ73}g>OV$HZ1 z0x#vbc$qo|18L@&qsRxs#LtN2tn;a;etA50J^;C5Xbd)LF4woExBWsW57%mgDh$qxZZqWrh1a*3g%f`^&G zc*>>r$&@QbhV^8uoyx=jG7*doA-7cKMDY2cVP**~Nf}JQ<9^ zbeDB&3>YJmF!#>UB$F&as@Sg)7_4@)S(UIRW7%dKF*ubYy$A5pFqE>w9GxLbDsMH8 z@eF0MF{TY^_>ppt=nVEDXF*z0s%&6Oxg_B(6*O0_V=A>YOx3$3uJ*eG@tfo@%=jKv zfH}k@Eh*NKBykS8P|%HzqW-8lBtNTbDjq9ylsE*&4a*J_#-^Og=rg0rVU&>nh7Y30 zK@eUweLyVilXt7d17~o@m2jRFoo5B-+2#7yxBR#KU(J9$%0frNS-WC6XLi-xZ*3?2 zYt`bxgu5xZd8hQymvFZvcO7C6LiM(UdwX(cul&@WaBsU$N?NOD7ZkMZyXI}8chk*` zgtzTi4wI)uC^>xFCvHB3JFbNLi0D2dxQ`@r@~^)DEwrcbdv!P4Z|zM~c8HZ7EC3pV z+(MX>zSjTselXdhzZIt91%)sbFMv8maXv!oe%P;Ab4f=dJIlU}N&l7igBQf$bRu|J z3|cz`v^ajB)1UvUuBxSMPd%JuzO}Ki`<(RB_AYMH-_djlcgJO?3;Hc z%WH0CCd#+mE9+b;>r9k&iDg~$uI2K|#a)T=X0g0^K6BYyBzS8?Z_N*i#QObrV?Uh{ z2A{q+7+e|*t{VD#EPa+=noK>Glge!Ip)_|OkmdtCJ%t;d=!VaqwG7j3(sG4v4Kox2 zE+R<&+!>3MIjXC?S}fbLV%p|u{*at`=Zd90w>ep~VX@FW2@MBKL?VAm#@;A>(O+|I< zG8J$8&}64%-~fM%Oa9@bU%6Swapgk0q&UmIa?!Ub;j0&Y^@6V+{bZb zE<&dnb3ftMjQNE0bb{~=F(fywg8|tJDwF=P_Xk3Pe+<{^_x^h5whB-m^*1*r{7s_2 zN$@vO|N94WR`LNE-OrkVsSIa7S_zw-u9{_cank$T`)7y6vlEH4lj7M)!TTI8?d2FkO)Kzlf;1}eAL2h^fd{(bzzz~P>aXJfiYF@1aYBL z|IM0gnLc)!kdVvNo6aF6RlH$j*pP0TR?R5zfjChWqCHG7D2o%-T;ytEH+?ybxy#~2 zok&g=C+bU&+|s>p=3f?8vUuZnwbdD8`1k?kl;u3VP3SU}5* zuQ$M+x2j|twYXe9=hL?#m5nR7RhTYZxxUDldwts#eb%-!KXP*iEL z*Ah@%|D_~UR>cu|h<`0?Q^f_vP#K*#erkXT0r>9%9!AWjawqw5u-&kzRE!dNM%sF& zK)kDB0RH#sgPU+>8js3+y24YPKtxsQ(7|{crk4U^_;GO{&ZGpS*Qo>9EorRk@rr+o zQv73~=j8kgI5QP%ae_+H zV3GeN#r!eF98TlDKBWj_6}*Af93Foc8P(_U?@*>R{qR2_hw)`!A|KPXy-U8IlJhfi zeooF`kR!lJ<+H{i{*9PAi7%3PXJUV(I!KW3eK@c)Zy`UcEw$lUEA#(`UNGAaQaBp8 z5to|BOs?GIEoxAZgdzVGV;1<4hPJorZq-R#$L@r4(~4z>D>u15)3N)g%x3IJxOb+r zAP03U2%GQM;Wa=qfSSoYV7bHnI0AYFKFNK5Y*LttiBm5m#y&5OeO~`6ja(o@RNw#T z42xT#@Joqgf;>g?_ZM)8@*3L=qG@f!!zw65EHd)`zuj<-ueRsQ^LU!8`@>5eT{6Eb*P}bXO`FRUP{dsF= z-XW{~Ju}66&slS*&1zV)<3$FfT6|CeH(jBeK0gvYcomBPG&S?A1Lb0Bu>$Sw1*#kN)2C$oV%8oh(Z7Ave6U0!lPt7!C3O(pY!LBh#C$RUxM^zN zHR%C;OqHJEN05V7YfnR|XnACnu*0AdcBGZt0GmN2tgpdb1%AMxDv?0vn>m-(X7P+$ znMRe-D%GyObSfR$ZJM{8bIdw{nNBWCrulx`P=jtG)M<(sPpnpfZyhx)rXl6WWupu# z9I(*K(bp~7WEEGTPkm8WD@uyMKii^?g4V)0FPEF9)-{70qn@EEi(^`JQaGxR>7lxn zm#%z7P36lqwarjdzEw4)rU=|qmCuV>v+46EDxS>p*zZ<>5q9ubPOebOb>7U67_eGZ zlyatvY|KE6lSoY+0oJLZqVcpP^y|d)bHzqzxDpi-QlOS8P;;eP(Pmw7;x4s!W!gI| z_gYx*U0jFNT)Fm*euUyGbm98=3fIz_);rdLoo zvaRa3vz~S1Hl+9Q+3Z;NC)Q5>>Z#cr10FQRPAP9O3p6Nx zW0}{aNAxpibL@=rO!MyJDR;*EPK7TXmdRVwQ&Ls$#~;RG$P zSH&YUN&-x{j+$^&4mv*vLq{rFzvZE6Hvg?1sbaGEj$0Gl+b@9=M{2Td0A2akRJaj zoS98ZGKzMYrJ=U2CSSTppO9jj$y451Wu}mpjascU&;EL%BN;0dK-Lo+&Gi3fv#D>A zkb){M? z>%B~pmU5tvVWTM>wlNI+fWAnQ^S_cqVl@f+yh!M>wBTIp0UDm&pm+@We*<5Xn0{Fh zr`{y{fE=Yx&to76qi+-`a=Ek@zl-5D`UCLaSefQ5NP2fba^fOInu`=^a2zvci0E>P zg`ACw>N}@M$l0)5S|ye?-79Tdq778Gh^1Sg4c~c8CzDHV>0nQbQ2Vzg8(IYSCP|L= zInt!>O6C{8vUhQ#m|rdCLoIE~-36sT^pE#^ZA-qk+l2|=PSLkh@aq&TfKX4aAJouvwu`S&c;e(t)rslVL zPRVM1@_kmtzAz4%;uUdxX2oPWB&qQmnBE@lFQJuZ{@hctR{n#sDzU761^X0|Ql4Cr z*_}177TO(7_>YMGBZB|P`a(Ns?`Pi|_={(7ql-kFpOgFv{|lo31;PIU(|t2_aZTgz z4}NFxw&RW~QFB17IgqSxO>WvuYI{=9?V1h-{XH}>4@W@yxQdqCWF z^xn1;OWRHej}HsnXky!#xNYp-wu?*KE(+n8aOrc2ZE9PD5lWBVo$pPUe zTegTTox*`rV#~n7aV+$>T`g|u5qh5xw>&9qpzA&vF>Duh91^Sg-fI=B28E|Mu_`2t zj)_(0g>hc2iVCq=u?m(crY_4-O1=6hNfgPoAgGTX4qI4Lc3B22i``=N4q<1XSbg}t zePZ=f!qXwKdQ=!YFIF?_zUr7T{X(Mp^FsCK?^oA7LR>_|C03I#y4!M?vO9u&fH~ck z(^Sry(-tX?l&i9mg!n|k`16zgm9x>2+_w$Ls6Trb6$HcO&x4XsmgTkS+Vmqqkg4hmw7gPBm zf&i{C83hbe5WVU{B|o*M9uE#B{C%RoPw@9ayMNEWb;-X~GD%QTOt$-IPnRBN6H2XP zj6y4Iwl6qPh_b+q-DJyf+??F-*xg=X!(m*>K<%Pq(eXi`S!j785qMGzJSha8M2?U257Z>^t%P z$aHpo*7P@91%~BB$_y}iK8k&uiBi}tA53Ll`~OPFBZW|zu4llFsfYco3RI($>&j(0;9yj+8KE+|l0ep%>jLx1UQw~XrK4AF`%FiW( zj$D931|1;_jdIe6_tDBFiy}`qT5Wl+2wt+<(wlUk0X2Dg4`#lv^|()0n|@Ytc*Cg< z%U|v><3TWW?Zm@h?X=+GuR1bMZ?KEDPVeaw`};lzg5EE&Bk27NR`OTZoN*hCEj&oo zivI`KZI2{Gx26fvt#RA0B}BKaDMTlM9N>|DoMe(=6t**y3}&XG#gjzPnaX!y`7p^# zKL}gR=iZvNL)eNv^kw10zcet5X-sRHu+bZWi38f>ZM98cKoUm_D8jC0Qt9>Y(+n^&j6xuJg-FH=8CVDNU5G5;`vj3i(Pu4#L1f{7h{&QB z+hUWccNcX0shm+fVfD7MD1%vJU?VNXL^+kOT5W4~%Mu&>$EaWaKalg!;9%!R#@bSE z!@7te3V)XTvbp;>{3$!L7H2zFX^RK2x0S}R{D{6=j}g}73p|-&%#^}-op$@uS*=5G zAz8G~RIN5?k4(m360e%IL$>mNP%^(JdrdV+^+`4;1k5^i8NV)jot{m7k;Y#0|Cy={ z`*T?BxZRNud>OyswZ}JU1k=t zB4!ct-zd_5C+8J%nB0VMt^Yuej2op9UtvRKE>wYd6&ITJq5@bJ{daKI zXP=%6-TIisg&s+`+md@u$gg%K+#Lo6Rbj=p5GMwQ7_rSpKCG->Xy{Lr9T&@v3uVWb z>GAaYou}a9N|c=u%gzX8XYSWG-zr&dY`wMXt=+eFC+i>kVB1k*r84gf{P^68)v~?z zLlYdZ*xPGC({$`!aoHOxLD0f+W!6?;yU^N-h2CEkn#x=6mF-+A+et>o7m`S}91d*A z@6~rN)py@L^WND+{S#vS6UpYS$;NHT`pwC({-!1sNmrI*qR9_r2FPAmn98Z+(6w7uB?D~KTJ@WpEAY5FD zGEOYx1a>VKZ`3T4KNH~!@*g(23eC!V|Kkv@r_Df$6~c^E=j4g|fIYe&#~g;w&H*7RAe{0V&gmZiTR zTQ6*-PS;M(HgcNDStRG*lJnQ({8w@uknW`K<8zH(kn_LcKl&z|tLop1Ba8N{Rh<$K z?TxQG6{eOgcOk0@n(eTSUgh>$O=h5ipEaFwkQ5p*n*uu9eV}F5reAl@+4ZKQnz_d(Q#?$SVtc_x zxqvQ#&q$a2|Cc-V_vG2^@jaA$rd*aoDvB4Q5h#BjahSO$HtYQo`QIhyr{sKroS%{N zb2u>Rr1T^UNS6G!>5)xDcKFytB+Wv(D)B=WkTj+9E?^6ec``*W!h;2xnT2*wvK-rW zlwj)`h!0&mlPx>2YxKhB67I%i+djMyN}CeSW~``6xQA+BnA`;z$Xt1E_!sLF#Z6){Mpisxk&`Dc=`EgjC4IH{C^rxDL2e#Iu6l{pg_PrQHn8S(UZ;`BxF^hLovfopZ4U7k6c^2f4rAq{watqjwc6od zwGkBS{7p#pCDTimm#nXu=IFQ=3my0JGTT(_WeY-R(?e`0_M(%P0@J2w#yvNQE8T$q z2Y(3EdDTMW2zFty&~CtSB&8|CBUnc~Yf$KGCUj9RxOe*IJNQOtOu<=Y4*Q$>eOuDc zxP#)}uIHGv1s723Z&>@yqHZh!^zx5O7gN`^Nol=Q}!v+*hDj1>_a(oer1PTYDc!zk&1w zESed&&|Jx7-EyZdtKd9pKk{gw20a$jwahpf<5(mU9DNO@&%;XFqBolLrYqRn+QMaP zsm|K2WoZ%_n3>x3J5pv|^@58nhQi%Q z+te5L^P~7Ym5B`saOxH9W-u`0Crb%+iHJ^2z$`A9@kYIcuflh1<2z~jNA8KqsC?j9 zpc4!EI|4J_rofTVmCKVnCx>WjKqTseG2m2b5}*BD@=d_$Wg1;9snDb$6wE@UEMKL^ zSK!R#r0sk$IpZ!BHVBwWobdX&DGJL*WzjBAYgJU_=pHg(I;QU!i1PBIm2*JVOrS85kAzGkW|v zIbVQ-1@8oY%EmT5_)`jgjT}~DRyrm_qGHpzZH)M0#wJ9kVYxpaWT#HiDQqCibPJ3W zQ z`*_0FE&93zU-u(L`oNq2>Oo|Y@HUFx#+$(!*KUCu9j^|Dyhn#gYx^V@E3UdnG5 z^4r%5%`13yB9T`u=2hP`FXhz>dG*VI>SbTivL8y@mgSO-V#$^dt>)sbA4p!irFiRy zRvWFrhx4J;u@ST?oO#c$vQ4=a%ayIzzM~>lO+MHb*3-jAbt9h9IU-BT^JQ|s&OSZ(w=-9+vl_IyG!Se zFANCoro}UGr0atXm5c4KU%7GR=H_qBF3iq%FXX;*aQ@)!+B-#m)H>Ib^w(qK@wvWa zj{l85v8+uj+rE^uUC7zKTw8y$`uE1)9KXHsI}?i&3+;>M8#@+uK%gf&BM z$s6O?*iWq3v6Q<*$lbC2CmBE9AngTED3rJ2y4`zcr`X>8o^7f9sL+0Neqeq;IQhg} zFKYLu{f_g!LLoRNoWCLl$xNUR3SQivwT#p4l4ZXYx6)24IyKy1GI#DsGM|pI`Di%@ zN8DIkU@8;`%Ta`q(I50dX`g61AT}Mq6R!6Lq`UA8CwUU?G0{CHxW}+3`uxUghpr!* z)BQ0j-HtSgA#h+%{W%-kYZ|9L5>!0V?;U7TO2eTTbrBcd<;E3J&Rc_Zf3N(nbYmtCeh}cO?{_36NkMs zaN5iS-*(Hsie8a-dD2VYiFYP0mWVfLXd{L*l`riSGDN$`K=OKN9L7x8y`GJIj3X^V z`LH_-N0D9FaRxg@V{;nbLqoJL8XU!3WgGy()aK%)WTa+HCrWj!F|~X?;>~PGANJDH zdxyroe~J$wR?W&2v&vRXUZ9R8$5XIeRl6AbyIoyB>FZBzRmZG z%W)b*ZZ$S3$gN41Y)DpYO4jXOvwy2S9m~5co`U;c-@I+!MyR)u03;~c$p2fNxt$wL z?`*Vm)*3O6bZ89YehI4gRj_>qN*FJt-y&*h_3!%#dRq+!J`qo+qiFOJ8BI56{K|;C zFvkYoDU0p(JHD>Ma*GbjbzCCDave5fF_MohNcO0JLRw|a^^0a{DKJT#u7S>`Q*ORv zJ_#9E+)Pw8c9C=dDyALQ>qj-+EWghXPJA%?8A3_M#(py7H3p7F)qq07{0ZORau|7w zFPaVcWGVSX-G*>=kq}>P2v=+7s$YK!jj^5dUufsn;4}?YL#yOUcP@i-8e!y5>r>Dz zZMpInCK*hVc!ZWX1g=L@vlH2xv3wJvrARTkRdjGl~BgaugGq_)0MPN8P{ zNPWTyo{q-YY~W9(HWsT(vmjl?Azk{m*GgVy2v=J#>NSL`t*4fuWSz3BTvXhej^W@N z^f2Trg;e3RqhBg=V8^0Qd9T0ILOK}fgF4hsp+~xnS{zOD93x$r{DWK>QeOIY)DFHE zL+#r%L9ib!I$C>|Pa}5Haw>TlpH|6ABDfo4bDkNDQgQ20i4uic0sPr^<(bKp|IgV> z{qB+%%9Xdq)Mm4QFKz{2up};PoQ)bNyYd0<7gYbF;mz9h7I$2zP!hs2pDb2uw)9$i zv>IDGhuB^vebkVg1GUhoBR!W#ZyUoti<#**Abh)iF%aLZf4WeqK%-)Jc{~$KE34FS z@7nRnnn7MNsm6_Gev#yknJ;8&d~bbjzr;uq&M}%}rbIHjXPa~fNHso%!)>wI+jyiU zl~2qt5h^++43_!W>CZnj#d z=-x#I=^%$$R}+=Qf1MtQeqyjmhTvuNNINWo0Fyu+A`QKAO4r}fYpQ;p>AJrJU&;k2 zCEITP|E4#LdnN@L$g=aW_9vTzlw*K-Q`wTTdPp{u##!661HWXBPQ5|WM*NI?KPSgQ zpeP^7dhJxk`Cv2{i}BJP3?8-6L(_a%TELK_BlTXPbpC;yZ<2G7oIFYv$DyObIWh$& zBl3HAk#bF38Iquuwq*G46r0FFzJMGboG49hj98SNs|w?sahWHBeAt7hlaBHW5%?7S zL$oDW<>i8Mv7q)|LBmo(L!zKbENGg`Oy(BMIhISx-{5Xscs+b0oG57&OB&~LlGR)1 z970YY;l$QaR@d(3hqGmKJs+)D%!o$&{qIWTb%=Q#g1dt#K-+$^%a<&vTWGn7-Q#+0 zgMI0dt~=ms$O~quX~$fzkYAT@*F!}j@6%@SJZE0cFA?+Wey~Gq+_RLwN66o^T+;j} zJH*{5-ap5Q=O%@csYJ{10Je|mC6mw|bEl=|YzS38YEebBn%&lvtjs9Olu2@vvD>s5-9xb<1ZgixXb0k->MpK zUPx5!yjOW}sq$c=vQMn+d#^iDd19_tbZ@|Nfw^N6`|EWVf09)}==$_WR85LQlSdO0CyntyJg zK9N%`=2S!8;R%~R@YT}3gJJV>;~uf`$a}G+##2J$sr$Zy`My{BgpC*9?|Vw@8;1v1 z!grBElX>}b2N~NAp2-JKbSrxOJI<=kCeu4jxt)8gKQVV(`u3TAZrefbV=!OeXZqLs zGLP-B{+X+*{@51lFSgk6ARQNHVJttz$wS%owo!Y}@JKFFO+%p!FJO64wQ~w*3e*_tZDbs@z07D0oaX9dv z)O%~wDP&ojMx!yl4{~sslIPFIEsHdpuKIClx_oSwVOgZSSN%8}v~Ng5M+sW=8vS_M z;ZwvnLc4(ypw_Ki#;i3`g%GD2;zCFXLNe8mEQI7D#I1&S5aL8gwj5&Na$o}i%8e)*En3ylb||f9%ic$$D{%{_s{rZlb9nhw>JmJo2RFmW0TEWhvnC0`)Bg? zueY{r9&X;DylqeWcn7`R(x$xb-ak{I|9DFqy>D0EUwu67eLH)9igd zR0*CcT^uz86NL1YJ_J+7T+aQhoVj+^m;R&F^mOck;=`T%tWzC^hdLF6BNiYN1Z@{t zJiZ_fF@(me0D+;n);&Y%7Pry9BEWC-4mm*9spr6IYvBH80F>Go+}zeS)ZR8W41pUCW*-720}TLeDLgba zJsch%k)!N<%^k#f`+-w`&msl2NPL4 z1ltbDs_74q7SkOWOq&Qe))xOeTx?_x@sivIo8y)*1aMv%BCP(=d1Z0S!;j#YHAiyv zMog;(OPrk!e3&o`V0CzgrZ zH9?h8@HK12Ar}|YAX8z1*y5k-MO4}X0=+7mOH*`X2|=k+0WlSv~}*W`2rtM|b}DyOmmjPtl!qR4d=#u7xmnGn&NVE;X za7d9$;DHJzL8(s~hd_j+^pvyk0(HmbBg>vTibGc*+YPa(}F%KhBAb0|q?I2Pg~ zfb&v_vLV?A)dy;cfWk3+0Xklm%1K8egATwEVmKNBqdk~wh(IW^njJIwujD7gp-Q%s zLM5h{7$Q{$a12J&P!AHYtn??Li{>NI4)%bp`sM0fqv5FB3@jG4KV>$aa7eT*$ub|1 z&`ds+F_UOp{V5hWmoW?HG7cb$Wa9e+`1Ge%NM|u_WG#rf42TrsH4V9Ta`PbO7j_CP z9mIG@x^5p_cw+Ia2xX=c!ltU38rH(JxrAC*Bf$s>n}#QGJ^>n+>Vs*@W(vC|K~RQT zF^yu62(CFYK6XA9zA{q>IaIV&MywDYZ4E{s&zPJVACXor;DiFchnr)eD79d#^ioZ`zJUK4)sHGif<%P@ zrAUiVbl4$`;vjiU@epMN$0In$-4Tk6;LLYPQ)eB=c?Dh#Mux9ZoIZb%ZS(<|7B&n? z{!Z1$I0WYM=FjDoBVSrJ2yQs6=jf!qt?nH+FewLSv8R~^B zx)@KrS=b`4bcf15uk>DC`-!|dF|Tf}Yq_{=;na;MUN5^*Hh1{i;rpJvSI5M{ z7QsW;2SwFl(e@ubFLYi^6otj2@Z6#0+=BV@i`GPLwU`T5+w7^oi8T#@8-0tx*N@&f z3Uwy7`KF!7W#>ck{Zf6@UZnX*PPIlX$V)cXyqS4(*WGPGpf3^V69cdmF8`p2Sq~RA zi$u^f`AEafoe6)t=x_hzV$PwMg$p&`Zv0l`>&-Ws15035`2 zPkwvoTSGSoaAbj4z9mt-RV>~*cX;mb2L=8&{NLX2tqnJQiQ*QqxFu20Di*YYfXylp zYz0vwCf>CabX8%Gb6eM@jCUK%a6k5pO~snGwrp$0z&AW;AYW-(r{48o9*DzO3Fu*9 z?T#Sjr`gWZmXL8fNP}9kL(|v^z20A9CP0=NW9W3I(4-(&kPTRyIcfp_3k@j#GuF)$ zdu^Vpo&~X&mZnZGOR{+AQ8UtF=yGK-GOpLe9eN#d+`hJiz(@=k$%z?sNZ8zE{6^Ao zL9@izFVvVTy=Lld!C$B(hP+M;lOat@v{gy~e3e9IFd9H1GuX)26p&V#$z(_qn;$h! zNe-5&juXU;hcHIVlOl~X5{aQB64s+X4AX3-0n;ia@_>@luX&3G>M$cHWX(GBuJnPH zfCjrfxIRiE+DB4CtLJ}$4W?<~5J(frgQ|_hFu@R|q1H6$lhdcV1KcELEESyxip{}LGrlZ`D1bk|vRw;5#u8NY)8eaKp%oOIz54-XLWE= zKz8twa{dm1hZD%~tcw(dq`^d0E&Ze^4Es&#OV86dbCu>W(v7e=tfp45ZA{kHgLz*r zC=&}dUF}b1xaYHlj0#-$-6ad#ME6DkLS^@^JI504K3KZAYF8l2EtTKw65Sobp8kZp zpI$XUn(f8T6UT*|BO4AjpJpZbhZwe1F*0P^ z2d`lqPGbZiLaB@!Pj)4$o&7F>$p<@3_7h&CEf7}LLyV?LhhamZ+ChM!HCyeha0)X9mo90TyWGk16!>7$pv$$X0zih;Q8j6K z#FpnYW7=#yR_07uBQJBlsLX(xhOTsLrXvk{`buD|7^@>{Y9ywnrJV*CsADIKp|&-s z>W)XkSBSw!4ddL$lZw1E09}8yo>d4-AVAx@Y4Io%x!$Ql4JgtrDkBcO8hS) zDAt(fB>YrsbT~)=O-eP53MF$&4s5(aK*(sRf&dm5Kt&-G_kf* z48pOs0BwK}1F=JV4oV^&T?c^xn`#Lv2~!wZ!m4*%hiDJWk=b0xkf-Gee381Pk}u=O zqX9#yrF@CGmXJo15J+VmP)3KRuHuk}>iN?-Y#lIc`wg9W3d){^S{84)~W`UR;@#bN2XJ+^Rp@rt-%vl=2P zATYz=1k^BGZJ!S&e!#{bB!%Elp)@IPIu@i{s;;D7wtH5IMW)@s+7~8%At3@!iZsa< z+N*x1h+#;r!pJlbox91;a=lGie}kNt$RQPw4nC?~o`bU%4Jd6F`RDlJ_o*Ig5e14pUW6Oc&+dX$Pg}{+S;D{K2eL^{iMR&zw0g}cACcR+G?HXzCLrQ{Z z&b(Kj5DS_GH(g10(ZV*t9l-TLJ}Ae7@0BF-2gH1=iWpcvayFS)v^a}R++c2T)SL-> z3%D@2fSYh00tF~+IwX;*ttS#WCj{pSGQ&ZgWesNfpI#-*sBL zJl5X7eG*7AqSMZph;TvOnjTccp@Vjb+=98K9qc9<;9=+Hc=kA$@Eh*goOll8+Lr!$ zH*Gpg-3rpYE0GcDTp5>hK3eqAeG8tgT@dJ zGYv+e>77dD={p1+bu$h*7Z}eV3BmZk2Y`}t(aT2(Yu=;)+6^FO56(ceD6Qj~rU3W( zX=#G%jA2WoGawe)|^pN;jm#<=SYl69_bfldT2;e zHuJOi?(YdlAH!$B(P~q1O)|eESzMbes36aVElFQlvb2G&iZ?^Jeqo`PYi$c~sQvS-=g;nCTnPEps-wc8>fG=EATU zekXHX%*|wO7IWRq^^8-TZ1!yq3-K~Hm$`Wq{&LY=(I^%`zUV}mXpmd=ONZ3>{IVb0 zN%%O+H9sTit#s#)Ud!QpGUL(Ub^sGsmPFHVsE$3j3JI16X2R<&q(vY^{@JS00 z;#Q<@Mfwi*E(1>)c-lx$^R~!+z^d%Qe;Tk>eF|8O`6wx8Qp(qCy#1OD`Bbx9GshJs z){ZgC$9Y(&0$B}vase_I-nrS66HiV&Ww9p*o*Z~$|=4U}6XhilY@vGPQuT5Dp^7|X4cLaN_%NZSBuvkuah zheG<0lu@IZtVUZ22CfazZf4M==Qbsp6hp8h{hM_l0bC@|& z1uQ-;_p9B2@5Cd)_xPuTPl4#ZzlD36Oq?lhOr+O}xgcpOK;lFHkj`7tgy^^eC~hK~Wa* z3!2D3?vuHP>Nx19`e*vtTIrNa5%0k+L-DfBE|{4!I5?Oph4>&C&rr%9o17Y&N|_^U z9TVRPh+#$?d|olF@Ja?j%(@h&C9x~1+)*a?jEr1??o0~G#FD1**w8Q-Q0X`m4+k;o z9qlOejQFJg=Hxqs5z0Ni%KiUO5~I! zNVj3j2yIw?3Wmx51yU>A5Jnd9t%oF~`rBV3#!OA`bcC6YF$D^V4t!LJ%SFnlF2a}bJ!$pDTN35>JD zcSx)(X$fGmhVyuyRkR{>>WGplFpxG9fK^>!Phfzb4n5lf0bBzrlPwuDU`_@?8Rm2V zs#onsj-E4Lvwh;W$d+pvpBTq_&9PP-aK+|pj^EPhk;tJwm0WYgbtV{u&4jwwYq9xa)!Np`(PF(#DVK503N9H25O7^@*wXE2X*s35 zJR+-q#)l<#((*=0B*U~KGr97Ex`;9`Qy!U&G|N3k(o8_hpscYB@L!@nM(x61Bj48v zT`Hj2hh$ubAUc%>HWzARc*4Q@jU>uZ$kGkiK`-Rawnst;{u@XZ`$T++@)@RlIQUXo zx|sYXgw#9fTpb00rLv^*^hhnspZ*D@!G;GmL{TA9c_=9C#h9(9oIUK_SV@(Uf~XoA zDd;B&x4c8F9)~VLEQkH4`LUVihmINP(YtBns6_S{IdBw>P}qL+G#p$B=Qh!~O>k~w z!MkoY3x&IIC7d0ivqNxpu;9bO_CrG9VO$C45z%=>a2}C&bj+=~ms_`#TbIaf5OZ-j zjMH@hN_cYTI+HnG!Cxoj(3Q;hEm*(4bAIQddGYb@;4lfCM{~cRP$+3!Drgi68tJiV z@15twrcS|EyZBtfSN~Bm3)?fAT`yR^HzwBZlDx}#b+=CmJ=g@*)P+G@yInCK(LEX8 z<-b6uF~G&x1{WWB;94nZDOJ5Ijc6{_CK32BLHN)~&KIabzevuDaBxu8H*rg4M`_xN zlHN2z_KH4j#-m{;8YD$r${|@tVux9l9!rW+;a?($CHfWeeVLq2%8lVm4p}CSg<$x} z?1ZB!Glnrl!6u$*>98c|!;~!=B1_9l<0I3NV9GWMy{j}0!+LToc77(0#J8{=h0>TA zd~V)4oXRGk>3}4ryNjl>WMM7IY9Er91Z2iAG{!@dqXQ`yrxrL5st6ooMcN-_Zs+3< zhn%Mxz;;^fv^ND3TX1~KX6%*CipvH9t?tw^voBfQFr*f%UWuqFoW?c}!W1@t_8w7)v9K!`lGv$gxM?Mj}2!&cV)t6O@rA0t>V@w*k z2;5|WED;6-s}Gil1D3oqFpTvmHNec>m1@*#a6RlpOf^FZJJ~l3I~ks`mY_@->Woil z2DA<`xS9x}vert0eaybgBGg7b6M>V;CTt0kVU^C<#%^4uk>T4}Xe3YWB z1kw7V185iwM^W2aZD|$d;zFS*sH*uOc3jhvXT@Vp%qo_Bsb$G(?RTl!=ge@}q(nmS znaT-R!t=p!aJ==Hpt&!C!0C}#^Cc|78*A<=`}@D%Ub3$~oBuq0eU+SFBWJ+< z4z+`IYH})Nhh51;RGPU8*QS8jB!>QQ1$6r^`Y;cDVCp<{K2zs|vf41^RqI~~@krIE z=oNgEQuPn69Ut{Lv{~TXu(hQa2`c(tAVEWpjR}Ni0mMo~e zS5UiDP`mhiqM%JIXoFFkx8k0+ddXXz@YagnTFfDKny>8T*KBjW4pZQ%;G!epWU>hb#-c|u{GkU`hYkskOaUBCjkNkKmsI1 z(KH0HK@t)OPz6vFAwZIqOiXJzF{CgSq|g@Zkz_ccH`v5VIKQ>VvMoEx%*L+nl+8+S zFw31;#gpAhhKlW9WM_9~|KF>ltNH*z+L@i*-xiAx)m86(@4fGR@A}?%&_*O^?4(JX z{xCa&b!4!4&@6V0-sw0Q?l{RmayHZv6gq;-F5bT{4jBi?;1Hs~2oc+Z(Bev=<-r4n6^8VJl_$e#0X{8ow_uc)?(|%dkpW+WB~^PU zy;jr4CO^I8@x;;n?Va6KK?xr_&VpT2P911xqAYe{!I*j73gOqMZ$kF@@ z(OS5g9=2BV*6Mo}L*WRaRt-U`TP|vR{w%lMV(l*EKM4B~qTNCHH;YX>DEqpQqaH^^axh^ppm$wHaYrY;t0&iogfOGE zMS~btL3`M`owshkTX33}?#=3DvX*O_AghdblrhYuS`Uyhh!)@<_iFFj{@k%Ad~8@6Frq{KHgK0TlfC%&izD;jUji_)*32tHJo8<9dE6>Tkr@k-AStv-x%@4 zfW|Oc8^u5kklY_~Y!kOP;0eO9)nZ~wG+MXAKL+CTh8*QGF}0(fgnfwyS^I9+fRx$@ z?Y5J(TVu%4#2Q4c$pyZE-AQZ0`ou1=p#}NEfJN=r@E1>djDUJkkRB>76+|W$O`TZL zQp475JS33O8Q3_Zh7Zyi7$WM$+B%e4B7Ih(U2q9g)|1l^&PZy(^B2I&j+F>S4WO{5b)P$lTu@nvT?*e^EkqoPqC z{>5F4kI#nFYxs1M>n+B=esef z`VSfT61Y3;&nAG<2)d0I<_mHUhNZ`_F_PAhTQd{ z%S&&X#O;lElNNGUi!LgOvstX&fj8+e?(z#%+m9h8aW=@03Th2o10gHMPtWr4YX`0! z5KB(-(w!t72_CW1w22L^$jKgZ*NO?shbhqr_pm$nsH2lq*O4)A|clS}!=8$`*=qjOihp;B-rFT0*?q(R* zpm$ojz!;M8yH!GFEpMe8bySB%S}$~(lJ(ex(?om+-AcDkG~Fj!7Oy{m-DNI=Z5g?5iUdj*oI#k{>3{dDE%OV3|>ezk?K z9SN6@@Z}?7amBJdy8MQ9HACT}w0%&+O`+d)=HGFagqqsST4}6i#audR`;;_k{Y4qxgLf2M=2KTQ7&^5CdAK(VCdJ zUAl6yV?C-Fjz-AysvU2c2 zf*5}i6GOFo3(T2ek;^#qc1#Rs6t{C3G2c|Hwk)+9sXrSNLlwnlF+7OzbW99)6h2Cj zi5QbHF+92$S%?wa{v-{~E|!ZIF}h-4&>>_rh7U1z#KiFGVq_ymX-o{CE(R!Z#vKzQ zTNA@X^s{LE4B58Mky~lM)_;ip2oeT%8kE#v(B$gdS^qUIWs@dl-l9Pgz12f_5hH>! zM!^>Ej%bPs90!sOZf3nT^|@4y_11!+Um6>v!$RtsFiUY6O#h2GVW>1rOxi>%sZN znand&^H=L9rXt>vo?|0}J&*K{o$BZx?-=PHALu!?;669srqhh(J`XbHNavpWJqo^r z;Frd>zd49pByn~d&VFap6l)H1n&; zhla;gU9Ecm2u>LlGnjMT>+CRAM&tV7$W8($~y*GerKn{Erq52 zr+^sAkO@S2`5|TVXVMqx*hl#?Nz|Pq8(o=%38NrcH&MQRhN$ut3O+!fxXNLt(X>Q} zxPn)qVFtr6r2he>bh3{kwPwW53P;TM`8mn$AI()VBb{r+bHq(tbm&ErPz57D?ymuK z6+$<2hcV?sK*cmw`E_g0^I6zh@5h$a;rV>~OYO^ZD@`GL zkzg-cnGo#$w+;yvt-PIXv8?K=+rP4X?d*C}sH{aOYgwO=Es=WjULAO4VAZ^OG~}%k zpcZ6=;}+BYfP3^4!l*dCg147Nfic2i;^T_{szMz-)%J)61!CMV3yu(ALR@!(wyZ4XqW2gB2 zbc`78&LGHq z$?DlqevOb{L#}o*m)k?G62VonS{inh^RDu*o7VC zw^&x4D5+T1pnF}*JLwk7w(DNY_Ge;Y>u?jzG6|4fypwJTlhN2MypwL}HHehd#A^24 z=E5}{d`$;jxqR->^+VSV;epS5G~_rfI8O79)6w^t*xnh6pQk1N^QLb4BmGcA94llU zw2;)nK?}Y*4_d$>;UvK`iDpP;J{AYm_JVzY5PWkWADRovTX*o>)f9gj_ zmJcu4=kZgy$ee?8L9z%ZF47WUjtm8ue1{*DrYh=R1JoND4>Y62!o9#=-d#;AA9)qi!2w;JD)8EC7x>DI9fc5d+5) z2j>LfWG01UPtsypad5B*hL#wkI<6M&70^+mx;eO1q@zZk9!^YYv-Mv|t_~8OIYZGk zUnFCAq-Q9)K4fdah^J#{tnb+HNPm~IZj{!1&W`>aO-<^%zn~d6t7EWdq;I@qaHOw8 z{UXp8S7*m)&sfip`j(cKk&Le4zMf+}>PsqOB&+ZEp+o&chk84@qF-n&8SxAaj*NE= z4j=DUQ!pJ%&#|77!Tzp}v1oh}!--^$4Ik$F_sf zF1TyqoXP6`TpEt*ZP_aYVQU3%t&o#6vLuz1q>&}554jrzcY`iTcGz0NTTA35wJeFB zlGGx}$^pqGoi0U@bZRB1*uhd%QHmWb6FPYm+)XUWHMv}QVQU$0Et8Yfvn1t|q@E?I z1+Q6f*XfevhOMQ%wNy^BY3-F<9-?3mfG{POhe)C=nAsyWOAVQZmzt#k#{+`9k-Y6S zLRH)Y=UYlkS<$#?+WQzw9|5%ydrdbQfzG5$YkEyGGov+u6RZELxStA`CI$e)Mr-dw zkZoorG$x)QX)D==A$%&6??Qc?P zu82ihGAwmF-8SJ58MQeQ6J#xYeuF-K&tZwd7#Rmfht-j&V(UqA66lA1w3_@!IriW@!K~GcZUQ@=lVttLqUGz(I&N)<;aVlBAWxiyp7xhNsdT zabLPRe*u!2Bn8H7yq{G`714-C#+HfS$3u(sWqA{6U7yhW)$@o{Dd7#Zp8 z`e@;?XKl)fXh9E;4i9MyR_iZAOzihzFXkK*f`@IV+4D0n2osd-q`N6?b=ff#FJhUwJUtDmOOg$g{MMeQr$3`u z7D~!3vPY8JWS)Sa31bG4MhX-}%#KTjP#GQ>iOp%P=SJMIpE(!Oj}noO0W?JKAd}{} z?pVICk#5JIsf~2!^^BGDjdaI#=kitQ&lTyD?dU+~uDS_~tqw0>mhD6G? zx8HswWbYO1y}YGYGU1@o9CD!rFr)Eoi+nDE(+=`;fm09jwDF>82|Rv0Tc*tyElXw? z8TWz*si9QHgT#pfc#x(g%X5|}4{}j+5&-*~NvSku(U}SZ0;a_na{x_xe{NM>{wvVvZ>&efC)C<5*%$3wQ7h|)Vf!obiOpzh6|g zQD4=S#1pjXPqnx?q;e~m0DSu*84M^~%ve?V_{vxM8;m(2(fU+f%9z;)&+L@G6^nt& zXgaN@aI~~}F+*Rw&3-MpaT1a-T` zLr1Rb?=EI6x)$9*_f7Lsrq*j*&;v-BTceb>k=;8=mN6b{VJ3np*e*Jw9s=>4qePdt zf4)UqV$XJqF)d^SU0xr8iHLOgb+-nyZo)@9%AU1o=mm249Wm>*@m^fc)lf-1HDw`d;o0|Xg;@0RYhrj?^_oP7P{ zYo~6WQeR5CMros$VZ@!oj+$9}XKFqXTXe<2eIFzkNmmp^e`&0Z7@y@*Fk$|a;DPf2 zGM9ruJ7qsW_21T1zy27{?%PM#p8A6;zklUxS8rXF-XLVv$BLNM&mNqdI}7X+(M2qi zpjch)08?t^UOdRHT&(EwlDR46S~O`7<&HD?KZH^{O+F8b4^7)ujFJ++M+EKNOL=oS@1GaI+DL5WW&xTzo z{1cfDCe$$1TTHLu#ULO%>er@T=u2y7t`4RLE70 zZ6n-iWoEw`cqJeWN9*ag^MuAO{0J3x3kaE0ffohuSw1Z0l&(I?=QQ9JD;w@qwuCEN*3X72 z+l0!t+f72{z7^YwP0TA?wefj1xbLM}@=7-XwO=2jL$%urp&f?>xJ#%T5b6d(fk7cK zxN=wwG_4$7IsC~+Ni_~^@*uLM1SmEXZp`?JefCGCP3twG(tSedK9r-P`m6n4>6ga5 z_iH|Az*DIHn1HZiRHzu`-KC$ProIxfpjPx2!=rn)4Sox=ZP#o+cNogHiEL0NfB zje)H9I=&BLhqJhk}^4XeWqgO|V&Q zSh7C{uQk%&=w39CKD3b4H+i+ze_{3tOsc|Y!g)!TE*VU|9jMpJ4uUosjO^PpxcQJI#Aq>2|lN@1?aw zie!=Fcc?(Bq=RIQGEMe59I!;-aS{5UszGCBM^M>jvCjn%anbBQ{oVmY-yT^#(y? z4v2BeAzA8Xg_4{QcOu~&3AAZvnuF3bOJE5To=6n*0-xXO`LHI`eO%~1jvpb{3Bh&Z1#M zzGuo!v2CQggmgbFqQdna%(PONUvfbeg63SKI~MpjO8AjM){ehd(RqXNVS z7@t46mj&=-_JQKga`ShJjClS|c?!Zvs-#S;>n0YYVq?}b zII?8kSB&7P;JEw+aC%^D!*mlzhvKCS3EBxB!t4^x6?cv}(P&u^j zCoxu$zn5hb_wpkAr^-9-Krmg$-6d?W3;YiFTZQy#$_x%=NfIdj0tX0W`40X|7k1?- zGd@7K%Fqu5ZAqc~gZ8A~GJ}q!-=tDmX8u={3OytKf(a()S7HpXqGT3Grb0qht+(sG zIjkqGcg&$WgZ>(zE63`Apy$5OKa&)?Cl0F?xNwAAs#^A}`$9jK6ne}7JS%%Upesl4 zfuQfc(94rTk2#iS&>euDEtkDDn3EKGW-vGDH>uUl5Xwl>>cN~~&iNSAu*ls!^XJGt zPsLpReRFs>Y2EVU+QmHcB|tAwp%>m4`fnwLUYG#-ETAi9X#>IH`$9jN6nb$2=m!D4 zL@m4jzR;_aLiZBy#W=4|c7C(NOW?Ex% zQ_l)mZuc9{Ofz{&bBiC(Of#5Yb$C?8g;;L)8{dp*|74hqAK#2K|0X6k^&FDrcE9n? zIP*@@+~UVOPZX3%l*bm;|v7#lB^8k z$4VnSuj|`fJ)uEvRl($ArL;WVL2rqQ>C1qPnuKQh&nSBlap4Pq$-$ve3f!KoHVDn(RF5LOit=K66&;Vld)FH z38og4&_vuw8(m)qDu;T(yUl_u*c@1W5cYq1ikqDw8<7zQZ1B*D4T+J>apa6IstqzG z3H1F9y<}zyGddnUF3Z?;LI@86ed_NMJ;z4j?D|d{7Q3{wc$p20d zNoA%g6ma1tet1{YMH&sF3?x3YeD3Jv_l(D`U^n#+Caq zeG(Bw(qzOjt}L9hJ_99*AQz$U|1$+K>JEQJ?=~p-w+JGcTA@9*k)PxK7xqCB&m&C> z`2%S;aCa#nl?K?ZdXkDVOc)%YfHv%rB3W5SE5!`P?i?H#p_%7sSHZTy()QQO4C0Zs zElvA#X8;X6HNzYYZV>LvFX1gYVzK{)LHI^}VM(lN`*4tVouWJa)ZP4Ie8q>)KKtUc z%gxJAh0^kbw7iv4A+7MOG{N7(r_n7Im%s7k>rbwguRRqiZW4-{)=P!roqT$M==Qy8 zf5pDiwdx7E%LRA&Y6q+VT}u(GYvB{*Zd(4wu%MaJsFFO;wExYfpcTX2is z^0&A*7kF2M4P%9p^b#zO0bT{%a1E51* zd=pge=358&iouZkh~PfLyN}?3U>ylNn|RoFa8-QWbj!xOcHmA_2;|)+fIH=G!viJk z4LfUiXAKzeZ)Luj&%3tcj!(Ec1Z8}|-ORh8so$*2@Ih<+&?W5;JK+ZxMh7HXbJg>% z`uLLa6`;*sf_oS5hIxlwT0C!^mdF%_PIuLd?D z&cB9y744b_BI?alaDG)H*Ta4=I+xQbYCrL$j)6`cmg6 z8`m}UX`@{ey;DxBs13!_ygqG|=0WyyT17!Ap6v8#qeG}zzUxB=Z$D1Ar`}9 zxik~@iX>3H2;KE%^O=v9Oxn|rAb5?53(WS;4T!sRd<+5ndxsZMiFPm2t9d=)`?DHX`~0rBSuL_CruWEH~1LE`r{q^mo8vg z)i_5z)xF(>Q}dul0Su$THk7|8h*uot7Be=9Erds&G~63mav#!Yy2v{o>`O`&rGH2A+5&rda7 z|1{d8P;L*mR#xzBB#oZKPGm2euFoT`!oPHDZ41Q2%|+ao5Vu%`+Z-)NOx%3LT}51l zbLpPnoiuJC;{Gw>`c=3jbT3~qaElT5e?nY^XX&0lpu{v7V&eJ{7aSepT4&!lq;`u{KAyq7!uNMJQrCghTp@XzdPf2i7X5=#G2cpmxjkl`waVE9_ zV(zfe% z_vcS5X(1&VL-FuReMbBBR<$1DL<2DR6EcyHas07pOeRa7wwT83S)@Iera8Y43@xz3 z>BlF|KH28yZX*$sm0V~V!5ea?Tr~%_2X}RRF8Cy@GeEgT;(yfp$?hXS+KBYHP_LF%{Wf$|kRSV$xoO}9nVUNlhm98C=NepMgPiSn-FJ zhJTa_nIHzBjoSuU2&}764F32nr%yQg+M5{;A$$|DcxW5zaEM!ZvjL2l3njL-$CP?Ly`(yf8p#Ml>wGe)L9L7B+IUo!IdXRO% zgOh|4h~Ak0j6jp*5@7;snuxvsBKa%tA!olJp39G;5kLTQ5TGDe4@}S}VxGH-7n1W| zl6j6~MX8L~IFhg>F`zi|eae(bB9w1yS2UeoaRP+@DiG%w&$IfHB{mqKYg~z(gh6=mX6%+;=G; zjye~n-~$BE!YQZcS1E{4z#73LqmxyXbvg-0gdWLY2O&a{7h$|I&PCX!;PW_~n)?>^ z0+0@|93vwgxs~?}!$xbj@nh-FwZ08U9-rT|`V0cxA;%8E0kJdK9n4wTBiWR=XG-&I z6TOwZ=Kf?Orwl?D9vH(`f(>seUv@m?Jt25c@ZJ*}-eQoE#z$%yzRWV{cav4>I|N;pW6(ciaYM=u)BIAH~*&Xjf~eb_^REZ+&x0>o{g$n zzHWc0>VQyn;9iQs6ZqI*_GJEy0*J+VGJl?KsN5q|^g~o{qjaZG+O?dqoFRJhR!)UI z+jvwKm;gtqfseZtd_aOR#Ulj_AIC!8QNcUPdq?B(k;mr_B)~^wJaoJvtTakkDJWa1 z+Njv}=HagnePxJm?haM-2o*gWc?CD~-za{)n6GXP<+TZUZ4mb>$V3ebsD=fZ%V{sC zK^`zOf8}J@Q^9*Gs5T9vx1Nu?mD)hUGsPnX58JxHRe}ttHVsm3iu@~G8~KGdYu>1T zy`B%Wh4R~l{PvCV$~W7-y8kQt`5oP%@*bhQ2em1p+7wZ3iZYk2XsogdaM)@O2&D&? zGdA2sd~w%%Rs^_1?ry=|&AYqtKn-{ro=bR7^+p-Y%QOpR&C9NrUG)CZu&0XmRBeC~pp=libTddY>A+?6mtAkVmYpvL%3FkTaDe?Gw_gi~suSfTY?KDRod0INQoQl7ru0g#vv-pbu_VLf&l~zQP-4s6E-|_YQsY2p>2c3LF*!hjkIm zNh5p|XnC*edzKGu-*$Z92<<&0z({dmC=?hH0z)zg)C>+{$^}n3#Lt}F#*LEgx2yS* zu24yrP|~&R_{F_(6B~ZyQRtJOKW1VgV2V)`l3H`eTSob37~@_n8m=>}S}IL%8u9Q} zhoPf7<=d4eJb$~&NYB-sdHC^xDYe^b`XHSmePHb{^<<=c&rY$v=QPrDMn@)oe7`ic zx7zgmDvI^}>JHPPx|Bbyp;&)fYozD8L;LaLhjq5${pKI;HVwC$f7qIWXPrnZ%_~ei z>=I^xSbgwSjKA?0lnf2}t=LlPye3+bRHnF8X4eQADfO|8ksJLF<#4qA+D;FQ!1TFAGYG@O=&=aW*J%*`ga# zys>}LvH+|vS+9F_5MvlK5Hgb>*6F-2$HYQjMNF^6zT|+Sm}6c&;>Kb>h7H6@;{Ya< z{EM}?1f<+0Cra(4c-k+E&Lri}Lyk`Jto22cRHMWj^2Cg=dDV~~N@~58p{FP&SalIC z;F33k9vu@aM*WV(K7rV>fEs+Tj_Rnwqs6qgZmUH9ao1*>tVEOqMb!*#4oRs4!r3t~ zW7<<~^_u&%dcNA~j>U{%=4S1_fclZV^YsF4&C%YOP)06^-@PYZl=!;biMMvLiQ)rbTq2`(KHpa7eXiQ@l z6O!xG;%B~8`3453Dmt-Qn=iTVU!q0#qAQk$b+wPN*@JSKX8upmtYWzGZC&gb<`3Ff zi$<*q@uFuj^H!lALqTh>=qA`=H!Vw9^D1k`U|3bnfGRbnzXV|s{s9-w+M@yZuTMpL z~k1?}HpLDDbVVpk@5DqZphw=Je%Trvf#a9mTpg5)>qid0dxE9d}xCa}xrfCz6 z$p4=oYj)hX{b;O7MoIDQ$9j;y{d8kg)7#*1yhB_Lc43T4xxTa9fYC?WE<5I1lo*(q z3Y2I4sG6v~P7%CMNhTE*)3}QHRwXS)%@`YkoDbq}(a(lp^Gy@;ZJ)LnH$%ycU*h@5 z7Z|^#OF8rVl;2=e?~gt&=G@w;r))C!0OgXL=W--JtMsH{7Pky>|A^#VDmEH$uFO=I zpf*pglSylM!7JM>s+T{(XC-N#_plg46eDMDa{3(m46R?r&XXC>)5Ki*eFBaL!!J$X zMQ7nD;v57U5%z?~JGk?6;|umN;s{G=zGjM~DXh6slt^M;pF^sJ3a|mEg7DlcF^Fr) zmH_h=3C*k^{Pj&u&w(xKl#5F~PXRj}Ug~Bae*(^3y~J4Vn?3JmCHGUw5j_o@Iu1Uf z7fNJpuXC_ubJaghY(QqIKu%T4U8ORVaFY|@TF&{S%sXbCf#QRCS}IAXku0~Qrv>sd za7GGX8OHFnRE@UTPbkt23hq$w8x%Z)JbqcI8JAjselQ_txl-<502Fa^VG=lEMoi93g=YQ=dnl_fAPCr)(l(+|+jBPnT`CME zW(lDEba@8YjI9^(nYllr;2RYD9fE~zj3MkFK6~~u2VHFcl?zasV~8g%G!Yx9sm%|C z_Ww+2DiA<@@b~DMUIhH?757~#CqrJ4K3V7|GqG$Xg>3SHD(UERzd^;V!{>;bnOG(= zIs!H{jzhTLq;HIc{5Yj2aswGoTw-eMQFiME$^l2}2JR(F@H6`PIePjbJ$;s*82k2n z^z-`^e3ya`D6mp8H-bQ}RH6SuZ=>z+q3_?KcWQ5B>|2F*eR1x5#7uS!jZ;v<=gvn` zC7O?^Yj9Qp_<1Yv}YpU-fuZV*<_DaW*Sirf6p|F5s|4J<3 zDk>!fe@!gm5d_2%K5I&Gf{j*CcPGCwoZrYdb-v#n%I_EQ`>(k+@@o^k{b)O!0Ct48 zcZjeNT)G?V%UV)PuC@IrJ%42{l!jqX&zcSQ!SALCjj^7DH*!maTrfumO;+E>EWFlt z&op3i`p7`@m2lQJK5LukFI(>4$jM*X_42bfo?Siq%Ja+5i{$|@hVr_g8BXC!msnW2 z*2M=paj);XUH*-B=^0_DuydtPF*-!Aivx`@A!@dCT3v75RSEoYWM!^f#a3da|gSna)_SJ-ZHDJq%x#RE6{iy5s zovug2U5|#kJ|%R0Dsct{!-I z^tR`JIPr}Wq4M@n;akP3I2UlFS?t=5|G($p=3|Ay?h2= z{l^A7)e*tHXpl>F%$FRdvpRN!yq$u#llOK?9pv3l$8?ZiV>3Q9VFD4gVQ;NWn59); z&HqaNTJL&)sC2(jx?gQwc;Mt44hq#BM6w=(ukK@bt_2DZfGm93zxd>y*W&cya6|MS zfA5sA?`UY>sIU)*XvcA*tJ9Gk03MGr-Jamn z4~EhY3h4*&z@lEWNdJ&4RLl_@f9IMo3BTBBdBkS;PTE-giQT3jx0vwb$Ga;}mZaP% zti`ivvpv#c7QNYzG@8Z66g;2R>|qS*dBVTOZik&GV8T|eSc84A*lwY398{;YM(MzD zf|0`LUU(@*D+&|`#jJs1j;5Lkz^axeccl~%!n7p)0;3oD9gO}LPC8hLC0MKGD9q>+ zL`!2}z_iExQ>DeFO5Z}NbO@AU?e`A;OP4lH(6$#Zb!JS}wqioM6-!o}b6A6RnTxOj zPPR=8fpLlL+Bb{#D28E*&Q3XiORTA1P;=g~)|}0FS{4BLY@ct$uO7 zM5!fuK%5%srakPRwx3dO*P3#0&HJMzO>EKF)E_CTGjNF=vx@c%mZ%WP%FvEnIA0B)0xx? zXu-m0Kh?EKQ5@g$3uqBV6n3YMDogZz6a2C2XxWmK7>WgPbl{KWU(b9Bc`Bl>CvsG#P)B~M9E@_5d>>H3c#e5v8%g9q1*lbnVqd@VnE(Q~Up-$KBmmg+0#o1-b8 z$XA~AV`O43BRF}U=R6PzEta05oIG$H3$%jDaa>0S1n=Qsa52WvH54u+;nM$x>L+t5 zQPXJs0^5cdA5mgyfb}5r*ceMgWtv2MQAS=uHm3A>oUt*v-zJ{TISLpzE6T9^JiQ}k zCHFD~mk}%!DV#J#E>O!zE9HKdA~Kd+u@W&M%dM1Kp_s2Bh?q%tHX)addz~UN?hUIT zD_;zg@AoLmZxAA`;3--@Md(vszQ3i2#9`#VK*6gN+@y5Xr(wvut`qjOo&@XdjDPg< zS(4B6cgZ51eu-08=MNMz)|$lbqH#>(z6I&&rxY+uzCnOn>1UL4rZV5SFVR=VZ({}j zE&Pnw!9E?An@wV)G1l5OipuzF9}qN^gU0FkYk^EI$~^l8#f);*qWDt@L=uX8i(tP= z0d-XFs}!tK@H+&67-SMljLubKSz)q&5U!G9QSf=Jv*%1$))6yo+L+?pC@9wM50@>= zM{lGpr>&h^KY45RS_+t3?yTjVpSybf>Ppi~OV^gLfpmJ7J>)y;t|#Z!{8#c<4zH#D zf$jHg>$`7vhpIcU%L#cp1y3h7kk$+cCq4kLZ6nHSE9WcQ6Y|>f{EVY^+(;ZX3W=jO zW|TN;SHoG=d{(tsR04j_);Ti|#%o~=m;3QrZa*E$?GtpWJf- zCh-g4MUZ*k)-fuK)*2Y_1XH4Wbz35~L@Kc*lpq0HVk6xrI)>l9D(oHz?LH#xKEgYO zaidUVq7MPODFQI(oeJ{;91kjv6HtkL(S-r?#V+@V*YMq}0oPE4=?7&d{P;nIZFon@ z59(Wo>r#GLm5Mh%tV_Y0AMWtunfKa`mYMnD)}uw{P*Dn=&jO5k(T15skbX*Y4t$Gf z7z$Avor{JkEN$L2{EmWs}b{s5BzIeM6* z!;lvYFhwiai&rhYy#cIxdjs8;hIkcRDxw+xe_DgWk%_-m{D{ATCK$UncE>1t=~vuK zrl5HVGMCKda<8h8YnjQ8JFSjWorR*HSvrG;5^XA6Qka)g;EE#kV#-pQ(Ljoq`ZXrG zw@z%(Css`f3c*!62`-H)ZW7lJF^WzxwKOlnjd&n!h&u?3>C7b(9%+62(`^U_3`XD+ zRz)3Tp*?7b?r=^RUNssG*PTIX@LPz=EQ)ep$CI{cx&Iz77HTBJqLSAiI-@>&d3pkB zG8${_=OtcLZbhGe=sDPbpZF;?&U)(U=QPHiGFHt$@n&rO(gZ~^u*=h z^u{PoNyrw)fzueN&SyOsR}-kn7S3*1IY0ogSBp}nmXd> zJAR~Nh%CJv85zR|X7mM*IEsB48A^s^KA@*RqQ%QMD0mkEPWNUn;{;!FawM(Vjsefy zAp}qniJl6wL-sNH#EjDD!7v9v%JN4#0c6LY6j%sN-$m9h81C9LKELOsJrYvZFW_$| z>wtjJen7AvfLUozCfO2oEyFHKF7A6KGYm6}jzV5@lSd-F-EjE$>|-IvsNfjol^X+# z$k?XfoF=^QdW)9(UmmzIaLo$yq<4JV!Si104*8k{U(+?%I{wI)`^DThN?tEn^M>;3 zg}nNZuR-uNz>cZi$6I`?o?o@p8g6+Gn02(6iVCuR{U7iksn*ZqNx7oK56rfa+i>Lr z{_0F|mL`^TPHe^~mb)tL&>-`Tk%4ULE*W)0AeE6_w6}xdVYGjg7pd&-umjadae^yh z2&UXh)pPPxA7bd0v?*Dz_f1Yu&-zc!a??TXAmHKzK1w@1#sHr_KvNx! zfG@Up6dAr%h~V2r-i{_Sb0erT&Y)7z>xfP>gW8HFn2`oJV|@ z$liS=wfW}|4{e@m$oKQLoxHn?ZddmU*qo%M_?SuI{8it2?)$s>lQ7K$YvYd!>5t+; zbY)$e$4Lyikxs!nObI|J*Dfpn(1wb6{LP|}UtL;pG5h`3a?1=~v31zYf9OQ;?UWRR zy5>gFr2(TC4>WNpE^)csAQ}~{z-%M+hnS`&%s`WBBooWR zLWWq=P?MC^HOIBzB5vlu3&Jn(jUo9m$ke`JehqZaN+OxCxixj}Ds(O3`AbU3eGiq{ zLG3^rc?|PuIV)}9v`Rj$Qncsr1$DfgZgKm*+tb4Kfq&kob~Gr(rEg==C<2=xVGA1` z#O5Mi(%FPQt8D3e9IbwNGLm_2Y9{90St1hUqGvV?pTmQG1-NLq6=R8)iRBxxv|(&X zSXVaBQ>(~VbXZdN$#)My5NBHOAnF0%lNpfa$ZWe>& z75~-Q%bZ^_Mn;U6ixcyV|DtoOD0$E!vA3vGLT2pjJ{}d-Ihb(huO^=ofi{1K;w*@K z1(8oelAK~_mVN9@aegun4vpujry)4UY^(bj#^)rDZv;0{gRtV%`V|i{$ZPDvq!LpH zsNUZ_d2ZtJG<+NZ6=h{nxbaPz7%Gc*ADD70KptyGgE>NjRI z)a@vf{5d5;=KRX-r!%!Va3+ul!f4Tqk@Ccdj>li#Efo5&F?^#wF zf=E{xG^J63vNpf|J^OYE0+<&ip*BP)JKaAtI(Ejtckk$_(f#{vWwrV|7(7i-Mlx~Q z^tQcw8>FQE(+v!kEvA^7)c&Pt)mdRkw33P`VN)BkEO9v>xO_^fHZ7Ds`?4s)w}QdV z>dPt_hqBGeqBi7``V`+w_LU7`G?|#0yFvpFiJHPs76uo%{F-S?09|rfst__~#8?L@ z(eL9A_oozmD82Y=%q`M}I8(NmC~t|_U?NMA>QiwYNE&NFF*jLv;QkF_x6yRbfuR;2 z8T*U|w|{jKPFF&%TESKOnZ6f#t~K5DWQ+ctVsRrpmjvKE1i?Q$Bv^`9E{80Y;A~<+ zX0PNemC_ztoe%*MTvllkIEbkrR;~fYtrD7((K*RL0i`P#vp2o8UAtO}ny$K3qI*xf ze0E*RN&?p$v&+Sv6`F8`K?_WA(S$8uLBo?Yof)_y?W+8VH0Ar-cz8$oL5=~;+SJTJ z2>gu)QzWU2Ioh97B|*nxO7zq{Q8}O!Knu~hD+Xt&i>X14)@0)Idwm*63wYV$ zA#EvrFO4C7OfKWpi5f%NhfpIyJ`AC z(7hGyxkQ+wUBamB_A%fYTBtZCOS8j&upfs#elmYs>&K}TO?6L0*q$Sa`oaFO9+KAY zInvQT82!ndy|WX!sah28m!9bf%pT_^;otg4O z0uC2)sr1q!3IN%HXLe?eg!^smtz^{q3W~U3gDaaWv)q%D!O~yW=uW+)Gp;ktJ2c5f zQ_&>ZcsO;&3Da*NCuaYa`%3_lwmQrr2ifL`cw?$AWqAQ3lzf;1 z#(81x(H;Q|jtUq(*#d)ycGFy#z}x1hE|S@m>G=sTc1T>FSUY$JYb1J{Q+AR&7=|0} z%LJKr&JnwW3mB5Y1W5fSIv-2BFo(8PxVuO=MPvCLl!CV1+acmD$z%`Q{uG}*fIE~v zD5MYa>4P6RGOqV8&xRb^1P3g6n4L8nuI%eL)xy(9>?s9Lbn2Cf6R(nxD1SLegb*6Bt``OT}ZJ$v)nWrtW4_)+b_P|?9<+g=Z#0I{+{mt#mE@si7YrP@Hio-@h`OSS|?q0EIJ70Hz zFFd%BS9CLf^;7F@e8v7y-T@)+0A{5^*oQ#yGYXc|$r4C0U)*;)_nWYi(1$zZ?ibuJ z?$Iyil)Sq1%F@fv-*|r6au=?*y#Ak=P34(C$;^4B^5v=UvrX-)pJtEi#|QZ}n1V+h2kLVrSbZuOikDJ!VqctjSl@H5O)4?R)hZGb!LJ zmj-Uk484S{GJ7u3z1iAKdF^O}VWR3@F*AV(25ucgP#YeucU ze9*dRjGA&xR1V1dY-L`fd0#8t$N1>ynFI&siRhFBD+lxBu1LP3bBrEaiAtiICmciE zpVKJv0}6hKV4))Us4fjMKLb2JSEEDMCSX6lMcE8;ZY2QNE7=tSnaKe@iiGisAk}o?@6*8TzVl z{~MyL(17We224wNiVZ`O)Ag&2jQ7C$EdHpt?B>*KPu_g;+VF}oUXSU$8CrZw_U{~pqX%xRWxm8z%Wm=#jY*b(zJW{s}@8VeUZS}KKnL7!e7xnQyp zZ64*cbH9aEK2Gg)I|em27=Jr30;ppa*6v6R+A7gnnb3}0kkbMwy`zqfU?ryBO4E-q zF#ZQQ!EqX^*#*~FreL}ZIX#%J`vwEL+TXM`kFMiUz6$Lce)EzbrJ84anHG&NVmG$z z&k79CT^ps4z;Ec7YDCCXd80V#?{(mlHK9pD&NX3wi*Nx)Hk) zjpEwxssu9aL@nC=LoiEQGJ=C0m;q9}Xq%`7545KyH&vEbg6338K{Cy;&=S{G2TgI@ zB|)qD6`?8p>eo{?#WIKlEwEYHwt%->xo1ky=-^Dg;_;Rk8f(2eB^9G8l?IZ)$kU%8 zy=Yu^%oL!9({6rKHEYhUX?EZstDztold{4o?S&=)I z^3zh!rYVCZn*6jav1utc?^WE-b(EN?YadPTMV&PLH#tsp&}51CIlJzyViP5vKI8I8 zfG>sBh$CnsT z%z#oOLn#ezry9&zg0-5OXzO36LaRvt%{uc}fTq|?X$dwkC|=e&S}2VuO?`a&V3Q_S z?WnUu%{4))W$VnBk!!O$=5+;k%C%@=@TA_TZI4}XJ-#{ND7agbUR$2H^r%mBe0}aS zKAqO}fy5)q9^I&=#bI0-f(h%O%OiO|+ak2(^qK!7*t(dC86|$!+#-x%n+B^7QKMkH zCcSo^-D3XtX_c}~$CAW(#E&JkN;U=esx+Au+{a2S^#u(rK^w>r+#63j!Tp-}8Z5yI z&fY|{dY@YTD;*sqp9>Gf^^AnM>7XgvU-7eE9JIuB)j>->>pcv#^+nUIgR$#3&`gI)Gl7^kjosZG4t8o=OYM^y>I!ygW61MBM*?c=*2YsI zY3OdNkYdUlv(w?;)3tSSI*coKup<%G>!2m4oH%Hp!vt8+K})`tdl+a69TqTJ(9ZI4 z&``1-{r(V~0NUBrCD|J!fB;;@QQ>mxj1%#k0WyJ^m~yZT^`z=e)_Xj9V1Rc;tYq5W zeNrDso*hOL^mGO4Bl;97R4oN3fEpZ4)KAp1o=O5$JEkOn3jA+Y)<=J>P){?w1_1MP z6sy5c$)C}ynIK~D@Lj+Q~kXH+`2 z2S3f`45>s~S{#q9U+_#qnt6=UV}ClKfuqIy7U66@t8njX&n<(GYwJzDM9;e?S4mNB z?IzsVEtX9OE&1B|VW1_ah=+led^fpeXvBMFJEgO7Px|ecbAuhqSQmF9lY=u=Rl7bK z3w-M1LA!qaw3IUA+WfR47)-L3nUw6Wqqm(+FfN|cq|(k6=cQD^vk7VVf+m%gb~jB0 zYa{jOOH(qQ_S}bpt8`Q}Ca046-R>y1f=?ixZd?h%QF#0b!OT76t+bIh_#~@=OKS%; zIIZs$FB)flj5HVJoca5d_kEh3bY)JyH<*bl^TkAE)oXzk$aO%r?* zT+*LM;mlThc4(dVD-h$xfFru|ST){UM)0Zm&SGu~om1m0mMx)f)1TQp|$DfVo6(ZZo_()b2z9@giq8fzDGL%j>f3Qjk*H#c28 zMB@9slaoO*lIw5qAA-aiRI}g)j6^Z!AYpfYYW~9I$Lpc#+RzEfh^dbL23g>)0j}LH zPtG;WOkOEC-FR_fXize~Ti-u(Znn+ee~!r(&j2_H@H5|D{`m{=3C9F1Y9TB?>3>WS z-kXE`29&oRpPifBH^yC_tg0WI`l1o1*yOXG`3yV~pPhw8*qQSSuKpRO9^~&B>Guyn zMW}{iIw3eee;K~Kpj+1FpL&@x^{L8}JM4sdP}>I6Do!)F2*^4fIdtY*DT$ z39$<`aj;aB>+4(Rk7UV3g}RBF^+IJVfHwazD)8XcMMzz;`l2DYKcQ;*MxlUlapK8I zPEAkW{+PbioPd9}$!Gi>{j9Ms05dbQ^N@m{oFQ6dbpVBs8^48uD0(1AACy#Zl#gBs zP)ENmk3XV3ye*B*)QOnGyNj?L4egPMg_4np>5JOP3I-s)N}{m~{+*4Dex=DSOlZS+W-m-~dKz*O z>0F$cksEVv>hA$E;*(-_&BBWv({hn0%Bkc;(zI<0Imbz-84-XtXk(!3O5K_x5?k=e zeQ=sJkyMAt;6iZ+=?F~)3EiARL34~~ra*lQIel>dhqgZltKC|3>G}_KGD(D$Bv=;m zMGHPQYpi!IqCKV!YW)_YoQTB6W1RO0N z1f`vYe*V>k9m7nsO3edPmfV@xK-$1U)^^k#LFaY;g^FHg#vVEQF}h*|otnFVrbR2z z^done1y3C01r@d;M(v03cof8c4&+N@7_mGJ@%RPz2?)fiMWQV0QG^R8?LOBqMVdDzGafn7vPF!4=mAqoAGUo8cO4@rUF-^EEIa42$lGiJC1QfV4 zWZ4{el8o}#`^TUGSf#TlAQwQ6SjGK-@SNKP;+wrV3{RkXl7mmu+(~7^9G7(o$0b?$ zNaidzg$@q|O*IN8RA!3(E$WQ_nF1yxT7pahRg$!2Ir>M$IV>k-!;>U8|5u0TOcla2wO8pNlAIVTL$hxCcstoD7LL!poDI3ZYBcsp#17$_Q z`&LMrwxjS6&Cf9Sp)XaqVX=PZ&~F}k;Se5pTQFpq6fBdxWs?1TG-Np~SWfen(`vMP zrfFMBw`x1@sE~E)n|K%9VpgS))wDhu&VreTJsbIT z8~$>>Vpqt&Tk!8@HkX?qVp;%MegqIPEr1PP3k>nv49y34cbVXB;N1}lZP zFLFn#`ugsUHtAV(?dIE$2<<0$7u_4#jT?m}ynjciuvsW<7V}HQ(q^IbATr7!5&awz z(a(YXUJLB^+6-BhRB9)_Ja4t;Z{!y6h4rD_1|hfMTK|R%-brh}elg_QE4cQOibBOk zDeNfk36-`Aba#@A&by`M@YCrkTYWO@Y6`iUHnQ@e<-B$^l+`L^wcayic=E-Z?R-Or z(9qB4&@DFa=5rf2iuZ^WyM&7UVp)|K*opF$z;-wSl&=KVge|ZqZZqTt_}cwKZ7-ig zx015yekmcS>n)&SEQPZ630eC-HZ*(knf2ylaB3;+7~#u~;Z_}lia7xxr{#85n7KLC zWb+8WcSzWKg0FZ4H;ReECMjutt&q3-c5^syKcBZhDTK}Hnh-*zh^)0`cwh)X)~^Vm zHWtDIV>fXdDttmt;2!2KZj7`Jv{23z}`Q8PiA+vJL9`-bc zJk4TO^ZHdj>mY8ip_%vAq7#b#uG?1L--TPOY(zIq(g(8xYyG^h1-FuPr#2~>Oeb~B zMBO*LVs$a>Yvz5;N>W{}nm_Txb4=)bj1QgKj=txRtckV#Uc1`}vBKxRWRSIK|-I zg~?a$p*;1_L{*3qeA2!`pbo@FJ=YSfaYDep^VnJQyE7jFx!*iXxHsLKC2VAQUZ)0``24}|9;%8 z1PPN;#o+P7O-M=)dm2NY#=G9CwN~DXjCYDTb?bS2P8;sK(Gl$^-*QN38Rq>*af_98 zn~Z8zYw&BL9hy)oeR4v1U7||Gk1-9NI{g^KA3P=;{51dgWcc7De{fPWLLBE?2ZYv9 zzT!A;G0^mYGb#Gk79jwC`3HbLU+vm+ymudN1yLAD^)=lTQRrp7uL-x(d?26)NZzmx zJh$Ukk~eKR`Oh7O+!DT|X?))0h?V)F)hqH}kvuh22N_9J&>P!ZLhRevgNWQ8s!vBtc$o zGry}(*fqlE(5-*~{N;CwAEzn~W--fF?fP2MpeW*%0ljw_xQej1QCj;heqiTjRD}y|-KW zieB8Tt&{D&@*6Q(JeAr)R={G$*8@ymYc0V^dq#aq zsYMge-N&bmAhdhuSnpA0M|Z)po&JfX+gH7B=C8qr(k`KN7q}c*`71MgRxRC4*amU@ z+=38%mT#h4nHDjV9=l!qVVcl7!uyZm-h5guTFu~n^>jD)eK^FQeq0zl%Qw@l0K_~S z12E~N3x-Ly24K&J#rz}VLjPlYGu_Dn(uyzX#IFH(njgQ&&s-M9pXQtCen^OAtDlyZ zptm#LUljI?@s9+WDSnk-?13vj@B$C>HG74cK6=PM9P$nb z-T~e_px*!}_{Wl9tJt&Yhl5`qga>HBBxS%DwDnp@%k1oG?CWVEMte8j)3}iZ3n-26 zR)n&43t79#uE`#3`S195h5ftMue@&x`MU&v*K+@I|3@0`@N&PHRgWD+Ry*!!8&+K8 zPd&*athmSsn(>c`ZCXHV(*k0f!c`tdfxWju3VpbhwAg+0fy2Nf^!IJPL)?Safv+34 zk`}bHm9*G+W%uZJ&hjc$=E7nhqt5D{Fx$f_jolc(OrqH%!3zEpR8QU+1G{2Y*Zb%* zBe*y6D>1WIJ!1OUU?@06Q$Iqy@gX!Dyhn|9(I~F4XE*QJ9b2wSl#A`AlM?f3{=iY; z07jD2xW&MpB&9>)baR_hKMY5D2sD}PNmM^T$W5{o-8zJXWk7e>Dunn6Ri9F-e}V}W z16oBjpYGqt$X;!J*9?jaH69Wg5Ai3a_@|!cGp>X(t_T@d`1C8171^v5G@25?w*E$T z#ogL&kvR=4BBy}}(hWJe_nc`~8~kaKMSTRIB&+S`nXrSjJn^Hv+K|0Yu-75B^%!hn zXI(!6D@u42i)!CBeZ$5Vwc-BA;S(H%Zw=lyelvsL-N!rnLymsI(SOG=9Ci$c97hFa z`sc2_oZwW7nOWBk-Oa4P@d#{hd~&Y}g(M>!bV~NG7OI}DH2hW#+$HUua(e>8eP>&V=bD`!4&Q-vtG7q zRkfLc%+xDZc8VFswG45&ICvYwX(X9lVYdC@7$|vJ}(!{N(f` zq&~Q-(m9@N(U_fL(m5Wp`Jy-X!sXL@3Kn5BX>Jh3f<0VM_J%KaCGX`=-}tmxLW>Ru z*)w#czR-<{CnZC$cz;w_w?4Lh=>2Zq(jT()3zq&nmf^5vIAl30SdQ|_E!jF$>xu`} z`qHDoI}F}xzC~>$t>Ppw{z?*8+n#D7U0fCKBped8I|2(&$R{e>w)8-yfuy7Gr>tnPSmSE*5v0nl`9gt;2&bMez>@zSn?o8UeJDTr{C`XX})8}q9%-G8f zO^_hJVv>9*7!9WkM*N%kYe+9@AV7NY$3_EclNE)U%;O<+v*;{Zz7{Qd9HY1BF%o0N zUB-yUf}{co6d7mF<^gNPkza{le=T6={J&-`Y*dR=>|fN%VbmW6p3>-h^c(X(kunr9 z&tJT>;8wVX7axpoRj#vzh&1)_PAfs{x(SrQ(Hs0$pnBinHj zeu-FEXk#y!Xi_Adq=)EttSMG6lP}>QX2PUACRrrThMxYLG)i@&IPhTN@?5|2`NfwO zzu0;6&>O?A4}ZP$Rv^vg+$^|uSajuKnsLHERMnlLx^PilsHj0G zYFM@{+dj&!;@z-$4aPo?0&G;MTNt$9Va_f^{~ww1P! zdz;|i#=HM-_TB|Lj_W)V>?gV#-Hq->zZNxp1}?_6UOn* znG<*w?@^rHnf?A--PKjy4T`dleR9rBp>VtE)~#Fj@!xy@|G)pE0jA!ajqE84eoX29 zmV#_tp(|F%{8T8q$!ZI(87$7=N?FyN-nVz$*)eZjsfZ>*Z=bnyX1*A9x*(RYI4b(P zC4V=v_Ovc>Nnhx#LvJ2hm=S#~lCMSZwV+s@R`!$yD3+%c#Zt#*pJuP*V&$cxVi}yl zRd-;%Nd7~@^s#0zm|d&ZlDVR}B1EOVWBfj#_Cd3IpIP@{+s3`yjNfi|;QHI!OnY}) zzP;0k>+k6Fxc-iwU7L#snvCCZclUQ1-ZupL>&)+m9CTf0>Tj~W-(;lgRy|#}vFiTFe`EK6*Yw@`z<|Z_-R%xse_$~U*zF(KjdWe2r)w9xF4ZIb2VTQK#PWfk zT?Z(i4eM8PNu8$k<=2|W!uRxG6%0INV%=#8l&#TS0Az7rG!~0A`3g{V|0-3p1 zD}+#Ekjn0zQH0ks(&c9%2Q}US1F`T2NCKua4v4oh+ps4gy2y+PLjLp5Fs(7UDF|TE zT$kf(FlCc%xlfFr<*(D+Y)OAGYyL0g=10b3W5bY-OiQ2vS!9O(tjI5AzjEn3Nx4%g zQdSNzSQzg6BCvGg%&;>z@yP@yM#L5)()=M4}*G5ElsMEX0#8zr8c*=t%nE18@u3 z5cPzR!UsYG0SIni@thU(n$7dbTD@$o7Ol0CwN}WS__k(Zh&7Xcw6G{5Rbc0(!kIO&jd<^Vh=1Vtz<;KD# z(bXckS_Eqg^M>?h-4@-yH0{*dgaxFt=c8#&|Wb*D|7 z389%YBP`;I5L!43LRce2Xya@Mi@9QicFv9v-pLUtpBv|4rhD|l)yYdK7mHywq*(<27pR>)pMHQ$ zFe`RYM3`n-ChMx?pF0z_Bi&4SfzId{hD(|8>EYoNLGG(ac2k%1N9Ihoij%dQ=S-3{ znk;Le-%zr;n|>iiR8PMZ$*MZ~El=8Ak{!Md4Yq^&Rku%aM<2OcmfbDi-1yCDVbgwb z!+^A5Kx}Ydj{Ii6KLONGo{WlcL0paWfM$N=-qW+X$0$+SPmvW> zffJbF;dLv@o<2rJKP0F_Md60X{s}+KSD>}kpS2ASkEFj_QMiHAkN+AU=Buc$y6|<4 zS0Vyq`u}hc0af)Pe&vHNSKlS5zIjJ3U}k|Y<7ts#jzJF=Xa+OSB0@cdr7W36y{u3r z(hvU=0m&wOA8nWJb-k@U>2QPJ^~lk%>}W_#i;gzQ(I#Y0AjdZF%Mj#On?@+B_92u8 z)z&BSszwpHHmu=+(EtyO##s}vEO-bn+$f-Kk!zMu!oN@$GXxd}yzC1GVzwgouzh_~Pm@>(Mr z%)M+BKLBMI4lcJ8|BUj)Inz=Ih6|_t8v^O?A!C5FH}uwyH+Li~qPI!%HqBYdl(H!q zD4Vktpa8TdYQbxE!+OnuI6$;uk+07sh_+okB%c_&cC zrLu>!g7*xajx$N8Z^0@!qc~Se%Y};PAHIM9r&#)eR0_X%FRbRgkw4G~eAz(T@yP}n z*uQCar|{PWm#5?(4JPl_8E`r7P65nj^^oIop3k6A7+mY+hGC~={LNZ0Ff3`uETwUv zE$M3qh^eBuMLmScg$FSyX;^SpHkfRz^kjUvn6szj@Fr^HnkK+XAGvcWnKsDg((D}K z>j^Z!j^qOjRA;O;q}Nu{TQg&*nf=j!#lbft$xP9U{YQuPpE=3*AuStA(7VG>G%{&ZTM4GUI!ptL<?Y06QvN`|jvs%h#sfnG(Z2xDS@UHS^|7qHeKR3~rQy z8|MyyW3_N%*;OUDsuBm548Jjy7)n+*BxaVHgvMT}dOO4;g7x#J{DI0{>L$F3}=B(MZ z32`Ob7|xb`ios?s>@5|;Eoc9LhXqo#kA!vJv**3%;T+ge(7empRb?;+QnK{zxysAm?t`|Szf#O0y7rhMOiR6qIt`8 zW*)kbRZxD4c_=TnkLICY!|X|pZ$h@3q%Zu|;G2Vqpy+Fse9d$FlU_d-+ep>i;beK` z+>sRr*to3;I8kWDsotcDA zRNggjV;*a^Koy~K3r^9!RdR0?+*?Ub3-Zm4I2Q+&#_wCC%?E@wI+JB}iRUHgg`Jbi zdgl8x*g$x3zl;sQ&pWuu*YAhn%l*-oqsv>43de?pk#pjf^U{{{>}j$F?q!m7?Th0Q zoat0abqD8<%pZXR<+skfc}A$+i2VWCc?2XqT9aiJ_=@~S%lwhmXx-9_!n3ak!4W#$ zBVZ^k>=!)MI9CGEgkKCaN{s!VJB@y{;tCPIUXu;r^jUILiH>T?Q7sfY!LIm-5d9kb z#wr0IZ|v*rcj&&eF@*4aM{)lqc1VCN3h zS-A1Vny*6dIb(Lp;7qD(bM_jOLJ=??i-M3d9D=c$Rk#8ule$V@5$i0Bya0tpXBXWye4@!FCo}P z!w-zmWO>cpkvsq+M(L;Y44FOo@HwI4Bu=sPIjQtH!SNhH5bd>oqqfhbd*Jf*)vg0B zi@zjrNmH681r*G*M&yA45ZNby0z7szv~ef;IJeLFKAJK2BFO8<41F^>aRvNJm_~RC z`X(pscIwf|Pu8PCMLT-)=j%g4L%-qKsry4;pJ$yOy#Gt;!Sx0_de)3VUZnJ_rC`s( zOUn~_7P~2|XZKJiVg;5d>`&0gnMHAg>@^IJkimwhSQPV84^Tg+`FFX<`BRMCxa8gO z^L02Iv=x0e-2fGqBy}P zSa^XPIVN4%IB#enbbB}KL3q0aFZ4Vaz6|X5qogPBR`|{E!j?q8=xLTb%|K?Iohtx0 zbK?9vC1PNM6ksMVa#&|<8}5m?3D||YH~NBo5#57`udibrn5#tFe2uiX zni{DY1{rp{lac);X?8n+GIPLj*pt}p>^(M43yN?QBK8#rziu^gucGN)%#o~Yhi?*I zdihZlM#d~o(bYi;h%&C^mzNBiykz9i@Smmh%$N?561+mg^Bq`U@>%LFnRSF& zA{w58DI&%#9KojK)a5G^V`Q=~J<@kQX?gkh_sO$fYfm-1+Lk_fYTa;R|Zy3O^^^%K2RijI9_pMT#b z-FHG|6mIhOJJy+*P9v>6GjaMX#B zNQ;YR^RYG!bZKZ~yzM+_+wufxd(w-y2+U}}&>~}GiwvZ~C2ws4G;2cwH`D1cZr9_!j z8Uff*FNjuC|Ij~M-c@$)FDmsZu)HI^tdoE}c$qH%$c8;S3{}Rl&ob%R4r0o|tT+y* zF?Pll{73Wxn=~Erdd~IftOIo;c_60A-%FAhmH+yC&S z7~Crb_mX{+v-qI~y~ z;U_xX%Z9V0^mj!+N|E$~x2aT>Qq|Ub0jX-weUDVNPYCT>3D+hLE>22yJO3~yhWAO~ zeW)_Nok=W&wkE^%i(w($jq{(++;4t3DD6G!oH*r1xCu*`+&7e=9DEUXOBz1z|HSf@lxx9H2 zdTnF{9kM}?a8#H;YF3YN@;c4bm;;+J$EcY;@S>Q=`yNGbd9phs6Qqd2Lco9s4tOXS zTsH?>9+?6W1ln~}&zs0$eYQezUJiaW5eK${YKGIci^8t5GcpIc#jm`0}%xk8G`M^q^oRUMsPLb zOk#oosj`8XU8|moM2p~Q!rR+%BbM3E%Gn?R4L)Dik#>$~pnbRl zOClt`)tEj+YO^xkcXLJEpqK%k8iw0A_-bmQT7E=*r|`}`rABs;f}v>mvQ7)E*x=U{ zruB0b=`ei2kIT|97)-_;$Pck9ZU!GB2_RJ}{Y9!XJJf@3SV6_+EtA*OHRp(lkr?P*lc7Z$cH9Y5d%`S>QVJ~b6VB?GqkFT*O)0oey{$* zW=GTH4>k4CLaFCxfKrvp_WJcv+S4@oTll`RPEFTj-?>PPFm}Mfn0B_#xFUKFI!nq- zk5+r~I;0{KGdcfKTe=&9Wlh;HL!o^?Hmh|P6><~~YRo|IbQj5*Iy*S;Rg!3J&fEii z^=VgFxFYq#71GD7f=q=*`3@6PGv6@J8z=vogzj&cvtnxaIuW_-;3w60T*hV7=+n3Q z^oC4c`7N!$fN}C&v`l9pz!q{`N^~5K$Fex%{Qoz%coq2EM}S+2%9TTa>~)VN7$jboxf*qQEw9QA5(tGCH^j z2tw6N0yWy`}cs?!k>sZOU>VN*M1yI7H_9apA>6}@iWFj=K(lk)%GCUCU( zYnnEx`0s6kHqow#mFYIw`LydHR~0vcZBnCl2ZvTxR$_IF$BkT7cCx!0{Y}uA-yk}Z z9oRQELQ(!Z>NmLRba^g6ZFxW^R%LQj|32+(G~Jhdi>smWnJsa_z3!iruADsl)HO5C z>ZkW*OLtMhanNG5nfQx!nX9-SF79fzEc661{PGSh`;1f$o~8LR+lTtBx~*nT)wGUw z4#KR;XnFnua#GHc(Zb!gjqqRbgip`@5Tk}V$BFb*l*cl7@goQbZ3nKWin{}Nkf zow8h1Fi4)8KAtHT@Rg5EuWh;Y(r0-Qzr4E6TW|d^52v!iw1x`HdPARsjed64JpF98 z{uf&^*IGE6wQ8`s96hkOdAK$6-c!`KEt58Gj$6+eem1y&syWP@J8zA`q=$?XGGz@7 z7Tnx8bP~$7mr*)d7n{jxu-#hbJ5ejKEz5I|>q6N@8NmfFQ9uf-{C}qHoqt1Deb1#TdJv1xDkZQwfKlcWDx<{lIM@mZ7&78D0rTNeF#z(nHe3E`Nhvr{0Ry;dg~#5 zbU)p`Pq$@s6`^1oZd1-@q1}2A%HFaYwS)BF3$S^I|CBi1UjPRSrYFJ;i`>1sKWGuc`^E5nDZGEK zWDOE#w%7D)*v@jctk$$Ho=8-Yo#7ya_t$g>4W5=Ilhk?O;o;@Z=Y`Jav8k5uN!44# z@~u+&*7^O(+QvtOS=F(sK7Hq5IS?=6kEY zkmPGy!*c3rNp|%}T?ZeYS?)S5be%5vy*Rn#$ zeo^Rt@fZ8KE6V4_m%E=Ay7POlbJL^FgUg)nsUrIB-ocWwE zgf==Sbf3#>BWmXtmOEd-POaEEEOicR3Vr+ZyIZ7M^3;Lz-n6v)dEv!#%e&7ByU(o| zoc^sV(YnM*seZc{-62JHESQsxt&bY_E;sJI-y=32lo}5%IFg(8+z&{b4lI-;u8X0r zWEqK7mu<$N3v>G9zzN~mv(mum!jM$ny#&p*9;tla-+i=FR!1A(@E?~6l4Vs=*#>Bt zg<)Q{cHx=Ts#>XP(>=3LwG-z`!v>-AMX})}so^Cd`ciUWP?I4n%`Wsy<(-1+6w5my z>hsZ>3tymLw=NK2a5b1|w9H6fGg$L$y0U4@J@fA#`qrUzy-+ojnherWsWU;Q)TT_S zKS9Cl$b<^!kPEgHT4t`V@_LZwx$Vof+wbicYxhdEdw&inUkb~H!V7+5=W^}Ndt+j4 zzf{}*^L(Rh*}p^Z?^p>&7B)#`U1G2sbMR8%aPb}AB#&|)jJtfti%7a2?iT&8p z%l8jTJwrm|7*5f5T=E?ke8-<+wg2dGE)GHEdhDwJxGeTdZ9Am4LE+?C;aN`bjfuW7 z$v5`McWK#oN%UQoe3u2^EY~C(xK7#Y!r2IQS1o&O-l6>uwZ{sH~5v;Vq zY#c;}{T-4Y?kY{5mX%%5-+fs+c1}2dK{_@r9eY*W^_sNnHT9RafATN=_*E0(YajjO zHIvQ_dzyM%G#jjxRtb(Ormkxy)DDI?GvP{2t5nk?)@+e#wosZ-*+SpjMR$tk`feSR z%~L1(rMgX0UH`*A;pkc6@TlP6LNUaps_2EZ=c|Gv_r&b_(VCsgfQ#4{fz2))i2z;y(~W(;qc+_SEC$^Cz*c-LWc-1* z_n6lxIKlta30^Z|gpi-EI~tA$bfS+^ih<%2PNNvDIbk&}8z|+n)r^>B=aF{Y{D-0?W zR4w?BZ%7V=v9iU%^!tf0rhL-J8~Rt%a(}YHB_sa|5fx_#`SDfkFUGdwtAC9@SrWH?#T#5OeYy8GWN#~=yj@NJLN-*>!3wi1PTJYbsyK-t zFw20Y^+p~hcVVTC--tMV69qjKv{O(?6{x15mI6k$W$82`(PRRQQD%(9Vx$}+rWm1i zl9Dibj?rG{>6TPfWZ`9!BxaI`e30TO_;c(Q$4;R{HaMkcDTrj*5~!ltmfW=*FATW#h~vF|Ej;Avvq>@8JT=VCFcu*Prp ztm%}X)5H>}LWju=j~z%8*K|tIea>K}F|YYKW;T(n`}}~3|FE_mMSCj; z?F821|HB0Y@_?ru?$IhH6cO ztVzGP?o+zA^m^T`W@bhYnguile?%ph84i1J50g3v@FSD0M!4uj>vPa?xO4ZjJzD-XXFXX$*`uZ=FWi*V}_ zXj-fmoo$j6vaLol=4u3UPz-6m*ZxrduGTNa{T*gpc8zD@nF&ohyMky@gLp z)@sSxm@Fw5tl4wTlF8%=LRVnJdA$wv+o&Y)Hn%eVUu8|Fqe zgE}jqmCsQBWERZhCX%9_25Ta7V7rz~D`4w7cZ;>zD0efn@7-J^8}}}PA??vuIcCdS z)`%TKB^mDr_QqgdVe;Jg`C(=OoLqvZ9E>dnV~WfSc;-1X++8FmmJO5;;78dZ3q`xh zOgPk>Sa!@m_*HcJ=cv>FS0ttRw%F`WT0L_%`dbY~=lR>$zx?{`*XJB7u*2QD5EGrX zk`sO%^tQId>#!ev`_#hgX)Ch>GzSAXG6C#F+uC3!S{;{tn!TcBwNNUn&K;O@%FZqH zW{5Oqf@Fzn&caq>BcfbvIp_6ggY*BwC?X(k8W)CF@Pv)*_LHbyl zma22-2aQc8d)llpND8?zfRlQTKKu^&Z(#4 zXDYK(DYH{mW@p?%9BoWIJ2?+pqzFsh*4dJEzfhtro2FHqacA6~-ZnGEowN3M$!sy= z97aXil%=Gls&x>=Dp#?_OX|>Ev~a7VITK?fqM7MdgHKp5jQ8?nYL2@av^Ph0#~Wc zJ|_c>ar4~@Eh_qPrEIPmnrVj#dms-{!W5#Hp|c!4I~E;@Vjm57Uv!GcH8(y=I?p5g z^^Tc{I{D<(G~SEFumLwd*)h{NG=+V!jEXdEkx|CulWb!yeMdNmjE4RyN}mdHW9LS$ zPQdE($i&3i5#Xw9`zV%jk6eQRw~@23ZJLhpjc_AZriZ7ehOhAW2<$*&`)DBLL_seP zUmlCaVAMRue;(-1IC&@H&k%<6b$mp#a$_ae5w-VW0|FV9VksM!cP5 z#hbs2q%zU=O!`cV{@20;;Xi@t(EyZFC0Y=JdLY}LWngH_ zJd4Tux1~JOFWg40O&GAOY4|?fo+YsQ0bOwv7>Jm9iQ>LYw=+nbDkg|ccgjDa*bnGA zK^^}cT&2Rf@S=RZImmEL{*RD0RVo9%8l+T3c4b~lj}QJeD(7|jeyL_i3{wlGLg_&> z0jwS-!l%(J@{1|k<&oFqOE!3TGCrSj5di^D0k2`aT^gH=rCd4Vk#!UEIld zwz*p}_S)#!6=o!X+y(G&P?4Of&Vb{JAig2f9eJTlhy-$*NS;3UFCnux39$B0M5}oyu6N~{PQY8Il z^yG1AnNWUMEFF|e2L;FAgm&5I{QCGnfNIFXAx7<2JHvdlhOnEpcLSyA<3mn0(2y>R<2uO0Uqc13MyR{ZbkHv4xW1DrPzMD9jv&w@YCp z48Y{PU@C|4S#o}4G|LVZT47R=Ip|s1A^G< z=Z?-DWs2^#P|>0r+>*zS$ikUrdy8Oi!QLGl`Xy^O!br3e+yDggF7UHF6)O$x5^6du zHXM-}jy#-@8eW`7yEH6DmV+CG;KpSAriJ2U-NpqQMOG{aHw(ed$>;{`2X5Rdgs{&B z1A3l{q_2Gb0Q)A$O@pmvC0Mt3;oi6qJRk-SNWlXzpHbaBH!$BTIx1HKWj6=rwtV*J znxPg1tlcg68U%ZTXm40Wf1SVenT4y8tNxLzc^PVLEjvWlPRX?spyY&S!%*3;TfbtJ zXRG^L@he6LC4`|tDKt25UMZ`AmCL35LRqg^)+?3u&Rdg_n#49K(!Mw%!LfH(ifo^^ zz)&U#R1cgcMrwt+V`AjE6rp_tKndD!h`=Vd7`?LhE4=1Bq)%2iE?VBHTJl3CLD+gg zsy;YhvSxBRL-O~9vMo55isWAuAy_r<`e?-qW@xc9lnqv@>k}hi3%(PSs=FZlP+dE2H1VE|{cu6t>hRJRvqH0!$`)o)&|-z;o-=AlolACl^6XN6udz`JV0 zrul(|Enhxbs1Sk=eq1zXG7y}X>2f~`g|7Qa2)@WAZ@u8%fO8S{is@HyY>6w|~Xkw$y{ZdH$T>JuiCCOWyN>Blpa51#HL@Uyl)M z?mL?!{T|)>9#enN_+58of2;1ht)~55#t-xz1D%Es;Pq*f`Ct3@ZXPVtea}&Ps7m*} zs^US5@q5jEo@7FgS@f-itsmJx7 zdJS~#H{)7kAdWD1%x$_41*{On(Nc2(F5-cFXlcI@y_%PhHGc$d7{nFFHMIXlvNgdD z^1MV$NG(2j*Q~`IXANYXCUcO+a8~HApm3-mfhjrv(3Y6|A*z)V!3Z@bRQP}Pea_`2&oVe zK%VY3!WfEVRDl0C^x!WLq&(T=X#{|Hy|A2=Mm}XkhG)WQk0>V>e*s13S15-+ryxZE z(_21D=*j2kDU;D-$W1N9)lslY=^E&YNqv2QbYM$<8NkZQCgT9iaKoDv_p1o<%y=?K zfO*xtjii4=i~0YDJi%Ku`OL+SBb9fW-)_CrI_FyPmfhaD>fWKago2N}+Yw>oe&P7@ zLir0gMb9b8b85|ICO1(C;IEI|M8TVsEg%H?mYTlRjvt(&b+2Tl#Tyos$N|9@KXdCd zb0*k67ph?^2`haV{talBPgE_{h@l=S)C1Q;Ru7!Myz5x%7Oa~^>t@Ni`H^+UvUP`O z-6dIf3D#XnS2WQsxHbsZ4Oo(l=HeBrKj}FBhhb^k5pmm5X&X$hAIJG)qk)|1BA^*8 zH=vn_fb@;My?b}+zP+=4U%hcuJ(d)1V<{Spe8O=C@Vd?8Ua+$THz36!}PvM77;lXKh#r#0nYx>}dv@Mn~ z0~IeC*IhzyVL<#-ctj~U2gNOUGn^GR>8;>oY=qSw)hv|x8s;~+bx_Zr@RO1=k7F*g zCX{(9`zGGCXv<0|!NEHWPM%Fs<_=G*R0`tOxXQx4_HE3VHiC^?)p$FjIvt*_&VKQ! z-rl24rQ|xO=5A!w8aXEviQtfebKC*M6Bh}#97<;XrkLo6{jZG>^C9{iu>yLd#Vk^u zIiowH(btP@l&a?ZmFf0PHNDZ!jxBA`bezh>`i57>XGVCgom{x^EZIhu(X5x zKtk4hNW+@1alM9P2{z91ODG~d#$AuWl`K#DmHcOEDIqqEngZt?6ie{b>`fK%aB4Gk zSvKm^i#XXgEiD(a;B=hgh!9T|F^6?Ad1;a;ni&CNOBm#WWP+RjW4by|0Y?GR$|CBaG<(3wkb9-+UaFMz;;9domJOuqn$Mf!#BsrhSy zy#i+S({YW2GVEK7YBb*q^s_^Hy}KJMtJ$G^!%t0 z<-{l_A+%P^70o->OeSDHxAX2!v09v1z;`90?! zyT0!d_q`zPdqD`E5`(9tAUIYpO2L=r9CHpby@O0vXu&K)zVMAESSwaaKzHaOVv&Y%yugcEL_( z(&78k(O)^5ctPkr27`f8?`fg@MVzAJCCTxU;CLzNs7X8EdQEh6N{&v!(V2{NLc-H_ z0P+D8!jK6ZtDISe6G2zYN2nnV*Q|0KM04k=~S!r+wUEc>YvHRJhqog)F)$!!FyYUW2bRN=gVCB!Za46N&SJp zFR-^w_wBa2eQx6@B9uc}=m)X<=i4GFgl1wX1<2$doFQ*7NVFljcx z0hRKRlMQ`V6&FA)nT?(vy;3P=w#g~Y}F*5rbKb` z48|NRt+3+atuMqa{n+R^^UAChq?A2f4gAEdPcRhMkEK(Mcqy;tZ%m@bMKoQl`$pdO zB;K&FH;SMQr0O%ys$E#&#{CEuMbb1p7&jFzPdw)xe&bWMk}0mT19OQHgnVE<=k&SX zK)Lj{z7BXR+(J1U$2>NtIpakz;c?Y(t9@hoSonv$c~jDg6UM*ZrD(=(-@<;%5EfO#{ysWG&$#vgrzUULDs@+*G%)JS4pA+ zT=EzeIn_pu%wW#2lVdQr%T_)bOZ?~1ct2{Vt9K~42DqK^kVm^w_{fWbmW^H-yB?cq zo#wC8cG2`y^zz6hb>>m*fK15hS!|)~jm{Kjbc1@MKcec(%f3U_Kq3Y?UqS&RS7ln1 z&;}<0U#gD_o^TMyj_2%UN8ld6;*;M zLIiL4%VoFAZXN==df}Pd!#9VLp5TJzc9r0+P8@ku*Rx#Lvvlcxw^%nI)eVU5ftv@D zmeTplf~6K`(h*(&6SiTsxOARdE{=%B5ugay-+ukh>x-wwsx9|wmaBG%RiLmd*K|!b z|Boq{+rMUNaQYv6D;CDyJt=xyVDooP=k`=5o7#WJ_H~#OzIRe=+AB5f1?vxbPxZ;> zj^7D?J-pO=Z(3~bmzw(#-z)kWlI1P)`fhDV|9 zveW7>u6z}j$S*d*ExJQ zkH(^a;&0dQtsm$xeAnJriJuQTiVx__A8g(E%y#p?-fqUVMnsYp3&6JSLqY|J2Z8C` z06|8hX4-^&g_g=@f{yyMOh>1h8v$=*80Fu)zb71MQEFh*= zB7Z3JSl(@;SvKXzEM!BIqCS{Mstt=MU2O1 zv3*w8cCS(>J3yx?v{K$GwC%ZHFP0yWFx*VxRZIE8%(A6fur!0QB?Mj(ts|0kM6ixL zuGl8@4iSp`(ui1bR;oBFSR*S@C{69Xzh8_VlA?z|0Ib@p5)q+epIE(5u6l=p{tGH5)~xP41T*70uqu4OPZfY+KmsuzfPo2sgn#*%HQw^a zjp%;E5Wfj|gD4J-OoRM{$UvrNuwIPQ4kg57839P-sJyLS0?(8*>u2N%T9Ik4oUA+3 zx=O151>d6z3ug>#mbaMx1D{lT|{gOLfHhnDa|zv#~E8MZq7klP zAVa~gQR&EB5lUwdEnHoEO|Wkj?OP@LR>8D2e^yZzDB4;@R9*$CImpBY0g3t5;@4hIVdI5wrB;yPk1lE#ZRW#3^ zuQ6`1W8+S(O90lbl`}Kou(8RYI1UR}oSxB{#h3}NvY}WsGh9ra{;a$}MMspy4hTDz zD2AUyPHRNH=ta+7holYAZ9?o}5udr(hcznK|V+`6Ggdp&0`f zNs~O_&m%%sP52zHn(YiGA+yDVN}$zGetBfP`XHqoL69;tbUal|>)gcH(uu`cl0Z+$sgP&N)`?!G)d6_9nsJlyrDj;nk@Pc-ox# zu|M=x@51wMm)|J|<_2*P(ueDqqkW+Hiy~IIm^6Fv__Jp)pM4$S`=)pLFe$^ z9AXgvLzErIU+;!nWDL)Doi@#5rp? zt;>*+E{@v?vyB(aJJoR=Nq8!|%+8TMKsOtYgs);aPmDvJbLw1XxD!&V9q)_=Zqy>X z^1ewQcm=&IFB(6Y^|d#8a1ySylzYk$@}lXX*Ad-6G72eDc`=ScRBuEjJSuYm8fizQ zF$xZUv@yMV(kRa%>^roD-5Wi5VJtcbVtsJ%NR$;3AE9XoyC__=3C?}Tcwpn$*qBB_ z6{6mp%}I+P_ePI0k+hMCTy!55xB`a67=I07uhT3;=3tzfjdDjB!ElH%ODfsivm*|L zC6T)6C>ww5EjGDP%b>W?k#i`l+(1M>MEhldS85#Wp!Cod&j`^WQ8o>OS3+55nlKiP zO;IVX%UPX;Nto!Cp88DL3ie)ly2IREXd*xdo&z;=b*wE4(bTDQDpu3UtC!EBs8nyc z1~kt`6}dm!EMn<0?3>)GWr0Nz8zgW6H)e#RTw_Sz)#&bDM5?U{jJ zG?__>uc4JV>{N|TPh9Vi;qnBlmI^da5@`mo$bcvVt*LZxPh2ltHEpdjHIn;xNJc`x zj=?UQ^kGCKTb~GBnW-4UvPIp?dTLxV9>Csmw?#ABS8_Yfl%SJUO#)>2>$D0fL~|@ktW&=1M~BgOX-*dVbSrX7 zm1v8}6UNUl@summAnDbEi6>;>ihkv_l!RTG#Ov?VS~`YrVlC~cH;0mT|AKFsZBMPb zd|$OlA=+`FO_!z(Qd94}9;vDCew);ERDeo*1%xnq?iGvGd&P=A zU$h!7gPLHliliobSTOfY5=-^9Tc1fZ$=f(dcV(h+v019wB)T`vmwfaXmVchR_ks`} z5W@pfcmQ^Pigb?1!l7k53H*UWGj|ls7?KZ}S-OCL&SNj9FD74;FGTC>lJ#}L`g+nH zrtfZB*|1-DZdAB3gZ-<0FhGEx&V#hEh461#2(Q|LBbsPIafR9~Ld{m-4s!<{hnttS zJ}eea!=1$|V)zv){0h-{Bt2)_2;2DI+|$7QEepqkGjw zyJ#fqh!%AP=Uns$K9B5QdiTC^-2>xh3VZvi@bjIBp2Bj|z8d3bdZA)Jv&; zbCn-!$4Uw8nv_5J7bqzcQ|C}X{@+sEMg%GI)hpQ1=V@PD5iUP_ozy9=VMl6ooSk!PYPgOpcJ$flvp zgFL2{o49J~e0d3A`*$?A{1+4%bBiHjE`1yf-=2BvGjD!I3^u{b>YO7PDW7w}1I(O5 zmTiWzyse7`a|c#~RgZ#=%fZG)ZV~GG(x;<3 z>8e|F2(C>ySKU>Q+zrd_hQw>4yHj#^3hvI2Rzr;>Uk=w42q0e!KF=1o<0G%H?(#?O z+GTfb0$k;Ea=h`FM4k6MYUp2X=)eEMLtbn+AvK&3+_g%2p>B)l-YU7b3hab$4Z&K* z27M`ctYCV!H0YUx*uIi|9^H35rhP%}5U1fy$A_Os@Rn{&cN&|$rwz}66g&+T^wXv> z^B9OrA`5Y6VRuX?4tG{|$8_azXJdD4YZG_H?2c_);?B$FEES3k7JLN19ki z^ynm3?y1Q!+O3)%nHoUn6|`|QJOu)EBsNWS zm?npz=8_!y5-H2@FgG%e&fPM z!Gzx$(NvSHih>8W;1x{xjf$pdvb+Ks3iG3a3BMJhsUrWCNZHMyc`$g(aEhj~{5P6g z1XFbaAHi>n$U*Y~a|WvUSP`xmNV7Nw&g_bTGJDFv z*q|G;j9EbxVha2Q{^bLJ4#4LaFvEO+mn+5qv5ysJottrvF$d=ybDpzuC7(B+F5z5b zPR`AF&Y8H<&znxWI1j+wmnz0=d;;=R*may4O~W`)Si}OiX3+p_h9t(?qG^+kz`a5K zFc?zCLq~KUWXVPV?@?mUOkbE{I40XpP3K2jsU0Z`!Tj(zmvW@@AHEoynoM~ZvPsgv zv8!NpgSnk@rrF*xa8Ax)hZdCwGu)L`xf{ihyw3j}T0~x2N-{ZK0Lnhbr|h61`0K-{ z#Z~B2VU%G!4^PVjI^~RwTpPm%2fVgJbx^}#ptbdL`2X;sDWhbk=G$kP3bc)swSs|F z9^`pej2)!7N!x3B-~qE{@b5A(f{$cHOgR@x31r_V@xagFjn|D(=QI8fCh*^s{>OXD zHF#~BQhYUEq|&6YAq?@NXLXZHkRVVAbwYyRpUqk{xhwbuMCUcRL&VcksAh5FYx=B8 zIcFvI#;9Rf!8qbD7@-z`2g`!;$tx>YJgr!E2Qxnh?twk+R|~LCXLTNR7nK@mu|91d z#EruWQ-hUR5jIuIti+XCOwprRS?NJ zpd7AxJ6D+>&y+XM8z+OBcb!ju_q+j&E?q*^_n9)FzF>f9F>eU}61*v@6X-j+ZPdLbUF&R(0vElG*5Fm&4o-cm6TRHW-5-1Tq2$htpfB8*iCO#qcKdRA_4w~Z3x~183NsC4@|ME21c&0*)JPzl|o0F zR^<2eOk@{o%Cx;KTbLoDGQ%$*x^t#6yIywCf<~y7N>iFRmLw^=>og%TWUcw8PH5UM zpG$q;^e!HMFK{=YM9G^!s`BZ6zB=%KgQ3nt+CsY(^@)o9lB($KhXi)s^L%r3srtQh zchAZ92wBl*iW%&%wO$s4ipciH{x@pE|44=TOA0u;{cWP`-p3Whyk+SH872HIJ!Hzt z=jrMK1q?%ESR-5CiRk113OS{U!M`1b4egQfY1xk<;RVp|1#LLVk<0?26B9E2$xu&1 zLQ`gL?CjO^X(P}4UsI9D5EcJ_QShHAFd`dS8Hhxrc+vEyRw!Vk{-{ZjvP@}+2fL9)IeSYJrGeRJkDgU?pFQc)*WKB^_qN7oAGzyMJP>5fRCA!|ecITSls>ivqd+&EQ zy}#|j_V>4oyN^n{kCLg#9bk+J?oE<=(>=ZD-X>qNxOU0ij{H#$PpROhJCK+1vF1nl zak*Bmb3o!eY#Y+U$@;Csj~tcDj>?6rqN84N)C-P!>;pr^c}?eZ_9We9X*zjYbhkyUuxQafBOAd!S@`_)kvijX-$tU?hh{EN^CzQVXTD@uUQ}=MJz=BBX`}h z8zzMpccKj>YKCp=w#x>|yfTtvZ5mk4o!R{$}rohX%OXnq^x%_D&m%{48GJxrVpeqYNDkWdPdXwHMu$lHQXk^vOBUB5IXafA zMaM?CU&kc@%@H9om^k^)OZdTg?~ME_I*v$=BSPkk(X#gS-F>aP2d%~ZA>)Idz2SbZ z@qMouH~jN75RYK07}7{^5t|JIOZVXt0`2~M78TB&-67va^J)5kFlx@e6l|u!)=q-* z%{wy2@3iP6p<48pi;fTiR;%mM#Z0dnWJ^C}^+%6CdeUr~>FQ%MRCFXt6BO)@T%VZ2 z#scx-!9&2@MSBeLL#($TOFB~e5#CGffZgb6u@7X8v#jrh~HsoUEk5@N*_0D``z+B~2BVeVTJcgZGI^V}u>Q8}73k zAJ|QOF3W>bJwk|J5aQA7&f!$>{{a=2cOX{jiiB`^0th}%0j(@4%LtkF9G^;=j}x89 z=y`cD`hVyZYO-8T#a~by1r5|*|0iV?XN#GOvT` zJc{ZnM~2Gy@E)SFybh+~X$0%e_<7xF6BpvlpVyx@b4BMtA%mY$lvTyfRqEqltc)w> zOk>uI3XOaY3VLJ3;Ahyu&v1;X+$3`)Irogm0X~NZ=}X5-IPX}=xl+yt{)db6kAeF! zRt)|}0Q?UR7ev`gnb=V{%n>(*tb7$%=$)-axQSyn1Ye`RpUf^i_wF?g8Zn(CPr zCr}TtoSd@^D3wiy0y!&;sJxuBIe_^$tW1@0W0tj(!!85_%Livu>n7)l@ll=fprtq$rfM(TJJh8G{O3zj850VFDcdGwvJJ9bPQ0zKm+qEmC5*wy)hUcz zNOa|}>u54!2j|KuqZ{{1y--HaSMxSr)hW1Axs9Pj_%GLKh1@TA)$bSn!n7I!6s8pF z8_twl3p484VzyCOnt-4Grbi@NOo4G_jC@TEb@9v?`6ui2o=@A-V1&|qsLJ)f`LPtq zz$BapYsWj3Mb%>|e|v^8jg`@sKd-3Y&yKXEe@-Y9Lz{v_;3EDj6kw+5ATWn<$Q{gN zIH?&fDG8!wuE)7vo=`fNK_EUE)C5R&ZFp=F<{R)HGibnezTPvdxM`1(lySq@BgRnu zpTd0mZBxiV>HDm$Vl#x7(3j$#%3OL@-d ztM^PQ&KYBx5r#KYdh}EKPek|i9qZe7@Z>4RE1t1;kZ7K)RXI}>l~of7gPv)kox-UJ z`V1jwEcxcnXlx8ye;oE0v#-_mWzaym7?7=#5yWiyI{5!gCD=;a>#^x^Fp5dNQc2hm z9a4k>S-uJ%IZ9iKz0u|}#;r`*&yK{#N3nwmi=Qde!J&bpJY!&*fmJX{FBN6`?Xujr zyh#Zm5t1d(;GfJkqRhM0Kuf2XISF0-l!!FQT)G0D?=koZcZ2(h48_!jCiM%{ZYBsc@yPJ zL~sE{Cu7#ml;>f@BUw8TZxB-K0cIvMJ0DwJK!M+Fe5VceghcBG$x4QWNLY=rKo8$H zy>AozhjEJ5LCHEOSO-^1%af!g2vdQu!uP0h-*V+XvW|3lMyT8;R=zG(zMhOUKzH=5 z({G+m6fgFR{w~SiwPr8!!eSDFzoh`eJc2RRQ^xHP=tJmBBXh+FN==tX&$V@D>$kpM|A>x*#`MC%^hBYS&NH?#q)QkBU&|PpK_HGfpTkiEsJ5C8_E-ml4B<#4f z;w!s7C{z!KzGo!gGlK6KfRaBf_%>28KP~#U%9r?(;DckOuBDen-#+;gdLMA(1f>tK z_;){`^pu_XB)fzqa3EuHSlTYK2W&CmarJ#5WSdD3%sOc6s#nJ!M9jmaBQ@6hXP z?O@A>jV5a^f|PS&>O7SD&qFNc+StUX!qY)|y8aygKfItY3c$urTO;AY{?;ly=Q>ni z@+siH&Dy82+GLI_BOz{s8M0hff;y#gjh$&*AqE0xfx-$YsTjufvknahOd;`e2uqMv zg;@(Z=}OcpC^^quuuI{Nn_*_YXtwmJ$Pq7$_xm)hkgZ#BUK?ciplCAa;%QoF)(-_G z_q^fewYameB(1iru}w&)p!1nNpkHmeS@$}nv&Y?8b_FA9-DvMTnSjX$aUcIjkVR4% zh>ZJl${qkw8-S{<8LB_Hrd@KiaeK|XIqnkT0rZ<9XQHkLp5&-FLB1nUSVD#?$zuq) zau`DHxC;c3C-Vi)on{CrG3>b_N25GfV%BL#&r`Nz1xY-wlSiqxJu$w#v%aiLil>6a zU_2Q2G6q#>x-nBrz?lasX(7_m)4yh?6M$=XbI|am=7H$LT z5&({a@zR1U8P!|p2Za>|R)fNfiMtaD(;`zR`i(o_vcm|s6(KFNCa>3M_HbQPAchO4 zCGqu>|5)=yg&h*NYxDTz3=w=!A!J$aN8*uq@g-J#{uos0A}qFSo$u#3zR3B$GMAy1 zl=06+H1JrSX(@F{;>Gz4!b0=>yy4dC>-2M3+*s%hd_{4af%e5hhxM*elLv{@utS{| zkWr3%WwhhIg1*327GU4GE>>moP`**Q?l+XQ$gQe?q+*8Xj}FcF(>8HI4Kl<39ZU*k zCd8*H@3SK?IixaL^dp)X&;P&g{doDv*<-tTE2=wFF(|L=5VuWp4j@_uoj$hAM^nze ztB|VYVcn6WV`nUT$6%+CkDitJK6l8BBW`|G2%(E=FAEi%^0H_qBFIbQlflJ`W>p9 zN{q3ky>L~tSl;vjN#4EvGHq=!zYPlvLyv>OuCoQ*ibs1dX=K^ zUPp5@?N=V-g?CYf7~QVgg-Q!E50i%syaF|~b5|#syAgQ{jO~7zpbEuu=}@95chgU`!LnFJX)n4+%q{&ERAu z4T`b>XeL)i+z#GPd3)7)WDIOnW{M^AL8wz@dp5G}Ln@+x@Ngz&rlv8P|FA!}?jdU} z97F+Ts!!x>A9t|v4r%s`H<`b3gI97{;gzgKbg*sJzif{Rc4#PUoIA2&bqXa-qP1DF zHVf8f5N8`<*LlM#1euIFTP^5An;YyE*lV_Siq=la+KG!aPhtPkWg!5YQ2RyefMgvI ztOJnyDT95;T}#g+pfkLCt^_1oL%W*G@W|1+>}VAo?UJLNz7qL~Rp*R+@#w9ibQeS! zLgjM~{50$YTOwJzRj@`^%Bt>cdwctx?SeIgClxRd5Kb4POSE=NR#=J|ru zvaL9in|Ce@E{4VOjgK3k>lE@(FpFTsDNTc|dF&AkEbF&ZMs+2@_wP@ZQmXe_9M2{;^RH@w8Q6 z>yIs_4zLms2<{dDSKEf9uPqs96*~5cfxY)nih+Za_7KuGBW)X{ZA027FdgckOBO}z z_#g-r@w6pdHcKrB1YhIo|KHoS#>R2f@tL#ld@nz8=dVhzt?_Xf zCqd5G!0Ke0342v^k2yG&j*h_&hKjZ$Cd0GrM0n8yV~OiQ%O#r5x>g%A{f}Y^4zG>o ziPM=A=W=7v|9_i0U3yy$`|z+CtM_ z&=#8T>;W5P6?_^1=sN?{h|X?2Xxwva285OVweUVOyie7}(E9bw*XGQ2Q1d>UsUxRk zvBOQlkff~)tvAy;o~|9o0NX+CyvTs68~GbrdO!G{0J!~!q>2xt@ng^>Cn9|~xuNxX zkJ))39Y2_fgCtYJ{fWdKG+OLA*H5QzzIv-U^Y9#6O7y?1yrywLzVe>p7)tkz_6X%xl2?aRozN~H!|AmU&<-*+roi7v+IP#Y= zT5m}Ow5EHriy${Op6I1t#nt<-9!1EP%~Nr~!{q|_AN}W_J4jV?rPUeC*f!R(6M(Gv z(qGZO>E}dTm_<4VVTPmpQBDgjUZzwRVBOAYK?9oGJVa z?FH#z@8ZlC^&ZH2kn^#v-8Nf-_yd+uNf-k_Dp~Ul>Dh*+!5w9iR(_!CdXa@sFm5+} z-)A-7fUmUv9!~Pk_ZLkUK5cX9+gRQ#+(xNM0qYR8jhQgMVf)hIkxY05-&lMDTW?1? z)*>CL+0_H-$WSISwB%R8==`#UrTpI+$5)$Y)gxDZTk24z z9@KKTuU!L_6a?#5TCO|^h11O)-<$jH92uNoW2X}7fOq`MWy?>in)th?Q=LER`#~QR z4YdwupfaHOflTuQU{zlBgS&C%-fxX8kEq(_RLeV0E+6^?29Z&KSNOuqlUJ%yadpgW z>`7N+M$@ASrl-+}&JWE9ep(F61i)r_0`*dYmL_fEb{HCEx|_+Xez4bejM+1Airg+v zgM$zHNxBpL-HE-nv?6qcoSC;pZzt^jL1GrRUG>xDR6I|2S2Lf}?xN>ZG=Fub`#_OUi(H)?Qk_U7RQW@#b(hVU|hGg6z=Rj(*`Cxr~G|7IzK#Ts07FA7dNe^p+c ze4KyUO2!x7f#@meh9=b_JX|JP+o2;6M0(ZIl?uHVGj~6jZrPV<*{605s-1(XZ4Y{# zYHGj!ycL0=b8G++?=&=9(7KMGM^uNc3hniZXd+bxK6+?bM~YvB;wx>}nk?uILNF*= zcUqO&TO|@578J50wnj9!SUa>gB+8|qB!PUSz!WqzC&KL%{&DLXi#ezmbJ)Elr&rZ(2{1T06VBi%NP7;z9QzHK{=~?T+Gq}IWnO=l(JtRLGnB<`uvhntT*6pWH zFB;s0Sob?JbqfaRw+6|s2C1wD$)N`6pa#j5Mw~$6pTU*xx@Ymt*YHs_NQ5&;X){Rv zG7^LqLNgwz(F)&sfRYPP0ie6ySJ>Bn#|&x0OAKBnyhV7M@Cg&v2ulopjc|qVb;56% zU=rF0nknKAdWliP3fmdiLC~h36wmm8LB4B^5yAn&BZP6nQNlBX=LwvE7?%kxJohd7 z-X>fj_*h2|VTiDwpp_Mor`Gt0SuScH;m?Hs5VYCMYL@pPLBDqo)2Ag2UZAg<`F0XI z2tQ$*o4%jZ_Y1;@gpUY!2!AB}gAivvKilA641UaDJ%jUva|BwFG_DceC47~zty^i8 z!J7oFgi>n_)L)1o%RA464B__#O?}dz1b!0jciSHL{^{KZy(i~pr}rD95;A#rtuw^cGmiMW~X zFcpyDq$eXnX;GWe&sxnEXJ z-|h}+(XTqYl7XdXmZw$*Qe`W{*XCgk))ZZEY0(8iBh*>nfG%ovdZZslV~SwqS+Gq> zvQ2Fzg{0gK(!&;b%4IBd3}QeM6Q6ttx@8L{Lq)JO3%ZGH0o`OPsmddvEWQ|)4zunq5>?YAL&|$2{2qFu4y-O_J*5wq$|rR57U8^W+QsgigGb%-l2JK$3iFLUd`D%$ zTg`s!KzmRg##QBDvtLG52H4#rH_#n%D1>;qJ|_ojx+E-Z08)7VIINcI!>{d-`Rbew z7Q#u{&5O;4ld=QtC>#J`v7yQGz2TRz-CcxlL_G2+uD=Lt?%{1Z@Q7@Z;A3-ORQmbS zb|CShhvk>X4IRIkn>t!q&bP1wRRLL(n&8VA10f%ppT*-#K`!;i!i`vl7O@#o0?)hZ zc;^o66`ftH2X5U5{gLcLFX1+ea6;ZMYc1ixYq+mRkTD0NUXFeTYO5G@AW_DbsRMo~ zA7E$6g13=xBnL*NXiV@0)7FXatrgfOqm}^Nf#s2dS4S*2BRpb9omD}f7cV)>x0Olf zwBeF$;0SbJziH|Zs%T)1mia~T1BX5`2Ph@L5!^c From 2039066aa16123503ec2b087766652fa202c5fa7 Mon Sep 17 00:00:00 2001 From: coconut49 Date: Tue, 17 Oct 2023 22:40:59 +0800 Subject: [PATCH 04/15] Remove all __pycache__ directories --- .../__pycache__/__init__.cpython-311.pyc | Bin 201 -> 0 bytes .../__pycache__/aispend.cpython-311.pyc | Bin 5025 -> 0 bytes .../__pycache__/berrispend.cpython-311.pyc | Bin 4790 -> 0 bytes .../__pycache__/helicone.cpython-311.pyc | Bin 4578 -> 0 bytes .../__pycache__/supabase.cpython-311.pyc | Bin 4394 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 litellm/integrations/__pycache__/__init__.cpython-311.pyc delete mode 100644 litellm/integrations/__pycache__/aispend.cpython-311.pyc delete mode 100644 litellm/integrations/__pycache__/berrispend.cpython-311.pyc delete mode 100644 litellm/integrations/__pycache__/helicone.cpython-311.pyc delete mode 100644 litellm/integrations/__pycache__/supabase.cpython-311.pyc diff --git a/litellm/integrations/__pycache__/__init__.cpython-311.pyc b/litellm/integrations/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 5bd4bfeb856c63e28c0ff78af94e1cae9a6a9392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201 zcmZ3^%ge<81Wr%xrw9P)#~=<2FhLog`GAb+3@HpLj5!P;3@J>(44TX@8G(YDjJFuI z{D36GN`}uM)xSLSLyJ?3iuJRLiZY8cQZn*$60&ryk0@&FAkgB{FKt1RJ$S$pur&9iiLp02WCb_#v2U$ L4RBb*1{4MW0s1t& diff --git a/litellm/integrations/__pycache__/aispend.cpython-311.pyc b/litellm/integrations/__pycache__/aispend.cpython-311.pyc deleted file mode 100644 index 111b4eba1be8b96198ea5a8d3effc1e05225b291..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5025 zcmcgvYi!%r6~5G4vL2M;#I@rG<qM8w|q~q(g)L+PS18 zOLnsUDRxDEJonsl&pr2b&e1Od0Uv_$?5BTaf7Fi9KX9d1B30tPjX>xcVi8MZ(4zGv z774R%TeR5_hgR&hPB(yfuU0{XCGA*rn9|NgCu?Kvtb=u4w|@iWV%@CAlzSNEg;t;0 z+DQ4>7L(^^18lHLg;>(0!l2F47lH9D3nJ_u_+eXGuZI?0Hgp29dtXQFz8f}}1-w>S zbhE^H6l=SSt4V${gi!j$Psvxsf!|D}fAX)Jn_vCm_EgMn__EApTFS3-Inik4bA_Tr zr}Cmi7dXLU8+-FbX*ZkSn5t|1Q%$2f#XsExY`*KlJXs7)SBai!e)A0irGNU7_sc)O z{M)JY7gMXV=Q=;G5uZ<`|90%F>Epe`G><5RctqBf{Cg@Ek^||26dxO!h)YG`QeO6( z)mkmm)EFN=GBPIb3zaHTnk%dHtcCY8z;a}v$7hMOty^eT5HMi>r}%Pfi5JnHKc zi3=hph>2A};KgNjIiF!xc_uNNPZhIVP7)ItUg9#DZ2imUBrYv55}(hB35FN(LJbwJ z7#^DDbG$^;^1i0!8>;cY1LKJU02}DDj?U{b_3NOSlc$OfJfS{ zv5sw8hH=)NkJRDZmfWGkwcTRsaOLi@ZiN7g_9_m=E`!fqcPrrE%vO)$VZCw-9;;5d zaw^Qo3$L$n{8{wfp>;y>Hu4@dFF61jy-HL6CfNr2OV~wieNX^4Q>{qT7!;YL$DKzStHaK<}f43tfj#*)Iy&T!u19r5zZ>28jAp73mIfV z;8Pr(Vlt^>hLQ4u+}-R}cD8>XdWk;-r?!DAE)*M3J$?FMT=m5C7V_t()Rt~|J|jEc zn$XCo+WVwNPU?~Fw_ejChqgjmB0O2Kqrkv_d?>uXDmJN+M{8ng|1m9c9Lqh0 z<%U#$yy8K@_P6HLKolMrwfo?fuiQ0SO6uK%TWjU+iPC~Tci8+G_jH*&eKn|)J?|df;ckoCzSh7|DJ z3h_32XGiRV%+aPG9AB;SHe&7X*w3el+UjbX!z3V>3 z3sC?^9PpV{$`3iN5A18%wvY8U&^y}#+ii*m`UM;6EsCEFUH7Jm^?m<%-gBUf^XjVUhhac^DjW%NMT{IK!P1IB>wM?CHB0@5{#f*t;yu z^e#SRLMw*781`Z41c-SJkHEcJOc%t8>r@LIN5?>hiuUBh?1~`c|t!H_DTYi;w~|% zRl^5cnq?%KyPS#z&G2QeqtJylcVmG6IS7YL&_l0r@V7+d40}JYHT5fBOJ@tkXbQRNZ zULfc=4tc}6zr8fClgZmfl}y5O&u$9@zXaDF#GX9}UUJU@am(?$kQzx^Pif{(baHF_ zSI5=pBs@AbT5;OjKpdcS0%B3`fEFG7IQsNQ(WgHl_gp=**{-!7E|Y^AISAT&vG(5J z=fQnHUcM@qgS}d?x8g*Bo=Omf_kK+FeMI(ca$B$5I(qwZnLMkJXYaY~0SF~=ogBF{ zaN>^#$^-MN|Bw!@`-KbTp$n@2Fhr(kuihWi501Y7gm&=Qtp)Ai8GYce-ar2SOIrU^ z>eM-{{{_A837s0;dP$=u^dsl=@$;2EzHp?1FxdUA!P0D{69qa-^J>TQw;u<9r|dte z`A@2~=Rw70_lED_HB&q0Z(h_UPL?N5YZIrT22a_a)ci@+pVa+iX|^=`;K2jY4-5W- z8ShL0{XP(#8L=m0F8t3U$7DI0HheS<*Qc1lw4bJ5EixIaMF>Mb^LPrgK>ZS#5z5?V z!Ht_RT!dGg1K6nlDh|7I9QL9HzJt!Q5TqOMED>{tEAX#zCs-q3y)lpBV)OV9nEt(v|;}4pvZ)wUxy@|HOn@e44`u>bI-z?%m=wfJfF|Z1%mlEQhb+kmW&!}S zOQ#0(=wayIFwizLj3oi;I`Q1wFcaXLnU7&ffCbwbB5121j2phn_iQf{1e}S7<2{rA K}B-@GeowJ*hm1`2mjxPx`ZrWv|-N=D> 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 diff --git a/litellm/integrations/__pycache__/helicone.cpython-311.pyc b/litellm/integrations/__pycache__/helicone.cpython-311.pyc deleted file mode 100644 index 972c339ed39ab1cafaa3a5632470bf3e4ee7db9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4578 zcmbUkOKcn0@$H9Sk>ajInHD8mE6cP#mPpC5Y%5aylVr<|Bc*W?R6^42n!A!HlU!zZ z>Da^)aM1vziyU-FVFPgsom>~m!IuI)bfeL;jnO)t?Tx`;&bGbBi5(KK()j=Uf-OKKbi_BOwdR%(T60x_Ej$1YUp2YFiYA?iKs+^H>Ri>dg8F7E zB@{AAxgh0*OfoI!Qa8pdW^VS%rRjzFS^nI+m-x457YAu8R8Zs_8BtRBqLQ^pS+%?? zk|yPESk!gt)*xZgs+3(;u}JRKTJFCa*~=ilAlWyqa2V7$#Y`W%+qNlh0^8UyALvSJItm1&JyL;5ORoK3Snnf9H4Y z9bZfs2U6AcQL}xtLVxbB!0$QGptS2Q_{9T%+p@0!0oQ>e%c2}nrgLQ3Lm-|05|zC= zIfFhvSN4gN?z@4MVI8neyxMLeeciUY!suR153`=_*)P$b$x;{rm(LHuyys`;kNuDJ z=biNqH=WSIjqa0WzfOt1ZFwTG1NZO1cj%-OVn7Vur^*4{uLqV%@P?Lo1#e=Iv_f+q zymM}zfA_tGciw&93Y@#-qO>AsC5tY?v06UxS~z(P=sh`El(Lo=oFfPB>r1c7nY5%@ zzMQ10!ir>tRZTANs`N=w%BQ74$_j#y6|xdOX(a|itrnX?kpxxF!+b!x=8js-FW@ zhQ}U%XdIfs-QQF9qOSgpTV{OhQLh<4{%FyRpLr56j;41@2ZCo z({Bt+8j(rEKdC@!Mrj`aw|N1v1MDooKM;3O0Fek>m$*aV(Ab@%2&6R=7D5$b8N%^1 zzmC?LqcdoC-rl`lA@2}*LZto(+;vi)9ls0G~h2vWxePA;#tpVPnG^2<5s zEhX?;F;W6)yRA_U?c(P7KlBOzat?aC6*bxVS!+4~fvr4~ITw%sT7 zu-=NFVmth!kg_6L#N`0jo!`avfF9H%Uw7<2#WJHaYt1te1C2x-wmop)ZfoHR;Hu-B zv7M{-@=|;KexR~z60E~sRG42MR2DXMr-oBqqpgKpY_~V;#bwdf>n62`J|za@^QCb& z{cyNyfP}=2aI=t%6_v|229}HYG|sNvvaE1+dgfj$C*A-Jo^t^HM7#|;-bFh4*k2}e z;tqKOeTeQ71o}K+7YfAu-=JEs$mFQiDx}j=L6bz@=4xkS6-NTc-L{kEtH9KXl$UN6 zl+&dVS5c?BNrHB~S_B5Fnw-kYX(6kgPBzJp0~d7)z{~H^_mDj6h>Eq@U~B)8I)ys= zHY6i@v`)Fh+XUN~oqkGTD5FN+NRE$aMdg}2NZM*DJ-}PR-Zx0?7~o)_)aukeBR9Z^ zV75~5*yyp*k+IQ{(Xk)CwO3g58r)5mZ&ebY{(-_r)da1mmJaQ#pjL4y*C?T6Ap>Pp z3ie#`otFefQn(TW7YNjQc8Qb1{NVNspDSvsvXUv;qovTabFYrPf2$y6z6aBm!mb%d zFew}a1=W{w6x6cloTLfB#HUIiT7>H`m&s-`jW?JGfSQW-ekLbbJ}EC^1Qx?DweINnv~JbO#$_n4ej6!5=>5bje!b5s6Dk%)Gv8}dkE>JZ&2OHZl zw)2cF#ud{f?P!kdBBVt@6Y!3m6INLe#r?Kf>Nto~@U-lR)Kc6%l-Hwp2w13pfs67b zgsXps2(YzKXXTw5v+%9QU>2Z1qsVaUj|e~=gBL**jcrHkHnugCG>6XDJrLW^aNPfh z0bo&#Mce9>hfS<|);;wg+Lx$@QMj$nprO>`IiqJ5_fYp%BzAASQ96x{KOLLd9Gj`d zdmauv>4xNSY?gS2$Ya0_K$S@v47V{1%sLab?%{`7qieDjKLBM72YLbke)U$=ezG#X z)jR(1_}8b5-f`$P?if}PXaH0$zVM?%iH)VFiHXg`L^UyKCMK)BQ)cg!5jyzYk--|< z^^{F)vWY6&Z?gTy&{UP3dO}y38L&z}wn{$;>U-fuT;Im2r+wp_edE=>lV;z^YR@UN z=M*UM-QoTk+xe93+hqHyY{Fy{#=xm6d+PB_l{pJs5|~Q@xb(tax;e9J7`9V8Fl;2x zKc>I&!vpv3Y1r9e$fXzrQDPj*yTd1H17~0}hxWl{00hzDVHBTvDs>D){M=3>qOBr3xuSbQoh$il#j*n@cOrN;x`jKBkWmAPy(mkqbStdmrL z-NKG$#OME>F;85sp15M3xB_p`tDyxmv|xl5Y9XdFQ<-`B@}-JDB7Q#`nw>!ZV2@xp z(R<+lH4h))@M)PBauUy5K_2IgViw~ep8upMWStph0#+-y=5Vsf6^tFh0GGOUz$o~G z(gwI3P=5vBcJsH@#cd22@uLPEtJ9Qc46N&dV25X_j+!7jM|jve+8a93u%JP&Jzx2!oIRda-UAX`Q>(uNP^Soj0Mip~24Y|DH59pR p|F%%uZLf*iswirrsDYw2#29X`dshhp)ZZIEv&Vn@iCKGd{{a?8p{W1> diff --git a/litellm/integrations/__pycache__/supabase.cpython-311.pyc b/litellm/integrations/__pycache__/supabase.cpython-311.pyc deleted file mode 100644 index ab916e5227aac07932f29a352dd1b65f82d94c24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4394 zcmdT{U2GHC6~1H7jK|J6u@eX4tOFAun>d7+vIGR%rOlEEmWF_c0*Zw+n#@ds6WimR z8M6>MRfJk8k6E-5kxHdJv@F%Gsy?(5ePdNs;-QtsXe6wwA|h3N=$jGSD&nc;?17#E%D623ag~i-Vu^`P$ zhKhMz{j{hWrkK?h4cV1NL~`&W_PiN|)(6OJ>Ra-7g?a@1S6;n@L{I1MnBm(s!`rnW z*sY)}y-MXzA4aBgCPWp4jv#%QLT0#DBXlX?@+O>^`z!@rPN5Y>VU@rl)4CpkcGpa;wHLd2#K&XV4JbQrmG;KW{u)58iqafH}ZW{A5vscGI9-o;MXRl2) z)qXTNrxTGYzGFG;FJuZhkjWdSl+9w!sGmxb$3D%#?4oL_`P-Ox+r^@uZK^G+cXhHZ zZu=xx&~$TB*EJo7jN*Jj*JRZ&a7ezT%FCimr2CD#(4gK?<)SIgXH^`QbyYG|QO;)6 zyoo!!RcZ}MAEpg8yWlKg5S0bt?Zworq3T9zS=TehE#;P$m6kJ7YC@BXIS^u`vKdp& zW^>**lQ-2xT{1IT-blGCj27-GrT`g4~9ZXdC_tvk}-kp~ny;bB3CK}`=zt86TfBC^L&i&@(lkTU%XJ@TL z*US73o4;Z4H=5?IU#T)Mb7yC#$|7Ot#lf-X2gfRW#OC`pP5a>S*M6T6`W68p$|NkO z7#*PNZ|O7W_um^o=Kp4d0xGl6=01dXurvZld4Ph*hf0hBUiUNf^LOw-p%PW{l>oaX zK<-0kl?A_Z<)AGOXf=0T`6hTQ}YSPiT~gaXa!QeZF5 ziSHkVXy=S!Ob-))R&O_2rS2tV4x;5u9hXUVdgVjcKZGf5aWRu$6pjg#;8waJWb%cg zDM09Qniqw)#ZA*=+wo$lv6Pa7*}-@2Wt3J zanRHyS)G^UWgG%^bCM~lcjRPH-w&en1R;Hd93Vshg2M$Jz$D&Q^?3~fchp;kC@5<4 zOPD4cW@N1hNF;$!a38&gNa%33i$r=+y$xtx>2YlueW!;kZTuO?8mh8g!Dxk#uV1c2 zW}m56WEKjbAlwcp2)6^ofN-eyU?p*cl-_~L;S<$1wja8HSbSeKf}-7aB+s z&ximc7+0BA3%5LcyZz)_YE$^H!>ze;%gfu%BU^XCi8cIc zn8X34-Pwzh(gBvYH>`sF@hL3q?B09SG}5s@qD22s?Qg_XPU$qGja_Tpby|0Cud{85 zsa?}6V=nS{$JBolO;;i#g030`$mJ@DIA?_B(3|v8Kk&HM! z4%DMA^l1>i;l>d#iZZ#TBsm;*XNqPfr#iE6$kgCkB+8m$IS0%)qr=2^jsqo8pcXbL(kWHYjf8I|0cR*uZ($)!jzH6bSzgu7Z%uV)u% zk!smw6bBZhOtz@2NlyO&7Oq)$l5kG2K210;VmrF&{m_;S;XpmF;Ety4BBtSR%}hfD zl@!BCCHf&E=r9n>77HYC=mVtXeL@C-B-{7O6XY`AI2^bLnv!lh8(K?r&ejS<#tuo?{xbXE}% zE7D($q3D5)a3yxt`e@n$8oLTwMLQv-MPU#j9O{nSv7r~S(dV(z$EKaSP>x-+V;5g_ zzjyz-l{jX7IJI%T+ZzWk~?asS5Wb6?Cs=87gZ=na*;ki9zNpl);sN~P<}lbg>5 z?T@ZmU8Gd{4{co9ZG&sk|4!+C)R_c*cd8@)V04?L{r@((cES1IJ5Nmp&>xubbMX0N zpnvkHe>xc;cYSgT5=9&mMYw|%vxMhG@zbJ|t@SwGu9NVtj}Y=hAiqLyfFj5Fbdr!9 zLXx;~0mz#7ZubsZ^!_T{#)PWKBfa~WXcc+n_zy^RH_<0u$pBMU(a2veoh(A)jq~5w zz-?JgQp9>6K_TWKvOvs(SVbbTPK?*j5aQ@LK{!V)xp=+hzF#x?oPG(a Date: Tue, 17 Oct 2023 22:53:06 +0800 Subject: [PATCH 05/15] Refactor start script and Dockerfile, switch to bash entrypoint --- Dockerfile | 10 ++-------- litellm/proxy/start.sh | 3 ++- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8c8140ffc3b..24b4c48cd08 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,9 @@ FROM python:3.10 -RUN pip install poetry - -WORKDIR /app - -COPY . . +COPY . /app RUN pip install -r requirements.txt WORKDIR /app/litellm/proxy -RUN python proxy_cli.py --config -f /app/secrets_template.toml - -RUN python proxy_cli.py \ No newline at end of file +ENTRYPOINT [ "/bin/bash", "/app/litellm/proxy/start.sh" ] \ No newline at end of file diff --git a/litellm/proxy/start.sh b/litellm/proxy/start.sh index 09357679ca7..5863661084e 100755 --- a/litellm/proxy/start.sh +++ b/litellm/proxy/start.sh @@ -1,2 +1,3 @@ -python3 proxy_cli.py --config -f ../../secrets_template.toml & +#!/bin/bash +python3 proxy_cli.py --config -f ../../secrets_template.toml python3 proxy_cli.py \ No newline at end of file From 0d24bcaf571a1b55358413a806225fcc30dab7b6 Mon Sep 17 00:00:00 2001 From: coconut49 Date: Tue, 17 Oct 2023 22:59:17 +0800 Subject: [PATCH 06/15] Expose port 8000 in Dockerfile and add deployment instructions. --- Dockerfile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 24b4c48cd08..de70fd847a7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,5 +5,8 @@ COPY . /app RUN pip install -r requirements.txt WORKDIR /app/litellm/proxy - -ENTRYPOINT [ "/bin/bash", "/app/litellm/proxy/start.sh" ] \ No newline at end of file +EXPOSE 8000 +ENTRYPOINT [ "/bin/bash", "/app/litellm/proxy/start.sh" ] +# TODO - Set up a GitHub Action to automatically create the Docker image, +# and then we can quickly deploy the litellm proxy in the following way +# `docker run -p 8000:8000 ghcr.io/BerriAI/litellm:v0.8.4 -v ./secrets_template.toml:/app/secrets_template.toml` \ No newline at end of file From d4f7fb70ed30c75be128ca47d90a4eb484f2ab91 Mon Sep 17 00:00:00 2001 From: coconut49 Date: Tue, 17 Oct 2023 23:02:39 +0800 Subject: [PATCH 07/15] Add backoff and boto3 to requirements.txt --- requirements.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 2efac63b660..18ff3740b55 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,4 +6,6 @@ tokenizers click jinja2 certifi -appdirs \ No newline at end of file +appdirs +backoff +boto3 \ No newline at end of file From 266b3b82f511155641d854934d9b38a0683b1fd0 Mon Sep 17 00:00:00 2001 From: coconut49 Date: Tue, 17 Oct 2023 23:09:11 +0800 Subject: [PATCH 08/15] Set WORKDIR to /app before installing requirements in Dockerfile. --- Dockerfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Dockerfile b/Dockerfile index de70fd847a7..93cf54d3fe7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,6 +2,7 @@ FROM python:3.10 COPY . /app +WORKDIR /app RUN pip install -r requirements.txt WORKDIR /app/litellm/proxy From 4414594e7d9d0ea980d38d3409c72014664db363 Mon Sep 17 00:00:00 2001 From: coconut49 Date: Tue, 17 Oct 2023 23:48:55 +0800 Subject: [PATCH 09/15] Refactor proxy_server.py for readability and code consistency --- litellm/proxy/proxy_server.py | 334 ++++++++++++++++++---------------- 1 file changed, 181 insertions(+), 153 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 90a96792138..fc16747c313 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1,11 +1,11 @@ import sys, os, platform, time, copy import threading import shutil, random, traceback + sys.path.insert( 0, os.path.abspath("../..") ) # Adds the parent directory to the system path - for litellm local dev - try: import uvicorn import fastapi @@ -22,13 +22,14 @@ except ImportError: import tomli as tomllib import appdirs import tomli_w - + try: from .llm import litellm_completion -except ImportError as e: +except ImportError as e: from llm import litellm_completion import random + list_of_messages = [ "'The thing I wish you improved is...'", "'A feature I really want is...'", @@ -37,35 +38,36 @@ list_of_messages = [ "'I don't like how this works...'", "'It would help me if you could add...'", "'This feature doesn't meet my needs because...'", - "'I get frustrated when the product...'", + "'I get frustrated when the product...'", ] + def generate_feedback_box(): - box_width = 60 + box_width = 60 - # Select a random message - message = random.choice(list_of_messages) + # Select a random message + message = random.choice(list_of_messages) + + print() + print('\033[1;37m' + '#' + '-' * box_width + '#\033[0m') + print('\033[1;37m' + '#' + ' ' * box_width + '#\033[0m') + print('\033[1;37m' + '# {:^59} #\033[0m'.format(message)) + print('\033[1;37m' + '# {:^59} #\033[0m'.format('https://github.com/BerriAI/litellm/issues/new')) + print('\033[1;37m' + '#' + ' ' * box_width + '#\033[0m') + print('\033[1;37m' + '#' + '-' * box_width + '#\033[0m') + print() + print(' Thank you for using LiteLLM! - Krrish & Ishaan') + print() + print() - print() - print('\033[1;37m' + '#' + '-'*box_width + '#\033[0m') - print('\033[1;37m' + '#' + ' '*box_width + '#\033[0m') - print('\033[1;37m' + '# {:^59} #\033[0m'.format(message)) - print('\033[1;37m' + '# {:^59} #\033[0m'.format('https://github.com/BerriAI/litellm/issues/new')) - print('\033[1;37m' + '#' + ' '*box_width + '#\033[0m') - print('\033[1;37m' + '#' + '-'*box_width + '#\033[0m') - print() - print(' Thank you for using LiteLLM! - Krrish & Ishaan') - print() - print() generate_feedback_box() - print() print("\033[1;31mGive Feedback / Get Help: https://github.com/BerriAI/litellm/issues/new\033[0m") print() print("\033[1;34mDocs: https://docs.litellm.ai/docs/proxy_server\033[0m") -print() +print() import litellm from fastapi import FastAPI, Request @@ -100,24 +102,29 @@ config_dir = os.getcwd() config_dir = appdirs.user_config_dir("litellm") user_config_path = os.path.join(config_dir, config_filename) log_file = 'api_log.json' + + #### HELPER FUNCTIONS #### def print_verbose(print_statement): - global user_debug - if user_debug: - print(print_statement) + global user_debug + if user_debug: + print(print_statement) -def usage_telemetry(feature: str): # helps us know if people are using this feature. Set `litellm --telemetry False` to your cli call to turn this off - if user_telemetry: + +def usage_telemetry( + feature: str): # helps us know if people are using this feature. Set `litellm --telemetry False` to your cli call to turn this off + if user_telemetry: data = { - "feature": feature # "local_proxy_server" + "feature": feature # "local_proxy_server" } threading.Thread(target=litellm.utils.litellm_telemetry, args=(data,), daemon=True).start() + def add_keys_to_config(key, value): # Check if file exists if os.path.exists(user_config_path): # Load existing file - with open(user_config_path, "rb") as f: + with open(user_config_path, "rb") as f: config = tomllib.load(f) else: # File doesn't exist, create empty config @@ -130,21 +137,22 @@ def add_keys_to_config(key, value): with open(user_config_path, 'wb') as f: tomli_w.dump(config, f) -def save_params_to_config(data: dict): + +def save_params_to_config(data: dict): # Check if file exists if os.path.exists(user_config_path): # Load existing file - with open(user_config_path, "rb") as f: + with open(user_config_path, "rb") as f: config = tomllib.load(f) else: # File doesn't exist, create empty config config = {} - + config.setdefault('general', {}) ## general config general_settings = data["general"] - + for key, value in general_settings.items(): config["general"][key] = value @@ -161,101 +169,104 @@ def save_params_to_config(data: dict): # Write config to file with open(user_config_path, 'wb') as f: tomli_w.dump(config, f) - + def load_config(): - try: - global user_config, user_api_base, user_max_tokens, user_temperature, user_model - # As the .env file is typically much simpler in structure, we use load_dotenv here directly - with open(user_config_path, "rb") as f: - user_config = tomllib.load(f) + global user_config, user_api_base, user_max_tokens, user_temperature, user_model + # As the .env file is typically much simpler in structure, we use load_dotenv here directly + with open(user_config_path, "rb") as f: + user_config = tomllib.load(f) - ## load keys - if "keys" in user_config: - for key in user_config["keys"]: - os.environ[key] = user_config["keys"][key] # litellm can read keys from the environment - ## settings - if "general" in user_config: - litellm.add_function_to_prompt = user_config["general"].get("add_function_to_prompt", True) # by default add function to prompt if unsupported by provider - litellm.drop_params = user_config["general"].get("drop_params", True) # by default drop params if unsupported by provider - litellm.model_fallbacks = user_config["general"].get("fallbacks", None) # fallback models in case initial completion call fails - default_model = user_config["general"].get("default_model", None) # route all requests to this model. + ## load keys + if "keys" in user_config: + for key in user_config["keys"]: + os.environ[key] = user_config["keys"][key] # litellm can read keys from the environment + ## settings + if "general" in user_config: + litellm.add_function_to_prompt = user_config["general"].get("add_function_to_prompt", + True) # by default add function to prompt if unsupported by provider + litellm.drop_params = user_config["general"].get("drop_params", + True) # by default drop params if unsupported by provider + litellm.model_fallbacks = user_config["general"].get("fallbacks", + None) # fallback models in case initial completion call fails + default_model = user_config["general"].get("default_model", None) # route all requests to this model. - if user_model is None: # `litellm --model `` > default_model. - user_model = default_model + if user_model is None: # `litellm --model `` > default_model. + user_model = default_model - ## load model config - to set this run `litellm --config` - model_config = None - if "model" in user_config: - if user_model in user_config["model"]: - model_config = user_config["model"][user_model] - - print_verbose(f"user_config: {user_config}") - print_verbose(f"model_config: {model_config}") - print_verbose(f"user_model: {user_model}") - if model_config is None: - return + ## load model config - to set this run `litellm --config` + model_config = None + if "model" in user_config: + if user_model in user_config["model"]: + model_config = user_config["model"][user_model] - user_max_tokens = model_config.get("max_tokens", None) - user_temperature = model_config.get("temperature", None) - user_api_base = model_config.get("api_base", None) - - ## custom prompt template - if "prompt_template" in model_config: - model_prompt_template = model_config["prompt_template"] - if len(model_prompt_template.keys()) > 0: # if user has initialized this at all - litellm.register_prompt_template( - model=user_model, - initial_prompt_value=model_prompt_template.get("MODEL_PRE_PROMPT", ""), - roles={ - "system": { - "pre_message": model_prompt_template.get("MODEL_SYSTEM_MESSAGE_START_TOKEN", ""), - "post_message": model_prompt_template.get("MODEL_SYSTEM_MESSAGE_END_TOKEN", ""), - }, - "user": { - "pre_message": model_prompt_template.get("MODEL_USER_MESSAGE_START_TOKEN", ""), - "post_message": model_prompt_template.get("MODEL_USER_MESSAGE_END_TOKEN", ""), - }, - "assistant": { - "pre_message": model_prompt_template.get("MODEL_ASSISTANT_MESSAGE_START_TOKEN", ""), - "post_message": model_prompt_template.get("MODEL_ASSISTANT_MESSAGE_END_TOKEN", ""), - } - }, - final_prompt_value=model_prompt_template.get("MODEL_POST_PROMPT", ""), - ) - except Exception as e: - pass + print_verbose(f"user_config: {user_config}") + print_verbose(f"model_config: {model_config}") + print_verbose(f"user_model: {user_model}") + if model_config is None: + return -def initialize(model, alias, api_base, debug, temperature, max_tokens, max_budget, telemetry, drop_params, add_function_to_prompt, headers, save): + user_max_tokens = model_config.get("max_tokens", None) + user_temperature = model_config.get("temperature", None) + user_api_base = model_config.get("api_base", None) + + ## custom prompt template + if "prompt_template" in model_config: + model_prompt_template = model_config["prompt_template"] + if len(model_prompt_template.keys()) > 0: # if user has initialized this at all + litellm.register_prompt_template( + model=user_model, + initial_prompt_value=model_prompt_template.get("MODEL_PRE_PROMPT", ""), + roles={ + "system": { + "pre_message": model_prompt_template.get("MODEL_SYSTEM_MESSAGE_START_TOKEN", ""), + "post_message": model_prompt_template.get("MODEL_SYSTEM_MESSAGE_END_TOKEN", ""), + }, + "user": { + "pre_message": model_prompt_template.get("MODEL_USER_MESSAGE_START_TOKEN", ""), + "post_message": model_prompt_template.get("MODEL_USER_MESSAGE_END_TOKEN", ""), + }, + "assistant": { + "pre_message": model_prompt_template.get("MODEL_ASSISTANT_MESSAGE_START_TOKEN", ""), + "post_message": model_prompt_template.get("MODEL_ASSISTANT_MESSAGE_END_TOKEN", ""), + } + }, + final_prompt_value=model_prompt_template.get("MODEL_POST_PROMPT", ""), + ) + + + +def initialize(model, alias, api_base, debug, temperature, max_tokens, max_budget, telemetry, drop_params, + add_function_to_prompt, headers, save): global user_model, user_api_base, user_debug, user_max_tokens, user_temperature, user_telemetry, user_headers user_model = model user_debug = debug load_config() - dynamic_config = {"general": {}, user_model: {}} - if headers: # model-specific param + dynamic_config = {"general": {}, user_model: {}} + if headers: # model-specific param user_headers = headers dynamic_config[user_model]["headers"] = headers - if api_base: # model-specific param + if api_base: # model-specific param user_api_base = api_base dynamic_config[user_model]["api_base"] = api_base - if max_tokens: # model-specific param + if max_tokens: # model-specific param user_max_tokens = max_tokens dynamic_config[user_model]["max_tokens"] = max_tokens - if temperature: # model-specific param + if temperature: # model-specific param user_temperature = temperature dynamic_config[user_model]["temperature"] = temperature - if alias: # model-specific param + if alias: # model-specific param dynamic_config[user_model]["alias"] = alias - if drop_params == True: # litellm-specific param + if drop_params == True: # litellm-specific param litellm.drop_params = True dynamic_config["general"]["drop_params"] = True - if add_function_to_prompt == True: # litellm-specific param + if add_function_to_prompt == True: # litellm-specific param litellm.add_function_to_prompt = True dynamic_config["general"]["add_function_to_prompt"] = True - if max_budget: # litellm-specific param + if max_budget: # litellm-specific param litellm.max_budget = max_budget dynamic_config["general"]["max_budget"] = max_budget - if save: + if save: save_params_to_config(dynamic_config) with open(user_config_path) as f: print(f.read()) @@ -263,6 +274,7 @@ def initialize(model, alias, api_base, debug, temperature, max_tokens, max_budge user_telemetry = telemetry usage_telemetry(feature="local_proxy_server") + def deploy_proxy(model, api_base, debug, temperature, max_tokens, telemetry, deploy): import requests # Load .env file @@ -293,8 +305,6 @@ def deploy_proxy(model, api_base, debug, temperature, max_tokens, telemetry, dep files = {"file": open(".env", "rb")} # print(files) - - response = requests.post(url, data=data, files=files) # print(response) # Check the status of the request @@ -309,10 +319,11 @@ def deploy_proxy(model, api_base, debug, temperature, max_tokens, telemetry, dep return url + def track_cost_callback( - kwargs, # kwargs to completion - completion_response, # response from completion - start_time, end_time # start/end time + kwargs, # kwargs to completion + completion_response, # response from completion + start_time, end_time # start/end time ): # track cost like this # { @@ -330,12 +341,12 @@ def track_cost_callback( # for streaming responses if "complete_streaming_response" in kwargs: # for tracking streaming cost we pass the "messages" and the output_text to litellm.completion_cost - completion_response=kwargs["complete_streaming_response"] + completion_response = kwargs["complete_streaming_response"] input_text = kwargs["messages"] output_text = completion_response["choices"][0]["message"]["content"] response_cost = litellm.completion_cost( - model = kwargs["model"], - messages = input_text, + model=kwargs["model"], + messages=input_text, completion=output_text ) model = kwargs['model'] @@ -353,7 +364,7 @@ def track_cost_callback( with open("costs.json") as f: cost_data = json.load(f) except FileNotFoundError: - cost_data = {} + cost_data = {} import datetime date = datetime.datetime.now().strftime("%b-%d-%Y") if date not in cost_data: @@ -374,47 +385,32 @@ def track_cost_callback( except: pass -def logger( - kwargs, # kwargs to completion - completion_response=None, # response from completion - start_time=None, - end_time=None # start/end time -): - log_event_type = kwargs['log_event_type'] - try: - if log_event_type == 'pre_api_call': - inference_params = copy.deepcopy(kwargs) - timestamp = inference_params.pop('start_time') - dt_key = timestamp.strftime("%Y%m%d%H%M%S%f")[:23] - log_data = { - dt_key: { - 'pre_api_call': inference_params - } - } - - try: - with open(log_file, 'r') as f: - existing_data = json.load(f) - except FileNotFoundError: - existing_data = {} - - existing_data.update(log_data) - def write_to_log(): - with open(log_file, 'w') as f: - json.dump(existing_data, f, indent=2) - thread = threading.Thread(target=write_to_log, daemon=True) - thread.start() - elif log_event_type == 'post_api_call': - if "stream" not in kwargs["optional_params"] or kwargs["optional_params"]["stream"] is False or kwargs.get("complete_streaming_response", False): +def logger( + kwargs, # kwargs to completion + completion_response=None, # response from completion + start_time=None, + end_time=None # start/end time +): + log_event_type = kwargs['log_event_type'] + try: + if log_event_type == 'pre_api_call': inference_params = copy.deepcopy(kwargs) timestamp = inference_params.pop('start_time') dt_key = timestamp.strftime("%Y%m%d%H%M%S%f")[:23] - - with open(log_file, 'r') as f: - existing_data = json.load(f) - - existing_data[dt_key]['post_api_call'] = inference_params + log_data = { + dt_key: { + 'pre_api_call': inference_params + } + } + + try: + with open(log_file, 'r') as f: + existing_data = json.load(f) + except FileNotFoundError: + existing_data = {} + + existing_data.update(log_data) def write_to_log(): with open(log_file, 'w') as f: @@ -422,15 +418,35 @@ def logger( thread = threading.Thread(target=write_to_log, daemon=True) thread.start() - except: - pass + elif log_event_type == 'post_api_call': + if "stream" not in kwargs["optional_params"] or kwargs["optional_params"]["stream"] is False or kwargs.get( + "complete_streaming_response", False): + inference_params = copy.deepcopy(kwargs) + timestamp = inference_params.pop('start_time') + dt_key = timestamp.strftime("%Y%m%d%H%M%S%f")[:23] + + with open(log_file, 'r') as f: + existing_data = json.load(f) + + existing_data[dt_key]['post_api_call'] = inference_params + + def write_to_log(): + with open(log_file, 'w') as f: + json.dump(existing_data, f, indent=2) + + thread = threading.Thread(target=write_to_log, daemon=True) + thread.start() + except: + pass + litellm.input_callback = [logger] litellm.success_callback = [logger] litellm.failure_callback = [logger] + #### API ENDPOINTS #### -@router.get("/models") # if project requires model list +@router.get("/models") # if project requires model list def model_list(): if user_model != None: return dict( @@ -440,19 +456,26 @@ def model_list(): else: all_models = litellm.utils.get_valid_models() return dict( - data = [{"id": model, "object": "model", "created": 1677610602, "owned_by": "openai"} for model in all_models], + data=[{"id": model, "object": "model", "created": 1677610602, "owned_by": "openai"} for model in + all_models], object="list", ) + @router.post("/completions") async def completion(request: Request): data = await request.json() - return litellm_completion(data=data, type="completion", user_model=user_model, user_temperature=user_temperature, user_max_tokens=user_max_tokens, user_api_base=user_api_base, user_headers=user_headers, user_debug=user_debug) + return litellm_completion(data=data, type="completion", user_model=user_model, user_temperature=user_temperature, + user_max_tokens=user_max_tokens, user_api_base=user_api_base, user_headers=user_headers, + user_debug=user_debug) + @router.post("/chat/completions") async def chat_completion(request: Request): data = await request.json() - response = litellm_completion(data, type="chat_completion", user_model=user_model, user_temperature=user_temperature, user_max_tokens=user_max_tokens, user_api_base=user_api_base, user_headers=user_headers, user_debug=user_debug) + response = litellm_completion(data, type="chat_completion", user_model=user_model, + user_temperature=user_temperature, user_max_tokens=user_max_tokens, + user_api_base=user_api_base, user_headers=user_headers, user_debug=user_debug) return response @@ -462,6 +485,7 @@ async def v1_completion(request: Request): data = await request.json() return litellm_completion(data=data, type="completion") + @router.post("/v1/chat/completions") async def v1_chat_completion(request: Request): data = await request.json() @@ -469,6 +493,7 @@ async def v1_chat_completion(request: Request): response = litellm_completion(data, type="chat_completion") return response + def print_cost_logs(): with open('costs.json', 'r') as f: # print this in green @@ -477,13 +502,16 @@ def print_cost_logs(): print("\033[0m") return + @router.get("/ollama_logs") async def retrieve_server_log(request: Request): filepath = os.path.expanduser('~/.ollama/logs/server.log') return FileResponse(filepath) + @router.get("/") async def home(request: Request): return "LiteLLM: RUNNING" -app.include_router(router) \ No newline at end of file + +app.include_router(router) From 762e4c86e86e80f6675cfaae3b3d38a365fb048a Mon Sep 17 00:00:00 2001 From: coconut49 Date: Tue, 17 Oct 2023 23:53:00 +0800 Subject: [PATCH 10/15] Change boolean values in secrets_template.toml from title to lower case. --- secrets_template.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/secrets_template.toml b/secrets_template.toml index ef22330b1b5..161faa604dd 100644 --- a/secrets_template.toml +++ b/secrets_template.toml @@ -9,8 +9,8 @@ # AWS_SECRET_ACCESS_KEY = "" # Uncomment to save your Bedrock/Sagemaker access keys [general] -# add_function_to_prompt = True # e.g: Ollama doesn't support functions, so add it to the prompt instead -# drop_params = True # drop any params not supported by the provider (e.g. Ollama) +# add_function_to_prompt = true # e.g: Ollama doesn't support functions, so add it to the prompt instead +# drop_params = true # drop any params not supported by the provider (e.g. Ollama) # default_model = None # route all requests to this model # fallbacks = ["gpt-3.5-turbo", "gpt-4"] # models you want to fallback to in case completion call fails (remember: add relevant keys) From 0939302ae907eb8413346bcefbff847ec5cc3327 Mon Sep 17 00:00:00 2001 From: coconut49 Date: Wed, 18 Oct 2023 00:35:51 +0800 Subject: [PATCH 11/15] Refactor proxy_server.py to simplify v1 endpoints and improve logging --- litellm/proxy/proxy_server.py | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index fc16747c313..56375c158c4 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -235,7 +235,6 @@ def load_config(): ) - def initialize(model, alias, api_base, debug, temperature, max_tokens, max_budget, telemetry, drop_params, add_function_to_prompt, headers, save): global user_model, user_api_base, user_debug, user_max_tokens, user_temperature, user_telemetry, user_headers @@ -462,36 +461,24 @@ def model_list(): ) +@router.post("/v1/completions") @router.post("/completions") async def completion(request: Request): data = await request.json() + print_verbose(f"data passed in: {data}") return litellm_completion(data=data, type="completion", user_model=user_model, user_temperature=user_temperature, user_max_tokens=user_max_tokens, user_api_base=user_api_base, user_headers=user_headers, user_debug=user_debug) +@router.post("/v1/chat/completions") @router.post("/chat/completions") async def chat_completion(request: Request): - data = await request.json() - response = litellm_completion(data, type="chat_completion", user_model=user_model, - user_temperature=user_temperature, user_max_tokens=user_max_tokens, - user_api_base=user_api_base, user_headers=user_headers, user_debug=user_debug) - return response - - -# V1 Endpoints - some apps expect a v1 endpoint - these call the regular function -@router.post("/v1/completions") -async def v1_completion(request: Request): - data = await request.json() - return litellm_completion(data=data, type="completion") - - -@router.post("/v1/chat/completions") -async def v1_chat_completion(request: Request): data = await request.json() print_verbose(f"data passed in: {data}") - response = litellm_completion(data, type="chat_completion") - return response + return litellm_completion(data, type="chat_completion", user_model=user_model, + user_temperature=user_temperature, user_max_tokens=user_max_tokens, + user_api_base=user_api_base, user_headers=user_headers, user_debug=user_debug) def print_cost_logs(): From 07f06c6479dd5748627b7cbf1983226fb5e3f21d Mon Sep 17 00:00:00 2001 From: coconut49 Date: Wed, 18 Oct 2023 01:17:03 +0800 Subject: [PATCH 12/15] Refactor Dockerfile and proxy_cli.py to use new secrets file location --- Dockerfile | 6 +++--- litellm/proxy/proxy_cli.py | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 93cf54d3fe7..f32db7243b3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,13 +1,13 @@ FROM python:3.10 COPY . /app - WORKDIR /app +RUN mkdir -p /root/.config/litellm/ && cp /app/secrets_template.toml /root/.config/litellm/secrets_template.toml RUN pip install -r requirements.txt WORKDIR /app/litellm/proxy EXPOSE 8000 -ENTRYPOINT [ "/bin/bash", "/app/litellm/proxy/start.sh" ] +ENTRYPOINT [ "python3", "proxy_cli.py" ] # TODO - Set up a GitHub Action to automatically create the Docker image, # and then we can quickly deploy the litellm proxy in the following way -# `docker run -p 8000:8000 ghcr.io/BerriAI/litellm:v0.8.4 -v ./secrets_template.toml:/app/secrets_template.toml` \ No newline at end of file +# `docker run -p 8000:8000 ghcr.io/BerriAI/litellm:v0.8.4 -v ./secrets_template.toml:/root/.config/litellm/secrets_template.toml` \ No newline at end of file diff --git a/litellm/proxy/proxy_cli.py b/litellm/proxy/proxy_cli.py index bd8ef8cc73b..6c0afa6956f 100644 --- a/litellm/proxy/proxy_cli.py +++ b/litellm/proxy/proxy_cli.py @@ -7,7 +7,6 @@ from dotenv import load_dotenv import operator config_filename = "litellm.secrets.toml" -pkg_config_filename = "template.secrets.toml" # Using appdirs to determine user-specific config path config_dir = appdirs.user_config_dir("litellm") user_config_path = os.path.join(config_dir, config_filename) From bb91a8671ddf1e65c909195ca759837592209157 Mon Sep 17 00:00:00 2001 From: coconut49 Date: Wed, 18 Oct 2023 01:22:33 +0800 Subject: [PATCH 13/15] Change Dockerfile to rename secrets_template.toml to litellm.secrets.toml. --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index f32db7243b3..be162d4511f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,7 @@ FROM python:3.10 COPY . /app WORKDIR /app -RUN mkdir -p /root/.config/litellm/ && cp /app/secrets_template.toml /root/.config/litellm/secrets_template.toml +RUN mkdir -p /root/.config/litellm/ && cp /app/secrets_template.toml /root/.config/litellm/litellm.secrets.toml RUN pip install -r requirements.txt WORKDIR /app/litellm/proxy @@ -10,4 +10,4 @@ EXPOSE 8000 ENTRYPOINT [ "python3", "proxy_cli.py" ] # TODO - Set up a GitHub Action to automatically create the Docker image, # and then we can quickly deploy the litellm proxy in the following way -# `docker run -p 8000:8000 ghcr.io/BerriAI/litellm:v0.8.4 -v ./secrets_template.toml:/root/.config/litellm/secrets_template.toml` \ No newline at end of file +# `docker run -p 8000:8000 -v ./secrets_template.toml:/root/.config/litellm/litellm.secrets.toml ghcr.io/BerriAI/litellm:v0.8.4` \ No newline at end of file From cd5bb4a31160e89a77549678355ca13af5b9efca Mon Sep 17 00:00:00 2001 From: coconut49 Date: Wed, 18 Oct 2023 01:25:54 +0800 Subject: [PATCH 14/15] Add uvicorn, fastapi, tomli, and tomli-w to requirements.txt --- requirements.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 18ff3740b55..9f6f2ca0848 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,9 @@ jinja2 certifi appdirs backoff -boto3 \ No newline at end of file +boto3 +uvicorn +fastapi +tomli +appdirs +tomli-w \ No newline at end of file From 356a10431d0b3a5c2d7030903dc81c268197c029 Mon Sep 17 00:00:00 2001 From: coconut49 Date: Wed, 18 Oct 2023 01:54:47 +0800 Subject: [PATCH 15/15] Add new routes for v1 versioning in proxy server --- litellm/proxy/proxy_server.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 5145548df93..8a89f90e36b 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -470,6 +470,7 @@ def model_list(): ) +@router.post("/v1/completions") @router.post("/completions") async def completion(request: Request): data = await request.json() @@ -478,13 +479,14 @@ async def completion(request: Request): user_debug=user_debug) +@router.post("/v1/chat/completions") @router.post("/chat/completions") async def chat_completion(request: Request): data = await request.json() print_verbose(f"data passed in: {data}") return litellm_completion(data, type="chat_completion", user_model=user_model, - user_temperature=user_temperature, user_max_tokens=user_max_tokens, - user_api_base=user_api_base, user_headers=user_headers, user_debug=user_debug) + user_temperature=user_temperature, user_max_tokens=user_max_tokens, + user_api_base=user_api_base, user_headers=user_headers, user_debug=user_debug) def print_cost_logs():