
    R?gr                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKJr  S SK	J
r
  S SKJrJr  S SKJr  S SKJrJr  S SKJr  S SKJr  S S	KJr  S S
KJrJrJrJr  S SKJrJ r    S SK!r	S SK"J#r#  S SK!J&r&J'r'J(r(J)r)   S SK	J*r*   " S S\&5      r+ " S S\+5      r, " S S\+5      r- " S S\+5      r. " S S\+5      r/ " S S\ 5      r0 " S S\ 5      r1 " S S\+5      r2 " S S \+5      r3 " S! S"\+5      r4 " S# S$\+5      r5 " S% S&\+5      r6 " S' S(\+5      r7 " S) S*\+5      r8 " S+ S,\+5      r9 " S- S.\+5      r: " S/ S0\+5      r; " S1 S2\5      r< " S3 S4\<5      r= " S5 S6\+5      r> " S7 S8\<5      r? " S9 S:\@5      rA " S; S<\A5      rB " S= S>\B\<5      rC " S? S@\B\<5      rD " SA SB\B\<5      rE " SC SD\A\<5      rF " SE SF\@5      rG " SG SH\G\R                  5      rI\R                  " \*SL SI5       " SJ SK\G\R                  5      5       rK " SL SM\<5      rL " SN SO\<5      rM " SP SQ\<5      rN " SR SS\<5      rOg! \$ a    \RJ                  " 5         e f = f! \$ a    Sr* GNf = f)T    N)Future)gen)	HTTPErrorHTTPRequest)Event)gen_logapp_log)ResolverSimpleAsyncHTTPClient)
DictLoader)AsyncHTTPTestCasegen_testbind_unused_port	ExpectLog)ApplicationRequestHandler_websocket_mask_python)WebSocketHandlerwebsocket_connectWebSocketErrorWebSocketClosedError)speedupsc                   .    \ rS rSrSrSS jrS rS rSrg)	TestWebSocketHandler,   zBase class for testing handlers that exposes the on_close event.

This allows for tests to see the close code and reason on the
server side.

Nc                     Xl         X l        g Nclose_futurecompression_options)selfr!   r"   s      =/usr/lib/python3/dist-packages/tornado/test/websocket_test.py
initializeTestWebSocketHandler.initialize4   s    (#6     c                     U R                   $ r   r"   r#   s    r$   get_compression_options,TestWebSocketHandler.get_compression_options8   s    '''r'   c                     U R                   b2  U R                   R                  U R                  U R                  45        g g r   )r!   
set_result
close_codeclose_reasonr*   s    r$   on_closeTestWebSocketHandler.on_close;   s6    ((($//4;L;L)MN )r'   r    )NN)	__name__
__module____qualname____firstlineno____doc__r%   r+   r1   __static_attributes__ r'   r$   r   r   ,   s    7(Or'   r   c                   8    \ rS rSr\R
                  S 5       rSrg)EchoHandler@   c              #      #     U R                  U[        U[        5      5      v   g ! [        R                   a     g [
         a     g f = f7fr   )write_message
isinstancebytesasyncioCancelledErrorr   r#   messages     r$   
on_messageEchoHandler.on_messageA   sF     	$$Wj%.HII%% 	# 		s/   A"' AA	A	A	AA		Ar9   N)r3   r4   r5   r6   r   	coroutinerE   r8   r9   r'   r$   r;   r;   @   s    ]] r'   r;   c                       \ rS rSrS rSrg)ErrorInOnMessageHandlerK   c                     SS-    g )N   r   r9   rC   s     r$   rE   "ErrorInOnMessageHandler.on_messageL   s	    	Ar'   r9   Nr3   r4   r5   r6   rE   r8   r9   r'   r$   rI   rI   K   s    r'   rI   c                       \ rS rSrS rSrg)HeaderHandlerP   c                 8   [         R                  " U R                  S5      [         R                  " U R                  S5      [         R                  " U R                  SS5      [         R                  " U R
                  SS5      [         R                  " U R                  S5      U R                  U R                  /nU H  n U" 5         [        S5      e   U R                  U R                  R                  R                  SS5      5        g ! [         a     M[  f = f)	NzThis should not workzhttp://localhost/elsewhereX-Test 	ChocolateChipi  zdid not get expected exception)	functoolspartialwriteredirect
set_header
set_cookie
set_statusflushfinish	ExceptionRuntimeErrorr>   requestheadersget)r#   methods_to_testmethods      r$   openHeaderHandler.openQ   s    djj*@Admm-IJdoox<doo{FCdoos3JJKK
 &F  @AA & 	4<<//33HbAB   s   D
DDr9   Nr3   r4   r5   r6   rg   r8   r9   r'   r$   rP   rP   P   s    Cr'   rP   c                        \ rS rSrS rS rSrg)HeaderEchoHandlerf   c                 (    U R                  SS5        g )NX-Extra-Response-HeaderExtra-Response-Value)r[   r*   s    r$   set_default_headers%HeaderEchoHandler.set_default_headersg   s    13IJr'   c                     U R                   R                  R                  5        H<  u  pUR                  5       R	                  S5      (       d  M+  U R                  X5        M>     g )Nzx-test)rb   rc   get_alllower
startswithr[   )r#   kvs      r$   prepareHeaderEchoHandler.preparej   sD    LL((002DAwwy##H--% 3r'   r9   N)r3   r4   r5   r6   rp   rx   r8   r9   r'   r$   rk   rk   f   s    K&r'   rk   c                       \ rS rSrS rSrg)NonWebSocketHandlerp   c                 &    U R                  S5        g )Nok)rY   r*   s    r$   rd   NonWebSocketHandler.getq   s    

4r'   r9   Nr3   r4   r5   r6   rd   r8   r9   r'   r$   r{   r{   p   s    r'   r{   c                       \ rS rSrS rSrg)RedirectHandleru   c                 &    U R                  S5        g )N/echo)rZ   r*   s    r$   rd   RedirectHandler.getv   s    gr'   r9   Nr   r9   r'   r$   r   r   u   s    r'   r   c                       \ rS rSrS rSrg)CloseReasonHandlerz   c                 6    SU l         U R                  SS5        g )NF  goodbye)on_close_calledcloser*   s    r$   rg   CloseReasonHandler.open{   s    $

4#r'   )r   Nri   r9   r'   r$   r   r   z       $r'   r   c                   >    \ rS rSr\R
                  S 5       rS rSrg)AsyncPrepareHandler   c              #   0   #    [         R                  v   g 7fr   )r   momentr*   s    r$   rx   AsyncPrepareHandler.prepare   s     jjs   c                 &    U R                  U5        g r   r>   rC   s     r$   rE   AsyncPrepareHandler.on_message   s    7#r'   r9   N)	r3   r4   r5   r6   r   rG   rx   rE   r8   r9   r'   r$   r   r      s    ]] $r'   r   c                       \ rS rSrS rSrg)PathArgsHandler   c                 &    U R                  U5        g r   r   )r#   args     r$   rg   PathArgsHandler.open   s    3r'   r9   Nri   r9   r'   r$   r   r           r'   r   c                   L   ^  \ rS rSrU 4S jr\R                  S 5       rSrU =r	$ )CoroutineOnMessageHandler   c                 4   > [         TU ]  " S0 UD6  SU l        g Nr   r9   superr%   sleepingr#   kwargs	__class__s     r$   r%   $CoroutineOnMessageHandler.initialize       $V$r'   c              #      #    U R                   S:  a  U R                  S5        U =R                   S-  sl         [        R                  " S5      v   U =R                   S-  sl         U R                  U5        g 7fNr   z%another coroutine is already sleepingrL   {Gz?r   r>   r   sleeprC   s     r$   rE   $CoroutineOnMessageHandler.on_message   sX     ==1FGiio7#s   A6A8r   )
r3   r4   r5   r6   r%   r   rG   rE   r8   __classcell__r   s   @r$   r   r      s      	]]$ $r'   r   c                       \ rS rSrS rSrg)RenderMessageHandler   c                 B    U R                  U R                  SUS95        g )Nmessage.html)rD   )r>   render_stringrC   s     r$   rE   RenderMessageHandler.on_message   s     4--ng-NOr'   r9   NrN   r9   r'   r$   r   r      s    Pr'   r   c                   4   ^  \ rS rSrU 4S jrS rS rSrU =r$ )SubprotocolHandler   c                 4   > [         TU ]  " S0 UD6  SU l        g NFr9   )r   r%   select_subprotocol_calledr   s     r$   r%   SubprotocolHandler.initialize   s    $V$).&r'   c                 X    U R                   (       a  [        S5      eSU l         SU;   a  gg )Nzselect_subprotocol called twiceT	goodproto)r   r`   )r#   subprotocolss     r$   select_subprotocol%SubprotocolHandler.select_subprotocol   s-    ))=>>)-&,&r'   c                 x    U R                   (       d  [        S5      eU R                  SU R                  -  5        g )Nzselect_subprotocol not calledzsubprotocol=%s)r   r`   r>   selected_subprotocolr*   s    r$   rg   SubprotocolHandler.open   s1    --;<<+d.G.GGHr'   )r   )	r3   r4   r5   r6   r%   r   rg   r8   r   r   s   @r$   r   r      s    /I Ir'   r   c                   R   ^  \ rS rSrU 4S jr\R                  S 5       rS rSr	U =r
$ )OpenCoroutineHandler   c                 @   > [         TU ]  " S0 UD6  Xl        SU l        g r   )r   r%   testopen_finished)r#   r   r   r   s      r$   r%   OpenCoroutineHandler.initialize   s     $V$	"r'   c              #      #    U R                   R                  R                  5       v   [        R                  " S5      v   SU l        g 7f)Nr   T)r   message_sentwaitr   r   r   r*   s    r$   rg   OpenCoroutineHandler.open   s5     ii$$))++ii!s   AA	c                 ^    U R                   (       d  [        S5      eU R                  S5        g )Nz&on_message called before open finishedr~   )r   r`   r>   rC   s     r$   rE   OpenCoroutineHandler.on_message   s%    !!DEE4 r'   )r   r   )r3   r4   r5   r6   r%   r   rG   rg   rE   r8   r   r   s   @r$   r   r      s*    #
 	]]" "
! !r'   r   c                       \ rS rSrS rSrg)ErrorInOpenHandler   c                     [        S5      e)Nboom)r`   r*   s    r$   rg   ErrorInOpenHandler.open   s    r'   r9   Nri   r9   r'   r$   r   r      r   r'   r   c                       \ rS rSrS rSrg)ErrorInAsyncOpenHandler   c                 `   #    [         R                  " S5      I S h  vN   [        S5      e N7f)Nr   r   )rA   r   r`   r*   s    r$   rg   ErrorInAsyncOpenHandler.open   s'     mmA 	s   .,.r9   Nri   r9   r'   r$   r   r      s     r'   r   c                       \ rS rSrS rSrg)NoDelayHandler   c                 H    U R                  S5        U R                  S5        g )NThello)set_nodelayr>   r*   s    r$   rg   NoDelayHandler.open   s    7#r'   r9   Nri   r9   r'   r$   r   r      r   r'   r   c                   X   ^  \ rS rSrU 4S jrU 4S jr\R                  S 5       rSr	U =r
$ )WebSocketBaseTestCase   c                 0   > [         TU ]  5         / U l        g r   )r   setUpconns_to_closer#   r   s    r$   r   WebSocketBaseTestCase.setUp   s     r'   c                 h   > U R                    H  nUR                  5         M     [        TU ]  5         g r   )r   r   r   tearDown)r#   connr   s     r$   r   WebSocketBaseTestCase.tearDown   s'    ''DJJL (r'   c              +      #    [        SU R                  5       U4-  40 UD6v nU R                  R                  U5        [        R
                  " U5      e7f)Nzws://127.0.0.1:%d%s)r   get_http_portr   appendr   Return)r#   pathr   wss       r$   
ws_connect WebSocketBaseTestCase.ws_connect   sV     $!T%7%7%94$@@
DJ
 
 	""2&jjns   AA)r   )r3   r4   r5   r6   r   r   r   rG   r   r8   r   r   s   @r$   r   r      s%    !
 	]] r'   r   c                   ,  ^  \ rS rSrS rS rU 4S jrS rS rS r	\
S 5       rS	 r\
S
 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r\
S 5       r \
S 5       r!\
S 5       r"\
S  5       r#\
S! 5       r$\
S" 5       r%\
S# 5       r&\
S$ 5       r'\
S% 5       r(\
S& 5       r)S'r*U =r+$ )(WebSocketTest   c                    [        5       U l        [        S[        [	        U R                  S94S[
        4S[        4S[        [	        U R                  S94S[        [	        U R                  S94S[        [	        U R                  S94S[        [	        U R                  S94S	[        [	        U R                  S94S
[        [	        U R                  S94S[        [	        U R                  S94S[        [	        U R                  S94S[        [	        U R                  S94S[         [	        U R                  U S94S["        4S[$        4S[&        4/[)        SS05      S9$ )Nr   )r!   /non_ws	/redirectz/headerz/header_echo/close_reason/error_in_on_message/async_preparez/path_args/(.*)
/coroutine/render/subprotocol/open_coroutine)r!   r   /error_in_open/error_in_async_open/nodelayr   z<b>{{ message }}</b>)template_loader)r   r!   r   r;   dictr{   r   rP   rk   r   rI   r   r   r   r   r   r   r   r   r   r   r*   s    r$   get_appWebSocketTest.get_app   sv   "H+t9J9J'KL/0o.M4T=N=N+OP"%d&7&78 $&d&7&78 ++d&7&78 %'d&7&78 &#d&7&78 !-d&7&78
 0$DDUDU2VW"&d&7&78 &(d&7&7dC
 "#56')@A^,a1d '8N'OPg4
 4	
r'   c                     [        5       $ r   r   r*   s    r$   get_http_clientWebSocketTest.get_http_client$  s    $&&r'   c                 ^   > [         TU ]  5         [        R                  R	                  5         g r   )r   r   r   _template_loadersclearr   s    r$   r   WebSocketTest.tearDown(  s     ((..0r'   c                 ^    U R                  S5      nU R                  UR                  S5        g )Nr     fetchassertEqualcoder#   responses     r$   test_http_requestWebSocketTest.test_http_request,  s$    ::g&,r'   c                 d    U R                  SSSSS.S9nU R                  UR                  S5        g )Nr   Upgrade	WebSocket13
Connectionr&  zSec-WebSocket-Versionrc   r  r  r!  s     r$   test_missing_websocket_key(WebSocketTest.test_missing_websocket_key1  <    ::'&)-  
 	,r'   c                 d    U R                  SSSSS.S9nU R                  UR                  S5        g )Nr   r&  r'  12r)  r+  i  r  r!  s     r$   test_bad_websocket_version(WebSocketTest.test_bad_websocket_version<  r.  r'   c              #      #    U R                  S5      v nUR                  S5      v   UR                  5       v nU R                  US5        g 7f)Nr   r   r   r>   read_messager  r#   r   r"  s      r$   test_websocket_gen WebSocketTest.test_websocket_genG  sF     ??7++w''**7+s   AAc                   ^  [        ST R                  5       -  T R                  S9  T R                  5       R	                  5       nUR                  S5        UR                  T R                  5        T R                  5       R	                  5       nT R                  US5        T R                  R                  U 4S j5        UR                  5         T R                  5         g )Nws://127.0.0.1:%d/echo)callbackr   c                 $   > TR                  5       $ r   )stop)fr#   s    r$   <lambda>8WebSocketTest.test_websocket_callbacks.<locals>.<lambda>W  s    diikr'   )r   r   r=  r   resultr>   r5  r  r!   add_done_callbackr   r6  s   `  r$   test_websocket_callbacks&WebSocketTest.test_websocket_callbacksN  s    $t'9'9';;dii	
 YY[!
!
		"99;%%'7+++,AB

		r'   c              #      #    U R                  S5      v nUR                  SSS9  UR                  5       v nU R                  US5        g 7f)Nr   s   hello Tbinaryr4  r6  s      r$   test_binary_message!WebSocketTest.test_binary_message[  sH     ??7++
t4**=1s   A	Ac              #      #    U R                  S5      v nUR                  S5        UR                  5       v nU R                  US5        g 7fNr   u   hello ér4  r6  s      r$   test_unicode_message"WebSocketTest.test_unicode_messageb  sC     ??7++
(**>2   A
Ac              #      #    U R                  S5      v nUR                  5         U R                  [        5         UR	                  S5        S S S 5        g ! , (       d  f       g = f7frK  )r   r   assertRaisesr   r>   r#   r   s     r$   )test_error_in_closed_client_write_message7WebSocketTest.test_error_in_closed_client_write_messagei  sG     ??7++

34^, 544s   9A'A	A'
A$ A'c              #      #    U R                  S5      v nUR                  S5        UR                  5       v nU R                  US5        g 7f)Nr
  r   z<b>hello</b>r4  r6  s      r$   test_render_message!WebSocketTest.test_render_messagep  sC     ??9--
!**>2rN  c              #      #    U R                  S5      v nUR                  S5        [        [        S5         UR	                  5       v nS S S 5        U R                  WS 5        g ! , (       d  f       N!= f7f)Nr  r   Uncaught exception)r   r>   r   r	   r5  assertIsr6  s      r$   test_error_in_on_message&WebSocketTest.test_error_in_on_messagew  sZ     ??#9::
!w 45__..H 6h% 65s   5A6A%
A6%
A3/A6c              #      #    U R                  [        5       nU R                  S5      v   S S S 5        U R                  WR                  R
                  S5        g ! , (       d  f       N5= f7f)Nz	/notfoundi  )rP  r   r   r  	exceptionr   )r#   cms     r$   test_websocket_http_fail&WebSocketTest.test_websocket_http_fail  sK     y)R//+.. ***C0 *)s   A,A/A,
A)%A,c              #      #    U R                  [        5         U R                  S5      v   S S S 5        g ! , (       d  f       g = f7f)Nr  )rP  r   r   r*   s    r$   test_websocket_http_success)WebSocketTest.test_websocket_http_success  s-     ~.//),, /..   A5	A
AAc              #      #    U R                  [        5         U R                  S5      v   S S S 5        g ! , (       d  f       g = f7f)Nr  )rP  r   r   r*   s    r$   test_websocket_http_redirect*WebSocketTest.test_websocket_http_redirect  s-     y)//+.. *))rd  c              #     #    [        5       u  pUR                  5         U R                  [        5         [	        [
        SSS9   [        SU-  SS9v   S S S 5        S S S 5        g ! , (       d  f       N= f! , (       d  f       g = f7f)Nz.*F)requiredzws://127.0.0.1:%d/i  )connect_timeout)r   r   rP  IOErrorr   r   r   )r#   sockports      r$   test_websocket_network_fail)WebSocketTest.test_websocket_network_fail  se     %'


w'7D59'(4/  : ('99 ('s4   2BA6A%A6	B%
A3	/A66
B Bc              #     #    [         R                  " [        SU R                  5       -  5      v 5       nUR	                  S5        UR	                  S5        UR
                  R                  5         S S S 5        g ! , (       d  f       g = f7f)Nr:  r   world)
contextlibclosingr   r   r>   streamr   rQ  s     r$   "test_websocket_close_buffered_data0WebSocketTest.test_websocket_close_buffered_data  si     $%=@R@R@T%TUU
W%W%IIOO
 
 
s   3B=A;2	B;
B	Bc           	   #      #    [         R                  " [        [        SU R	                  5       -  SS0S95      v 5       nUR                  5       v nU R                  US5        S S S 5        g ! , (       d  f       g = f7f)Nzws://127.0.0.1:%d/headerrS   r   r+  )rr  rs  r   r   r   r5  r  r6  s      r$   test_websocket_headers$WebSocketTest.test_websocket_headers  sv      '2T5G5G5II!)7 3 	
 __..HXw/	
 	
 	
s   =A>%A-$	A>-
A;7A>c           	   #   d  #    [         R                  " [        [        SU R	                  5       -  SS0S95      v 5       nU R                  UR                  R                  S5      S5        U R                  UR                  R                  S5      S5        S S S 5        g ! , (       d  f       g = f7f)Nzws://127.0.0.1:%d/header_echozX-Test-Hellor   r+  rn   ro   )rr  rs  r   r   r   r  rc   rd   rQ  s     r$   test_websocket_header_echo(WebSocketTest.test_websocket_header_echo  s     
 '7$:L:L:NN!/ 9 	
 RZZ^^N;WE

89;Q	
 	
 	
s   =B0AB	B0
B-)B0c              #   .  #    U R                  S5      v nUR                  5       v nU R                  US 5        U R                  UR                  S5        U R                  UR
                  S5        U R                  v u  p4U R                  US5        g 7f)Nr  r   r   )r   r5  rY  r  r/   r0   r!   )r#   r   msgr   reasons        r$   test_server_close_reason&WebSocketTest.test_server_close_reason  s}     ???33OO%%c4 -)4!... 	t$s   BBc              #      #    U R                  S5      v nUR                  SS5        U R                  v u  p#U R                  US5        U R                  US5        g 7f)Nr   r   r   )r   r   r!   r  )r#   r   r   r  s       r$   test_client_close_reason&WebSocketTest.test_client_close_reason  sT     ??7++
y!!...t$+s   AAc              #      #    U R                  S5      v nUR                  5       v nU R                  US 5        U R                  [        5         UR                  S5        S S S 5        g ! , (       d  f       g = f7f)Nr  r   )r   r5  rY  rP  r   r>   )r#   r   r~  s      r$   test_write_after_close$WebSocketTest.test_write_after_close  s[     ???33OO%%c4 34W% 544s   AA;A*!	A;*
A84A;c              #      #    U R                  S5      v nUR                  S5        UR                  5       v nU R                  US5        g 7f)Nr  r   r4  r#   r   ress      r$   test_async_prepare WebSocketTest.test_async_prepare  sF      ??#344
!OO%%g&rN  c              #   z   #    U R                  S5      v nUR                  5       v nU R                  US5        g 7f)Nz/path_args/hellor   r   r5  r  r  s      r$   test_path_argsWebSocketTest.test_path_args  s6     ??#566OO%%g&   9;c              #     #    U R                  S5      v nUR                  S5      v   UR                  S5      v   UR                  5       v nU R                  US5        UR                  5       v nU R                  US5        g 7f)Nr	  hello1hello2r4  r  s      r$   test_coroutineWebSocketTest.test_coroutine  sv     ??<00x((x((OO%%h'OO%%h'   BBc           	   #   2  #    U R                  5       nSU-  nSSU-  0n[        R                  " [        [	        X#S95      v 5       nUR                  S5        UR                  5       v nU R                  US5        S S S 5        g ! , (       d  f       g = f7f)Nr:  Originzhttp://127.0.0.1:%dr+  r   r   rr  rs  r   r   r>   r5  r  r#   rm  urlrc   r   r"  s         r$   test_check_origin_valid_no_path-WebSocketTest.test_check_origin_valid_no_path   s     !!#&-2T9:$[%FGG
W%__..HXw/
 
 
   AB6B=	B
BBc           	   #   2  #    U R                  5       nSU-  nSSU-  0n[        R                  " [        [	        X#S95      v 5       nUR                  S5        UR                  5       v nU R                  US5        S S S 5        g ! , (       d  f       g = f7f)Nr:  r  zhttp://127.0.0.1:%d/somethingr+  r   r  r  s         r$   !test_check_origin_valid_with_path/WebSocketTest.test_check_origin_valid_with_path  s     !!#&-<tCD$[%FGG
W%__..HXw/
 
 
r  c              #     #    U R                  5       nSU-  nSSU-  0nU R                  [        5       n[        [	        X#S95      v   S S S 5        U R                  WR                  R                  S5        g ! , (       d  f       N5= f7f)Nr:  r  z127.0.0.1:%dr+    r   rP  r   r   r   r  r]  r   r#   rm  r  rc   r^  s        r$   %test_check_origin_invalid_partial_url3WebSocketTest.test_check_origin_invalid_partial_url  ss     !!#&-^d23y)R#K$EFF ***C0 *)s   2B	A8	/B	8
BB	c              #     #    U R                  5       nSU-  nSS0nU R                  [        5       n[        [	        X#S95      v   S S S 5        U R                  WR                  R                  S5        g ! , (       d  f       N5= f7f)Nr:  r  zhttp://somewhereelse.comr+  r  r  r  s        r$   test_check_origin_invalid'WebSocketTest.test_check_origin_invalid'  ss     !!#&- 78y)R#K$EFF * 	**C0 *)s   /BA5/B5
B?Bc              #     #    U R                  5       n[        5       R                  SU5      v n[        S U 5       5      n[        R
                  U;  a  U R                  S5        g SU-  nSS0nU R                  [        5       n[        [        XES95      v   S S S 5        U R                  WR                  R                  S5        g ! , (       d  f       N5= f7f)	N	localhostc              3   *   #    U  H	  oS    v   M     g7f)r   Nr9   ).0addrs     r$   	<genexpr>EWebSocketTest.test_check_origin_invalid_subdomains.<locals>.<genexpr>=  s     484Aw8s   z"localhost does not resolve to ipv4zws://localhost:%d/echor  zhttp://subtenant.localhostr+  r  )r   r
   resolvesetsocketAF_INETskipTestrP  r   r   r   r  r]  r   )r#   rm  addrinfofamiliesr  rc   r^  s          r$   $test_check_origin_invalid_subdomains2WebSocketTest.test_check_origin_invalid_subdomains5  s     !!#
 "++K>>4844>>)MM>?&- 9:y)R#K$EFF * 	**C0 *)s   BCC	/C	
CCc              #      #    U R                  SSS/S9v nU R                  UR                  S5        UR                  5       v nU R                  US5        g 7f)Nr  badprotor   )r   zsubprotocol=goodproto)r   r  r   r5  r  s      r$   test_subprotocolsWebSocketTest.test_subprotocolsL  s_     ??*k)B # 
 
 	00+>OO%%56s   AAc              #      #    U R                  S5      v nU R                  UR                  S 5        UR                  5       v nU R	                  US5        g 7f)Nr  zsubprotocol=None)r   rY  r   r5  r  r  s      r$   test_subprotocols_not_offered+WebSocketTest.test_subprotocols_not_offeredU  sJ     ??>22b--t4OO%%01s   AAc              #      #    [        5       U l        U R                  S5      v nUR                  S5      v   U R                  R	                  5         UR                  5       v nU R                  US5        g 7f)Nr  r   r~   )r   r   r   r>   r  r5  r  r  s      r$   test_open_coroutine!WebSocketTest.test_open_coroutine\  sc     !G??#455w''OO%%d#s   A5A7c              #      #    [        [        S5         U R                  S5      v nUR                  5       v nS S S 5        U R	                  W5        g ! , (       d  f       N = f7f)NrX  r  r   r	   r   r5  assertIsNoner  s      r$   test_error_in_open WebSocketTest.test_error_in_opene  sN     w 45'788B))C 6 	# 65   A$&AA$
A!A$c              #      #    [        [        S5         U R                  S5      v nUR                  5       v nS S S 5        U R	                  W5        g ! , (       d  f       N = f7f)NrX  r  r  r  s      r$   test_error_in_async_open&WebSocketTest.test_error_in_async_openl  sN     w 45'=>>B))C 6 	# 65r  c              #   z   #    U R                  S5      v nUR                  5       v nU R                  US5        g 7f)Nr  r   r  r  s      r$   test_nodelayWebSocketTest.test_nodelays  s5     ??:..OO%%g&r  )r!   r   ),r3   r4   r5   r6   r  r  r   r#  r,  r1  r   r7  rC  rH  rL  rR  rU  rZ  r_  rb  rf  rn  ru  rx  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r8   r   r   s   @r$   r  r     s   6
p'1-
	-	- , , 2 2 3 3 - - 3 3 & & 1 1
 - - / /     0 0  & % % , , & & ' ' ' '
 ( ( 0 0 0 0 1 1 1 1 1 1, 7 7 2 2 $ $     ' 'r'   r  c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )NativeCoroutineOnMessageHandleriz  c                 4   > [         TU ]  " S0 UD6  SU l        g r   r   r   s     r$   r%   *NativeCoroutineOnMessageHandler.initialize{  r   r'   c                   #    U R                   S:  a  U R                  S5        U =R                   S-  sl         [        R                  " S5      I S h  vN   U =R                   S-  sl         U R                  U5        g  N+7fr   r   rC   s     r$   rE   *NativeCoroutineOnMessageHandler.on_message  s`     ==1FGiio7# 	s   AB A>,B r   )r3   r4   r5   r6   r%   rE   r8   r   r   s   @r$   r  r  z  s    $ $r'   r  c                   *    \ rS rSrS r\S 5       rSrg)WebSocketNativeCoroutineTesti  c                 &    [        S[        4/5      $ )N/native)r   r  r*   s    r$   r  $WebSocketNativeCoroutineTest.get_app  s    Y(GHIJJr'   c              #     #    U R                  S5      v nUR                  S5      v   UR                  S5      v   UR                  5       v nU R                  US5        UR                  5       v nU R                  US5        g 7f)Nr  r  r  r4  r  s      r$   test_native_coroutine2WebSocketNativeCoroutineTest.test_native_coroutine  sv     ??9--x((x((OO%%h'OO%%h'r  r9   N)r3   r4   r5   r6   r  r   r  r8   r9   r'   r$   r  r    s    K ( (r'   r  c                       \ rS rSrSrS rS rS rS\S\SS	4S
 jr	\
S\R                  4S j5       r\
S\R                  4S j5       rSrg	)CompressionTestMixini  zHello world. Testing 123 123c           	           " S S[         5      n[        S[        [        U R	                  5       S94SU[        U R	                  5       S94/5      $ )Nc                   *    \ rS rSr\S 5       rS rSrg)4CompressionTestMixin.get_app.<locals>.LimitedHandleri  c                     g)N   r9   r*   s    r$   max_message_sizeECompressionTestMixin.get_app.<locals>.LimitedHandler.max_message_size  s    r'   c                 J    U R                  [        [        U5      5      5        g r   )r>   strlenrC   s     r$   rE   ?CompressionTestMixin.get_app.<locals>.LimitedHandler.on_message  s    ""3s7|#45r'   r9   N)r3   r4   r5   r6   propertyr  rE   r8   r9   r'   r$   LimitedHandlerr    s     6r'   r  r   r)   /limited)r   r   r;   r  get_server_compression_options)r#   r  s     r$   r  CompressionTestMixin.get_app  s_    	61 	6  T-P-P-RS "T-P-P-RS
 	
r'   c                     g r   r9   r*   s    r$   r  3CompressionTestMixin.get_server_compression_options      r'   c                     g r   r9   r*   s    r$   get_client_compression_options3CompressionTestMixin.get_client_compression_options  r  r'   bytes_in	bytes_outreturnNc                     [        5       er   NotImplementedErrorr#   r  r  s      r$   verify_wire_bytes&CompressionTestMixin.verify_wire_bytes      !##r'   r#   c              #   d  #    U R                  SU R                  5       S9v n[        S5       HK  nUR                  U R                  5        UR                  5       v nU R                  X0R                  5        MM     U R                  UR                  R                  [        U R                  5      S-  5        U R                  UR                  R                  [        U R                  5      S-  5        U R                  UR                  R                  UR                  R                  5        g 7f)Nr   r)      )r   r  ranger>   MESSAGEr5  r  protocol_message_bytes_outr  _message_bytes_inr  _wire_bytes_in_wire_bytes_outr#   r   ir"  s       r$   test_message_sizes'CompressionTestMixin.test_message_sizes  s     ??)L)L)N # 
 

 qAT\\*__..HX||4  	77T\\9JQ9NO66DLL8IA8MNr{{992;;;V;VWs   D.D0c              #     #    U R                  SU R                  5       S9v nUR                  S5        UR                  5       v nU R	                  US5        UR                  S5        UR                  5       v nU R                  U5        g 7f)Nr  r)   ڀaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa128   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa)r   r  r>   r5  r  r  r6  s      r$   test_size_limit$CompressionTestMixin.test_size_limit  s     ??D,O,O,Q # 
 
 	#**5) 	$**(#s   BBr9   )r3   r4   r5   r6   r  r  r  r  intr  r   typingAnyr  r  r8   r9   r'   r$   r  r    sq    ,G
0$# $# $$ $ X X X $fjj $ $r'   r  c                   :    \ rS rSrSrS\R                  4S jrSrg)UncompressedTestMixini  zESpecialization of CompressionTestMixin when we expect no compression.r#   c                     U R                  US[        U R                  5      S-   -  5        U R                  US[        U R                  5      S-   -  5        g )Nr        )r  r  r  r  s      r$   r  'UncompressedTestMixin.verify_wire_bytes  sH    AT\\):Q)>$?@1DLL(9A(=#>?r'   r9   N)	r3   r4   r5   r6   r7   r  r  r  r8   r9   r'   r$   r  r    s    O@

 @r'   r  c                       \ rS rSrSrg)NoCompressionTesti  r9   N)r3   r4   r5   r6   r8   r9   r'   r$   r  r    s    r'   r  c                       \ rS rSrS rSrg)ServerOnlyCompressionTesti  c                     0 $ r   r9   r*   s    r$   r  8ServerOnlyCompressionTest.get_server_compression_options      	r'   r9   N)r3   r4   r5   r6   r  r8   r9   r'   r$   r!  r!        r'   r!  c                       \ rS rSrS rSrg)ClientOnlyCompressionTesti  c                     0 $ r   r9   r*   s    r$   r  8ClientOnlyCompressionTest.get_client_compression_options  r$  r'   r9   N)r3   r4   r5   r6   r  r8   r9   r'   r$   r'  r'    r%  r'   r'  c                   &    \ rS rSrS rS rS rSrg)DefaultCompressionTesti  c                     0 $ r   r9   r*   s    r$   r  5DefaultCompressionTest.get_server_compression_options  r$  r'   c                     0 $ r   r9   r*   s    r$   r  5DefaultCompressionTest.get_client_compression_options  r$  r'   c                     U R                  US[        U R                  5      S-   -  5        U R                  US[        U R                  5      S-   -  5        U R                  X!S-   5        g )Nr  r  r     )
assertLessr  r  r  r  s      r$   r  (DefaultCompressionTest.verify_wire_bytes  sV    	1DLL(9A(=#>?!s4<<'81'<"=>rM2r'   r9   N)r3   r4   r5   r6   r  r  r  r8   r9   r'   r$   r+  r+    s    3r'   r+  c                   L    \ rS rSrS\S\S\4S jrS\R                  4S jrSr	g	)
MaskFunctionMixini  maskdatar  c                     [        5       er   r  r#   r6  r7  s      r$   r6  MaskFunctionMixin.mask  r  r'   r#   c                    U R                  U R                  SS5      S5        U R                  U R                  SS5      S5        U R                  U R                  SS5      S5        U R                  U R                  SS5      S	5        U R                  U R                  S
S5      S5        U R                  U R                  SS5      S5        g )Ns   abcdr'      b   s   54321s   TVPVPs   ZXCVs   98765432s   c`t`olpds    s   s   s   s    s   )r  r6  r*   s    r$   	test_maskMaskFunctionMixin.test_mask  s    7C0#67D17;7H5x@7K8+F 	II)+FG'	
 	II)+FG'	
r'   r9   N)
r3   r4   r5   r6   r@   r6  r  r  r>  r8   r9   r'   r$   r5  r5    s,    $ $e $ $


 
r'   r5  c                       \ rS rSrS rSrg)PythonMaskFunctionTesti  c                     [        X5      $ r   r   r9  s      r$   r6  PythonMaskFunctionTest.mask  s    %d11r'   r9   Nr3   r4   r5   r6   r6  r8   r9   r'   r$   rA  rA    s    2r'   rA  z#tornado.speedups module not presentc                       \ rS rSrS rSrg)CythonMaskFunctionTesti  c                 .    [         R                  " X5      $ r   )r   websocket_maskr9  s      r$   r6  CythonMaskFunctionTest.mask  s    &&t22r'   r9   NrD  r9   r'   r$   rF  rF    s    3r'   rF  c                   *    \ rS rSrS r\S 5       rSrg)ServerPeriodicPingTesti#  c                 :     " S S[         5      n[        SU4/SS9$ )Nc                       \ rS rSrS rSrg)3ServerPeriodicPingTest.get_app.<locals>.PingHandleri%  c                 &    U R                  S5        g )Ngot pongr   r#   r7  s     r$   on_pong;ServerPeriodicPingTest.get_app.<locals>.PingHandler.on_pong&      "":.r'   r9   N)r3   r4   r5   r6   rR  r8   r9   r'   r$   PingHandlerrN  %      /r'   rU  /r   )websocket_ping_intervalr   r   r#   rU  s     r$   r  ServerPeriodicPingTest.get_app$  s&    	/. 	/ S+./NNr'   c              #      #    U R                  S5      v n[        S5       H'  nUR                  5       v nU R                  US5        M)     g 7f)NrW  r  rP  )r   r  r5  r  r  s       r$   test_server_ping'ServerPeriodicPingTest.test_server_ping+  sC     ??3''qA__..HXz2 s   AAr9   N)r3   r4   r5   r6   r  r   r]  r8   r9   r'   r$   rK  rK  #  s    O 3 3r'   rK  c                   *    \ rS rSrS r\S 5       rSrg)ClientPeriodicPingTesti4  c                 <     " S S[         5      n[        SU4/5      $ )Nc                       \ rS rSrS rSrg)3ClientPeriodicPingTest.get_app.<locals>.PingHandleri6  c                 &    U R                  S5        g )Ngot pingr   rQ  s     r$   on_ping;ClientPeriodicPingTest.get_app.<locals>.PingHandler.on_ping7  rT  r'   r9   Nr3   r4   r5   r6   rf  r8   r9   r'   r$   rU  rc  6  rV  r'   rU  rW  rY  rZ  s     r$   r  ClientPeriodicPingTest.get_app5  s$    	/. 	/ S+./00r'   c              #      #    U R                  SSS9v n[        S5       H'  nUR                  5       v nU R                  US5        M)     UR	                  5         g 7f)NrW  r   )ping_intervalr  re  )r   r  r5  r  r   r  s       r$   test_client_ping'ClientPeriodicPingTest.test_client_ping<  sR     ??3d?;;qA__..HXz2  	
s   AAr9   N)r3   r4   r5   r6   r  r   rl  r8   r9   r'   r$   r`  r`  4  s    1  r'   r`  c                   *    \ rS rSrS r\S 5       rSrg)ManualPingTestiF  c                 <     " S S[         5      n[        SU4/5      $ )Nc                       \ rS rSrS rSrg)+ManualPingTest.get_app.<locals>.PingHandleriH  c                 @    U R                  U[        U[        5      S9  g )NrF  )r>   r?   r@   rQ  s     r$   rf  3ManualPingTest.get_app.<locals>.PingHandler.on_pingI  s    ""4
40G"Hr'   r9   Nrh  r9   r'   r$   rU  rr  H  s    Ir'   rU  rW  rY  rZ  s     r$   r  ManualPingTest.get_appG  s&    	I. 	I S+./00r'   c              #   H  #    U R                  S5      v nU R                  [        UR                  S5        UR                  S5        UR	                  5       v nU R                  US5        UR                  S5        UR	                  5       v nU R                  US5        g 7f)NrW  ~aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaar   s   hellos   binary hello)r   rP  
ValueErrorpingr5  r  )r#   r   resps      r$   test_manual_pingManualPingTest.test_manual_pingN  s     ??3''*bggy9
__&&x(
 __&&/s   B B"r9   N)r3   r4   r5   r6   r  r   r{  r8   r9   r'   r$   ro  ro  F  s    1 0 0r'   ro  c                   *    \ rS rSrS r\S 5       rSrg)MaxMessageSizeTesti^  c                 $    [        S[        4/SS9$ )NrW  r  )websocket_max_message_size)r   r;   r*   s    r$   r  MaxMessageSizeTest.get_app_  s    S+./DQQr'   c              #   ~  #    U R                  S5      v nSnUR                  U5        UR                  5       v nU R                  X25        UR                  US-   5        UR                  5       v nU R	                  US 5        U R                  UR
                  S5        U R                  UR                  S5        g 7f)NrW     aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabi  zmessage too big)r   r>   r5  r  rY  r/   r0   )r#   r   r~  rz  s       r$   test_large_message%MaxMessageSizeTest.test_large_messageb  s     ??3'' 
__&&# 	s#__&&dD!-*;<s   B;B=r9   N)r3   r4   r5   r6   r  r   r  r8   r9   r'   r$   r~  r~  ^  s    R = =r'   r~  )PrA   rr  rW   r  	tracebackr  unittesttornado.concurrentr   tornador   tornado.httpclientr   r   tornado.locksr   tornado.logr   r	   tornado.netutilr
   tornado.simple_httpclientr   tornado.templater   tornado.testingr   r   r   r   tornado.webr   r   tornado.websockettornado.utilr   ImportError	print_excr   r   r   r   r   r   r;   rI   rP   rk   r{   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  objectr  r  r  r!  r'  r+  r5  TestCaserA  skipIfrF  rK  r`  ro  r~  r9   r'   r$   <module>r     s          %  5  ( $ ; ' T T 3	
3  
O+ O(& 2 
C( C,&, &. 
n 
$- $$. $ *  
$ 4 $P/ P
I- I&!/ !$ -  
 2  $) $- &L') L'^$&: $(#8 ( @$6 @$F@0 @	-/D 	
 57L 
 57L 
313H 3
 
.2.0A0A 2
 
T!#HI3.0A0A 3 J3
32 3"2 $0* 00=. =O  

 	
"  Hs   &
H, =I ,III