ó
    IÉjð<  ã                   óð  • S r SSKrSSKJs  Jr  SSKrSSKrSSK	J
r
  SSKJr  SSKJrJrJr  SSKJrJrJr  SrS=S\4S	 jjr\R2                  S
 5       rS rS rS rS r\R>                  RA                  SSS0SSS00SSS00SSS00SSS00SSS00SSS 00SS!S"00/5      S# 5       r!S$ r"S% r#S& r$S' r%S( r&S) r'S* r(S+ r)S, r*S>S- jr+S.\4S/ jr,S0 r-S1 r.S2 r/S3 r0S4 r1S5 r2S6 r3S7 r4S8 r5S9 r6S: r7S; r8S< r9g)?uD  
ProtecciÃ³n de fotos al estilo hec-photo-app (services/protection_service.py + media_service).

Fija lo mismo que `test_protection_service.py` de HEC:
  * cachÃ© idempotente (no se gasta un crÃ©dito en cada apertura del portal);
  * un fallo definitivo se anota en ai_health, no cada reintento;
  * `protect_invert` se manda INVERTIDO a KIS (su API hace lo contrario de lo que promete el interruptor);
  * la huella de configuraciÃ³n: cambiar los ajustes SÃ� cambia lo que se sirve.
Y lo propio de este proyecto: el respaldo ante un fallo es la marca de agua, nunca el original.
é    N)ÚImage)Úconfig)Ú	ai_healthÚphoto_serviceÚprotection_service)Ú	DEMO_CODEÚSCHOOLÚ
family_dirz
ecole-testÚreturnc                 óš   • [         R                  " 5       n[        R                  " SX5      R	                  US5        UR                  5       $ )NÚRGBÚJPEG)ÚioÚBytesIOr   ÚnewÚsaveÚgetvalue)ÚcolorÚsizeÚbufs      ÚXD:\Ingenieria\TRABAJOS ONLINE\Projects\11- Photo School\backend\tests\test_protection.pyÚ_jpeg_bytesr      s4   € Ü
�*Š*‹,€CÜ	‡I‚Iˆe�TÓ!×&Ñ& s¨FÔ3Ø�<‰<‹>Ðó    c              #   óÀ  ^#   • S/ S.mU4S jnU R                  [        SU5        U R                  [        SS5        [        R                  R                  5         Tv •  [        R                  " [        0 5        [        [        [        5      R                  S5       H  nUR                  5         M     SSKnUR                  [        R                  [        -  S	S
9  g7f)u\   KIS simulado: devuelve un JPEG verde liso (las Â«caras difuminadasÂ») y cuenta las llamadas.r   )ÚnÚformsc              “   óŠ   >#   • TS==   S-  ss'   TS   R                  [        R                  " U5      5        [        5       $ 7f)Nr   é   r   )ÚappendÚPÚkis_form_datar   )Úphoto_bytesÚfilenameÚ	api_tokenÚcfgÚcallss       €r   ÚfakeÚkis.<locals>.fake"   s6   øé € Øˆc‹
�a‰‹
Øˆg‰×ÑœaŸošo¨cÓ2Ô3Ü‹}Ðùs   ƒA AÚ	_call_kisÚSTORYFACE_API_KEYÚsf_testz
.protect/*NT)Úignore_errors)Úsetattrr    r   r   Ú_stateÚclearÚset_protectionÚSCr
   r   ÚglobÚunlinkÚshutilÚrmtreeÚ
THUMBS_DIR)Úmonkeypatchr'   Úfr4   r&   s       @r   Úkisr9      s¨   øé € ð ˜bÑ!€Eõð
 ×Ñœ˜;¨Ô-Ø×ÑœÐ 3°YÔ?Ü×Ñ×ÑÔØ
‚Kä×Ò”R˜ÔÜœœIÓ&×+Ñ+¨LÖ9ˆØ	�‰Ž
ñ :ãØ
‡M�M”&×#Ñ#¤bÑ(¸€MÒ=ùs   ƒCCc                  ó@   • [         R                  " [        SU S.5        g )NT)Úprotection_heads_enabledÚprotection_heads)r    r0   r1   )Úheadss    r   Ú_enabler>   3   s   € Ü×Ò”R°dÐPUÑVÕWr   c                  ó0   • [        [        [        5      S-  $ )Núportrait.jpg)r
   r1   r   © r   r   Ú_photorB   7   s   € Ü”bœ)Ó$ ~Ñ5Ð5r   c                  óð  • [         R                  " 0 5      n U S   nSo!UL o3(       do  [        R                  " SU4SX45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=p2U S   nS	S
SS.o!U:H  o3(       do  [        R                  " SU4SX45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=p2U S   nSo!U:H  o3(       do  [        R                  " SU4SX45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=p2U S   nSSSSS.o!U:H  o3(       do  [        R                  " SU4SX45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=p2/ o`S   S   nSosU:H  oˆo(       a  U S   S   n	So©U
:H  o»nU(       Gd  [        R                  " SU4SX745      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  oÆR                  U5        U(       aa  [        R                  " SW4SW	W
45      [        R                  " U	5      [        R                  " U
5      S .-  nS!S"U0-  oæR                  U5        [        R                  " US
5      0 -  nS#S$U0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=n	=pºg )%Nr;   F©Úis©z%(py1)s is %(py4)s©Úpy1Úpy4úassert %(py6)sÚpy6r<   ç      ð?r   ©Ú	intensityÚ	max_headsÚinvert©ú==©z%(py1)s == %(py4)sÚprotection_overlayÚnoneÚprotection_lensé   éZ   g      @ç       @)ÚnumBallsÚradiusÚzoomÚspeedÚprotection_puzzleÚshapeÚmixÚ
num_piecesé   ©z%(py3)s == %(py6)s©Úpy3rK   ú%(py8)sÚpy8©z%(py11)s == %(py14)s©Úpy11Úpy14ú%(py16)sÚpy16úassert %(py19)sÚpy19)	r    Únormalize_configÚ
@pytest_arÚ_call_reprcompareÚ	_safereprÚAssertionErrorÚ_format_explanationr   Ú_format_boolop)r%   Ú@py_assert0Ú@py_assert3Ú@py_assert2Ú@py_format5Ú@py_format7Ú@py_assert1Ú@py_assert5Ú@py_assert4Ú@py_assert10Ú@py_assert13Ú@py_assert12Ú@py_format9Ú@py_format15Ú@py_format17Ú@py_format18Ú@py_format20s                    r   Útest_defaults_match_hecr‡   =   s-  € Ü
×
Ò
˜RÓ
 €CØÐ)Ñ*Ð3¨eÐ3¨eÐ3×3×3×3Ò3Ð*×3×3Ô3Ð*×3×3Ó3¨e×3×3×3×3×3×3Ó3ØÐ!Ñ"ÐY°CÀaÐSXÑ&YÐYÐ&YÑY×Y×Y×YÒYÐ"×Y×YÔYÐ"×Y×YÓYÐ&Y×Y×Y×Y×Y×Y×YÓYØÐ#Ñ$Ð.¨Ð.¨Ñ.×.×.×.Ò.Ð$×.×.Ô.Ð$×.×.Ó.¨×.×.×.×.×.×.Ó.ØÐ Ñ!Ð]°!¸rÈ3ÐY\Ñ%]Ð]Ð%]Ñ]×]×]×]Ò]Ð!×]×]Ô]Ð!×]×]Ó]Ð%]×]×]×]×]×]×]Ó]ÙeÐ"Ñ# GÑ,Ðe°Ðe°Ñ5×e¸#Ð>QÑ:RÐS_Ñ:`ÐeÐdeÐeÐdeÑ:e×e×e×eÕeÐ,×e×eÔeÐ,×e×eÓe°×e×e×e×e×e×e×eÒeÐ:`Ðde×e×eÔeÐ:`×e×eÓeÐde×e×e×e×e×e×e×e×e×e×e×e×e×e×er   c                  óÂ  • [         R                  " SSS0S.5      n / oS   S   nSo2U:H  oDoT(       a  U S   S   nSovU:H  oˆnU(       Gd  [        R                  " SU4S	X#45      [        R                  " U5      [        R                  " U5      S
.-  n	SSU	0-  o¡R                  U
5        U(       aa  [        R                  " SW4SWW45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  oÁR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=n=p‡g )NÚlensrZ   é   )rT   rV   rV   r[   rX   rQ   rc   rd   rf   rg   rh   ri   rl   rm   r   rn   ro   )	r    rp   rq   rr   rs   r   rv   rt   ru   )r%   r|   ry   r}   r~   rw   r   r€   r�   r{   r‚   rƒ   r„   r…   r†   s                  r   Ú+test_partial_config_is_merged_with_defaultsr‹   F   sÝ   € Ü
×
Ò
°FÐPZÐ\]ÈÑ_Ó
`€CÙ]Ð Ñ! *Ñ-Ð]°Ð]°Ñ2×]°sÐ;LÑ7MÈhÑ7WÐ]Ð[]Ð]Ð[]Ñ7]×]×]×]Õ]Ð-×]×]Ô]Ð-×]×]Ó]°×]×]×]×]×]×]×]Ò]Ð7WÐ[]×]×]Ô]Ð7W×]×]Ó]Ð[]×]×]×]×]×]×]×]×]×]×]×]×]×]×]r   ÚrawrT   Úhologramr<   rN   é   rO   éÿÿÿÿrV   rZ   éc   r\   Úmuchor^   r_   Ú	triangulora   é   Úgapé2   c                 ó˜   • [         R                  " [        5         [        R                  " U 5        S S S 5        g ! , (       d  f       g = f©N)ÚpytestÚraisesÚ
ValueErrorr    rp   )rŒ   s    r   Útest_invalid_config_is_rejectedr›   K   s*   € ô 
�Š”zÕ	"Ü	×Ò˜3Ô÷ 
#×	"Ö	"ús	   ›;»
A	c                  ó  • [         R                  " SS0SS0S.5      n / nSo S   o2U;  oDoT(       a  SofU ;  ownU(       Gd>  [        R                  " SU4SX#45      [        R                  " U5      [        R                  " U5      S	.-  nS
SU0-  o‘R                  U	5        U(       a—  [        R                  " SW4SWU 45      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " U 5      (       a  [        R                  " U 5      OSS.-  n
SSU
0-  o±R                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=pgg )NÚevilr   Úx)r<   Ú	__proto__r<   rŸ   )únot in)z%(py3)s not in %(py6)srd   rf   rg   )z%(py11)s not in %(py13)sr%   )rj   Úpy13z%(py15)sÚpy15r   zassert %(py18)sÚpy18)r    rp   rq   rr   rs   r   Ú@py_builtinsÚlocalsÚ_should_repr_global_namerv   rt   ru   )r%   r|   ry   r}   r~   rw   r   r�   r{   r‚   Ú@py_format14Ú@py_format16r„   Ú@py_format19s                 r   Ú(test_unknown_keys_are_ignored_not_storedrª   Z   sÜ   € Ü
×
Ò
°6¸1°+ÈSÐRSÈHÑUÓ
V€CÙKˆ6ÐKÐ/Ñ0ÐKÐ0Ñ0×K°[ÐKÈÑ5K×K×K×KÕKˆ6×K×KÔKˆ6×K×KÓKÐ0×K×K×K×K×K×K×KÒK°[È×K×KÔK°[×K×K×K×K×KÔKÈ×K×K×KÑKÈ×K×K×K×K×K×K×K×K×K×K×K×K×K×Kr   c                  ó@  • [         R                  " [        SS05        [         R                  " SSS05        [         R                  " [        5      S   n SoU:H  o"(       do  [        R
                  " SU4SX45      [        R                  " U 5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =n =p![         R                  " S5      S   n SoU:H  o"(       do  [        R
                  " SU4SX45      [        R                  " U 5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS =n =p![         R                  " [        0 5        [         R                  " S0 5        g )
NrT   Úpuzzlezautre-ecoler‰   rQ   rS   rG   rJ   rK   )	r    r0   r1   Úget_protectionrq   rr   rs   rt   ru   )rw   rx   ry   rz   r{   s        r   Ú test_config_is_stored_per_schoolr®   _   s  € Ü×Ò”RÐ.°Ð9Ô:Ü×Ò�]Ð%9¸6Ð$BÔCÜ×ÒœBÓÐ 4Ñ5ÐA¸ÐA¸ÑA×A×A×AÒAÐ5×A×AÔAÐ5×A×AÓA¸×A×A×A×A×A×AÓAÜ×Ò˜MÓ*Ð+?Ñ@ÐJÀFÐJÀFÑJ×J×J×JÒJÐ@×J×JÔJÐ@×J×JÓJÀF×J×J×J×J×J×JÓJÜ×Ò”R˜ÔÜ×Ò�] BÕ'r   c                  ó  • SSK Jn   U " 5        nUR                  S[        SS45        UR	                  5         S S S 5        [
        R                  " [        5      S   nSo2U:H  oD(       do  [        R                  " SU4S	X#45      [        R                  " U5      [        R                  " U5      S
.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pC[
        R                  " [        0 5        g ! , (       d  f       NÇ= f)Nr   )Úget_dbzMINSERT OR REPLACE INTO school_settings (school_id, key, value) VALUES (?,?,?)Úportal_protectionz{no es jsonrT   rU   rQ   rS   rG   rJ   rK   )Úcore.dbr°   Úexecuter1   Úcommitr    r­   rq   rr   rs   rt   ru   r0   )r°   Úconnrw   rx   ry   rz   r{   s          r   ÚPtest_corrupt_stored_config_falls_back_to_defaults_instead_of_breaking_the_portalr¶   h   sª   € ÝÙ	Œ�TØ�‰ÐdÜÐ-¨}Ð=ô	?à�‰Œ÷ 
ô ×ÒœBÓÐ 4Ñ5Ð?¸Ð?¸Ñ?×?×?×?Ò?Ð5×?×?Ô?Ð5×?×?Ó?¸×?×?×?×?×?×?Ó?Ü×Ò”R˜Õ÷ 
�ús   Ž*C9Ã9
Dc                  ó˜  • [         R                  n SSSS.o" U5      n[         R                  nSSSS.nU" U5      oRU:H  of(       Gdj  [        R                  " SU4SUU45      S[        R
                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U 5      [        R                  " U5      [        R                  " U5      S[        R
                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS =n =n=n=n=n=pE[         R                  " SSSS.5      n	[         R                  nSSSS.o!" U5      oiU:g  o (       Gd"  [        R                  " SU 4SX–45      S[        R
                  " 5       ;   d  [        R                  " U	5      (       a  [        R                  " U	5      OSS[        R
                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS =n =n=p&[         R                  nSSSS.o!" U5      oiU:g  o (       Gd"  [        R                  " SU 4SX–45      S[        R
                  " 5       ;   d  [        R                  " U	5      (       a  [        R                  " U	5      OSS[        R
                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS =n =n=p&[         R                  nSSSS.o!" U5      oiU:g  o (       Gd"  [        R                  " SU 4SX–45      S[        R
                  " 5       ;   d  [        R                  " U	5      (       a  [        R                  " U	5      OSS[        R
                  " 5       ;   d  [        R                  " [         5      (       a  [        R                  " [         5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  n
SSU
0-  n[        [        R                  " U5      5      eS =n =n=p&g )Nr   r   FrM   rL   rQ   )z£%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.config_fingerprint
}(%(py4)s)
} == %(py14)s
{%(py14)s = %(py10)s
{%(py10)s = %(py8)s.config_fingerprint
}(%(py12)s)
}r    )Úpy0Úpy2rI   rK   rg   Úpy10Úpy12rk   zassert %(py16)srm   ç      ø?©ú!=)zX%(py0)s != %(py8)s
{%(py8)s = %(py4)s
{%(py4)s = %(py2)s.config_fingerprint
}(%(py6)s)
}Úbase)r¸   r¹   rI   rK   rg   úassert %(py10)srº   r“   T)
r    Úconfig_fingerprintrq   rr   r¤   r¥   r¦   rs   rt   ru   )r|   rx   r}   Ú@py_assert9Ú@py_assert11r€   Ú@py_assert7rƒ   r„   r¿   r‚   Ú@py_format11s               r   ÚMtest_fingerprint_is_stable_across_int_and_float_and_changes_with_the_settingsrÆ   r   s  € Ü×Ñð R¨a¸aÈ5Ñ Qð RÐÐ QÓRð RÜ	×ÑðRØ+.¸QÈ%ÑPðRÙÐPÓQðRØQñR÷ Rô Rß@QÑ@QôRÐRØQ÷Rò RßKQÉ6÷Rõ Rß9QÑ9QðRŒ1÷ Rö RßHQÉ	ðRŒ1÷ Rò RßHQÉ	ðRÐ÷ Rð RßHQÉ	ðRÐ Q÷ Rð RßHQÉ	ðRÐR÷ Rñ RßKQÉ6÷Rõ Rß9QÑ9QðRÜ	÷Rö RßHQÉ	ðRÜ	÷Rò RßHQÉ	ðRØ÷Rð RßHQÉ	ðRØP÷Rð RßHQÉ	ðRØQ÷R÷ R÷ Rñ Rß>QÑ>Q÷R÷ R÷ Rä×Ò¨cÀÈUÑ SÓT€DÜ×'Ñ'Ð\°cÈÐUZÑ([Ð\Ð'Ð([Ó\Ð\Ð\Ñ\×\×\×\Ó\ˆ4×\×\×\×\×\Õ\ˆ4×\×\×\Ñ\ˆ4×\×\×\×\×\Ö\”1×\×\×\Ñ\”1×\×\Õ\Ð'×\×\Ó\Ð([×\×\Ó\Ð\×\×\×\×\×\×\Õ\Ü×'Ñ'Ð\°cÈÐUZÑ([Ð\Ð'Ð([Ó\Ð\Ð\Ñ\×\×\×\Ó\ˆ4×\×\×\×\×\Õ\ˆ4×\×\×\Ñ\ˆ4×\×\×\×\×\Ö\”1×\×\×\Ñ\”1×\×\Õ\Ð'×\×\Ó\Ð([×\×\Ó\Ð\×\×\×\×\×\×\Õ\Ü×'Ñ'Ð[°cÈÐUYÑ(ZÐ[Ð'Ð(ZÓ[Ð[Ð[Ñ[×[×[×[Ó[ˆ4×[×[×[×[×[Õ[ˆ4×[×[×[Ñ[ˆ4×[×[×[×[×[Ö[”1×[×[×[Ñ[”1×[×[Õ[Ð'×[×[Ó[Ð(Z×[×[Ó[Ð[×[×[×[×[×[×[Ö[r   c                  ó"  • [         R                  " SS05      S   n SoU:H  o"(       do  [        R                  " SU4SX45      [        R                  " U 5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS
=n =p![         R                  " SS05      S   n SoU:H  o"(       do  [        R                  " SU4SX45      [        R                  " U 5      [        R                  " U5      S.-  nSS	U0-  n[        [        R                  " U5      5      eS
=n =p![         R                  " SSS.5      n/ oeS   nSorU:H  oˆo(       a  US   n	So©U
:H  o»o(       a  US   nSoÜU:H  oîn U (       Gdr  [        R                  " SU4SX'45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  oöR                  U5        U(       aË  [        R                  " SW4SW	W
45      [        R                  " U	5      [        R                  " U
5      S.-  nSSU0-  nUR                  U5        U(       ab  [        R                  " SW4SWW45      [        R                  " U5      [        R                  " U5      S.-  nS S!U0-  nUR                  U5        [        R                  " US"5      0 -  nS#S$U0-  n[        [        R                  " U5      5      eS
=n =n=n=n=n=n	=n=n
=n=píg
)%ue   KIS: invert=false difumina el FONDO, true difumina la CARA. Nuestro Â«sin marcarÂ» protege las caras.rP   FÚprotect_invertÚtruerQ   rS   rG   rJ   rK   NTÚfalser¼   rW   )rN   rO   Úprotect_effectÚblurÚprotect_intensityz1.5Úprotect_max_headsÚ4rc   rd   rf   rg   rh   ri   rl   rm   ©z%(py19)s == %(py22)s©ro   Úpy22ú%(py24)sÚpy24r   úassert %(py27)sÚpy27)	r    r!   rq   rr   rs   rt   ru   r   rv   )rw   rx   ry   rz   r{   Úformr|   r}   r~   r   r€   r�   Ú@py_assert18Ú@py_assert21Ú@py_assert20r‚   rƒ   r„   Ú@py_format23Ú@py_format25Ú@py_format26Ú@py_format28s                         r   Ú+test_protect_invert_is_sent_inverted_to_kisrß   {   sÙ  € ä�?Š?˜H eÐ,Ó-Ð.>Ñ?ÐIÀ6ÐIÀ6ÑI×I×I×IÒIÐ?×I×IÔIÐ?×I×IÓIÀ6×I×I×I×I×I×IÓIÜ�?Š?˜H dÐ+Ó,Ð-=Ñ>ÐIÀ'ÐIÀ'ÑI×I×I×IÒIÐ>×I×IÔIÐ>×I×IÓIÀ'×I×I×I×I×I×IÓIÜ�?Š?¨¸1Ñ=Ó>€DÙwÐ Ñ!Ðw VÐw VÑ+×w°Ð5HÑ0IÐwÈUÐwÈUÑ0R×wÐW[Ð\oÑWpÐwÐtwÐwÐtwÑWw×w×w×wÕwÐ!×w×wÔwÐ!×w×wÓw V×w×w×w×w×w×w×wÒwÐ0IÈU×w×wÔwÐ0I×w×wÓwÈU×w×w×w×w×w×w×wÓwÐWpÐtw×w×wÔwÐWp×w×wÓwÐtw×w×w×w×w×w×w×w×w×w×w×w×w×w×wÖwr   c           	   ƒ   óè
  #   • [         R                  n[         R                  " [        5       SU[        5      I S h  v•N n[         R                  " [        5       SU[        5      I S h  v•N n/ oBU:H  oUoe(       a%  UR
                  ow" 5       oˆoh(       a  U S   n	So©U
:H  o»nU(       Gd  [        R                  " SU4SX#45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  nS	S
U0-  oÔR                  U5        U(       aô  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " W5      [        R                  " W5      S.-  oäR                  U5        U(       ab  [        R                  " SW4SW	W
45      [        R                  " U	5      [        R                  " U
5      S.-  nSSU0-  nUR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=n	=pº/ oBR                   oUR"                  nSnUU:H  nUnU(       a4  UR                   o™R                   n[        5       nUR                   nUU:H  nUnU(       Gd4  [        R                  " SU4SUU45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        U(       Ga*  [        R                  " SW4SUW45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U	5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS[        R                  " W5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=n=n	=n=n=nng  GN1 GN7f) NÚtokr   r   rQ   )z%(py2)s == %(py4)sÚfirstÚsecond©r¹   rI   ú%(py6)srK   z>%(py12)s
{%(py12)s = %(py10)s
{%(py10)s = %(py8)s.exists
}()
}©rg   rº   r»   )z%(py15)s == %(py18)s)r¢   r£   z%(py20)sÚpy20r   zassert %(py23)sÚpy23ú.protect)zH%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.parent
}.name
} == %(py9)s)r¹   rI   rK   Úpy9z%(py11)srj   )z‡%(py17)s
{%(py17)s = %(py15)s
{%(py15)s = %(py13)s.parent
}.parent
} == %(py23)s
{%(py23)s = %(py21)s
{%(py21)s = %(py19)s()
}.parent
}rB   )r¡   r¢   Úpy17ro   Úpy21rè   z%(py25)sÚpy25zassert %(py28)sÚpy28)r    ÚDEFAULT_HEADS_CONFIGÚensure_headsrB   r1   Úexistsrq   rr   r¤   r¥   r¦   rs   r   rv   rt   ru   ÚparentÚname)r9   r%   râ   rã   r|   rx   rw   rÂ   rÃ   Ú@py_assert14Ú@py_assert17Ú@py_assert16rz   r{   Ú@py_format13r©   Ú@py_format21Ú@py_format22Ú@py_format24r}   Ú@py_assert8rÄ   rÚ   Ú@py_assert22rØ   Ú@py_format10Ú@py_format12rÝ   Ú@py_format27Ú@py_format29s                                 r   Ú@test_an_already_protected_photo_does_not_call_the_provider_againr  …   sÌ  é € Ü
×
 Ñ
 €CÜ—.’.¤£¨5°#´rÓ:×:€EÜ—>’>¤&£(¨E°3¼Ó;×;€FÙ?�F‰?×?˜uŸ|™|Ð?˜|›~Ñ?�~°#°c±(Ð?¸aÐ?¸a±-×?×?×?Õ?ˆ5×?×?×?×?×?Õ?ˆ5×?×?×?Ñ?ˆ5×?×?×?×?×?Ö?�F×?×?×?Ñ?�F×?×?×?×?×?×?×?×?×?×?Ò?˜u×?×?×?Ñ?˜u×?×?Õ?˜|×?×?Ó?˜~×?×?×?Ð?ž~×?×?Ó?°(¸a×?×?Ô?°(×?×?Ó?¸a×?×?×?×?×?×?×?×?×?×?×?×?×?×?ÙU�<‰<ÐU×ÑÐU 
ÐUÐ 
Ñ*×UÑU¨u¯|©|ÐU×/BÑ/BÐUÄfÃhÐUÀhÇoÁoÐUÐ/BÀoÑ/U×U×U×UÖUÐ 
×U×U×U×U×UÕUˆ5×U×U×UÑUˆ5×U×UÕUˆ<×U×UÓUÐ×U×UÓU 
×U×U×U×U×U×U×UÔUÐ/BÀo×U×U×U×U×UÕU¨u×U×U×UÑU¨u×U×UÕU¨|×U×UÓUÐ/B×U×U×U×U×UÔUÄf×U×U×UÑUÄf×U×UÕUÀh×U×UÓUÀo×U×U×U×U×U×U×U×U×U×U×U×U×U×U×Uò ;Ú;ùs"   ‚9U2»U,¼,U2Á(U/Á)TU2Õ/U2c              ƒ   óœ  #   • [         R                  " [        5       SSSSS.[        5      I S h  v•N n[         R                  " [        5       SSSSS.[        5      I S h  v•N n/ o1U:g  oDoT(       a  U S   nSovU:H  oˆnU(       Gdt  [        R
                  " S	U4S
X45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OSS.-  n	SSU	0-  o£R                  U
5        U(       aa  [        R
                  " SW4SWW45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  oÃR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=p‡/ o2R                  oD" 5       oÿo_(       a  UR                  nU" 5       ow(       + nUnU(       Gdu  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  o£R                  U
5        U(       aŒ  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " W5      [        R                  " U5      S.-  nUR                  U5        [        R                  " US5      0 -  n[        R                  " S5      S-   SU0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=nng  GN— GNi7f)Nrá   rL   r   FrM   rY   r   é   r½   )z%(py2)s != %(py4)sÚaÚbrä   rå   rK   rQ   )z%(py9)s == %(py12)s©rê   r»   ú%(py14)srk   úassert %(py17)srë   z:%(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.exists
}()
}©r¹   rI   rK   zBnot %(py12)s
{%(py12)s = %(py10)s
{%(py10)s = %(py8)s.exists
}()
}ræ   u8   la variante de la configuraciÃ³n anterior debe limpiarsez
>assert %(py16)srm   )r    rð   rB   r1   rq   rr   r¤   r¥   r¦   rs   r   rv   rt   ru   rñ   Ú_format_assertmsg)r9   r  r  r|   rx   rw   rû   rÃ   r   rz   r{   r÷   rƒ   r¨   r…   r}   rÂ   r€   r§   r„   s                       r   ÚDtest_changing_the_settings_regenerates_and_forgets_the_stale_variantr  �   sý  é € Ü�nŠnœV›X u¸CÈaÐ[`Ñ.aÔceÓf×f€AÜ�nŠnœV›X u¸CÈaÐ[`Ñ.aÔceÓf×f€AÙ#�‰6×#�c˜#‘hÐ# !Ð# !‘m×#×#×#Õ#ˆ1×#×#×#×#×#Õ#ˆ1×#×#×#Ñ#ˆ1×#×#×#×#×#Ö#�×#×#×#Ñ#�×#×#×#×#×#×#×#Ô#�h !×#×#Ô#�h×#×#Ó# !×#×#×#×#×#×#×#×#×#×#×#×#×#Ò#Ùd�8‰8Ðdˆ8‹:Ñd�:˜aŸh™hÐd™h›jÐdœ.Ðd˜.×d×d×d×d×d×dÒdˆ1×d×d×dÑdˆ1×d×dÕdˆ8×d×dÓdˆ:×d×d×dÐdŽ:×d×d×d×d×dÑd˜a×d×d×dÑd˜a×d×dÕd˜h×d×dÓd˜j×d×d×d×d×d×d×d×dÓdÐ*d×d×d×d×d×d×d×dÒdò 	gÚfùs"   ‚-O¯O°0OÁ O	Á!M&OÏ	Oc              ƒ   ó’  #   • S nUR                  [        SU5        [        R                  " [        5         [        R
                  " [        5       S[        R                  [        5      I S h  v•N   S S S 5        [        R                  " [        5      n/ oCS   nSoeU:H  owo‡(       a  US   n	So©U
:H  o»o‹(       a  US   nS	oÜU:H  oînU(       Gds  [        R                  " S
U4SXV45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        U(       aË  [        R                  " S
W4SW	W
45      [        R                  " U	5      [        R                  " U
5      S.-  nSSU0-  nUR                  U5        U(       ab  [        R                  " S
W4SWW45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        [        R                  " US5      0 -  nSSU0-  n[!        [        R"                  " U5      5      eS =n=n=n=n=n=n	=n=n
=n=píUR%                  5         UR                  [&        SS5        S nUR                  [        SU5        [        R
                  " [        5       S[        R                  [        5      I S h  v•N   [        R                  oD" [        5      nS nUUL nU(       Gd+  [        R                  " SU4SUU45      S[(        R*                  " 5       ;   d  [        R,                  " [        5      (       a  [        R                  " [        5      OS[        R                  " U5      S [(        R*                  " 5       ;   d  [        R,                  " [        5      (       a  [        R                  " [        5      OS [        R                  " U5      [        R                  " U5      S!.-  nS"S#U0-  n[!        [        R"                  " U5      5      eS =n=n=nng  GNÁ! , (       d  f       GNÆ= f GNw7f)$Nc               Ÿ   ó    #   • [        S5      e7f)Nz8KIS apply_effect failed (HTTP 400): insufficient credits©Ú	Exception©r  Úks     r   ÚboomÚPtest_a_definitive_failure_is_recorded_once_and_a_success_clears_it.<locals>.boom•   s   é € ÜÐRÓSÐSùó   ‚r)   rá   ÚcodeÚ
no_creditsÚtaskr=   Úcountr   rQ   rc   rd   rf   rg   rh   ri   rl   rm   rÐ   rÑ   rÓ   rÔ   r   rÕ   rÖ   r*   r+   c               Ÿ   ó   #   • [        5       $ 7fr—   )r   r  s     r   ÚokÚNtest_a_definitive_failure_is_recorded_once_and_a_success_clears_it.<locals>.ok    s   é € Ü‹}Ðùs   ‚rD   )zP%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.get_status
}(%(py3)s)
} is %(py8)sr   r1   )r¸   r¹   re   Úpy5rg   rÀ   rº   )r-   r    r˜   r™   r  rð   rB   rï   r1   r   Ú
get_statusrq   rr   rs   r   rv   rt   ru   Úundor   r¤   r¥   r¦   )r9   r7   r  Ústr|   ry   r}   r~   rw   r   r€   r�   rØ   rÙ   rÚ   r{   r‚   rƒ   r„   rÛ   rÜ   rÝ   rÞ   r  rÄ   Ú@py_assert6rÅ   s                              r   ÚBtest_a_definitive_failure_is_recorded_once_and_a_success_clears_itr!  ”   sw  é € òTð ×Ñœ˜;¨Ô-Ü	�Š”yÕ	!Ü�nŠnœV›X u¬a×.DÑ.DÄbÓI×IÐI÷ 
"ä	×	Ò	œbÓ	!€BÙTˆf‰:ÐT˜ÐT˜Ñ%×T¨"¨V©*ÐT¸ÐT¸Ñ*?×TÀBÀwÁKÐTÐSTÐTÐSTÑDT×T×T×TÕTˆ:×T×TÔTˆ:×T×TÓT˜×T×T×T×T×T×T×TÓT¨*¸×T×TÔT¨*×T×TÓT¸×T×T×T×T×T×T×TÓTÀKÐST×T×TÔTÀK×T×TÓTÐST×T×T×T×T×T×T×T×T×T×T×T×T×T×TÕTØ×ÑÔØ×ÑœÐ 3°YÔ?òð ×Ñœ˜;¨Ô+Ü
�.Š.œ› 5¬!×*@Ñ*@Ä"Ó
E×EÐEÜ×ÑÐ+Ð¤Ó#Ð+ tÐ+Ð# tÐ+×+×+×+Ô+Ð# t×+×+×+×+×+Õ+Œ9×+×+×+Ñ+Œ9×+×+Õ+Ð×+×+×+×+×+Ô+¤×+×+×+Ñ+¤×+×+Õ+Ð#×+×+Ó+ t×+×+×+×+×+×+×+ò 	J÷ 
"Ö	!úò Fùs<   ‚5Q·7P2Á.P/Á/P2Á3IQËQËE!QÐ/P2Ð2
QÐ<	Qc              ƒ   ó  #   • [         R                  " [        5       [        S5      I S h  v•N nS o2UL oD(       do  [        R
                  " SU4SX#45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pC[        5         UR                  [        SS5        [         R                  " [        5       [        S5      I S h  v•N nS o2UL oD(       do  [        R
                  " SU4SX#45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pCU S	   nS
o2U:H  oD(       do  [        R
                  " SU4SX#45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pCg  GNÖ GN7f)Néè  rD   rF   rG   rJ   rK   r*   Ú r   r   rQ   rS   )r    Úprotected_previewrB   r1   rq   rr   rs   rt   ru   r>   r-   r   )r9   r7   rw   rx   ry   rz   r{   s          r   ÚDtest_nothing_is_called_when_protection_is_off_or_there_is_no_api_keyr&  ¨   s1  é € Ü×$Ò$¤V£X¬r°4Ó8×8Ð@¸DÐ@¸DÐ@×@×@×@Ò@Ð8×@×@Ô@Ð8×@×@Ó@¸D×@×@×@×@×@×@Ó@Ü„IØ×ÑœÐ 3°RÔ8Ü×$Ò$¤V£X¬r°4Ó8×8Ð@¸DÐ@¸DÐ@×@×@×@Ò@Ð8×@×@Ô@Ð8×@×@Ó@¸D×@×@×@×@×@×@Ó@Øˆs‰8Ð�qÐ�q‰=×××Òˆ8××Ôˆ8××Ó�q××××××Ôò	 9ò 9ùs#   ‚(HªH «CHÃ6HÃ7D
HÈHc              ƒ   óê   #   • U R                  S[         35      I S h  v•N R                  5       S   n[        S U 5       5      nUS:X  a  US   OUS   nU R                  U5      I S h  v•N $  NP N7f)Nú/api/portal/photos?code=Úphotosc              3   ó:   #   • U  H  oS    S:X  d  M  Uv •  M     g7f)r#   r@   NrA   ©Ú.0Úps     r   Ú	<genexpr>Ú_preview.<locals>.<genexpr>´   s   é € ÐBš�1 J¡-°>Ñ"A�Q‰Qšùs   ‚’	ÚfullÚurlÚ	thumb_url)Úgetr   ÚjsonÚnext)Úclientr   r)  r-  r1  s        r   Ú_previewr7  ²   sm   é € Ø—J‘JÐ!9¼)¸ÐEÓF×F×LÑLÓNÈxÑX€FÜÑB™ÓBÓB€AØ˜f“nˆ!ˆEŠ(¨!¨K©.€CØ—‘˜C“× Ð ñ Gñ !ùs"   ‚A3žA/ŸAA3Á*A1Á+A3Á1A3Úcontentc                 ó  ^• [         R                  " [        R                  " U 5      5      R	                  S5      R                  S5      n[        UR                  5       5      m[        U4S j[        S5       5       5      $ )Nr   )é    r:  c              3   óh   >^#   • U  H&  m[        U4S  jT 5       5      [        T5      -  v •  M(     g7f)c              3   ó,   >#   • U  H	  oT   v •  M     g 7fr—   rA   )r,  ÚcÚis     €r   r.  Ú(_mean_color.<locals>.<genexpr>.<genexpr>¼   s   øé € Ð&¢2˜a�q–T¢2ùs   ƒN)ÚsumÚlen)r,  r>  Úpxs    @€r   r.  Ú_mean_color.<locals>.<genexpr>¼   s%   ùé € ÐCº(°Q”Ô&¡2Ó&Ó&¬¨R«Ö0º(ùs   „.2r“   )
r   Úopenr   r   ÚconvertÚresizeÚlistÚgetdataÚtupleÚrange)r8  ÚimgrB  s     @r   Ú_mean_colorrL  ¹   sU   ø€ Ü
�*Š*”R—Z’Z Ó(Ó
)×
1Ñ
1°%Ó
8×
?Ñ
?ÀÓ
I€CÜ	ˆc�k‰k‹mÓ	€BÜÔC¼%À¼(ÓCÓCÐCr   c              ƒ   óš	  #   • [        5         [        U 5      I S h  v•N n/ o2R                  nSoTU:H  ofov(       a  UR                  S   nSo˜U	:H  oªnU(       GdS  [        R
                  " SU4SXE45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSS	U0-  oÃR                  U5        U(       aa  [        R
                  " SW
4S
WW	45      [        R                  " U5      [        R                  " U	5      S.-  nSSU0-  oãR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=n=p©[        UR                  5      u  nnn/ nSnUU:„  oDot(       a	  SnUU:  nUnU(       Gd�  [        R
                  " SU4SUU45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  o³R                  U5        U(       a˜  [        R
                  " SW4SUU45      S[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      S.-  nSSU0-  nUR                  U5        [        R                  " US5      0 -  n[        R                   " S5      S -   SU0-  n[        [        R                  " U5      5      eS =n=n=n=n=nnUS!   nS"oGU:H  nU(       do  [        R
                  " SU4S#Xt45      [        R                  " U5      [        R                  " U5      S$.-  nS%S&U0-  n[        [        R                  " U5      5      eS =n=nn[        U 5      I S h  v•N   US!   nS"oGU:H  nU(       d†  [        R
                  " SU4S#Xt45      [        R                  " U5      [        R                  " U5      S$.-  n[        R                   " S'5      S(-   S&U0-  n[        [        R                  " U5      5      eS =n=nng  GN« N¦7f))NéÈ   zcontent-typez
image/webprQ   ©z3%(py4)s
{%(py4)s = %(py2)s.status_code
} == %(py7)sÚr©r¹   rI   Úpy7ú%(py9)srê   ©z%(py12)s == %(py15)s©r»   r¢   ú%(py17)srë   r   úassert %(py20)srç   é–   é<   ©Ú>)z%(py2)s > %(py5)sÚgreen)r¹   r  z%(py7)srR  ©Ú<)z%(py9)s < %(py12)sÚredr  r  rk   z>se sirve el archivo de KIS, no el original ni la marca de aguaz
>assert %(py17)sr   r   rS   rG   rJ   rK   u#   la segunda visita sale de la cachÃ©z
>assert %(py6)s)r>   r7  Ústatus_codeÚheadersrq   rr   r¤   r¥   r¦   rs   r   rv   rt   ru   rL  r8  r
  )r6  r9   rP  r|   rx   r   r}   rw   rÃ   rô   r€   Ú@py_format8rý   r¨   r…   r©   rø   r_  r\  Úbluer~   r   Ú@py_format6r÷   rƒ   ry   rz   r{   s                               r   Ú>test_with_protection_on_the_family_receives_the_protected_filere  ¿   s–  é € Ü„IÜ�vÓ×€AÙM�=‰=ÐM˜CÐM˜CÑ×M A§I¡I¨nÑ$=ÐMÀÐMÀÑ$M×M×M×MÕMˆ=×M×M×M×M×MÕMˆ1×M×M×MÑMˆ1×M×MÕMˆ=×M×MÓM˜C×M×M×M×M×M×M×MÒMÐ$=À×M×MÔMÐ$=×M×MÓMÀ×M×M×M×M×M×M×M×M×M×M×M×M×MÖMÜ" 1§9¡9Ó-Ñ€Cˆ�Ùe�3Ðeˆ5�3‰;×e Ðe˜3 ™8×e×e×eÖeˆ5�3×e×e×e×e×eÕeˆ5×e×e×eÑeˆ5×e×eÕe�3×e×e×e×e×e×e×eÒe˜3 ×e×e×e×e×eÕe˜3×e×e×eÑe˜3×e×eÕe ×e×e×e×e×e×e×e×e×eÒeÐ%e×e×e×e×e×e×e×eØˆs‰8Ð�qÐ�q‰=×××Óˆ8××Ôˆ8××Ó�q××××××ÔÜ
�6Ó
×ÐØˆs‰8Ð?�qÐ?�q‰=×?×?×?Ó?ˆ8×?×?Ô?ˆ8×?×?Ó?�q×?×?×?Ð?Ð?×?×?×?×?×?×?Ò?ò 	ñ
 ùs#   ‚S›SœPSÐ"S	Ð#B$SÓ	Sc              ƒ   ón  #   • [        5         U R                  S[         35      I S h  v•N   US   nSo2U:H  oD(       do  [        R                  " SU4SX#45      [        R
                  " U5      [        R
                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=pCg  NŠ7f)	Nr(  r   r   rQ   rS   rG   rJ   rK   )r>   r3  r   rq   rr   rs   rt   ru   )r6  r9   rw   rx   ry   rz   r{   s          r   ÚKtest_protection_is_lazy_it_only_costs_credits_for_photos_actually_requestedrg  Ê   su   é € Ü„IØ
�*‰*Ð/´	¨{Ð;Ó
<×<Ð<Øˆs‰8Ð�qÐ�q‰=×××Òˆ8××Ôˆ8××Ó�q××××××Ôñ =ùs   ‚&B5¨B3©BB5c              ƒ   ó  #   • [        5         [        R                  " [        R                  " [        U S5      I S h  v•N R                  5      5      n[        R                  " [        R                  " [        U S5      I S h  v•N R                  5      5      n/ oBR                  n[        U5      nSovU:*  oˆo˜(       aX  UR                  n
[        U
5      nSoËU:*  oÝo�(       a4  UR                  n[        U5      oòR                  n[        U5      nUU:  nUn	U	(       GdA  [        R                  " SU4SXg45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nS	S
U0-  nUR                  U5        U(       Gaå  [        R                  " SW4SWW45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " W
5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        U(       GaÈ  [        R                  " SW4SWW45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " W5      [        R                  " U5      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " W5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        [        R                   " US5      0 -  nSSU0-  n[#        [        R$                  " U5      5      eS =n	=n=n=n=n=n=n
=n=n=n=n=n=n=nnUS   n	SnU	U:H  nU(       dp  [        R                  " SU4SU	U45      [        R                  " U	5      [        R                  " U5      S.-  nSSU0-  n[#        [        R$                  " U5      5      eS =n	=nng  GNË GNˆ7f)Nr0  Úthumbr#  ià  ©ú<=)zK%(py7)s
{%(py7)s = %(py2)s(%(py5)s
{%(py5)s = %(py3)s.size
})
} <= %(py10)sÚmax)r¹   re   r  rR  rº   z%(py12)sr»   )zQ%(py19)s
{%(py19)s = %(py14)s(%(py17)s
{%(py17)s = %(py15)s.size
})
} <= %(py22)s)rk   r¢   rë   ro   rÒ   rÓ   rÔ   r]  )z�%(py31)s
{%(py31)s = %(py26)s(%(py29)s
{%(py29)s = %(py27)s.size
})
} < %(py38)s
{%(py38)s = %(py33)s(%(py36)s
{%(py36)s = %(py34)s.size
})
})Úpy26rÖ   Úpy29Úpy31Úpy33Úpy34Úpy36Úpy38z%(py40)sÚpy40r   zassert %(py43)sÚpy43r   r   rQ   rS   rG   rJ   rK   )r>   r   rD  r   r   r7  r8  r   rl  rq   rr   r¤   r¥   r¦   rs   r   rv   rt   ru   )r6  r9   r0  ri  r|   r~   r   rÂ   rû   rw   rö   rØ   rÙ   rÚ   Ú@py_assert28Ú@py_assert30Ú@py_assert35Ú@py_assert37Ú@py_assert32rÅ   r÷   rÛ   rÜ   Ú@py_format39Ú@py_format41Ú@py_format42Ú@py_format44rx   ry   rz   r{   s                                  r   ÚCtest_thumb_and_full_are_different_sizes_of_the_same_protected_photor  Ð   s  é € Ü„IÜ�:Š:”b—j’j¬°¸Ó(@×"@×!IÑ!IÓJÓK€DÜ�JŠJ”r—z’z¬°&¸'Ó)B×#B×"KÑ"KÓLÓM€EÙa�y‰yÐaŒ3ˆy‹>Ða˜TÐa˜TÑ!×a¨%¯*©*Ða¤c¨*£oÐa¸Ða¸Ñ&<×aÀUÇZÁZÐaÄÀZÃÐa×W`ÑW`ÐaÔSVÐW`ÓSaÐaÀÐSaÑAa×a×a×aÖaˆ>×a×a×a×a×aÕaŒ3×a×a×aÑaŒ3×a×a×a×a×aÖaˆt×a×a×aÑaˆt×a×aÕaˆy×a×aÓaˆ>×a×aÓa˜T×a×a×a×a×a×a×aÔa o¸×a×a×a×a×aÕa¤c×a×a×aÑa¤c×a×a×a×a×aÖa¨%×a×a×aÑa¨%×a×aÕa¨*×a×aÓa o×a×aÓa¸×a×a×a×a×a×a×aÔaÀÐSa×a×a×a×a×aÕaÄ×a×a×aÑaÄ×a×a×a×a×aÖaÀU×a×a×aÑaÀU×a×aÕaÀZ×a×aÓaÀ×a×a×a×a×aÔaÔSV×a×a×aÑaÔSV×a×a×a×a×aÖaÐW[×a×a×aÑaÐW[×a×aÕaÐW`×a×aÓaÐSa×a×a×a×a×a×a×a×a×a×a×a×a×a×a×aÖaØˆs‰8Ð�qÐˆ8�q‰=×××Óˆ8�q××Ôˆ8××Ó�q××××××Õò #AÚ#Bùs#   ‚:X¼X½AXÂX
ÂVXØ
Xc           	   ƒ   ó~	  #   • [        5         S nUR                  [        SU5        UR                  SS5        [        U 5      I S h  v•N nUR                  nSoeU:H  ow(       dº  [
        R                  " SU4SXV45      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      [
        R                  " U5      S	.-  nS
SU0-  n	[        [
        R                  " U	5      5      eS =n=pv[        R                  " [        R                   " UR"                  5      5      n
U
R$                  n['        U5      nSoÆU:*  oÝ(       Gd"  [
        R                  " SU4SXl45      S[        R                  " 5       ;   d  [
        R                  " [&        5      (       a  [
        R                  " [&        5      OSS[        R                  " 5       ;   d  [
        R                  " U
5      (       a  [
        R                  " U
5      OS[
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=pÜUR"                  n[)        5       nUR*                  oÌ" 5       nUU:g  ow(       Gd8  [
        R                  " SU4SUU45      S[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS[
        R                  " U5      S[        R                  " 5       ;   d  [
        R                  " [(        5      (       a  [
        R                  " [(        5      OS[
        R                  " U5      [
        R                  " U5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=n=nn[,        R.                  " [0        5      S   nSnUU:H  o»(       dp  [
        R                  " SU4SUU45      [
        R                  " U5      [
        R                  " U5      S.-  nSSU0-  n[        [
        R                  " U5      5      eS =n=p·g  GNs7f) Nc               Ÿ   ó    #   • [        S5      e7f)Nz"KIS apply_effect failed (HTTP 500)r  r  s     r   r  Ú\test_when_kis_fails_the_fallback_is_the_watermarked_preview_never_the_original.<locals>.boomÛ   s   é € ÜÐ<Ó=Ð=ùr  r)   zutils.retry.RETRY_ATTEMPTSr   rN  rQ   ©z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)srP  ©r¸   r¹   r  úassert %(py7)srR  r#  rj  )zJ%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.size
})
} <= %(py8)srl  rK  )r¸   rH   re   r  rg   rÀ   rº   r½   )z%(py2)s
{%(py2)s = %(py0)s.content
} != %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s()
}.read_bytes
}()
}rB   )r¸   r¹   rI   rK   rg   rº   zassert %(py12)sr»   r  r=   rS   rG   rJ   rK   )r>   r-   r    r7  r`  rq   rr   r¤   r¥   r¦   rs   rt   ru   r   rD  r   r   r8  r   rl  rB   Ú
read_bytesr   r  r1   )r6  r9   r7   r  rP  r|   r~   rx   rd  rb  rK  ry   rÄ   r   r‚   rÅ   r}   rÂ   r÷   rw   rz   r{   s                         r   ÚNtest_when_kis_fails_the_fallback_is_the_watermarked_preview_never_the_originalr‡  Ø   s�  é € Ü„Iò>ð ×Ñœ˜;¨Ô-Ø×ÑÐ4°aÔ8Ü�vÓ×€AØ�=‰=Ð˜CÐ˜CÑ×××Òˆ=×××××Õˆ1×××Ñˆ1××Õˆ=××Ó˜C××××××ÓÜ
�*Š*”R—Z’Z §	¡	Ó*Ó
+€CØ�x‰xÐ Œ3ˆx‹=Ð ˜DÐ ˜DÑ × × × Ó ˆ=× × × × × Õ Œ3× × × Ñ Œ3× × × × × Ö ˆs× × × Ñ ˆs× × Õ ˆx× × Ó ˆ=× × Ó ˜D× × × × × × Õ Ø�9‰9Ð/œ›Ð/˜×-Ñ-Ð/Ð-Ó/Ð/ˆ9Ð/Ñ/×/×/×/Ó/ˆ9Ð/×/×/×/×/×/Õ/ˆ1×/×/×/Ñ/ˆ1×/×/Õ/ˆ9×/×/×/×/×/Ô/œ×/×/×/Ñ/œ×/×/Õ/˜×/×/Ó/Ð-×/×/Ó/Ð/×/×/×/×/×/×/×/Ð/Ü×Ò¤Ó# FÑ+Ð6¨wÐ6Ð+¨wÑ6×6×6×6Ò6Ð+¨w×6×6Ô6Ð+×6×6Ó6¨w×6×6×6×6×6×6Ô6ò 	ùs   ‚AR=ÁR:ÁQ3R=c              ƒ   óÂ
  #   • [        U 5      I S h  v•N n/ o2R                  nSoTU:H  ofov(       a  US   nSo˜U	:H  oªnU(       GdS  [        R                  " SU4SXE45      S[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSS	U0-  oÃR                  U5        U(       aa  [        R                  " SW
4S
WW	45      [        R                  " U5      [        R                  " U	5      S.-  nSSU0-  oãR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=n=p©[        R                  n[        R                  oRR                   nU" U5      o„" U5      oªR"                  nSnU" U5      nUR$                  nU" 5       n['        U5      n[)        U5      nSnUU:„  nU(       Gd  [        R                  " SU4SUU45      0 SS[        R
                  " 5       ;   d  [        R                  " [(        5      (       a  [        R                  " [(        5      OS_SS[        R
                  " 5       ;   d  [        R                  " [&        5      (       a  [        R                  " [&        5      OS_SS[        R
                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS_S[        R                  " U5      _SS[        R
                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OS_S[        R                  " U5      _SS[        R
                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS_S[        R                  " U5      _S [        R                  " U5      _S![        R                  " U
5      _S"[        R                  " U5      _S#[        R                  " U5      _S[        R                  " U5      _S$[        R                  " U5      _S%[        R                  " U5      _S&[        R                  " U5      _S'[        R                  " U5      _S([        R                  " U5      0E-  nS)S*U0-  n[        [        R                  " U5      5      eS =n=n=n=n=n
=n=n=n=n=n=n=n=nng  GNK7f)+NrN  r   r   rQ   rO  rP  rQ  rS  rê   rT  rU  rV  rë   rW  rç   r   é   rZ  )a`  %(py28)s
{%(py28)s = %(py0)s(%(py26)s
{%(py26)s = %(py1)s(%(py24)s
{%(py24)s = %(py22)s
{%(py22)s = %(py20)s
{%(py20)s = %(py16)s
{%(py16)s = %(py14)s
{%(py14)s = %(py4)s
{%(py4)s = %(py2)s.open
}(%(py12)s
{%(py12)s = %(py7)s
{%(py7)s = %(py5)s.BytesIO
}(%(py10)s
{%(py10)s = %(py8)s.content
})
})
}.convert
}(%(py18)s)
}.getdata
}()
})
})
} > %(py31)sr¸   rA  rH   Úsetr¹   r   rI   r  r   rR  rg   rº   r»   rk   rm   r£   rÒ   rÔ   rm  rî   ro  zassert %(py33)srp  )r7  r`  rq   rr   r¤   r¥   r¦   rs   r   rv   rt   ru   r   rD  r   r   r8  rE  rH  rŠ  rA  )r6  r9   rP  r|   rx   r   r}   rw   rÃ   rô   r€   rb  rý   r¨   r…   r©   rø   rÂ   Ú@py_assert15rõ   Ú@py_assert19rÙ   Ú@py_assert23Ú@py_assert25Ú@py_assert27rw  Ú@py_assert29Ú@py_format32Ú@py_format34s                                r   ÚQtest_with_protection_off_the_watermarked_preview_is_served_and_no_credit_is_spentr“  è   sÜ  é € Ü�vÓ×€AÙ1�=‰=Ð1˜CÐ1˜CÑ×1 C¨¡HÐ1°Ð1°¡M×1×1×1Õ1ˆ=×1×1×1×1×1Õ1ˆ1×1×1×1Ñ1ˆ1×1×1Õ1ˆ=×1×1Ó1˜C×1×1×1×1×1×1×1Ò1 H°×1×1Ô1 H×1×1Ó1°×1×1×1×1×1×1×1×1×1×1×1×1×1Ö1Ü—:‘:ÐTœbŸj™jÐT¯©ÐT™j¨Ó3ÐT�:Ð3Ó4ÐT×<Ñ<ÐT¸UÐTÑ<¸UÓCÐTÐC×KÑKÐTÑKÓMÐTŒsÐMÓNÐTŒ3ÐNÓOÐTÐRTÐTÐOÐRTÑT×T×T×TÔTÐOÐRT×T×T×T×T×T×TŒ3×T×T×TÑTŒ3×T×T×T×T×T×TÐTŒs×T×T×TÑTŒs×T×T×T×T×T×TÐT”5×T×T×TÑT”5×T×T×T�:×T×T×T×T×TÖTœb×T×T×TÑTœb×T×T×T˜j×T×T×T×T×TÖT¨×T×T×TÑT¨×T×T×T¨×T×TÕTÐ3×T×TÕTÐ4×T×TÕTÐ<×T×TÕT¸U×T×TÕTÐC×T×TÕTÐK×T×TÕTÐM×T×TÕTÐN×T×TÕTÐO×T×TÕTÐRT×T×T×T×T×T×T×T×T×TÓTò 	ùs   ‚U‘U’UUc              ƒ   ó6  #   • [        SS9  [        U 5      I S h  v•N   [        SS9  [        U 5      I S h  v•N   / o!S   nSoCU:H  oUoe(       a   US    Vs1 s H  owS   iM	     nnSS	1o˜U	:H  oªnU(       Gd  [        R                  " S
U4SX445      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  oÂR                  U5        U(       aa  [        R                  " S
W
4SWW	45      [        R                  " U5      [        R                  " U	5      S.-  nSSU0-  oâR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=n=p©g  GNt GN[s  snf 7f)NrL   )rN   rY   r   r  r   rÍ   z1.0z2.0rQ   rc   rd   rf   rg   rh   ri   rl   rm   r   rn   ro   )	r>   r7  rq   rr   rs   r   rv   rt   ru   )r6  r9   r|   ry   r}   r~   rw   r8   r   r€   r�   r{   r‚   rƒ   r„   r…   r†   s                    r   Ú7test_changing_the_heads_settings_changes_what_is_servedr•  î   s   é € Ü�cÒÜ
�6Ó
×ÐÜ�cÒÜ
�6Ó
×ÐÙ]ˆs‰8Ð]�qÐ]�q‰=×]¸cÀ'ºlÓKºl¸Ð 3Ô4¹lÐ]ÐKÐPUÐW\È~Ð]È~Ñ]×]×]×]Õ]ˆ8×]×]Ô]ˆ8×]×]Ó]�q×]×]×]×]×]×]×]Ò]ÐKÈ~×]×]Ô]ÐK×]×]Ó]È~×]×]×]×]×]×]×]×]×]×]×]×]×]×]ò âùÚKùs2   ‚FšF›F¶F·FÁFÁ#D,FÆFÆFc              ƒ   ó  #   • [        5         [        U 5      I S h  v•N   S[         S[         S3S[         S34 H¾  nU R	                  U5      I S h  v•N o3R
                  nSoTU:H  of(       d„  [        R                  " SU4SXE45      [        R                  " U5      [        R                  " U5      [        R                  " U5      S	.-  nS
SU0-  n[        [        R                  " U5      5      eS =n=n=peMÀ     g  Nâ N­7f)Nz/photos/z/cam1/z/.protect/portrait_heads_x.jpgz/thumbs/z/x.webpi”  rQ   ©z3%(py3)s
{%(py3)s = %(py1)s.status_code
} == %(py6)s©rH   re   rK   úassert %(py8)srg   )r>   r7  r1   r   r3  r`  rq   rr   rs   rt   ru   )	r6  r9   Úpathrw   ry   r}   r~   r{   r‚   s	            r   Ú4test_protected_files_never_leak_through_a_direct_urlr›  ö   s¹   é € Ü„IÜ
�6Ó
×ÐØœB˜4˜v¤i [Ð0NÐOÐS[Ô\^Ð[_Ð_fÐQgÓhˆØ—j‘j Ó&×&Ð:×3Ñ3Ð:°sÐ:°sÑ:×:×:×:Ò:Ð3×:×:Ô:Ð&×:×:Ó:Ð3×:×:Ó:°s×:×:×:×:×:×:×:ò iñ á&ùs"   ‚D›C>œ6DÁD ÁB,DÄ Dc              ƒ   ó2  #   • [        5         [        U 5      I S h  v•N nUR                  R                  R                  R                  [        S5      nU R                  U S35      I S h  v•N oDR                  nSoeU:H  ow(       d„  [        R                  " SU4SXV45      [        R                  " U5      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  n	[        [        R                  " U	5      5      eS =n=n=pvg  N÷ N©7f)	NzOTH-2002z?exp=1&sig=xé“  rQ   r—  r˜  r™  rg   )r>   r7  Úrequestr1  rš  Úreplacer   r3  r`  rq   rr   rs   rt   ru   )
r6  r9   rP  r1  rw   ry   r}   r~   r{   r‚   s
             r   Ú>test_a_school_cannot_be_served_another_schools_protected_photor   ý   s²   é € Ü„IÜ�vÓ×€AØ
�)‰)�-‰-×
Ñ
×
$Ñ
$¤Y°
Ó
;€CØ—*‘* ˜u LÐ1Ó2×2ÐF×?Ñ?ÐFÀ3ÐFÀ3ÑF×F×F×FÒFÐ?×F×FÔFÐ2×F×FÓFÐ?×F×FÓFÀ3×F×F×F×F×F×FÖFñ 	á2ùs#   ‚D›DœADÁ+DÁ,B(DÄDc              ƒ   óF
  #   • SSSSSSS.SS0S	.0nU R                  S
X1S9I S h  v•N n/ oTR                  nSovU:H  oˆo˜(       a   UR                  5       S   S   S   n
SoºU:H  oÌn	U	(       GdT  [        R                  " SU4SXg45      S[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  oåR                  U5        U(       ab  [        R                  " SW4SW
W45      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  nUR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n	=n=n=n=n=n
=pËU R                  S
US9I S h  v•N R                  5       nUS   S   S   n	SoiU:H  nU(       do  [        R                  " SU4SX–45      [        R                  " U	5      [        R                  " U5      S.-  nS S!U0-  n[        [        R                  " U5      5      eS =n	=nnU R                  S
SS"S#00US9I S h  v•N nUR                  nS$nUU:H  of(       d»  [        R                  " SU4S%UU45      S&[
        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS&[        R                  " U5      [        R                  " U5      S'.-  nS(S)U0-  n[        [        R                  " U5      5      eS =n=nnU R                  S
X2S9I S h  v•N o™R                  nS*nUU:H  nU(       d…  [        R                  " SU4S+UU45      [        R                  " U	5      [        R                  " U5      [        R                  " U5      S,.-  nS-S.U0-  n[        [        R                  " U5      5      eS =n	=n=nnU R                  S
US9I S h  v•N o™R                  nSnUU:H  nU(       d…  [        R                  " SU4S+UU45      [        R                  " U	5      [        R                  " U5      [        R                  " U5      S,.-  nS-S.U0-  n[        [        R                  " U5      5      eS =n	=n=nnU R                  S
S0 0US9I S h  v•N   g  GNì GN2 GN} GNŽ NÒ N7f)/NÚ
protectionTr‰   r¼   r“   rM   rZ   rŽ   )r;   rT   r<   rV   ú/api/admin/protection©r4  ra  rN  r<   rO   rQ   rO  rP  rQ  rS  rê   rT  rU  rV  rë   r   rW  rç   ©ra  rV   rS   rG   rJ   rK   rT   rž   é�  rƒ  Úbadr„  r…  rR  r�  r—  r˜  r™  rg   )Úputr`  r4  rq   rr   r¤   r¥   r¦   rs   r   rv   rt   ru   r3  )r6  Úadmin_headersÚdirector_headersÚbodyrP  r|   rx   r   r}   rw   rÃ   rô   r€   rb  rý   r¨   r…   r©   rø   Úgotry   rz   r{   r§  r~   rd  r‚   s                              r   Ú8test_protection_api_roundtrip_validation_and_permissionsr­    sb  é € Ø°tÐSYØ=@ÈqÐ\`Ñ/aØ/9¸1¨oñ?ð @€Dð �j‰jÐ0°tˆjÐS×S€AÙ`�=‰=Ð`˜CÐ`˜CÑ×` A§F¡F£H¨\Ñ$:Ð;MÑ$NÈ{Ñ$[Ð`Ð_`Ð`Ð_`Ñ$`×`×`×`Õ`ˆ=×`×`×`×`×`Õ`ˆ1×`×`×`Ñ`ˆ1×`×`Õ`ˆ=×`×`Ó`˜C×`×`×`×`×`×`×`Ò`Ð$[Ð_`×`×`Ô`Ð$[×`×`Ó`Ð_`×`×`×`×`×`×`×`×`×`×`×`×`×`×`Ø—‘Ð3¸]�ÐK×K×
QÑ
QÓ
S€CØˆ|ÑÐ.Ñ/°
Ñ;Ð@¸qÐ@¸qÑ@×@×@×@Ó@Ð;×@×@Ô@Ð;×@×@Ó@¸q×@×@×@×@×@×@Ô@Ø—
‘
Ð2¸,ÐI]Ð_bÐHcÐ9dÐn{�
Ð|×
|€CØ�?‰?Ð!˜cÐ!ˆ?˜cÑ!×!×!×!Ò!ˆ?˜c×!×!×!×!×!Õ!ˆ3×!×!×!Ñ!ˆ3×!×!Õ!ˆ?×!×!Ó!˜c×!×!×!×!×!×!Ô!Ø—*‘*Ð4¸4�*ÐZ×ZÐn×gÑgÐnÐknÐnÐgÐknÑn×n×n×nÓnÐgÐkn×n×nÔnÐZ×n×nÓnÐg×n×nÓnÐkn×n×n×n×n×n×nÖnØ—*‘*Ð4Ð>N�*ÐO×OÐc×\Ñ\ÐcÐ`cÐcÐ\Ð`cÑc×c×c×cÓcÐ\Ð`c×c×cÔcÐO×c×cÓcÐ\×c×cÓcÐ`c×c×c×c×c×c×cÖcØ
�*‰*Ð,°LÀ"Ð3EÈ}ˆ*Ð
]×]Ñ]ò 	TâKâ
|âZÙOÙ]ùsn   ‚#T!¥T¦F<T!Ç"TÇ#B7T!ÊTÊC1T!ÎTÎB=T!Ñ
TÑC T!ÔTÔT!ÔT!ÔT!ÔT!ÔT!ÔT!c              ƒ   óÎ  #   • U R                  SSSSS0S.0US9I S h  v•N   U R                  S[         35      I S h  v•N R                  5       S   n/ o2S	   nSoTU:H  ofov(       a  US   S   nSo˜U	:H  oªnU(       Gd  [        R
                  " S
U4SXE45      [        R                  " U5      [        R                  " U5      S.-  nSSU0-  oÃR                  U5        U(       aa  [        R
                  " S
W
4SWW	45      [        R                  " U5      [        R                  " U	5      S.-  nSSU0-  oãR                  U5        [        R                  " US5      0 -  nSSU0-  n[        [        R                  " U5      5      eS =n=n=n=n=n=n=p©[        U5      n1 SkoTU:H  of(       Gd  [        R
                  " S
U4SXE45      S[        R                  " 5       ;   d  [        R                  " [        5      (       a  [        R                  " [        5      OSS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nSSU0-  n[        [        R                  " U5      5      eS =n=peU R                  SS0 0US9I S h  v•N   g  GN¿ GN¢ N7f)Nr£  r¢  r¬   ra   é   )rT   r^   r¤  r(  ÚoverlayrQ   rc   rd   rf   rg   rh   ri   rl   rm   r   rn   ro   >   r‰   r=   r¬   r°  )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)srŠ  Úprot)r¸   rH   re   rK   r™  )r¨  r3  r   r4  rq   rr   rs   r   rv   rt   ru   rŠ  r¤   r¥   r¦   )r6  r©  r±  r|   ry   r}   r~   rw   r   r€   r�   r{   r‚   rƒ   r„   r…   r†   s                    r   Ú=test_portal_receives_the_overlay_config_but_not_the_internalsr²    sÚ  é € Ø
�*‰*Ð,°LÐYaØ+7¸Ð*;ñC=ð 4>ØGTð ð V÷ Vð Và—*‘*Ð7¼	°{ÐCÓD×D×JÑJÓLÈ\ÑZ€DÙL�	‰?ÐL˜hÐL˜hÑ&×L¨4°©>¸,Ñ+GÐLÈ1ÐLÈ1Ñ+L×L×L×LÕLˆ?×L×LÔLˆ?×L×LÓL˜h×L×L×L×L×L×L×LÒLÐ+GÈ1×L×LÔLÐ+G×L×LÓLÈ1×L×L×L×L×L×L×L×L×L×L×L×L×LÖLÜˆt‹9Ð>Ò>Ð>Ð>Ñ>×>×>×>Ó>ˆ9×>×>×>×>×>Õ>Œ3×>×>×>Ñ>Œ3×>×>×>×>×>Ö>ˆt×>×>×>Ñ>ˆt×>×>Õ>ˆ9×>×>Ó>Ð>×>×>×>×>×>×>Ó>Ø
�*‰*Ð,°LÀ"Ð3EÈ}ˆ*Ð
]×]Ñ]òVâDñ ^ùs2   ‚K%žKŸK%¾K ¿JK%ËK#ËK%Ë K%Ë#K%c              ƒ   óF  #   • U R                  SSSS00US9I S h  v•N   U R                  SUS9I S h  v•N R                  5       S   n/ o2oB(       a  US	   S
   S   nSoeUL ownU(       Gd	  SSS[        R                  " 5       ;   d  [
        R                  " U5      (       a  [
        R                  " U5      OS0-  oƒR                  U5        U(       aa  [
        R                  " SW4SWW45      [
        R                  " U5      [
        R                  " U5      S.-  n	SSU	0-  o£R                  U
5        [
        R                  " US	5      0 -  nSSU0-  n[        [
        R                  " U5      5      eS =n=n=n=pvU R                  SS0 0US9I S h  v•N   g  GN~ GNi N7f)Nr£  r¢  r;   Tr¤  z)/api/admin/audit?action=protection.updater¥  Úeventsr   Údetailsr=   ú%(py2)sr¹   ÚevrD   )z%(py5)s is %(py8)s)r  rg   z%(py10)srº   zassert %(py13)sr¡   )r¨  r3  r4  r¤   r¥   rq   r¦   rs   r   rr   rv   rt   ru   )r6  r©  r·  r|   rw   r~   rÄ   r   Ú@py_format3r‚   rÅ   rþ   r§   s                r   Ú!test_protection_change_is_auditedr¹    s  é € Ø
�*‰*Ð,°LÐC]Ð_cÐBdÐ3eÐo|ˆ*Ð
}×}Ð}Ø—
‘
ÐFÐP]�
Ð^×
^×	dÑ	dÓ	fÐgoÑ	p€BÚ3�2�"�Q‘%˜	Ñ" 7Ñ+Ð3¨tÐ3¨tÐ3×3×3×3×3×3×3Ô3ˆ2×3×3×3Ñ3ˆ2×3×3×3Ñ3Ž2×3×3Ó3Ð+¨t×3×3Ô3Ð+×3×3Ó3¨t×3×3×3×3×3×3×3×3×3×3×3×3×3Ð3Ø
�*‰*Ð,°LÀ"Ð3EÈ}ˆ*Ð
]×]Ñ]ò ~Ú
^á]ùs2   ‚F!›FœF!³F´EF!ÆFÆF!ÆF!ÆF!c              ƒ   óÂ	  #   • SSK Jn  [        5         [        U 5      I S h  v•N   [	        [
        [        5      n[        US-  R                  S5      5      n[        [        R                  " [        5       S5      R                  R                  S5      5      n/ odot(       a  UnU(       Gd	  SSS	[        R                  " 5       ;   d  [        R                   " U5      (       a  [        R"                  " U5      OS	0-  o†R%                  U5        U(       aa  S
SS[        R                  " 5       ;   d  [        R                   " U5      (       a  [        R"                  " U5      OS0-  o–R%                  U	5        [        R&                  " US5      0 -  n
SSU
0-  n[)        [        R*                  " U5      5      eS =pvUS-  nUR-                  [/        5       5        US-  S-  nUR-                  S5        [        R                  " US5      nUR                  R1                  SSS9  UR-                  S5        UR3                  5         UR5                  5         / omR6                  oÿ" 5       nU(       + nUnU(       a  UR6                  nU" 5       nU(       + nUnU(       Gd^  SS[        R                  " 5       ;   d  [        R                   " U5      (       a  [        R"                  " U5      OS[        R"                  " U5      [        R"                  " U5      S.-  o¶R%                  U5        U(       aŒ  SS[        R                  " 5       ;   d  [        R                   " U5      (       a  [        R"                  " U5      OS[        R"                  " W5      [        R"                  " W5      S.-  nUR%                  U5        [        R&                  " US5      0 -  nSSU0-  n[)        [        R*                  " U5      5      eS =n=n=n=n=n=n=nnS U 5       n[9        U5      oÿ(       d¹  [        R:                  " S5      S-   S [        R                  " 5       ;   d  [        R                   " [8        5      (       a  [        R"                  " [8        5      OS [        R"                  " U5      [        R"                  " U5      S!.-  n	[)        [        R*                  " U	5      5      eS =pog  GN»7f)"Nr   )Úcleanup_serviceré   zportrait_heads_*r$  z
portrait.*r¶  r¹   Ú	protectedz%(py4)srI   Úpreviewsr…  rR  ztemporal.jpgztemporal_heads_aaaaaaaaaa.jpgó   xú.wm.1000.webpT)ÚparentsÚexist_okú>not %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s.exists
}()
}Útmp_protr	  úBnot %(py13)s
{%(py13)s = %(py11)s
{%(py11)s = %(py9)s.exists
}()
}Útmp_prev©rê   rj   r¡   r  rë   c              3   ó@   #   • U  H  oR                  5       v •  M     g 7fr—   )rñ   r+  s     r   r.  ÚYtest_cleanup_drops_protected_and_preview_copies_whose_original_is_gone.<locals>.<genexpr>:  s   é € Ð-¢9˜a�x‰x�zˆz¢9ùs   ‚u/   las copias de fotos que SÃ� existen no se tocanz.
>assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úall)r¸   r¹   rI   )Úservicesr»  r>   r7  r
   r1   r   rG  r2   r   Úmirror_pathrB   rò   r¤   r¥   rq   r¦   rs   r   rv   rt   ru   Úwrite_bytesr   Úmkdirr3   Úprune_orphan_derivativesrñ   rÉ  r
  )r6  r9   r»  Úfolderr¼  r½  r|   rw   r¸  rz   rd  rb  ÚtmprÃ  rÅ  rx   r}   rÄ   r   r�   rô   rƒ   r¨   r…   s                           r   ÚFtest_cleanup_drops_protected_and_preview_copies_whose_original_is_gonerÑ  '  sÐ  é € Ý(Ü„IÜ
�6Ó
×ÐÜœœIÓ&€FÜ�f˜zÑ)×/Ñ/Ð0BÓCÓD€IÜ”M×-Ò-¬f«h¸Ó;×BÑB×GÑGÈÓUÓV€HÚ!�9˜×!×!×!×!×!×!Ó!ˆ9×!×!×!Ñ!ˆ9×!×!×!Ñ!Ž9×!×!×!×!×!Ò!˜×!×!×!Ñ!˜×!×!×!×!×!×!×!×!×!×!×!Ô!à
�>Ñ
!€CØ‡O�O”K“MÔ"Ø˜
Ñ"Ð%DÑD€HØ×Ñ˜ÔÜ×(Ò(¨¨oÓ>€HØ‡O�O×Ñ $°ÐÑ6Ø×Ñ˜ÔØ‡J�J„LØ×,Ñ,Ô.Ù:�‰Ð:ˆÓ Ð:Ð Ô Ð:Ð Ð:Ö ¨¯©Ð:©Ó):Ð:Ð):Ô%:Ð:Ð%:×:×:×:×:×:×:Ò:ˆx×:×:×:Ñ:ˆx×:×:Õ:ˆ×:×:Ó:Ð ×:×:×:Ð:Ö ×:×:×:×:×:Ñ:¨×:×:×:Ñ:¨×:×:Õ:¨×:×:Ó:Ð):×:×:×:×:×:×:×:×:×:×:×:×:×:Ñ:Ù-¡9Ó-Ð`Œ3Ð-Ó-Ð`Õ-×`×`Ð/`×`×`×`×`×`×`Œ3×`×`×`Ñ`Œ3×`×`Õ`Ð-×`×`Ó`Ð-×`×`×`×`×`Ó`ò! ùs   ‚S¡S¢R;Sc           
      ó4	  • UR                  [        SU S-  5        UR                  [        SU S-  5        U S-  S-  S-  S-  nUR                  SS	9  US
-  nUR                  [	        5       5        US-  R                  5         US-  S-  nUR                  S5        [
        R                  " US5      nUR                  R                  SS	9  UR                  S5        [
        R                  nSnSnS
o–" XxU	5      n
SoºUL oÌ(       Gd  [        R                  " SU4SX«45      S[        R                  " 5       ;   d  [        R                  " [
        5      (       a  [        R                  " [
        5      OS[        R                  " U5      [        R                  " U5      [        R                  " U5      [        R                  " U	5      [        R                  " U
5      [        R                  " U5      S.-  nSSU0-  n[        [        R                   " U5      5      eS =n=n=n=n	=n
=pË/ odR"                  ow" 5       oˆ(       + o™où(       a>  UR"                  nU" 5       o»(       + nUnU(       a  UR"                  nU" 5       nU(       + nUnU(       Gdó  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " U5      [        R                  " U5      S.-  nUR%                  U5        U	(       Ga  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " W5      [        R                  " U5      S.-  nUR%                  U5        W(       aŒ  SS[        R                  " 5       ;   d  [        R                  " U5      (       a  [        R                  " U5      OS[        R                  " W5      [        R                  " W5      S.-  nUR%                  U5        [        R&                  " US5      0 -  nSS U0-  n[        [        R                   " U5      5      eS =n=n=n=n=n	=n=n=n=n=nng )!NÚ
PHOTOS_DIRr)  r6   ÚthumbsÚscÚcamzMAR-AAA-111T)rÀ  za.jpgré   za_heads_1234567890.jpgr¾  r¿  rD   )zg%(py10)s
{%(py10)s = %(py2)s
{%(py2)s = %(py0)s.delete_photo
}(%(py4)s, %(py6)s, %(py8)s)
} is %(py13)sr   )r¸   r¹   rI   rK   rg   rº   r¡   zassert %(py15)sr¢   rÂ  r±  r	  rÄ  ÚprevrÆ  zCnot %(py20)s
{%(py20)s = %(py18)s
{%(py18)s = %(py16)s.exists
}()
}Úsrc)rm   r£   rç   r   zassert %(py24)srÔ   )r-   r   rÍ  rÌ  r   r   rË  rò   Údelete_photorq   rr   r¤   r¥   r¦   rs   rt   ru   rñ   r   rv   )Útmp_pathr7   rÏ  rØ  r±  r×  r|   rx   r}   rÄ   rÂ   r�   rÃ   r§   r¨   rw   r   rô   rõ   rŒ  rÙ   rb  rƒ   rù   rÛ   rÜ   s                             r   Ú>test_deleting_a_photo_removes_its_protected_and_preview_copiesrÛ  =  sÜ  € Ø×Ñœ ¨h¸Ñ.AÔBØ×Ñœ ¨h¸Ñ.AÔBØ˜Ñ  4Ñ'¨%Ñ/°-Ñ?€FØ
‡L�L˜€LÑØ
�7Ñ
€CØ‡O�O”K“MÔ"ØˆjÑ×ÑÔ!Ø�JÑÐ!9Ñ9€DØ×Ñ�TÔÜ×$Ò$ S¨/Ó:€DØ‡K�K×Ñ˜dÐÑ#Ø×Ñ�TÔÜ×%Ñ%ÐK dÐK¨MÐK¸7ÐKÐ% d¸7ÓCÐKÀtÐKÀtÐK×K×K×KÓKÐC×K×K×K×K×KÕKŒ=×K×K×KÑKŒ=×K×KÕKÐ%×K×KÓK d×K×KÓK¨M×K×KÓK¸7×K×KÓKÐC×K×KÓKÀt×K×K×K×K×K×K×KÓKÙG�{‰{ÐGˆ{‹}ÐGÔÑGÕ T§[¡[ÐG¡[£]ÐGÔ!2ÐGÐ!2ÐGÖ!2¸3¿:¹:ÐG¹:»<ÐG¸<Ô7GÐGÐ7G×G×G×G×G×G×GÒGˆt×G×G×GÑGˆt×G×GÕGˆ{×G×GÓGˆ}×G×G×GÑG××G×G×G×G×GÑG T×G×G×GÑG T×G×GÕG [×G×GÓG ]×G×G×GÑGÖ!2×G×G×G×G×GÑG¸3×G×G×GÑG¸3×G×GÕG¸:×G×GÓG¸<×G×G×G×G×G×G×G×G×G×G×G×G×G×GÐGr   ))é
   rN  rÜ  )iX  r¦  )r0  ):Ú__doc__Úbuiltinsr¤   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterq   r   r˜   ÚPILr   Úcorer   rÊ  r   r   r   r    Úconftestr   r	   r
   r1   Úbytesr   Úfixturer9   r>   rB   r‡   r‹   ÚmarkÚparametrizer›   rª   r®   r¶   rÆ   rß   r  r  r!  r&  r7  rL  re  rg  r  r‡  r“  r•  r›  r   r­  r²  r¹  rÑ  rÛ  rA   r   r   Ú<module>ré     sƒ  ðñ	÷ „ ƒ	ã Ý å ß FÑ Fß 2Ñ 2à€ñ¸õ ð ‡�ñ>ó ð>ò*Xò6òfò^ð
 ‡�×Ñ˜Ø˜:Ð&Ø˜+ qÐ)Ð*Ø˜+ rÐ*Ð+Ø˜ RÐ(Ð)Ø˜ Ð)Ð*Ø˜7 KÐ0Ð1Ø˜<¨Ð+Ð,Ø˜5 "˜+Ð&ð	!ó 	ñ ó	ð ò
Lò
(òò\òxòVòeò,ò(ô!ðD˜ô Dò@òòò7ò Uò^ò;òGò^ò^ò^òaó,Hr   