Ë
    M�‡j`q  ã            	       ó¤  — U d Z ddlZddlZddlZddlZddlmZmZmZ ddlm	Z	 ddl
mZ ddlZddlmZmZmZmZ  ee«      ZdZdZd	e› �Ze› d
e› d�Z	  e	d«      j1                  «       j3                  «       Z ed«      Zi Zeed<   dZ dZ!de"fd„Z#de"fd„Z$de"fd„Z%de&de&defd„Z'de(fd„Z)de(fd„Z*defd„Z+de"de,e"e"f   dz  fd„Z-de"dedz  fd„Z.defd „Z/dJd!e"d"ed#e(defd$„Z0de,e"e"f   fd%„Z1d&e"d'e"defd(„Z2d&e"d'e"de3e   fd)„Z4d&e"d'e"de3e   fd*„Z5d&e"d'e"de3e   fd+„Z6defd,„Z7d-edefd.„Z8d/e"de"fd0„Z9d-edefd1„Z:dKd2e&d3e(fd4„Z;ejx                  d5„ «       Z=ej}                  d
«      d6„ «       Z?ej}                  d7«      d8„ «       Z@ej}                  d9«      d:„ «       ZAej}                  d;«      d<„ «       ZBej}                  d=«      d>„ «       ZCej}                  d?«      d@„ «       ZDej}                  dA«      dB„ «       ZEdC„ ZF eF«        edDk(  r7 e(ejŽ                  j‘                  dEdF«      «      ZIej•                  dGeIdH¬I«       yy# e$ r dZY �ŒÖw xY w)Lzÿ
Dashboard Chacara Sonho Verde.
Login simples + sidebar fixa. Puxa Meta Ads (act_2321456848658947) ao vivo.
Abas: Visao Geral, Meta Ads, Conjuntos, Anuncios, Health.

v2 (2026-08-18): filtro de periodo dinamico via query string (?start=&end= ou ?preset=)
é    N)ÚdatetimeÚ	timedeltaÚdate)ÚPath)ÚZoneInfo)ÚFlaskÚrender_templateÚjsonifyÚrequestÚact_2321456848658947zv21.0zhttps://graph.facebook.com/ú/z	/insightsz%/opt/mia/config/meta_token_renato.txtÚ zAmerica/Sao_PauloÚ_meta_cacheé,  é´   Úreturnc                 óÆ   — 	 t        | xs d«      }|d›}|j                  dd«      j                  dd«      j                  dd«      }d|› �S # t        t        f$ r d}Y ŒNw xY w)Nr   ç        z,.2fú,ú@ú.zR$ )ÚfloatÚ	TypeErrorÚ
ValueErrorÚreplace)ÚvalueÚvÚss      ú@/opt/mia/workspace/clientes/chacara-sonho-verde/dashboard/app.pyÚ_fmt_brlr    6   sq   € ðÜ�%’*˜1Óˆð ˆTˆ(€AØ	�	‰	�#�sÓ×#Ñ# C¨Ó-×5Ñ5°c¸3Ó?€AØ��ˆ9Ðøô	 ”zÐ"ò ØŠðús   ‚A ÁA ÁA c                 óŠ   — 	 t        t        | xs d«      «      }|d›j	                  dd«      S # t        t        f$ r d}Y Œ'w xY w)Nr   r   r   )Úintr   r   r   r   ©r   r   s     r   Ú_fmt_intr$   @   sN   € ðÜ”�e’j˜qÓ!Ó"ˆð �ˆU×Ñ˜C Ó%Ð%øô ”zÐ"ò ØŠðús   ‚. ®AÁAc                 ó\   — 	 t        | xs d«      }|d›d�S # t        t        f$ r d}Y Œw xY w)Nr   r   z.2fú%)r   r   r   r#   s     r   Ú_fmt_pctr'   H   s@   € ðÜ�%’*˜1Óˆð �ˆW�Aˆ;Ðøô ”zÐ"ò ØŠðús   ‚ —+ª+ÚatualÚanteriorc                 óÜ   — |dk  r| dkD  rddddœS ddddœS | |z
  |z  d	z  }t        |«      d
k  rddddœS |dkD  rdnd}|dkD  rdnd}|› |d›d�j                  dd«      |t        |d«      dœS )zZCalcula variacao percentual entre dois periodos. Retorna dict com valor formatado e sinal.r   z
+ infinitoÚupN)ÚpctÚsignÚrawú-Úflatr   ç      Y@gš™™™™™©?z0,0%Údownú+r   ú.1fr&   r   r   é   )Úabsr   Úround)r(   r)   ÚdeltaÚsignalÚprefixs        r   Ú
_fmt_deltar;   P   s¢   € à�1‚}Ø�1Š9Ø'°¸dÑCÐCØ F°3Ñ7Ð7Ø�hÑ (Ñ*¨eÑ3€EÜ
ˆ5ƒz�DÒØ v°cÑ:Ð:Ø˜Q’Y‰T F€FØ˜A’I‰S 2€FØ�X˜e C˜[¨Ð*×2Ñ2°3¸Ó<ÀfÔUZÐ[`ÐbcÓUdÑeÐeó    c           	      óî   — | syd}| D ]U  }|j                  d«      xs dj                  «       }|dv sŒ+	 |t        t        |j                  d«      xs d«      «      z  }ŒW |S # t        t
        f$ r Y Œkw xY w)z-Soma acoes tipo 'lead' e conversoes de pixel.r   Úaction_typer   )Úleadz offsite_conversion.fb_pixel_leadzonsite_conversion.lead_groupedr   ©ÚgetÚstripr"   r   r   r   ©ÚactionsÚtotalÚaÚts       r   Ú_extrair_leadsrH   ^   s‡   € áØØ€EØò ˆØ�U‰U�=Ó!Ò' R×.Ñ.Ó0ˆØÐ^Ò^ðØœœU 1§5¡5¨£>Ò#6°QÓ7Ó8Ñ8‘ð	ð €Løô œzÐ*ò Ùðúó   ´*A"Á"A4Á3A4c           	      óî   — | syd}| D ]U  }|j                  d«      xs dj                  «       }|dv sŒ+	 |t        t        |j                  d«      xs d«      «      z  }ŒW |S # t        t
        f$ r Y Œkw xY w)zConversas iniciadas (msg apps).r   r>   r   )z3onsite_conversion.messaging_conversation_started_7dz,onsite_conversion.total_messaging_connectionr   r@   rC   s       r   Ú_extrair_msgrK   m   s�   € áØØ€EØò ˆØ�U‰U�=Ó!Ò' R×.Ñ.Ó0ˆØð Aò AðØœœU 1§5¡5¨£>Ò#6°QÓ7Ó8Ñ8‘ðð €Løô œzÐ*ò ÙðúrI   c                  óP   — t        j                  t        «      j                  «       S ©N)r   ÚnowÚTZ_BRr   © r<   r   Ú_hoje_brrQ   €   s   € Ü�<‰<œÓ×#Ñ#Ó%Ð%r<   Úpresetc                 ód  — t        «       }| xs dj                  «       j                  «       }|dk(  r |j                  «       |j                  «       fS |dk(  r/|t	        d¬«      z
  }|j                  «       |j                  «       fS |dk(  r/|t	        d¬«      z
  }|j                  «       |j                  «       fS |dk(  r/|t	        d	¬«      z
  }|j                  «       |j                  «       fS |d
k(  r/|t	        d¬«      z
  }|j                  «       |j                  «       fS |dk(  r2|j                  d¬«      }|j                  «       |j                  «       fS |dk(  rS|j                  d¬«      }|t	        d¬«      z
  }|j                  d¬«      }|j                  «       |j                  «       fS y)uJ   Retorna (since, until) ISO para um preset conhecido, ou None se invÃ¡lido.r   ÚtodayÚ	yesterdayé   ©ÚdaysÚlast7é   Úlast14é   Úlast30é   Ú	thismonth©ÚdayÚ	lastmonthN)rQ   ÚlowerrB   Ú	isoformatr   r   )rR   ÚhojeÚpÚyÚiniÚprimeiro_mes_atualÚultimo_mes_passadoÚprimeiro_mes_passados           r   Ú_preset_rangerl   „   sŠ  € ä‹:€DØ	Š�2×ÑÓ×$Ñ$Ó&€AàˆG‚|Ø�~‰~Ó §¡Ó!1Ð1Ð1ØˆKÒØ”9 !Ô$Ñ$ˆØ�{‰{‹}˜aŸk™k›mÐ+Ð+ØˆG‚|Ø”Y AÔ&Ñ&ˆØ�}‰}‹ §¡Ó 0Ð0Ð0ØˆH‚}Ø”Y BÔ'Ñ'ˆØ�}‰}‹ §¡Ó 0Ð0Ð0ØˆH‚}Ø”Y BÔ'Ñ'ˆØ�}‰}‹ §¡Ó 0Ð0Ð0ØˆKÒØ�l‰l˜qˆlÓ!ˆØ�}‰}‹ §¡Ó 0Ð0Ð0ØˆKÒØ!Ÿ\™\¨a˜\Ó0ÐØ/´)ÀÔ2CÑCÐØ1×9Ñ9¸aÐ9Ó@ÐØ#×-Ñ-Ó/Ð1C×1MÑ1MÓ1OÐOÐOØr<   r   c                 ó|   — | sy 	 t        j                  | d«      j                  «       S # t        t        f$ r Y y w xY w)Nz%Y-%m-%d)r   Ústrptimer   r   r   )r   s    r   Ú_parse_iso_datero   ¢   s@   € ÙØðÜ× Ñ   JÓ/×4Ñ4Ó6Ð6øÜœ	Ð"ò Ùðús   …#) ©;º;c                 ój  — g }t        «       }|t        t        ¬«      z
  }| j                  d«      xs dj	                  «       j                  «       }| j                  d«      xs dj                  «       }| j                  d«      xs dj                  «       }d}d}d}	|rF|dk7  rAt        |«      }
|
rt        |
d   «      }t        |
d	   «      }|}	n|j                  d
|› d�«       |�|€6t        |«      }t        |«      }|r	|r||}}d}	n|s|r|j                  d«       |�|€-t        d«      }
t        |
d   «      }t        |
d	   «      }|	xs d}	||kD  r||}}|j                  d«       ||kD  r|}|j                  d«       ||k  r|}|j                  dt        › d�«       ||kD  r|}||z
  j                  d	z   }|t        d	¬«      z
  }|t        |d	z
  ¬«      z
  }||k  r|}|j                  «       |j                  «       |	||j                  «       |j                  «       |j                  d«      › d|j                  d«      › �|j                  d«      › d|j                  d«      › �|j                  d«      › d|j                  d«      › �|j                  d«      › d|j                  d«      › �|dœS )u¼  
    LÃª query string (start, end, preset) e devolve dict:
    {
      "since": "YYYY-MM-DD",
      "until": "YYYY-MM-DD",
      "preset": "last7" | "custom" | ...,
      "days": int,                 # duracao em dias
      "since_prev": ..., "until_prev": ...,  # janela imediatamente anterior de mesma duracao
      "label": "01/08 a 20/08",
      "label_prev": "12/07 a 31/07",
      "warnings": [str, ...]
    }

    Regras:
      - preset explicito manda; senao usa start/end; senao padrao = last7.
      - start > end -> troca e warn.
      - end no futuro -> clamp em hoje.
      - since anterior a hoje - _MAX_LOOKBACK_DAYS -> clamp.
      - datas invalidas -> fallback pro last7 + warn.
    rW   rR   r   ÚstartÚendNÚcustomr   rV   zpreset desconhecido: z, usando last7z!start/end invalidos, usando last7rY   z'data inicial > final: intervalo trocadoz'data final no futuro: ajustada pra hojezdata inicial mais antiga que zd: ajustadaz%d/%m/%Yú a ú%d/%m)ÚsinceÚuntilrR   rX   Ú
since_prevÚ
until_prevÚlabelÚlabel_shortÚ
label_prevÚlabel_prev_shortÚwarnings)rQ   r   Ú_MAX_LOOKBACK_DAYSrA   rc   rB   rl   ro   ÚappendrX   rd   Ústrftime)Úargsr~   re   Úlookback_minÚ
preset_reqÚ	start_reqÚend_reqrv   rw   Úpreset_finalÚrr   ÚurX   ry   rx   s                   r   Ú_resolver_periodorŠ   «   sÛ  € ð* €HÜ‹:€DØœ)Ô);Ô<Ñ<€Là—(‘(˜8Ó$Ò*¨×1Ñ1Ó3×9Ñ9Ó;€JØ—‘˜'Ó"Ò( b×/Ñ/Ó1€IØ�x‰x˜‹Ò$ "×+Ñ+Ó-€Gà€EØ€EØ€Lñ �j HÒ,Ü˜*Ó%ˆÙÜ# A a¡DÓ)ˆEÜ# A a¡DÓ)ˆEØ%‰Là�O‰OÐ3°J°<¸~ÐNÔOð €}˜˜Ü˜IÓ&ˆÜ˜GÓ$ˆÙ‘Ø˜a�5ˆEØ#‰LÙ™'Ø�O‰OÐ?Ô@ð €}˜˜Ü˜'Ó"ˆÜ  !¡Ó%ˆÜ  !¡Ó%ˆØ#Ò. wˆð ˆu‚}Ø˜eˆuˆØ�‰ÐAÔBàˆt‚|ØˆØ�‰ÐAÔBàˆ|ÒØˆØ�‰Ð7Ô8JÐ7KÈ;ÐWÔXàˆt‚|Øˆà�E‰M×Ñ !Ñ#€Dð œ¨Ô*Ñ*€JØœi¨T°A©XÔ6Ñ6€Jà�LÒ Ø!ˆ
ð —‘Ó"Ø—‘Ó"ØØØ ×*Ñ*Ó,Ø ×*Ñ*Ó,Ø—N‘N :Ó.Ð/¨s°5·>±>À*Ó3MÐ2NÐOØŸ.™.¨Ó1Ð2°#°e·n±nÀWÓ6MÐ5NÐOØ#×,Ñ,¨ZÓ8Ð9¸¸Z×=PÑ=PÐQ[Ó=\Ð<]Ð^Ø)×2Ñ2°7Ó;Ð<¸CÀ
×@SÑ@SÐT[Ó@\Ð?]Ð^Øñð r<   ÚurlÚparamsÚtimeoutc                 ó
  — t         st        d«      ‚t        |«      }t         |d<   t        j                  | ||¬«      }|j
                  dk7  r(t        d|j
                  › d|j                  d d › �«      ‚|j                  «       S )NzCToken Meta nao configurado em /opt/mia/config/meta_token_renato.txtÚaccess_token)rŒ   r�   éÈ   z	Meta API z: r   )Ú_META_TOKENÚRuntimeErrorÚdictÚrequestsrA   Ústatus_codeÚtextÚjson)r‹   rŒ   r�   rˆ   s       r   Ú	_meta_getr˜     ss   € ÝÜÐ`ÓaÐaÜ�&‹\€FÜ(€Fˆ>ÑÜ�‰�S °Ô9€AØ‡}�}˜ÒÜ˜Y q§}¡} o°R¸¿¹¸tÀ¸°~ÐFÓGÐGØ�6‰6‹8€Or<   c                  óz   — t        «       } | j                  d¬«      }|j                  «       | j                  «       fS )NrV   r`   )rQ   r   rd   )re   rh   s     r   Ú_mes_atual_rangerš     s1   € Ü‹:€DØ
�,‰,˜1ˆ,Ó
€CØ�=‰=‹?˜DŸN™NÓ,Ð,Ð,r<   rv   rw   c                 ó‚  — ddd| ›d|›d�dœ}t        t        |«      }|j                  d«      xs g }|sdd	d	d	ddddd	dd
œ
S |d	   }t        |j                  d«      xs d	«      }t	        t        |j                  d«      xs d	«      «      }t	        t        |j                  d«      xs d	«      «      }t        |j                  d«      xs d	«      }	t        |j                  d«      xs d	«      }
t        |j                  d«      xs d	«      }t	        t        |j                  d«      xs d	«      «      }t        |j                  d«      xs d	«      }t        |j                  d«      «      }|d	kD  r||z  nd}t        |d«      |||t        |	d«      t        |
d«      t        |d«      t        |d«      |t        |d«      d
œ
S )z0Retorna resumo agregado para a conta no periodo.z<spend,impressions,clicks,ctr,cpm,cpc,actions,reach,frequencyÚaccountú
{"since":"ú","until":"ú"})ÚfieldsÚlevelÚ
time_rangeÚdatar   r   )
ÚgastoÚ
impressoesÚcliquesÚleadsÚctrÚcpmÚcpcÚcplÚreachÚfreqÚspendÚimpressionsÚclicksr¨   r©   rª   r¬   Ú	frequencyrD   r5   é   )r˜   ÚMETA_INSIGHTS_URLrA   r   r"   rH   r7   )rv   rw   rŒ   r£   Úrowsrˆ   r®   r¥   r¦   r¨   r©   rª   r¬   r­   r§   r«   s                   r   Ú_buscar_insights_contarµ   &  sŸ  € ð QÙÚ7<ºeÐDñ€Fô
 Ô&¨Ó/€DØ�8‰8�FÓÒ!˜r€DÙà¨°aÀ!Ø˜s¨3°sÀQÐPSñ
ð 	
ð 	ˆQ‰€AÜ�!—%‘%˜“.Ò% AÓ&€EÜ”U˜1Ÿ5™5 Ó/Ò4°1Ó5Ó6€JÜ”%˜Ÿ™˜h›Ò,¨1Ó-Ó.€GÜ
�—‘�e“Ò! Ó
"€CÜ
�—‘�e“Ò! Ó
"€CÜ
�—‘�e“Ò! Ó
"€CÜ”�a—e‘e˜G“nÒ)¨Ó*Ó+€EÜ�—‘�{Ó#Ò( qÓ)€DÜ˜1Ÿ5™5 Ó+Ó,€EØ" QšYˆ5�5Š=¨C€Cä�u˜a“°
ÀwØœu S¨!›}´U¸3À³]Ì5ÐQTÐVWË=Ü�S˜!‹} u´e¸DÀ!³nñð r<   c                 óx  — ddd| ›d|›d�dddœ}	 t        t        |«      }g }|j                  d	g «      xs g D ]²  }|j                  d
«      xs d}	 t	        j
                  |«      }|j                  d«      }	 t        |j                  d«      xs d«      }	t        |j                  d«      xs g «      }
|
dkD  r|	|
z  nd}|j                  |||
t        |	d«      t        |d«      dœ«       Œ´ |j                  d„ ¬«       |S # t        $ r g cY S w xY w# t        $ r |}Y Œ©w xY w# t        t        f$ r d}	Y Œ¡w xY w)z2Serie diaria (gasto + leads) por dia para o range.zspend,actionsrœ   r�   rž   rŸ   rV   éô  )r    r¡   r¢   Útime_incrementÚlimitr£   Ú
date_startr   ru   r®   r   r   rD   r5   )r£   Údata_isor§   r¤   r«   c                 ó&   — | j                  dd«      S )Nr»   r   )rA   ©Úxs    r   ú<lambda>z%_serie_diaria_conta.<locals>.<lambda>h  s   € ˜1Ÿ5™5 ¨RÓ0€ r<   ©Úkey)r˜   r³   Ú	ExceptionrA   r   Úfromisoformatr�   r   r   r   rH   r€   r7   Úsort)rv   rw   rŒ   r£   ÚoutÚrowrº   Údtrz   r®   r§   r«   s               r   Ú_serie_diaria_contarÈ   F  s\  € ð "ÙÚ7<ºeÐDØØñ€FðÜÔ*¨FÓ3ˆð €CØ�x‰x˜ Ó#Ò) rò ˆØ—W‘W˜\Ó*Ò0¨bˆ
ð	Ü×'Ñ'¨
Ó3ˆBØ—K‘K Ó(ˆEð	Ü˜#Ÿ'™' 'Ó*Ò/¨aÓ0ˆEô ˜sŸw™w yÓ1Ò7°RÓ8ˆØ!&¨¢ˆu�uŠ}°ˆØ�
‰
ØØ"ØÜ˜5 !“_Ü˜˜a“=ñ
õ 	ðð( ‡H�HÑ0€HÔ1Ø€Jøô1 ò ØŠ	ðûô ò 	ØŠEð	ûô œ:Ð&ò 	ØŠEð	ús5   ‘D Á&DÁ9D%ÄDÄDÄD"Ä!D"Ä%D9Ä8D9c                 óÐ  — ddd| ›d|›d�ddœ}t        t        |«      }g }|j                  d«      xs g D �]  }t        |j                  d	«      xs d
«      }t	        t        |j                  d«      xs d
«      «      }t	        t        |j                  d«      xs d
«      «      }t        |j                  d«      «      }	|	d
kD  r||	z  nd}
|j                  |j                  d«      |j                  d«      xs dt        |d«      t        |«      t        |«      t        |«      |	|	d
kD  rt        |
«      ndt        |
d«      t        t        |j                  d«      xs d
«      «      t        |j                  d«      xs d
«      t        t        |j                  d«      xs d
«      «      t        |j                  d«      xs d
«      d
kD  r't        t        |j                  d«      xs d
«      «      ndt        t        |j                  d«      xs d
«      d«      t        t	        t        |j                  d«      xs d
«      «      «      dœ«       �Œ |j                  d„ ¬«       |S )NzPadset_name,adset_id,spend,impressions,clicks,ctr,cpm,cpc,actions,frequency,reachÚadsetr�   rž   rŸ   éd   ©r    r¡   r¢   r¹   r£   r®   r   r¯   r°   rD   r   Úadset_idÚ
adset_namer/   r5   r¨   r©   rª   r±   r¬   )rÍ   ÚnomeÚ	gasto_rawr¤   r¥   r¦   r§   r«   Úcpl_rawr¨   Úctr_rawr©   rª   r­   r¬   c                 ó   — | d    S ©NrÐ   rP   r½   s    r   r¿   z%_insights_por_adset.<locals>.<lambda>Œ  ó   € ˜A˜k™N˜?€ r<   rÀ   )r˜   r³   rA   r   r"   rH   r€   r7   r    r$   r'   rÄ   )rv   rw   rŒ   r£   rÅ   rˆ   r®   r¥   r¦   r§   r«   s              r   Ú_insights_por_adsetrÖ   l  sú  € àdÙÚ7<ºeÐDØñ	€Fô Ô&¨Ó/€DØ
€CØ�X‰X�fÓÒ# ó ˆÜ�a—e‘e˜G“nÒ)¨Ó*ˆÜœ˜qŸu™u ]Ó3Ò8°qÓ9Ó:ˆ
Ü”e˜AŸE™E (›OÒ0¨qÓ1Ó2ˆÜ˜qŸu™u YÓ/Ó0ˆØ!&¨¢ˆu�uŠ}°ˆØ�
‰
ØŸ™˜jÓ)Ø—E‘E˜,Ó'Ò.¨3Ü˜u a›Ü˜e“_Ü" :Ó.Ü Ó(ØØ$)¨A¢I”8˜C”=°3Ü˜S !“}ÜœE !§%¡%¨£,Ò"3°!Ó4Ó5Ü˜QŸU™U 5›\Ò.¨QÓ/ÜœE !§%¡%¨£,Ò"3°!Ó4Ó5Ü9>¸q¿u¹uÀU»|Ò?PÈqÓ9QÐTUÒ9U”8œE !§%¡%¨£,Ò"3°!Ó4Ô5Ð[^Üœ% §¡ kÓ 2Ò 7°aÓ8¸!Ó<Üœc¤%¨¯©¨g«Ò(;¸!Ó"<Ó=Ó>ñ
ö 	ðð. ‡H�HÑ*€HÔ+Ø€Jr<   c                 óà  — ddd| ›d|›d�ddœ}t        t        |«      }g }|j                  d«      xs g D �]¡  }t        |j                  d	«      xs d
«      }t	        t        |j                  d«      xs d
«      «      }t	        t        |j                  d«      xs d
«      «      }t        |j                  d«      «      }	|	d
kD  r||	z  nd}
t        t        |j                  d«      xs d
«      d«      }t        |j                  d«      xs d
«      }|j                  |j                  d«      |j                  d«      xs d|j                  d«      xs dt        |d«      t        |«      t        |«      t        |«      |	|	d
kD  rt        |
«      ndt        |
d«      t        |«      |t        t        |j                  d«      xs d
«      «      ||dkD  dœ«       �Œ¤ |j                  d„ ¬«       |S )NzKad_name,ad_id,adset_name,spend,impressions,clicks,ctr,cpm,actions,frequencyÚadr�   rž   rŸ   r�   rÌ   r£   r®   r   r¯   r°   rD   r   r±   r5   r¨   Úad_idÚad_namer/   rÎ   r©   g       @)rÙ   rÏ   rÊ   rÐ   r¤   r¥   r¦   r§   r«   rÑ   r¨   rÒ   r©   r­   Úfadigac                 ó   — | d    S rÔ   rP   r½   s    r   r¿   z"_insights_por_ad.<locals>.<lambda>²  rÕ   r<   rÀ   )r˜   r³   rA   r   r"   rH   r7   r€   r    r$   r'   rÄ   )rv   rw   rŒ   r£   rÅ   rˆ   r®   r¥   r¦   r§   r«   r­   r¨   s                r   Ú_insights_por_adrÝ   �  s²  € à_ÙÚ7<ºeÐDØñ	€Fô Ô&¨Ó/€DØ
€CØ�X‰X�fÓÒ# ó ˆÜ�a—e‘e˜G“nÒ)¨Ó*ˆÜœ˜qŸu™u ]Ó3Ò8°qÓ9Ó:ˆ
Ü”e˜AŸE™E (›OÒ0¨qÓ1Ó2ˆÜ˜qŸu™u YÓ/Ó0ˆØ!&¨¢ˆu�uŠ}°ˆÜ”U˜1Ÿ5™5 Ó-Ò2°Ó3°QÓ7ˆÜ�A—E‘E˜%“LÒ% AÓ&ˆØ�
‰
Ø—U‘U˜7“^Ø—E‘E˜)Ó$Ò+¨Ø—U‘U˜<Ó(Ò/¨CÜ˜u a›Ü˜e“_Ü" :Ó.Ü Ó(ØØ$)¨A¢I”8˜C”=°3Ü˜S !“}Ü˜C“=ØÜœE !§%¡%¨£,Ò"3°!Ó4Ó5ØØ˜S‘jñ
ö 	ðð2 ‡H�HÑ*€HÔ+Ø€Jr<   c                  ót  — dg dœ} 	 t        t        › dt        › �ddi«      }|j                  d«      xs d}	 t	        |«      dz  }|j                  d
«      xs d}	 t	        |«      dz  }|j                  d«      xs d|j                  d«      |j                  d«      dk(  rdndt        |d«      t        |«      |dk  |dk  t        |«      |j                  d«      xs d|j                  d«      xs ddœ
| d<   	 t        t        › dt        › d�ddi«      }g }|j                  d«      xs g D ]÷  }|j                  d«      xs d }	d }
d}	 t        j                  |	«      }t        j                  |j                  «      }||z
  }t        |j!                  «       d!z  d«      }
|
dk  r t#        |j!                  «       d"z  «      › d#�}n|
d$k  r|
d%›d&�}nt#        |
d$z  «      › d'�}|j                  |j                  d(«      |j                  d«      xs d|	||
|
d uxr |
d$kD  d)œ«       Œù || d*<   	 t        t        › dt        › d,�d-d.d/œ«      }d0}d0}d0}g }|j                  d«      xs g D ]¤  }|j                  d1«      xs |j                  d2«      xs d j%                  «       }|d3k(  r|dz  }n|d4v r|dz  }n	|d5v r|dz  }|j                  |j                  d«      xs d||j                  d6«      xs i j                  d«      xs dd7œ«       Œ¦ |||t'        |j                  d«      xs g «      |d8œ| d9<   t'        | d   «      d0k(  | d;<   | S # t
        t        f$ r d	}Y �Œw xY w# t
        t        f$ r d	}Y �Œw xY w# t        $ r2}dt        |«      i| d<   | d   j                  d|› �«       Y d }~�Œ¸d }~ww xY w# t        $ r Y �Œãw xY w# t        $ r'}g | d*<   | d   j                  d+|› �«       Y d }~�ŒÈd }~ww xY w# t        $ r1}dt        |«      i| d9<   | d   j                  d:|› �«       Y d }~Œüd }~ww xY w)<NT)ÚokÚerrosr   r    zNname,account_status,balance,amount_spent,currency,timezone_name,disable_reasonÚbalanceÚ0r1   r   Úamount_spentÚnamer/   Úaccount_statusrV   ÚAtivazInativa/Bloqueadar5   g      I@g      $@ÚcurrencyÚBRLÚtimezone_name)
rÏ   r•   Ústatus_labelÚ	saldo_brlÚ	saldo_fmtÚsaldo_baixoÚsaldo_criticoÚgasto_total_contaÚmoedaÚtimezoneÚcontaÚerrorà   zconta: z
/adspixelszname,last_fired_time,idr£   Úlast_fired_timer   i  é<   z
 min atrasé   r4   zh atrasz dias atrasÚid)r÷   rÏ   Ú
last_firedÚlast_fired_labelÚhoras_atrasÚalertaÚpixelszpixels: z/adsz/name,status,effective_status,adset{name,status}rË   )r    r¹   r   Úeffective_statusÚstatusÚACTIVE)ÚPAUSEDÚADSET_PAUSEDÚCAMPAIGN_PAUSED)ÚDISAPPROVEDÚPENDING_REVIEWÚWITH_ISSUESrÊ   )rÏ   rþ   rÊ   )ÚativosÚpausadosÚ
rejeitadosrE   ÚdetalhesÚadszads: rß   )r˜   Ú	META_BASEÚMETA_ACCOUNT_IDrA   r   r   r   r7   r    rÂ   Ústrr€   r   rÃ   rN   ÚtzinfoÚtotal_secondsr"   ÚupperÚlen)rÅ   ÚdÚbalance_rawÚbalance_brlÚamount_spent_rawÚamount_spent_brlÚerü   rf   Úlastrú   rz   rÇ   Úagorar8   r  r  r  r	  rF   Ústs                        r   Ú_health_checkr  ¹  s·  € Ø Ñ
#€Cð+ÜÜˆk˜œ?Ð+Ð,ØÐgÐhó
ˆð
 —e‘e˜IÓ&Ò-¨#ˆð	Ü Ó,¨uÑ4ˆKð Ÿ5™5 Ó0Ò7°CÐð	#Ü$Ð%5Ó6¸Ñ>Ðð
 —E‘E˜&“MÒ( SØŸ5™5Ð!1Ó2Ø'(§u¡uÐ-=Ó'>À!Ò'C™GÐI\Ü˜{¨AÓ.Ü! +Ó.Ø&¨Ñ-Ø(¨4Ñ/Ü!)Ð*:Ó!;Ø—U‘U˜:Ó&Ò/¨%ØŸ™˜oÓ.Ò5°#ñ
ˆˆG‰ð"",ÜÜˆk˜œ?Ð+¨:Ð6ØÐ0Ð1ó
ˆð ˆØ—‘�v“Ò$ "ò 	ˆAØ—5‘5Ð*Ó+Ò1¨rˆDØˆKØˆEðÜ×+Ñ+¨DÓ1�Ü Ÿ™ R§Y¡YÓ/�Ø ™
�Ü# E×$7Ñ$7Ó$9¸DÑ$@À!ÓD�Ø ’?Ü" 5×#6Ñ#6Ó#8¸Ñ#;Ó<Ð=¸ZÐH‘EØ  2Ò%Ø*¨3Ð/¨wÐ7‘Eä" ;¨r¡>Ó2Ð3°;Ð?�Eð �M‰MØ—e‘e˜D“kØŸ™˜f›Ò,¨Ø"Ø$)Ø*Ø&¨dÐ2ÒG°{ÀRÑ7Gñõ ð#	ð2 ˆˆH‰ð)ÜÜˆk˜œ?Ð+¨4Ð0ØHÐSVÑWó
ˆð ˆØˆØˆ
ØˆØ—‘�v“Ò$ "ò 	ˆAØ—%‘%Ð*Ó+ÒD¨q¯u©u°X«ÒDÀ"×KÑKÓMˆBØ�XŠ~Ø˜!‘‘ØÐDÑDØ˜A‘‘ØÐGÑGØ˜a‘�
Ø�O‰OØŸ™˜f›Ò,¨ØØŸ%™% ›.Ò.¨B×3Ñ3°FÓ;ÒB¸sñõ ð	ð Ø Ø$Ü˜Ÿ™˜v›Ò,¨"Ó-Ø ñ
ˆˆE‰
ô �C˜‘LÓ! QÑ&€Cˆ�IØ€JøôA œ:Ð&ò 	Ø‹Kð	ûô
 œ:Ð&ò 	#Ø"Óð	#ûô ò +Ø¤ A£Ð'ˆˆG‰ØˆG‰×Ñ˜g a S˜M×*Ò*ûð+ûô4 ò Úðûô ò ,ØˆˆH‰ØˆG‰×Ñ˜h q c˜N×+Ò+ûð,ûôD ò )Øœc !›fÐ%ˆˆE‰
ØˆG‰×Ñ˜e A 3˜K×(Ñ(ûð)ús·   ‡0M< ¸M ÁM< ÁM$ Á*BM< Ã;AO
 ÅBN:Ç#A
O
 È.DO= ÍM!ÍM< Í M!Í!M< Í$M9Í5M< Í8M9Í9M< Í<	N7Î'N2Î2N7Î:	OÏO
 ÏOÏO
 Ï
	O:ÏO5Ï5O:Ï=	P7Ð'P2Ð2P7Úperiodoc                 óÌ
  ‡‡‡‡‡‡‡— | d   Š| d   Š| d   Š| d   Št        «       \  ŠŠi Šˆfd„}dˆˆfd„fdˆˆfd	„fd
ˆˆfd„fdˆˆfd„fdˆˆfd„fdˆˆfd„fdt        fg}g }|D ]@  \  }}t        j                  |||fd¬«      }|j	                  «        |j                  |«       ŒB |D ]  }|j                  d¬«       Œ ‰j                  di «      xs i }‰j                  di «      xs i }‰j                  d
i «      xs i }	| d   }
d|
› d�}dAd„} |d|› �|j                  dd«      |j                  dd«      d«       |d|› �|j                  d d«      |j                  d d«      d!«       |d"|› �|j                  d#d«      |j                  d#d«      d«       |d$|› �|j                  d%d«      |j                  d%d«      d&«       |d'|› �|j                  d(d«      |j                  d(d«      d«      g}‰j                  dg «      xs g }t        |t        «      r|j                  d)«      r|d)   }g }nd*}|r-t        d+„ |D «       d¬,«      }|D ]  }|d-   |k(  xr |dkD  |d.<   Œ ‰j                  dg «      xs g }t        |t        «      r|j                  d)«      r|d)   }g }nd*}|rR|D �cg c]  }|d/   dkD  sŒ|d/   ‘Œ }}|rt        |«      t        |«      z  nd}|D ]  }|dkD  xr |d/   |d0z  k  |d1<   Œ dt        j                  t        «      j!                  d2«      | d   | d   | d   | d   | d3   | d   | d4   | d5   | d6   | d7   | d8   | d5   | d7   t#        ‰«      › d9t#        ‰«      › �d:œ|t%        |j                  dd«      «      |j                  d d«      |j                  d d«      dkD  rt%        |j                  d#d«      «      nd;t'        |j                  d%d«      «      t%        |j                  d(d«      «      t)        |j                  d<d«      «      t)        |j                  d=d«      «      d>œt%        |	j                  dd«      «      |	j                  d d«      |	j                  d d«      dkD  rt%        |	j                  d#d«      «      nd;t'        |	j                  d%d«      «      t)        |	j                  d<d«      «      t)        |	j                  d=d«      «      d?œt        ‰j                  d«      t*        «      r‰j                  d«      ng t        ‰j                  d«      t*        «      r‰j                  d«      ng ||||‰j                  di «      d@œ}|S c c}w )Ba  Retorna payload completo pro periodo escolhido:
      - agregado atual + agregado periodo anterior (com deltas)
      - serie diaria do periodo
      - mes atual agregado (sempre presente pro card 'mes')
      - adsets do periodo
      - ads do periodo
      - health check
    rv   rw   rx   ry   c                 óh   •— 	  |«       ‰| <   y # t         $ r}dt        |«      i‰| <   Y d }~y d }~ww xY w)NÚ__erro__)rÂ   r  )rÁ   Úfnr  Ú
resultadoss      €r   Ú_runz_coletar_overview.<locals>._run>  s5   ø€ ð	3Ù ›dˆJ�sŠOøÜò 	3Ø)¬3¨q«6Ð2ˆJ�sŽOûð	3ús   ƒ
 Ž	1—,¬1Úaggc                  ó   •— t        ‰ ‰«      S rM   ©rµ   ©rv   rw   s   €€r   r¿   z#_coletar_overview.<locals>.<lambda>E  s   ø€ Ô.¨u°eÓ<€ r<   Úagg_prevc                  ó   •— t        ‰ ‰«      S rM   r%  )rx   ry   s   €€r   r¿   z#_coletar_overview.<locals>.<lambda>F  s   ø€ Ô3°JÀ
ÓK€ r<   Úagg_mesc                  ó   •— t        ‰‰ «      S rM   r%  )Úfim_mesÚini_mess   €€r   r¿   z#_coletar_overview.<locals>.<lambda>G  s   ø€ Ô2°7¸GÓD€ r<   Úseriec                  ó   •— t        ‰ ‰«      S rM   )rÈ   r&  s   €€r   r¿   z#_coletar_overview.<locals>.<lambda>H  s   ø€ Ô-¨e°UÓ;€ r<   Úadsetsc                  ó   •— t        ‰ ‰«      S rM   )rÖ   r&  s   €€r   r¿   z#_coletar_overview.<locals>.<lambda>I  s   ø€ Ô.¨u°eÓ<€ r<   r
  c                  ó   •— t        ‰ ‰«      S rM   )rÝ   r&  s   €€r   r¿   z#_coletar_overview.<locals>.<lambda>J  s   ø€ Ô(¨°Ó6€ r<   ÚhealthT)Útargetr‚   Údaemoné-   )r�   rX   ú(zd)Úbrlc                 óè   — |dk(  rt        |«      }n-|dk(  rt        |«      }n|dk(  rt        |«      }nt        |«      }t	        t        |xs d«      t        |xs d«      «      }| ||||d   |d   dœS )Nr7  r"   r,   r   r-   )rz   ÚvalorÚ	valor_rawÚprev_rawÚ	delta_pctÚ
delta_sign)r    r$   r'   r  r;   r   )Ú	label_kpiÚ	atual_valÚprev_valÚfmtÚ	valor_fmtr8   s         r   Ú_cardz _coletar_overview.<locals>._card^  s€   € Ø�%Š<Ü  Ó+‰IØ�EŠ\Ü  Ó+‰IØ�EŠ\Ü  Ó+‰Iä˜I›ˆIÜœ5 ¢¨aÓ0´%¸ºÀAÓ2FÓGˆàØØ"Ø Ø˜u™Ø ™-ñ
ð 	
r<   zInvestimento r¤   r   zLeads r§   r"   zCPL r«   zCTR r¨   r,   zCPM r©   r  r   c              3   ó8   K  — | ]  }|d    dkD  sŒ|d    –— Œ y­w)rÑ   r   NrP   )Ú.0rF   s     r   ú	<genexpr>z$_coletar_overview.<locals>.<genexpr>�  s   è ø€ ÒH¨°q¸±|ÀaÓ7G�q˜•|ÑHùs   ‚�
)ÚdefaultrÑ   Ú	mais_carorÒ   gffffffæ?Ú	ctr_baixoz%d/%m/%Y %H:%MrR   rz   r{   r|   r}   r~   rt   )rv   rw   rx   ry   rR   rX   rz   r{   r|   r}   r~   r(   r)   Úmesr/   r¥   r¬   )r¤   r§   r«   r¨   r©   r¥   r¬   )r¤   r§   r«   r¨   r¥   r¬   )rß   Ú	gerado_emr  ÚcardsÚagregadoÚ	mes_atualr-  Ú	serie_30dr/  Úadsets_error
  Úads_error2  )r7  )rš   r  Ú	threadingÚThreadrq   r€   ÚjoinrA   Ú
isinstancer“   ÚmaxÚsumr  r   rN   rO   r�   Ú_fmt_data_shortr    r'   r$   Úlist)r  r"  ÚtasksÚthreadsÚkr   rG   r#  r'  r)  ÚdiasÚsufixorC  rL  r/  rP  Úcpl_maxrF   r
  rQ  ÚctrsÚ	media_ctrÚpayloadr+  r,  r!  rv   rx   rw   ry   s                          @@@@@@@r   Ú_coletar_overviewrc  ,  s   þ€ ð �GÑ€EØ�GÑ€EØ˜Ñ&€JØ˜Ñ&€JÜ'Ó)Ñ€GˆWð €Jô3ð 
Ô<Ð=Ø	ÔKÐLØ	ÔDÐEØ	Ô;Ð<Ø	Ô<Ð=Ø	Ô6Ð7Ø	”=Ð!ð€Eð €GØò ‰ˆˆ2Ü×Ñ D°°2¨w¸tÔDˆØ	�‰Œ	Ø�‰�qÕðð ò ˆØ	�‰�rˆÕðð �.‰.˜ Ó
#Ò
) r€CØ�~‰~˜j¨"Ó-Ò3°€HØ�n‰n˜Y¨Ó+Ò1¨r€Gà�6‰?€DØ���bˆ\€Fó
ñ( 	�˜f˜XÐ&¨¯©°¸Ó(;¸X¿\¹\È'ÐSTÓ=UÐW\Ó]Ù��v�hÐ §¡¨°!Ó!4°h·l±lÀ7ÈAÓ6NÐPUÓVÙ��V�Hˆo˜sŸw™w u¨aÓ0°(·,±,¸uÀaÓ2HÈ%ÓPÙ��V�Hˆo˜sŸw™w u¨aÓ0°(·,±,¸uÀaÓ2HÈ%ÓPÙ��V�Hˆo˜sŸw™w u¨aÓ0°(·,±,¸uÀaÓ2HÈ%ÓPð€Eð �^‰^˜H bÓ)Ò/¨R€FÜ�&œ$Ô F§J¡J¨zÔ$:Ø˜ZÑ(ˆØ‰àˆÙÜÑH¨VÔHÐRSÔTˆØò 	GˆAØ 	™l¨gÑ5ÒE¸'ÀA¹+ˆAˆkŠNð	Gð �.‰.˜ Ó
#Ò
) r€CÜ�#”tÔ §¡¨Ô!4Ø�z‘?ˆØ‰àˆñ Ø&)Ö> ¨Q¨y©\¸AÓ-=��)“Ð>ˆÐ>Ù-1”C˜“I¤ D£	Ò)°qˆ	Øò 	PˆAØ'¨!™mÒN°°)±¸yÈ3¹Ñ0NˆAˆkŠNð	Pð Ü—\‘\¤%Ó(×1Ñ1Ð2BÓCà˜WÑ%Ø˜WÑ%Ø! ,Ñ/Ø! ,Ñ/Ø˜hÑ'Ø˜F‘OØ˜WÑ%Ø" =Ñ1Ø! ,Ñ/Ø 'Ð(:Ñ ;Ø 
Ñ+à˜]Ñ+ØÐ 2Ñ3Ü% gÓ.Ð/¨s´?À7Ó3KÐ2LÐMñ
ð" ä˜cŸg™g g¨qÓ1Ó2Ø—W‘W˜W aÓ(Ø25·'±'¸'À1Ó2EÈÒ2I”8˜CŸG™G E¨1Ó-Ô.ÈsÜ˜CŸG™G E¨1Ó-Ó.Ü˜CŸG™G E¨1Ó-Ó.Ü" 3§7¡7¨<¸Ó#;Ó<Ü˜cŸg™g g¨qÓ1Ó2ñ
ô ˜gŸk™k¨'°1Ó5Ó6Ø—[‘[ ¨!Ó,Ø6=·k±kÀ'È1Ó6MÐPQÒ6Q”8˜GŸK™K¨¨qÓ1Ô2ÐWZÜ˜GŸK™K¨¨qÓ1Ó2Ü" 7§;¡;¨|¸QÓ#?Ó@Ü˜gŸk™k¨'°1Ó5Ó6ñ
ô -7°z·~±~ÀgÓ7NÔPTÔ,U�—‘ Ô(Ð[]ä0:¸:¿>¹>È'Ó;RÔTXÔ0Y�Z—^‘^ GÔ,Ð_aØØ"ØØØ—.‘. ¨2Ó.ñ[.€Gð^ €Nùòi ?s   Ê.U!Ê<U!Úisoc                 ón   — 	 t        j                  | «      j                  d«      S # t        $ r | cY S w xY w)Nru   )r   rÃ   r�   rÂ   )rd  s    r   rX  rX  Å  s7   € ðÜ×%Ñ% cÓ*×3Ñ3°GÓ<Ð<øÜò ØŠ
ðús   ‚#& ¦4³4c                 óâ   — | d   › d| d   › �}t        j                   «       }t        j                  |«      }|r||d   z
  t        k  r|d   S t	        | «      }||dœt        |<   t        |«       |S )z-Cache indexado por (since, until). TTL 5 min.rv   ú::rw   Útsr£   ©rh  r£   )Útimer   rA   Ú	_META_TTLrc  Ú_limpar_cache_antigo)r  rÁ   rN   Úentryr£   s        r   Ú_coletar_overview_cachedrn  Ì  sz   € à�WÑÐ˜b ¨Ñ!1Ð 2Ð
3€CÜ
�)‰)‹+€CÜ�O‰O˜CÓ €EÙ��u˜T‘{Ñ"¤YÒ.Ø�V‰}ÐÜ˜WÓ%€DØ!¨4Ñ0„K�Ñä˜ÔØ€Kr<   rN   Úttl_maxc                 ó®   — t         j                  «       D ��cg c]  \  }}| |d   z
  |kD  sŒ|‘Œ }}}|D ]  }t         j                  |d «       Œ y c c}}w )Nrh  )r   ÚitemsÚpop)rN   ro  r\  r   Ústales        r   rl  rl  Ú  sT   € Ü&×,Ñ,Ó.×J‘4�1�a°#¸¸$¹±-À'Ó2IŠQÐJ€EÑJØò !ˆÜ�‰˜˜4Õ ñ!ùó Ks
   ˜A¬Ac                  óD   — t        j                  «       j                  ddœS )NzChacara Sonho Verde)Úcurrent_yearÚcliente_nome)r   rN   ÚyearrP   r<   r   Úinject_globalsrx  ã  s    € ô !Ÿ™›×+Ñ+Ø-ñð r<   c                  ó   — t        dd¬«      S )Nz
index.htmlÚhome©Úactive©r	   rP   r<   r   Úindexr~  î  s   € ä˜<°Ô7Ð7r<   z
/conjuntosc                  ó   — t        dd¬«      S )Nzconjuntos.htmlÚ	conjuntosr{  r}  rP   r<   r   r€  r€  ó  s   € äÐ+°KÔ@Ð@r<   z	/anunciosc                  ó   — t        dd¬«      S )Nzanuncios.htmlÚanunciosr{  r}  rP   r<   r   r‚  r‚  ø  s   € ä˜?°:Ô>Ð>r<   z/healthc                  ó   — t        dd¬«      S )Nzhealth.htmlr2  r{  r}  rP   r<   r   Úhealth_pager„  ý  s   € ä˜=°Ô:Ð:r<   z/api/overviewc                  óþ   — 	 t        t        j                  «      } t        | «      }t        |«      S # t        $ rB}t
        j                  j                  d«       t        dt        |«      dœ«      dfcY d }~S d }~ww xY w)Nzerro api_overviewF©rß   ró   r·   )
rŠ   r   r‚   rn  rÂ   ÚappÚloggerÚ	exceptionr
   r  )r  r£   r  s      r   Úapi_overviewrŠ    si   € ð;Ü#¤G§L¡LÓ1ˆÜ'¨Ó0ˆô �4‹=Ðøô ò ;Ü�
‰
×ÑÐ0Ô1Ü˜e¬S°«VÑ4Ó5°sÐ:Õ:ûð;ús   ‚$1 ±	A<º7A7Á1A<Á7A<z/api/refreshc                  ó€  — 	 t        t        j                  «      } | d   › d| d   › �}t        j	                  |d«       t        | «      }t        j                  «       |dœt        |<   t        |«      S # t        $ rB}t        j                  j                  d«       t        dt        |«      dœ«      d	fcY d}~S d}~ww xY w)
z2Forca busca nova (ignora cache) do periodo pedido.rv   rg  rw   Nri  zerro api_refreshFr†  r·   )rŠ   r   r‚   r   rr  rc  rj  rÂ   r‡  rˆ  r‰  r
   r  )r  rÁ   r£   r  s       r   Úapi_refreshrŒ    s¨   € ð;Ü#¤G§L¡LÓ1ˆØ˜Ñ!Ð" " W¨WÑ%5Ð$6Ð7ˆÜ�‰˜˜TÔ"Ü  Ó)ˆÜ"&§)¡)£+°tÑ<Œ�CÑô �4‹=Ðøô ò ;Ü�
‰
×ÑÐ/Ô0Ü˜e¬S°«VÑ4Ó5°sÐ:Õ:ûð;ús   ‚A%A2 Á2	B=Á;7B8Â2B=Â8B=z/healthzc                  óT   — t        dt        t        j                  «       «      dœ«      S )NT)rß   rh  )r
   r"   rj  rP   r<   r   ÚhealthzrŽ    s   € ä˜$¤c¬$¯)©)«+Ó&6Ñ7Ó8Ð8r<   c                  óZ   — d„ } t        j                  | dd¬«      }|j                  «        y )Nc                  ó€  —  G d„ d«      }  | «       }	 t        |«      }t        |«       	 t        j                  d«       	 t        |«      }|d   › d|d   › �}t        j                  |d «       t        |«       ŒP# t        $ r t        j                  «        Y Œpw xY w# t        $ r t        j                  «        Y ŒCw xY w)Nc                   ó   — e Zd Zd„ Zy)ú3_warm_cache_loop.<locals>._loop.<locals>._EmptyArgsc                  ó   — y rM   rP   )ÚselfrF   Úkws      r   rA   z7_warm_cache_loop.<locals>._loop.<locals>._EmptyArgs.get(  s   € ¨Dr<   N)Ú__name__Ú
__module__Ú__qualname__rA   rP   r<   r   Ú
_EmptyArgsr’  '  s   „ Û0r<   r™  éð   rv   rg  rw   )	rŠ   rn  rÂ   Ú	tracebackÚ	print_excrj  Úsleepr   rr  )r™  Úemptyr  rÁ   s       r   Ú_loopz_warm_cache_loop.<locals>._loop%  s¹   € ÷	1ñ 	1á“ˆð	"Ü'¨Ó.ˆGÜ$ WÔ-ð Ü�J‰J�sŒOð&Ü+¨EÓ2�Ø  Ñ)Ð*¨"¨W°WÑ-=Ð,>Ð?�Ü—‘  TÔ*Ü(¨Ô1ð øô ò 	"Ü×ÑÖ!ð	"ûô ò &Ü×#Ñ#Ö%ð&ús#   “A: Á 9B Á:BÂBÂB=Â<B=Tzchacara-warmer)r3  r4  rä   )rR  rS  rq   )rŸ  rG   s     r   Ú_warm_cache_loopr   $  s'   € ò&ô, 	×Ñ ¨dÐ9IÔJ€AØ‡G�G…Ir<   Ú__main__ÚPORTiÝ"  z0.0.0.0F)ÚhostÚportÚdebug)é   )i  )KÚ__doc__Úosrj  rR  r›  r   r   r   Úpathlibr   Úzoneinfor   r”   Úflaskr   r	   r
   r   r–  r‡  r  ÚMETA_API_VERSIONr  r³   Ú	read_textrB   r‘   rÂ   rO   r   r“   Ú__annotations__rk  r   r  r    r$   r'   r   r;   r"   rH   rK   rQ   Útuplerl   ro   rŠ   r˜   rš   rµ   rY  rÈ   rÖ   rÝ   r  rc  rX  rn  rl  Úcontext_processorrx  Úrouter~  r€  r‚  r„  rŠ  rŒ  rŽ  r   ÚenvironrA   r¤  ÚrunrP   r<   r   ú<module>r´     s­  ðòó 
Û Û Û ß .Ñ .Ý Ý ã ÷ó ñ ˆHƒo€ð
 )€ØÐ Ø)Ð*:Ð);Ð<€	Ø �k  ?Ð"3°9Ð=Ð ðÙÐ>Ó?×IÑIÓK×QÑQÓS€Kñ 	Ð$Ó%€ð €ˆTÓ Ø€	ØÐ ð�só ð&�só &ð�só ðf�eð f uð f°ó fð˜só ð˜Só ð&&�$ó &ð˜#ð  %¨¨S¨¡/°DÑ"8ó ð<�sð ˜t d™{ó ða˜tó añN�3ð  ð ¨sð ¸Dó ð-˜%  S ™/ó -ð #ð ¨cð °dó ð@#˜sð #¨3ð #°4¸±:ó #ðL!˜sð !¨3ð !°4¸±:ó !ðH#˜Cð #¨ð #°°T±
ó #ðRm�tó mðfV˜tð V¨ó Vðr˜ð  ó ð dð ¨tó ñ!˜eð !¨có !ð ×Ññó ðð ‡�ˆ3ƒñ8ó ð8ð ‡�ˆ<ÓñAó ðAð ‡�ˆ;Óñ?ó ð?ð ‡�ˆ9Óñ;ó ð;ð ‡�ˆ?Óñó ðð ‡�ˆ>Óñó ðð ‡�ˆ:Óñ9ó ð9òñ6 Ô ð ˆzÒÙˆr�z‰z�~‰~˜f dÓ+Ó,€DØ‡G�G� ¨U€GÕ3ð øð{ ò ØƒKðús   Á$I ÉIÉI