
    di                     |   d 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 ddl	m
Z
mZ g dZ G d dej                  Z G d	 d
ej                  Z G d de          Z G d de          Z G d d          Z G d deee          Z G d deee          Zd Zd Z G d de          Z G d de          Z G d de          Z G d de          Z G d d e          Z G d! d"e          Z G d# d$          Z G d% d&ee          Z G d' d(ee          Z  G d) d*ee          Z! G d+ d,e          Z"dS )-z4Utilities for with-statement contexts.  See PEP 343.    N)dequewraps)
MethodTypeGenericAlias)asynccontextmanagercontextmanagerclosingnullcontextAbstractContextManagerAbstractAsyncContextManagerAsyncExitStackContextDecorator	ExitStackredirect_stdoutredirect_stderrsuppressaclosingchdirc                   d    e Zd ZdZ ee          Zd Zej	        d             Z
ed             ZdS )r   z,An abstract base class for context managers.c                     | S z0Return `self` upon entering the runtime context. selfs      /croot/python-split_1694437901252/_h_env_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_placehold_plac/lib/python3.11/contextlib.py	__enter__z AbstractContextManager.__enter__   s        c                     dS z9Raise any exception triggered within the runtime context.Nr   r   exc_type	exc_value	tracebacks       r   __exit__zAbstractContextManager.__exit__   s	     tr   c                 N    | t           u rt          j        |dd          S t          S )Nr   r%   )r   _collections_abc_check_methodsNotImplementedclsCs     r   __subclasshook__z'AbstractContextManager.__subclasshook__    s)    (((#21k:NNNr   N)__name__
__module____qualname____doc__classmethodr   __class_getitem__r   abcabstractmethodr%   r-   r   r   r   r   r      ss        66#L11   	     [  r   r   c                   d    e Zd ZdZ ee          Zd Zej	        d             Z
ed             ZdS )r   z9An abstract base class for asynchronous context managers.c                 
   K   | S r   r   r   s    r   
__aenter__z&AbstractAsyncContextManager.__aenter__-   s      r   c                 
   K   dS r    r   r!   s       r   	__aexit__z%AbstractAsyncContextManager.__aexit__1   s       tr   c                 N    | t           u rt          j        |dd          S t          S )Nr8   r:   )r   r'   r(   r)   r*   s     r   r-   z,AbstractAsyncContextManager.__subclasshook__6   s3    ---#21l3>@ @ @r   N)r.   r/   r0   r1   r2   r   r3   r8   r4   r5   r:   r-   r   r   r   r   r   '   ss        CC#L11   	     [  r   r   c                       e Zd ZdZd Zd ZdS )r   zJA base class or mixin that enables context managers to work as decorators.c                     | S )a6  Return a recreated instance of self.

        Allows an otherwise one-shot context manager like
        _GeneratorContextManager to support use as
        a decorator via implicit recreation.

        This is a private interface just for _GeneratorContextManager.
        See issue #11647 for details.
        r   r   s    r   _recreate_cmzContextDecorator._recreate_cmA   s	     r   c                 @     t                     fd            }|S )Nc                  p                                     5   | i |cd d d            S # 1 swxY w Y   d S Nr>   argskwdsfuncr   s     r   innerz(ContextDecorator.__call__.<locals>.innerN   s    ""$$ + +tT*T**+ + + + + + + + + + + + + + + + + +s   +//r   r   rF   rG   s   `` r   __call__zContextDecorator.__call__M   s9    	t	+ 	+ 	+ 	+ 	+ 
	+ r   Nr.   r/   r0   r1   r>   rI   r   r   r   r   r   >   s8        PP
 
 
    r   r   c                       e Zd ZdZd Zd ZdS )AsyncContextDecoratorzPA base class or mixin that enables async context managers to work as decorators.c                     | S )z-Return a recreated instance of self.
        r   r   s    r   r>   z"AsyncContextDecorator._recreate_cmX   s	     r   c                 @     t                     fd            }|S )Nc                     K                                    4 d {V   | i | d {V cd d d           d {V  S # 1 d {V swxY w Y   d S rA   rB   rC   s     r   rG   z-AsyncContextDecorator.__call__.<locals>.inner^   s      ((** 1 1 1 1 1 1 1 1!T404000000001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1s   ?
A	A	r   rH   s   `` r   rI   zAsyncContextDecorator.__call__]   s9    	t	1 	1 	1 	1 	1 
	1 r   NrJ   r   r   r   rL   rL   U   s8        VV  
    r   rL   c                       e Zd ZdZd Zd ZdS )_GeneratorContextManagerBasezBShared functionality for @contextmanager and @asynccontextmanager.c                      ||i || _         |||c| _        | _        | _        t	          |dd           }|t          |           j        }|| _        d S )Nr1   )genrF   rD   rE   getattrtyper1   )r   rF   rD   rE   docs        r   __init__z%_GeneratorContextManagerBase.__init__h   s]    4&&&*.d'	49didIt,,;t**$Cr   c                 N    |                      | j        | j        | j                  S rA   )	__class__rF   rD   rE   r   s    r   r>   z)_GeneratorContextManagerBase._recreate_cmv   s      ~~diDI>>>r   N)r.   r/   r0   r1   rW   r>   r   r   r   rQ   rQ   e   s8        LL  ? ? ? ? ?r   rQ   c                       e Zd ZdZd Zd ZdS )_GeneratorContextManagerz%Helper for @contextmanager decorator.c                 t    | ` | `| `	 t          | j                  S # t
          $ r t          d          d w xY wNzgenerator didn't yield)rD   rE   rF   nextrS   StopIterationRuntimeErrorr   s    r   r   z"_GeneratorContextManager.__enter__   sU     Ity$)	C>>! 	C 	C 	C788dB	Cs    7c                    |5	 t          | j                   t          d          # t          $ r Y dS w xY w|
 |            }	 | j                            |||           n# t          $ r}||ucY d }~S d }~wt          $ rB}||u r||_        Y d }~dS t          |t                    r|j        |u r||_        Y d }~dS  d }~wt          $ r}||ur ||_        Y d }~dS d }~ww xY wt          d          )Ngenerator didn't stopFz#generator didn't stop after throw())	r^   rS   r`   r_   throw__traceback__
isinstance	__cause__BaseExceptionr   typvaluer$   excs        r   r%   z!_GeneratorContextManager.__exit__   sv   ;<TX ##:;;; !   uu
 } #sE95555  ( ( ( %'''''''   %<<(1C% 55555 um44!..*3E' 55555  
 
 
 e##$-!uuuuu
 DEEEsN   ' 
55A" "
C#,A5/C#5C#B?%B?>B??C#CC#N)r.   r/   r0   r1   r   r%   r   r   r   r[   r[   }   sB        
 0/C C C1F 1F 1F 1F 1Fr   r[   c                       e Zd ZdZd Zd ZdS )_AsyncGeneratorContextManagerz*Helper for @asynccontextmanager decorator.c                    K   | ` | `| `	 t          | j                   d {V S # t
          $ r t          d          d w xY wr]   )rD   rE   rF   anextrS   StopAsyncIterationr`   r   s    r   r8   z(_AsyncGeneratorContextManager.__aenter__   sk       Ity$)	Ctx(((((((! 	C 	C 	C788dB	Cs   $ ?c                   K   |;	 t          | j                   d {V  t          d          # t          $ r Y dS w xY w|
 |            }	 | j                            |||           d {V  n# t          $ r}||ucY d }~S d }~wt          $ rI}||u r||_        Y d }~dS t          |t          t          f          r|j        |u r||_        Y d }~dS  d }~wt          $ r}||ur ||_        Y d }~dS d }~ww xY wt          d          )Nrb   Fz$generator didn't stop after athrow())
ro   rS   r`   rp   athrowrd   re   r_   rf   rg   rh   s        r   r:   z'_AsyncGeneratorContextManager.__aexit__   s     ;<DHoo%%%%%%% ##:;;; &   uu
 } #hooc5)<<<<<<<<<<% ( ( ( %'''''''   %<<(1C% 55555 u}6H&IJJ!..*3E' 55555  
 
 
 e##$-!uuuuu
 EFFFsN   / 
=="A0 0
C8:B=C8C8C!,CCC8!C33C8N)r.   r/   r0   r1   r8   r:   r   r   r   rm   rm      sB        
 54C C C1G 1G 1G 1G 1Gr   rm   c                 <     t                      fd            }|S )a  @contextmanager decorator.

    Typical usage:

        @contextmanager
        def some_generator(<arguments>):
            <setup>
            try:
                yield <value>
            finally:
                <cleanup>

    This makes this:

        with some_generator(<arguments>) as <variable>:
            <body>

    equivalent to this:

        <setup>
        try:
            <variable> = <value>
            <body>
        finally:
            <cleanup>
    c                  &    t          | |          S rA   )r[   rD   rE   rF   s     r   helperzcontextmanager.<locals>.helper  s    'dD999r   r   rF   rv   s   ` r   r	   r	     s3    6 4[[: : : : [:Mr   c                 <     t                      fd            }|S )a  @asynccontextmanager decorator.

    Typical usage:

        @asynccontextmanager
        async def some_async_generator(<arguments>):
            <setup>
            try:
                yield <value>
            finally:
                <cleanup>

    This makes this:

        async with some_async_generator(<arguments>) as <variable>:
            <body>

    equivalent to this:

        <setup>
        try:
            <variable> = <value>
            <body>
        finally:
            <cleanup>
    c                  &    t          | |          S rA   )rm   ru   s     r   rv   z#asynccontextmanager.<locals>.helper@  s    ,T4>>>r   r   rw   s   ` r   r   r   %  s3    6 4[[? ? ? ? [?Mr   c                   $    e Zd ZdZd Zd Zd ZdS )r
   a2  Context to automatically close something at the end of a block.

    Code like this:

        with closing(<module>.open(<arguments>)) as f:
            <block>

    is equivalent to this:

        f = <module>.open(<arguments>)
        try:
            <block>
        finally:
            f.close()

    c                     || _         d S rA   thingr   r}   s     r   rW   zclosing.__init__W      


r   c                     | j         S rA   r|   r   s    r   r   zclosing.__enter__Y  s
    zr   c                 8    | j                                          d S rA   )r}   closer   exc_infos     r   r%   zclosing.__exit__[  s    
r   Nr.   r/   r0   r1   rW   r   r%   r   r   r   r
   r
   F  sK                  r   r
   c                   $    e Zd ZdZd Zd Zd ZdS )r   a  Async context manager for safely finalizing an asynchronously cleaned-up
    resource such as an async generator, calling its ``aclose()`` method.

    Code like this:

        async with aclosing(<module>.fetch(<arguments>)) as agen:
            <block>

    is equivalent to this:

        agen = <module>.fetch(<arguments>)
        try:
            <block>
        finally:
            await agen.aclose()

    c                     || _         d S rA   r|   r~   s     r   rW   zaclosing.__init__q  r   r   c                    K   | j         S rA   r|   r   s    r   r8   zaclosing.__aenter__s  s      zr   c                 H   K   | j                                          d {V  d S rA   )r}   acloser   s     r   r:   zaclosing.__aexit__u  s2      j!!!!!!!!!!!r   N)r.   r/   r0   r1   rW   r8   r:   r   r   r   r   r   _  sK         "    " " " " "r   r   c                   $    e Zd ZdZd Zd Zd ZdS )_RedirectStreamNc                 "    || _         g | _        d S rA   )_new_target_old_targets)r   
new_targets     r   rW   z_RedirectStream.__init__}  s    %r   c                     | j                             t          t          | j                             t          t          | j        | j                   | j        S rA   )r   appendrT   sys_streamsetattrr   r   s    r   r   z_RedirectStream.__enter__  sE      dl!;!;<<<T\4#3444r   c                 j    t          t          | j        | j                                                   d S rA   )r   r   r   r   popr   exctypeexcinstexctbs       r   r%   z_RedirectStream.__exit__  s+    T\4#4#8#8#:#:;;;;;r   )r.   r/   r0   r   rW   r   r%   r   r   r   r   r   y  sF        G  
     
< < < < <r   r   c                       e Zd ZdZdZdS )r   aA  Context manager for temporarily redirecting stdout to another file.

        # How to send help() to stderr
        with redirect_stdout(sys.stderr):
            help(dir)

        # How to write help() to a file
        with open('help.txt', 'w') as f:
            with redirect_stdout(f):
                help(pow)
    stdoutNr.   r/   r0   r1   r   r   r   r   r   r     s        
 
 GGGr   r   c                       e Zd ZdZdZdS )r   zCContext manager for temporarily redirecting stderr to another file.stderrNr   r   r   r   r   r     s        MMGGGr   r   c                   $    e Zd ZdZd Zd Zd ZdS )r   a?  Context manager to suppress specified exceptions

    After the exception is suppressed, execution proceeds with the next
    statement following the with statement.

         with suppress(FileNotFoundError):
             os.remove(somefile)
         # Execution still resumes here if the file was already removed
    c                     || _         d S rA   )_exceptions)r   
exceptionss     r   rW   zsuppress.__init__  s    %r   c                     d S rA   r   r   s    r   r   zsuppress.__enter__      r   c                 4    |d uot          || j                  S rA   )
issubclassr   r   s       r   r%   zsuppress.__exit__  s!     d"Lz'4;K'L'LLr   Nr   r   r   r   r   r     sP         & & &  
M 
M 
M 
M 
Mr   r   c                   j    e Zd ZdZed             Zed             Zd Zd Zd Z	d Z
d Zd	 ZddZdS )_BaseExitStackz.A base class for ExitStack and AsyncExitStack.c                 "    t          ||           S rA   r   cmcm_exits     r   _create_exit_wrapperz#_BaseExitStack._create_exit_wrapper      '2&&&r   c                      fd}|S )Nc                      i  d S rA   r   r"   rk   tbrD   callbackrE   s      r   _exit_wrapperz8_BaseExitStack._create_cb_wrapper.<locals>._exit_wrapper  s    Hd#d#####r   r   r   rD   rE   r   s   ``` r   _create_cb_wrapperz!_BaseExitStack._create_cb_wrapper  s.    	$ 	$ 	$ 	$ 	$ 	$ 	$r   c                 ,    t                      | _        d S rA   )r   _exit_callbacksr   s    r   rW   z_BaseExitStack.__init__  s    $wwr   c                 r     t          |                       }| j        |_        t                      | _        |S )z@Preserve the context stack by transferring it to a new instance.)rU   r   r   )r   	new_stacks     r   pop_allz_BaseExitStack.pop_all  s0    DJJLL	$($8	!$wwr   c                     t          |          }	 |j        }|                     ||           n%# t          $ r |                     |           Y nw xY w|S )a  Registers a callback with the standard __exit__ method signature.

        Can suppress exceptions the same way __exit__ method can.
        Also accepts any object with an __exit__ method (registering a call
        to the method instead of the object itself).
        )rU   r%   _push_cm_exitAttributeError_push_exit_callbackr   exit_cb_typeexit_methods       r   pushz_BaseExitStack.push  su     ::	2"+K
 t[1111	  	+ 	+ 	+$$T*****	+
 s   / AAc                     t          |          }	 |j        }|j        }n/# t          $ r" t	          d|j         d|j         d          dw xY w ||          }|                     ||           |S )zEnters the supplied context manager.

        If successful, also pushes its __exit__ method as a callback and
        returns the result of the __enter__ method.
        '.z6' object does not support the context manager protocolN)rU   r   r%   r   	TypeErrorr/   r0   r   r   r   r+   _enter_exitresults         r   enter_contextz_BaseExitStack.enter_context  s     2hh	S]FLEE 	S 	S 	S H H H1A H H H I INRS	S 2u%%%s	     ,Ac                `     | j         |g|R i |}||_        |                     |           |S )z\Registers an arbitrary callback and arguments.

        Cannot suppress exceptions.
        )r   __wrapped__r   r   r   rD   rE   r   s        r   r   z_BaseExitStack.callback  sI    
 0/H4HHH4HH %-!  ///r   c                 ^    |                      ||          }|                     |d           dS )z;Helper to correctly register callbacks to __exit__ methods.TN)r   r   r   r   r   r   s       r   r   z_BaseExitStack._push_cm_exit
  s3    11"g>>  55555r   Tc                 >    | j                             ||f           d S rA   )r   r   )r   r   is_syncs      r   r   z"_BaseExitStack._push_exit_callback  s$    ##Wh$788888r   N)T)r.   r/   r0   r1   staticmethodr   r   rW   r   r   r   r   r   r   r   r   r   r   r     s        88' ' \'   \
' ' '    (  &  6 6 6
9 9 9 9 9 9r   r   c                   $    e Zd ZdZd Zd Zd ZdS )r   a  Context manager for dynamic management of a stack of exit callbacks.

    For example:
        with ExitStack() as stack:
            files = [stack.enter_context(open(fname)) for fname in filenames]
            # All opened files will automatically be closed at the end of
            # the with statement, even if attempts to open files later
            # in the list raise an exception.
    c                     | S rA   r   r   s    r   r   zExitStack.__enter__  s    r   c                   
 |d         d u}t          j                    d         

fd}d}d}| j        rj| j                                        \  }}|sJ 	  || rd}d}d}n6#  t          j                    } ||d         |d                    d}|}Y nxY w| j        j|r2	 |d         j        }	|d         # t
          $ r |	|d         _         w xY w|o|S )Nr      c                 F    	 | j         }|||u rd S |u rn|} || _         d S rA   __context__new_excold_excexc_context	frame_excs      r   _fix_exception_contextz2ExitStack.__exit__.<locals>._fix_exception_context(  M    &%1&+*@*@F)++%& #*Gr   FTNNNr   r   r   r   r   rg   )r   exc_detailsreceived_excr   suppressed_excpending_raiser   cbnew_exc_details	fixed_ctxr   s             @r   r%   zExitStack.__exit__"  sA   "1~T1 LNN1%		* 	* 	* 	* 	*  " 	..2244KGRNNN
.2{# 5%)N$)M"4K."%,..&&q'9;q>JJJ $- " 	.  	 (N6	!!n$    -6A* ..s   A" "1B"B7 7Cc                 4    |                      ddd           dS z%Immediately unwind the context stack.N)r%   r   s    r   r   zExitStack.closeS  s    dD$'''''r   N)r.   r/   r0   r1   r   r%   r   r   r   r   r   r     sL           // // //b( ( ( ( (r   r   c                   h    e Zd ZdZed             Zed             Zd Zd Zd Z	d Z
d Zd	 Zd
 ZdS )r   a  Async context manager for dynamic management of a stack of exit
    callbacks.

    For example:
        async with AsyncExitStack() as stack:
            connections = [await stack.enter_async_context(get_connection())
                for i in range(5)]
            # All opened connections will automatically be released at the
            # end of the async with statement, even if attempts to open a
            # connection later in the list raise an exception.
    c                 "    t          ||           S rA   r   r   s     r   _create_async_exit_wrapperz)AsyncExitStack._create_async_exit_wrapperf  r   r   c                      fd}|S )Nc                 (   K    i  d {V  d S rA   r   r   s      r   r   z>AsyncExitStack._create_async_cb_wrapper.<locals>._exit_wrapperl  s4      (D)D)))))))))))r   r   r   s   ``` r   _create_async_cb_wrapperz'AsyncExitStack._create_async_cb_wrapperj  s.    	* 	* 	* 	* 	* 	* 	*r   c                    K   t          |          }	 |j        }|j        }n/# t          $ r" t	          d|j         d|j         d          dw xY w ||           d{V }|                     ||           |S )zEnters the supplied async context manager.

        If successful, also pushes its __aexit__ method as a callback and
        returns the result of the __aenter__ method.
        r   r   zC' object does not support the asynchronous context manager protocolN)rU   r8   r:   r   r   r/   r0   _push_async_cm_exitr   s         r   enter_async_contextz"AsyncExitStack.enter_async_contextp  s       2hh	'^FMEE 	' 	' 	' U U U1A U U U  "&'	' vbzz!!!!!!  U+++s	   " ,Ac                     t          |          }	 |j        }|                     ||           n&# t          $ r |                     |d           Y nw xY w|S )a#  Registers a coroutine function with the standard __aexit__ method
        signature.

        Can suppress exceptions the same way __aexit__ method can.
        Also accepts any object with an __aexit__ method (registering a call
        to the method instead of the object itself).
        F)rU   r:   r   r   r   r   s       r   push_async_exitzAsyncExitStack.push_async_exit  sw     ::	8",K
 $$T;7777	  	2 	2 	2$$T511111	2
 s   /  AAc                b     | j         |g|R i |}||_        |                     |d           |S )zfRegisters an arbitrary coroutine function and arguments.

        Cannot suppress exceptions.
        F)r   r   r   r   s        r   push_async_callbackz"AsyncExitStack.push_async_callback  sK    
 65hNNNNNN %-!  666r   c                 D   K   |                      ddd           d{V  dS r   )r:   r   s    r   r   zAsyncExitStack.aclose  s4      nnT4...........r   c                 ^    |                      ||          }|                     |d           dS )zLHelper to correctly register coroutine function to __aexit__
        method.FN)r   r   r   s       r   r   z"AsyncExitStack._push_async_cm_exit  s5     77GDD  66666r   c                 
   K   | S rA   r   r   s    r   r8   zAsyncExitStack.__aenter__  s      r   c                   K   |d         d u}t          j                    d         fd}d}d}| j        rv| j                                        \  }}	 |r || }n ||  d {V }|rd}d}d}n6#  t          j                    }	 ||	d         |d                    d}|	}Y nxY w| j        v|r2	 |d         j        }
|d         # t
          $ r |
|d         _         w xY w|o|S )Nr   r   c                 F    	 | j         }|||u rd S |u rn|} || _         d S rA   r   r   s      r   r   z8AsyncExitStack.__aexit__.<locals>._fix_exception_context  r   r   FTr   r   )r   r   r   r   r   r   r   r   cb_suppressr   r   r   s              @r   r:   zAsyncExitStack.__aexit__  si     "1~T1 LNN1%		* 	* 	* 	* 	*  " 	..2244KGR. 9"$"k"2KK(*K(8"8"8"8"8"8"8K 5%)N$)M"4K."%,..&&q'9;q>JJJ $-# " 	.$  	 (N6	!!n$    -6A* ..s   A0 01B#0C CN)r.   r/   r0   r1   r   r   r   r   r   r   r   r   r8   r:   r   r   r   r   r   Y  s        
 
 ' ' \'   \
  $  $  / / /7 7 7  3/ 3/ 3/ 3/ 3/r   r   c                   2    e Zd ZdZddZd Zd Zd Zd ZdS )	r   aO  Context manager that does no additional processing.

    Used as a stand-in for a normal context manager, when a particular
    block of code is only sometimes used with a normal context manager:

    cm = optional_cm if condition else nullcontext()
    with cm:
        # Perform operation, using optional_cm if condition is True
    Nc                     || _         d S rA   enter_result)r   r  s     r   rW   znullcontext.__init__  s    (r   c                     | j         S rA   r  r   s    r   r   znullcontext.__enter__  s      r   c                     d S rA   r   r   excinfos     r   r%   znullcontext.__exit__  r   r   c                    K   | j         S rA   r  r   s    r   r8   znullcontext.__aenter__  s        r   c                 
   K   d S rA   r   r  s     r   r:   znullcontext.__aexit__  s      r   rA   )	r.   r/   r0   r1   rW   r   r%   r8   r:   r   r   r   r   r     sn         ) ) ) )! ! !  ! ! !    r   r   c                   $    e Zd ZdZd Zd Zd ZdS )r   zHNon thread-safe context manager to change the current working directory.c                 "    || _         g | _        d S rA   )path_old_cwd)r   r  s     r   rW   zchdir.__init__  s    	r   c                     | j                             t          j                               t          j        | j                   d S rA   )r  r   osgetcwdr   r  r   s    r   r   zchdir.__enter__  s6    RY[[)))
r   c                 \    t          j        | j                                                   d S rA   )r  r   r  r   r  s     r   r%   zchdir.__exit__
  s&    
""$$%%%%%r   Nr   r   r   r   r   r     sG        RR    & & & & &r   r   )#r1   r4   r  r   r'   collectionsr   	functoolsr   typesr   r   __all__ABCr   r   objectr   rL   rQ   r[   rm   r	   r   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r     s   : : 



 				 



                 * * * * * * * *      SW   ,    #'   .    v   .    F    ? ? ? ? ? ? ? ?0AF AF AF AF AF AF AF AFFAG AG AG AG AG AG AG AGH  B  B    $   2" " " " "* " " "4< < < < <, < < <$    o        o   M M M M M% M M M<Q9 Q9 Q9 Q9 Q9 Q9 Q9 Q9jA( A( A( A( A( 6 A( A( A(JH/ H/ H/ H/ H/^%@ H/ H/ H/V    (*E   6& & & & &" & & & & &r   