+
    ÏÐbgø2  ã                   óô  € R t ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIHtH	t	 ^ RI
Ht ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ R	IHt ^R
IHtHt ^RIHtHt ^RIHt ^ RIt^ RIt]P>                  R8¼  d7   ]P@                  R8X  d&   ^ RI!t!]!PD                  ! ]!PF                  ! 4       4       ]PH                  ! R4      t%Rt&R t'RR lt( ! R R]PR                  4      t* ! R R]4      t+ ! R R4      t,R# )z¢
livereload.server
~~~~~~~~~~~~~~~~~

WSGI app server for livereload.

:copyright: (c) 2013 - 2015 by Hsiaoming Yang
:license: BSD, see LICENSE for more details.
N)ÚPopenÚPIPE)ÚWSGIContainer)ÚIOLoop)Úadd_reload_hook)Úweb)Úescape)Úhttputil)ÚLogFormatter)ÚLiveReloadHandlerÚLiveReloadJSHandler)ÚForceReloadHandlerÚStaticFileHandler)Úget_watcher_classÚwin32Ú
livereloads   </head>c                ó   a aa€ V VV3R lpV# )z1Helper Function to Add HTTP headers to the serverc                 óD   <€ S! V .VO5/ VB  V P                  SS4       R # ©N)Ú
set_header)ÚselfÚargsÚkwargsÚfnÚnameÚvalues   &*,€€€Ú3/usr/lib/python3/dist-packages/livereload/server.pyÚset_default_headersÚ'set_header.<locals>.set_default_headers-   s#   ø€ Ù
ˆ4Ð!�$Ò!˜&Ò!Ø�‰˜˜eÖ$ó    © )r   r   r   r   s   fff r   r   r   +   s   ú€ ÷%ð Ðr   c                óŽ  a aaaa€ S'       g   \         P                  oMb\         P                  P                  S4      pV'       d<   \         P                  P	                  V4      '       g   \         P
                  ! V4       \        S \        \        34      '       g   S'       g   \        P                  ! S 4      o V VVVV3R lpV# )a  Execute a shell command.

You can add a shell command::

    server.watch(
        'style.less', shell('lessc style.less', output='style.css')
    )

:param cmd: a shell command, string or list
:param output: output stdout to the given file
:param mode: only works with output, mode ``w`` means write,
             mode ``a`` means append
:param cwd: set working directory before command is executed.
:param shell: if true, on Unix the executable argument specifies a
              replacement shell for the default ``/bin/sh``.
c            	      ó@  <€  \        S\        \        \        SS	R 7      p T P                  4       w  r#TP                  4       pTP                  4       pT'       d   \        P	                  T4       T# \        SS4      ;_uu_ 4       pTP                  T4       RRR4       R#   \         d^   p\        P	                  T4       TP
                  \
        P                  8X  d   \        P	                  RS^ ,          4       Tu Rp?# Rp?ii ; i  + '       g   i     R# ; i))ÚstdinÚstdoutÚstderrÚcwdÚshellzmaybe you haven't installed %sN)r   r   ÚOSErrorÚloggerÚerrorÚerrnoÚENOENTÚcommunicateÚdecodeÚopenÚwrite)
ÚpÚer$   r%   ÚfÚcmdr&   ÚmodeÚoutputr'   s
        €€€€€r   Ú	run_shellÚshell.<locals>.run_shellN   sË   ø€ ð	Ü�c¤¬d¼4ÀSØ!ô#ˆAð Ÿ™›‰ˆà—‘“ˆØ—‘“ˆßÜ�L‰L˜Ô ØˆMÜ�&˜$×Ô 1Ø�G‰G�FŒO÷  Ñøô ô 	Ü�L‰L˜ŒOØ�w‰wœ%Ÿ,™,Ô&Ü—‘Ð=¸sÀ1½vÔFØ�Hûð		ú÷  ×Ðús*   ƒB! ÂDÂ!D	Â,ADÃ>D	ÄD	ÄD	)ÚosÚdevnullÚpathÚdirnameÚisdirÚmakedirsÚ
isinstanceÚlistÚtupleÚshlexÚsplit)r4   r6   r5   r&   r'   Úfolderr7   s   fffff  r   r'   r'   3   sw   ü€ ÷" Ü—‘‰ä—‘—‘ Ó(ˆßœ"Ÿ'™'Ÿ-™-¨×/Ò/Ü�KŠK˜Ôä�cœD¤%˜=×)Ò)·%Ü�kŠk˜#Óˆ÷ñ ð& Ðr   c                   ó8   a a€ ] tR t^dt oV 3R ltR tRtVtV ;t# )ÚLiveScriptInjectorc                ó&   <€ \         SV `  V4       R # r   )ÚsuperÚ__init__)r   ÚrequestÚ	__class__s   &&€r   rI   ÚLiveScriptInjector.__init__e   s   ø€ Ü‰Ñ˜Ö!r   c                ó4  € R VP                  RR4      9   pV'       dy   \        V9   dn   VP                  \        V P                  \        ,           ^4      pRV9   d;   \	        VR,          4      \        V P                  4      ,           p\        V4      VR&   WV3# )ÚhtmlúContent-TypeÚ úContent-Length)ÚgetÚHEAD_ENDÚreplaceÚscriptÚintÚlenÚstr)r   Ústatus_codeÚheadersÚchunkÚ	finishingÚis_htmlÚlengths   &&&&&  r   Útransform_first_chunkÚ(LiveScriptInjector.transform_first_chunkh   s|   € Ø˜GŸK™K¨¸Ó;Ñ;ˆß”x 5Ô(Ø—M‘M¤(¨D¯K©K¼(Õ,BÀAÓFˆEØ 7Ô*Ü˜WÐ%5Õ6Ó7¼#¸d¿k¹kÓ:JÕJ�Ü,/°«K�Ð(Ñ)Ø UÐ*Ð*r   r    )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__rI   r_   Ú__static_attributes__Ú__classdictcell__Ú__classcell__)rK   Ú__classdict__s   @@r   rF   rF   d   s   ù‡ € õ"÷+ò +r   rF   c                   ó0   a € ] tR t^rt o RR ltR tRtV tR# )ÚLiveScriptContainerc                ó   € Wn         W n        R # r   )Úwsgi_apprU   )r   rl   rU   s   &&&r   rI   ÚLiveScriptContainer.__init__s   s   € Ø ŒØŽr   c                ó  aa€ / o. oRVV3R llpV P                  \        V P                   4      P                  V4      V4      p SP                  V4       RP	                  S4      p\        VR4      '       d   VP                  4        S'       g   \        R4      hSR,          P                  R^4      w  rV\        T4      pSR,          pT UU	u0 uF  w  r‰TP                  4       kK  	  p
pp	\        P                  ! T4      p\        T9   d,   TP                  \        T P                  \        ,           4      pTR8w  dE   R	T
9  d   TP!                  R4       R
T
9  d&   TP!                  R\#        \%        T4      4      34       RT
9  d   TP!                  R4       \&        P(                  ! RYV4      p\&        P*                  ! 4       pT F?  w  rÞTP                  4       R
8X  d   \#        \%        T4      4      pTP-                  YÞ4       KA  	  TP.                  P1                  Y¼TR7       TP.                  P3                  4        T P5                  YQ4       R #   \        TR4      '       d   TP                  4        i i ; iu up	pi )Nc                 ó0   <€ V SR &   VSR&   SP                   # )ÚstatusrZ   )Úappend)rp   Úresponse_headersÚexc_infoÚdataÚresponses   &&&€€r   Ústart_responseÚ4LiveScriptContainer.__call__.<locals>.start_response{   s   ø€ Ø#ˆD�‰NØ.ˆD�‰OØ—?‘?Ð"r   r   Úclosez$WSGI app did not call start_responserp   Ú rZ   i0  zcontent-typezcontent-lengthrQ   ÚserverzHTTP/1.1)r[   r   )rO   z'application/octet-stream; charset=UTF-8)ÚServerÚ
LiveServer)rl   r   ÚenvironÚextendÚjoinÚhasattrrx   Ú	ExceptionrC   rV   Úlowerr   Úutf8rS   rT   rU   rq   rX   rW   r	   ÚResponseStartLineÚHTTPHeadersÚaddÚ
connectionÚwrite_headersÚfinishÚ_log)r   rJ   rv   Úapp_responseÚbodyrY   ÚreasonrZ   ÚkÚvÚ
header_setÚ
start_lineÚ
header_objÚkeyr   rt   ru   s   &&             @@r   Ú__call__ÚLiveScriptContainer.__call__w   s  ù€ ØˆØˆ÷	#ð 	#ð
 —}‘}Ü˜$Ÿ-™-Ó(×0Ñ0°Ó9¸>óKˆð	%Ø�O‰O˜LÔ)Ø—8‘8˜HÓ%ˆDä�| W×-Ò-Ø×"Ñ"Ô$ßÜÐBÓCÐCà" 8�n×2Ñ2°3¸Ó:ÑˆÜ˜+Ó&ˆØ�y•/ˆÙ.5Ô6©g¡F Q�a—g‘g–i©gˆ
Ñ6Ü�{Š{˜4Ó ˆä�tÔØ—<‘<¤¨$¯+©+¼Õ*@ÓAˆDà˜#ÔØ ZÔ/Ø—‘ð  ô ð   zÔ1Ø—‘Ð 0´#´c¸$³i³.ÐAÔBà˜:Ô%Ø�N‰NÐ3Ô4ä×/Ò/Ø˜ó
ˆ
ô ×)Ò)Ó+ˆ
Û!‰JˆCØ�y‰y‹{Ð.Ô.ÜœC ›I›�Ø�N‰N˜3Ö&ñ "ð 	×Ñ×(Ñ(¨ÀtÐ(ÔLØ×Ñ×!Ñ!Ô#Ø�	‰	�+Ö'øôI �| W×-Ò-Ø×"Ñ"Õ$ð .üó 7s   Á"I ÃJ É%I=)rU   rl   N)rP   )ra   rb   rc   rd   rI   r”   re   rf   ©rh   s   @r   rj   rj   r   s   ø‡ € ô÷3(ð 3(r   rj   c                   ó^   a € ] tR t^­t o RtRR ltR tRR ltRR ltR t	RR lt
R	 tR
tV tR# )r{   a‹  Livereload server interface.

Initialize a server and watch file changes::

    server = Server(wsgi_app)
    server.serve()

:param app: a WSGI application instance
:param watcher: A Watcher instance, you don't have to initialize
                it by yourself. Under Linux, you will want to install
                pyinotify and use INotifyWatcher() to avoid wasted
                CPU usage.
Nc                ót   € R V n         Wn        V'       g   \        4       pV! 4       pW n        \        V n        R # r   )ÚrootÚappr   Úwatcherr   ÚSFH)r   rš   r›   Úwatcher_clss   &&& r   rI   ÚServer.__init__»   s,   € ØˆŒ	àŒßÜ+Ó-ˆKÙ!“mˆGØŒÜ$ˆŽr   c                ób   € \        \        P                  W4      \        n        \        V n        R# )a¨  Add or override HTTP headers at the at the beginning of the 
   request.

Once you have initialized a server, you can add one or more 
headers before starting the server::

    server.setHeader('Access-Control-Allow-Origin', '*')
    server.setHeader('Access-Control-Allow-Methods', '*')
    server.serve()

:param name: The name of the header field to be defined.
:param value: The value of the header field to be defined.
N)r   r   r   rœ   )r   r   r   s   &&&r   Ú	setHeaderÚServer.setHeaderÅ   s%   € ô 1;Ü!×5Ñ5°tó1DÔÔ-ä$ˆŽr   c                óš   € \        V\        4      '       d   Tp\        V4      pRV 2Vn        V P                  P                  WW4R7       R# )a)  Add the given filepath for watcher list.

Once you have initialized a server, watch file changes before
serve the server::

    server.watch('static/*.stylus', 'make static')
    def alert():
        print('foo')
    server.watch('foo.txt', alert)
    server.serve()

:param filepath: files to be watched, it can be a filepath,
                 a directory, or a glob pattern
:param func: the function to be called, it can be a string of
             shell command, or any callable object without
             parameters
:param delay: Delay sending the reload message. Use 'forever' to
              not send it. This is useful to compile sass files to
              css, but reload on changed css files then only.
:param ignore: A function return True to ignore a certain pattern of
               filepath.
zshell: )ÚignoreN)r?   rX   r'   r   r›   Úwatch)r   ÚfilepathÚfuncÚdelayr£   r4   s   &&&&& r   r¤   ÚServer.watch×   sC   € ô. �dœC× Ò ØˆCÜ˜“;ˆDØ! # ˜ˆDŒIà�‰×Ñ˜8¨5ÐÖ@r   c                óž  a€ V P                   \        n         V\        n        Vf   V P                  '       d   RpR\        3R\        3R\
        3.pRoV'       d   \        P                  ! SV,          4      oM\        P                  ! SR,          4      oV P                  S4      p ! V3R lR\        4      pV'       g7   Wg,           p	\        P                  ! V	VV.R	7      p
V
P                  WR
7       R # \        P                  ! VVV.R	7      p
V
P                  WR
7       \        P                  ! VRR7      pVP                  W2R
7       R # )NTz/livereloadz/forcereloadz/livereload.jszÕ<script type="text/javascript">(function(){var s=document.createElement("script");var port=%s;s.src="//"+window.location.hostname+":"+port+ "/livereload.js?port=" + port;document.head.appendChild(s);})();</script>zJ(window.location.port || (window.location.protocol == 'https:' ? 443: 80))c                   ó   <€ ] tR tRt Z tRtR# )Ú/Server.application.<locals>.ConfiguredTransformi  r    N)ra   rb   rc   rd   rU   re   )Úlive_scripts   €r   ÚConfiguredTransformr«     s   ø† Ù ŒFr   r­   )ÚhandlersÚdebugÚ
transforms)ÚaddressF)r®   r¯   )r›   r   Úlive_cssrš   r   r   r   rƒ   Úget_web_handlersrF   r   ÚApplicationÚlisten)r   ÚportÚhostÚliveportr¯   r²   Úlive_handlersÚweb_handlersr­   r®   rš   Úliver¬   s   &&&&&&      @r   ÚapplicationÚServer.applicationõ   s*  ø€ à$(§L¡LÔÔ!Ø%-ÔÔ"ØŠ=˜TŸXŸX˜XØˆEð Ô.Ð/ØÔ0Ð1ØÔ 3Ð4ð
ˆðð 	÷ Ü Ÿ+š+ k°HÕ&<Ó=‰Kä Ÿ+š+ kð  5Aõ  'Aó  BˆKà×,Ñ,¨[Ó9ˆ÷	!Ô"4ô 	!÷ Ø$Õ3ˆHÜ—/’/Ø!ØØ/Ð0ôˆCð
 �J‰J�tˆJÖ*ä—/’/Ø%ØØ/Ð0ôˆCð
 �J‰J�tˆJÔ*Ü—?’?¨MÀÔGˆDØ�K‰K˜ˆKÖ/r   c                óâ   € V P                   '       d-   \        V P                   V4      pR \        P                  RV/3.# RV P                  RV P
                  ;'       g    RRV P                  /3.# )z.*Úfallbackz/(.*)r;   Ú.Údefault_filename)rš   rj   r   ÚFallbackHandlerrœ   r™   rÁ   )r   rU   r¿   s   && r   r³   ÚServer.get_web_handlers*  so   € Ø�8�8ˆ8Ü*¨4¯8©8°VÓ<ˆHØœC×/Ñ/°*¸hÐ1GÐHÐIÐIà�t—x‘xØ˜Ÿ	™	×(Ð( SØ" D×$9Ñ$9ð"ð ð
ð 	
r   c                óÐ  aaa€ S;'       g    RoVe   W@n         V P                  4        \        P                  RS RS 24       W n        V P                  SSW%V	R7       V'       d   \        P                  R4       Se.   VVV3R lp\        P                  ! VR7      P                  4         V P                  P                  P                  R	V34       \        P                  ! 4        \        R
 4       \         P"                  ! 4       P                  4        \         P$                  ! 4       P'                  RR7       R#   \(         d    \        P                  R4        R# i ; i)a£  Start serve the server with the given port.

:param port: serve on this port, default is 5500
:param liveport: live reload on this port
:param host: serve on this hostname, default is 127.0.0.1
:param root: serve static on this root directory
:param debug: set debug mode, which autoreloads the app on code changes
              via Tornado (and causes polling). Defaults to True when
              ``self.app`` is set, otherwise False.
:param open_url_delay: open webbrowser after the delay seconds
:param live_css: whether to use live css or force reload on css.
                 Defaults to True
:param default_filename: launch this file from the selected root on startup
z	127.0.0.1NzServing on http://Ú:)r¸   r¯   r²   z*Use `open_url_delay` instead of `open_url`c                  ól   <€ \         P                  ! S4       \        P                  ! R S  RS 24       R# )zhttp://rÅ   N)ÚtimeÚsleepÚ
webbrowserr/   )r·   Úopen_url_delayr¶   s   €€€r   ÚopenerÚServer.serve.<locals>.openerW  s(   ø€ Ü—
’
˜>Ô*Ü—’ '¨$¨¨q°°Ð 7Ö8r   )ÚtargetÚ__livereload__c                  óH   € \         P                  ! 4       P                  4       # r   )r   ÚinstanceÚstopr    r   r   Ú<lambda>ÚServer.serve.<locals>.<lambda>`  s   € ¤F§O¢OÓ$5×$:Ñ$:Ô$<r   T)Úall_fdszShutting down...)r™   Ú_setup_loggingr)   ÚinforÁ   r¼   r*   Ú	threadingÚThreadÚstartr›   Ú_changesrq   r   Ústart_tasksr   r   rÐ   Úcurrentrx   ÚKeyboardInterrupt)r   r¶   r¸   r·   r™   r¯   Úopen_urlÚrestart_delayrÊ   r²   rÁ   rË   s   &f&f&&&&f&& r   ÚserveÚServer.serve5  s  ú€ ð" ×"Ð"�{ˆØÒØŒIà×ÑÔÜ�‰Ð(¨¨¨a°¨vÐ6Ô7à 0Ôà×ÑØ�$ Àð 	ô 	K÷ Ü�L‰LÐEÔFØÒ%÷9ô ×Ò FÔ+×1Ñ1Ô3ð
	,Ø�L‰L×!Ñ!×(Ñ(Ð*:¸MÐ)JÔKÜ×)Ò)Ô+äÑ<Ô=ä�OŠOÓ×#Ñ#Ô%ä�NŠNÓ×"Ñ"¨4Ð"Ö0øÜ ô 	,Ü�K‰KÐ*×+ð	,ús   Â/BE Å E%Å$E%c                ó  € \         P                  \        P                  4       \        P                  ! 4       pVP                  \        4       4       \         P                  V4       \        P                  ! R 4      P                  V4       R# )ÚtornadoN)	r)   ÚsetLevelÚloggingÚINFOÚStreamHandlerÚsetFormatterr
   Ú
addHandlerÚ	getLogger)r   Úchannels   & r   rÕ   ÚServer._setup_loggingh  sY   € Ü�‰œŸ™Ô%ä×'Ò'Ó)ˆØ×Ñœ\›^Ô,Ü×Ñ˜'Ô"ô 	×Ò˜)Ó$×/Ñ/°Ö8r   )rœ   rš   rÁ   r™   r›   )NN)NNN)NNT)
i|  NNNNFé   NTz
index.html)ra   rb   rc   rd   Ú__doc__rI   r    r¤   r¼   r³   rà   rÕ   re   rf   r–   s   @r   r{   r{   ­   s5   ø‡ € ñô%ò%ô$Aô<30òj	
ô1,÷f9ð 9r   r{   )é   é   )NÚwNF)-rî   r9   rÇ   rB   rå   r×   rÉ   Ú
subprocessr   r   Útornado.wsgir   Útornado.ioloopr   Útornado.autoreloadr   rã   r   r   r	   Útornado.logr
   r®   r   r   r   r   r›   r   Úsysr+   Úversion_infoÚplatformÚasyncioÚset_event_loop_policyÚWindowsSelectorEventLoopPolicyrê   r)   rS   r   r'   ÚOutputTransformrF   rj   r{   r    r   r   Ú<module>rþ      sÃ   ðñó 
Û Û Û Û Û ß "å &Ý !Ý .Ý Ý Ý Ý $ß <ß ;Ý &ã 
ã à×Ñ�vÔ #§,¡,°'Ô"9ÛØ×!Ò! '×"HÒ"HÓ"JÔKà	×	Ò	˜<Ó	(€à€òô.ôb+˜×,Ñ,ô +ô8(˜-ô 8(÷vC9ó C9r   