1jqddlZddlZddlZddlmZmZddlmZddl m Z ddl m Z m Z mZmZdZdZeegezZdZdZd Zd Zd Zd Zd ZejjdZdZdZdZ d$dZ!dZ"ejjdZ#ejjdZ$dZ%dZ&dZ'dZ(d%dZ)dZ*dZ+dZ,d Z-d!Z.Gd"d#Z/dS)&N)solve_diophantineinternal_overlap) _umath_tests) as_strided)assert_ assert_raises assert_equalassert_array_equal c |dkr tdzgSg}dD]O}dD]J}tdz||z|zdzz }|||z|zz}|t||||zKP|S)zGReturns slices of length nelems, from start onwards, in direction sign.rr r )r r)sizeappendslice)nelemsresstepsignstartstops u/builddir/build/BUILD/cloudlinux-venv-1.0.11/venv/lib64/python3.11/site-packages/numpy/core/tests/test_mem_overlap.py_indices_for_nelemsrs{{ { C88 8 8DAI  4 99E6D=4//D JJuUD$+66 7 7 7 7 8 Jcg}dD]9}t|}|tj||:|S)z$Returns (src, dst) pairs of indices.)rr )rextend itertoolsproduct)rrinds r_indices_for_axisr#%sL C00!&)) 9$S#..//// JrcJt}tj||S)zKReturns ((axis0_src, axis0_dst), (axis1_src, axis1_dst), ... ) index pairs.)repeat)r#r r!)ndimsr"s r_indicesr'0s%   C  S / / //rc:tjtjtt}|}||||<||||<t tj||kd|d|ddS)z1Check assignment arr[dstidx] = arr[srcidx] works.zassigning arr[z] = arr[]N)nparangeprodshapereshapecopyrall)srcidxdstidxarrcpys r_check_assignmentr57s )BGENN # # + +E 2 2C ((**Cf+CKf+CK BF3#:   -3VVVVV <>>>>>rctt}|D]D}td|D}td|D}t||EdS)Ncg|] }|d Sr.0as r z0test_overlapping_assignments..K***!***rcg|] }|d Srr9r:s rr=z0test_overlapping_assignments..Lr>r)r'r&tupler5)indsr"r1r2s rtest_overlapping_assignmentsrCEss E??D****c***++**c***++&&)))) **rc H tjdtjtjj}t dD]}d}d}d|dzz}t|||krdddtjdzz ddtjdzt|  t|dz t fd t |D}tfd t |D}t|d z td t||D}td |d ztj|dkr||krdt||}|t||d} t| du||| ftdt||D} d} | D]} | t| z} | dkr:tt!fdt#j| D |dz }nt||d} t| du||| fttdt||Dktt'dt||D|dz }t|||kdS)Nr rr dtypec3|K|]6}tddztjV7dS)rrHNintrandintr*intp)r;jA_maxrngs r z(test_diophantine_fuzz..fW,,#++aq+@@AA,,,,,,rc3|K|]6}tddztjV7dS)rr rHNrL)r;rPU_maxrRs rrSz(test_diophantine_fuzz..hrTrr c3&K|] \}}||zV dSNr9r;r<ubs rrSz(test_diophantine_fuzz..ks*%B%Buq"ad%B%B%B%B%B%Brr )simplifyc3JK|]\}}td||zdz|VdS)rrNrangerYs rrSz(test_diophantine_fuzz..{s:JJuq"uQ"Q22JJJJJJric3>K|]}t|kVdSrX)sum)r;wbs rrSz(test_diophantine_fuzz..s-#T#TACFFaK#T#T#T#T#T#Trc3&K|] \}}||zV dSrXr9r;r<xs rrSz(test_diophantine_fuzz..s*66DAqAaC666666rc3<K|]\}}d|cxko|kncVdSrNr9)r;rerZs rrSz(test_diophantine_fuzz..s:@@UQALLLLbLLLL@@@@@@r)r*random RandomStateiinforOmaxr^minrNrAr`ziprMrrlenanyr r!r0)max_intndimfeasible_countinfeasible_count min_countAUb_ubX X_simplifiedrangesrrrQrVrbrRs @@@@rtest_diophantine_fuzzr|Qsm )   % %Chrw#Gb 3$3$$(O ."233i?? Ar 991< C B #d U4r5J5J'K&Ma&OQ  B2B IIbMMMM HH#Aaaa!!!eHa!AAAh77888#Aaaa!!!eHa!AAAhFFFGGG %Qqqq111uXq1QQQx888$Qqqq1uXq14a4y999 Bx ""BB    H  %QWWYYqs^%'ZZBB%?%?##A#%F H H H %Qqqq1uX%'ZZBB%?%? A A A$Qqqq1uX%'ZZBB%?%?!$Q$%G I I I$QWWYYqs^%'ZZBB%?%?##A#%F H H H H !BG$$$A A&&& AFFHH-----s G$G GGTFc#Ktjd|r|rtfdfd||fVt dddD]4}||d|d| fV|d|df|dd| ffV5t |j}d|d<t||j| }||fV||fVt |j}|ddkrd|d<t||j| }||fV||fV tfd t |j D}tfd t|j|D}tj |j } ||r|} n.tj |j }  | ||} |ru| jdkrtfd t|j|| jD} tfdt|j| | jD} n2|r|} n-tfdt |j D} |s.tfdt|j| D} | |} || | } | | fV)NrEcd|dztj}||dztj}ddtjdkr ||}}|dz}t|||SNrrrHr r rNr*rOrnrrrrRs r random_slicez,iter_random_view_pairs..random_slice Aqs"' 22{{5!A#RW{55 ;;q!27; + +q 0 0%D BJDUD$'''rcd|dz||zz }||dz |zzdz}dddkr|dz |dz }}|dkrd}|dz}t|||S)Nrrr r )rNr)rrrrrrRs rrandom_slice_fixed_sizez7iter_random_view_pairs..random_slice_fixed_sizes AqsT$Y//Q}$q( ;;q!   ! !'46%Daxx BJDUD$'''rrrr.r)r-rTc3K|]N}ddtjdkr"ddtjndVOdSrrHrrGNrNr*rOr;rPrRs rrSz)iter_random_view_pairs..r..Q99Q>>kk!Rrwk777DE......rc36K|]\}}||VdSrXr9r;psrs rrSz)iter_random_view_pairs..3FF$!Q<<1%%FFFFFFrc 3K|]N\}}}dddkr*dtd|d|zzndVOdS)rrrr N)rNrk)r;rrparRs rrSz)iter_random_view_pairs..-sFF'q!R"kk!Q//144;;q#aQrT*;*;<<<:;FFFFFFrc3:K|]\}}}|||VdSrXr9)r;rrrrs rrSz)iter_random_view_pairs..0sTFF#1a/.q!R88FFFFFFrc3K|]N}ddtjdkr"ddtjndVOdSrrrs rrSz)iter_random_view_pairs..5sr33 "kk!Qbgk>>!CC;;q"BG;<<.:s3KKda||Aq))KKKKKKr)r*rhrirr^listrrr-rArqrmr+shuffler transpose)re same_steps equal_sizerPrrstepss1t1t2r<steps2s2rbrrrRs @@@riter_random_view_pairsrs )   % %Cjll(((((((((( Q$JJJ 1a^^$$eQssVmABBi3ss7#####19ooGGAJ AQWg 6 6 6B R%KKK b&LLL19ooGqzA~~ AQWg 6 6 6B R%KKK b&LLL'....$QV}}.....FFFF#agu2E2EFFF F F Yqv   B  BB16""B KKOOO bE  3v{{FFFF+.qwAG+D+DFFFFFFFFFF'*17FAG'D'DFFFFFBB  3FF3333$)!&MM33333F LKKKKc!'66J6JKKKKKB KKOO bEOOB  d O'rc.tjgdtj}d}d}t||}t |||krt |\}}tj||} tj||} tj|||||} tj||t} | | krt| | | | krt| | | r | r|dz }n|dz }t |||kdSdS)N"GarHrrr) r*rrrrlnextrrr ) get_max_workrrtrefeasible infeasible pair_iterr<rbbounds_overlapmay_share_answer easy_answer exact_answers r check_may_share_memory_easy_fuzzrBs8 bh///AHJ&q*55I h # #i / /I1,Q22.q!44)!Qa9K9KLLL *1a/JJJ , & & l 3 3 3 ~ - - )> : : :   A a ' h # #i / / / / / /rc,tddddS)NcdSNrr9r<rbs rz1test_may_share_memory_easy_fuzz..gsqrTrrrtrr9rrtest_may_share_memory_easy_fuzzrbs/ %..04/3555555rc,tddddS)Nc<t|j|jdzS)Nr )rkrrs rrz3test_may_share_memory_harder_fuzz..uss1616?R?RTU?UrFrrrr9rr!test_may_share_memory_harder_fuzzrls1%2U2U05/3555555rc&tjgdtj}ttj||dttj||d|ddddddddf}|ddddddddf}ttj||dttj||ddt tjtj||ddS) N)rrrJrHTFr rrr)r*rrr shares_memoryr/r TooHardError)rer<rbs rtest_shares_memory_apirzs "'***A!!Q''...!!QVVXX..666 !!!CCaC!) A !!!CCaC!) A!!Q''...!!Q666==="/2#3QAFFFFFFrctjdg}tttj||ddztttj||ddzdS)Nrr dr)r*rr OverflowErrorrr)res r"test_may_share_memory_bad_max_workrsW ! A-!4aRWMMMM-!11a"c'JJJJJJrcFd d}|ddd|ddddS) Nc Jt||dd}||du}|ttdt||Dtdt||Dktt dt||Dtt dt||D|r!t|dut |dSt|dut |dS)Nrr)require_ub_nontrivialc3&K|] \}}||zV dSrXr9rds rrSzCtest_internal_overlap_diophantine..check..s*221!222222rc3,K|]\}}||zdzVdSr Nr9)r;r<us rrSzCtest_internal_overlap_diophantine..check..s.9W9WTQ!A#q&9W9W9W9W9W9Wrc3<K|]\}}d|cxko|kncVdSrgr9r;rers rrSzCtest_internal_overlap_diophantine..check..s:::1Q ! ::::::rc3.K|]\}}||dzkVdSrr9rs rrSzCtest_internal_overlap_diophantine..check..s.88daQT 888888r)rrr`rmr0rorepr)rurvexistsrxs rcheckz0test_internal_overlap_diophantine..checks  aAQ ? ? ? >tmF = C22Aq 22222c9W9WSQRTUYY9W9W9W6W6WW X X X C::Aq ::::: ; ; ; C88c!Qii88888 9 9 9  ( ATM477 + + + + + AItAww ' ' ' ' 'r)rr )rrJT)r)rJr )rFrXr9)rs r!test_internal_overlap_diophantinersL((((" E&*T**** E(OE222222rcFtjgdtj}tjdfdd}d}||krt fdt |jD}tj|j} |t fdt|j |D}|| |}tt| |d z }||kdSdS) NrrHrEcd|dztj}||dztj}ddtjdkr ||}}|dz}t|||Srrrs rrz2test_internal_overlap_slices..random_slicerrrc3K|]N}ddtjdkr"ddtjndVOdSrrrs rrSz/test_internal_overlap_slices..rrc36K|]\}}||VdSrXr9rs rrSz/test_internal_overlap_slices..rrr)r*rrrhrirAr^rqr+rrmr-rrr) recasesrtrrrr<rrRs @@rtest_internal_overlap_slicesrsC bh///A )   % %C((((( EI )  ....$QV}}.....Yqv   B FFFF#agu2E2EFFF F F bEOOB  $Q'''(((   )      rct|}t}td|jD}t j|D]K}t dt|j|D}||vrd}n| |Ld}||kr+t||t|j|jf|||krt|||S)Nc34K|]}t|VdSrXr])r;rs rrSz)check_internal_overlap..s(--588------rc3&K|] \}}||zV dSrXr9)r;rras rrSz)check_internal_overlap..s*77TQQqS777777rTFr) rsetrAr-r r!r`rmraddr r)r<manual_expectedrmrzvoffsetexpecteds rcheck_internal_overlaprs 1  C A --QW--- - -F   '77SA%6%677777 Q;;H E EE&MMMM hS(D!)QW1E,F,FGGGG"x?'B'BX/// Jrctjdtj}t |dt |gdt |dd}t |dt |dd}t |dt |dd}t |dt |dd }t |dt |dd }t |dt |d d }t |dt |d d }t |dt |d d}t |ddS)NrF)rr)rrrr-)rrTr8r@)r )ri)Wr)rr)rr)r*r+astyperrr.r)rer<s rtest_internal_overlap_manualrss ! BG$$A1e$$$199R==%0001fF333A1e$$$1fF333A1d###1d$///A1e$$$1d$///A1e$$$1d$///A1d###1j999A1d###1j888A1e$$$1j888A1e$$$$$rcH tjdtj}d}d}d}tjd t |||kr ddtj}t fdt|D}t fdt|D}t||| }t|}|r|dz }n|dz }t |||kdSdS) NrrrrErrHc3\K|]&}ddtjV'dS)irHNrrs rrSz-test_internal_overlap_fuzz.. sK.. E4rw ??......rc3\K|]&}ddtjV'dS)rrrHNrrs rrSz-test_internal_overlap_fuzz..sK,,kk!Rrwk77,,,,,,rr) r*r+rrrhrirlrNrOrAr^rr) reoverlap no_overlaprtrqrr-r<resultrRs @rtest_internal_overlap_fuzzrsL ! BG$$AGJI )   % %C gz " "Y . .{{1arw{//....!&t.....,,,,$T{{,,,,, q' 7 7 7'**   qLGG !OJ gz " "Y . . . . . .rc ^Gdd}Gdd}||fD] }tjd}ttj||ddd|dddttj||ddd|ddd ttj||ddd|dddttj||ddd|ddddS) Nc*eZdZdZedZdS)(test_non_ndarray_inputs..MyArrayc||_dSrXrselfrs r__init__z1test_non_ndarray_inputs..MyArray.__init__ DIIIrc|jjSrX)rrr&s rrz.MyArray.__array_interface__"s 90 0rN)__name__ __module__ __qualname__r'propertyrr9rrMyArrayr"s>     1 1  1 1 1rr/ceZdZdZdZdS))test_non_ndarray_inputs..MyArray2c||_dSrXr$r%s rr'z2test_non_ndarray_inputs..MyArray2.__init__'r(rc|jSrXr$r*s r __array__z3test_non_ndarray_inputs..MyArray2.__array__*s 9 rN)r+r,r-r'r4r9rrMyArray2r1&s2        rr5rr rr)r*r+rrr)r/r5clsres rtest_non_ndarray_inputsr7sa11111111";; IaLL#CC##A#KK14a499:::B$SS33Q3[[!ADqD':::;;; Qqt!tWq1v66777#CC!$Q$LL!CCaC&99::::;;rcddlm}t|j}d|d<dg|d<t j|||S)z@Construct an array viewing the first byte of each element of `x`r) DummyArray|b1typestr)rr:descr)numpy.lib.stride_tricksr9dictrr*asarray)rer9 interfaces rview_element_first_byterA7sV222222Q*++I Ii%Ig :jjA.. / //rc T||d<t|}||d<|}||i||d<|}||d<||i|}||krt||dSdS)z} Check that operation(*args, out=out) produces results equivalent to out[...] = operation(*args, out=out.copy()) out.N)r>r/ror ) operationargsrCkwargskwargs2out_origrrs rassert_copy_equivalentrI@s F5M6llGXXZZGENxxzzHy$*'**CHxxzzHCH )T $V $ $ ) ) + +C x$S(#####$$rceZdZdZejdfdZejj dZ ejj dZ dZ dZ dZd Zejj d Zd Zd Zd Zejj dZdZdS) TestUFuncz1 Test ufunc call memory overlap handling rcgd}tjd}tddD]}|dd|d||}t |dd } ||dzd zz} d} | | krt| \} } | }| }|/t|| g| tj | | r| dz } nMtj t|dgD](}|| d <|| d <|| | |\}}|dkr$tdg|z}|:|tddgdg|dz zz}nwtd|gdg|dz zz}n[|3| j|d z}|dkrt||dz||<n,|||<n&| j||ksJtd|||<| t|}|r|g}tj | |r| dz } t|| g||*| | kdS)Nrrr rErrJri)rFTrrr rC.skiprCaxis)r*rhrir^rNrrrr/rIrr chainrr-rAr.)r&rDget_out_axis_sizerIcountshapesrRrqreitrt overlappingr<rba_origb_origrUoutsize scalarizeslkb_outs rcheck_unary_fuzzzTestUFunc.check_unary_fuzzZs'''i##D))!QKK7 U7 UD Au6%4%= 99@@GGA'eMMMB$(Q.IK ))Bxx1$,*9qcqAAAA'1--)#q( )d dV D D#U#U!'#!'#.?->q!T-J-J*"f,,$$Dkk]T1<&&+Aqkk]aS$(^%C&+Aw&7&7%8A3q>%I&$%GDM1$4#'199/4QABtHH/0BtHH'(wt}'?'?'?'?+0G+<+<4 !%)) $6$)MM"$5$5E+Au55-'1,K/y1#5tTTTTT_ ))7 U7 Urc\|tjdtjdSrX)rcr*invertrr*s rtest_unary_ufunc_call_fuzzz$TestUFunc.test_unary_ufunc_call_fuzzs$ birx88888rc`|tjdtjddS)NrF)rX)rcr*negative complex128r*s r"test_unary_ufunc_call_complex_fuzzz,TestUFunc.test_unary_ufunc_call_complex_fuzzs+ bk4cJJJJJrcpd}|tjj|tjddS)NcP||jdkr |jdfSdS|j|dfSNrF)rSFrqrr-r<rbrUs rrWzFTestUFunc.test_binary_ufunc_accumulate_fuzz..get_out_axis_size4|6Q;;65=((=wt}e++rrFrIrX)rcr*r  accumulaterr&rWs r!test_binary_ufunc_accumulate_fuzzz+TestUFunc.test_binary_ufunc_accumulate_fuzzsK , , , bf/1B$&HC  9 9 9 9 9rcpd}|tjj|tjddS)Nc$d|dup |jdkfSr)rqros rrWzBTestUFunc.test_binary_ufunc_reduce_fuzz..get_out_axis_sizes$$,5!&A+6 6rrFrq)rcr*r reducerrss rtest_binary_ufunc_reduce_fuzzz'TestUFunc.test_binary_ufunc_reduce_fuzzsJ 7 7 7 bfm->$&HC  9 9 9 9 9rcXd}d}|||tjddS)NcP||jdkr |jdfSdS|j|dfSrmrnros rrWzDTestUFunc.test_binary_ufunc_reduceat_fuzz..get_out_axis_sizerprc |"t|}|t|z}n(|j|}|j||j|z}tjd||}tj||||S)NrrT)rnr-r*r+r reduceat)r<rCrUrridxs r do_reduceatz>TestUFunc.test_binary_ufunc_reduceat_fuzz..do_reduceatss|1vvSXX~wt}wt} $7)AtT**C6??1cs?>> >rrFrq)rcr*r)r&rWr~s rtest_binary_ufunc_reduceat_fuzzz)TestUFunc.test_binary_ufunc_reduceat_fuzzsU , , , ? ? ? k+<$&HC  9 9 9 9 9rc4d}tjdtj}|tj||ddd|tjdtj}|tj||ddd|dS)Nc||||}||||}t||dSNrR)r|r/r )ufuncr<r"rCc1c2s rrz:TestUFunc.test_binary_ufunc_reduceat_manual..checks^#((**#((**EEB3C00B r2 & & & & &r'rHr )r*r+rr r/)r&rr<s r!test_binary_ufunc_reduceat_manualz+TestUFunc.test_binary_ufunc_reduceat_manuals ' ' ' Ie28 , , , bfa44R4+++ Ie28 , , , bfa44R4!$$$$$rc 6gd}tj}tjd}t ddD]}|j|d|}t|dd}d|d zdzz}d }||krt|\} } t| j d ddks1t| j d ddks| j d dkrk| j d | j d kr| d d ddf} n | d ddd f} | j d } | | d z zdz} | | j d kr| d kr | d d| f} nctdttj | j d dz} | | d z zdz} | d d| ddf} | d d| f} tj| | r|d z }tjdd5t!|| g| dddn #1swxYwY||kdS)NrMrEr rJFTrQrFrrr .ignore)overinvalidrR)reuclidean_pdistr*rhrir^randrrrlr-rkrMsqrtrerrstaterI) r&rYgufuncrRrqrerZrtr[r<rbrrs rtest_unary_gufunc_fuzzz TestUFunc.test_unary_gufunc_fuzzs'''-i##D))!QKK# ?# ?D&$-(A'eMMMBq1},IK ))Bxx1qwrss|$$q((C ,=,=,A,AQWR[ST__72;,,#a' AA#aaa' AGBKQK1$ ##A#bqb& AAAs27172;#7#788!;<>>>???????????????5 ))# ?# ?s%HH H cRd d}tjdtj}|tj|ddd|tjdtj}tjdddtj}|tj|||dd dS) Nc|}|g||||}||||}nz|||||}|||||}t||dSrX)r/atr )rr<r"rba0rrs rrz-TestUFunc.test_ufunc_at_manual..checksBySXXZZ(((WWYYC   VVXXSXXZZ222WWYYC###VVXX r2 & & & & &rrrHr rrr KrX)r*r+rrer )r&rr<r"s rtest_ufunc_at_manualzTestUFunc.test_ufunc_at_manuals ' ' ' ' Ie28 , , , bi44R4!$$$ Ic * * *i3222 bfaa2h'''''rc  fd}tjtjtjtjtjtjtjtjg}d|D}|D]}tj |tj r tj n tj d}d}tj d|tj |||ztj |dz ddtj ||zdz |dz dtj dd|zdtj ||d|zzdtj d|zdz ddtj |d|zzdz |dz dg}tj||D]\}}tjdd|dzz|z| } | |} | |} tjd 5|| | || dd| || dd| || ddg| || ddg| dddn #1swxYwYdS) Nc|}|}|} ||} ||}t||t|tj}||d<||d< |||}||d<||d< |||}||d<||d< |||}t||t||dS)NrR.rCwhere)r/r rArr*bool_) r<rbr\r]b0rrmaskc3rs rrz3TestUFunc.test_unary_ufunc_1d_manual..check"sZVVXXFVVXXFBqb!!!BqaB r2 & & &+1--2228<.@s ...!"(1++...rrr rr r rrHr)r0)r*rrint32r~float32float64 complex64ri issubdtypeintegerre reciprocal index_expr r!r+rr.) r&rdtypesrIrraindicesxiyirreyrs @rtest_unary_ufunc_1d_manualz$TestUFunc.test_unary_ufunc_1d_manuals ' ' ' ' '8'28RXrx*blBM;..v... 1 1E}UBJ// &  AA RaR  QqsU# QqSW"W% QqSU1Q3r\* Vac!V$ Qq1uQY' QqSUYBY' QqsU1WQqS^, G$+GW== 1 1BIaQqS1E:::bEbE[X...11E!QKKKE!BQB%OOOE!BCC&!$$$E!BQB%--++Q///E!BCC&..,,a000111111111111111 1' 1 1sBI&&I* -I* c"tjfd}tjdtj}||||||||||||dS)Nc|||}|||}t||dS)Nrr/r )r<rCrrrrs rrz4TestUFunc.test_unary_ufunc_where_same..checkgsUqchhjj <<.checkvsRBq!$$$Bq!###B r2 & & & & &rrr rrrJr )r*r rrrr~rrrrirrr r!r+rr.) r&rrIrrarrrerzrrs @rtest_binary_ufunc_1d_manualz%TestUFunc.test_binary_ufunc_1d_manualrs ' ' ' ' ' grx28j"*blBMK 0 0EAAG  L!A#a(L1QqS5+L1Q+L1Q3q1aR0  %,WgwGG 0 01aIacNN))%00aDaDaDaAaeQ"""afa###aemmB''A...afnnR((!Q///a2A2"""a233###a2A2r**A...a233++Q////! 0! 0 0rctjd}|dd}||jz }t ||jz ddS)NrEr)r*rhrirTr )r&rRres rtest_inplace_op_simple_manualz'TestUFunc.test_inplace_op_simple_manualsQi##D)) HHS#   QS1qs7A&&&&&rN)r+r,r-__doc__r*rrcpytestmarkslowrfrjrtrxrrrrrrrrr9rrrKrKUsHDF8#'=U=U=U=U~ [999 [KKK 9 9 9999999. % % % [)?)?)?V(((0B1B1B1H    [)0)0)0V'''''rrK)TFrX)0r rnumpyr*numpy.core._multiarray_testsrr numpy.corerr=r numpy.testingrrr r r&rrAr-rrrr#r'r5rCrrr|rrrrrrrrrrrrrrr7rArIrKr9rrrs LLLLLLLL######......   tfun    000 > > > * * *9$9$9$x 9 9 9...40.0.0.fUUUUp   @555 5 5 5 G G GKKK 333,>0"%"%"%J8;;;8000$$$*N'N'N'N'N'N'N'N'N'N'r