Ë
    mô¶j{6  ã                   óL  — d 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m	Z	 ddl
mZ ej                  j                  ej                  j                  e«      «      Zej                  j#                  ed«      Zej                  j#                  ed«      ZdZdZd	Zd
ZdZ ej2                  d«      Z ej2                  d«      Z ej2                  d«      Zh d£h d£h d£h d£ddhddhh d£ddhdhh d£h d£h d£h d£h d£dœZeD � ch c]  } | j=                  d «      sŒ| ’Œ c} d!hz  ZeD � ch c]  } | j=                  d «      rŒ| ’Œ c} Z h d"£Z!h d#£Z"h d$£Z#h d%£Z$ ejJ                  «       Z&d2d&„Z'd2d'„Z(d(„ Z)d)„ Z*d*„ Z+d+„ Z,d3d,„Z-d-„ Z.d.„ Z/d/„ Z0d0„ Z1e2d1k(  r e1«        yyc c} w c c} w )4a   X|COOL telemetry receiver: tasks (tarefa.*) and minigames (jogo.*).

One code for both places:
  - imported by servidor.py (the local mocks), mounted at /telemetria and /_llm;
  - run standalone on the VPS behind nginx (DEPLOY-TELEMETRIA.md):
      python3 telemetria_receptor.py --dados /var/lib/xcool-telemetria --porta 8790 --prefixo /midia/telemetria

Routes, relative to a prefix P:
  POST P  (or P/)                 batch {eventos:[...]} (or a bare list) -> validated, appended to jsonl
  GET  P/telemetria.js            the page component
  GET  P/painel/  P/painel/<f>    the reading panel
  GET  P/dados/lista              {tarefas:[...], jogos:[...]}
  GET  P/dados/eventos?tarefa=<t> | ?jogo=<j>   the raw jsonl
Files: <dados>/<tarefa>.jsonl and <dados>/jogos/<jogo>.jsonl.
Standard library only. Nothing personal is stored: no IP, no name (CDC-001); the access log has no address.
A minigame measures no skill and grants no tokens (ADR-XC-028 item 6, ADR-XC-072 item 1): any evidence,
weight, token or skill key inside a game event is refused.
é    N)ÚBaseHTTPRequestHandlerÚThreadingHTTPServer)Úparse_qsÚpainelztelemetria.jsi   éè  i €  iX  i  €z^[a-z0-9_-]{1,64}$z^[A-Za-z0-9_-]{4,64}$z^[a-z0-9_-]+\.(html|js)$>   ÚnivelÚpaginaÚ
parametrosÚhabilidades>   ÚacaoÚcorretaÚdetalhe>   ÚfonteÚpontoÚtextoÚlatencia_ms>   Úcustor   r   Úerror   ÚvisivelÚmedidas>   ÚtokensÚweightr   ÚoutcomeÚ	evidenciaÚmotivoÚ
quantidade>   ÚfaseÚestilor	   r
   >   r   Úde_msÚtotalÚate_msÚ	contagensÚpico_por_segundo>   ÚdeÚparaÚpontos>   r   r   r&   r   Ú	colocacaoÚparticipantes>   r   r   r&   r   )ztarefa.inicioztarefa.acaoútarefa.falaztarefa.pistaztarefa.erroútarefa.focoútarefa.conclusaoztarefa.abandonozeconomia.concessaoújogo.inicioz	jogo.acaoz	jogo.faseújogo.fimzjogo.abandonozjogo.r*   >   ÚfailÚpassÚpartial>   ÚsaiuÚganhouÚperdeuÚterminou>   ÚlivreÚcorridaÚdesafio>   r   r   r   r   r   Ú
skill_codeÚskill_evidencec                 óB  ‡— ‰dkD  ryt        | t        «      rt        | «      t        k  S t        | t        «      r"t        ˆfd„| j                  «       D «       «      S t        | t        «      rt        ˆfd„| D «       «      S | d u xs t        | t        t        t        f«      S )Né   Fc              3   ó†   •K  — | ]8  \  }}t        |t        «      xr t        |«      d k  xr t        |‰dz   «      –— Œ: y­w)é@   é   N)Ú
isinstanceÚstrÚlenÚ_strings_ok)Ú.0ÚkÚvÚdepths      €ú3/srv/xcool-tarefas/llm-local/telemetria_receptor.pyú	<genexpr>z_strings_ok.<locals>.<genexpr>M   s@   øè ø€ ÒoÑY]ÐYZÐ\]”:˜a¤Ó%ÒT¬#¨a«&°B©,ÒT¼;ÀqÈ%ÐRSÉ)Ó;TÓTÑoùs   ƒ>Ac              3   ó<   •K  — | ]  }t        |‰d z   «      –— Œ y­w)r>   N)rB   )rC   rE   rF   s     €rG   rH   z_strings_ok.<locals>.<genexpr>O   s   øè ø€ Ò<°”;˜q %¨!¡)×,Ñ<ùs   ƒ)r?   r@   rA   ÚMAX_STRÚdictÚallÚitemsÚlistÚboolÚintÚfloat)ÚvaluerF   s    `rG   rB   rB   G   sƒ   ø€ Øˆq‚yØÜ�%œÔÜ�5‹zœWÑ$Ð$Ü�%œÔÜÓoÐaf×alÑalÓanÔoÓoÐoÜ�%œÔÜÓ<°eÔ<Ó<Ð<Ø�Dˆ=ÒAœJ u¬t´S¼%Ð.@ÓAÐAó    c                 ó&  — |dkD  r
t        «       S t        | t        «      r4t        | «      }| j                  «       D ]  }|t	        ||dz   «      z  }Œ |S t        | t
        «      r%t        «       }| D ]  }|t	        ||dz   «      z  }Œ |S t        «       S )Nr;   r>   )Úsetr?   rK   ÚvaluesÚ
_keys_deeprN   )rR   rF   ÚoutrE   s       rG   rW   rW   S   s“   € Øˆq‚yÜ‹uˆÜ�%œÔÜ�%‹jˆØ—‘“ò 	,ˆAØ”:˜a ¨¡Ó+Ñ+‰Cð	,àˆ
Ü�%œÔÜ‹eˆØò 	,ˆAØ”:˜a ¨¡Ó+Ñ+‰Cð	,àˆ
Ü‹5€LrS   c                 ó¨  — t        | t        «      sy| j                  d«      }|t        vryd| v d| v }}||k(  ry|rdnd}||dk(  rt        nt
        vr
d|› d|› d	�fS | |   }t        |t        «      rt        j                  |«      sd|› d
�fS dD ]B  }t        | j                  |«      t        «      rt        j                  | |   «      rŒ;d|› d�fc S  | j                  d«      }t        |t        «      s#t        |t        t        f«      rd|cxk  rdk  sy y| j                  dd«      }t        |t        «      st        |t        t        f«      r|dk  ry| j                  di «      }	t        |	t        «      sy|dk(  r3t        |	«      t        z  }
|
rdddj                  t!        |
«      «      z   fS t#        |	«      t        |   z
  }|r&dddj                  t!        d„ |D «       «      «      z   fS t%        t'        j(                  |	d¬«      «      t*        kD  st-        |	«      sy|dk(  r|	j                  d«      t.        vry|d k(  r‘|	j                  d!«      t0        vry"|	j                  d#«      |	j                  d$«      }}|�&t        |t        «      st        |t        «      r|d%k  ry&|�-t        |t        «      st        |t        «      r|d%k  s|�||k  ry'|d(k(  r|	j                  d)«      �|	d)   t2        vry*|d+k(  r|	j                  d,«      d-vry.d/d%d|dt        |«      dt        |«      d0| d0   d1| d1   ||d|	d2t5        j6                  d3«      i	}|dfS )4z-Returns (clean_event, None) or (None, error).)Nzevent is not an objectÚtipo)Nztipo not in catalogÚtarefaÚjogo)Nz"send exactly one of tarefa or jogoNz
 is not a z eventz must match ^[a-z0-9_-]{1,64}$)ÚsessaoÚencontroz must be an anonymous idÚtsg  €yïÓuBg   ¢”�B)Nzts must be ms since epochÚt_msr   )Nz"t_ms must be a non-negative numberÚcarga)Nzcarga must be an objectzXminigame measures no skill and grants no tokens (ADR-XC-028 item 6, ADR-XC-072 item 1): ú,zcarga key not declared: c              3   ó&   K  — | ]	  }|d d –— Œ y ­w)Né    © )rC   rD   s     rG   rH   z!validate_event.<locals>.<genexpr>†   s   è ø€ ÒAXÈQÀ!ÀCÀRÄ&ÑAXùs   ‚F©Úensure_ascii)Nzcarga too larger+   r   )Nz!outcome must be pass|partial|failr-   r   )Nz*motivo must be ganhou|perdeu|saiu|terminour'   r(   r>   )Nz!colocacao must be an integer >= 1)Nz-participantes must be an integer >= colocacaor,   r   )Nz$estilo must be desafio|corrida|livrer)   r   )ÚllmÚroteiro)Nzfonte must be llm|roteirorE   r]   r^   Úrecebidoz%Y-%m-%dT%H:%M:%S%z)r?   rK   ÚgetÚCATALOGÚ
GAME_TYPESÚ
TASK_TYPESr@   ÚKEY_REÚmatchÚID_RErO   rP   rQ   rW   ÚGAME_FORBIDDENÚjoinÚsortedrU   rA   ÚjsonÚdumpsÚ	MAX_CARGArB   ÚOUTCOMESÚ	GAME_ENDSÚGAME_STYLESÚtimeÚstrftime)ÚevrZ   Úhas_taskÚhas_gameÚmodeÚkeyrD   r_   r`   ra   ÚbadÚextraÚposr    Úcleans                  rG   Úvalidate_eventr†   c   sN  € ä�bœ$ÔØ-Ø�6‰6�&‹>€DØ”7ÑØ*Ø! R˜¨°2¨ˆh€HØ�8ÒØ9Ù‰6 8€DØ $¨&¢.•J´jÑAØ˜�v˜Z¨ v¨VÐ4Ð4Ð4Ø
ˆT‰(€CÜ�cœ3Ô¤v§|¡|°CÔ'8Ø˜�vÐ=Ð>Ð>Ð>Ø#ò 8ˆÜ˜"Ÿ&™& ›)¤SÔ)´·±¸RÀ¹UÕ1CØ˜A˜3Ð6Ð7Ð7Ò7ð8ð 
�‰�‹€BÜ�"”dÔ¤:¨b´3¼°,Ô#?ÀvÐPRÔGYÐUYÒGYØ0ð HZØ0Ø�6‰6�&˜!Ó€DÜ�$œÔ¤Z°´s¼E°lÔ%CÀtÈaÂxØ9Ø�F‰F�7˜BÓ€EÜ�eœTÔ"Ø.Øˆv‚~Ü˜Ó¤.Ñ0ˆÙØÐtØŸH™H¤V¨C£[Ó1ñ2ð 3ð 3ä�‹Jœ ™Ñ&€EÙØÐ/°#·(±(¼6ÑAXÐRWÔAXÓ;XÓ2YÑYÐYÐYÜ
Œ4�:‰:�e¨%Ô0Ó1´IÒ=Ä[ÐQVÔEWØ&ØÐ!Ò! e§i¡i°	Ó&:Ä(Ñ&JØ8ØˆzÒØ�9‰9�XÓ¤iÑ/ØEØ—Y‘Y˜{Ó+¨U¯Y©Y°Ó-GˆUˆØˆ?¤
¨3´Ô 5¼ZÈÌSÔ=QÐUXÐ[\ÒU\Ø<ØÐ¤*¨U´DÔ"9ÄÈEÔSVÔAWÐ[`ÐcdÒ[dØ&) o¸%À#º+ØHØˆ}Ò §¡¨8Ó!4Ð!@ÀUÈ8Á_Ô\gÑEgØ;Øˆ}Ò §¡¨7Ó!3Ð;MÑ!MØ0Ø�!�V˜T 4¬¨R«°&¼#¸d»)ÀXÈrÐRZÉ|Ø˜˜J™¨¨s°G¸UØœŸ™Ð'<Ó=ð?€Eð �$ˆ;ÐrS   c                 óš   — |dk(  r$t         j                  j                  | d|dz   «      S t         j                  j                  | |dz   «      S )Nr\   Újogosú.jsonl)ÚosÚpathrs   )Údata_dirr€   r�   s      rG   Ú_pathr�   ž   sD   € Ø>BÀfºnŒ2�7‰7�<‰<˜ '¨3°©>Ó:ÐxÔRT×RYÑRY×R^ÑR^Ð_gÐilÐowÑiwÓRxÐxrS   c           
      ó0  ‡‡— t        | t        «      r| j                  d«      n| }t        |t        «      r|sddddœfS t	        |«      t
        kD  rdddt
        › d�dœfS i g }}t        |«      D ]X  \  }}t        |«      \  }}|€|j                  ||d	œ«       Œ+d
|v rd
ndŠ|j                  ‰|‰   fg «      j                  |«       ŒZ d}	t        5  |j                  «       D �]  \  \  ŠŠ}
t        |‰‰«      }t        j                  t        j                  j!                  |«      d¬«       t        j                  j#                  |«      rBt        j                  j%                  |«      t&        kD  r|j)                  ˆˆfd„|
D «       «       Œ¬t+        |dd¬«      5 }|
D ]+  }|j-                  t/        j0                  |d¬«      dz   «       Œ- 	 ddd«       |	t	        |
«      z  }	�Œ 	 ddd«       |	rdnd|	dkD  |	|dœfS # 1 sw Y   Œ2xY w# 1 sw Y   Œ$xY w)zReturns (status, payload).Úeventosé�  Fz,send {eventos:[...]} with at least one event©Úokr   zat most z events per batchN©Úir   r\   r[   r   T©Úexist_okc              3   ó4   •K  — | ]  }d ‰› d‰› d�dœ–— Œ y­w)éÿÿÿÿú z: file fullr“   Nre   )rC   Ú_r�   r€   s     €€rG   rH   zingest.<locals>.<genexpr>·   s$   øè ø€ Ò[ÐQR R°D°6¸¸3¸%¸{Ð1KÕLÑ[ùs   ƒÚaúutf-8)Úencodingrf   ú
éÈ   )r’   ÚgravadosÚ	recusados)r?   rK   rk   rN   rA   Ú
MAX_EVENTSÚ	enumerater†   ÚappendÚ
setdefaultÚ_lockrM   r�   rŠ   Úmakedirsr‹   ÚdirnameÚexistsÚgetsizeÚMAX_FILEÚextendÚopenÚwriteru   rv   )ÚbodyrŒ   ÚeventsÚgroupsÚrefusedr”   r}   r…   ÚerrÚsavedÚrowsr‹   ÚfÚrr�   r€   s                 @@rG   Úingestr¸   ¢   sø  ù€ ä$.¨t´TÔ$:ˆT�X‰X�iÔ À€FÜ�fœdÔ#©6Ø˜5Ð*XÑYÐYÐYÜ
ˆ6ƒ{”ZÒØ˜5¨H´Z°LÐ@QÐ*RÑSÐSÐSØ˜"ˆG€FÜ˜6Ó"ò E‰ˆˆ2Ü# BÓ'‰
ˆˆsØˆ=Ø�N‰N ¨CÑ0Õ1à# u™_‘6°(ˆDØ×Ñ˜t U¨4¡[Ð1°2Ó6×=Ñ=¸eÕDðEð €EÜ	ñ 
Ø!'§¡£ó 		Ñ‰KˆT�3˜Ü˜ 4¨Ó-ˆDÜ�K‰KœŸ™Ÿ™¨Ó-¸Õ=Ü�w‰w�~‰~˜dÔ#¬¯©¯©¸Ó(=ÄÒ(HØ—‘Ô[ÐVZÔ[Ô[ØÜ�d˜C¨'Ô2ð F°aØò F�AØ—G‘GœDŸJ™J q°uÔ=ÀÑDÕEñF÷Fð ”S˜“YÑŠEñ		÷
ñ ‰C˜c¨5°1©9À%ÐV]Ñ$^Ð^Ð^÷	Fð Fú÷
ð 
ús%   ÃCHÆ1H ÇHÈ H	ÈHÈHc                 óð   — d„ } || «      D �cg c]  }t        ||d   ¬«      ‘Œ }} |t        j                  j                  | d«      «      D �cg c]  }t        ||d   ¬«      ‘Œ }}d||dœS c c}w c c}w )Nc           	      óº  — g }t         j                  j                  | «      r¹t        t        j                  | «      «      D ]˜  }|j                  d«      sŒt        j                  |d d «      sŒ.t        j                  t         j                  j                  | |«      «      }|j                  |d d |j                  t        |j                  dz  «      dœ«       Œš |S )Nr‰   iúÿÿÿr   )ÚnomeÚbytesÚalterado)rŠ   r‹   Úisdirrt   ÚlistdirÚendswithro   rp   Ústatrs   r¤   Úst_sizerP   Úst_mtime)ÚdrX   ÚnÚsts       rG   Úscanzlisting.<locals>.scanÁ   s¦   € ØˆÜ�7‰7�=‰=˜ÔÜœBŸJ™J q›MÓ*ò k�Ø—:‘:˜hÕ'¬F¯L©L¸¸3¸B¸Õ,@ÜŸ™¤§¡§¡¨a°Ó!3Ó4�BØ—J‘J¨¨#¨2¨¸¿¹ÔQTÐUW×U`ÑU`ÐcgÑUgÓQhÑiÕjðkð ˆ
rS   r»   )r[   rˆ   )r\   T)r’   Útarefasrˆ   )rK   rŠ   r‹   rs   )rŒ   rÇ   ÚxrÈ   rˆ   s        rG   ÚlistingrÊ   À   ss   € òñ 37°x³.ÖA¨QŒt�A˜a ™iÖ(ÐA€GÐAÙ.2´2·7±7·<±<ÀÈ'Ó3RÓ.SÖT¨ŒT�!˜!˜F™)Ö$ÐT€EÐTØ 7°UÑ;Ð;ùò BùÚTs   ŽA.ÁA3c                 óh  — | j                  |«       | j                  d|«       | j                  dt        t        |«      «      «       | j                  dd«       |xs i j	                  «       D ]  \  }}| j                  ||«       Œ | j                  «        | j                  j                  |«       y )NzContent-TypeúContent-LengthzCache-Controlzno-store)Úsend_responseÚsend_headerr@   rA   rM   Úend_headersÚwfiler®   )ÚhÚstatusÚdataÚctyperƒ   rD   rE   s          rG   Ú_sendrÕ   Ï   sˆ   € Ø‡O�O�FÔØ‡M�M�. %Ô(Ø‡M�MÐ"¤C¬¨D«	£NÔ3Ø‡M�M�/ :Ô.Ø’˜"×#Ñ#Ó%ò ‰ˆˆ1Ø	�‰�a˜Õðà‡M�M„OØ‡G�G‡M�M�$ÕrS   c                 óh   — t        | |t        j                  |d¬«      j                  d«      d«       y )NFrf   rœ   zapplication/json; charset=utf-8)rÕ   ru   rv   Úencode)rÑ   rÒ   Úpayloads      rG   Ú_jsonrÙ   Ú   s'   € Ü	ˆ!ˆV”T—Z‘Z °eÔ<×CÑCÀGÓLÐNoÕprS   c                 ó~   — t        |d«      5 }t        | d|j                  «       |«       d d d «       y # 1 sw Y   y xY w)NÚrbrŸ   )r­   rÕ   Úread)rÑ   r‹   rÔ   r¶   s       rG   Ú_filerÝ   Þ   s7   € Ü	ˆd�DÓ	ð '˜QÜˆa��a—f‘f“h Ô&÷'÷ 'ñ 'ús   �3³<c           	      ó  — | j                   j                  d«      \  }}}||k7  r|j                  |dz   «      sy|t        |«      d }|dk(  rÌ|dvrt	        | dddd	œ«       y
t        | j                  j                  d«      xs d«      }|dk  s	|t        kD  r,|t        kD  rd
| _	        t	        | |t        kD  rdndddd	œ«       y
	 t        j                  | j                  j                  |«      j                  d«      «      }	t	        | gt!        |	|«      ¢­Ž  y
|dk(  rt#        | t$        d«       y
|dk(  rt'        | dddd|dz   i«       y
|j                  d«      r¾|t        d«      d xs d}
t(        j+                  |
«      rAt,        j                   j/                  t,        j                   j1                  t2        |
«      «      st	        | dddd	œ«       y
|
j5                  d«      rdnd}t#        | t,        j                   j1                  t2        |
«      |«       y
|dk(  rt	        | dt7        |«      «       y
|dk(  r�t9        |«      }d |v rd nd!}|j                  |«      xs d"gd   }t;        |||«      }t<        j+                  |«      rt,        j                   j/                  |«      st	        | ddd#|› �d	œ«       y
t#        | |d$«       y
|dv rt	        | d%dd&|z   dz   d	œ«       y
y# t        $ r t	        | dddd	œ«       Y y
w xY w)'z\Handles the request on handler `h` if its path is under `prefix`. Returns True when handled.ú?ú/FNÚPOST)Ú rà   é”  ú	not foundr‘   TrÌ   r   i�  r�   zempty or too large bodyrœ   zbody must be JSONz/telemetria.jsztext/javascript; charset=utf-8z/paineli-  rS   z
text/plainÚLocationz/painel/z
index.htmlz.htmlztext/html; charset=utf-8z/dados/listarŸ   z/dados/eventosr\   r[   râ   zunknown z#application/x-ndjson; charset=utf-8i•  zPOST events here; panel at )r‹   Ú	partitionÚ
startswithrA   rÙ   rP   Úheadersrk   ÚMAX_BODYÚclose_connectionru   ÚloadsÚrfilerÜ   ÚdecodeÚ
ValueErrorr¸   rÝ   Ú	COMPONENTrÕ   ÚPANEL_FILE_RErp   rŠ   Úisfilers   Ú	PANEL_DIRrÀ   rÊ   r   r�   ro   )rÑ   ÚmethodÚprefixrŒ   Úrouterš   ÚqueryÚrestÚlengthr¯   ÚnamerÔ   Úqr€   r�   r‹   s                   rG   Úserverû   ã   sÕ  € à—f‘f×&Ñ& sÓ+�O€Eˆ1ˆeØ�‚˜u×/Ñ/°¸±Ô=ØØ”�V“�Ð€DØ�ÒØ�yÑ Ü�!�S °Ñ<Ô=ØÜ�Q—Y‘Y—]‘]Ð#3Ó4Ò9¸Ó:ˆØ�QŠ;˜&¤8Ò+ØœÒ Ø%)�Ô"Ü�!˜F¤XÒ-‘S°3¸uÐNgÑ8hÔiØð	Ü—:‘:˜aŸg™gŸl™l¨6Ó2×9Ñ9¸'ÓBÓCˆDô 	ˆaÐ)”&˜˜xÓ(Ó)ØØÐÒÜˆa”Ð<Ô=ØØˆyÒÜˆa��c˜<¨*°f¸zÑ6IÐ)JÔKØØ‡��zÔ"Ø”C˜
“OÐ$Ð%Ò5¨ˆÜ×"Ñ" 4Ô(´·±·±¼r¿w¹w¿|¹|ÌIÐW[Ó?\Ô0]Ü�!�S °Ñ<Ô=ØØ.2¯m©m¸GÔ.DÑ*ÐJjˆÜˆa”—‘—‘œi¨Ó.°Ô6ØØˆ~ÒÜˆa�”g˜hÓ'Ô(ØØÐÒÜ�U‹OˆØ 1™‰v¨(ˆØ�u‰u�T‹{Ò"˜r˜d AÑ&ˆÜ�X˜t SÓ)ˆÜ�|‰|˜CÔ ¬¯©¯©°tÔ(<Ü�!�S °(¸4¸&Ð0AÑBÔCØÜˆa�Ð<Ô=ØØˆyÑÜˆa�˜UÐ,IÈFÑ,RÐU_Ñ,_Ñ`ÔaØØøôG ò 	Ü�!�S Ð0CÑDÔEÙð	ús   Ã=K% Ë%LÌ Lc            
      óJ  ‡‡— t        j                  d¬«      } | j                  ddd¬«       | j                  dt        d¬«       | j                  d	d
d¬«       | j	                  «       }t
        j                  j                  |j                  «      Šd|j                  j                  d«      z   Št        j                  ‰d¬«        G ˆˆfd„dt        «      }t        d|j                  f|«      }t        d‰› d|j                  › ‰› d‰› d�d¬«       |j!                  «        y )Nz/X|COOL telemetry receiver (tasks and minigames))Údescriptionz--dadosTzdirectory for the jsonl files)ÚrequiredÚhelpz--porta)Útyperþ   z	--prefixoz/midia/telemetriaz)URL prefix nginx passes through unchanged)Údefaultrÿ   rà   r•   c                   ó0   •— e Zd ZdZd„ Zˆ ˆfd„Zˆ ˆfd„Zy)úmain.<locals>.Handlerzxcool-telemetriac                 óP   — t        t        j                  d«      ||z  z   d¬«       y )Nz%Y-%m-%dT%H:%M:%S T©Úflush)Úprintr{   r|   )ÚselfÚfmtr›   s      rG   Úlog_messagez!main.<locals>.Handler.log_message(  s   € Ü”$—-‘-Ð 4Ó5¸¸q¹ÑAÈÖNrS   c                 óD   •— t        | d‰‰«      st        | ddddœ«       y y )Nrá   rã   Frä   r‘   ©rû   rÙ   ©r  rŒ   rô   s    €€rG   Údo_POSTzmain.<locals>.Handler.do_POST+  s'   ø€ Ü˜˜v v¨xÔ8Ü�d˜C¨°{Ñ!CÕDð 9rS   c                 óD   •— t        | d‰‰«      st        | ddddœ«       y y )NÚGETrã   Frä   r‘   r  r  s    €€rG   Údo_GETzmain.<locals>.Handler.do_GET/  s'   ø€ Ü˜˜u f¨hÔ7Ü�d˜C¨°{Ñ!CÕDð 8rS   N)Ú__name__Ú
__module__Ú__qualname__Úserver_versionr
  r  r  )rŒ   rô   s   €€rG   ÚHandlerr  %  s   ø„ Ø+ˆò	Oõ	Eö	ErS   r  z	127.0.0.1ztelemetria: z on http://127.0.0.1:z (panel z	/painel/)r  )ÚargparseÚArgumentParserÚadd_argumentrP   Ú
parse_argsrŠ   r‹   ÚabspathÚdadosÚprefixoÚstripr§   r   r   Úportar  Úserve_forever)ÚapÚargsr  ÚserverrŒ   rô   s       @@rG   Úmainr$    só   ù€ Ü	×	 Ñ	 Ð-^Ô	_€BØ‡O�O�I¨Ð3R€OÔSØ‡O�O�I¤C°$€OÔ7Ø‡O�O�KÐ)<ÐCn€OÔoØ�=‰=‹?€DÜ�w‰w�‰˜tŸz™zÓ*€HØ�4—<‘<×%Ñ% cÓ*Ñ*€FÜ‡K�K� 4Õ(÷EÔ(ô Eô ! +¨t¯z©zÐ!:¸GÓD€FÜ	ˆL˜˜
Ð"7¸¿
¹
°|ÀFÀ8È8ÐTZÐS[Ð[dÐ
eÐmqÕrØ
×ÑÕrS   Ú__main__)r   )N)3Ú__doc__r  ru   rŠ   ÚreÚ	threadingr{   Úhttp.serverr   r   Úurllib.parser   r‹   r¨   r  Ú__file__ÚHERErs   rò   rï   ré   r¢   rw   rJ   r«   Úcompilero   rq   rð   rl   rç   rm   rn   rx   ry   rz   rr   ÚLockr¦   rB   rW   r†   r�   r¸   rÊ   rÕ   rÙ   rÝ   rû   r$  r  )Úts   0rG   ú<module>r0     s·  ðñó$ Û Û 	Û 	Û Û ß CÝ !à	‡w�w‡��r—w‘w—‘ xÓ0Ó1€Ø�G‰G�L‰L˜˜xÓ(€	Ø�G‰G�L‰L˜˜Ó/€	à€Ø€
Ø€	Ø
€Ø€Ø	ˆ�‰Ð)Ó	*€Øˆ�
‰
Ð+Ó,€Ø�—
‘
Ð6Ó7€ò
 FÚ1Ú=Ú/Ø˜IÐ&Ø˜yÐ)ÚOØ  )Ð,Ø'˜.Ú=ÚVÚ)ÚUÚ<ñ€ð  !Ö:�A A§L¡L°Õ$9ŠaÒ:¸m¸_ÑL€
Ø Ö>�A¨¯©°WÕ(=ŠaÒ>€
Ú&€Ú4€	Ú-€âk€àˆ	�‰Ó€ó	Bóò 8òvyò_ò<<óòqò'ò
5òpð: ˆzÒÙ…Fð ùòy ;ùÚ>s   ÄFÄFÄ+F!ÅF!