Ë
    ¹îEj8-  ã            
      ó€  — 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mZ  ee	«      j                  j                  «       Z ej                  e«       ej                  j                  d ee«      «       dZddlZddlmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZ  ej<                  «       Z ej@                  dd¬«      d3d„«       Z! G d„ de«      Z" ejF                  e"«       h d£Z$edz  Z%d4d„Z&d„ Z'e(dk(  �rGddl)Z)ddl*Z*ddl+Z+dejX                  › �Z- ej\                  e'dd¬«      j_                  «        d„ Z0 ej\                  e0dd¬«      j_                  «         e1d«        e1dejd                  › d�«        e1d«        e1d e-› �«        e1d!e-› d"�«        e1d#«        e1«         e1d$«        e1d%«        e1d&«        e1«         e1d'«        e1d(«        e1d)«        e1d*«        e1d+«        e1«         e1d,«        e1d-«        e+jf                  d.ejh                  ejX                  d ee«      gd/gg d0¢d1¬2«       yy)5u>  
run.py â€” People Hub Dev Server with Live Browser Reload
========================================================
Run this file during development instead of main.py.

    python run.py

What it does:
  âœ… Starts FastAPI with hot-reload on .py changes (uvicorn --reload)
  âœ… Watches static/ for .html / .css / .js changes
  âœ… Sends a Server-Sent Events (SSE) signal to every open browser tab
  âœ… Browser auto-refreshes â€” no manual F5 needed
  âœ… Injects a tiny <script> into every HTML page served (dev only)
  âœ… Single terminal, single command

Stop:  Ctrl+C
é    )ÚannotationsN)ÚPathuò  <script>
/* People Hub Live Reload â€” dev server only */
(function(){
  function connect() {
    var es = new EventSource('/livereload/ping');
    es.addEventListener('reload', function() {
      console.log('[livereload] change detected, reloading...');
      location.reload();
    });
    es.onerror = function() {
      es.close();
      setTimeout(connect, 1000);   // retry after server restart
    };
  }
  connect();
  console.log('[livereload] watching for file changes');
})();
</script>)ÚBaseHTTPMiddleware)ÚRequest)ÚStreamingResponseÚResponse)Úapp)Úsettingsz/livereload/pingF)Úinclude_in_schemac              ƒ  óB   ‡ K  — ˆ fd„}t         |«       ddddœ¬«      S ­w)u?   SSE stream â€” browsers subscribe here for live-reload signals.c                ó  •K  — d­–— d} 	 t        j                  d«      ƒ d {  –—†  ‰j                  «       ƒ d {  –—† ry t        j	                  «       rt        j                  «        d­–— | dz  } | dk\  rd} d­–— Œu7 Œ\7 ŒF­w)Nzdata: connected

r   g333333Ó?zevent: reload
data: 1

é   é2   z: keep-alive

)ÚasyncioÚsleepÚis_disconnectedÚ_reload_flagÚis_setÚclear)Úkeepalive_ticksÚrequests    €ú$/var/www/html/peoplehubportal/run.pyÚstreamzlivereload_ping.<locals>.streamQ   s…   øè ø€ Ø#Ó#ØˆØÜ—-‘- Ó$×$Ð$à×,Ñ,Ó.×.Ð.Øä×"Ñ"Ô$Ü×"Ñ"Ô$Ø2Ó2ð ˜qÑ ˆOØ "Ò$Ø"#�Ø(Ó(ð Ø$øà.ús    ƒ!B¤B¥B¼B½ABÂBztext/event-streamzno-cacheÚno)zCache-ControlzX-Accel-Buffering)Ú
media_typeÚheaders)r   )r   r   s   ` r   Úlivereload_pingr   M   s.   øè ø€ ô)ô& Ù‹Ø&à!+Ø!%ñ
ôð ùs   ƒc                  ó   — e Zd Zdd„Zy)Ú_LiveReloadMiddlewarec              ƒ  ó,  K  —  ||«      ƒ d {  –—† }|j                   j                  dd«      }d|vr|S d}|j                  2 3 d {  –—† }|t        |t        «      r|n|j                  «       z  }Œ/7 Œc7 Œ,6 |j                  dd¬«      }t        dz   }d	|v r|j                  d	|d
«      n|dz   t        z   }t        ||j                  d|j                   j                  «       D �	�
ci c]  \  }	}
|	j                  «       dvr|	|
“Œ nc c}
}	w c}
}	¬«      S ­w)Núcontent-typeÚ z	text/htmló    zutf-8Úreplace)Úerrorsz
</body>z</body>r   Ú
)zcontent-lengthr!   )ÚcontentÚstatus_coder   r   )r   ÚgetÚbody_iteratorÚ
isinstanceÚbytesÚencodeÚdecodeÚLIVERELOAD_SCRIPTr$   r   r(   ÚitemsÚlower)Úselfr   Ú	call_nextÚresponseÚctÚ
body_bytesÚchunkÚhtmlÚtagÚkÚvs              r   Údispatchz_LiveReloadMiddleware.dispatchs   s)  è ø€ Ù#,¨WÓ#5×5ˆð ×Ñ×!Ñ! .°"Ó5ˆØ˜bÑ ØˆOð ˆ
Ø#×1Ñ1÷ 	Pð 	P�%Ø¤:¨e´UÔ#;™%ÀÇÁÃÑO‰Jð 6øð	PøÐ1ð × Ñ  °Ð Ó;ˆô   +Ñ-ˆØ2;¸tÑ2Cˆt�|‰|˜I s¨AÔ.ÈÐPTÉÔWhÑIhˆäØØ ×,Ñ,Ø"à!)×!1Ñ!1×!7Ñ!7Ó!9÷Ù˜˜AØ—7‘7“9Ð$FÑFð �1‘ñùö ô	
ð 	
ùs@   ‚DŽA2�4DÁA6ÁA4ÁA6Á(DÁ4A6Á6A/DÃ%DÄDN©r   r   )Ú__name__Ú
__module__Ú__qualname__r<   © r#   r   r   r   r   s   „ ô
r#   r   >   ú.jsú.cssú.htmú.htmlÚstaticc                ó*  — i }| j                  «       s|S | j                  d«      D ][  }|j                  «       sŒ|j                  j	                  «       t
        v sŒ5	 |j                  «       j                  |t        |«      <   Œ] |S # t        $ r Y Œkw xY w)NÚ*)
ÚexistsÚrglobÚis_fileÚsuffixr1   Ú_WATCH_EXTSÚstatÚst_mtimeÚstrÚOSError)Ú	directoryÚresultÚfs      r   Ú_collect_mtimesrU   ž   s„   € Ø!€FØ×ÑÔØˆØ�_‰_˜SÓ!ò ˆØ�9‰9�;˜1Ÿ8™8Ÿ>™>Ó+¬{Ò:ðØ!"§¡£×!2Ñ!2�”s˜1“v’ðð €Møô ò Ùðús   Á&BÂ	BÂBc                 ó   — t        t        «      } 	 t        j                  d«       t        t        «      }t	        |«      t	        | «      z
  }t	        | «      t	        |«      z
  }|D �ch c]  }|| v sŒ||   | |   k7  sŒ|’Œ }}||z  |z  }|r;dj                  d„ |D «       «      }t        d|› d�«       t        j	                  «        |} Œºc c}w )Ngš™™™™™Ù?z, c              3  óF   K  — | ]  }t        |«      j                  –— Œ y ­w)N)r   Úname)Ú.0Úps     r   ú	<genexpr>z"_watcher_thread.<locals>.<genexpr>·   s   è ø€ Ò<¨qœd 1›gŸl�lÑ<ùs   ‚!u   
[livereload] ðŸ”„  u$     changed â€” refreshing browser...
)rU   Ú
_WATCH_DIRÚtimer   ÚsetÚjoinÚprintr   )ÚprevÚcurrÚaddedÚremovedr:   ÚmodifiedÚchangedÚnamess           r   Ú_watcher_threadrh   «   sÄ   € Üœ:Ó&€DØ
Ü�
‰
�3ŒÜœzÓ*ˆä�t“9œs 4›yÑ(ˆÜ�t“9œs 4›yÑ(ˆØ#ÖH˜! q¨D¢y°T¸!±WÀÀQÁÓ5G’AÐHˆÐHØ˜7‘? XÑ-ˆáØ—I‘IÑ<°GÔ<Ó<ˆEÜÐ)¨%¨Ð0UÐVÔWÜ×ÑÔàˆð ùò Is   Á'	CÁ1CÁ=CÚ__main__zhttp://localhost:Tzstatic-watcher)ÚtargetÚdaemonrX   c                 ó®  — t        j                   «       dz   } t        j                   «       | k  rGt        j                  d«       	 t        j                  dt        j
                  fd¬«      5  	 ddd«       t        j                  t        «       t        dt        › �«       y# 1 sw Y   nxY wn# t        $ r Y Œ¢w xY wt        j                   «       | k  rŒ§Œa)zæ
        Poll localhost until the server accepts TCP connections, then open
        the default browser. Tries for up to 15 seconds before giving up.
        Runs as a daemon thread so it never blocks uvicorn starting up.
        é   g      Ð?Ú	localhostg      à?)ÚtimeoutNu   [browser] âœ…  Opened )r]   r   ÚsocketÚcreate_connectionr
   ÚAPP_PORTrQ   Ú
webbrowserÚopenÚURLr`   )Údeadlines    r   Ú_open_browserrw   Ï   s­   € ô —9‘9“; Ñ#ˆÜ�i‰i‹k˜HÒ$Ü�J‰J�tÔðÜ×-Ñ-¨{¼H×<MÑ<MÐ.NÐX[Ô\ñ Ø÷ô
 	�‰œÔÜÐ&¤s eÐ,Õ-÷ð úð øäò Ùðúô �i‰i‹k˜HÓ$øs*   Á'B/ Á,B"Á.B/ Â"B+Â'B/ Â/	B;Â:B;zbrowser-openeruÁ   
â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�z  u     Â·  DEV SERVERuÀ   â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�u     ðŸŒ�  URL      â†’  u     ðŸ“–  Docs     â†’  z/docsu8     ðŸš€  Browser opens automatically when server is readyz  Live reloadu5       .py files      â†’  server restarts automaticallyu7       .html .css .js â†’  browser refreshes automaticallyz:  Test credentials  (edit data/users.json to change stage)u&       DEMO0001  â†’  Stage 1  Assessmentu%       DEMO0002  â†’  Stage 2  Role Playu"       DEMO0003  â†’  Stage 3  Codingu%       DEMO0004  â†’  Stage 4  Technicalz  Stop:  Ctrl+CuÁ   â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�â•�
zrun:appz*.py)zstatic/*zdata/*z*.htmlz*.cssz*.jsz*.jsonÚinfo)ÚhostÚportÚreloadÚreload_dirsÚreload_includesÚreload_excludesÚ	log_levelr=   )rR   r   Úreturnzdict[str, float])5Ú__doc__Ú
__future__r   ÚosÚsysÚ	threadingr]   Úpathlibr   Ú__file__ÚparentÚresolveÚROOTÚchdirÚpathÚinsertrP   r/   r   Ústarlette.middleware.baser   Ústarlette.requestsr   Ústarlette.responsesr   r   Úmainr	   Úconfigr
   ÚEventr   r)   r   r   Úadd_middlewarerM   r\   rU   rh   r>   rp   rs   Úuvicornrr   ru   ÚThreadÚstartrw   r`   ÚAPP_NAMEÚrunÚAPP_HOSTrA   r#   r   ú<module>r›      sU  ðñõ" #ã 	Û 
Û Û Ý ñ ˆHƒ~×Ñ×$Ñ$Ó&€Ø €‡�ˆ„Ø ‡�‡��‘3�t“9Ô ðÐ ó. Ý 8Ý &ß ;å Ý ð ˆy�‰Ó €ð 	€‡�Ð	¨uÔ5òó 6ðôH
Ð.ô 
ð> €× Ñ Ð(Ô )ò /€Ø�X‰o€
ó
òð. ˆzÓÛÛÛà˜h×/Ñ/Ð0Ð
1€Cð €I×ÑØ tÐ2Bôç�e„gò.ð$ €I×Ñ˜M°$Ð=MÔN×TÑTÔVñ 
Ð
ÔÙ	ˆBˆx× Ñ Ð!Ð!1Ð
2Ô3Ù	ˆ*ÔÙ	Ð" 3 %Ð
(Ô)Ù	Ð" 3 % uÐ
-Ô.Ù	ÐDÔFÙ	„GÙ	ˆ/ÔÙ	Ð
AÔBÙ	Ð
CÔDÙ	„GÙ	Ð
FÔGÙ	Ð
2Ô3Ù	Ð
1Ô2Ù	Ð
.Ô/Ù	Ð
1Ô2Ù	„GÙ	Ð
ÔÙ	Ð
Ôð €G‡K�KØØ×ÑØ×ÑØÙ˜“Y�KØ˜ò
ð
 öðo r#   