
     hX              	       h   d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlmZ ddlmZmZ ddlmZmZ ddlmZ ddlmZmZ ddlmZmZ dd	lmZ dd
lmZmZ ddlmZmZ ddlm Z m!Z! ddlm"Z" ddl#m$Z$m%Z%m&Z& ddl'm(Z( dmdZ)d Z*d Z+d Z,d Z- e$dddg          d             Z.d Z/d Z0d Z1d Z2d Z3d Z4d  Z5d! Z6g fd"Z7d# Z8e  e$d$dd%g          d&                         Z9e d'             Z:d( Z;d) Z<d* Z=d+ Z> e$d,d-gd.d%fg d/dfg          d0             Z?d1 Z@d2 ZAd3 ZBd4 ZCd5 ZDd6 ZEd7 ZFd8 ZGd9 ZHd: ZId; ZJd< ZKd= ZLd> ZMd?d@dAdBZNdCeOdDePdEePfdFZQdG ZRdH ZSdndIZTdJ ZUdK ZVdL ZWdM ZXdN ZYdodOZZe"dP             Z[e"dQ             Z\dR Z] G dS dTe          Z^ G dU dVe          Z_ e$dWd e`             ea            g          dX             ZbdY ZcdZ Zdd[ Zed\ Zfd] Zgd^ Zhd_ Zid` Zjda ZkdpdbZlejm        $                    dcdddedfd%dgdhdidjidkg          dl             ZndS )qz
Test the memory module.
    N)Memory)MemorizedFuncNotMemorizedFunc)MemorizedResultNotMemorizedResult)_FUNCTION_HASHES)register_store_backend_STORE_BACKENDS)_build_func_identifier_store_backend_factory)JobLibCollisionWarning)Paralleldelayed)StoreBackendBaseFileSystemStoreBackend)
with_numpynp)with_multiprocessing)parametrizeraiseswarns)hash   c                     | dz  |z   S )z3 A module-level function for testing purposes.
        )xys     S/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/joblib/test/test_memory.pyfr    )   s     6A:    c                     t          |d          }|                    |           } t          d          D ]=}t          d          D ]+} | |          |k    sJ t          |          |dz   k    sJ ,>dS )z Given a function and an accumulator (a list that grows every
        time the function is called), check that the function can be
        decorated by memory to be a lazy identity.
    r   locationverbose   r   r   N)r   cacherangelen)funcaccumulatorr$   memoryi_s         r   check_identity_lazyr/   1   s     Xq111F<<D1XX - -q 	- 	-A477a<<<<{##q1u,,,,,	-- -r!   c                    | j                                         \  }t          j                            |j        d          }t          |d          5 }|                    d           d d d            d S # 1 swxY w Y   d S )N
output.pklwgarbage)store_backend	get_itemsospathjoinopenwrite)r,   single_cache_itemoutput_filenamer    s       r   corrupt_single_cache_itemr=   @   s    -7799gll#4#9<HHO	os	#	# q		                 s   A44A8;A8c                 D    g fd}|                     | d|           S )Nc                 2                         |            d S Nappend)itemrecordeds    r   append_to_recordz6monkeypatch_cached_func_warn.<locals>.append_to_recordN   s    r!   warn)setattr)r*   monkeypatch_fixturerE   rD   s      @r   monkeypatch_cached_func_warnrI   G   sA    
 H    f.>???Or!   c                    t                      fd}t          || j                   dD ]}dD ]}t          | j        d||          }t	          j        | j        d           |                    |          } |d           |                    d	
           t                    } |d          }t                    |dz   k    sJ |	                    |d          |k    sJ t                    |dz   k    sJ d|_
        t          | j        d          } |                    |          d           dS )z, Simple test of memory lazy evaluation.
    c                 2                         d           | S Nr   rA   lr+   s    r   r    z"test_memory_integration.<locals>.f^       1r!   )FT)rN
   )r$   r%   	mmap_modecompressT)ignore_errorsr   F)rF   __main__r   r#   N)listr/   strpathr   shutilrmtreer'   clearr)   eval
__module__)	tmpdirr    rS   rR   r,   gcurrent_accumulatoroutr+   s	           @r   test_memory_integrationra   V   s    &&K
     ;777 " ; ;$ 	 	IV^R&/(D D DF M&.====QAAaDDDGGG"%k"2"2!A$$CC;#6#:::::{{1a  C'''';#6#:::::: ALV^Q777FFLLOOAr!   call_before_reducingTFc                 $  
 dD ]}d}d                     |          }t          t          t          j        |          |d                     t                      d         }d|_         |d          dk    sJ |j        j        |k    sJ t          | j
        d	
          }|                    |          
t          t          j        | dz                      dk    sJ t          j        | dz            d	         }d|v sJ | dz  |z  }|d	k    rt          j        |          dgk    sJ t          j        |dz            g k    sJ |r[ 
d           t          t          j        |dz                      dk    sJ  t          d          
fddD                       }	nZ t          d          
fddD                       }	t          t          j        |dz                      dk    sJ  
d           t          t          j        |dz                      dk    sJ +t          t          j        |dz                      dk    sJ  
d           t          t          j        |dz                      dk    sJ d S )N)r   r   z0
        def f(x):
            return x
        z<ipython-input-{}-000000000000>exec)filenamemoder    rU   r   r   r#   joblibzipython-inputr&   r   n_jobsc              3   H   K   | ]} t                    |          V  d S r@   r   .0r-   cached_fs     r   	<genexpr>zHtest_parallel_call_cached_function_defined_in_jupyter.<locals>.<genexpr>   6      (N(N!):):):1)=)=(N(N(N(N(N(Nr!   )r   r   c              3   H   K   | ]} t                    |          V  d S r@   rk   rl   s     r   ro   zHtest_parallel_call_cached_function_defined_in_jupyter.<locals>.<genexpr>   rp   r!      )formatrd   compiletextwrapdedentlocalsr\   __code__co_filenamer   rW   r'   r)   r6   listdirr   )r]   rb   
session_noipython_cell_sourceipython_cell_id	aliased_fr,   f_cache_relative_directoryf_cache_directoryresrn   s             @r   5test_parallel_call_cached_function_defined_in_jupyterr      s   &  MA MA

 <BB:NN 344(  	
 	
 	
 HHSM	)	 y||q    !-@@@@;;;<<	**2:fx/0011Q6666%'Z0A%B%B1%E""<<<<<"X-0JJ??:/00SE9999:/#566"<<<<#  2:&7#&=>>??1DDDD )ha((((N(N(N(Nv(N(N(NNN )ha((((N(N(N(Nv(N(N(NNN2:&7#&=>>??1DDDD
 rz"3c"9::;;q@@@@@ rz"3c"9::;;q@@@@HQKKK rz"3c"9::;;q@@@@@[MA MAr!   c                     t                      fd} t          dd          }|                    |           }t          d          D ]4}t	                    } |d           t	                    |dz   k    sJ 5dS )z, Test memory with location=None: no memoize c                 2                         d           | S rL   rA   rM   s    r   ffztest_no_memory.<locals>.ff   rO   r!   Nr   r#   rr   r   )rV   r   r'   r(   r)   )r   r,   ggr.   r_   r+   s        @r   test_no_memoryr      s    &&K     T1---F	b		B1XX ; ;!+..
1;#6#::::::; ;r!   c                     t                      d	fd	}t          || j                   t          | j        d          }|                    |          } |dd          dk    sJ dS )
z4 Test memory with a function with keyword arguments.Nr   c                 2                         d           | S rL   rA   )rN   mr+   s     r   r^   ztest_memory_kwarg.<locals>.g   rO   r!   r   r#      r   )rN   r   rL   )rV   r/   rW   r   r'   )r]   r^   r,   r+   s      @r   test_memory_kwargr      s    &&K      ;777V^Q777FQA1rQ<<<2r!   c                 f    t                      fdfd}t          || j                   dS )z+ Test memory with a function with a lambda.c                 2                         d           | S z4 A helper function to define l as a lambda.
        r   rA   )r   r+   s    r   helperz"test_memory_lambda.<locals>.helper       	1r!   c                      |           S r@   r   )r   r   s    r   <lambda>z$test_memory_lambda.<locals>.<lambda>  s    &&)) r!   N)rV   r/   rW   )r]   rN   r+   r   s     @@r   test_memory_lambdar     sP    &&K     	A;77777r!   c                 d   t          | j        d          }|j        d             }|}|j        d             }|}t          t                    5 } |d            |d           ddd           n# 1 swxY w Y   t          |          dk    sJ dt          |d         j                  v sJ dS )z> Check that name collisions with functions will raise warningsr   r#   c                     | S )z0 A first function called name_collision
        r   r   s    r   name_collisionz2test_memory_name_collision.<locals>.name_collision  	     r!   c                     | S )z1 A second function called name_collision
        r   r   s    r   r   z2test_memory_name_collision.<locals>.name_collision  r   r!   r   N	collision)r   rW   r'   r   r   r)   strmessage)r]   r,   r   abwarninfos         r   test_memory_name_collisionr     s   V^Q777F\  \
 	A\  \
 	A	%	&	& (	!	!               x==A#hqk122222222s   A22A69A6c                 |   t          | j        d          }d }|                    |          }d }|                    |          }t          t                    5 } |d          dk    sJ  |d          dk    sJ  |d          dk    sJ 	 d d d            n# 1 swxY w Y   t          |          dk    sJ d S )Nr   r#   c                     | S r@   r   r   s    r   r   z7test_memory_warning_lambda_collisions.<locals>.<lambda>2  s    ! r!   c                     | dz   S rL   r   r   s    r   r   z7test_memory_warning_lambda_collisions.<locals>.<lambda>4  s
    !a% r!   r   r   rr   )r   rW   r'   r   r   r)   )r]   r,   r   r   r   s        r   %test_memory_warning_lambda_collisionsr   /  s   V^Q777FAQAAQA	%	&	& (qttqyyyyqttqyyyyqttqyyyyy               x==As   4BB #B c                    t          | j        d          }t          d          }|                    |          }t          d          }|                    |          }t	          t
                    5 } |d            |d            |d           d d d            n# 1 swxY w Y   t          |          dk    sJ dt          |d         j                  	                                v sJ d S )Nr   r#   lambda x: xzlambda x: x+1r   r   zcannot detect)
r   rW   r[   r'   r   r   r)   r   r   lower)r]   r,   a1b1r   s        r   'test_memory_warning_collision_detectionr   A  s'    V^Q777F	m		B	b		B	o		B	b		B	%	&	& (
1
1
1              
 x==Ac(1+"566<<>>>>>>>>s   3"B!!B%(B%c                     t                      fd}ddl} |j        |d          }t          || j                   dS )z$ Test memory with functools.partial.c                 2                         d           |S r   rA   r   r   r+   s     r   r*   z!test_memory_partial.<locals>.funcW  r   r!   r   Nr   )rV   	functoolspartialr/   rW   )r]   r*   r   functionr+   s       @r   test_memory_partialr   S  sa    &&K      y q))H+v~>>>>>r!   c                     t          | j        d          }t          d          }|                    |          } |d          dk    sJ dS )zF Smoke test memory with a function with a function defined in an eval.r   r#   r   r   N)r   rW   r[   r'   )r]   r,   r   mms       r   test_memory_evalr   c  sK    V^Q777F]A	aB2a55A::::::r!   c                 N    t          |           }|                     d           |S )zx A function with a side effect in its arguments.

        Return the length of its argument and append one element.
    N)r)   rB   )r   len_xs     r   count_and_appendr   m  s#    
 FFEHHTNNNLr!   c                     t          | j        d          }|                    t                    } |            dk    sJ  |            dk    sJ dS )zx Check that if a function has a side effect in its arguments, it
        should use the hash of changing arguments.
    r   r#   r   N)r   rW   r'   r   )r]   r,   r*   s      r   test_argument_changer   w  sX     V^Q777F<<())D 466Q;;;; 466Q;;;;;;r!   rR   rP   c                   	 t                      	d	fd	}t          | j        |d          }|                    |          }t          j                            d          }t          d          D ]d}|                    d          }t          d          D ]=}t	          j	         ||          |k              sJ t          	          |dz   k    sJ >edS )	z/ Test memory with a function with numpy arrays.Nc                 2                         d           | S rL   rA   rM   s    r   nztest_memory_numpy.<locals>.n  rO   r!   r   r$   rR   r%   r&   )rQ   rQ   r   r@   )rV   r   rW   r'   r   randomRandomStater(   random_sampleallr)   )
r]   rR   r   r,   cached_nrndr-   r   r.   r+   s
            @r   test_memory_numpyr     s     &&K      V^y  F||AH
)


"
"C1XX - -h''q 	- 	-A6((1++*+++++{##q1u,,,,,	-- -r!   c                 |   t          | j        dd          }|                                d             }t          j        d          } ||          } ||          }t          |t          j                  sJ |j        dk    sJ t          |t          j                  sJ |j        dk    sJ ~~t          j	                     t          |           t          ||          } ||          }t          |          dk    sJ d}	|	|d         v sJ t          |t          j                  sJ |j        dk    sJ dS )	z8Check that mmap_mode is respected even at the first callrP   r   r   c                     | dz  S Nr   r   r   s    r   twicez0test_memory_numpy_check_mmap_mode.<locals>.twice      1ur!   r&   r   Exception while loading resultsN)r   rW   r'   r   ones
isinstancememmaprf   gccollectr=   rI   r)   )
r]   monkeypatchr,   r   r   r   crecorded_warningsdexception_msgs
             r   !test_memory_numpy_check_mmap_moder     sS    V^sAFFFF\\^^  ^ 	

AaAaAa#####6S====a#####6S==== 	
	JLLLf%%% 5UKHHaA !!Q&&&&5M-a00000a#####6S======r!   c                    t          | j        d          } G d dt                    |j        d	fd	            } |             t	          d          D ]4}t                    5   |d           ddd           n# 1 swxY w Y   5dS )
z1 Smoketest the exception handling of Memory.
    r   r#   c                       e Zd ZdS )*test_memory_exception.<locals>.MyExceptionN__name__r\   __qualname__r   r!   r   MyExceptionr             r!   r   c                     | rd S r@   r   )excr   s    r   hz test_memory_exception.<locals>.h  s     		 	r!   r&   r   N)r   )r   rW   	Exceptionr'   r(   r   )r]   r,   r   r.   r   s       @r   test_memory_exceptionr     s    V^Q777F    i    \     \
 ACCC1XX  K   	 	AaDDD	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 s   (B  B	B	c                 ~   t          | j        d          }t                      |                    dg          d
fd	            }|j        dgk    sJ  |dd           t                    dk    sJ  |dd           t                    dk    sJ  |dd           t                    dk    sJ d	S )z# Test the ignore feature of memory r   r#   r   ignorer   c                 2                         d           d S rL   rA   r   s     r   zztest_memory_ignore.<locals>.z  s    1r!   r   r   Nr   r   rW   rV   r'   r   r)   )r]   r,   r   r+   s      @r   test_memory_ignorer     s    V^Q777F&&K\\#\       8uAa1IIII{q    Aa1IIII{q    Aa1IIII{q      r!   c                    t          | j        d          }t                      d }|                    dg          |dfd	                        }|j        dgk    sJ  |dd           t                    dk    sJ  |dd           t                    dk    sJ  |dd	           t                    dk    sJ d
S )z; Test the ignore feature of memory on a decorated function r   r#   c                 F     t          j                    fd            }|S )Nc                       | i |S r@   r   )argskwargsr    s     r   wrappedz?test_memory_ignore_decorated.<locals>.decorate.<locals>.wrapped  s    1d%f%%%r!   )r   wraps)r    r   s   ` r   decoratez.test_memory_ignore_decorated.<locals>.decorate  s6    				& 	& 	& 	& 
		&r!   r   r   r   c                 2                         d           d S rL   rA   r   s     r   r   z'test_memory_ignore_decorated.<locals>.z  s     	1r!   r   r   Nr   r   )r]   r,   r   r   r+   s       @r   test_memory_ignore_decoratedr     s   V^Q777F&&K   \\#\     X   8uAa1IIII{q    Aa1IIII{q    Aa1IIII{q      r!   c                     t          | j        d          }|j        d             } |d          dk    sJ  |d          dk    sJ  |d          dk    sJ dS )	z_Non-regression test against 0.12.0 changes.

    https://github.com/joblib/joblib/pull/751
    r   r#   c                     | dz   S rL   r   r   s    r   plus_onez,test_memory_args_as_kwargs.<locals>.plus_one  r   r!   r   r   r   r&   N)r   rW   r'   )r]   r,   r   s      r   test_memory_args_as_kwargsr     s    
 V^Q777F\  \ 8A;;!8a===A 8a===Ar!   zignore, verbose, mmap_moder   d   rQ   c                     t          | j        d          }|                    |||          d             }|j        |k    sJ |j        |k    sJ |j        |k    sJ dS )z7Check cache may be called with kwargs before decoratingr   r#   )r   r%   rR   c                     d S r@   r   r   s    r   r   z"test_partial_decoration.<locals>.z   s    r!   N)r   rW   r'   r   _verboserR   )r]   r   r%   rR   r,   r   s         r   test_partial_decorationr     s     V^Q777F\\I\FF  GF 8v:    ;)######r!   c                    t          | j        d          }t                              d          }|                    d            | j        dg|R  j        }|                    t                    }t          t                    }t          j
                            |j        j        |          }||k    sJ t          j
                            |          sJ |j        t          j
                            |j        j                  k    sJ t          j                     |                                rJ t          j
                            t          j
                            |d                    sJ |                                sJ |                    d          \  }}t          j
                            |j        j        ||          } |d          }t          j
                            |          sJ t          j        t          j
                            |d                     | |d          k    sJ d S )	Nr   r#   .r    rg   zfunc_code.pyr   r1   )r   rW   r   splitrB   r8   r'   r    r   r6   r7   r4   r$   existsdirnamer   rZ   _check_previous_func_code_get_output_identifiersremove)	r]   r,   r7   r^   func_idr$   args_id
output_dirr   s	            r   test_func_dirr  )  s   V^Q777F>>#DKK6;x'$'''/DQA$Q''Gw||AO4g>>Ht7>>$?bgooao.FGGGGGG
 **,,,,,7>>"',,t^<<=====&&((((( 0033GWao6IIJ	!A7>>*%%%%%Ibgll:|44555!999999r!   c                 \   t          | j        d          }|                    t                    } |d          }t	          j        t	          j        |                    }|                    d          \  }}t          j	        
                    |j        j        ||          }t          j	                            |          sJ ||j                            ||g          k    sJ t	          j        t	          j        |                    }|j        j        |j        j        k    sJ t          d d          }t	          j        t	          j        |                     |                    t                    }t	          j        t	          j        |                    }	 |	d           d S )Nr   r#   r   )r   rW   r'   r    pickleloadsdumpsr  r6   r7   r8   r4   r$   r  	load_item)
r]   r,   r^   outputr   r	  r
  r  memory2gps
             r   test_persistencer  I  sX   V^Q777FQAQqTTFV\!__%%A0033GWao6IIJ7>>*%%%%%Q_../ABBBBBBl6<//00G(G,A,JJJJJ T1---F
Lf%%&&&QA	fl1oo	&	&BBqEEEEEr!   c                    t          t          | j                  t          | j        d                              t                    fD ]}|                    d          }|rJ t          |t                    sJ  |d          dk    sJ |                    d          }|sJ t          |t                    sJ |                                 d S )Nr   r#   r      )	r   r    rW   r   r'   check_call_in_cacher   boolrZ   )r]   r*   results      r   test_check_call_in_cacher  `  s    q&.11;;;AA!DDF 	 	))!,,z&$'''''tAww!||||))!,,v&$'''''

	 	r!   c                    t          t          t          | j                  t	          t                    t          | j        d                              t                    t          d                               t                    ft          t          t          t          f          D ]\  }} |d          dk    sJ |	                    d          }t          ||          sJ |                                dk    sJ |                                 t          t                    5  |                                 d d d            n# 1 swxY w Y   |                                 d S )Nr   r#   r$   r   r  )zipr   r    rW   r   r   r'   r   r   call_and_shelver   getrZ   r   KeyError)r]   r*   Resultr  s       r   test_call_and_shelver#  m  s    ]1fn==-a00#V^,-/ / //4uQxx#T22288;;	 -.@,.@BC C  f tAww!||||%%a((&&)))))zz||q    H 	 	JJLLL	 	 	 	 	 	 	 	 	 	 	 	 	 	 	! s   (E		E	E	c                    t          | j        d                              t                    }|                    d          }t          |t                    sJ t          t                    5 }|j	        |j
        k    sJ 	 d d d            n# 1 swxY w Y   t          |          dk    sJ dt          |d         j                  v sJ d S )Nr   r#   r   r   z1The 'argument_hash' attribute has been deprecated)r   rW   r'   r    r  r   r   r   DeprecationWarningargument_hashr
  r)   r   r   )r]   r*   r  r2   s       r   "test_call_and_shelve_argument_hashr(    s    6>1555;;A>>D!!!$$Ffo.....	!	"	" 6a#v~555556 6 6 6 6 6 6 6 6 6 6 6 6 6 6q66Q;;;;>qu}     s   /BBBc                    |                      d          }|                    d           t          j        |j                  j        }t          j        d           |                                dk    sJ |t          j        |j                  j        k    rt          j
        d           t          | j        d          }|                    t                    }|                    d          \  }}t          j                             |j        j        ||d          } |d          dk    sJ t          j        |          j        }t          j        d	           |                    d          }	t'          |	t(                    sJ t          j        |          j        |k    sJ t          j        d	           |	                                dk    sJ t          j        |          j        |k    sJ d
S )z6Check call_and_shelve only load stored data if needed.test_accessg      ?z>filesystem does not support fine-grained access time attributer   r#   r   r1   r  r   N)r8   r:   r6   statrW   st_atimetimesleepreadpytestskipr   r'   r    r  r7   r4   r$   r  r   r   r   )
r]   test_access_time_filetest_access_timer,   r*   r	  r'  result_pathfirst_access_timer  s
             r   .test_call_and_shelve_lazily_load_stored_resultr6    s   "KK66...w4<==F 	JsOOO %%''=888827#8#@AAJJJ 	   	! 	! 	! V^Q777F<<??D!99!<<G]',,v3<&|E EK477a<<<<,,5JqMMM !!!$$Ffo.....7;(,=====JqMMM ::<<17;(+<<<<<<<r!   c                 8   t          t          | j                  t          t                    fD ]}|                     d          j        }|                    d          }t          |d          5 }t          j        ||           d d d            n# 1 swxY w Y   t          |d          5 }t          j	        |          }d d d            n# 1 swxY w Y   |
                                |
                                k    sJ t          j        |           d S )Nzpickling_test.datr   wbrb)r   r    rW   r   r8   r  r9   r  dumploadr   r6   r  )r]   r*   re   r  fpresult2s         r   test_memorized_picklingr>    st   q&.113CA3F3FG  ;;233;%%a(((D!! 	$RK###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$(D!! 	&Rk"ooG	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&{{}}

,,,,
	( s$   0BB	B	-CC	C	c                 X   t          t          | j                  }|                    d          }t          t          | j                  }|                    d          }|                                |                                k    sJ t          |          t          |          k    sJ t          t                    }t          |           t          |                    d                     t          t          | j        dt          j                              }|                    d          }|                                 t          t          | j        d          }|                    d          }|                                 t          t          | j        dt          j                              }|                    d          }|                                 t          t          | j        d          }|                    d          }|                                 d S )Nr      )r%   	timestamp)r%   r  )r   r    rW   r  r   reprr   r-  )r]   r*   r  func2r=  s        r   test_memorized_reprrD    s   FN++D!!!$$F!V^,,E##A&&G::<<7;;==((((::e$$$$ ADJJJ		a	 	 !!! FNB$)++NNND!!"%%F
JJLLLFNB777D!!"%%F
JJLLLFNAMMMD!!"%%F
JJLLLFNA666D!!"%%F
JJLLLLLr!   c                    |                     d          j        }t          j                            |d          }d}t          |d          5 }|                    |           d d d            n# 1 swxY w Y   |                    |           dd l}t          |j        d          }|
                    |j                  }	 |	d            |	d            |	d           t          |d          5 }|                    d	|z              d d d            n# 1 swxY w Y    |	d            |	d           t          j        |           t          j         |           d
}t          |d          5 }|                    |           d d d            n# 1 swxY w Y    |	d            |	d           t          j                            d           t          j                            d           dd l}|
                    |j                  }	 |	d            |	d           |                                 \  }
}|
dk    sJ d S )N
tmp_importztmp_joblib_.pyz$def f(x):
    print(x)
    return x
r2   r   r#   r   r   z

z-def f(x):
    print("x=%s" % x)
    return x
z
Reloading
tmp_joblib_z1
2
Reloading
x=1
)mkdirrW   r6   r7   r8   r9   r:   syspath_prependrG  r   r'   r    rX   rY   sysstdoutmodulespop
readouterr)capsysr]   r   dir_namere   contentmodule_filetmpr,   r    r`   errs               r   test_memory_file_modificationrU    s    ||L))1Hw||H&677H7G	h		 #'"""# # # # # # # # # # # # # # # )))V^Q777FSUAAaDDDAaDDDAaDDD 
h		 ,&7*+++, , , , , , , , , , , , , , , AaDDDAaDDD M(HX@G	h		 #'"""# # # # # # # # # # # # # # # AaDDDAaDDD J]###KOOM"""SUA AaDDDAaDDD  ""HC*******s6   A//A36A34DD D4FFFc                     d S r@   r   r   r   s     r   _function_to_cacherX    s    Dr!   c                     | |z   S r@   r   rW  s     r   _sumrZ        q5Lr!   c                     | |z  S r@   r   rW  s     r   _productr]  !  r[  r!   c                    t           j        t          _        t          | j        d          }|                    t                    } |dd          dk    sJ  |dd          dk    sJ t          t                    5  t          j        t          _         |dd          dk    sJ  |dd          dk    sJ 	 d d d            d S # 1 swxY w Y   d S )Nr   r#   r   r   r&   )	rZ  rx   rX  r   rW   r'   r   r   r]  )r]   r,   r    s      r   *test_memory_in_memory_function_code_changer_  %  s   "&-V^Q777F'((A1Q77a<<<<1Q77a<<<<	%	&	&  &.&7#qAww!||||qAww!|||||	                 s   ?;CCCc                  N    t          d           } |                                  d S )Nr  )r   rZ   )r,   s    r   $test_clear_memory_with_none_locationra  5  s#    T"""F
LLNNNNNr!   kw1kw2rb  rc  c                    | |||fS r@   r   )r   r   rb  rc  s       r   func_with_kwonly_argsrf  :  s    ac>r!   r   r   returnc                     | |z   S r@   r   rW  s     r   func_with_signatureri  >  r[  r!   c                 z   t          | j        d          }|                    t                    } |ddd          dk    sJ t	          t
                    5 } |dddd	           d d d            n# 1 swxY w Y   |                    d
            |dddd           t	          t
                    5 } |dddd	           d d d            n# 1 swxY w Y   |                    d
           |                    t          dg          } |dddd          dk    sJ  |dddd          dk    sJ d S )Nr   r#   r   r   r&   )rb  )r   r   r&   rc  rr   )rc  z?Keyword-only parameter 'kw1' was passed as positional parameterrd  rc  r   )r   r   r&   rr   ignored)r   rW   r'   rf  r   
ValueErrormatch)r]   r,   func_cachedexcinfos       r   !test_memory_func_with_kwonly_argsrp  B  s   V^Q777F,,455K;q!###'77777 

		 $wAq!####$ $ $ $ $ $ $ $ $ $ $ $ $ $ $MM    
 K1!####	
		 $wAq!####$ $ $ $ $ $ $ $ $ $ $ $ $ $ $MM     ,,4eW,EEK;q!***l::::;q!	222lBBBBBBs$   A55A9<A98CCCc                     t          | j        d          }|                    t                    } |dd          dk    sJ d S )Nr   r#   r   g       @g      @)r   rW   r'   ri  )r]   r,   rn  s      r   test_memory_func_with_signaturerr  ^  sK    V^Q777F,,233K;q"######r!   c                 &   t          | j        d          }|                                d             t          t	          |                    }|D ]} |           t                    fd|D             }fd|D             }||fS )Nr   r#   c                     dS )N  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   args    r   get_1000_bytesz(_setup_toy_cache.<locals>.get_1000_bytesh  s    zr!   c                 F    g | ]}                     |          d          S r   )r  )rm   rw  rx  s     r   
<listcomp>z$_setup_toy_cache.<locals>.<listcomp>q  s<     ( ( ( $;;C@@C ( ( (r!   c                 f    g | ]-}t           j                            j        j        |          .S r   )r6   r7   r8   r4   r$   )rm   r  r	  rx  s     r   rz  z$_setup_toy_cache.<locals>.<listcomp>t  sF     3 3 3  W\\.">"G")74 4 3 3 3r!   )r   rW   r'   rV   r(   r   )	r]   
num_inputsr,   inputsrw  hash_dirnamesfull_hashdirsr	  rx  s	          @@r   _setup_toy_cacher  e  s    V^Q777F\\^^  ^ %
##$$F  s$^44G( ( ( ( &( ( (M3 3 3 3 3$13 3 3M =.00r!   c                 ^   t          |           \  }}}|j                                        }d |D             }t          |          t          |          k    sJ d fd|D             }d |D             }||k    sJ d |D             }d |D             }	d |D             }
|
|	k    sJ d S )Nc                     g | ]	}|j         
S r   )r7   rm   cis     r   rz  z#test__get_items.<locals>.<listcomp>}  s    )))R)))r!   c                 v      fdt          j                   D             }t          d |D                       S )Nc                 P    g | ]"}t           j                            |          #S r   r6   r7   r8   )rm   fn	directorys     r   rz  z;test__get_items.<locals>.get_files_size.<locals>.<listcomp>  s9     7 7 7 gll9b11 7 7 7r!   c              3   T   K   | ]#}t           j                            |          V  $d S r@   )r6   r7   getsize)rm   r<  s     r   ro   z:test__get_items.<locals>.get_files_size.<locals>.<genexpr>  s0      <<227??2&&<<<<<<r!   )r6   rz   sum)r  
full_pathss   ` r   get_files_sizez'test__get_items.<locals>.get_files_size  sR    7 7 7 7 "
9 5 57 7 7
<<<<<<<<r!   c                 &    g | ]} |          S r   r   )rm   hash_dirr  s     r   rz  z#test__get_items.<locals>.<listcomp>  s3     !< !< !<%- "0!9!9 !< !< !<r!   c                     g | ]	}|j         
S r   )sizer  s     r   rz  z#test__get_items.<locals>.<listcomp>  s    000B000r!   c                 N    g | ]"}t           j                            |d           #S )r1   r  )rm   r  s     r   rz  z#test__get_items.<locals>.<listcomp>  s8     3 3 3$ X|<< 3 3 3r!   c                     g | ]>}t           j                             t          j                            |                    ?S r   )datetimefromtimestampr6   r7   getatime)rm   r  s     r   rz  z#test__get_items.<locals>.<listcomp>  sI     $ $ $ 	''(8(8(<(<==$ $ $r!   c                     g | ]	}|j         
S r   last_accessr  s     r   rz  z#test__get_items.<locals>.<listcomp>  s    444R^444r!   )r  r4   r5   set)r]   r,   expected_hash_dirsr.   items	hash_dirsexpected_hash_cache_sizeshash_cache_sizesoutput_filenamesexpected_last_accesseslast_accessesr  s              @r   test__get_itemsr  z  s(   $4V$<$<!F **,,E))5)))Iy>>S!3444444= = =
!< !< !< !<1:!< !< !<00%000888883 3(13 3 3$ $"$ $ $ 54e444M2222222r!   c                 r   t          |           \  }}}|j                                        }|j                            d          }t	          |          }t
                              t          |          t          |                    sJ t	          |          |dz
  k    sJ |j                            d          }t          |          t          |          k    sJ |j                            d          }|g k    sJ d}	|j                            |	          }
t          |
          sJ t          |                      |j                            d          }t          |                              |          }t          d |D                       t          d |D                       k    sJ d S )	N2Kr   i   1M  ip  c              3   $   K   | ]}|j         V  d S r@   r  r  s     r   ro   z,test__get_items_to_delete.<locals>.<genexpr>  s$      ??2??????r!   c              3   $   K   | ]}|j         V  d S r@   r  r  s     r   ro   z,test__get_items_to_delete.<locals>.<genexpr>  s$      992999999r!   )r  r4   r5   _get_items_to_deleter)   r  issubsetsorted
differencemaxmin)r]   r,   expected_hash_cachedirsr.   r  items_to_delete	nb_hashesitems_to_delete_2048bitems_to_delete_emptybytes_limit_too_smallitems_to_delete_500bitems_to_delete_6000bsurviving_itemss                r   test__get_items_to_deleter    s   )9&)A)A&F#Q **,,E *??EEO+,,I<<O,,c%jj999999q=0000 #0EEdKK/""f-B&C&CCCCC #0EEdKK B&&&&  !/DD #$$00c%jj00$ #0EEdKK%jj++,ABBO??)>?????9999999: : : : : :r!   c                 $   t          |           \  }}}|j                                        }|                                 |j                                        }t	          |          t	          |          k    sJ d|_        |                                 |j                                        }t	          |          t	          |          k    sJ d|_        |                                 |j                                        }t                              t          |          t          |                    sJ t          |          dk    sJ d}||_        |                                 |j                                        }|g k    sJ d S )Nr  3Kr   r  )	r  r4   r5   reduce_sizer  bytes_limitr  r  r)   )r]   r,   r.   ref_cache_itemscache_itemsr  s         r   test_memory_reduce_sizer    s   #F++LFAq*4466O &0022K/""f[&9&99999 F
&0022K/""f[&9&99999 F
&0022K<<K((#o*>*>?????{q      .F
&0022K"r!   c                     t          |           \  }}}|                                 t          j        |j        j                  g k    sJ |                    d          rJ d S )Nrr   )
stacklevel)r  rZ   r6   rz   r4   r$   r  )r]   r,   r.   r^   s       r   test_memory_clearr    sh    #F++LFAq
LLNNN:f*344:::: **a*8888888r!   c                      dgdz  } | S )Nru  i  r   )complex_objs    r   fast_func_with_complex_outputr    s    ,%Kr!   c                 Z    d t          t          d                    D             }| r|ndS )Nc                 .    i | ]}t          |          |S r   )r   )rm   r-   s     r   
<dictcomp>z=fast_func_with_conditional_complex_output.<locals>.<dictcomp>  s     6663q661666r!   g     j@zsimple output)r(   int)complex_outputr  s     r   )fast_func_with_conditional_complex_outputr    s0    66eCHHoo666K(=;;o=r!   c                    t          | j                  }|                    t                     t	          d          fdt          d          D                        |                                \  }}d}||vsJ ||vsJ d S )Nr  r   rh   c              3   F   K   | ]} t                                V  d S r@   rk   rm   r-   rn  s     r   ro   zMtest_cached_function_race_condition_when_persisting_output.<locals>.<genexpr>  s4      @@!+w{++--@@@@@@r!   r&   r   )r   rW   r'   r  r   r(   rN  r]   capfdr,   rK  stderrr   rn  s         @r   :test_cached_function_race_condition_when_persisting_outputr    s    
 V^,,,F,,<==KHA@@@@uQxx@@@@@@%%''NFF
 6M&&&&&&&&&&r!   c                    t          | j                  }|                    t                     t	          d          fdt          d          D                        |                                \  }}d}||vsJ ||vsJ d S )Nr  r   rh   c              3   ^   K   | ]'} t                    |d z  dk    rdnd          V  (dS )r   r   TFNrk   r  s     r   ro   zOtest_cached_function_race_condition_when_persisting_output_2.<locals>.<genexpr>  sY       * * ,w{++AEQJJDDEJJ * * * * * *r!   r&   r   )r   rW   r'   r  r   r(   rN  r  s         @r   <test_cached_function_race_condition_when_persisting_output_2r    s     V^,,,F,,HIIKHA * * * * %a* * * * * * %%''NFF
 6M&&&&&&&&&&r!   c                 @   t          | j                  }d }|                    |          }d} ||          \  }}||k    sJ t          |           t	          ||          } ||          \  }	}
t          |          dk    sJ d}||d         v sJ |	|k    sJ |
|k    sJ t          |           |                    |          }	 |                                 t          d          # t          $ r%}d}|t          |j                  v sJ Y d }~d S d }~ww xY w)	Nr  c                 T    t          j        d           | t          j                     fS )Ng{Gz?)r-  r.  rv  s    r   r*   zItest_memory_recomputes_after_an_error_while_loading_results.<locals>.func  s%     	
4DIKKr!   rw  r   r   r   z<It normally not possible to load a corrupted MemorizedResultzis corrupted)r   rW   r'   r=   rI   r)   r  r   AssertionErrorr!  r   r   )r]   r   r,   r*   cached_func	input_argrw  rA  r   recomputed_argrecomputed_timestampr   	referenceer   s                  r   ;test_memory_recomputes_after_an_error_while_loading_resultsr    s   V^,,,F      ,,t$$KI [++NC ) f%%% 5[+NN+6;s+;+;(N( !!Q&&&&5M-a00000S    )++++ f%%%++C00I&
 
 	
  & & & #af++%%%%%%%%%%&s   #C. .
D8DDc                       e Zd ZdZdS )IncompleteStoreBackendzAThis backend cannot be instantiated and should raise a TypeError.N)r   r\   r   __doc__r   r!   r   r  r  C  s        KKDr!   r  c                   B    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )DummyStoreBackendz(A dummy store backend that does nothing.c                     dS )zOpen an item on store.Nr   )selfr   r   s      r   
_open_itemzDummyStoreBackend._open_itemK      r!   c                     dS )z!Check if an item location exists.Nr   r  r$   s     r   _item_existszDummyStoreBackend._item_existsO  r  r!   c                     dS )z&Move an item from src to dst in store.Nr   )r  srcdsts      r   
_move_itemzDummyStoreBackend._move_itemS  r  r!   c                     dS )zCreate location on store.Nr   r  s     r   create_locationz!DummyStoreBackend.create_locationW  r  r!   c                     dS )z&Check if an object exists in the storeFr   r  objs     r   r  zDummyStoreBackend.exists[  s    ur!   c                     dS )zClear object on storeNr   r  s     r   clear_locationz DummyStoreBackend.clear_location_  r  r!   c                     g S )z3Returns the whole list of items available in cache.r   )r  s    r   r5   zDummyStoreBackend.get_itemsc  s    	r!   c                     dS )zConfigure the storeNr   )r  r$   r   r   s       r   	configurezDummyStoreBackend.configureg  r  r!   N)r   r\   r   r  r  r  r  r  r  r  r5   r  r   r!   r   r  r  H  s        22                  r!   r  invalid_prefixc                     t          t                    5 }t          | d            d d d            n# 1 swxY w Y   |                    d           d S )Nz&Store backend name should be a string*r   rl  r	   rm  )r  ro  s     r   (test_register_invalid_store_backends_keyr  l  s     

		 5w~t4445 5 5 5 5 5 5 5 5 5 5 5 5 5 5MM;<<<<<   266c                      t          t                    5 } t          dd            d d d            n# 1 swxY w Y   |                     d           d S )Nfsz.Store backend should inherit StoreBackendBase*r  ro  s    r   +test_register_invalid_store_backends_objectr  t  s     

		 +wtT***+ + + + + + + + + + + + + + +MMCDDDDDr   c                      t          t                    5 } t          dd           d d d            n# 1 swxY w Y   |                     d           d S )Nz/tmp/joblibunknown)r$   backendzUnknown location*)r   	TypeErrorr   rm  r  s    r   !test_memory_default_store_backendr	  |  s    				 :gy9999: : : : : : : : : : : : : : :MM&'''''s   377c                       G d d          }  |             }t          t                    5 }t          d|           d d d            n# 1 swxY w Y   d}|t          |d         j                  v sJ d S )Nc                       e Zd ZdS )Htest_warning_on_unknown_location_type.<locals>.NonSupportedLocationClassNr   r   r!   r   NonSupportedLocationClassr    r   r!   r  localr  zbInstantiating a backend using a NonSupportedLocationClass as a location is not supported by joblibr   )r   UserWarningr   r   r   )r  unsupported_locationr   expected_mesages       r   %test_warning_on_unknown_location_typer    s           4466	{		 Gxw1EFFFFG G G G G G G G G G G G G G G-O c(1+"566666666s   A

AAc                     d} t          | t                     | t          ft          j                    v sJ t	          t
                    5 }t          | d           d d d            n# 1 swxY w Y   |                    d           d S )Nisbfake_locationzNCan't instantiate abstract class IncompleteStoreBackend with abstract methods*)r	   r  r
   r  r   r  r   rm  )backend_namero  s     r   )test_instanciate_incomplete_store_backendr    s     L<)?@@@01_5J5L5LLLLL				 >g|_===> > > > > > > > > > > > > > >MM B C C C C Cs   
A''A+.A+c                      d} t          | t                     | t          ft          j                    v sJ t	          | d          }t          |t                    sJ d S )Ndsbdummy_location)r	   r  r
   r  r   r   )r  backend_objs     r   test_dummy_store_backendr    sg     L<):;;;+,0E0G0GGGGG(7GHHKk#45555555r!   c                  h    t          j        d          } t          d|           }|j        dk    sJ d S )Nsome_folderr  )pathlibPathr   r$   )r7   r  s     r   0test_instanciate_store_backend_with_pathlib_pathr!    s:    <&&D($77K=000000r!   c                 V   d}t                      }|j        J t          |           t          |          |                    d           k    sJ |                    | j                   t          |          |                    | j                  k    sJ t          |           d S )Nz-FileSystemStoreBackend(location="{location}")r  )r   r$   rB  r   rs   r  rW   )r]   repr_patternr  s      r   "test_filesystem_store_backend_reprr$    s     CL$&&G###MMMw<<<...====== fn%%%w<<<...GGGGGGMMMMMr!   c                    d }t          | j        d          }|                    |          }d}t          |          |                    ||j        j                  k    sJ |                    dd          }d}t          |          |                    |j        j        |j        |j	                  k    sJ t          |          d	                    |j        j        
          k    sJ d S )Nc                     | |z   S r@   r   rW  s     r   my_funcz)test_memory_objects_repr.<locals>.my_func  s    1ur!   r   r#   z/MemorizedFunc(func={func}, location={location}))r*   r$   *   zJMemorizedResult(location="{location}", func="{func}", args_id="{args_id}"))r$   r*   r
  zMemory(location={location})r  )
r   rW   r'   r   rs   r4   r$   r  r	  r
  )r]   r'  r,   memorized_funcmemorized_func_reprmemorized_resultmemorized_result_reprs          r   test_memory_objects_reprr-    s<      V^Q777F\\'**NK~"5"<"<%. #= #0 #0 0 0 0 0 &55b"==C   $9$@$@%.% ( %A %* %* * * * *
 v;;7>>%. ? 0 0 0 0 0 0 0 0r!   c                    t          | j                  }|j        d             }|                    d          }t	          j        |          }t	          j        |          }|j        j        |j        j        k    sJ |j	        |j	        k    sJ |j
        |j
        k    sJ t          |          t          |          k    sJ d S )Nr  c                     | dz  S r   r   r   s    r   r^   z'test_memorized_result_pickle.<locals>.g  s    !tr!   rr   )r   rW   r'   r  r  r  r  r4   r$   r*   r
  r   )r]   r,   r^   r+  memorized_result_picklememorized_result_loadss         r   test_memorized_result_pickler2    s    
 V^,,,F\  \ ((++$l+;<<#\*ABB)2,56 6 6 6 $:$?????#'='EEEEE  C(>$?$???????r!   c                 6   |g }t          |           }t          |          }t          |                                          t          |                                          k    sJ |                                D ]}||v r||         ||         k    sJ d S r@   )varsr  keys)leftrightignored_attrs	left_vars
right_varsattrs         r   comparer<    s    T

IeJy~~  C
(9(9$:$:::::   3 3=  *T"2222223 3r!   memory_kwargsr&   r   )rS   r%   r  g    .A	parameterunused)rR   r%   r  backend_optionsc                    t          dd| j        i|}t          j        t          j        |                    }t          |j        |j                   t          ||t          g d                     t          |          t          |          k    sJ |	                    t                    }t          j        t          j        |                    }t          |j        |j                   t          ||t          g d                     t          |          t          |          k    sJ |                    d          }t          j        t          j        |                    }t          |j        |j                   t          ||t          g d                     t          |          t          |          k    sJ d S )Nr$   )r4   rA  _func_code_id)r8  r   r   )r   rW   r  r  r  r<  r4   r  r   r'   r    r  )r]   r=  r,   memory_reloadedrn  func_cached_reloadedr+  memorized_result_reloadeds           r   test_memory_pickle_dump_loadrF    s   
 ==V^=}==Fl6<#7#788O F /"?@@@FOMMMNNP P P P<<4000000,,q//K!<[(A(ABB K%';'IJJJK-MMMNNP P P P%9 : ::::: #22155 &V\:J-K-K L L*%35 5 57MMMNNP P P P !!T*C%D%DDDDDDDr!   r   )rQ   )Tr@   )or  r   r   rX   r6   os.pathr  r  rJ  r-  r  ru   r0  joblib.memoryr   r   r   r   r   r   r	   r
   r   r   r   joblib.parallelr   r   joblib._store_backendsr   r   joblib.test.commonr   r   r   joblib.testingr   r   r   joblib.hashingr   r    r/   r=   rI   ra   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r#  r(  r6  r>  rD  rU  rX  rZ  r]  r_  ra  rf  r  floatri  rp  rr  r  r  r  r  r  r  r  r  r  r  r  r  dictrV   r  r  r	  r  r  r  r!  r$  r-  r2  r<  markrF  r   r!   r   <module>rQ     s=        				  				    



                 9 9 9 9 9 9 9 9 = = = = = = = = * * * * * * A A A A A A A A H H H H H H H H 0 0 0 0 0 0 - - - - - - - - K K K K K K K K - - - - - - - - 3 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5         - - -  
 
 
( ( (V #dE]33_A _A 43_AD; ; ;    8 8 83 3 38  $? ? ?$? ? ?           [4+&&- - '& -( $ $ $N  ,! ! !&! ! !4  ( )cUC,=-/TN,< = =
$ 
$= =
$  @
 
 
.
 
 
  ,
 
 
!= != !=H	 	 	  @5+ 5+ 5+p	 	 	
         
 (-%     3 5 U    C C C8$ $ $1 1 1 1*3 3 34; ; ;B  >9 9 9  
> > > >
 ' ' '& ' ' '.,& ,& ,&^	 	 	 	 	- 	 	 	
! ! ! ! !( ! ! !H ddffddff566= = 76=E E E( ( (7 7 7	C 	C 	C6 6 61 1 1  (0 0 0:@ @ @,
3 
3 
3 
3 '(Q77(+#/:H.EG GHI IE E	I IE E Er!   