
    khBh                     t   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZmZ d dlZd dlmZ d dlmZmZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d d
lmZmZ d dl m!Z" 	 dej#        v rdZ$nd dl%m&Z& dZ$n# e'$ r dZ$Y nw xY w	 d dl(m)Z) d dl*m+Z+ d dl,m-Z. d dl,m/Z/ d dl0m1Z1 d dl(m2Z2 dZ3n# e'$ r dZ3Y nw xY w	 d dl4Z4dZ5n# e'$ r dZ5Y nw xY wd dl6m7Z7 d dl8m9Z9m:Z:m;Z;m<Z< d dl=m>Z>  e            Z? ej@        dejA                  ZB ej@        dejC                  ZDdZE eFedd          ZG eFedd          ZH e jI        eJ          ZK eL            ZMd eeN         fd!ZOe3r7e2jP        Q                                D ]\  ZRZS G d" d#eS          ZTeTe2jP        eR<   d$ ZUd% ZV G d& d'e          ZWd( ZXdS ))    N)Path)ListSet)settings)BaseCommandCommandErrorSystemCheckError)color_styleget_internal_wsgi_application)Signal)get_template_directoriesreset_loaders)file_changedget_reloader)debugzwhitenoise.runserver_nostaticF)StaticFilesHandlerT)
run_simple)DebuggedApplication)WSGIRequestHandler)make_ssl_devcert)_log)	_reloader)null_technical_500_response)RedirectHandlerhas_ipdbsetup_loggersignalcommand)monkey_patch_cursordebugwrapperz^(?:
(?P<addr>
    (?P<ipv4>\d{1,3}(?:\.\d{1,3}){3}) |         # IPv4 address
    (?P<ipv6>\[[a-fA-F0-9:]+\]) |               # IPv6 address
    (?P<fqdn>[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*) # FQDN
):)?(?P<port>\d+)$z
    \x1B  # ESC
    (?:   # 7-bit C1 Fe (except CSI)
        [@-Z\\-_]
    |     # or [ for CSI, followed by a control sequence
        \[
        [0-?]*  # Parameter bytes
        [ -/]*  # Intermediate bytes
        [@-~]   # Final byte
    )
8000&RUNSERVERPLUS_POLLER_RELOADER_INTERVAL   "RUNSERVERPLUS_POLLER_RELOADER_TYPEautoreturnc            	          t                      } t                      D ]U}t          j        |          D ]>\  }}}|D ]5}|                     t          j                            ||                     6?V| S N)setr   oswalkaddpathjoin)template_listtemplate_dirbase_dir_	filenamesfilenames         k/var/www/histauto/venv/lib/python3.11/site-packages/django_extensions/management/commands/runserver_plus.pyget_all_template_filesr5   c   s    EEM022 D D&(gl&;&; 	D 	D"Ha% D D!!"',,x"B"BCCCCD	D     c                   n     e Zd Z fdZed             Zej        d             Zdeddf fdZd Z	 xZ
S )	WrappedReloaderLoopc                 x    t                      | _         t                      j        |i | | j        | _        d S r'   )r5   _template_filessuper__init__extra_files_extra_files)selfargskwargs	__class__s      r4   r<   zWrappedReloaderLoop.__init__s   s>    1G1I1I$  $1&111$($4!!!r6   c                 b   t                      }t          | j                  t          |          k    rV|                    | j                  }|D ]+}t	          dd| d           |                     |           ,t                       || _        | j                            t          |          S )Ninfoz * New file z added, reset template loaders)
r5   lenr:   
differencer   register_file_changedr   r>   union_error_files)r?   template_fileschangedr3   s       r4   r=   zWrappedReloaderLoop.extra_filesx   s    !7!9!9 t+,,N0C0CCC,778LMMG$+ = ="S8SSS   228<<<<!OOO'5$(..|^LLLr6   c                     || _         d S r'   )r>   )r?   r=   s     r4   r=   zWrappedReloaderLoop.extra_files   s    $/!!!r6   r3   r%   Nc                    t          |          }t          j        | |          }t          d |D                       s#t	                                          |           d S t          dd|d           |                     |           d S )N)sender	file_pathc              3   &   K   | ]}|d          V  dS )r"   N ).0ress     r4   	<genexpr>z5WrappedReloaderLoop.trigger_reload.<locals>.<genexpr>   s&      55c3q6555555r6   rD   z * Detected change in z, reset template loaders)r   r   sendanyr;   trigger_reloadr   rG   )r?   r3   r,   resultsrB   s       r4   rW   z"WrappedReloaderLoop.trigger_reload   s    H~~&+44HHH55W55555 9GG**844444UUUU   ..x88888r6   c                 p    t          | d          r%t          j        |          j        }|| j        |<   d S d S )Nmtimes)hasattrr)   statst_mtimerZ   )r?   r3   mtimes      r4   rG   z)WrappedReloaderLoop.register_file_changed   sB    4** 2GH--6E,1DK)))2 2r6   )__name__
__module____qualname__r<   propertyr=   setterstrrW   rG   __classcell__rB   s   @r4   r8   r8   r   s        5 5 5 5 5
 M M XM& 0 0  0
9s 
9t 
9 
9 
9 
9 
9 
92 2 2 2 2 2 2r6   r8   c                  B    t                                                      S r'   )r   watched_filesrQ   r6   r4   gen_filenamesri      s    >>'')))r6   c                 F     t          j                    fd            }|S )Nc                     	  | i |S # t           $ rw t          j                    }|\  }}}t          |dd           !t	          j        |          d         d         }n|j        }|t          vrt                              |            w xY w)Nr3   r   )		Exceptionsysexc_infogetattr	traceback
extract_tbr3   rI   r+   )r@   rA   
_exceptionr1   evtbr3   fns          r4   wrapperzcheck_errors.<locals>.wrapper   s    	2t&v&&& 	 	 	J"IAr2r:t,,4$/33B7:;|++  ***	s
    BB)	functoolswraps)rv   rw   s   ` r4   check_errorsrz      s8    _R    & Nr6   c                        e Zd ZU dZg Zee         ed<   dZdZ	 fdZ
ed             Zd Zd Zd	 Zed
             Zed             Zed             Zed             Zed             Zed             Z xZS )Commandz0Starts a lightweight Web server for development.requires_system_checksz.crtz.keyc           	         t                                          |           |                    ddd           |                    ddddd	d
           |                    ddddd           |                    dddd           |                    dddd           |                    dddd           |                    ddd d           |                    ddd	d            |                    d!d"t          d#$           |                    d%dd	d&            |                                }|                    d'd(d"t
          d)*           |                    d+d(d"t
          d,*           |                    d-d.d"t
          d/*           |                    d0d1d2t
          g d34           |                    d5d6d2t
          g d74           |                    d8d9d"t          t          d:t          z  4           |                    d;d<d"t
          t          d=t          z  4           |                    d>dd?d	d@           |                    dAddBd	dC           |                    dDddEd	dF           |                    dGdHd"dIdJK           |                    dLdMdd	dNK           |                    dOdPdd	dQK           t          r6|                    dRddSddT           |                    dUddVd	dW           d S d S )XNaddrport?z$Optional port number, or ipaddr:port)nargshelpz--ipv6z-6
store_trueuse_ipv6Fz#Tells Django to use a IPv6 address.)actiondestdefaultr   z
--noreloadstore_falseuse_reloaderTz*Tells Django to NOT use the auto-reloader.z	--browseropen_browserzTells Django to open a browser.)r   r   r   z--nothreadingthreadedz!Do not run in multithreaded mode.z
--threadedzRun in multithreaded mode.z--outputoutput_filezRSpecifies an output file to send a copy of all messages (not flushed immediately).)r   r   r   z--print-sqlz%Print SQL queries as they're executed)r   r   r   z--truncate-sqlstorez/Truncate SQL queries to a number of characters.)r   typer   z--print-sql-locationz4Show location in code where SQL query generated fromz--cert	cert_pathz(Deprecated alias for --cert-file option.)r   r   r   r   z--cert-filezSSL .crt file path. If not provided path from --key-file will be selected. Either --cert-file or --key-file must be provided to use SSL.z
--key-filekey_file_pathzSSL .key file path. If not provided path from --cert-file will be selected. Either --cert-file or --key-file must be provided to use SSL.z--extra-filer=   appendzQauto-reload whenever the given file changes too (can be specified multiple times))r   r   r   r   r   z--exclude-patternexclude_patternszYignore reload on changes to files matching this pattern (can be specified multiple times)z--reloader-intervalreloader_intervalzVAfter how many seconds auto-reload should scan for updates in poller-mode [default=%s]z--reloader-typereloader_typezHWerkzeug reloader type [options are auto, watchdog, or stat, default=%s]z--pdbpdbz-Drop into pdb shell at the start of any view.z--ipdbipdbz.Drop into ipdb shell at the start of any view.z--pmpmz;Drop into (i)pdb shell if an exception is raised in a view.z--startup-messagesstartup_messagesreloadzEWhen to show startup messages: reload [default], once, always, never.)r   r   r   r   z--keep-meta-shutdownkeep_meta_shutdown_funczKeep request.META['werkzeug.server.shutdown'] function which is automatically removed because Django debug pages tries to call the function and unintentionally shuts down the Werkzeug server.z--nopinnopinz+Disable the PIN in werkzeug. USE IT WISELY!z
--nostaticuse_static_handlerz5Tells Django to NOT automatically serve static files.z
--insecureinsecure_servingz3Allows serving static files even if DEBUG is False.)	r;   add_argumentsadd_argumentintadd_mutually_exclusive_grouprd    DEFAULT_POLLER_RELOADER_INTERVALDEFAULT_POLLER_RELOADER_TYPEUSE_STATICFILES)r?   parser
cert_grouprB   s      r4   r   zCommand.add_arguments   s   f%%%c(N 	 	
 	
 	
 	6 	 	
 	
 	
 	 = 	 	
 	
 	
 	2	 	 	
 	
 	
 	 4	 	 	
 	
 	
 	-	 	 	
 	
 	
 	)	 	 	
 	
 	
 	8	 	 	
 	
 	
 	B	 	 	
 	
 	
 	"G	 	 	
 	
 	
 88::
; 	  	
 	
 	
 	V 	  	
 	
 	
 	  	 	
 	
 	
 	1 	 	
 	
 	
 	#1 	 	
 	
 	
 	!$4+-MN 	 	
 	
 	
 	 0@*+ 	 		
 		
 		
 	@ 	 	
 	
 	
 	A 	 	
 	
 	
 	N 	 	
 	
 	
 	 #5 	 	
 	
 	
 	"*K 	 	
 	
 	
 	> 	 	
 	
 	
  	$)L      #'J       	 	r6   c                 J   |d         }|d         }|dk    r%t           j                            d          | _        nA|dk    r&t           j                            d           | _        n|dk    rd| _        nd| _        d	t           j        d<   t	          t
          | j        |d
                    t          t                    }t          j
        d          }|                    t          j                   |                    |           d|_        |d         }|d         }|d         }		 ddlm}
 |s|st"          j        rJd}t'          t"          dd           pt"          j        }||vr"t+          |t,                    r||fz  }n||gz  }|rd|
_        n	|rd|
_        d }n'# t0          $ r |s|s|	rt3          d          d}	Y nw xY w|	r|nt4          t6          _        |d         | _        | j        rt<          j        st3          d          d| _         |s	 t"          j!        }n# tD          $ r Y nw xY w|sd| _#        tH          | _%        ntM          j'        tP          |          }|t3          d|z            |)                                \  | _#        }}}| _%        | j%        *                                st3          d| j%        z            | j#        rE|r#| j#        dd         | _#        d| _        d| _         n | j        r|st3          d| j#        z            | j#        s| j        rdnd| _#        d| _         |d          dk    rd n|d          }tW          |d!         |d"         |t
          j,        d#$          5  | -                    |           d d d            d S # 1 swxY w Y   d S )%Nr   r   r   RUNSERVER_PLUS_SHOW_MESSAGESonceneverFT1r   r3   werkzeugr   r   r   r   )PdbMiddlewarez#django_pdb.middleware.PdbMiddleware
MIDDLEWAREc                     t                      rdd l}|}ndd l}|}t          d|d|t          j                   |                    |           d S )Nr   zException occured: z, )file)r   r   r   printrn   stderrpost_mortem)requestexc_type	exc_valueru   r   pr   s          r4   
postmortemz"Command.handle.<locals>.postmortem  sq    :: KKKAAJJJA3;88YYGcj    b!!!!!r6   zdjango-pdb is required for --pdb, --ipdb and --pm options. Please visit https://pypi.python.org/pypi/django-pdb or install via pip. (pip install django-pdb)r   z"Your Python does not support IPv6. z5"%s" is not a valid port number or address:port pair.z%r is not a valid port number.r"   rl   z!"%s" is not a valid IPv6 address.z::1z	127.0.0.1truncate_sql	print_sqlprint_sql_locationRUNSERVER_PLUS)r   r   truncatelogger
confprefix).r)   environgetshow_startup_messagesr   r   r   r   r_   logging	getLoggersetLevelINFO
addHandler	propagatedjango_pdb.middlewarer   r   DEBUGrp   MIDDLEWARE_CLASSES
isinstancetuplealways_breakImportErrorr   r   django_views_debugtechnical_500_responser   sockethas_ipv6	_raw_ipv6!RUNSERVERPLUS_SERVER_ADDRESS_PORTAttributeErroraddrDEFAULT_PORTportrematch
naiveip_regroupsisdigitr   rD   	inner_run)r?   r@   optionsr   r   logredirect
werklogger
pdb_optionipdb_optionr   r   
middlewaresettings_middlewarer   m_ipv4_ipv6_fqdnr   s                      r4   handlezCommand.handle  s   :&"#56x'')+8V)W)WD&&''-/Z^^.. . *D&& (().D&&)-D&58
12DK'-*@	
 	
 	
 	
 &h// &z22
GL)))k***$
U^
foT]+	";;;;;;  
<[ 
<HN 
<B
HlD99XX=X $ %888!"5u== <+
}<+++
|;+  4-2** 4-3*" " " ";  	 	 	 [ B "8  
 BBB	Z =JJ"= 	1  
+= 	E 	ECDDD 	#E!    	XDI$DIIX..Ay"KhV   9:

5DIueUDI9$$&& Q"#Cdi#OPPPy X X $	!B$DI$(DM%)DNN] X5 X&'JTY'VWWWy 	"!%?KDI!DN">2a7744W^=T,k*&';<;'
 
 
 	$ 	$ NN7###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s6   *F! !!GGH# #
H0/H05NNNc                     t                      S )z/Return the default WSGI handler for the runner.r   )r?   r@   r   s      r4   get_handlerzCommand.get_handler   s    ,...r6   c                     fd}|S )Nc                     t          t                    r7t                              dt	                              }t          |          )Nr   )r   r	   ansi_escapesubrd   )envstart_responseerror_messageexcs      r4   applicationz.Command.get_error_handler.<locals>.application  sB    #/00 6 +CHH = =&}555Ir6   rQ   )r?   r   r   r   s    `  r4   get_error_handlerzCommand.get_error_handler  s$    	 	 	 	 	 r6   c                 	   t           st          d          t          j        r6	 t	                       n&# t
          $ r | j        rt          d           Y nw xY w G fddt                    }d         }d         }d         }t          j
        dk    rd	nd
}d         }d         }t          d                   | _        t          d                   }	d         | _        | j        rt          d           	  t          | j                  | j                    t          | j                                t          | j                  d3i }
nD# t
          $ r7}| j                            d|z  d            | j        |fi }
Y d }~nd }~ww xY wt*          r/d         }d         }|rt          j        s|rt-          |
          }
d         s	d         rt.          st          d          |                               \  }}t2          j                            |          \  }}t2          j                            |          \  }}	 t2          j                            |          r$t2          j                            |          r||f}n/t=          t2          j                            ||          d          }n*# t@          $ r | j        rt          d           d}Y nw xY wd }|rdndd | j!        s| j"        n	d!| j"        z  d"| j#        d#}| j        rct          d$tI          j%                    d%t          j&                   t          d&|           t          d'           t          d(|z             |rtO          j(        |           |rDt          j)        r8| xj        t          tU          d) tW                                          z  c_        tY          t          d*g           r'| xj        t          t          j-                  z  c_        |	t          tY          t          d+g                     z  }	|sd,t2          j.        d-<   t2          j.        /                    d-          d,k    r&| j        rd.t2          j.        d/<   ta          |
d0          }
tb          2                    | 1           tg          | j"        ti          | j#                  |
|d0| j        |	|||||2           d S )4NzWerkzeug is required to use runserver_plus. Please visit https://werkzeug.palletsprojects.com/ or install via pip. (pip install Werkzeug)zDWrapping internal werkzeug logger for color highlighting has failed!c                   "     e Zd Z fdZ xZS )-Command.inner_run.<locals>.WSGIRequestHandlerc                     t                                                      }d         sd|v r|d= t          j        d          }|||d<   |S )Nr   zwerkzeug.server.shutdownREMOTE_USER)r;   make_environr)   getenv)r?   r   remote_userrB   r   s      r4   r   z:Command.inner_run.<locals>.WSGIRequestHandler.make_environ$  s^    ''..00 9:<2g== :; i66*-8GM*r6   )r_   r`   ra   r   re   )rB   r   s   @r4   r   r   #  s>        
 
 
 
 
 
 
 
 
 
r6   r   r   r   r   win32z	CONTROL-Cz
CTRL-BREAKr   r   r=   r   r   zPerforming system checks...
)display_num_errorsz Error occurred during checks: %rz

)endingr   r   r   r   zsPython OpenSSL Library is required to use runserver_plus with ssl support. Install via pip (pip install pyOpenSSL).	localhost)hostz<Werkzeug version is less than 0.9, trying adhoc certificate.adhochttpshttpz://z[%s]:/z
Django version z, using settings z!Development server is running at zCUsing the Werkzeug debugger (https://werkzeug.palletsprojects.com/)zQuit the server with %s.c                 F    t          |                               d          S )Nz.mo)rd   endswithr   s    r4   <lambda>z#Command.inner_run.<locals>.<lambda>{  s    H(>(>u(E(E r6   RUNSERVER_PLUS_EXTRA_FILESRUNSERVER_PLUS_EXCLUDE_PATTERNStrueWERKZEUG_RUN_MAINoffWERKZEUG_DEBUG_PINT)rN   )	r   use_debuggerr=   r   r   r   r   request_handlerssl_contextrQ   )5HAS_WERKZEUGr   r   r   set_werkzeug_log_colorrm   r   r   _WSGIRequestHandlerrn   platformr(   r=   r   rz   checkcheck_migrationsr   r   writer   r   r   HAS_OPENSSLdetermine_ssl_files_pathsr)   r,   splitsplitextexistsr   r-   r   r   r   r   djangoget_versionSETTINGS_MODULE
webbrowseropenUSE_I18Nfilterri   rp   r  r   r   r   runserver_plus_startedrU   r   r   )r?   r   r   r   r   r   quit_commandr   r   r   handlerr   r   r   certfilekeyfiledir_pathrootr1   r  bind_urls    `                   r4   r   zCommand.inner_run  s    	*   > 
		&((((   - =  		 	 	 	 	 	 	!4 	 	 	 :&~.~.&)lg&=&={{<#$780w}566w'9:;;W%
% 	31222	=$L$$8RSSSS/L.//1114l4#344??w??GG 	= 	= 	=K@3FvVVV,d,S<<G<<GGGGGG	=  	6!()=!>&'9:! 6x~ 69I 6,W55; 	7?#; 	 "?   !% > >w G GHgW]]844NHdg&&t,,GD!&7>>(++ w0G0G #+W"5KK"2Xt44;# # #K  & & &- V   && K #.GG..!^CDII$)1CCCIII
 % 	=E%'''')A)AC   E88EFFFWXXX,|;<<< 	&OH%%% 	H- 	EE}WW! !  892>> 	IH$G H HHCH?DD
 
 	
  	5.4BJ*+ :>>-..&88z 938
/0)'488G##4#000I	NN%(-/'.#	
 	
 	
 	
 	
 	
s;   4  AA>AE 
F"-FFA2K	 	"K.-K.c                 J   t           j                            |                    d          pd          }t           j                            |                    d          pd          }|                     ||| j                  }|                     ||| j                  }||fS )Nr   r   r   )r)   r,   
expanduserr   _determine_path_for_fileDEFAULT_CRT_EXTENSIONDEFAULT_KEY_EXTENSION)clsr   r   r   	cert_filekey_files         r4   r   z!Command.determine_ssl_files_paths  s    **7;;+G+G+M2NNG&&w{{;'?'?'E2FF	00}c&?
 
	 //9c&?
 
 (""r6   c                     |                      ||          }|                     |          p|                     |          }|                     |          p|}t          j                            |||z             S r'   )#_get_directory_basing_on_file_paths_get_file_name_get_extensionr)   r,   r-   )r8  current_file_pathother_file_pathexpected_extension	directory	file_name	extensions          r4   r5  z Command._determine_path_for_file  s     ;;
 
	 &&'899 
S=O=O>
 >
	 &&'899O=O	w||Iy9'<===r6   c                 |    |                      |          p'|                      |          pt          j                    S r'   )_get_directoryr)   getcwd)r8  r?  r@  s      r4   r<  z+Command._get_directory_basing_on_file_paths  s?     011 !!/22y{{	
r6   c                 L    t           j                            |          d         S )Nr   )r)   r,   r!  r8  rO   s     r4   rF  zCommand._get_directory  s    w}}Y''**r6   c                     t           j                            t           j                            |          d                   d         S )Nr"   r   )r)   r,   r"  r!  rI  s     r4   r=  zCommand._get_file_name  s0    wi 8 8 ;<<Q??r6   c                 L    t           j                            |          d         S )Nr"   )r)   r,   r"  rI  s     r4   r>  zCommand._get_extension  s    w	**1--r6   )r_   r`   ra   r   r}   r   rd   __annotations__r6  r7  r   r   r   r   r   r   classmethodr   r5  r<  rF  r=  r>  re   rf   s   @r4   r|   r|      s]        =D )+DI***""y y y y yv y$ y$ ]y$v/ / /  R
 R
 R
h 	# 	# [	# 
> 
> [
> 
 
 [
 + + [+ @ @ [@ . . [. . . . .r6   r|   c                  b    t                      t          j        fd} | t          _        dS )z%Try to set color to the werkzeug log.c                    	 |                                  d|                                 d||z  }t          |d                   }n# t          $ r  ||g|R  cY S w xY w|d         dk    r                    |          }n|d         dk    r                    |          }n|dk    r                    |          }nu|d         dk    r                    |          }nS|d	k    r                    |          }n7|d         d
k    r	                    |          }n
                    |          }t          ||           d S )Nz - - [z] r"   r   2r   30434044)address_stringlog_date_time_stringrd   rm   HTTP_SUCCESS	HTTP_INFOHTTP_NOT_MODIFIEDHTTP_REDIRECTHTTP_NOT_FOUNDHTTP_BAD_REQUESTHTTP_SERVER_ERRORr   )r?   r   messager@   msg	http_code	_orig_log_styles         r4   werk_logz(set_werkzeug_log_color.<locals>.werk_log  s   	3##%%%%))++++$C
 DGII 	3 	3 	39T72T222222	3 Q<3%%c**CCq\S  ""3''CC%**3//CCq\S  &&s++CC%'',,CCq\S  ))#..CC **3//CT3s   AA
 
A! A!N)r
   r  log)rc  ra  rb  s    @@r4   r  r    sD    ]]F#'I     > 'r6   )Yr   r)   r   r   rn   rq   r'  rx   pathlibr   typingr   r   r$  django.confr   django.core.management.baser   r   r	   django.core.management.colorr
   django.core.servers.basehttpr   django.dispatchr   django.template.autoreloadr   r   django.utils.autoreloadr   r   django.viewsr   r   INSTALLED_APPSr   #django.contrib.staticfiles.handlersr   r   r   r   werkzeug.debugr   werkzeug.servingr   r  r   werkzeug._internalr   r   r  OpenSSLr  /django_extensions.management.technical_responser   "django_extensions.management.utilsr   r   r   r   )django_extensions.management.debug_cursorr   r+  compileXr   VERBOSEr   r   rp   r   r   r   r_   r   r(   rI   rd   r5   reloader_loopsitemsnamereloader_loop_klassr8   ri   rz   r|   r  rQ   r6   r4   <module>r     sa    				 				  



                                        S S S S S S S S S S 4 4 4 4 4 4 F F F F F F " " " " " " N N N N N N N N > > > > > > > > 4 4 4 4 4 4&(*AAAJJJJJJ   OOO
######222222JJJJJJ111111''''''""""""LL   LLLNNNKK   KKK X W W W W W            V U U U U U   RZ D 
 bj
 J  #*76$ $    'w2F     
	8	$	$suuC      3=%.%=%C%C%E%E 1= 1=!!-	2 -	2 -	2 -	2 -	2"5 -	2 -	2 -	2^ *=	 &&* * *  2L. L. L. L. L.k L. L. L.^$' $' $' $' $'s6   ,B B
B&B6 6C ?C C CC