§
    ±…ÈjŒS  ã                   óv  — d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	 ddl
Z
ddlZ ee¦  «                             ¦   «         j        j        Zedz  Zedz  dz  Zedz  dz  Zedz  d	z  Zedz  d
z  Zedz  dz  dz  dz  Z ee¦  «        ej        vr$ej                             d ee¦  «        ¦  «         ddlZddlmZmZmZ ddlm Z m!Z!m"Z"  e
j#        d¬¦  «        d„ ¦   «         Z$ G d„ d¦  «        Z% G d„ d¦  «        Z& G d„ d¦  «        Z' G d„ d¦  «        Z( G d„ d¦  «        Z) G d„ d¦  «        Z*dS ) uš  
=============================================================================
THáº¬P NGÅ¨ NIÃŠN (THE FIFTEEN SPRINGS) - PRODUCTION PIPELINE TEST SUITE (M3)
=============================================================================
Module: tests/test_production_pipeline_m3.py
Milestone: M3 (Ep01 10-Scene Production Pipeline Implementation)
Standard: AGENTS.md, GEMINI.md, ORIGINAL_REQUEST.md Â§R1-R3, PROJECT.md

Covers:
1. 100% Start Frame resolution across all 140 shots (Ep01 Scenes 01 to 10).
2. Character invariant check (0 character misidentifications).
3. Shot Gate integration and automated retake loop (threshold 0.8, max_retakes=2).
4. Scene Gate integration and junction validation.
5. Audio Guard directive enforcement (100% No-BGM compliance).
6. Dry-run pipeline end-to-end execution with Head-Tail chaining and critic gate.
=============================================================================
é    N©ÚPath)ÚpatchÚ	MagicMockÚ05_Production_PipelineÚ	04_AssetsÚvideosÚ	keyframesÚ
charactersÚbackgroundsÚepisodesÚep01Úpromptszmuse_prompts.json)Úrun_shot_pipelineÚensure_audio_guardÚAUDIO_GUARD_CANONICAL)ÚVideoCriticVerdictÚShotEvaluationÚSceneEvaluationÚmodule)Úscopec                  óâ   — t          j        d¦  «        } d„ t          dd¦  «        D ¦   «         }i }|                      ¦   «         D ])\  }}|                     d¦  «        d         }||v r|||<   Œ*|S )u-   Táº£i toÃ n bá»™ dá»¯ liá»‡u shot cá»§a Ep01.r   c                 ó   — g | ]}d |d›�‘Œ	S )Ú
ep01_sceneÚ02d© ©Ú.0Úis     ú:C:\Projects\KieuStory\tests\test_production_pipeline_m3.pyú
<listcomp>z#ep01_shots_data.<locals>.<listcomp>0   s$   € Ð9Ð9Ð9 qÐ"˜1Ð"Ð"Ð"Ð9Ð9Ð9ó    é   é   Ú_shotr   )ÚpoÚget_all_shotsÚrangeÚitemsÚsplit)ÚshotsÚscenesÚfilteredÚsidÚsdataÚscs         r    Úep01_shots_datar1   ,   s}   € õ Ô˜VÑ$Ô$€EØ9Ð9­E°!°R©L¬LÐ9Ñ9Ô9€FØ€HØ—k’k‘m”mð "ð "‰
ˆˆUØ�YŠY�wÑÔ Ô"ˆØ�ˆ<ˆ<Ø!ˆH�S‰MøØ€Or"   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTestStartFrameCoverageu\   Kiá»ƒm tra Ä‘á»™ bao phá»§ 100% cá»§a Start Frame cho 140 shots thuá»™c Scenes 01 Ä‘áº¿n 10.c                 ó`   — t          |¦  «        dk    sJ dt          |¦  «        › �¦   «         ‚dS )uK   XÃ¡c nháº­n cÃ³ Ä‘Ãºng 140 shots tráº£i dÃ i tá»« Scene 01 Ä‘áº¿n Scene 10.éŒ   u$   Ká»³ vá»�ng 140 shots, tÃ¬m tháº¥y: N)Úlen)Úselfr1   s     r    Ú'test_01_all_140_shots_exist_in_manifestz>TestStartFrameCoverage.test_01_all_140_shots_exist_in_manifest?   s<   € å�?Ñ#Ô# sÒ*Ð*Ð*Ð,iÕSVÐWfÑSgÔSgÐ,iÐ,iÑ*Ô*Ð*Ð*Ð*r"   c                 ó¬  — g }g }|                      ¦   «         D ]Ú\  }}t          j        ||¦  «        \  }}|s|                     ||df¦  «         Œ8t	          |¦  «        }|                     ¦   «         s|                     ||d|› �f¦  «         Œw|                     ¦   «         r|                     ¦   «         j        dk     r2|                     ||d|                     ¦   «         j        › �f¦  «         ŒÛt          |¦  «        dk    sJ dt          |¦  «        › d|› �¦   «         ‚t          |¦  «        dk    sJ dt          |¦  «        › d|› �¦   «         ‚d	S )
uh   XÃ¡c nháº­n 100% trong sá»‘ 140 shots Ä‘á»�u resolve thÃ nh cÃ´ng ra file áº£nh tá»“n táº¡i trÃªn Ä‘Ä©a.ÚRETURNED_NONEzFILE_NOT_FOUND: éd   zSIZE_TOO_SMALL: r   õ   CÃ³ u,    shots khÃ´ng resolve Ä‘Æ°á»£c Start Frame: u    file áº£nh khÃ´ng há»£p lá»‡: N)
r)   r&   Úresolve_start_frame_v2Úappendr   ÚexistsÚis_fileÚstatÚst_sizer6   )	r7   r1   Ú
unresolvedÚinvalid_filesr.   r/   Úresolved_frameÚ	take_typeÚps	            r    Ú,test_01_all_140_shots_start_frame_resolutionzCTestStartFrameCoverage.test_01_all_140_shots_start_frame_resolutionC   s|  € àˆ
Øˆà)×/Ò/Ñ1Ô1ð 	cð 	c‰JˆC�Ý(*Ô(AÀ#ÀuÑ(MÔ(MÑ%ˆN˜IØ!ð Ø×!Ò! 3¨	°?Ð"CÑDÔDÐDØå�^Ñ$Ô$ˆAØ—8’8‘:”:ð Ø×!Ò! 3¨	Ð3VÀnÐ3VÐ3VÐ"WÑXÔXÐXØà—9’9‘;”;ð c !§&¢&¡(¤(Ô"2°SÒ"8Ð"8Ø×$Ò$ c¨>Ð;`ÈaÏfÊfÉhÌhÔN^Ð;`Ð;`Ð%aÑbÔbÐbøå�:‰Œ !Ò#Ð#Ð#Ð%u­C°
©O¬OÐ%uÐ%uÐisÐ%uÐ%uÑ#Ô#Ð#Ý�=Ñ!Ô! QÒ&Ð&Ð&Ð(q­s°=Ñ/AÔ/AÐ(qÐ(qÐboÐ(qÐ(qÑ&Ô&Ð&Ð&Ð&r"   c                 ód  — t          ¦   «         }|                     ¦   «         D ]Œ\  }}t          j        ||¦  «        }|€J ‚||v rŒ#|                     |¦  «         t          j        |¦  «        }|€J d|› �¦   «         ‚|j        dd…         \  }}|dk    r|dk    sJ d|› d|› d|› �¦   «         ‚Œ�dS )	uw   Kiá»ƒm tra toÃ n bá»™ cÃ¡c start frames resolve Ä‘Æ°á»£c Ä‘á»�u lÃ  áº£nh Ä‘á»�c Ä‘Æ°á»£c vá»›i kÃ­ch thÆ°á»›c chuáº©n.Nu    KhÃ´ng thá»ƒ Ä‘á»�c file áº£nh: é   i¼  i°  u2   KÃ­ch thÆ°á»›c áº£nh khÃ´ng Ä‘áº¡t chuáº©n 720p: (Úxu   ) táº¡i )Úsetr)   r&   Úresolve_start_frameÚaddÚcv2ÚimreadÚshape)	r7   r1   Úchecked_pathsr.   r/   rE   ÚimgÚhÚws	            r    Ú,test_01_all_resolved_frames_are_valid_imageszCTestStartFrameCoverage.test_01_all_resolved_frames_are_valid_imagesY   sì   € å™œˆØ)×/Ò/Ñ1Ô1ð 
	@ð 
	@‰JˆC�ÝÔ3°C¸Ñ?Ô?ˆNØ!Ð-Ð-Ð-Ø Ð.Ð.ØØ×Ò˜nÑ-Ô-Ð-å”*˜^Ñ,Ô,ˆCØ�?�?Ð$WÀ~Ð$WÐ$W‘?”?�?Ø”9˜R˜a˜R”=‰DˆAˆqØ˜’8�8  T¢	 	 	Ð+Ð`aÐ+Ð+ÐdeÐ+Ð+Ðo}Ð+Ð+¡	¤	Ð) 	ð
	@ð 
	@r"   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r8   rH   rV   r   r"   r    r3   r3   <   sR   € € € € € ØfÐfðjð jð jðrð rð rð,@ð @ð @ð @ð @r"   r3   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )Ú TestCharacterInvariantSafeguardsun   Kiá»ƒm tra báº¥t biáº¿n nhÃ¢n váº­t: tuyá»‡t Ä‘á»‘i khÃ´ng nháº§m láº«n chÃ¢n dung ThÃºy Kiá»�u cho vai khÃ¡c.c                 óî   — g d¢}|D ]m}|                      |i ¦  «        }t          j        ||¦  «        }|€J ‚|                     ¦   «         }d|vsJ d|› d|› �¦   «         ‚d|v sJ d|› d|› �¦   «         ‚ŒndS )	u`   Kiá»ƒm tra toÃ n bá»™ cÃ¡c shot Kim Trá»�ng khÃ´ng bao giá»� bá»‹ tráº£ vá»� áº£nh ThÃºy Kiá»�u.)Úep01_scene07_shot01Úep01_scene07_shot03Úep01_scene07_shot04Úep01_scene07_shot05Úep01_scene07_shot06Úep01_scene07_shot08Úep01_scene08_shot04Úep01_scene08_shot05Úep01_scene08_shot07Úep01_scene09_shot01Úep01_scene09_shot04Úep01_scene10_shot04Úep01_scene10_shot05Úep01_scene10_shot13NÚ	thuy_kieuu   LEAK: Kim Trá»�ng shot õ    bá»‹ gÃ¡n ThÃºy Kiá»�u: Ú	kim_trongu   Kim Trá»�ng shot u-    ká»³ vá»�ng chÃ¢n dung Kim Trá»�ng, nháº­n: ©Úgetr&   rM   Úlower)r7   r1   Úkim_trong_shotsr.   r/   ÚresolvedÚr_lowers          r    Ú+test_02_kim_trong_canonical_shots_safeguardzLTestCharacterInvariantSafeguards.test_02_kim_trong_canonical_shots_safeguardo   sÍ   € ð
ð 
ð 
ˆð #ð 	|ð 	|ˆCØ#×'Ò'¨¨RÑ0Ô0ˆEÝÔ-¨c°5Ñ9Ô9ˆHØÐ'Ð'Ð'Ø—n’nÑ&Ô&ˆGØ gÐ-Ð-Ð-Ð/qÈÐ/qÐ/qÐgoÐ/qÐ/qÑ-Ô-Ð-Ø 'Ð)Ð)Ð)Ð+{¸sÐ+{Ð+{ÐqyÐ+{Ð+{Ñ)Ô)Ð)Ð)ð	|ð 	|r"   c                 óÞ  — g d¢}|D ]o}|                      |i ¦  «        }t          j        ||¦  «        }|€J ‚d|                     ¦   «         vsJ d|› d|› �¦   «         ‚d|                     ¦   «         v sJ ‚Œpg d¢}|D ]o}|                      |i ¦  «        }t          j        ||¦  «        }|€J ‚d|                     ¦   «         vsJ d|› d|› �¦   «         ‚d	|                     ¦   «         v sJ ‚ŒpdS )
ud   Kiá»ƒm tra cÃ¡c shot VÆ°Æ¡ng Ã”ng, VÆ°Æ¡ng Quan khÃ´ng bao giá»� bá»‹ tráº£ vá»� áº£nh ThÃºy Kiá»�u.)Úep01_scene02_shot04Úep01_scene02_shot07Úep01_scene02_shot10Úep01_scene02_shot13Nrl   u   LEAK: VÆ°Æ¡ng Ã”ng shot rm   Ú	vuong_ong)Úep01_scene02_shot08Úep01_scene02_shot09Úep01_scene02_shot12Úep01_scene02_shot15Úep01_scene05_shot12u   LEAK: VÆ°Æ¡ng Quan shot Ú
vuong_quanro   )r7   r1   Úvuong_ong_shotsr.   r/   rs   Úvuong_quan_shotss          r    Ú$test_02_vuong_family_shots_safeguardzETestCharacterInvariantSafeguards.test_02_vuong_family_shots_safeguard€   sX  € àvÐvÐvˆØ"ð 	3ð 	3ˆCØ#×'Ò'¨¨RÑ0Ô0ˆEÝÔ-¨c°5Ñ9Ô9ˆHØÐ'Ð'Ð'Ø h§n¢nÑ&6Ô&6Ð6Ð6Ð6Ð8{ÐSVÐ8{Ð8{ÐqyÐ8{Ð8{Ñ6Ô6Ð6Ø (§.¢.Ñ"2Ô"2Ð2Ð2Ð2Ð2Ð2ð Oð  Oð  OÐØ#ð 	4ð 	4ˆCØ#×'Ò'¨¨RÑ0Ô0ˆEÝÔ-¨c°5Ñ9Ô9ˆHØÐ'Ð'Ð'Ø h§n¢nÑ&6Ô&6Ð6Ð6Ð6Ð8{ÐSVÐ8{Ð8{ÐqyÐ8{Ð8{Ñ6Ô6Ð6Ø 8§>¢>Ñ#3Ô#3Ð3Ð3Ð3Ð3Ð3ð	4ð 	4r"   c                 ó¶  — g d¢}|D ]W}|                      |i ¦  «        }t          j        ||¦  «        }|€J ‚d|                     ¦   «         v sJ d|› d|› �¦   «         ‚ŒXdddd	d
dœ}|                     ¦   «         D ]]\  }}|                      |i ¦  «        }t          j        ||¦  «        }|€J ‚||                     ¦   «         v sJ d|› d|› d|› �¦   «         ‚Œ^dS )ug   Kiá»ƒm tra cáº£nh Ä‘áº¡i chÃºng Há»™i Thanh Minh vÃ  cÃ¡c ngoáº¡i cáº£nh khÃ´ng bá»‹ gÃ¡n ThÃºy Kiá»�u.)Úep01_scene04_shot01Úep01_scene04_shot02Úep01_scene04_shot03Úep01_scene04_shot04Úep01_scene04_shot12NÚcrowd_qingming_festivalu   Cáº£nh Ä‘áº¡i chÃºng u%    ká»³ vá»�ng crowd keyframe, nháº­n: Úsuoi_ngoc_rang_lieuÚmo_dam_tienÚhoang_hon_rang_lieuÚduong_mon_hoang_honÚbuc_tuong_hoa)Úep01_scene05_shot07Úep01_scene05_shot10Úep01_scene06_shot01Úep01_scene06_shot02Úep01_scene08_shot01u   Ngoáº¡i cáº£nh u    ká»³ vá»�ng u
   , nháº­n: )rp   r&   rM   rq   r)   )r7   r1   Úcrowd_shotsr.   r/   rs   Úscenery_shotsÚexpected_keys           r    Ú)test_02_crowd_and_scenery_shots_safeguardzJTestCharacterInvariantSafeguards.test_02_crowd_and_scenery_shots_safeguard’   sl  € ð Jð  Jð  JˆØð 	Oð 	OˆCØ#×'Ò'¨¨RÑ0Ô0ˆEÝÔ-¨c°5Ñ9Ô9ˆHØÐ'Ð'Ð'Ø,°·²Ñ0@Ô0@Ð@Ð@Ð@ð  COÐZ]ð  COð  COð  EMð  COð  COÑ@Ô@Ð@Ð@ð $9Ø#0Ø#8Ø#8Ø#2ð
ð 
ˆð "/×!4Ò!4Ñ!6Ô!6ð 	|ð 	|ÑˆC�Ø#×'Ò'¨¨RÑ0Ô0ˆEÝÔ-¨c°5Ñ9Ô9ˆHØÐ'Ð'Ð'Ø 8§>¢>Ñ#3Ô#3Ð3Ð3Ð3Ð5{ÀsÐ5{Ð5{ÐYeÐ5{Ð5{ÐqyÐ5{Ð5{Ñ3Ô3Ð3Ð3ð		|ð 	|r"   N)rW   rX   rY   rZ   ru   r„   r™   r   r"   r    r\   r\   l   sO   € € € € € ØxÐxð|ð |ð |ð"4ð 4ð 4ð$|ð |ð |ð |ð |r"   r\   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTestShotGateAndRetakeLoopuf   Kiá»ƒm tra tÃ­ch há»£p Shot Gate vÃ  vÃ²ng láº·p retake tá»± Ä‘á»™ng trong production_orchestrator.py.c           	      ó"  — t          ddt          dg d¬¦  «        dd¬¦  «        }t          dd	¬
¦  «        5  t          dt          d¦  «        ¬
¦  «        5  t          dt          d¦  «        ¬
¦  «        5  t          d|¬
¦  «        5 }t	          j        ddd¬¦  «        }|du sJ ‚|j        dk    sJ ‚	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )u<   XÃ¡c nháº­n Shot Gate phÃª duyá»‡t khi overall_score >= 0.8.gq=
×£pí?Tgffffffî?©Úcharacter_matchÚvisual_defectsÚscoreÚAPPROVEu,   Táº¡o hÃ¬nh chuáº©n xÃ¡c, khÃ´ng dá»‹ táº­t.©Úoverall_scoreÚapprovedÚ	shot_evalÚsuggested_actionÚcritique_notesú)production_orchestrator.run_shot_pipeline©Tútail.jpg©Úreturn_valueú+production_orchestrator.find_rendered_videoúmock_video.mp4ú+production_orchestrator._extract_tail_framerª   ú*production_orchestrator.evaluate_shot_gateÚep01_scene02_shot01rJ   ©Úenable_criticÚmax_retakesr#   N©r   r   r   r   r&   Úrender_single_shotÚ
call_count)r7   Útmp_pathÚmock_verdictÚ	mock_gateÚress        r    Ú5test_03_shot_gate_approves_when_score_above_thresholdzOTestShotGateAndRetakeLoop.test_03_shot_gate_approves_when_score_above_threshold¯   s>  € å)ØØÝ$°TÈ"ÐTXÐYÑYÔYØ&ØIð
ñ 
ô 
ˆõ Ð>ÐM_Ð`Ñ`Ô`ð 	-ð 	-ÝÐ@ÍtÐTdÑOeÔOeÐfÑfÔfð	-ð 	-åÐ@ÍtÐT^ÑO_ÔO_Ð`Ñ`Ô`ð	-ð 	-õ Ð?ÈlÐ[Ñ[Ô[ð	-ð `iåÔ'Ð(=ÈTÐ_`ÐaÑaÔaˆCØ˜$�;�;�;�;ØÔ'¨1Ò,Ð,Ð,Ð,Ð,ð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-s}   ¶DÁC,Á4CÂ+B>	Â2CÂ>CÃCÃCÃCÃ	C,ÃCÃC,ÃCÃC,Ã DÃ,C0	Ã0DÃ3C0	Ã4DÄDÄDc           	      óŠ  — t          ddt          ddgd¬¦  «        dd¬¦  «        }t          d	d
t          d
g d¬¦  «        dd¬¦  «        }t          dd¬¦  «        5 }t          dt          d¦  «        ¬¦  «        5  t          dt          d¦  «        ¬¦  «        5  t          d||g¬¦  «        5 }t	          j        dd
d¬¦  «        }|d
u sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )um   XÃ¡c nháº­n Shot Gate kÃ­ch hoáº¡t vÃ²ng láº·p retake khi score < 0.8 hoáº·c suggested_action == RETAKE_SHOT.gÍÌÌÌÌÌä?FÚsquintg333333ã?r�   ÚRETAKE_SHOTu#   PhÃ¡t hiá»‡n máº¯t lÃ© nhÃ¢n váº­t.r¢   ç)\�Âõ(ì?TçÍÌÌÌÌÌì?r¡   u   Retake hoÃ n háº£o.r¨   r©   r«   r­   r®   r¯   rª   r°   ©Úside_effectr±   rJ   r²   Nrµ   )r7   Úbad_verdictÚgood_verdictÚmock_pipelinerº   r»   s         r    Ú0test_03_shot_gate_triggers_retake_loop_on_defectzJTestShotGateAndRetakeLoop.test_03_shot_gate_triggers_retake_loop_on_defectÂ   s�  € å(ØØÝ$°UÈHÈ:Ð]aÐbÑbÔbØ*Ø@ð
ñ 
ô 
ˆõ *ØØÝ$°TÈ"ÐTXÐYÑYÔYØ&Ø0ð
ñ 
ô 
ˆõ Ð>ÐM_Ð`Ñ`Ô`ð 	1ÐdqÝÐ@ÍtÐTdÑOeÔOeÐfÑfÔfð	1ð 	1åÐ@ÍtÐT^ÑO_ÔO_Ð`Ñ`Ô`ð	1ð 	1õ Ð?ÈkÐ[gÐMhÐiÑiÔið	1ð nwåÔ'Ð(=ÈTÐ_`ÐaÑaÔaˆCØ˜$�;�;�;�;ØÔ'¨1Ò,Ð,Ð,Ð,Ø Ô+¨qÒ0Ð0Ð0Ð0Ð0ð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1s~   ÁD8Á:D ÂD	Â-8C2	Ã&D	Ã2C6Ã6D	Ã9C6Ã:D	Ã=D Ä	DÄD ÄDÄD ÄD8Ä D$	Ä$D8Ä'D$	Ä(D8Ä8D<Ä?D<c           	      óÒ  — t          ddt          ddgd¬¦  «        dd¬¦  «        }t          d	d
¬¦  «        5 }t          dt          d¦  «        ¬¦  «        5  t          d|¬¦  «        5 }t	          j        ddd¬¦  «        }|du sJ ‚|j        dk    sJ ‚|j        dk    sJ ‚	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )uf   XÃ¡c nháº­n Shot Gate tráº£ vá»� False náº¿u vÆ°á»£t quÃ¡ max_retakes mÃ  váº«n khÃ´ng Ä‘áº¡t Ä‘iá»ƒm.gš™™™™™á?FÚsevere_morphingç      à?r�   r¿   u+   Biáº¿n dáº¡ng khuÃ´n máº·t nghiÃªm trá»�ng.r¢   r¨   r©   r«   r­   r®   r°   r±   TrJ   r²   é   Nrµ   )r7   rÄ   rÆ   rº   r»   s        r    Ú2test_03_shot_gate_fails_after_max_retakes_exceededzLTestShotGateAndRetakeLoop.test_03_shot_gate_fails_after_max_retakes_exceededÝ   sÜ  € å(ØØÝ$°UÐL]ÐK^ÐfjÐkÑkÔkØ*ØHð
ñ 
ô 
ˆõ Ð>ÐM_Ð`Ñ`Ô`ð 	1ÐdqÝÐ@ÍtÐTdÑOeÔOeÐfÑfÔfð	1ð 	1åÐ?ÈkÐZÑZÔZð	1à^gåÔ'Ð(=ÈTÐ_`ÐaÑaÔaˆCØ˜%�<�<�<�<àÔ'¨1Ò,Ð,Ð,Ð,Ø Ô+¨qÒ0Ð0Ð0Ð0Ð0ð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1ð 	1ð 	1sY   ·CÁCÁ(8B-Â!CÂ-B1Â1CÂ4B1Â5CÂ8CÃC	ÃCÃC	ÃCÃC Ã#C N)rW   rX   rY   rZ   r¼   rÇ   rÌ   r   r"   r    r›   r›   ¬   sG   € € € € € ØpÐpð-ð -ð -ð&1ð 1ð 1ð61ð 1ð 1ð 1ð 1r"   r›   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚTestSceneGateIntegrationuR   Kiá»ƒm tra tÃ­ch há»£p Scene Gate trong batch_render_scene vÃ  concat_scene_shots.c           
      óÈ  — t          ddt          dddd¬¦  «        dd¬¦  «        }|dz  }d	„ }d
„ t          dd¦  «        D ¦   «         }t          dd„ t          dd¦  «        D ¦   «         ¬¦  «        5  t          d|¬¦  «        5  t          d|¬¦  «        5 }t          d¦  «        5 }|j        }||j        _        t          j        dt          |¦  «        d¬¦  «        }	|	€J ‚|j
        dk    sJ ‚|                     ¦   «         sJ ‚	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )uf   XÃ¡c nháº­n evaluate_scene_gate Ä‘Æ°á»£c gá»�i tháº©m Ä‘á»‹nh tiáº¿p biÃªn trÆ°á»›c khi xuáº¥t Master.rÀ   TrÁ   ©Újunction_smoothnessÚaxis_180_okÚcolor_continuityr    r¡   u4   Tiáº¿p biÃªn mÆ°á»£t mÃ , trá»¥c 180 Ä‘á»™ an toÃ n.©r£   r¤   Ú
scene_evalr¦   r§   zep01_scene02_master_v1.mp4c                 óJ   — t          |¦  «                             d¦  «         dS )Ns   dummy master video contentT)r   Úwrite_bytes)ÚpathsÚtargetÚkwargss      r    Úmock_stitchzcTestSceneGateIntegration.test_04_scene_gate_validates_continuity_before_concat.<locals>.mock_stitch  s"   € Ý�‰LŒL×$Ò$Ð%BÑCÔCÐCØ�4r"   c                 ó4   — g | ]}t          d |› d�¦  «        ‘ŒS ©Úmock_sz.mp4r   r   s     r    r!   zbTestSceneGateIntegration.test_04_scene_gate_validates_continuity_before_concat.<locals>.<listcomp>  ó,   € ÐCÐCÐC°!•tÐ, QÐ,Ð,Ð,Ñ-Ô-ÐCÐCÐCr"   r#   é   ú+production_orchestrator.get_shots_for_scenec                 ó   — g | ]	}d |› �i f‘Œ
S ©Úsr   r   s     r    r!   zbTestSceneGateIntegration.test_04_scene_gate_validates_continuity_before_concat.<locals>.<listcomp>  ó)   € ÐOsÐOsÐOsÐbcÐQXÐUVÐQXÐQXÐZ\ÐP]ÐOsÐOsÐOsr"   r«   r­   rÂ   ú+production_orchestrator.evaluate_scene_gatez-production_orchestrator.AudioContinuityEngineÚep01_scene02)Úoutput_pathr³   N)r   r   r(   r   r¬   Ústitch_with_audio_crossfaderÃ   r&   Úconcat_scene_shotsÚstrr·   r?   )
r7   r¸   Úmock_scene_verdictÚout_filerÛ   Úmock_videosrº   Úmock_engine_clsÚmock_enginer»   s
             r    Ú5test_04_scene_gate_validates_continuity_before_concatzNTestSceneGateIntegration.test_04_scene_gate_validates_continuity_before_concatø   s¥  € å/ØØÝ&¸3ÈDÐcfÐnqÐrÑrÔrØ&ØQð
ñ 
ô 
Ðð Ð:Ñ:ˆð	ð 	ð 	ð DÐCµu¸QÀ±{´{ÐCÑCÔCˆÝÐ@ÐOsÐOsÕglÐmnÐpqÑgrÔgrÐOsÑOsÔOsÐtÑtÔtð 	%ð 	%ÝÐ@ÈkÐZÑZÔZð	%ð 	%åÐ@ÐOaÐbÑbÔbð	%àfoÝÐBÑCÔCð	%ð HWà)Ô6ˆKØBMˆKÔ3Ô?åÔ'¨ÅCÈÁMÄMÐaeÐfÑfÔfˆCØ�?�?�?ØÔ'¨1Ò,Ð,Ð,Ð,Ø—?’?Ñ$Ô$Ð$Ð$Ð$Ð$ð	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ñ 	%ô 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%ð 	%øøøð 	%ð 	%ð 	%ð 	%ð 	%ð 	%s   Á1EÂD?ÂD(Â%AD	ÄD(ÄDÄD(ÄDÄD(ÄD?Ä(D,Ä,D?Ä/D,Ä0D?Ä3EÄ?E	ÅEÅE	ÅEÅEÅEc           
      óü  — t          ddt          dddd¬¦  «        dd¬¦  «        }d	„ t          d
d¦  «        D ¦   «         }t          dd„ t          d
d¦  «        D ¦   «         ¬¦  «        5  t          d|¬¦  «        5  t          d|¬¦  «        5 }t	          j        dd¬¦  «        }|�J ‚|j        d
k    sJ ‚	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS )uZ   XÃ¡c nháº­n concat_scene_shots bá»‹ há»§y bá»� náº¿u Scene Gate tá»« chá»‘i (RETAKE_SHOT).rÊ   Fg333333Ó?gš™™™™™Ù?rÐ   r¿   u@   Nháº£y trá»¥c 180 Ä‘á»™ nghiÃªm trá»�ng táº¡i shot 2 vÃ  shot 3.rÔ   c                 ó4   — g | ]}t          d |› d�¦  «        ‘ŒS rÝ   r   r   s     r    r!   ziTestSceneGateIntegration.test_04_scene_gate_rejects_concat_on_critical_junction_error.<locals>.<listcomp>  rß   r"   r#   rà   rá   c                 ó   — g | ]	}d |› �i f‘Œ
S rã   r   r   s     r    r!   ziTestSceneGateIntegration.test_04_scene_gate_rejects_concat_on_critical_junction_error.<locals>.<listcomp>   rå   r"   r«   r­   rÂ   ræ   rç   T)r³   N)r   r   r(   r   r&   rê   r·   )r7   Úreject_verdictrî   rº   r»   s        r    Ú<test_04_scene_gate_rejects_concat_on_critical_junction_errorzUTestSceneGateIntegration.test_04_scene_gate_rejects_concat_on_critical_junction_error  sï  € å+ØØÝ&¸3ÈEÐdgÐorÐsÑsÔsØ*Ø]ð
ñ 
ô 
ˆð DÐCµu¸QÀ±{´{ÐCÑCÔCˆÝÐ@ÐOsÐOsÕglÐmnÐpqÑgrÔgrÐOsÑOsÔOsÐtÑtÔtð 	-ð 	-ÝÐ@ÈkÐZÑZÔZð	-ð 	-åÐ@È~Ð^Ñ^Ô^ð	-àbkåÔ'¨ÀdÐKÑKÔKˆCØ�;�;�;ØÔ'¨1Ò,Ð,Ð,Ð,Ð,ð	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ñ 	-ô 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-ð 	-øøøð 	-ð 	-ð 	-ð 	-ð 	-ð 	-sZ   Á)C1Á;CÂ(CÂ6CÃCÃCÃ	CÃ
CÃC1ÃC	ÃC1Ã C	Ã!C1Ã1C5Ã8C5N)rW   rX   rY   rZ   rñ   rö   r   r"   r    rÎ   rÎ   õ   s8   € € € € € Ø\Ð\ð%ð %ð %ð:-ð -ð -ð -ð -r"   rÎ   c                   ó$   — e Zd ZdZd„ Zd„ Zd„ ZdS )ÚTestAudioGuardEnforcementuc   Kiá»ƒm tra tuÃ¢n thá»§ 100% chá»‰ thá»‹ Audio Guard cáº¥m nháº¡c ná»�n (No-BGM) theo AGENTS.md Â§3.c                 ó^   — dt           v sJ ‚dt           v sJ ‚dt           v sJ ‚dt           v sJ ‚dS )u[   XÃ¡c nháº­n Audio Guard chá»©a Ä‘Ãºng tiá»�n tá»‘ vÃ  ná»™i dung quy chuáº©n AGENTS.md Â§3.u   Quy táº¯c Ã¢m thanh:u6   Tuyá»‡t Ä‘á»‘i KHÃ”NG sinh nháº¡c ná»�n (no music/BGM)u;   khÃ´ng Ã¢m thanh Ä‘iá»‡n tá»­, khÃ´ng táº¡p Ã¢m rÃ¨ nhiá»…uuf   Chá»‰ sinh Ã¢m thanh mÃ´i trÆ°á»�ng tá»± nhiÃªn (foley, ambience) vÃ  thoáº¡i nhÃ¢n váº­t chÃ¢n thá»±cN)r   )r7   s    r    Ú)test_05_audio_guard_formatting_compliancezCTestAudioGuardEnforcement.test_05_audio_guard_formatting_compliance/  sf   € à%Õ)>Ð>Ð>Ð>Ð>ØGÕK`Ð`Ð`Ð`Ð`ØLÕPeÐeÐeÐeÐeØwõ  |Qð  Qð  Qð  Qð  Qð  Qð  Qr"   c                 óÎ  — t          t          dd¬¦  «        5 }t          j        |¦  «        }ddd¦  «         n# 1 swxY w Y   |                     di ¦  «        }g }|                     ¦   «         D ]D\  }}|                     dd¦  «        }t          j        |¦  «        s|                     |¦  «         ŒEt          |¦  «        dk    sJ d	t          |¦  «        › d
|› �¦   «         ‚dS )uV   XÃ¡c nháº­n 100% prompt trong episodes/ep01/prompts/muse_prompts.json cÃ³ Audio Guard.Úrzutf-8)ÚencodingNÚmotion_promptsÚmotion_promptÚ r   r<   u    prompts thiáº¿u Audio Guard: )
ÚopenÚEP01_PROMPTS_FILEÚjsonÚloadrp   r)   r&   Úvalidate_audio_guardr>   r6   )r7   ÚfÚdatarþ   Úmissing_guardr.   r/   Úprompts           r    Ú0test_05_all_ep01_prompts_strictly_enforce_no_bgmzJTestAudioGuardEnforcement.test_05_all_ep01_prompts_strictly_enforce_no_bgm6  s+  € åÕ# S°7Ð;Ñ;Ô;ð 	 ¸qÝ”9˜Q‘<”<ˆDð	 ð 	 ð 	 ñ 	 ô 	 ð 	 ð 	 ð 	 ð 	 ð 	 ð 	 øøøð 	 ð 	 ð 	 ð 	 àŸšÐ"2°BÑ7Ô7ˆàˆØ(×.Ò.Ñ0Ô0ð 	*ð 	*‰JˆC�Ø—Y’Y˜°Ñ3Ô3ˆFÝÔ*¨6Ñ2Ô2ð *Ø×$Ò$ SÑ)Ô)Ð)øå�=Ñ!Ô! QÒ&Ð&Ð&Ð(p­s°=Ñ/AÔ/AÐ(pÐ(pÐanÐ(pÐ(pÑ&Ô&Ð&Ð&Ð&s   ˜9¹=Á =c                 óÎ   — d}t          j        |¦  «        }t          j        |¦  «        sJ ‚|                     t          ¦  «        sJ ‚t          j        |¦  «        }||k    sJ ‚dS )uW   Kiá»ƒm tra helper ensure_audio_guard tá»± Ä‘á»™ng gáº¯n Audio Guard vÃ o prompt tráº§n.uA   Camera lia cháº­m cáº­n cáº£nh nÃ ng Kiá»�u gáº£y Ä‘Ã n tá»³ bÃ .N)r&   r   r  Úendswithr   )r7   Ú
raw_promptÚguardedÚdouble_guardeds       r    Ú9test_05_ensure_audio_guard_helper_appends_canonical_guardzSTestAudioGuardEnforcement.test_05_ensure_audio_guard_helper_appends_canonical_guardD  sp   € àXˆ
ÝÔ'¨
Ñ3Ô3ˆÝÔ& wÑ/Ô/Ð/Ð/Ð/Ø×ÒÕ 5Ñ6Ô6Ð6Ð6Ð6åÔ.¨wÑ7Ô7ˆØ Ò(Ð(Ð(Ð(Ð(Ð(r"   N)rW   rX   rY   rZ   rú   r
  r  r   r"   r    rø   rø   ,  sM   € € € € € ØmÐmðQð Qð Qðqð qð qð)ð )ð )ð )ð )r"   rø   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚTestDryRunPipelineEndToEnduZ   Kiá»ƒm thá»­ chu trÃ¬nh render giáº£ láº­p (Dry-Run) khÃ´ng treo browser trong < 15 giÃ¢y.c                 óÔ  — d}	 t          |dd¬¦  «        \  }}|du sJ ‚|€J ‚t          |¦  «                             ¦   «         sJ ‚t          j        |¦  «        }|€J ‚|                     ¦   «         sJ ‚t          j        t          |¦  «        ¦  «        }|                     ¦   «         sJ ‚t          | 
                    t
          j        ¦  «        ¦  «        }t          | 
                    t
          j        ¦  «        ¦  «        }|                     ¦   «          |dk    r|dk    sJ d|› d	|› �¦   «         ‚t          j        t          |¦  «        ¦  «        }	|	€J ‚|	j        dd
…         dk    sJ ‚	 t                                |› d�¦  «        D ]'}
	 |
                     ¦   «          Œ# t&          $ r Y Œ$w xY wt(          |z  }|                     ¦   «         rt+          j        |d¬¦  «         dS dS # t                                |› d�¦  «        D ]'}
	 |
                     ¦   «          Œ# t&          $ r Y Œ$w xY wt(          |z  }|                     ¦   «         rt+          j        |d¬¦  «         w w xY w)uh   XÃ¡c nháº­n cháº¿ Ä‘á»™ MUSE_DRY_RUN=1 sinh video 720p cÃ³ audio AAC vÃ  trÃ­ch Tail Frame thÃ nh cÃ´ng.Útest_dry_run_shot01zDry run test shotT)Úshot_idr	  Údry_runNé   éÐ  u)   KÃ­ch thÆ°á»›c video khÃ´ng Ä‘Ãºng 720p: rK   rJ   )r  r  Ú*©Úignore_errors)r   r   r?   r&   Úfind_rendered_videorO   ÚVideoCapturerë   ÚisOpenedÚintrp   ÚCAP_PROP_FRAME_WIDTHÚCAP_PROP_FRAME_HEIGHTÚreleaserP   rQ   Ú
VIDEOS_DIRÚglobÚunlinkÚ	ExceptionÚKEYFRAMES_DIRÚshutilÚrmtree)r7   r¸   Útest_shot_idÚokÚ	tail_pathÚtarget_videoÚcaprU   rT   Útail_imgr  Úkf_tests               r    Ú9test_06_dry_run_generates_valid_720p_video_and_tail_framezTTestDryRunPipelineEndToEnd.test_06_dry_run_generates_valid_720p_video_and_tail_frameU  s¯  € à,ˆð#	;Ý-Ø$Ø*Øðñ ô ‰MˆB�	ð
 ˜�:�:�:�:ØÐ(Ð(Ð(Ý˜	‘?”?×)Ò)Ñ+Ô+Ð+Ð+Ð+õ Ô1°,Ñ?Ô?ˆLØÐ+Ð+Ð+Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(åÔ"¥3 |Ñ#4Ô#4Ñ5Ô5ˆCØ—<’<‘>”>Ð!Ð!�>Ý�C—G’G�CÔ4Ñ5Ô5Ñ6Ô6ˆAÝ�C—G’G�CÔ5Ñ6Ô6Ñ7Ô7ˆAØ�KŠK‰MŒMˆMØ˜’9�9  c¢  Ð+^ÐWXÐ+^Ð+^Ð[\Ð+^Ð+^¡¤Ð)õ ”z¥# i¡.¤.Ñ1Ô1ˆHØÐ'Ð'Ð'Ø”> " 1 "Ô%¨Ò4Ð4Ð4Ð4Ð4õ  —_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð ð �ðØ—H’H‘J”J�J�JøÝ ð ð ð Ø�Dðøøøå# lÑ2ˆGØ�~Š~ÑÔð ;Ý”˜g°TÐ:Ñ:Ô:Ð:Ð:Ð:ð;ð ;øõ  —_’_¨Ð%7Ð%7Ð%7Ñ8Ô8ð ð �ðØ—H’H‘J”J�J�JøÝ ð ð ð Ø�Dðøøøå# lÑ2ˆGØ�~Š~ÑÔð ;Ý”˜g°TÐ:Ñ:Ô:Ð:Ð:ð;øøøsB   „E)G+ ÆF#Æ#
F0Æ/F0Ç+ I'ÈH!È I'È!
H.	È+I'È-H.	È.9I'c                 ó¬  — d}d}	 t          |dd¬¦  «        \  }}|du sJ ‚t          |¦  «                             ¦   «         sJ ‚dddœ}t          j        ||d¬	¦  «        \  }}t          j        |¦  «        }|€J ‚t          |                     ¦   «         ¦  «        t          t          |¦  «                             ¦   «         ¦  «        k    sJ ‚	 ||fD ]{}	t           	                    |	› d�¦  «        D ]'}
	 |
 
                    ¦   «          Œ# t          $ r Y Œ$w xY wt          |	z  }|                     ¦   «         rt          j        |d¬¦  «         Œ|d
S # ||fD ]{}	t           	                    |	› d�¦  «        D ]'}
	 |
 
                    ¦   «          Œ# t          $ r Y Œ$w xY wt          |	z  }|                     ¦   «         rt          j        |d¬¦  «         Œ|w xY w)ur   XÃ¡c nháº­n chuá»—i Head-Tail liÃªn hoÃ n giá»¯a 2 shot: Shot 1 táº¡o frame 239 -> Shot 2 nháº­n lÃ m start frame.Útest_chain_shot01Útest_chain_shot02zShot 1 takeT)r	  r  rl   zShot 2 continuation.)Úcharacter_anchorrÿ   )Ú	shot_dataÚreturn_classificationNr  r  )r   r   r?   r&   rM   Úfind_tail_framerë   Úresolver#  r$  r%  r&  r'  r(  r)  )r7   Úshot1_idÚshot2_idÚok1Útail1Ú
shot2_datarE   rF   Ú
tail_shot1r.   r  r0  s               r    Ú6test_06_dry_run_head_tail_chaining_and_critic_approvalzQTestDryRunPipelineEndToEnd.test_06_dry_run_head_tail_chaining_and_critic_approval}  s:  € à&ˆØ&ˆð	?å*¨8¸MÐSWÐXÑXÔX‰JˆC�Ø˜$�;�;�;�;Ý˜‘;”;×%Ò%Ñ'Ô'Ð'Ð'Ð'ð %0Ø!7ðð ˆJõ )+Ô(>ØØ$Ø&*ð)ñ )ô )Ñ%ˆN˜Iõ Ô+¨HÑ5Ô5ˆJØÐ)Ð)Ð)Ý�z×)Ò)Ñ+Ô+Ñ,Ô,µµD¸±K´K×4GÒ4GÑ4IÔ4IÑ0JÔ0JÒJÐJÐJÐJÐJð ! (Ð+ð ?ð ?�Ý#Ÿš¨C¨¨¨Ñ3Ô3ð ð �AðØŸš™
œ
˜
˜
øÝ$ð ð ð Ø˜ðøøøå'¨#Ñ-�Ø—>’>Ñ#Ô#ð ?Ý”M '¸Ð>Ñ>Ô>Ð>øð?ð ?ø˜ (Ð+ð ?ð ?�Ý#Ÿš¨C¨¨¨Ñ3Ô3ð ð �AðØŸš™
œ
˜
˜
øÝ$ð ð ð Ø˜ðøøøå'¨#Ñ-�Ø—>’>Ñ#Ô#ð ?Ý”M '¸Ð>Ñ>Ô>Ð>øð?øøøsB   †CE Ã5D
Ä

DÄDÅ&GÅ8FÆGÆ
FÆGÆFÆ9GN)rW   rX   rY   rZ   r1  r@  r   r"   r    r  r  R  s9   € € € € € ØdÐdð&;ð &;ð &;ðP#?ð #?ð #?ð #?ð #?r"   r  )+rZ   ÚosÚsysr  r(  Úpathlibr   Úunittest.mockr   r   ÚpytestrO   Ú__file__r9  ÚparentÚPROJECT_ROOTÚPIPELINE_DIRr#  r'  ÚCHARACTERS_DIRÚBACKGROUNDS_DIRr  rë   ÚpathÚinsertÚproduction_orchestratorr&   Úrun_shotr   r   r   Úantigravity_critic_gater   r   r   Úfixturer1   r3   r\   r›   rÎ   rø   r  r   r"   r    ú<module>rR     s½  ððð ð$ 
€	€	€	Ø 
€
€
€
Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ø €€€Ø 
€
€
€
àˆt�H‰~Œ~×%Ò%Ñ'Ô'Ô.Ô5€ØÐ6Ñ6€Ø˜KÑ'¨(Ñ2€
Ø˜{Ñ*¨[Ñ8€Ø Ñ+¨lÑ:€Ø Ñ,¨}Ñ<€Ø  :Ñ-°Ñ6¸ÑBÐEXÑXÐ à€3€|ÑÔ˜CœHÐ$Ð$Ø„H‡O‚O�A�s�s˜<Ñ(Ô(Ñ)Ô)Ð)à $Ð $Ð $Ð $Ø QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QÐ QØ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ WÐ Wð €„�hÐÑÔð	ð 	ñ  Ôð	ð*@ð *@ð *@ð *@ð *@ñ *@ô *@ð *@ð`:|ð :|ð :|ð :|ð :|ñ :|ô :|ð :|ð@C1ð C1ð C1ð C1ð C1ñ C1ô C1ð C1ðR1-ð 1-ð 1-ð 1-ð 1-ñ 1-ô 1-ð 1-ðn )ð  )ð  )ð  )ð  )ñ  )ô  )ð  )ðLN?ð N?ð N?ð N?ð N?ñ N?ô N?ð N?ð N?ð N?r"   