L iŐddlZddlZddlZddlZddlmZmZmZmZm Z ddl m Z ddl m Z ddlmZmZmZmZmZmZej*j,ZdZdZdZd Zd Zd Zd Zd ZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0d Z1Gd!d"Z2ej*jgd#d$gej*jgd%d&gej*jgd'gd(Gd)d*Z4Gd+d,Z5Gd-d.Z6Gd/d0Z7ej*j-d1e2ej*j-d3e2Gd4d5Z8Gd6d7eZ9y)8N)array_namespacexp_assert_closexp_size np_compatis_array_api_strict)cubature)_InfiniteLimitsTransform)Rule FixedRuleNestedFixedRuleGaussLegendreQuadratureGaussKronrodQuadratureGenzMalikCubaturez2JAX/Dask arrays do not support boolean assignment.cT|j|d}|j|d}||zSN)r)rrrreshape)xnxp x_reshaped n_reshapeds i/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/scipy/integrate/tests/test_cubature.pybasic_1d_integrandr!s-Az*JAz*J z !!c>|jd|dzz|dzz dS)Nrrrrrrs rbasic_1d_integrand_exactr"(s# ::a!A#h!ng ..rcn|j|j|dd|j|dzS)Nraxisr rr)rsum)rrrs rbasic_nd_integrandr(-s0 ::bffQRf(' 2BJJq'4J JJrc>dd|zz dd|zzzd|zd|zzz S)Nrrr!s rbasic_nd_integrand_exactr-1s0 1XIAaC AaC!A#; //rc$|jd|jd}}|d}|j||gdgt|jdz z|}|jdtj z|z|j ||zdzS)z .. math:: f_1(\mathbf x) = \cos\left(2\pi r + \sum^n_{i = 1}\alpha_i x_i\right) .. code-block:: mathematica genzMalik1980f1[x_List, r_, alphas_List] := Cos[2*Pi*r + Total[x*alphas]] rrN.rrr$)shaperlencosmathpir')rralphasrnpointsndimalphas_reshapedrs rgenz_malik_1980_f_1r:6sGGAJ TGY'OANA3FLL0AA0E+FNNOJ 66!DGG)A+'C" MM NNrc t|}|j|gdgt|jdz z|}|j|gdgt|jdz z|}d|zdz|j |dz |j dt jz|z|j|||zzdzdzz|j |j|||z zdz dzS)Nrrr$r?) rrr1r0prodr2r3r4r'sin)abr5r6rr8s rgenz_malik_1980_f_1_exactrBGs 1:D 1 & #8 8F v;rc|jd|jd}}|d}|d}|j||gdgt|jdz z|}d|j|dz||z dzzdz S)z .. math:: f_2(\mathbf x) = \prod^n_{i = 1} (\alpha_i^2 + (x_i - \beta_i)^2)^{-1} .. code-block:: mathematica genzMalik1980f2[x_List, alphas_List, betas_List] := 1/Times @@ ((alphas^2 + (x - betas)^2)) rrr/rrr$)r0rr1r> rr6betasrr7r8r9betas_reshapedrs rgenz_malik_1980_f_2rQ_sGGAJ TGY'O9%NANA3FLL0AA0E+FNNOJ RWW_a':n+Dq*HHrW R RRrct|}|j|gdgt|jdz z|}|j|gdgt|jdz z|}d|zdz|j |dz |j |j ||z |z |j ||z |z z dzSNrrr$)rrr1r0r>atanr@rAr6rOrr8s rgenz_malik_1980_f_2_exactrVrs 1:D 1r3pow) rIr0rr8r6rOrJproductsrKs rgenz_malik_1980_f_2_random_argsr[s 9D ZZ 5) *F JJszz%( )EJwwvrzz$//bw9H%rzz!qv,'??K + +dhhz1$<.P PF bLF 5=rc|jd|jd}}|d}|j||gdgt|jdz z|}|j|j ||zdS)z .. math:: f_3(\mathbf x) = \exp\left(\sum^n_{i = 1} \alpha_i x_i\right) .. code-block:: mathematica genzMalik1980f3[x_List, alphas_List] := Exp[Dot[x, alphas]] rrr/rr$r0rr1expr'rr6rr7r8r9rs rgenz_malik_1980_f_3r`szGGAJ TGY'OANA3FLL0AA0E+FNNOJ 66"&&:5B&? @@rct|}|j|gdgt|jdz z|}|j|gdgt|jdz z|}d|zdz|j |dz |j |j ||z|j ||zz dzSrS)rrr1r0r>r^)r@rAr6rr8s rgenz_malik_1980_f_3_exactrbs 1:D 1J & #8 8F 9rc|jd|jd}}|d}|j||gdgt|jdz z|}d|j||zdz| dz zS)z .. math:: f_4(\mathbf x) = \left(1 + \sum^n_{i = 1} \alpha_i x_i\right)^{-n-1} .. code-block:: mathematica genzMalik1980f4[x_List, alphas_List] := (1 + Dot[x, alphas])^(-Length[alphas] - 1) rrr/rr$)r0rr1r'r_s rgenz_malik_1980_f_4rfsGGAJ TGY'OANA3FLL0AA0E+FNNOJ 3"= =$q IIrcHt|fd}t|||S)Ncj|gdgtjdz z}dzjdz t j z dj |zdzz SrS)rr1r0r>r3 factorialr')rrr6r8rs rFz$genz_malik_1980_f_4_exact..FsZZ#Iqc3v||+J46 ),A AF 9rc|jd|jd}}|d}|d}|j||gdgt|jdz z|}|j|j |dz||z dzzd S)z .. math:: f_5(\mathbf x) = \exp\left(-\sum^n_{i = 1} \alpha^2_i (x_i - \beta_i)^2\right) .. code-block:: mathematica genzMalik1980f5[x_List, alphas_List, betas_List] := Exp[-Total[alphas^2 * (x - betas)^2]] rrr/rrr$r]rNs rgenz_malik_1980_f_5r~sGGAJ TGY'O9%NANA3FLL0AA0E+FNNOJ 66 "j>&AA%EEB OO rc t|}|j|gdgt|jdz z|}|j|gdgt|jdz z|}d|zdz|j |dz t j |dz zz|j tjj|||z ztjj|||z zzdzS)Nrr=rr$r) rrr1r0r>r3r4scipyspecialerfrUs rgenz_malik_1980_f_5_exactr s 1:D 1)r@rAr6rr8double_infinite_countsemi_infinite_countrxs rf_gaussian_exactr5s 1:D 4[% 88AaD>bhhqtn !Q & ! XXad^rxx!~ - 1 $  % IIdgg $ & b!99 rcR|j|j|}|dz}|fS)Nd)rGrH)rIr0rr6s rf_gaussian_random_argsrKs, ZZ 5) *F cMF 9rc|dddf|dddf|dddf|dddff\}}}}||dddfz|j|z|j| |dzz |dzz z}|jS)zJ .. math:: f(x, y, z, w) = x^n \sqrt{y} \exp(-y-z^2-w^2) Nrrrr*)rr^T)x_arrrrryzwress rf_modified_gaussianrUs q!teAqDk5A;ad CJAq!Q !T' ?bggaj (2661"QT'!Q$,+? ?C 55Lrc@ddd|zzz tjdzzS)Nrrg?)r3r4)r@rArrs rf_modified_gaussian_exactras$ a!A#g;S) ))rc|D]!}|j||k(std|j|jdS)z This emulates a function with a list of singularities given by `points`. If no `x_arr` are one of the `points`, then this function returns 1. called with a problematic pointr)any ValueErroronesr0)rrurpoints rf_with_problematic_pointsrisJ@ 66%5. !>? ?@ 775;;q> ""rceZdZdZej j dgddZedddZ d Z d Z d Z d Z d ZdZy) TestCubaturez7 Tests related to the interface of `cubature`. rule_str)z gauss-kronrod genz-malikgk21gk15c,|jd|j}|jddg|j}|jddg|j}tt|||||f}t |j t||ddy)Ndtyperr)ruleargs:0yE>rtolatol)arangefloat64rGrr(restimater-)selfrrrr@rArs r test_pass_strzTestCubature.test_pass_str|s IIarzzI * JJ1vRZZJ 0 JJ1vRZZJ 0)1ahaWM LL $Q +  rTz,array-likes only supported for NumPy backend)np_onlyreasonctjdtj}dg}dg}tt||||f}t |j t||ddy)Nrrrrrrr)rrrrrrrr"rrrr@rArs rtest_pass_array_like_not_arrayz+TestCubature.test_pass_array_like_not_arrayse   Qi&7&7 8 C C  R    LL $Q +  rc |jdg}|jdg}t}tt|||d|j d|j |f}|j dk(sJ|jdk(sJy)NrrrXrr)rmax_subdivisionsr not_converged)rG BadErrorRulerrrr subdivisionsstatus)rrr@rArrs r!test_stops_after_max_subdivisionsz.TestCubature.test_stops_after_max_subdivisionss JJsO JJsO~  ))ARZZ)0"5  2%%%zz_,,,rc|jdgg|j}|jdgg|j}tjtd5t t |||fdddy#1swYyxYw)Nrrrz`a` and `b` must be 1D arraysmatchr)rGrpytestraises Exceptionrrrrr@rAs rtest_a_and_b_must_be_1dz$TestCubature.test_a_and_b_must_be_1dsk JJuBJJJ / JJuBJJJ / ]]9,K L ; 'ARE : ; ; ;s A88Bc|jg}|jg}tjtd5t t |||fdddy#1swYyxYw)Nz`a` and `b` must be nonemptyrr)rGrrrrrrs rtest_a_and_b_must_be_nonemptyz*TestCubature.test_a_and_b_must_be_nonemptysQ JJrN JJrN ]]9,J K ; 'ARE : ; ; ;s AA%c \|jd|j}|jdg|j}|jdg|j}tt||||f}t |j |jdgdgdgdgdgg|jddy)Nrrrrrr)rrrGrrrrrs rtest_zero_width_limitsz#TestCubature.test_zero_width_limitss IIarzzI * JJs"**J - JJs"**J -  R    LL JJaS1#sQC0 J C  rc(|jd|j}|jdg|j}|jdg|j}tt||||f}t |j t|| ddy)Nrrrrrrr)rrrGrrrrr"rs rtest_limits_other_way_aroundz)TestCubature.test_limits_other_way_arounds IIarzzI * JJs"**J - JJs"**J -  R    LL %a , ,  rc ^tt|jdg|j|jdg|jg|jdg|j|fjj }||jk(sJtt|jdg|j |jdg|j g|jdg|j |fjj }||j k(sJtt|jdg|j |jdg|jg|jdg|j |fjj }||jk(sJy)Nrrr)rur)rrrGrrrfloat32)rr result_dtypes r$test_result_dtype_promoted_correctlyz1TestCubature.test_result_dtype_promoted_correctlysm  JJs"**J - JJs"**J -**aS *3R8  (55 rzz)))  JJs"**J - JJs"**J -**aS *3R8  (55 rzz)))  JJs"**J - JJs"**J -**aS *3R8  (55 rzz)))rN)__name__ __module__ __qualname____doc__rmark parametrizerskip_xp_backendsrrrrrrrr,rrrrwso [[Z*    dKM M &-";; ( (*rrrg-C6?rgh㈵>r)rrrc eZdZdZeddej jdee dgdgdd gffee ddgd d gdd d gffee ddgd d gd d d gffee gdgdd gdffe e dgd gd gd gffe e ddgddgddgdd gffe e gdgdgdgdffe e gdgdgdgdffe e gdgdgdgdffe e gdgdgdgdffe e dgd gd gffe e ddgd d gd d gffe e gdgdgdffeedgd gd gffeeddgd d gd d gffeegdgdgdffeedgd gdgd gffeeddgd d gd dgd d gffeeddgd d gdd gddgffeegdgdgdgdffgdZeddej jdee efe e efe e efeeefeeefgej jdgddZej jddd gdgdgd!fd"d#gdgd gd$ggfd%d&ggdgdgd'gfd(d&ggdgdgd)gd'gfd*d&ggdgdgd+gd)gd'gfgd,Zej j d-eej j deej jdeeed.ej> gej>gfeeed/ej> ej> gej>ej>gfeeed.dgej>gfeeed.ej> gdgfeeed/ddgej>ej>gfeeed/dej> gej>ej>gfeeed0ddej> ej> gej>ej>ej>ej>gfeeed0ej> ej> ej> ej> gddej>ej>gfd1d2d3e d ej> dgej>dej>gfejBe"e#d4e ddej> ej> gd ej>ej>ej>gfej jH5g d6Z%ej j d-eej j deej jdd7d8ejLzgej> gej>gdggfd9d8ejLzej> dgej>d gdd ggfgd:Z'y!);TestCubatureProblemsz9 Tests that `cubature` gives the correct answer. dask.arrayz0Dask hangs/takes a long time for some test casesrproblemrrX?rrrr+r=)rrr)rrrrrrr2r*r<)rr*r+)rrr)rrr)rrrr)rrrrc |\}}}} } j|j}j| j} tfd| D} t|} |dk(r| dkrt j dt ||| |||g| } | jdk(sJ| j} ||| g| }t| |||d| jd | j y) Nrc3XK|]!}j|j#yw)rNrGr).0argrs r z:TestCubatureProblems.test_scalar_output..s"G3RZZ2::Z6Gs'*rr1Genz-Malik cubature does not support 1D integralsrrrr convergedestimate_error=, subdivisions=rrerr_msg) rGrtuplerrskiprrrrerrorr)rrrrrrfexactr@rArr8rest exact_sols ` rtest_scalar_outputz'TestCubatureProblems.test_scalar_outputsl '5!Q JJq J + JJq J +G$GGqz < D1H KKK L 4 zz[(((ll!Q**r*   %cii[@P@P?QR  rr0) rr*)r+)rr)rr*rr+)r*r)r*r+r)rrr*c tjjd}|d}|dk(r|dkrtjd|dk(r$|dk\rtj j d|\} } } | |||} |jdg|z|j } |jdg|z|j }t| | ||||g| | }|j}| | |g| |}t||||d |jd |j d |jd|jd|j|j|z }|jdk(sJ||jj |ddk(sJy)Nrrrrrr!Gauss-Kronrod is slow in >= 5 dimrrrrrr, subdivisions= , true_error=r)rrH default_rngrrrslowrGrrrrrrabsrr0)rrrr0rrrrIr8rr random_argsrr@rArrrrs rtest_array_outputz&TestCubatureProblems.test_array_outputs\**1-Ry < D1H KKK L < DAI KK  @ A '5+3r* JJsTzJ 4 JJsTzJ 4 4 ll!Q**r*   %cii[@P@P?QR  %SYYK0$$'$4$4#56!!# y(@!A BDzz[(1'1(||!!U3BZ///rc|SNr,rrs rzTestCubatureProblems.ls!rgI@Nc*|j||z Srr?r s rr zTestCubatureProblems.{s"&&)A+rgBsvi@gcB|j|jddfSNrrrr0r s rr zTestCubatureProblems."''1771:q/2rg?)r=r=r=cB|j|jddfSrrr s rr zTestCubatureProblems.rr)rrrcB|j|jddfSrrr s rr zTestCubatureProblems.rr)g?rr=c |\}}}} } |j||j}|j| |j} |j||j}| *| D cgc]} |j| |j!} } t|} |dk(r| dkrtjd|dk(r$| dk\rtj j dt||| |||| |f} t| j|||d| jd | jd d| jd | jd |j| j|z }| jdk(sJ|ycc} w)NrrrrrrrrrrurrrF)rrr check_dtyperrr)rGrrrrrrrrrrrrr)rrrrrrrrr@rArurr8rrs rtest_break_pointsz&TestCubatureProblems.test_break_pointsist")5!Q JJq J + JJq J + 5 3  GMNebjjbjjj9NFNqz < D1H KKK L < DAI KK  @ A     LL %cii[@P@P?QR  %SYYK0$$'$4$4#56!!# u(@zz[(1'1(COs&$E: jax.numpy)rr)rrrc4d|j|ddzz S)Nrrr$r)r>r s rr zTestCubatureProblems.s!BGGABG/22rc<|jd|jS)NgUUUUUU?rr)r@rArs rr zTestCubatureProblems.sRZZ2::Z>rctSr)rrIr0rs rr zTestCubatureProblems.s57rcB|jgd|jfS)N)rrrr*r+rrrs rr zTestCubatureProblems./s ?"** (U'Wr)marksc tjjd}|\}}} } } } |j| |j} |j| |j} | || |} t | }|dk(r|dkrt jd|dk(r$|dk\rt jjd|dk(r/|dk\r*t|rt jjdt|| | |||g| | }|jd k(sJt|j|| | g| |||d |j d |j"d y)Nrrrrrr+zGenz-Malik is slow in >= 5 dimz5Genz-Malik very slow for array_api_strict in >= 4 dimrrerror_estimate=rFrrrcheck_0d)rrHrrGrrrrrrrxslowrrrrrr)rrrrrrrIrrrandom_args_funcrandom_args_shaper@rArr8rs rtest_infinite_limitsz)TestCubatureProblems.test_infinite_limitssZZ**1->E;5"$5q! JJq J + JJq J +%6;qz < D1H KKK L < DAI KK  = > < DAI2Eb2I KK  U V 4 zz[((( LL !Q " "r "%cii[@P@P?QR  rc0|j||z dzS)Nr r s rr zTestCubatureProblems.fs266!9q=1,rg?cL|j|dddf|dddfz dzS)Nrr'r r s rr zTestCubatureProblems.us(266!AqD'?Qq!tW4q8rc ,|\}}}} } |j||j}|j| |j} |j||j}t|} |dk(r| dkrtjd| *| D cgc]} |j| |j!} } t ||| |||| |f} | j dk(sJt| j|||d| jd| jd ycc} w) NrrrrrrrrFr ) rGrrrrrrrrrr)rrrrrrrrr@rArur8rrs r%test_infinite_limits_and_break_pointsz:TestCubatureProblems.test_infinite_limits_and_break_pointsasF")5!Q JJq J + JJq J + 5 3qz < D1H KKK L  GMNebjjbjjj9NFN   zz[((( LL %cii[@P@P?QR  Os$D)(rrrrrrrrr:rBrQrVr`rbrfrlr~rrrLr[rdr|rrrboolean_index_skip_reasonrrrr3infrparamrrr"r%r4r*r,rrrr s*lOQ [[Y  &CD  ( % F FA   % F FA   %     % D C   % F HQQ   %     %     %     %     % D C    % G FA    %      % C C    % F FVI   %   L   % D C   % H FAA   % H FQA   %    QR)Rf! gRQj! FlOQ [[Y  & ,  % + % + % + % + 5)@ [[W ' *0 AQZ*0X [[Y FCD  " &   D C    3 E      3 E  "   3 E   "  [8)8r)2s8r)2V [[!!+6O!P [[!!,7P!Q [[Y   # hhYK XXJ   " hhY " XXtxx     "  C XXJ     " hhYK C     "  F XXtxx     "   N XXtxx     "  DHH9txxi ( XXtxx488 4     " hhY DHH9txxi 8 488TXX &   3 ? + G  1  XXr488 $   $*XAy488),DHHdhh1 ++##! oi)iT& UiRQX& P [[!!+6O!P [[!!,7P!Q [[Y -tww  hhYK XXJSE " 9 dgg hhYN XXqMXJ !)@# ARQD# rrczeZdZdZej j dddgddgedfdgdgedfgdZ dZ y ) TestRuleszJ Tests related to the general Rule interface (currently private). rrrrc*|\}}}}||d|i}|j||j}|j||j}tjtd5|j t |||fdddy#1swYyxYw)Nrrzincompatible dimensionrr)rGrrrrrr)rrrr@rA quadraturequadrature_argsrs r(test_incompatible_dimension_raises_errorz2TestRules.test_incompatible_dimension_raises_errors"-4)1j/?2r2 JJq J + JJq J + ]]9,D E @ MM,a"M ? @ @ @s %B  Bc|jdg}|jdg}ttfD]>}tjt 5|j t|||fddd@y#1swYKxYw)Nrrr)rGr r rrrrr)rrr@rA base_classs r+test_estimate_with_base_classes_raise_errorz5TestRules.test_estimate_with_base_classes_raise_errors JJsO JJsO69;/ JJy) J##$61B5#I J J J J Js A;;B N) rrrrrrrrrr5r8r,rrr/r/sk [[YF F "   C C    ) @! @Jrr/c eZdZdZej j dedfedfedfedfedfgdZ ej j d eefd fgd Z ej j d egd Z y)TestRulesQuadraturez8 Tests underlying quadrature rules (ndim == 1). )r rule_argsr)r)rX)r0cV ||di}jdj fd}jdgj}jdgj}jd dzz dzz d}|j |||} t | |d d y) NrrrcVj|d}jd}||zSrr)rrrrrs rrz>TestRulesQuadrature.test_base_1d_quadratures_simple..fs.Az2JAz2Jz) )rrrrr rr)rrrGrrr) rrr;rr3rr@rArrrs ` @rtest_base_1d_quadratures_simplez3TestRulesQuadrature.test_base_1d_quadratures_simples9,, IIarzzI * * JJs"**J - JJs"**J - 1qs8QqS>73&&q!Q/    r) rule_pairrule_pair_args)rXrc |jd|j}|jdg|j}|jdg|j}|d|d|}|d|d|}t||} t t ||| d||f} t | jt||dd y) Nrrrrrrr)rrrr) rrrGr rrrrr") rr@rArrr@rAhigherlowerrrs r.test_base_1d_quadratures_error_from_differencezBTestRulesQuadrature.test_base_1d_quadratures_error_from_differences IIarzzI * JJs"**J - JJs"**J -1nQ/B7 ! ^A.26vu-  qR    LL $Q +  rr3cttjt5|d|dddy#1swYyxYw)NrrC)rrr)rr3rs r$test_one_point_fixed_quad_impossiblez8TestRulesQuadrature.test_one_point_fixed_quad_impossibles/]]9 % ! qR  ! ! !s .7N) rrrrrrrr rr?rFrHr,rrr:r:s [[2 $' $' %( ' ' 5  0 [[< !#: ;WE?  2 [[\,!!rr:cheZdZdZej j dedddZdZ y)TestRulesCubaturez6 Tests underlying cubature rules (ndim >= 2). r8r ct||j\}}|jdd|zd|dzzzd|zzdzk(sJy)z Tests that the number of function evaluations required for Genz-Malik cubature matches the number in Genz and Malik 1980. rCrrrN)rnodes_and_weightsr0)rr8rnodes_s r test_genz_malik_func_evaluationsz2TestRulesCubature.test_genz_malik_func_evaluationssO%Tb1CCq{{1~!T'QtQwY!64!?!!CCCCrc~tjtd5td|dddy#1swYyxYw)Nzonly defined for ndim >= 2rrrC)rrrr)rrs rtest_genz_malik_1d_raises_errorz1TestRulesCubature.test_genz_malik_1d_raises_error)s0 ]]9,H I ( aB ' ( ( (s3<N) rrrrrrrrrrPrRr,rrrJrJs9 [[VU1b\2D3D(rrJrrrceZdZejj dddej gdejejggdgdgfgdZy)TestTransformations)r@rArurrr)r=rXrXcDcgc]}j|j!c}tfdj|jj|j}D]O}|jj |d}t j td5||dddQycc}w#1swYaxYw)zx Test that break points are correctly mapped under the _InfiniteLimitsTransform transformation. rct|Sr)r)rrurs rr zKTestTransformations.test_infinite_limits_maintains_points..Es/62>rrCr&rrN)rGrr invrrrr) rr@rArurp f_transformedrtransformed_points `` r%test_infinite_limits_maintains_pointsz9TestTransformations.test_infinite_limits_maintains_points1s JJq J + JJq J +   1E - 1 1"**UG2L M y0QR 1/0 1 1 1C 1 1s$C 8 CC N) rrrrrrr3r,r[r,rrrTrT.s_ [[1 DHH9  $(( #   4 1 1rrTc eZdZdZddZddZy)rzP A rule with fake high error so that cubature will keep on subdividing. c\t||}td|}|j||||S)NrXrC)rr r)rrr@rArr underlyings rrzBadErrorRule.estimateWs1 Q ",RB7 ""1aD11rcTt||}|jd|jS)Ng.Ar)rrGr)rrr@rArrs restimate_errorzBadErrorRule.estimate_error]s% Q "zz#RZZz00rN)r,)rrrrrr`r,rrrrRs2 1rr):r3rrprscipy._lib._array_apirrrrrscipy.integraterscipy.integrate._cubaturer scipy.integrate._rulesr r r r rrrrr+rr"r(r-r:rBrLrQrVr[r`rbrdrfrlrkr|r~rrrrrrrrrrrr/r:rJrTrr,rrres  %>;;//P"/ K0 O" S& "A"J" 2&0" G, * #R*R*j$($(" S  S  ))S  l%J%JPE!E!P((*k2KLl3LM11NM1D 14 1r