
    <|hM                     .   d dl mZmZ d dlm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 d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlZd dlmZ d dlmZ  G d de      Zd Z G d de      Z G d de
j<                        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%ejL                  jO                  e(      fd Z) G d! d"e*      Z+ G d# d$e      Z,e-d%k(  r e
j\                          yy)&    )print_functiondivision)contextmanagerN)PY3)sysinfo)DEFAULT_SOCKET_TIMEOUT)SMALLEST_RELIABLE_DELAY)tcp_listener)WIN)socket)StreamServer)LoopExitc                       e Zd Zd Zy)SimpleStreamServerc                    |j                         }	 |j                         }|s	 |j                          y 	 |j                  dd      \  }}}|dk(  r|j                  d       n<|dv r'|j                  d       	 |j                  d      }|sn|j                  d	       |j                          y # t        $ r t        d|        w xY w# |j                          w xY w)
N    zFailed to parse request line: z/pings   HTTP/1.0 200 OK

PONG)/long/shorts   hello   s   HTTP/1.0 404 WTF?

)makefilereadlineclosesplit	Exceptionprintsendallrecv)	selfclient_socket_addressfdrequest_line_methodpath_restdatas	            X/var/www/html/test/engine/venv/lib/python3.12/site-packages/gevent/tests/test__server.pyhandlezSimpleStreamServer.handle   s    ##%	;;=L" HHJ!'3'9'9#q'A$u w%%&DE,,%%h/(--a0D 
 %%&BCHHJ  LKL HHJs#   C B1 AC 1C

C CN)__name__
__module____qualname__r)        r(   r   r      s    r.   r   c                  p    	 t        j                  t        sd       y t               y # t        $ r Y y w xY wNr   )geventsleepr   r	   r   _argss    r(   sleep_to_clear_old_socketsr5   0   s/     	cQ?'>? s   ) 
) 	55c                   `    e Zd ZeZeZdZdZe	d        Z
e
Ze	d        Ze	d        Ze	d        Zy)SettingsTc                     | j                         5 }	 |j                         }d d d        | j	                         y # t        j                  $ r d }Y 1w xY w# 1 sw Y   6xY wN)r   readr   timeoutassertFalse)instconnresults      r(   assertAcceptedConnectionErrorz&Settings.assertAcceptedConnectionErrorB   s\    ]]_ 		
 	  >> 	 	s&   A=AAAAA!c                     | j                          	 | j                          y # t        j                  $ r*}|j                  d   t
        j                  vr Y d }~y d }~ww xY wr0   )	assert500send_requestr   errorargs	greentestCONN_ABORTED_ERRORS)r=   exs     r(   	assert503zSettings.assert503M   sQ     		|| 	wwqz!>!>> ?	s   # A  AA c                     | j                  t        j                        5  | j                  d       d d d        y # 1 sw Y   y xY w)Ng{Gz?r;   )assertRaisesr   r;   assertRequestSucceeded)r=   s    r(   assertPoolFullzSettings.assertPoolFullX   s:    v~~. 	6'''5	6 	6 	6s	   <Ac                 F    |j                  d| j                                |S )Nspawn)
setdefault	get_spawn)r=   kwargss     r(   fill_default_server_argsz!Settings.fill_default_server_args]   s    '4>>#34r.   N)r*   r+   r,   r   ServerClassr   ServerSubClassrestartableclose_socket_detectedstaticmethodr@   rB   rI   rN   rT   r-   r.   r(   r7   r7   <   sj    K'NK ! ! .I  6 6  r.   r7   c                   T   e Zd Zej                  ZeZdZd Zd Z	d Z
eeddfd       Zdedfd	Zdd
ZdZej"                  rej&                  fZnej(                  rej*                  rdZd dZd Zd Zd Zd Zd ZefdZd Zd Zd Zd Z d Z!e"d        Z#d Z$d Z%d Z&d Z'd Z(y)!TestCaseNc                 t    t        | dd       !| j                  j                          d | _        t                y )Nserver)getattrr]   stopr5   r   s    r(   cleanupzTestCase.cleanuph   s.    44(4KKDK"$r.   c                 8    | j                  t        d            S )N   backlog)_close_on_teardownr
   r`   s    r(   get_listenerzTestCase.get_listenern   s    &&|A'>??r.   c                 0   | j                   j                  }|st        j                  }n|dk(  rt        j                  }	 | j                   j
                  j                  }|| j                   j                  |fS # t        $ r t
        j                  }Y 4w xY w)Nz::)
r]   server_hostrF   DEFAULT_LOCAL_HOST_ADDRDEFAULT_LOCAL_HOST_ADDR6r   familyAttributeErrorAF_INETserver_port)r   ri   rl   s      r(   get_server_host_port_familyz$TestCase.get_server_host_port_familyq   s    kk--#;;KD #<<K	$[[''..F
 DKK33V;;	  	$^^F	$s     A9 9BBr   Fc              #   n  K   | j                         \  }}}t        rdnd}||i}t        rd|d<   t        j                  |      5 }	d }
|	j                  ||f       |	j	                  |        |	j
                  di |5 }
|s|
n|
|	f}| d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY ww)N	bufferingbufsizerwbmode)rl   r-   )rp   r   r   connect
settimeoutr   )r   r;   rs   include_raw_socketri   ro   rl   bufargmakefile_kwargssockrconnr?   s               r(   r   zTestCase.makefile   s     +/+K+K+M([& #!7+ ',OF#]]&) 		TE LL+{34OOG$11 U&8udm		 		 		 		s6   AB59B)?BB)	B5B&	"B))B2.B5/c                 x    | j                  ||      5 }| j                  ||       d d d        y # 1 sw Y   y xY w)N)r;   rs   )r   send_request_to_fd)r   urlr;   rs   r>   s        r(   rC   zTestCase.send_request   s9    ]]7G]< 	/##D#.	/ 	/ 	/s   09c                 j    |j                  d|z  j                  d             |j                          y )NzGET %s HTTP/1.0

zlatin-1)writeencodeflush)r   r"   r   s      r(   r   zTestCase.send_request_to_fd   s(    
+c199)DE

r.   r-   )iA'  c                    	 | j                  t        j                        5 }| j                         5 }|j	                          d d d        d d d        j                  }| j                  |j                  d   t        j                  t        j                  t        j                  t        j                  f| j                  z   ||j                  f       y # 1 sw Y   xY w# 1 sw Y   xY w# t
        $ r |s Y y w xY wr0   )rL   r   rD   r   r   r   	exceptionassertInrE   errnoECONNREFUSEDEADDRNOTAVAIL
ECONNRESETECONNABORTEDLOCAL_CONN_REFUSED_ERRORS)r   in_proc_serverexcr>   rH   s        r(   assertConnectionRefusedz TestCase.assertConnectionRefused   s    	""6<<0 !C]]_ !JJL!! ]]bggaj))5+>+>''););=?C?]?]^277m	%! !! !  		! 		s?   C- C!CC!C- C	C!!C*&C- -C<;C<c                 :    | j                   j                  |        y r9   )r7   rB   r`   s    r(   rB   zTestCase.assert500       %r.   c                 :    | j                   j                  |        y r9   )r7   rI   r`   s    r(   rI   zTestCase.assert503   r   r.   c                 :    | j                   j                  |        y r9   )r7   r@   r`   s    r(   r@   z&TestCase.assertAcceptedConnectionError   s    33D9r.   c                 :    | j                   j                  |        y r9   )r7   rN   r`   s    r(   rN   zTestCase.assertPoolFull   s    $$T*r.   c                    	 | j                  d      5 \  }}|j                  d       |j                          d}	 	 |j                  d      }|sn||z  }	 d d d        | j                  j                  d      t        |             y # t        j
                  $ r | j                  |       Y d d d        y w xY w# 1 sw Y   fxY w# t        $ r Y y w xY w)NT)rx   s   GET / HTTP/1.0

r.   r   s"   HTTP/1.0 500 Internal Server Error)r   r   r   r   r   r;   r<   r   
assertTrue
startswithrepr)r   r>   r{   r?   r'   s        r(   assertNotAcceptedzTestCase.assertNotAccepted   s    	$7 <D$

45

#yy|#!$	  "" 	))*OPRVW]R^_ ~~ $$V,    		sK   C	 'B=BC	 $B:/B=0C	 9B::B==CC	 		CCc                     | j                  |      5 }|j                  d       |j                         }d d d        | j                  j	                  d      t        |             y # 1 sw Y   4xY w)NrK   s   GET /ping HTTP/1.0

s   

PONG)r   r   r:   r   endswithr   )r   r;   r>   r?   s       r(   rM   zTestCase.assertRequestSucceeded   s\    ]]7]+ 	!tJJ45YY[F	! 	8$v,G		! 	!s   "A((A1c                 x    | j                   j                          | j                          | j                          y r9   )r]   startrM   r`   s    r(   start_serverzTestCase.start_server   s*    ##%##%r.   c                 X    | j                   j                          | j                          y r9   )r]   r_   r   r`   s    r(   stop_serverzTestCase.stop_server   s    $$&r.   c                      y r9   r-   )r   _msgs     r(   report_netstatzTestCase.report_netstat   s     	r.   c                     |j                  d| j                        }|j                  dt        j                  df      } ||g|i |S )Nserver_kindserver_listen_addrr   )poprV   rF   DEFAULT_BIND_ADDR)r   rE   rS   kindaddrs        r(   _create_serverzTestCase._create_server   sI    zz-)<)<=zz.1L1La0PQD*4*6**r.   c                 z     | j                   |i || _        | j                  j                          t                y r9   )r   r]   r   r5   r   rE   rS   s      r(   init_serverzTestCase.init_server   s1    )d))4:6:"$r.   c                 .    | j                   j                  S r9   r]   r   r`   s    r(   r   zTestCase.socket       {{!!!r.   c                    t         j                  r| j                  d       	 | j                  d        | j	                          | j                          | j                  t               | j                  j                          dd l
}|j                          y # | j                  j                          dd l
}|j                          w xY w)NzSometimes misses the errorc                       y r9   r-   r-   r.   r(   <lambda>z1TestCase._test_invalid_callback.<locals>.<lambda>	  s    r.   r   )r   RUNNING_ON_APPVEYORskipTestr   expect_one_errorrB   assert_error	TypeErrorr]   r_   gccollect)r   r   s     r(   _test_invalid_callbackzTestCase._test_invalid_callback  s    &&MM67	$ \*!!#NNi(KK rzz|	 KK rzz|s   AB 0C	c                 :    | j                   j                  | |      S r9   )r7   rT   )r   rS   s     r(   rT   z!TestCase.fill_default_server_args  s    }}55dFCCr.   c                 X     | j                   j                  |i | j                  |      S r9   )r7   rU   rT   r   s      r(   rU   zTestCase.ServerClass  s3    (t}}(($ R+/+H+H+PR 	Rr.   c                 X     | j                   j                  |i | j                  |      S r9   )r7   rV   rT   r   s      r(   rV   zTestCase.ServerSubClass  s3    +t}}++T U.2.K.KF.SU 	Ur.   c                      y r9   r-   r`   s    r(   rR   zTestCase.get_spawn       r.   )r}   )T))r*   r+   r,   rF   LARGE_TIMEOUT__timeout__r7   r]   ra   rg   rp   r   _DEFAULT_SOCKET_TIMEOUTr   rC   r   r   OSXr   
EPROTOTYPEr   PYPY3r   rB   rI   r@   rN   r   rM   r   r   r   r   r   propertyr   r   rT   rU   rV   rR   r-   r.   r(   r[   r[   b   s    ))KHF%@< 6V[  (  #,CQ / !#}}%*%5%5$7!	9?? %-!%,&&:+`, .E H&
'
+
%
 " "$&DRUr.   r[   c                   l   e Zd Zd Zd Zd Z ej                  d       ej                  d      d               Z	d Z
 ej                  d      d        Zd	 Zd
 Z ej                  ej                         d        Zd Zd Z ej(                  ej*                  d      d        Zed        Zd Zd Zy)TestDefaultSpawnc                 "    t         j                  S r9   r1   rP   r`   s    r(   rR   zTestDefaultSpawn.get_spawn%      ||r.   c                    | j                  d       | j                          | j                  d       |r| j                  j                  r| j                  j                          | j                  d       | j                          | j                  j                          | j                  d       t                | j                          | j                          | j                  d       y )Nzbefore startzafter startzafter stop_acceptingzafter start_acceptingz
after stop)r   r   r7   rW   r]   stop_acceptingr   start_acceptingr5   rM   r   )r   rW   s     r(   _test_server_start_stopz(TestDefaultSpawn._test_server_start_stop(  s    N+M*4==44KK&&( 67""$KK'') 78&('')L)r.   c                     d| _         | j                  t              5  | j                  | j	                         d       d d d        y # 1 sw Y   y xY w)NF   rd   )switch_expectedrL   r   rU   rg   r`   s    r(   'test_backlog_is_not_accepted_for_socketz8TestDefaultSpawn.test_backlog_is_not_accepted_for_socket7  sI    $y) 	>T..0"=	> 	> 	>s   "AAzSometimes times outzSometimes times out.c                     | j                  t        j                  dfd      | _        | j	                          | j                  d       y )Nr   r   rd   FrW   rV   rF   r   r]   r   r   r`   s    r(   $test_backlog_is_accepted_for_addressz5TestDefaultSpawn.test_backlog_is_accepted_for_address<  sD     ))9+F+F*JTV)W$$&$$$7r.   c                 l    | j                  | j                               | _        | j                          y r9   )rV   rg   r]   r   r`   s    r(   test_subclass_just_createz*TestDefaultSpawn.test_subclass_just_createC  s)    ))$*;*;*=> r.   c                     | j                  | j                               | _        | j                          | j	                  d       y )NTr   )rV   rg   r]   r   r   r`   s    r(   test_subclass_with_socketz*TestDefaultSpawn.test_subclass_with_socketG  s<    ))$*;*;*=> 	 $$$6r.   c                     | j                  t        j                  df      | _        | j	                          | j                  d       y )Nr   Tr   r   r`   s    r(   test_subclass_with_addressz+TestDefaultSpawn.test_subclass_with_addressO  s<    ))9+F+F*JK$$&$$$6r.   c                 $    | j                          y r9   r   r`   s    r(   test_invalid_callbackz&TestDefaultSpawn.test_invalid_callbackT      ##%r.   c                    t        j                  | j                  j                        }	 t	                | j                          | j                  j                          | j                  | j                  j                         | j                          |j                          |j                          | j                  j                          y # |j                          |j                          | j                  j                          w xY wr9   )r1   rP   r]   serve_foreverr5   rM   r_   r<   startedr   killget)r   gs     r(   _test_serve_foreverz$TestDefaultSpawn._test_serve_foreverW  s    LL223		&('')KKT[[001((*FFHEEGKK FFHEEGKKs   A)C <Dc                     | j                  t        j                  df      | _        | j	                  | j                  j
                         | j                          | j                          y r0   )rV   rF   r   r]   r<   r   r   r   r`   s    r(   test_serve_foreverz#TestDefaultSpawn.test_serve_forevere  sO    ))9+F+F*JK,,-$$&  "r.   c                 X   | j                  t        j                  df      | _        | j	                          | j                  | j                  j                         | j                  j                          | j                  | j                  j                         | j                          y r0   )
rV   rF   r   r]   r   r<   r   r   r   r   r`   s    r(   test_serve_forever_after_startz/TestDefaultSpawn.test_serve_forever_after_startk  su    ))9+F+F*JK$$&,,-++,  "r.   zSometimes spuriously failsc                    | j                  t        j                  dfd       | _        | j                  j	                          t                | j                         5 }| j                  |       t        j                  j                  d      5  	 |j                         }|r!|j                  d      sJ t        |             d d d        d d d        | j)                          y # t        j                  $ r Y 6t        j                   $ r?}|j"                  d   dk(  rn"|j"                  d   t$        j&                  k(  rn Y d }~d }~ww xY w# 1 sw Y   xY w# 1 sw Y   xY w)Nr   c                      g S r9   r-   )rE   s    r(   r   zDTestDefaultSpawn.test_server_closes_client_sockets.<locals>.<lambda>u  s    WY r.   r   z"HTTP/1.0 500 Internal Server ErroriE'  )rU   rF   r   r]   r   r5   r   r   r1   Timeout_start_new_or_dummyr:   r   r   r   r;   rD   rE   r   r   r   )r   r>   r?   rH   s       r(   !test_server_closes_client_socketsz2TestDefaultSpawn.test_server_closes_client_socketss  s$   &&	(C(CQ'GIYZ"$]]_ 	##D)33A6 !YY[F%001UVdX\]cXddV		$ 	 ~~ || wwqzU*u'7'77 	 	sT   1EE3C$E$E
7E9E
5E EE

EE	EE"c                 .    | j                   j                  S r9   r   r`   s    r(   r   zTestDefaultSpawn.socket  r   r.   c                    | j                          | j                  | j                  j                         t	        d      fd}|| j                  _        | j                          | j                          | j                  t               y )Ntest_error_in_spawnc                  L    t        j                         j                         y r9   )r1   
getcurrentthrow)r4   rD   s    r(   _spawnz4TestDefaultSpawn.test_error_in_spawn.<locals>._spawn  s    %%e,r.   )	r   r   r]   r   ExpectedErrorr   r   r@   r   )r   r   rD   s     @r(   r   z$TestDefaultSpawn.test_error_in_spawn  si    ++,34	-#**,-/r.   c                    | j                          | j                  j                  sJ | j                  dt	        | j                               | j                  j                  | j                  j                         | j                  dt	        | j                               | j                  dt	        | j                               | j                  j                  | j                         | j                  dt	        | j                               d }| j                  j                  |       | j                  dt	        | j                               y )NServerzhandle=<bound methodzof self>.test_server_repr_when_handle_is_instancemethodc                       y r9   r-   r-   r.   r(   r)   zOTestDefaultSpawn.test_server_repr_when_handle_is_instancemethod.<locals>.handle  s    r.   zhandle=<function)r   r]   r   r   r   
set_handler)   r   )r   r)   s     r(   r   z?TestDefaultSpawn.test_server_repr_when_handle_is_instancemethod  s    {{""""hT[[ 12t{{112,d4;;.?@j$t{{"34tRRSFT[[HYZ	v&($t{{*;<r.   N)r*   r+   r,   rR   r   r   rF   skipOnLibuvOnCIOnPyPyskipOnAppVeyorr   r   r   r   r   reraises_flaky_timeoutr   r;   r   r   r   skipIfEXPECT_POOR_TIMER_RESOLUTIONr   r   r   r   r-   r.   r(   r   r   #  s    *>
 %Y$$%:;Y458 6 <8
! Y457 677
& &Y%%fnn5 6## Yi<<>Z[ \0 " "	0=r.   r   c                       e Zd Zd Zy)TestRawSpawnc                 "    t         j                  S r9   )r1   	spawn_rawr`   s    r(   rR   zTestRawSpawn.get_spawn  s    r.   N)r*   r+   r,   rR   r-   r.   r(   r  r    s     r.   r  c                   f    e Zd Zd Z ej
                  ej                  d      d        Zde_        y)TestPoolSpawnc                      y)N   r-   r`   s    r(   rR   zTestPoolSpawn.get_spawn  s    r.   zIf we have bad timer resolution and hence increase timeouts, it can be hard to sleep for a correct amount of time that lets requests in the pool be full.c                    | j                          | j                         5 }| j                         5 }| j                  |d       | j                  |d       t        j                         j
                  j                          t        j                  t        dz         | j                          | j                          | j                          d d d        d d d        t        j                  t               	 | j                          y # 1 sw Y   <xY w# 1 sw Y   @xY w# t        j                  $ r t        j                          Y y w xY w)Nr   r   g      $@)r   r   r   r1   get_hubloop
update_nowr2   r   rN   rM   r   r;   rF   reraiseFlakyTestTimeout)r   long_requestshort_requests      r(   test_pool_fullzTestPoolSpawn.test_pool_full  s   
 	]]_ 	& &M''x@''g>  %%0024t;<##%##% ##%&	&  	,-	0''))& &	& 	&, ~~ 	0--/	0s5   DBD
D9D" 
D	DD"'EEFN)	r*   r+   r,   rR   rF   r  r  r  error_fatalr-   r.   r(   r  r    s?     Yi<<670	706 "'Nr.   r  c                   H    e Zd Zd Zd Z ej                  d      d        Zy)TestNoneSpawnc                      y r9   r-   r`   s    r(   rR   zTestNoneSpawn.get_spawn  r   r.   c                 $    | j                          y r9   r   r`   s    r(   r   z#TestNoneSpawn.test_invalid_callback  r   r.   z Sometimes doesn't get the error.c                     d }| j                  || j                  d        | j                          | j                          | j	                  t
        d       y )Nc                  6    t        j                  t               y r9   )r1   r2   r	   r3   s    r(   r2   z<TestNoneSpawn.test_assertion_in_blocking_func.<locals>.sleep  s    LL01r.   )r   rP   z?Impossible to call blocking function in the event loop callback)r   rV   r   rB   r   AssertionError)r   r2   s     r(   test_assertion_in_blocking_funcz-TestNoneSpawn.test_assertion_in_blocking_func  sI    	2D,?,?tL.*klr.   N)r*   r+   r,   rR   r   rF   r  r  r-   r.   r(   r  r    s1    & Y@Am Bmr.   r  c                       e Zd Zy)r   Nr*   r+   r,   r-   r.   r(   r   r         r.   r   c                   V    e Zd ZdZd Z ej                   eed      d      d        Z	y)TestSSLSocketNotAllowedFc                 "    t         j                  S r9   r   r`   s    r(   rR   z!TestSSLSocketNotAllowed.get_spawn  r   r.   sslzUses socket.sslc                     ddl m} | j                  t        d            } ||      }| j	                  t
        | j                  |       y )Nr   )r&  rc   rd   )gevent.socketr&  rf   r
   rL   r   rV   )r   r&  listeners      r(   testzTestSSLSocketNotAllowed.test  s;    %**<+BCx=)T%8%8(Cr.   N)
r*   r+   r,   r   rR   unittest
skipUnlesshasattrr   r*  r-   r.   r(   r$  r$    s:    O X/1BCD DDr.   r$  c                 |    t         j                  j                  t         j                  j                  ||             S r9   )osr%   abspathjoin)nameheres     r(   _filer4     s$    77??277<<d344r.   c                       e Zd Zy)BadWrapExceptionNr!  r-   r.   r(   r6  r6    r"  r.   r6  c                   $    e Zd Zd Zd Zd Zd Zy)TestSSLGetCertificatec                 n    | j                  t        j                  dft        d      t        d            S )Nr   z
server.keyz
server.crt)keyfilecertfile)rV   rF   r   r4  r`   s    r(   r   z$TestSSLGetCertificate._create_server
  s9    ""I$?$?#C+0+>,1,,? # A 	Ar.   c                 "    t         j                  S r9   r   r`   s    r(   rR   zTestSSLGetCertificate.get_spawn  r   r.   c                    ddl m}m} | j                  |j	                  d             | j                  |j	                  d             | j                          | j                         \  }}}|j                  ||f       y )Nr   )monkeyr&  r&  r   )r1   r>  r&  r<   is_module_patchedr   rp   get_server_certificate)r   r>  r&  ri   ro   _familys         r(   test_certificatez&TestSSLGetCertificate.test_certificate  sk    &11%8911(;<,0,L,L,N)['""K#=>r.   c                     | j                          d }|| j                  _        | j                  t              5  | j                  j                  d d        d d d        y # 1 sw Y   y xY w)Nc                     t               r9   )r6  )_client_socket
_wrap_argss     r(   bad_wrapzPTestSSLGetCertificate.test_wrap_socket_and_handle_wrap_failure.<locals>.bad_wrap&  s    "$$r.   )r   r]   wrap_socketrL   r6  _handle)r   rG  s     r(   (test_wrap_socket_and_handle_wrap_failurez>TestSSLGetCertificate.test_wrap_socket_and_handle_wrap_failure  s[    
 		% #+/0 	,KKd+	, 	, 	,s   A  A)N)r*   r+   r,   r   rR   rB  rJ  r-   r.   r(   r8  r8    s    A

?,r.   r8  __main__)/
__future__r   r   
contextlibr   r+  r   r/  gevent.testingtestingrF   r   r   r   r   gevent.testing.timingr	   gevent.testing.socketsr
   r   r1   r   gevent.serverr   gevent.exceptionsr   r   r5   objectr7   r[   r   r  r  r  r   r   r$  r%   dirname__file__r4  BaseExceptionr6  r8  r*   mainr-   r.   r(   <module>rY     s   / %   	 #  " L 9 /    & & 4	$v $Ly!! BH=x H=V #  $'$ $'NmH m$	I 	
Dh D WW__X. 5	} 	$,H $,V zINN r.   