§
    %ê[f¤™  ã                  óä  — d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
ZddlmZ ddlmZ 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mZ 	 ddlZn"# e$ r  G d„ d¦  «        Z e¦   «         ZY nw xY wdZ ej!        dk    r	  e"d¦  «         n# e$ r dZ Y nw xY w e#ed¦  «        Z$e$rej%        Z%n G d„ d¦  «        Z%	 ej&        Z'n# e($ r dZ'Y nw xY wdZ)ej*        ej+        dej,        e-ej*        e-         f         ej.        d         f                  Z/ej0        rddl1m2Z2 ddl1m3Z3 ddl4m5Z5 ddl6m7Z7  G d „ d!ej8        ¦  «        Z9 G d"„ d#e¦  «        Z:ddd(„Z;	 dedfd,„Z<	 dgdhd0„Z=did1„Z>	 dgdjd6„Z?dedkd:„Z@dld>„ZAdmdA„ZBdndB„ZC G dC„ dDe¦  «        ZD G dE„ dFejE        eD¦  «        ZF G dG„ dHe%eD¦  «        ZG	 	 	 	 	 	 dodpdS„ZHdqdT„ZI	 	 	 	 	 	 	 	 	 	 	 	 	 drdsdc„ZJdS )taØ  A WSGI and HTTP server for use **during development only**. This
server is convenient to use, but is not designed to be particularly
stable, secure, or efficient. Use a dedicate WSGI server and HTTP
server when deploying to production.

It provides features like interactive debugging and code reloading. Use
``run_simple`` to start the server. Put this in a ``run.py`` script:

.. code-block:: python

    from myapp import create_app
    from werkzeug import run_simple
é    )ÚannotationsN)Údatetime)Ú	timedelta)Útimezone)ÚBaseHTTPRequestHandler)Ú
HTTPServer)Úunquote)Úurlsplité   ©Ú_log)Ú_wsgi_encoding_dance)ÚInternalServerError)Ú
uri_to_iric                  ó   — e Zd Zdd„ZdS )Ú	_SslDummyÚnameÚstrÚreturnút.Anyc                ó    — t          d¦  «        ‚)NzUSSL is unavailable because this Python runtime was not compiled with SSL/TLS support.)ÚRuntimeError)Úselfr   s     úD/var/www/piapp/venv/lib/python3.11/site-packages/werkzeug/serving.pyÚ__getattr__z_SslDummy.__getattr__*   s   € Ýð2ñô ð ó    N©r   r   r   r   )Ú__name__Ú
__module__Ú__qualname__r   © r   r   r   r   )   s(   € € € € € ð	ð 	ð 	ð 	ð 	ð 	r   r   TÚntÚcoloramaFÚforkc                  ó   — e Zd ZdS )ÚForkingMixInN)r   r   r    r!   r   r   r&   r&   @   s   € € € € € Øˆr   r&   é€   ússl.SSLContextÚadhoc)ÚWSGIApplication)ÚWSGIEnvironment)ÚRSAPrivateKeyWithSerialization)ÚCertificatec                  ó2   — e Zd ZdZdd„Zdd„Zdd
„Zdd„ZdS )ÚDechunkedInputz8An input stream that handles Transfer-Encoding 'chunked'Úrfileút.IO[bytes]r   ÚNonec                ó0   — || _         d| _        d| _        d S )NFr   )Ú_rfileÚ_doneÚ_len)r   r0   s     r   Ú__init__zDechunkedInput.__init__[   s   € ØˆŒØˆŒ
ØˆŒ	ˆ	ˆ	r   Úboolc                ó   — dS )NTr!   ©r   s    r   ÚreadablezDechunkedInput.readable`   s   € Øˆtr   Úintc                ó  — 	 | j                              ¦   «                              d¦  «        }t          |                     ¦   «         d¦  «        }n"# t
          $ r}t          d¦  «        |‚d }~ww xY w|dk     rt          d¦  «        ‚|S )NÚlatin1é   zInvalid chunk headerr   z!Negative chunk length not allowed)r4   ÚreadlineÚdecoder<   ÚstripÚ
ValueErrorÚOSError)r   Úliner6   Úes       r   Úread_chunk_lenzDechunkedInput.read_chunk_lenc   sŽ   € ð	9Ø”;×'Ò'Ñ)Ô)×0Ò0°Ñ:Ô:ˆDÝ�t—z’z‘|”| RÑ(Ô(ˆDˆDøÝð 	9ð 	9ð 	9ÝÐ0Ñ1Ô1°qÐ8øøøøð	9øøøà�!Š8ˆ8ÝÐ=Ñ>Ô>Ð>Øˆs   ‚AA Á
A0ÁA+Á+A0ÚbufÚ	bytearrayc                ó  — d}| j         �su|t          |¦  «        k     �ra| j        dk    r|                      ¦   «         | _        | j        dk    rd| _         | j        dk    rÎt	          t          |¦  «        | j        ¦  «        }||z   t          |¦  «        k    r_| j                             t          |¦  «        |z
  ¦  «        ||d …<   | xj        t          |¦  «        |z
  z  c_        t          |¦  «        }n7| j                             |¦  «        ||||z   …<   | xj        |z  c_        ||z  }| j        dk    r,| j                             ¦   «         }|dvrt          d¦  «        ‚| j         s|t          |¦  «        k     �°a|S )Nr   T)ó   
ó   
ó   z!Missing chunk terminating newline)	r5   Úlenr6   rG   Úminr4   Úreadr@   rD   )r   rH   rP   ÚnÚ
terminators        r   ÚreadintozDechunkedInput.readintom   sv  € ØˆØ”*ñ "	G ­¨C©¬¢¡ØŒy˜AŠ~ˆ~ð !×/Ò/Ñ1Ô1�”	àŒy˜AŠ~ˆ~ð "�”
àŒy˜1Š}ˆ}õ �˜C™œ $¤)Ñ,Ô,�ð
 ˜!‘8�c #™hœhÒ&Ð&Ø!%¤×!1Ò!1µ#°c±(´(¸T±/Ñ!BÔ!B�C˜˜˜‘JØ�I”I¥ S¡¤¨D¡Ñ0�I”IÝ˜s™8œ8�D�Dà+/¬;×+;Ò+;¸AÑ+>Ô+>�C˜˜t a™x˜Ñ(Ø�I”I ‘N�I”IØ˜A‘I�DàŒy˜AŠ~ˆ~ð "œ[×1Ò1Ñ3Ô3�
ØÐ%<Ð<Ð<Ý!Ð"EÑFÔFÐFðE ”*ð "	G ­¨C©¬¢¡ðH ˆr   N)r0   r1   r   r2   ©r   r8   ©r   r<   )rH   rI   r   r<   )r   r   r    Ú__doc__r7   r;   rG   rS   r!   r   r   r/   r/   X   sj   € € € € € ØBÐBðð ð ð ð
ð ð ð ðð ð ð ð&ð &ð &ð &ð &ð &r   r/   c                  ó*  ‡ — e Zd ZU dZded<   ed*d„¦   «         Zd+d„Zd,d
„Zd,ˆ fd„Z		 d-d.d„Z
d/ˆ fd„Zd*d„Zd0d„Ze                     d„ g  ed¦  «        ¢ edd¦  «        ¢D ¦   «         ¦  «        Zde ed¦  «        <   d1d2d"„Zd3d%„Zd3d&„Zd4d)„Zˆ xZS )5ÚWSGIRequestHandlerz3A request handler that implements WSGI dispatching.ÚBaseWSGIServerÚserverr   r   c                ó   — | j         j        S ©N)rZ   Ú_server_versionr:   s    r   Úserver_versionz!WSGIRequestHandler.server_version›   s   € àŒ{Ô*Ð*r   r+   c                óô  — t          | j        ¦  «        }| j        j        €dnd}| j        sd| _        n(t          | j        t          ¦  «        r| j        df| _        |j        s|j        rd|j        › |j        › �}n|j        }t          |¦  «        }i dd“d|“d	| j
        “d
t          j        “d| j        j        “d| j        j        “dd“d| j        “d| j        “d| j        “dd“dt%          |¦  «        “dt%          |j        ¦  «        “dt%          | j        ¦  «        “dt%          | j        ¦  «        “d|                      ¦   «         “d|                      ¦   «         “| j        j        d         t          | j        j        d         ¦  «        | j        dœ¥}| j                             ¦   «         D ]g\  }}d|v rŒ
|                     ¦   «                              dd¦  «        }|                     dd¦  «        }|dvrd |› �}||v r||         › d!|› �}|||<   Œh|                     d"d¦  «                             ¦   «                              ¦   «         d#k    rd$|d%<   t?          |d	         ¦  «        |d	<   |j        r|j        r
|j        |d&<   	 | j                              d$¬'¦  «        }|�tC          j"        |¦  «        |d(<   n6# tF          $ r | j         $                    d)d*¦  «         Y ntJ          $ r Y nw xY w|S )+NÚhttpÚhttps)ú<local>r   r   ú/zwsgi.version)r   r   zwsgi.url_schemez
wsgi.inputzwsgi.errorszwsgi.multithreadzwsgi.multiprocesszwsgi.run_onceFzwerkzeug.socketÚSERVER_SOFTWAREÚREQUEST_METHODÚSCRIPT_NAMEÚ Ú	PATH_INFOÚQUERY_STRINGÚREQUEST_URIÚRAW_URIÚREMOTE_ADDRÚREMOTE_PORTr   )ÚSERVER_NAMEÚSERVER_PORTÚSERVER_PROTOCOLÚ_ú-z
)ÚCONTENT_TYPEÚCONTENT_LENGTHÚHTTP_ú,ÚHTTP_TRANSFER_ENCODINGÚchunkedTzwsgi.input_terminatedÚ	HTTP_HOST)Úbinary_formÚSSL_CLIENT_CERTÚerrorz&Cannot fetch SSL peer certificate info)&r
   ÚpathrZ   Ússl_contextÚclient_addressÚ
isinstancer   ÚschemeÚnetlocr	   r0   ÚsysÚstderrÚmultithreadÚmultiprocessÚ
connectionr^   Úcommandr   ÚqueryÚaddress_stringÚport_integerÚserver_addressÚrequest_versionÚheadersÚitemsÚupperÚreplaceÚgetrB   Úlowerr/   ÚgetpeercertÚsslÚDER_cert_to_PEM_certrC   ÚlogÚAttributeError)r   Úrequest_urlÚ
url_schemeÚ	path_infoÚenvironÚkeyÚvalueÚ	peer_certs           r   Úmake_environzWSGIRequestHandler.make_environŸ   s³  € Ý˜tœyÑ)Ô)ˆØ#œ{Ô6Ð>�V�VÀGˆ
àÔ"ð 	;Ø"0ˆDÔÐÝ˜Ô+­SÑ1Ô1ð 	;Ø#'Ô#6¸Ð":ˆDÔð
 Ô!ð 	) kÔ&8ð 	)ØB˜KÔ.ÐB°Ô0@ÐBÐBˆIˆIà#Ô(ˆIå˜IÑ&Ô&ˆ	ð$
Ø˜Fð$
à˜zð$
ð ˜$œ*ð$
ð �3œ:ð	$
ð
  ¤Ô 7ð$
ð   ¤Ô!9ð$
ð ˜Uð$
ð ˜tœð$
ð ˜tÔ2ð$
ð ˜dœlð$
ð ˜2ð$
ð Õ-¨iÑ8Ô8ð$
ð Õ0°Ô1BÑCÔCð$
ð Õ/°´	Ñ:Ô:ð$
ð" Õ+¨D¬IÑ6Ô6ð#$
ð$ ˜4×.Ò.Ñ0Ô0ð%$
ð& ˜4×,Ò,Ñ.Ô.ð'$
ð(  œ;Ô5°aÔ8Ý˜tœ{Ô9¸!Ô<Ñ=Ô=Ø#Ô3ð-$
ð $
ð $
ˆð2 œ,×,Ò,Ñ.Ô.ð 
	!ð 
	!‰JˆC�Ø�cˆzˆzØà—)’)‘+”+×%Ò% c¨3Ñ/Ô/ˆCØ—M’M &¨"Ñ-Ô-ˆEØÐ<Ð<Ð<Ø#˜c�m�m�Ø˜'�>�>Ø& sœ|Ð5Ð5¨eÐ5Ð5�EØ ˆG�C‰LˆLà�;Š;Ð/°Ñ4Ô4×:Ò:Ñ<Ô<×BÒBÑDÔDÈ	ÒQÐQØ/3ˆGÐ+Ñ,Ý$2°7¸<Ô3HÑ$IÔ$IˆG�LÑ!ð Ôð 	6 +Ô"4ð 	6Ø#.Ô#5ˆG�KÑ ð	ð œ×3Ò3ÀÐ3ÑEÔEˆIØÐ$å-0Ô-EÀiÑ-PÔ-P�Ð)Ñ*øøÝð 	Oð 	Oð 	OàŒK�OŠO˜GÐ%MÑNÔNÐNÐNÐNÝð 	ð 	ð 	àˆDð	øøøð ˆs   Ê4K Ë%K5Ë)	K5Ë4K5r2   c                ó2  ‡ ‡‡‡‡‡	‡
‡‡— ‰ j                              dd¦  «                             ¦   «                              ¦   «         dk    r‰ j                             d¦  «         ‰                      ¦   «         x‰ _        Šd Šd Šd Š
d ŠdŠdˆˆˆˆˆ ˆ
ˆfd
„Šdˆˆˆˆfd„	Š	dˆˆˆˆ ˆ	ˆfd„}	  |‰ j        j	        ¦  «         d S # t          t          j        f$ r!}‰                      |‰¦  «         Y d }~d S d }~wt          $ r“}‰ j        j        r‚ ‰
�	‰rd‰ _        	 ‰
€d Šd Š |t#          ¦   «         ¦  «         n# t          $ r Y nw xY wddlm}  ||¦  «                             ¦   «         }‰ j                             dd|› �¦  «         Y d }~d S d }~ww xY w)NÚExpectrg   z100-continues   HTTP/1.1 100 Continue

FÚdataÚbytesr   r2   c                ó(  •— ‰€
J d¦   «         ‚‰
€
J d¦   «         ‚‰�€‰Š‰
Š		 ‰                      d d¦  «        \  }}n# t          $ r ‰d}}Y nw xY wt          |¦  «        }‰                     ||¦  «         t	          ¦   «         }‰	D ]B\  }}‰                     ||¦  «         |                     |                     ¦   «         ¦  «         ŒCd|v sB‰d         dk    s6d|cxk    rdk     s)n |d	v s#‰j        d
k    rdŠ‰                     dd¦  «         ‰                     dd¦  «         ‰ 	                    ¦   «          t          | t          ¦  «        s
J d¦   «         ‚| r ‰rh‰j                             t          t          | ¦  «        ¦  «        dd …                              ¦   «         ¦  «         ‰j                             d¦  «         ‰j                             | ¦  «         ‰r‰j                             d¦  «         ‰j                             ¦   «          d S )Nzwrite() before start_responser   rg   zcontent-lengthre   ÚHEADéd   éÈ   >   é0  éÌ   úHTTP/1.1TzTransfer-Encodingrx   Ú
ConnectionÚclosezapplications must write bytesé   rL   )ÚsplitrC   r<   Úsend_responseÚsetÚsend_headerÚaddr“   Úprotocol_versionÚend_headersr€   r¤   ÚwfileÚwriteÚhexrN   ÚencodeÚflush)r£   Úcode_strÚmsgÚcodeÚheader_keysr�   rž   Úchunk_responserœ   Úheaders_sentÚheaders_setr   Ústatus_sentÚ
status_sets          €€€€€€€r   r·   z*WSGIRequestHandler.run_wsgi.<locals>.writeû   s[  ø€ àÐ)Ð)Ð+JÑ)Ô)Ð)ØÐ*Ð*Ð,KÑ*Ô*Ð*ØÑ"Ø(�Ø*�ð4Ø$/×$5Ò$5°d¸AÑ$>Ô$>‘M�H˜c˜cøÝ!ð 4ð 4ð 4Ø$/°˜c�H�H�Hð4øøøå˜8‘}”}�Ø×"Ò" 4¨Ñ-Ô-Ð-Ý!™eœe�Ø".ð 1ð 1‘J�C˜Ø×$Ò$ S¨%Ñ0Ô0Ð0Ø—O’O C§I¢I¡K¤KÑ0Ô0Ð0Ð0ð )¨KÐ7Ð7Ø"Ð#3Ô4¸Ò>Ð>Ø 4Ð-Ð-Ò-Ð-¨#Ò-Ð-Ð-Ð-Ø :Ð-Ð-àÔ-°Ò;Ð;à%)�NØ×$Ò$Ð%8¸)ÑDÔDÐDð × Ò  ¨wÑ7Ô7Ð7Ø× Ò Ñ"Ô"Ð"å˜d¥EÑ*Ô*ÐKÐKÐ,KÑKÔKÐKàð .Ø!ð .Ø”J×$Ò$¥S­¨T©¬¡^¤^°A°B°BÔ%7×%>Ò%>Ñ%@Ô%@ÑAÔAÐAØ”J×$Ò$ WÑ-Ô-Ð-à”
× Ò  Ñ&Ô&Ð&à!ð .Ø”J×$Ò$ WÑ-Ô-Ð-àŒJ×ÒÑÔÐÐÐs   ¢< ¼AÁAc                ó”   •— |r/	 ‰r!|d                               |d         ¦  «        ‚	 d }n# d }w xY w‰rt          d¦  «        ‚| Š|Š‰S )Nr   r®   zHeaders already set)Úwith_tracebackÚAssertionError)ÚstatusrŽ   Úexc_inforÀ   rÁ   rÃ   r·   s      €€€€r   Ústart_responsez3WSGIRequestHandler.run_wsgi.<locals>.start_response4  sw   ø€ àð <ð$Ø#ð FØ& qœk×8Ò8¸À!¼ÑEÔEÐEðFð  $�H�Hø˜t�H�O�O�O�OØð <Ý$Ð%:Ñ;Ô;Ð;ØˆJØ!ˆKØˆLs   …#, ¬0Úappr*   c                ó$  •—  | ‰‰
¦  «        }	 |D ]} ‰|¦  «         Œ‰s ‰d¦  «         ‰r‰	j                              d¦  «         t          j        ¦   «         }|                     ‰	j        t          j        ¦  «         d}d}|                     d¬¦  «        rV‰	j         	                    d¦  «        }|t          |¦  «        z  }|dz  }|r|dk    s|d	k    rn|                     d¬¦  «        °V|                     ¦   «          t          |d
¦  «        r|                     ¦   «          d S d S # t          j        ¦   «         }|                     ‰	j        t          j        ¦  «         d}d}|                     d¬¦  «        rV‰	j         	                    d¦  «        }|t          |¦  «        z  }|dz  }|r|dk    s|d	k    rn|                     d¬¦  «        °V|                     ¦   «          t          |d
¦  «        r|                     ¦   «          w w xY w)Nr   s   0

r   g{®Gáz„?)Útimeouti€–˜ r   l    d(	 iè  r­   )r¶   r·   Ú	selectorsÚDefaultSelectorÚregisterr‡   Ú
EVENT_READÚselectr0   rP   rN   r­   Úhasattr)rÊ   Úapplication_iterr£   ÚselectorÚ
total_sizeÚtotal_readsr¿   rœ   rÀ   r   rÉ   r·   s         €€€€€€r   Úexecutez,WSGIRequestHandler.run_wsgi.<locals>.executeB  s]  ø€ Ø"˜s 7¨NÑ;Ô;Ðð#-Ø,ð  ð  �DØ�E˜$‘K”K�K�KØ#ð Ø�E˜#‘J”J�JØ!ð 3Ø”J×$Ò$ \Ñ2Ô2Ð2õ %Ô4Ñ6Ô6�Ø×!Ò! $¤/µ9Ô3GÑHÔHÐHØ�
Ø�ð —o’o¨d�oÑ3Ô3ð 	àœ:Ÿ?š?¨:Ñ6Ô6�DØ¥# d¡)¤)Ñ+�JØ 1Ñ$�Kð  ð  :°Ò#?Ð#?À;ÐQUÒCUÐCUØð —o’o¨d�oÑ3Ô3ð 	ð —’Ñ Ô Ð åÐ+¨WÑ5Ô5ð -Ø$×*Ò*Ñ,Ô,Ð,Ð,Ð,ð-ð -øõ) %Ô4Ñ6Ô6�Ø×!Ò! $¤/µ9Ô3GÑHÔHÐHØ�
Ø�ð —o’o¨d�oÑ3Ô3ð 	àœ:Ÿ?š?¨:Ñ6Ô6�DØ¥# d¡)¤)Ñ+�JØ 1Ñ$�Kð  ð  :°Ò#?Ð#?À;ÐQUÒCUÐCUØð —o’o¨d�oÑ3Ô3ð 	ð —’Ñ Ô Ð åÐ+¨WÑ5Ô5ð -Ø$×*Ò*Ñ,Ô,Ð,Ð,ð-øøøs   �9D, Ä,C#HTr   )ÚDebugTracebackr|   zError on request:
)r£   r¤   r   r2   r\   )rÊ   r*   r   r2   )rŽ   r’   r“   rB   r¶   r·   r    rœ   rZ   rÊ   ÚConnectionErrorÚsocketrÌ   Úconnection_droppedÚ	ExceptionÚpassthrough_errorsÚclose_connectionr   Údebug.tbtoolsrØ   Úrender_traceback_textr—   )r   r×   rF   rØ   r¼   r¿   rœ   rÀ   rÁ   rÉ   rÂ   rÃ   r·   s   `    @@@@@@@@r   Úrun_wsgizWSGIRequestHandler.run_wsgið   s†  øøøøøøøøø€ ØŒ<×Ò˜H bÑ)Ô)×/Ò/Ñ1Ô1×7Ò7Ñ9Ô9¸^ÒKÐKØŒJ×ÒÐ=Ñ>Ô>Ð>à!%×!2Ò!2Ñ!4Ô!4Ð4ˆŒ�wØ!%ˆ
Ø48ˆØ"&ˆØ59ˆØ$ˆð7	ð 7	ð 7	ð 7	ð 7	ð 7	ð 7	ð 7	ð 7	ð 7	ð 7	ð 7	ðr	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð%	-ð %	-ð %	-ð %	-ð %	-ð %	-ð %	-ð %	-ð %	-ð %	-ð %	-ðN	BØˆG�D”K”OÑ$Ô$Ð$Ð$Ð$øÝ¥¤Ð0ð 	0ð 	0ð 	0Ø×#Ò# A wÑ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/øøøøÝð 	Bð 	Bð 	BØŒ{Ô-ð ØàÐ&¨>Ð&Ø(,�Ô%ðð Ð&Ø!%�JØ"&�KØ�Õ+Ñ-Ô-Ñ.Ô.Ð.Ð.øÝð ð ð Ø�ðøøøð 6Ð5Ð5Ð5Ð5Ð5à �. Ñ#Ô#×9Ò9Ñ;Ô;ˆCØŒK�OŠO˜GÐ%@¸3Ð%@Ð%@ÑAÔAÐAÐAÐAÐAÐAÐAÐAøøøøð)	BøøøsI   Â-C ÃFÃC6Ã6FÄFÄD:Ä9FÄ:
EÅFÅEÅAFÆFc                óH  •— 	 t          ¦   «                              ¦   «          dS # t          t          j        f$ r }|                      |¦  «         Y d}~dS d}~wt          $ r>}| j        j        �&t          |¦  «        r|  
                    d|¦  «         n‚ Y d}~dS d}~ww xY w)z/Handles a request ignoring dropped connections.NzSSL error occurred: %s)ÚsuperÚhandlerÙ   rÚ   rÌ   rÛ   rÜ   rZ   r~   Úis_ssl_errorÚ	log_error)r   rF   Ú	__class__s     €r   rä   zWSGIRequestHandler.handleƒ  sÉ   ø€ ð	Ý‰GŒG�NŠNÑÔÐÐÐøÝ¥¤Ð0ð 	'ð 	'ð 	'Ø×#Ò# AÑ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øøøøÝð 	ð 	ð 	ØŒ{Ô&Ð2µ|ÀA±´Ð2Ø—’Ð7¸Ñ;Ô;Ð;Ð;àð <Ð;Ð;Ð;Ð;Ð;øøøøð	øøøs    ƒ % ¥B!»AÁB!Á#3BÂB!Nr|   ÚBaseExceptionrœ   úWSGIEnvironment | Nonec                ó   — dS )z`Called if the connection was closed by the client.  By default
        nothing happens.
        Nr!   )r   r|   rœ   s      r   rÛ   z%WSGIRequestHandler.connection_dropped�  s   € € € r   r   r   c                ót   •— |                      d¦  «        r| j        S t          t          ¦   «         |¦  «        S )NÚdo_)Ú
startswithrá   Úgetattrrã   )r   r   rç   s     €r   r   zWSGIRequestHandler.__getattr__–  s5   ø€ à�?Š?˜5Ñ!Ô!ð 	!Ø”=Ð õ •u‘w”w Ñ%Ô%Ð%r   c                ój   — t          | dd ¦  «        r| j        d         S | j        sdS | j        d         S )Nrœ   rl   rb   r   )rî   rœ   r   r:   s    r   rŠ   z!WSGIRequestHandler.address_stringž  sA   € Ý�4˜ DÑ)Ô)ð 	/Ø”< Ô.Ð.àÔ"ð 	Ø�9àÔ" 1Ô%Ð%r   r<   c                ó   — | j         d         S )Nr   )r   r:   s    r   r‹   zWSGIRequestHandler.port_integer§  s   € ØÔ" 1Ô%Ð%r   c                ó   — i | ]	}|d |d›�“Œ
S )z\xÚ02xr!   )Ú.0Úcs     r   ú
<dictcomp>zWSGIRequestHandler.<dictcomp>¬  s"   € ÐFÐFÐF˜aˆˆM�!ˆMˆMˆMÐFÐFÐFr   é    é   é    z\\ú\rr   r½   ú	int | strÚsizec                óH  — 	 t          | j        ¦  «        }| j        › d|› d| j        › �}n# t          $ r
 | j        }Y nw xY w|                     | j        ¦  «        }t          |¦  «        }|d         dk    rt          |d¦  «        }n�|dk    rnz|dk    rt          |d¦  «        }nc|d         dk    rt          |d	¦  «        }nF|d
k    rt          |d¦  «        }n/|d         dk    rt          |dd¦  «        }nt          |dd¦  «        }|  
                    dd|||¦  «         d S )Nú r   Ú1ÚboldÚ200Ú304ÚcyanÚ3ÚgreenÚ404ÚyellowÚ4ÚredÚmagentaÚinfoz
"%s" %s %s)r   r}   rˆ   r�   r˜   ÚrequestlineÚ	translateÚ_control_char_tabler   Ú_ansi_styler—   )r   r½   rû   r}   r¼   s        r   Úlog_requestzWSGIRequestHandler.log_request°  sM  € ð	#Ý˜dœiÑ(Ô(ˆDØ”\ÐAÐA DÐAÐA¨4Ô+?ÐAÐAˆCˆCøÝð 	#ð 	#ð 	#àÔ"ˆCˆCˆCð	#øøøð
 �mŠm˜DÔ4Ñ5Ô5ˆÝ�4‰yŒyˆà�Œ7�cŠ>ˆ>Ý˜c 6Ñ*Ô*ˆCˆCØ�UŠ]ˆ]ØØ�UŠ]ˆ]Ý˜c 6Ñ*Ô*ˆCˆCØ�!ŒW˜Š^ˆ^Ý˜c 7Ñ+Ô+ˆCˆCØ�UŠ]ˆ]Ý˜c 8Ñ,Ô,ˆCˆCØ�!ŒW˜Š^ˆ^Ý˜c 6¨5Ñ1Ô1ˆCˆCå˜c 6¨9Ñ5Ô5ˆCà�Š�˜ s¨D°$Ñ7Ô7Ð7Ð7Ð7s   ‚(+ «?¾?ÚformatÚargsc                ó$   —  | j         d|g|¢R Ž  d S )Nr|   ©r—   ©r   r  r  s      r   ræ   zWSGIRequestHandler.log_errorÍ  s$   € ØˆŒ�˜&Ð( 4Ð(Ð(Ð(Ð(Ð(Ð(r   c                ó$   —  | j         d|g|¢R Ž  d S )Nr
  r  r  s      r   Úlog_messagezWSGIRequestHandler.log_messageÐ  s$   € ØˆŒ�˜Ð' $Ð'Ð'Ð'Ð'Ð'Ð'r   ÚtypeÚmessagec           	     ó|   — t          ||                      ¦   «         › d|                      ¦   «         › d|› d�g|¢R Ž  d S )Nz - - [z] ú
)r   rŠ   Úlog_date_time_string©r   r  r  r  s       r   r—   zWSGIRequestHandler.logÓ  sd   € ÝØØ×"Ò"Ñ$Ô$ÐVÐV¨D×,EÒ,EÑ,GÔ,GÐVÐVÈ7ÐVÐVÐVð	
ð ð	
ð 	
ð 	
ð 	
ð 	
ð 	
r   )r   r   )r   r+   ©r   r2   r\   )r|   rè   rœ   ré   r   r2   r   rU   )rr   rr   )r½   rú   rû   rú   r   r2   )r  r   r  r   r   r2   ©r  r   r  r   r  r   r   r2   )r   r   r    rV   Ú__annotations__Úpropertyr^   r    rá   rä   rÛ   r   rŠ   r‹   r   Ú	maketransÚranger  Úordr  ræ   r  r—   Ú__classcell__©rç   s   @r   rX   rX   –   s»  ø€ € € € € € Ø=Ð=àÐÐÑàð+ð +ð +ñ „Xð+ðOð Oð Oð OðbQBð QBð QBð QBðf
ð 
ð 
ð 
ð 
ð 
ð GKðð ð ð ð ð&ð &ð &ð &ð &ð &ð&ð &ð &ð &ð&ð &ð &ð &ð Ÿ-š-ØFÐFÐ#E U U¨4¡[¤[Ð#E°5°5¸¸tÑ3DÔ3DÐ#EÐFÑFÔFñô Ðð &+Ð˜˜˜D™	œ	Ñ"ð8ð 8ð 8ð 8ð 8ð:)ð )ð )ð )ð(ð (ð (ð (ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
r   rX   rž   r   Ústylesr   c                óV   — t           s| S dddddddœ}|D ]}d||         › d	| › �} Œ| › d
�S )Nr   é   rö   é!   é#   é$   )rÿ   r  r  r  r	  r  z[Úmz[0m)Ú_log_add_style)rž   r&  ÚcodesÚstyles       r   r  r  Û  sj   € Ýð Øˆð ØØØØØðð €Eð ð /ð /ˆØ.˜˜eœÐ.Ð. uÐ.Ð.ˆˆàÐÐÐÐr   Úcnú
str | Noneú2tuple[Certificate, RSAPrivateKeyWithSerialization]c                ó€  — 	 ddl m} ddlm} ddlm} ddlm} ddlm	} n# t          $ r t          d¦  «        d ‚w xY w |¦   «         }|                     dd	|¬
¦  «        }| €d} |                     |                     |j        d¦  «        |                     |j        | ¦  «        g¦  «        } |¦   «         }|                     ¦   «                              |¦  «                             |¦  «                             |                     ¦   «         ¦  «                             |                     ¦   «         ¦  «                             t1          j        t4          j        ¦  «        ¦  «                             t1          j        t4          j        ¦  «        t;          d¬¦  «        z   ¦  «                             |                     |j         g¦  «        d¬¦  «                             | !                    | "                    | ¦  «        g¦  «        d¬¦  «         #                    || $                    ¦   «         |¦  «        }	|	|fS )Nr   )Úx509)ÚNameOID)Údefault_backend)Úhashes)Úrsaz<Using ad-hoc certificates requires the cryptography library.i  i   )Úpublic_exponentÚkey_sizeÚbackendÚ*zDummy Certificateim  )ÚdaysF)Úcritical)%Úcryptographyr4  Úcryptography.x509.oidr5  Úcryptography.hazmat.backendsr6  Úcryptography.hazmat.primitivesr7  Ú)cryptography.hazmat.primitives.asymmetricr8  ÚImportErrorÚ	TypeErrorÚgenerate_private_keyÚNameÚNameAttributeÚORGANIZATION_NAMEÚCOMMON_NAMEÚCertificateBuilderÚsubject_nameÚissuer_nameÚ
public_keyÚserial_numberÚrandom_serial_numberÚnot_valid_beforeÚdtÚnowr   ÚutcÚnot_valid_afterr   Úadd_extensionÚExtendedKeyUsageÚOID_SERVER_AUTHÚSubjectAlternativeNameÚDNSNameÚsignÚSHA256)
r0  r4  r5  r6  r7  r8  r;  ÚpkeyÚsubjectÚcerts
             r   Úgenerate_adhoc_ssl_pairr`  î  sA  € ð	Ø%Ð%Ð%Ð%Ð%Ð%Ø1Ð1Ð1Ð1Ð1Ð1Ø@Ð@Ð@Ð@Ð@Ð@Ø9Ð9Ð9Ð9Ð9Ð9ØAÐAÐAÐAÐAÐAÐAøÝð ð ð ÝØJñ
ô 
àð	ðøøøð
 ˆoÑÔ€GØ×#Ò#Ø¨°gð $ñ ô €Dð
 
€zØˆà�iŠià×Ò˜wÔ8Ð:MÑNÔNØ×Ò˜wÔ2°BÑ7Ô7ð	
ñô €Gð ˆoÑÔ€Gà×ÒÑ!Ô!ß	Š�gÑ	Ô	ß	Š�WÑ	Ô	ß	Š�D—O’OÑ%Ô%Ñ	&Ô	&ß	Š�t×0Ò0Ñ2Ô2Ñ	3Ô	3ß	Ò	�"œ&¥¤Ñ.Ô.Ñ	/Ô	/ß	Š�œ¥¤Ñ-Ô-µ	¸sÐ0CÑ0CÔ0CÑCÑ	DÔ	Dß	Š�t×,Ò,¨dÔ.BÐ-CÑDÔDÈuˆÑ	UÔ	Uß	Š�t×2Ò2°D·L²LÀÑ4DÔ4DÐ3EÑFÔFÐQVˆÑ	WÔ	Wß	Šˆd�F—M’M‘O”O WÑ	-Ô	-ð 	ð �ˆ:Ðs   ‚! ¡<Ú	base_pathÚhostútuple[str, str]c           	     ó
  — |�d|› d|› �}t          |¬¦  «        \  }}ddlm} | › d�}| › d�}t          |d	¦  «        5 }|                     |                     |j        j        ¦  «        ¦  «         ddd¦  «         n# 1 swxY w Y   t          |d	¦  «        5 }|                     |                     |j        j        |j	        j
        |                     ¦   «         ¬
¦  «        ¦  «         ddd¦  «         n# 1 swxY w Y   ||fS )aÂ  Creates an SSL key for development.  This should be used instead of
    the ``'adhoc'`` key which generates a new cert on each server start.
    It accepts a path for where it should store the key and cert and
    either a host or CN.  If a host is given it will use the CN
    ``*.host/CN=host``.

    For more information see :func:`run_simple`.

    .. versionadded:: 0.9

    :param base_path: the path to the certificate and key.  The extension
                      ``.crt`` is added for the certificate, ``.key`` is
                      added for the key.
    :param host: the name of the host.  This can be used as an alternative
                 for the `cn`.
    :param cn: the `CN` to use.
    Nz*.z/CN=)r0  r   ©Úserializationz.crtz.keyÚwb©Úencodingr  Úencryption_algorithm)r`  rB  rf  Úopenr·   Úpublic_bytesÚEncodingÚPEMÚprivate_bytesÚPrivateFormatÚTraditionalOpenSSLÚNoEncryption)	ra  rb  r0  r_  r]  rf  Ú	cert_fileÚ	pkey_fileÚfs	            r   Úmake_ssl_devcertrv    s§  € ð* ÐØ"�$Ð"Ð"˜DÐ"Ð"ˆÝ(¨BÐ/Ñ/Ô/�J€Dˆ$à<Ð<Ð<Ð<Ð<Ð<àÐ"Ð"Ð"€IØÐ"Ð"Ð"€Iå	ˆi˜Ñ	Ô	ð ? !Ø	�Š�×!Ò! -Ô"8Ô"<Ñ=Ô=Ñ>Ô>Ð>ð?ð ?ð ?ñ ?ô ?ð ?ð ?ð ?ð ?ð ?ð ?øøøð ?ð ?ð ?ð ?å	ˆi˜Ñ	Ô	ð 
 !Ø	�ŠØ×ÒØ&Ô/Ô3Ø$Ô2ÔEØ%2×%?Ò%?Ñ%AÔ%Að ñ ô ñ	
ô 	
ð 	
ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð �iÐÐs$   ¾3A=Á=BÂBÂAC6Ã6C:Ã=C:c            	     ó–  — ddl } ddl}t          ¦   «         \  }}ddlm} |                      ¦   «         \  }}|                      ¦   «         \  }}|                     t          j        |¦  «         |                     t          j        |¦  «         t          j	        || 
                    |j        j        ¦  «        ¦  «         t          j	        ||                     |j        j        |j        j        |                     ¦   «         ¬¦  «        ¦  «         t          j        |¦  «         t          j        |¦  «         t%          ||¦  «        }	|	S )z:Generates an adhoc SSL context for the development server.r   Nre  rh  )ÚtempfileÚatexitr`  rB  rf  ÚmkstemprÏ   ÚosÚremover·   rl  rm  rn  ro  rp  rq  rr  r­   Úload_ssl_context)
rx  ry  r_  r]  rf  Úcert_handlers  Úpkey_handlert  Úctxs
             r   Úgenerate_adhoc_ssl_contextr�  H  s9  € à€O€O€OØ€M€M€Må(Ñ*Ô*�J€Dˆ$à<Ð<Ð<Ð<Ð<Ð<à%×-Ò-Ñ/Ô/Ñ€K�Ø%×-Ò-Ñ/Ô/Ñ€K�Ø
‡O‚O•B”I˜yÑ)Ô)Ð)Ø
‡O‚O•B”I˜yÑ)Ô)Ð)å„Hˆ[˜$×+Ò+¨MÔ,BÔ,FÑGÔGÑHÔHÐHÝ„HØØ×ÒØ"Ô+Ô/Ø Ô.ÔAØ!.×!;Ò!;Ñ!=Ô!=ð 	ñ 	
ô 	
ñô ð õ „Hˆ[ÑÔÐÝ„Hˆ[ÑÔÐÝ
˜9 iÑ
0Ô
0€CØ€Jr   rs  rt  Úprotocolú
int | Nonec                óv   — |€t           j        }t          j        |¦  «        }|                     | |¦  «         |S )aã  Loads SSL context from cert/private key files and optional protocol.
    Many parameters are directly taken from the API of
    :py:class:`ssl.SSLContext`.

    :param cert_file: Path of the certificate to use.
    :param pkey_file: Path of the private key to use. If not given, the key
                      will be obtained from the certificate file.
    :param protocol: A ``PROTOCOL`` constant from the :mod:`ssl` module.
        Defaults to :data:`ssl.PROTOCOL_TLS_SERVER`.
    )r•   ÚPROTOCOL_TLS_SERVERÚ
SSLContextÚload_cert_chain)rs  rt  r‚  r€  s       r   r}  r}  f  s<   € ð ÐÝÔ*ˆå
Œ.˜Ñ
"Ô
"€CØ×Ò˜	 9Ñ-Ô-Ð-Ø€Jr   r|   úException | Noner8   c                óœ   — | €1t          j        t          t          j        ¦   «         d         ¦  «        } t          | t          j        ¦  «        S )z?Checks if the given error (or the current one) is an SSL error.Nr   )ÚtÚcastrÜ   rƒ   rÈ   r€   r•   ÚSSLError)r|   s    r   rå   rå   {  s5   € à€}Ý”•y¥#¤,¡.¤.°Ô"3Ñ4Ô4ˆÝ�e�Sœ\Ñ*Ô*Ð*r   Úportr<   úsocket.AddressFamilyc                ó¦   — |                       d¦  «        rt          j        S d| v r!t          t          d¦  «        rt          j        S t          j        S )zUReturn ``AF_INET4``, ``AF_INET6``, or ``AF_UNIX`` depending on
    the host and port.zunix://ú:ÚAF_INET6)rí   rÚ   ÚAF_UNIXrÒ   r‘  ÚAF_INET)rb  r�  s     r   Úselect_address_familyr”  ‚  sG   € ð ‡‚�yÑ!Ô!ð ÝŒ~ÐØ	�ˆˆ�¥¨Ñ4Ô4ˆÝŒÐÝŒ>Ðr   Úfamilyútuple[str, int] | strc                ó2  — |t           k    r8t          j                             |                      d¦  «        d         ¦  «        S 	 t          j        | ||t
          j        t
          j        ¦  «        }n# t
          j	        $ r | |fcY S w xY w|d         d         S )zVReturn a fully qualified socket address that can be passed to
    :func:`socket.bind`.ú://r®   r   é   )
Úaf_unixr{  r}   ÚabspathÚ	partitionrÚ   ÚgetaddrinfoÚSOCK_STREAMÚIPPROTO_TCPÚgaierror)rb  r�  r•  Úress       r   Úget_sockaddrr¢  Œ  s›   € ð
 •ÒÐåŒw�Š˜tŸ~š~¨eÑ4Ô4°QÔ7Ñ8Ô8Ð8ðÝÔ Ø�$˜¥Ô 2µFÔ4Fñ
ô 
ˆˆøõ Œ?ð ð ð Ø�TˆzÐÐÐðøøøàˆqŒ6�!Œ9Ðs   Á,A2 Á2BÂBc                ób  — | t           j        k    rdnd}t          j         | t           j        ¦  «        5 }	 |                     |df¦  «         n0# t          $ r# | t           j        k    rdndcY cddd¦  «         S w xY w|                     ¦   «         d         cddd¦  «         S # 1 swxY w Y   dS )zˆGet the IP address of an external interface. Used when binding to
    0.0.0.0 or ::1 to show a more useful URL.

    :meta private:
    zfd31:f903:5ab5:1::1z10.253.155.219i2ã  z::1ú	127.0.0.1Nr   )rÚ   r‘  Ú
SOCK_DGRAMÚconnectrD   Úgetsockname)r•  rb  Úss      r   Úget_interface_ipr©  �  s#  € ð %+­f¬oÒ$=Ð$=Ð Ð ÐCS€Då	Œ�v�vÔ0Ñ	1Ô	1ð "°Qð	GØ�IŠI�t˜U�mÑ$Ô$Ð$Ð$øÝð 	Gð 	Gð 	GØ"¥f¤oÒ5Ð5�5�5¸;ÐFÐFð	"ð "ð "ð "ñ "ô "ð "ð "ð	Gøøøð �}Š}‰Œ˜qÔ!ð"ð "ð "ð "ñ "ô "ð "ð "ð "ð "ð "ð "øøøð "ð "ð "ð "ð "ð "s4   ´B$¶AÁB$ÁA;Á,B$Á:A;Á;B$Â$B(Â+B(c                  óh   ‡ — e Zd ZdZdZdZeZdZ	 	 	 	 d$d%ˆ fd„Z	d&d„Z
d'd(ˆ fd„Zd)ˆ fd"„Zd*d#„Zˆ xZS )+rY   zuA WSGI server that that handles one request at a time.

    Use :func:`make_server` to create a server instance.
    FTNrb  r   r�  r<   rÊ   r*   Úhandlerútype[WSGIRequestHandler] | NonerÝ   r8   r~   ú_TSSLContextArg | NoneÚfdrƒ  r   r2   c                ó"  •— |€t           }dt          |¦  «        vr| j        s| j        rd|_        || _        || _        || _        || _        t          ||¦  «        x| _
        }t          |t          |¦  «        |¦  «        }	|t          k    rO|€Mt          j        t           |	¦  «        }	t"          j                             |	¦  «        rt#          j        |	¦  «         t+          ¦   «                              |	|d¬¦  «         |�€	 |                      ¦   «          |                      ¦   «          �n9# t2          $ r·}
|                      ¦   «          t7          |
j        t:          j        ¬¦  «         |
j        t>          j         k    rPt7          d|› d�t:          j        ¬¦  «         t:          j!        dk    r!|d	k    rt7          d
t:          j        ¬¦  «         t;          j"        d¦  «         Y d }
~
n}d }
~
wtF          $ r |                      ¦   «          ‚ w xY w|                      ¦   «          tI          j%        ||tH          j&        ¦  «        | _$        | j$         '                    ¦   «         | _(        |t          k    r| j(        d         | _        |�\tS          |tT          ¦  «        r
tW          |Ž }n|dk    rtY          ¦   «         }| -                    | j$        d¬¦  «        | _$        || _.        nd | _.        dd l/}d|j0         1                    d¦  «        › �| _2        d S )Nr´   r«   F)Úbind_and_activate)ÚfilezPort zp is in use by another program. Either identify and stop that program, or start the server with a different port.Údarwiniˆ  zoOn macOS, try disabling the 'AirPlay Receiver' service from System Preferences -> General -> AirDrop & Handoff.r   r)   T)Úserver_sider   z	Werkzeug/Úwerkzeug)3rX   Úvarsr…   r†   r´   rb  r�  rÊ   rÝ   r”  Úaddress_familyr¢  r<   rš  rŠ  r‹  r   r{  r}   ÚexistsÚunlinkrã   r7   Úserver_bindÚserver_activaterD   Úserver_closeÚprintÚstrerrorrƒ   r„   ÚerrnoÚ
EADDRINUSEÚplatformÚexitrè   rÚ   Úfromfdrž  r§  rŒ   r€   Útupler}  r�  Úwrap_socketr~   Úimportlib.metadataÚmetadataÚversionr]   )r   rb  r�  rÊ   r«  rÝ   r~   r®  r¶  rŒ   rF   Ú	importlibrç   s               €r   r7   zBaseWSGIServer.__init__º  s5  ø€ ð ˆ?Ý(ˆGð
 ¥T¨'¡]¤]Ð2Ð2ØÔð 3Ø $Ô 1ð 3ð (2ˆGÔ$àˆŒ	ØˆŒ	ØˆŒØ"4ˆÔå/DÀTÈ4Ñ/PÔ/PÐPˆÔ˜nÝ% d­C°©I¬I°~ÑFÔFˆð �WÒ$Ð$¨¨ÝœV¥C¨Ñ8Ô8ˆNåŒw�~Š~˜nÑ-Ô-ð *Ý”	˜.Ñ)Ô)Ð)õ 	‰Œ×ÒØØØ#ð 	ñ 	
ô 	
ð 	
ð ‰:ðØ× Ò Ñ"Ô"Ð"Ø×$Ò$Ñ&Ô&Ð&Ñ&øÝð ð ð ð ×!Ò!Ñ#Ô#Ð#Ý�a”j¥s¤zÐ2Ñ2Ô2Ð2à”7�eÔ.Ò.Ð.Ýð! ð !ð !ð !õ !œZð	ñ ô ð õ ”| xÒ/Ð/°D¸D²L°LÝðXå!$¤ðñ ô ð õ ”˜‘”������øøøøÝ ð ð ð Ø×!Ò!Ñ#Ô#Ð#Øðøøøð ×ÒÑÔÐõ !œ-¨¨N½FÔ<NÑOÔOˆDŒKØ"&¤+×"9Ò"9Ñ";Ô";ˆDÔà�WÒ$Ð$àÔ+¨AÔ.ˆDŒIàÐ"Ý˜+¥uÑ-Ô-ð ;Ý.°Ð<��Ø Ò'Ð'Ý8Ñ:Ô:�à%×1Ò1°$´+È4Ð1ÑPÔPˆDŒKØ6AˆDÔÐà#ˆDÔà!Ð!Ð!Ð!àS¨9Ô+=×+EÒ+EÀjÑ+QÔ+QÐSÐSˆÔÐÐs   Ä(D. Ä.
HÄ8B-G*Ç*#Hr  r  r  r   c                ó"   — t          ||g|¢R Ž  d S r\   r   r  s       r   r—   zBaseWSGIServer.log!  s    € ÝˆT�7Ð"˜TÐ"Ð"Ð"Ð"Ð"Ð"r   ç      à?Úpoll_intervalÚfloatc                óÊ   •— 	 t          ¦   «                              |¬¦  «         n# t          $ r Y nw xY w|                      ¦   «          d S # |                      ¦   «          w xY w)N)rË  )rã   Úserve_foreverÚKeyboardInterruptr»  )r   rË  rç   s     €r   rÎ  zBaseWSGIServer.serve_forever$  sx   ø€ ð	 Ý‰GŒG×!Ò!°Ð!Ñ>Ô>Ð>Ð>øÝ ð 	ð 	ð 	ØˆDð	øøøð ×ÒÑÔÐÐÐøˆD×ÒÑÔÐÐøøøs!   ƒ"& ¥A ¦
3°A ²3³A ÁA"Úrequestr   r–  c                óX   •— | j         r‚ t          ¦   «                              ||¦  «        S r\   )rÝ   rã   Úhandle_error)r   rÐ  r   rç   s      €r   rÒ  zBaseWSGIServer.handle_error,  s-   ø€ ð Ô"ð 	Øå‰wŒw×#Ò# G¨^Ñ<Ô<Ð<r   c                ój  — d}t          |dd¦  «        }|g}| j        t          k    r|                     d| j        › �¦  «         nË| j        €dnd}| j        }| j        dv rƒ|                     d	| j        › d
�¦  «         | j        dk    rd}t          t          j        ¦  «        }nd}t          t          j	        ¦  «        }|                     d|› d|› d| j
        › �¦  «         d|v rd|› d�}|                     d|› d|› d| j
        › �¦  «         t          dd                     |¦  «        ¦  «         dS )z<Show information about the address when starting the server.zvWARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.rÿ   r  z * Running on Nr`   ra   >   ú::ú0.0.0.0z * Running on all addresses (ú)rÕ  r¤  z[::1]r˜  r�  ú[ú]r
  r  )r  r¶  rš  Úappendrb  r~   r©  rÚ   r“  r‘  r�  r   Újoin)r   Údev_warningÚmessagesr�   Údisplay_hostnameÚ	localhosts         r   Úlog_startupzBaseWSGIServer.log_startup4  sq  € ðAð 	õ " +¨v°uÑ=Ô=ˆØ�=ˆàÔ¥'Ò)Ð)Ø�OŠOÐ8¨T¬YÐ8Ð8Ñ9Ô9Ð9Ð9à#Ô/Ð7�V�V¸WˆFØ#œyÐàŒyÐ-Ð-Ð-Ø—’Ð LÀÄ	Ð LÐ LÐ LÑMÔMÐMà”9 	Ò)Ð)Ø +�IÝ'7½¼Ñ'GÔ'GÐ$Ð$à '�IÝ'7½¼Ñ'HÔ'HÐ$à—’Ð S°Ð SÐ S¸IÐ SÐ SÈÌ	Ð SÐ SÑTÔTÐTàÐ&Ð&Ð&Ø#:Ð'7Ð#:Ð#:Ð#:Ð à�OŠOÐV¨VÐVÐVÐ8HÐVÐVÈ4Ì9ÐVÐVÑWÔWÐWåˆV�T—Y’Y˜xÑ(Ô(Ñ)Ô)Ð)Ð)Ð)r   )NFNN)rb  r   r�  r<   rÊ   r*   r«  r¬  rÝ   r8   r~   r­  r®  rƒ  r   r2   r  )rÊ  )rË  rÌ  r   r2   )rÐ  r   r   r–  r   r2   r  )r   r   r    rV   r…   r†   ÚLISTEN_QUEUEÚrequest_queue_sizeÚallow_reuse_addressr7   r—   rÎ  rÒ  rß  r$  r%  s   @r   rY   rY   ¯  sê   ø€ € € € € ðð ð
 €KØ€LØ%ÐØÐð 48Ø#(Ø.2ØðeTð eTð eTð eTð eTð eTð eTðN#ð #ð #ð #ð ð  ð  ð  ð  ð  ð  ð=ð =ð =ð =ð =ð =ð *ð  *ð  *ð  *ð  *ð  *ð  *ð  *r   rY   c                  ó   — e Zd ZdZdZdZdS )ÚThreadedWSGIServerz†A WSGI server that handles concurrent requests in separate
    threads.

    Use :func:`make_server` to create a server instance.
    TN)r   r   r    rV   r…   Údaemon_threadsr!   r   r   rä  rä  W  s$   € € € € € ðð ð €KØ€N€N€Nr   rä  c                  ó4   ‡ — e Zd ZdZdZ	 	 	 	 	 ddˆ fd„Zˆ xZS )ÚForkingWSGIServerz�A WSGI server that handles concurrent requests in separate forked
    processes.

    Use :func:`make_server` to create a server instance.
    Té(   NFrb  r   r�  r<   rÊ   r*   Ú	processesr«  r¬  rÝ   r8   r~   r­  r®  rƒ  r   r2   c	           	     ó�   •— t           st          d¦  «        ‚t          ¦   «                              |||||||¦  «         || _        d S )Nz'Your platform does not support forking.)Úcan_forkrC   rã   r7   Úmax_children)
r   rb  r�  rÊ   ré  r«  rÝ   r~   r®  rç   s
            €r   r7   zForkingWSGIServer.__init__k  sQ   ø€ õ ð 	HÝÐFÑGÔGÐGå‰Œ×Ò˜˜t S¨'Ð3EÀ{ÐTVÑWÔWÐWØ%ˆÔÐÐr   )rè  NFNN)rb  r   r�  r<   rÊ   r*   ré  r<   r«  r¬  rÝ   r8   r~   r­  r®  rƒ  r   r2   )r   r   r    rV   r†   r7   r$  r%  s   @r   rç  rç  b  sd   ø€ € € € € ðð ð €Lð Ø37Ø#(Ø.2Øð&ð &ð &ð &ð &ð &ð &ð &ð &ð &ð &r   rç  rÊ   r*   Úthreadedré  Úrequest_handlerr¬  rÝ   r~   r­  r®  c	           
     óÆ   — |r|dk    rt          d¦  «        ‚|rt          | ||||||¬¦  «        S |dk    rt          | |||||||¬¦  «        S t          | ||||||¬¦  «        S )a6  Create an appropriate WSGI server instance based on the value of
    ``threaded`` and ``processes``.

    This is called from :func:`run_simple`, but can be used separately
    to have access to the server object, such as to run it in a separate
    thread.

    See :func:`run_simple` for parameter docs.
    r   z4Cannot have a multi-thread and multi-process server.©r®  )rC   rä  rç  rY   )	rb  r�  rÊ   rí  ré  rî  rÝ   r~   r®  s	            r   Úmake_serverrñ  }  s·   € ð( ð Q�I ’M�MÝÐOÑPÔPÐPàð 
Ý!Ø�$˜˜_Ð.@À+ÐRTð
ñ 
ô 
ð 	
ð �1‚}€}Ý ØØØØØØØØð	
ñ 	
ô 	
ð 		
õ Øˆd�C˜Ð*<¸kÈbðñ ô ð r   c                 óH   — t           j                             d¦  «        dk    S )zqCheck if the server is running as a subprocess within the
    Werkzeug reloader.

    .. versionadded:: 0.10
    ÚWERKZEUG_RUN_MAINÚtrue)r{  rœ   r’   r!   r   r   Úis_running_from_reloaderrõ  ª  s   € õ Œ:�>Š>Ð-Ñ.Ô.°&Ò8Ð8r   ÚautoÚhostnameÚapplicationÚuse_reloaderÚuse_debuggerÚ
use_evalexÚextra_filesút.Iterable[str] | NoneÚexclude_patternsÚreloader_intervalÚreloader_typeÚstatic_filesú'dict[str, str | tuple[str, str]] | Noner2   c                ó  — t          |t          ¦  «        st          d¦  «        ‚|rddlm}  |||¦  «        }|rddlm}  |||¬¦  «        }t          ¦   «         sd}nt          t          j	        d         ¦  «        }t          | |||
|||||¬¦	  «	        }|j                             d	¦  «         t          |                     ¦   «         ¦  «        t          j	        d<   t          ¦   «         s2|                     ¦   «          t!          d
t#          dd¦  «        ¦  «         |rKddlm} 	  ||j        ||||	¬¦  «         |                     ¦   «          dS # |                     ¦   «          w xY w|                     ¦   «          dS )a  Start a development server for a WSGI application. Various
    optional features can be enabled.

    .. warning::

        Do not use the development server when deploying to production.
        It is intended for use only during local development. It is not
        designed to be particularly efficient, stable, or secure.

    :param hostname: The host to bind to, for example ``'localhost'``.
        Can be a domain, IPv4 or IPv6 address, or file path starting
        with ``unix://`` for a Unix socket.
    :param port: The port to bind to, for example ``8080``. Using ``0``
        tells the OS to pick a random free port.
    :param application: The WSGI application to run.
    :param use_reloader: Use a reloader process to restart the server
        process when files are changed.
    :param use_debugger: Use Werkzeug's debugger, which will show
        formatted tracebacks on unhandled exceptions.
    :param use_evalex: Make the debugger interactive. A Python terminal
        can be opened for any frame in the traceback. Some protection is
        provided by requiring a PIN, but this should never be enabled
        on a publicly visible server.
    :param extra_files: The reloader will watch these files for changes
        in addition to Python modules. For example, watch a
        configuration file.
    :param exclude_patterns: The reloader will ignore changes to any
        files matching these :mod:`fnmatch` patterns. For example,
        ignore cache files.
    :param reloader_interval: How often the reloader tries to check for
        changes.
    :param reloader_type: The reloader to use. The ``'stat'`` reloader
        is built in, but may require significant CPU to watch files. The
        ``'watchdog'`` reloader is much more efficient but requires
        installing the ``watchdog`` package first.
    :param threaded: Handle concurrent requests using threads. Cannot be
        used with ``processes``.
    :param processes: Handle concurrent requests using up to this number
        of processes. Cannot be used with ``threaded``.
    :param request_handler: Use a different
        :class:`~BaseHTTPServer.BaseHTTPRequestHandler` subclass to
        handle requests.
    :param static_files: A dict mapping URL prefixes to directories to
        serve static files from using
        :class:`~werkzeug.middleware.SharedDataMiddleware`.
    :param passthrough_errors: Don't catch unhandled exceptions at the
        server level, let the server crash instead. If ``use_debugger``
        is enabled, the debugger will still catch such errors.
    :param ssl_context: Configure TLS to serve over HTTPS. Can be an
        :class:`ssl.SSLContext` object, a ``(cert_file, key_file)``
        tuple to create a typical context, or the string ``'adhoc'`` to
        generate a temporary self-signed certificate.

    .. versionchanged:: 2.1
        Instructions are shown for dealing with an "address already in
        use" error.

    .. versionchanged:: 2.1
        Running on ``0.0.0.0`` or ``::`` shows the loopback IP in
        addition to a real IP.

    .. versionchanged:: 2.1
        The command-line interface was removed.

    .. versionchanged:: 2.0
        Running on ``0.0.0.0`` or ``::`` shows a real IP address that
        was bound as well as a warning not to run the development server
        in production.

    .. versionchanged:: 2.0
        The ``exclude_patterns`` parameter was added.

    .. versionchanged:: 0.15
        Bind to a Unix socket by passing a ``hostname`` that starts with
        ``unix://``.

    .. versionchanged:: 0.10
        Improved the reloader and added support for changing the backend
        through the ``reloader_type`` parameter.

    .. versionchanged:: 0.9
        A command-line interface was added.

    .. versionchanged:: 0.8
        ``ssl_context`` can be a tuple of paths to the certificate and
        private key files.

    .. versionchanged:: 0.6
        The ``ssl_context`` parameter was added.

    .. versionchanged:: 0.5
       The ``static_files`` and ``passthrough_errors`` parameters were
       added.
    zport must be an integerr   )ÚSharedDataMiddleware)ÚDebuggedApplication)ÚevalexNÚWERKZEUG_SERVER_FDrð  Tr
  zPress CTRL+C to quitr  )Úrun_with_reloader)rü  rþ  Úintervalr   )r€   r<   rE  Úmiddleware.shared_datar  Údebugr  rõ  r{  rœ   rñ  rÚ   Úset_inheritabler   Úfilenorß  r   r  Ú	_reloaderr  rÎ  r»  )r÷  r�  rø  rù  rú  rû  rü  rþ  rÿ  r   rí  ré  rî  r  rÝ   r~   r  r  r®  Úsrvr  s                        r   Ú
run_simpler  ³  sà  € õ` �d�CÑ Ô ð 3ÝÐ1Ñ2Ô2Ð2àð FØ@Ð@Ð@Ð@Ð@Ð@à*Ð*¨;¸ÑEÔEˆàð JØ.Ð.Ð.Ð.Ð.Ð.à)Ð)¨+¸jÐIÑIÔIˆå#Ñ%Ô%ð 3Øˆˆå•”Ð0Ô1Ñ2Ô2ˆå
ØØØØØØØØØð
ñ 
ô 
€Cð „J×Ò˜tÑ$Ô$Ð$Ý'*¨3¯:ª:©<¬<Ñ'8Ô'8…B„JÐ#Ñ$å#Ñ%Ô%ð DØ�ŠÑÔÐÝˆV•[Ð!7¸ÑBÔBÑCÔCÐCàð Ø0Ð0Ð0Ð0Ð0Ð0ð		ØÐØÔ!Ø'Ø!1Ø*Ø+ðñ ô ð ð ×ÒÑÔÐÐÐøˆC×ÒÑÔÐÐøøøà×ÒÑÔÐÐÐs   Ä'E ÅE()rž   r   r&  r   r   r   r\   )r0  r1  r   r2  )NN)ra  r   rb  r1  r0  r1  r   rc  )r   r(   )rs  r   rt  r1  r‚  rƒ  r   r(   )r|   rˆ  r   r8   )rb  r   r�  r<   r   rŽ  )rb  r   r�  r<   r•  rŽ  r   r–  )r•  rŽ  r   r   )Fr   NFNN)rb  r   r�  r<   rÊ   r*   rí  r8   ré  r<   rî  r¬  rÝ   r8   r~   r­  r®  rƒ  r   rY   rT   )FFTNNr   rö  Fr   NNFN)"r÷  r   r�  r<   rø  r*   rù  r8   rú  r8   rû  r8   rü  rý  rþ  rý  rÿ  r<   r   r   rí  r8   ré  r<   rî  r¬  r  r  rÝ   r8   r~   r­  r   r2   )KrV   Ú
__future__r   r¾  Úior{  rÍ   rÚ   Úsocketserverrƒ   ÚtypingrŠ  r   rR  r   r   Úhttp.serverr   r   Úurllib.parser	   r
   Ú	_internalr   r   Ú
exceptionsr   Úurlsr   r•   rD  r   r-  r   Ú
__import__rÒ   rë  r&   r’  rš  r˜   rà  ÚOptionalÚUnionÚTupler   ÚLiteralÚ_TSSLContextArgÚTYPE_CHECKINGÚ_typeshed.wsgir*   r+   Ú-cryptography.hazmat.primitives.asymmetric.rsar,   Úcryptography.x509r-   Ú	RawIOBaser/   rX   r  r`  rv  r�  r}  rå   r”  r¢  r©  rY   ÚThreadingMixInrä  rç  rñ  rõ  r  r!   r   r   ú<module>r&     sk  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø 	€	€	€	Ø 	€	€	€	Ø Ð Ð Ð Ø €€€Ø Ð Ð Ð Ø 
€
€
€
Ø Ð Ð Ð Ø #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø .Ð .Ð .Ð .Ð .Ð .Ø "Ð "Ð "Ð "Ð "Ð "Ø  Ð  Ð  Ð  Ð  Ð  Ø !Ð !Ð !Ð !Ð !Ð !à Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ø +Ð +Ð +Ð +Ð +Ð +Ø Ð Ð Ð Ð Ð ðØ€J€J€J€JøØð 	ð 	ð 	ðð ð ð ð ñ ô ð ð ˆ)‰+Œ+€C€C€Cð	øøøð €à„7ˆd‚?€?ðØˆ
�:ÑÔÐÐøØð ð ð Øˆˆˆðøøøð ˆ7�2�vÑÔ€àð ØÔ,€L€Lðð ð ð ð ñ ô ð ðØŒn€G€GøØð ð ð Ø€G€G€Gðøøøð €à”*Ø„GÐ˜aœg c¨1¬:°c¬?Ð&:Ô;¸Q¼YÀwÔ=OÐOÔPô€ð „?ð .Ø.Ð.Ð.Ð.Ð.Ð.Ø.Ð.Ð.Ð.Ð.Ð.ðð ð ð ð ð ð .Ð-Ð-Ð-Ð-Ð-ð;ð ;ð ;ð ;ð ;�R”\ñ ;ô ;ð ;ð|B
ð B
ð B
ð B
ð B
Ð/ñ B
ô B
ð B
ðJ
ð ð ð ð( ð+ð +ð +ð +ð +ð^ ?Cð) ð ) ð ) ð ) ð ) ðXð ð ð ð> JNðð ð ð ð ð*+ð +ð +ð +ð +ðð ð ð ðð ð ð ð""ð "ð "ð "ð$e*ð e*ð e*ð e*ð e*�Zñ e*ô e*ð e*ðPð ð ð ð ˜Ô4°nñ ô ð ð&ð &ð &ð &ð &˜ nñ &ô &ð &ð> ØØ7;Ø$Ø*.Øð*ð *ð *ð *ð *ðZ9ð 9ð 9ð 9ð ØØØ*.Ø/3ØØØØØ7;Ø<@Ø$Ø*.ð!bð bð bð bð bð bð bs6   Á,A1 Á1BÂBÂ!B- Â-B7Â6B7ÃC& Ã&C0Ã/C0