
    jh                      d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m	Z	m
Z
 ddlmZ ddlmZmZmZmZmZmZmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZmZ  ej>                  e       Z!d8d9dZ"d:dZ#d;dZ$d<dZ%	 	 	 	 	 	 d=dZ&	 	 	 	 	 	 	 	 	 	 d>dZ'	 	 	 	 	 	 	 	 	 	 d>dZ(d?dZ)dZ*d<dZ+ e+       Z,d@dZ-d<dZ.dAdZ/dBdZ0dBdZ1dCdZ2	 	 	 	 	 	 	 	 	 	 	 	 dDdZ3	 	 	 	 	 	 dEdZ4dFdZ5	 	 	 dG	 	 	 	 	 	 	 	 	 	 	 dHd Z6 G d! d"e7      Z8 G d# d$e7      Z9 G d% d&e7      Z: G d' d(e7      Z;d)Z<dId*Z= G d+ d,      Z> e?       Z@dd-	 	 	 	 	 	 	 	 	 dJd.ZA	 	 	 	 	 	 	 	 	 	 	 	 dKd/ZBddd0	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dLd1ZCe	 	 	 	 	 	 	 	 	 	 	 	 dMd2       ZDdNd3ZEd<d4ZFdOd5ZGeGdd6	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dPd7       ZHy)Qu  still_recipe_service — s40/s41 레시피 스틸 생성 경로 (still_recipe_mode="v1").

SceneImageService.generate_images 의 배치 경로 대신 **스토리 순서 순차** 루프로
씬 스틸을 생성한다(prev 앵커=직전 선정·수정본 `_sel` — s40 체인 계약). 각 샷:

  참조 조립(still_recipe.build_still_refs: 플레이트/콘티/prev _sel/엔티티)
  → 프롬프트 조립(build_still_prompt: 텍스트 안전망 전체)
  → 공통 파이프(multiroll_select: N롤 nb2 → Gemini 단독 판정 → 선정 →
     결함 검사 → i2i 수정 → `_sel`)
  → ImageAsset primary 영속(save_single_scene_asset) + scene_cp 완료 마킹.

중간 산출(롤 A/B/C·수정 전 원본·record)은
`<scene_dir>/recipe/` 아래 파일 + records.json 으로 보존 — 재개(파일 단위
skip + critique 소급)와 리뷰 갤러리 소스. DB row 삭제·덮어쓰기 없음
(feedback_never_delete_images 유지).
    )annotationsN)contextmanager)datetimetimezone)Path)AnyDictIteratorListOptionalSequenceTuple)build_world_facts_block)build_place_facts_block)LegacyCarriedContractchar_sids_of)MANUAL_UPLOAD_PROMPTis_manual_upload c                &    d|  d|rd| z   S dz   S )u~  cine 변환 호출의 multiroll_tag. 슬롯이 있으면 뒤에 붙인다.

    ★주 호출과 대체 호출이 **같은 규칙**으로 만들어져야 한다 (Codex BLOCK 2).
     두 곳에 손으로 적으면 한쪽만 고쳐져, 영속부가 대체 산출을 못 잇거나 옛 주
     제공자 성공을 집어 **다른 제공자 그림을 주 모델로 기록**한다.
    still__cine_r    )tagslots     W/Users/manta/Documents/Projects/TheRoad-I1/backend/app/services/still_recipe_service.py	_cine_tagr   0   s(     C5AdV*=="==    c                    t        | t              r0t        | j                  d      xs d      j	                         }|r|S t        |      S )u8  최종 승자 변환이 **실제로 나간** 호출 태그.

    record 가 적어 둔 것을 그대로 쓴다 — 재사용(reused) 갈래에서도 그 값이
    살아 있어야 영속부 조회가 승자를 가리킨다. 없으면 주 태그로 되돌린다
    (이 필드가 없던 옛 record 호환).
    multiroll_tagr   )
isinstancedictstrgetstripr   )cine_recr   ts      r   _winner_cine_tagr)   :   sA     (D!_-34::<HS>r   c                   ddl m} ddlm}m}m} t        t        |dd      xs d      }g }t        |       h}t        d |j                  d      D              D ]e  \  }}	|	r|	|v r|j                  |	       |	|vr!t        j                  d|	t        |             C|j                  d	|	  ||	       ||	      f       g |S )
u  검열 거절 때 **차례로** 태울 제공자들의 (slot, client, identity) 목록.

    ★[2026-09-09] 왜 필요한가 — 파청(한말 의병 실화) 실측에서 MAI 변환
     194건 중 24건이 **검열**로 거절됐다(ViolenceScore 14 · imagegen safety 6
     · mainline 2 · DallEBlockList 2). 전투·부상 묘사가 많은 작품은 한 제공자
     기준에 통째로 막힌다. 사용자 지시: 「검열에 걸린 부분은 재시도해서 안
     되면 grok 으로」.

    ★안 넘기는 두 경우 — 설정이 비었거나, **주 제공자와 같을 때**. 같은
     제공자로 다시 부르면 같은 기준에 또 막힐 뿐이라 돈만 쓴다.
    ★모르는 제공자면 **조용히 넘기지 않고** 로그를 남긴 뒤 안 쓴다.
    r   settings)KNOWN_PROVIDERSbuild_cine_clientcine_provider_identity(still_cine_moderation_fallback_providersr   c              3  <   K   | ]  }|j                           y wN)r&   .0xs     r   	<genexpr>z-_cine_moderation_fallbacks.<locals>.<genexpr>]   s     ?1QWWYs   ,uW   검열 대체 목록의 %r 은 모르는 제공자다 (아는 것: %s) — 건너뛴다fb_)app.core.configr,   "app.modules.pipeline.cine_providerr-   r.   r/   r$   getattr	enumeratesplitaddloggerwarninglistappend)
main_providerr,   r-   r.   r/   rawoutseeninames
             r   _cine_moderation_fallbacksrI   H   s     )D D gh J  !C
CD?		#??4tt|&NNid?+-  	

c$L"3D"9*402 	3 @ Jr   c                 d    t        j                  t        j                        j	                         S r2   )r   nowr   utc	isoformatr   r   r   _nowrN   m   s    <<%//11r   c               (   ddl m} ddlm} ddlm}m} |r ||      }| xs i j                         D ]f  \  }}t        |t              r|j                  d      dk7  r+t        |j                  d      xs d      }	|	|k7  sO |d	d
| d| d|	xs ddd       y| xs i j                         D ]_  \  }}t        |t              st        |j                  d      xs d      }	|	j                  dd      d   }
|
|v sO |dd
| d|	 dd       y)ub  마네킹 콘티 CP ↔ 체인 플래그 정합 — lane_chain 분기 **밖**에서
    무조건 호출한다. 양방향 검사다.

    ① chain_ready=False + 마네킹 팩 CP = 마네킹 유출(아래 첫 루프).
       lane_chain=True 안에서만 검사하면 플래그를 내린 뒤 v14 CP 를
       재사용하는 경로가 그대로 남는다(그때 lane_chain 은 False 라 검사
       자체가 실행되지 않는다).
    ② chain_ready=True + 구(비마네킹) 팩 CP = 그 반대 방향의 같은 구멍
       (설계 §4.2(1)·BLOCKING-4 "소비자 exact revalidate"). 이 wave 전에
       lane 콘티를 구운 프로젝트의 entry 에는 `lane_sketch_pack` 키가
       **아예 없다**(스탬프 자체가 이 wave 산물). 운영자가 conti 를
       다시 굽지 않고 still_recipe/이미지 스텝만 재개하면(파일 상단
       주석이 경고하는 부분 실행) 구 v13 인물 그림에 Step1 이 "마네킹을
       회색 그대로 두라"는 bg_fill_head 를, Step2 가 "모든 마네킹을
       실제 인물로 바꾸라"는 stage_head_mannequin 을 건다 — 전부 조용히,
       유료 렌더를 태우면서. 일반 콘티 팩을 보는
       `bgfirst_conti_pack_mismatch` 는 이 wave 가 건드리지 않은 다른
       키(conti_pack)라 잡지 못한다. 키 부재·값 불일치 둘 다 fail-closed.
    r   AppError)LANE_SKETCH_PACK_VERSION)_MANNEQUIN_SKETCH_PACKSresolve_sketch_pack_versionstatusoklane_sketch_packr   z&still_recipe.lane_sketch_pack_mismatchu   lane 콘티(u   )가 기대 sketch 팩(u   )이 아님 (lane_sketch_pack=Nu   ) — 체인 ON 은 마네킹 콘티 전제이므로 구 팩 콘티를 새 계약으로 소비할 수 없다. shot_conti_light 를 먼저 재실행하세요 (fail-closed)  codemessagestatus_code.   z%still_recipe.lane_mannequin_chain_offu   )가 마네킹 팩 u    로 생성됐는데 bgfirst/bgfirst_full/lane_prev 플래그가 모두 ON 이 아님 — 마네킹이 legacy 조립으로 유출된다 (fail-closed))app.core.errorsrQ   $app.core.steps.shot_conti_light_steprR   'app.modules.pipeline.outdoor_marker_maprS   rT   itemsr"   r#   r%   r$   r=   )lane_entrieschain_readyrQ   rR   rS   rT   expectedr   entrypackselectors              r   _require_mannequin_chainri   q   sP   , )
 ./GH'-2446JC eT*eii.AT.Iuyy!34:;DxA&se+B8* M448LD3C DBB !$
 
 7$ 	#)r002
U%&599/06B7::c1%a(..<"3%':4& A$ $
  	 	 3r   c                   t        |       |z  dz  dz  |z  |z  dz  }|j                         r&	 t        j                  |j	                  d            S i S # t
        $ r"}t        j                  d||       Y d }~i S d }~ww xY w)Ncheckpointsepisodeszmanifest.jsonutf-8encodingu"   still_recipe: %s 로드 실패: %s)r   existsjsonloads	read_text	Exceptionr?   r@   )projects_dir
project_id
episode_idstep_idcpexcs         r   _load_cpr{      s     	\Z'-7*D
		!0	1  
yy{	O::bllGl<== I  	ONN?#NNI	Os   $A 	BA<<Bc                    ddl m} t        | |||      }|j                  d      }|j                  d      xs i }|dk7  s|s |dd| d|d	d
      |S )u  레시피 필수 상류 CP fail-closed (Codex 1차 리뷰 BLOCKING-1).

    mode=v1 에서 분류/연속성/콘티 CP 누락·비완료를 {} 로 삼아 조용히 일반
    인물샷으로 degrade 하면 레시피 계약이 무너진다 — 명시 에러로 차단.
    r   rP   rU   data	completedz still_recipe.upstream_incompleteu5   still_recipe_mode=v1 필수 상류 스텝 미완료: z	 (status=u-   ) — 해당 스텝을 먼저 실행하세요rX   rY   )r_   rQ   r{   r%   )ru   rv   rw   rx   rQ   ry   rU   r}   s           r   _require_cp_datar      sx     )	,
J	@BVVHF66&>RDD3Gy Q!*$QS 
 	
 Kr   c                    t        | xs d      j                  d      D ch c]"  }|j                         r|j                         $ c}S c c}w )u  운영자 선언 무콘티 예외 태그 파싱 (2026-07-30).

    쉼표 구분 샷 태그 목록을 집합으로 만든다. **빈 값·공백·None 은 빈 집합**
    이고 빈 집합은 어떤 샷에도 `tag in exempt` 를 참으로 만들지 않는다 —
    즉 기본값은 기존 경로와 byte-identical 인 no-op 이다. 인라인 comprehension
    이 아니라 이름 있는 함수로 둔 것은 이 no-op 성질을 유닛으로 고정하기
    위해서다(Codex 리뷰 #8: 신규 심볼 테스트 0건).
    r   r7   )r$   r=   r&   )rD   r(   s     r   parse_no_conti_exempt_tagsr      sK     SYB%%c**A779 	
	*  s   'A)
unresolved
incompleteblocked_dependencyc                     ddl m}  | S )Nr   GATE_DEPENDENCY_OUTCOME)%app.modules.pipeline.multiroll_selectr   r   s    r   _gate_dependency_outcomer      s     #"r   c                *   | y	 | j                   j                  |      }t        |t              sy|j                  d      }t        |t              r|j                  d      t        k7  ry|j                  d      }t        |      }t        |t              r||d<   n|j                  dd       | j                   j                  |      }|| j                   |<   	 | j                          t        j                  d|t        |t              r|xs i j                  d             yd       y# t        $ r0 || j                   j                  |d        || j                   |<    w xY w# t        $ r!}t        j                  d	||       Y d}~yd}~ww xY w)
u  앞 샷이 풀렸으면 이 샷의 **의존 대기만** 푼다 (2026-09-20 Codex BLOCK).

    ★종전에는 푸는 길이 **주석뿐이었다**. 한 번 `blocked_dependency` 가
     적히면, 부모가 나중에 clean 이 되어도 이 샷의 입력 지문이 그대로라
     `multiroll_select` 가 기존 record 를 그대로 돌려주고 — 기록의
     `gate` 는 여전히 의존 대기라 소비자 문이 **영원히** 막았다.

    ★푸는 것은 **의존 대기 한 겹**뿐이다. 이 샷 자신의 판정은 `prior` 에
     넣어 둔 것을 **그대로** 되돌린다 — `incomplete`·`unresolved` 였다면
     그 상태로 돌아가지 `clean` 으로 **올려 주지 않는다**.
    ★`prior` 가 없었으면(판정 기록이 아예 없던 샷) 대기 이전과 똑같이
     `gate` 키를 **지운다** — 없던 판정을 만들어 내지 않는다.
    ★유료 지출이 아니다 — 새 그림을 사서 푸는 것이 아니라 **메타만**
     대기 이전으로 되돌린다.
    NFgateoutcomeprioruo   still_recipe %s: 앞 샷이 풀려 **의존 대기 해제** — 이 샷의 원래 판정(%s)으로 되돌린다u   기록 없음TuH   still_recipe %s: 의존 대기 해제 실패 — 대기가 남는다: %s)r}   r%   r"   r#   GATE_DEPENDENCYpopsavert   r?   infor@   )recordsr   recgr   _beforerz   s          r   release_dependency_holdr     sv     &lls##t$GGFO!T"aeeI&6/&Ig3ieT"CKGGFD!
 ,,""3'S	LLN 	3,6ud,CU[bi(		"  !	"   	  d+  %,S!	  V	 	sA   +E( 9E( +A.E( D, *:E( %E( ,9E%%E( (	F1FFc                     ddl m}  | S )Nr   GATE_POLICY_VERSION)r   r   r   s    r   _gate_policy_versionr   B  s    Ir   c                 :    ddl m}  t        t        | dd            S )ue  이 저장소에서 게이트가 **켜져 있는가** — 적용 경계를 한 자리에서.

    ★소비자가 각자 판단하면 빠뜨린다 (2026-09-20 Codex). 종전에는 verify
     만 설정을 보고 `gate_holds`·`gate_blocks_prev_anchor` 에는 확인이
     없어, **꺼져 있는데도 옛 기록이 샷을 붙잡을** 수 있었다.
    r   r+   still_winner_gate_enabledF)r9   r,   boolr;   )_ss    r   
gate_is_onr   H  s     /7?@@r   c                    t               syt        | t              sy| j                  d      }t        |t              xr$ t	        |j                  d      xs d      t
        v S )u  이 샷을 **붙잡아야** 하는가 — 소비자가 읽는 단일 판정.

    cine 구매 · 자산 승격 · 완료 표시 · 다음 샷 앵커 · verify 집계가
    **모두 이 함수 하나**를 본다.

    ★**게이트가 꺼져 있으면 언제나 False** — 옛 기록이 남아 있어도
     멀쩡한 주행을 세우지 않는다. docstring 에만 적어 두고 코드가 안
     지키던 자리였다.
    ★`not_applicable`·`clean`·기록 없음은 안 붙잡는다.
    Fr   r   r   )r   r"   r#   r%   r$   GATE_HOLDING_OUTCOMES)recordr   s     r   
gate_holdsr   T  sY     <fd#

6Aq$ EAEE)$*+/DDFr   c                    t        |       S )uP   호환 이름 — `gate_holds` 와 같다(소비자가 하나를 봐야 한다).)r   )r   s    r   gate_unresolvedr   h  s    fr   c                   t               sy	 | | j                  j                  |      xs i ni }t        |      ryt	        |t
              r|j                  d      nd}t	        |t
              rt        |j                  d      xs d      st        j                  d|       yy# t        $ r!}t        j                  d||       Y d}~yd}~ww xY w)	u	  앞 샷을 뒤 샷의 앵커로 **쓸 수 있는가** — 못 쓰면 True.

    ★2026-09-20 Codex BLOCK. 「확정만 막고 `_sel` 은 남긴 채 다음 샷을
     계속」이면 **실격 그림이 후속 생성의 권위가 된다** —
     `still_recipe_service:3095-3098` 이 `{prev_tag}_sel.png` 가 있으면
     바로 참조로 붙이기 때문이다. 확정을 막는 것만으로는 늦다.

    ★★`incomplete` **도 막는다** (2026-09-20 Codex BLOCK 2).
     「품질 결함이 **확인되지 않았다**」는 「**사용해도 된다**」가 아니다.
     판정을 못 읽은 선정본이 뒤 샷의 권위가 되면, 아무도 안 본 그림이
     연쇄로 번진다. 복구는 **판정 복구**이지 새 이미지 재구매가 아니다.

    ★기록이 없거나 못 읽으면 **막지 않는다**(False) — 게이트가 안 돈 판과
     옛 기록을 그대로 쓰던 동작을 유지한다. 옛 `unresolved` 가 있다는
     이유로 게이트 OFF 주행까지 세우지 않는다.
    FNTr   r   r   u   gate_blocks_prev_anchor(%s): 앞 샷에 **판정이 없다** — 앵커로 쓰지 않는다(비대상이면 not_applicable 이 적힌다)u   gate_blocks_prev_anchor(%s): 게이트가 켜져 있는데 기록을 못 읽었다 — **검사 불가**로 보고 앵커로 쓰지 않는다: %s)
r   r}   r%   r   r"   r#   r$   r?   r@   rt   )r   prev_tagr   _grz   s        r   gate_blocks_prev_anchorr   m  s    " <"4;4Gw||)/RRc? !+3 5SWWV_42t$RVVI->-D")ENN[  	
 	Wc	 	s   .B% A'B% %	C.C

Cc                   	 | j                  |      }|t	        |      nd}
t	        |j                  d      xs d      t	        |      k(  }|
du xs! t	        |j                  d      xs d      |
k(  }|r|ryt        |      }||d<   |
|
|d<   |j                  d|       | j                  ||       t        j                  d||       y# t        $ r!}	t        j                  d||	       Y d}	~	yd}	~	ww xY w)u  재사용으로 끝나는 방문에서도 **CP 대표 = DB 대표**로 맞춘다.

    ★2026-09-20 Codex BLOCK. 사람이 손으로 올리는 것은 **파이프라인 밖**
     이라(`image_upload_service`) scene CP 를 안 고친다. 그래서 정상적인
     기본 경로가 이렇게 어긋난다:

         G 를 만들고 CP 대표 = G
         → 사람이 H 를 올린다 (DB 대표 = H, CP 는 그대로 G)
         → 입력 무변경 JIT 방문 → 재사용으로 `continue`
         → **CP 대표는 영영 G**

     새 그림을 사거나 G 를 다시 보관해서 풀 일이 아니다 — 메타 한 번만
     맞추면 된다. 이미 맞으면 **아무것도 안 쓴다**(다음 방문은 무기록).
    uA   still_recipe %s: CP 대표 확인 실패 — 정합 건너뜀: %sN
primary_idr   primary_path
recipe_taguQ   still_recipe %s: CP 메타만 정정 — 대표를 실제 대표(%s)로 맞췄다)
get_completedrt   r?   r@   r$   r%   r#   
setdefaultmark_completedr   )scene_cpstill_iddbrv   rw   held_id	held_pathr   currz   
_want_path_id_ok_path_okpayloads                 r   _reconcile_cp_primaryr     s   $$$X. $-#8YdJ &,"-W=FT!US)@)FB%G:%UH(3iG#GL",|S)Hg. KK[W/   	OQTVY	[s   C 	C5C00C5c                   |sy	 ddl m}  || |      du S # t        $ r!}t        j	                  d||       Y d}~yd}~ww xY w)u  이 **샷**에서 연출 재료가 변환 단계로 가는가 (2026-09-20 Codex 감사).

    카메라 산문은 「변환이 그것을 받는다」는 전제로 앞단에서 걷힌다
    (`omit_camera_direction`). 그런데 변환은 **샷마다** 건너뛸 수 있다 —
    사람이 변환본을 거절한 샷은 `human_keep_original` 이 서고 변환 호출
    자체를 안 한다(`:5276-5287`). 그 샷은 걷힌 CAMERA 를 **받을 자리가
    없어** 통째로 사라진다.

    실측(이 화 기록): 사람이 거절한 10샷 전부 `staging.camera_direction`
    은 있는데 base 프롬프트에는 그 문장도 `- CAMERA:` 도 없었다 —
    S5sh16 · S5sh9 · S88sh7 · S88sh24 · S90sh9 · S85sh11 · S20sh6 ·
    S79sh10 · S91sh5 · S82sh14.

    ★사용자가 끈 것을 되살리거나 변환을 다시 사서 푸는 것이 아니다.
     **그 샷에서 변환이 안 돈다면 앞단이 걷지 않으면 된다.**
    Fr   human_keep_originalNuG   cine stage-direction 샷 판정 실패(%s): %s — 앞단 CAMERA 유지)#app.modules.pipeline.cine_transformr   rt   r?   r@   )r   r   	global_onr   rz   s        r   _shot_cine_stage_dir_onr     sM    & 	K"7C0D88 U	 s    	A ;A c                   t        |xs d      }| j                  d      }t        |t              r|r||j                  d      k(  s|S t        |j                  d      xs( | j                  d      xs i j                  d      xs |      S )up  최종 라벨이 **게이트 재롤본**이면 그것이 물려받은 갈래를 돌려준다.

    재롤본 C 는 「어느 후보를 고쳐 다시 산 것」이라, 문안도 참조도 그
    후보(`from_selected`) 것이다. 그래서 **어느 갈래의 계보인가**를 물을
    때는 라벨 C 가 아니라 출처를 봐야 한다.

    ★초기 후보가 최종이면 **그 라벨 그대로**다.
    ★출처를 못 읽으면 게이트의 `initial_selected` 를 본다 — 재롤 base 를
     고를 때 쓴 값이 그것이다. 둘 다 없으면 라벨을 그대로 둔다(지어내지
     않는다).
    r   gate_rerolllabelfrom_selectedr   initial_selected)r$   r%   r"   r#   )r   selectedselrrs       r   _reroll_origin_labelr     s     hn"
C	M	"Br4 SSBFF7O-C

 	JJv$"))*<=	 r   c           	        h d}h ddfd|xs
 t               }i }| j                  j                         D ]  \  }}	d|v xr |j                  dd      d   |vxr ||k7  }
||k(  s|j	                  | d      s|
sG||k(  r7t        |	t              r'|	j                         D ci c]  \  }}||vr|| }	}}t        |	t              r-d|	v r)|	j                         D ci c]  \  }}|dk7  s|| }	}}t        |	t              rXt        |	j                  d      t              r9d	|	d   v r2i |	d|	d   j                         D ci c]  \  }}|d	k7  r|| c}}i}	||k(  r|t        |	t              ri |	d
|i}	||k(  rB|@t        |	t              r0t        |	j                  d      t              ri |	di |	d   d|ii}	 |	      ||<    t        j                  |dd      S c c}}w c c}}w c c}}w )u  #77-B: 이 샷의 record 묶음 직렬화 — 지출 흔적 탐지용.

    ★공유 record 포함(Codex 재리뷰 BLOCK): `groupbg::장소` 처럼 샷 tag
    네임스페이스 밖의 공유 record 도 이 샷을 처리하는 동안 갱신될 수 있고
    (그룹 배경 재생성 = 유료), 걷기는 샷 단위 직렬이라 "이 샷 전후로
    움직인 공유 record" = 이 샷의 지출이다. known_tags(전체 샷 tag 집합)를
    받으면, `::` 가 있는데 접두가 샷 tag 가 아닌 키 전부를 공유로 본다 —
    특정 접두 열거보다 넓어 새 공유 네임스페이스도 자동 포함된다.

    유료 재개 경로(소급 critique·재판정·외부 2택1 등)는 전부 record 를
    갱신한다(재개 규율 — 갱신 없는 유료 호출은 재개마다 재지출되는 결함).
    그래서 "record 가 안 움직였다"가 "돈이 안 나갔다"의 근거가 된다.
    산출 bytes 만 보면 결함 없음으로 끝난 소급 critique 처럼 **돈은 나가고
    bytes 는 그대로**인 경우를 놓친다(2026-08-09 Codex 리뷰 재현).

    표기용 키(ref_mode 등)는 뺀다 — 코드 배포로 문구만 바뀌어도 전 샷이
    "지출"로 읽혀 제동이 거짓 발동하는 것을 막는다. 유료 흔적(critique·
    fix_rejudge·plate_select·conti_ab_decision·bgfirst 기록)은 남는다.
    ★tag prefix 는 반드시 `==` 또는 `::` 경계 — "S1sh1" 이 "S1sh10" 을
    삼키면 안 된다.
    >   ref_mode
share_planlane_policycritique_skippedstaged_characters_addedlocked_char_refs_excluded#locked_char_refs_kept_body_identity>   reusedshot_run_uidshot_run_producedc                   t        | t              r?| j                         D ci c]#  \  }}|vr|j                  d      s	| |      % c}}S t        | t              r| D cg c]
  } |       c}S | S c c}}w c c}w )N	_this_run)r"   r#   rb   endswithrA   )vkkvvr5   _scrub
_transients       r   r   z!_jit_tag_snapshot.<locals>._scrubE  s    a-.WWY-662rZ'K0H F2JY  a'()q!F1Iq))
 *s   (A9%A?z::r^   r   r   bgfirstwinner_originr   r   pending_pickFT)ensure_ascii	sort_keys)r   r   returnr   )
setr}   rb   r=   
startswithr"   r#   r%   rq   dumps)r   r   
known_tagsselected_overridereroll_pending_override_presentation_knownbundlekr   _sharedr   r   r   r   s                @@r   _jit_tag_snapshotr     sB   4M8 AJ  35FF""$1AIH!''$*1-V;HS 	 8q||se2J/7CxJq$/*+'') 1)B-/ V) 1  !T"v{*+'')D)BrV|RV)D 1d#
1553CT(J'1Y<7/q /))*9););)=&.)=vr2_, F)=&. / S.:"1d+8q8*&78 S4@"1d+"155#7>>q >- *=&*="$;*= > q	F1IK %L ::f5DAAA1" E&.s   +G0&G64G6G<c                      e Zd ZdZy)StillJitRegenLimitExceededu  #77-B 폭주 제동 — 완료 샷의 JIT 재생성이 상한에 닿았다.

    완료 샷이 무더기로 어긋난다는 것은 지문 체계가 통째로 움직였다는 뜻
    (팩·설정 대량 변경 또는 결함) — 확인 없이 과금으로 옮기지 않는다.
    상한 도달 시 recipe 디렉토리에 래치 파일을 먼저 남기고 raise 하므로,
    자동 재시도(resume 루프)는 **지출 없이 즉시 같은 예외**로 끝난다
    (2026-08-09 Codex BLOCK 3 — 래치 없이는 바퀴당 상한만큼 돈이 샌다).
    해제 = 사람이 원인 확인 후 래치 파일 삭제 (+필요시 STILL_JIT_REGEN_
    LIMIT 상향) 후 resume.N__name__
__module____qualname____doc__r   r   r   r   r     s    !r   r   c                      e Zd ZdZy)StillJitVerifyIncompleteu<  #77-B — JIT 검증 대상 샷이 실패한 채 걷기가 끝났다.

    완료 샷의 재생성 실패는 옛 primary 가 남아 있어 스텝 집계(primary
    개수)에 안 잡힌다 — 그대로 두면 스텝이 completed 로 닫히고 새
    config_hash CP 가 봉인돼, 다음 resume 은 whole-step SKIP 으로 그
    낡은 샷을 영구 동결한다(2026-08-09 Codex BLOCK 1). 그래서 걷기 끝에
    이 예외로 스텝을 실패로 남긴다 — resume 재시도는 성공분을 전부
    재사용(지출 0)하고 실패분만 다시 시도한다.Nr   r   r   r   r   r     s    Cr   r   c                      e Zd ZdZy)StillCineTransformIncompleteu  #108 (Codex R1 BLOCK-1) — cine 변환 실패 샷을 남긴 채 걷기가 끝났다.

    실패 샷은 원본 sel 로 영속돼(체인 안전) 스텝 집계에는 안 잡힌다 —
    그대로 completed 로 닫으면 config_hash 가 그대로라 다음 resume 이
    whole-step SKIP 하고, "변환 스테이지 ON 완주"가 실은 일부 미변환인
    채 봉인된다(결과 오독). 걷기 끝에 이 예외로 스텝을 실패로 남긴다 —
    resume 재진입은 건강한 샷 전량 재사용(지출 0)+실패 변환만 재시도
    (~$0.03/샷)라 바퀴 비용이 유계다. 영구 실패는 autodrive 상한(3회)
    에서 사람에게 올라온다.Nr   r   r   r   r   r     s    )r   r   c                      e Zd ZdZy)StillEraPreserveIncompleteu#  (era R2 BLOCK-1) — era 조사 미성립으로 기존 배경을 보존한 채 걷기가
    끝났다.

    보존 분기는 현재 계약 검증(모델·팩·group/context_sig·prompt·conti
    지문 대조)을 통째로 미룬다 — 그대로 completed 로 닫으면 새 config_hash
    CP 가 봉인돼 다음 resume 이 whole-step SKIP 하고, 검증 안 된 옛
    배경 위에 진짜 drift 까지 영구 동결된다(StillJitVerifyIncomplete 와
    같은 부류). 걷기 끝에 이 예외로 스텝을 실패로 남긴다 — resume 은
    성공분 전량 재사용(지출 0)하고 보존 그룹의 조사만 재시도하며, 조사
    성공 방문이 현재 계약을 정상 검증한다. 조사가 계속 실패하면
    ERA_RESEARCH_ENABLED 전환 여부는 사람이 결정한다.Nr   r   r   r   r   r     s    
Er   r   zJIT_REGEN_LATCH.jsonc                <   ddl }| t        z  }dd|j                   j                  |j                  j                        j                         d|}|j                  d      }|j                  t        j                  |dd	      d
       |j                  |       |S )uL   상한 래치 영속 — 있으면 다음 걷기가 지출 전에 멈춘다.r   Nu   완료 샷 JIT 재생성이 상한에 닿았다 — 지문 체계가 통째로 움직인 사고 의심. 사람이 원인을 확인하기 전까지 이 스텝의 재실행은 지출 없이 즉시 실패한다.uk   원인 확인 후 이 파일을 삭제하고 (필요시 STILL_JIT_REGEN_LIMIT 상향) resume. force 금지.)whyhow_to_clearat.tmpFr^   r   indentrm   rn   )r   JIT_LATCH_FILENAMErK   r   rL   rM   with_suffix
write_textrq   r   replace)
recipe_dirr   _dtpathr   tmps         r   _jit_write_latchr    s    **D>
2 lls||//0::< G 

6
"CNN

7q9G  MKKKr   c                       e Zd ZdZddZddZy)_RecordsuO   recipe 디렉토리의 multiroll record 영속 — 재개(critique 소급) SOT.c                    || _         i | _        |j                         r,	 t        j                  |j                  d            | _        y y # t        $ r t        j                  d       Y y w xY w)Nrm   rn   u6   still_recipe: records.json 파싱 실패 — 재생성)	_pathr}   rp   rq   rr   rs   rt   r?   r@   )selfr
  s     r   __init__z_Records.__init__  s_    
$&	;;=Y JJt~~w~'GH	   YWXYs   *A A-,A-c                    | j                   j                  d      }|j                  t        j                  | j
                  dd      d       |j                  | j                          y )Nr  Fr^   r  rm   rn   )r  r  r  rq   r   r}   r  )r  r  s     r   r   z_Records.save  sP    jj$$V,JJtyyuQ? 	 	
 	DJJr   N)r
  r   r   None)r   r   r   r   r  r   r   r   r   r  r    s    YY r   r  )repair_modec                ~    | r| j                  d      si S |r|dk(  rddddS ddddS d|rt        |      d	dS dd	dS )
uJ  변환의 **직접 입력이 무엇이었는지** 밝힌다.

    실측: 최종 씬 자산 510개 중 input_image_ids 가 있는 것은 6개(1.2%).
    변환이 적용되면 직접 입력이 `_sel.png` 파일이라 unresolved 로 빠진다.

    ★**파일 이름으로는 못 가른다.** `_critique_and_fix` 는 원본이든 수리본
    이든 승자를 언제나 canonical `_sel` 에 복사하므로 `source_file` 은
    `cine_transform.py:164` 에서 **항상 `_sel.png`** 다. 승패는
    `fix_stage_won(record)` 이 말한다.

    ★**자산 id 로 잇지 않는다.** 롤도 수리 산출도 `image_asset` 이 아니다 —
    파일로만 존재한다. 없는 것을 지어내면 계보 선이 엉뚱한 자산을 가리키고,
    그것은 과다 기재보다 나쁘다. 대신 **왜 못 이었는지**를 적는다.
    _sel.png
regenerateN$regen_output_not_registered_as_asset)stage
roll_labelunresolved_reasonfix"fix_output_not_registered_as_assetrollroll_not_registered_as_asset)r   r$   source_filer   fix_wonr  s       r   describe_cine_sourcer%     s}    $ k22:>	 ,&)>@ @ d%IK 	K+3#h-!?A A9=!?A Ar   c                   ddl m}m} 	  || j                  d      ||||      S # |$ r} || d|j                         |d}~ww xY w)u  그 샷에 나갈 CARRIED 본문 (감사 1-B, 2026-08-27).

    계약 본체는 `shot_continuity_author.carried_clause_for` 하나뿐이다 —
    소비하는 자리가 넷이라 각자 쓰면 한 곳이 빠진다. 여기서는 어느 샷에서
    막혔는지만 덧붙인다.
    r   )r   carried_clause_forcarriedvisible_short_idsbg_only: N)+app.modules.pipeline.shot_continuity_authorr   r'  r%   r[   )
continuityr   r  r*  r+  r   r'  rz   s           r   _carried_clauser/  #  sa    
F!NN9%sC/B 	B ! F#se2ckk]$;<#EFs   & AAA)cine_call_modelbase_call_modelc        
           | r.|xs dj                         xs |xs dj                         xs dS |r|S |	xs dj                         r|	j                         S |dk(  s|r|r|S |dk(  r ddlm}
 t        t	        |
dd      xs |      S |S )u  최종 bytes 를 **실제로 만든 모델**을 고른다 (감사 0-B).

    ★2026-08-26 실측 사고: 변환(cine)이 적용된 자산 7/7 이
    `x-ai/grok-imagine-image-2.0` 으로 기록돼 있었는데 실제 변환은
    `reve/2.1/edit` 였다. 그 자리가 설정값(`grok_image_model`)을 박고 있었고,
    변환 제공자가 교체 가능해진 뒤로 실행과 어긋났다. 바로 위 주석은
    「변환 모델 유지」라고 말하고 있었고 **코드만 안 따라왔다**.

    우선순위:

    1. 변환이 적용됐으면 **그 변환 호출의 모델**. 순서는
       ① `generation_call_id` 가 가리키는 실제 호출(`cine_call_model`) →
       ② 변환 record 의 `model`. 둘 다 없으면 **`None`** — 모른다고 남긴다.
    2. 안전 사다리가 회복한 자산이면 **실제로 성공한 호출의 모델**.
    3. 그 밖에는 롤 백엔드 실물 — grok2 스위치이거나 G+G46 에서 수리가
       최종이면 grok, 아니면 gemini.

    ★변환 갈래에서 **설정값으로 내려가지 않는다** (2026-08-26 Codex BLOCK-3).
     옛 record 에 `model` 이 없을 때 grok 을 적으면, 이 판이 방금 고친 것과
     **같은 거짓 기록이 재발**한다(backfill 은 `image_asset` 만 고치고
     `records.json` 은 그대로라 다음 JIT 영속이 그 옛 record 를 다시 쓴다).
     제공자를 모를 때 설정값을 적는 것은 빈 칸보다 더 확정적인 거짓말이다 —
     `generation_model` 은 nullable 이므로 모르면 비운다.
    r   Ngrok2gpt25r   r+   openai_image_model)r&   r9   r,   r$   r;   )cine_applied
cine_modelladder_modelstill_image_backendgg46_judge_onr$  
grok_modelgemini_modelr0  r1  r   s              r   resolve_generation_modelr=  >  s    J %2,,.T:3C2J2J2LTPTT 	2$$&$$&&g%-G g%2723R8HLIIr   c          	   #     K   ddl m} t        |dd      sd yddlm}  || |d|||d      5  d ddd       y# 1 sw Y   yxY ww)	uS  샷 하나를 capture scope(=Opik 샷 trace)로 감싼다.

    ★**설정이 꺼져 있으면 scope 자체를 안 연다.** scope 가 열리기만 해도
    `ambient_call_meta`(`image_tracer.py`)가 `still_id`·`scene_index`·
    `shot_index`·`stage` 를 읽어 **v1** trace metadata 와 DB
    `llm_call_log.metadata` 에 싣는다 — 그러면 꺼 놓고도 Opik payload 가
    지금과 달라져 「OFF 는 바이트 동일」이라는 되돌리기 안전판이 깨진다
    (2026-08-24 Codex BLOCK 1).

    ★`capture=False` 다. scope 를 여는 것은 그 자체로 중간물 포착을 켜는
    것이라(sink 의 default-capture-off 규약), 그냥 열면 롤·수리·변환
    성공분마다 `is_intermediate` 자산 행과 spool 파일이 새로 생긴다.
    이 일은 기록 체계화지 자산 늘리기가 아니다.
    r   r+   opik_trace_v2_enabledFN)generation_contextscene_image_pipeline)r  r   scene_index
shot_indexcapture)r9   r,   r;   "app.services.image_capture.contextr@  )rv   rw   r   rB  rC  r,   r@  s          r   _shot_capture_scoperF  z  sQ     . )84e<E	J %{z
 	
 
 
s   .A
>	A
AA
c                "    ddl m}  || |      S )uW   발송 맥락 — 소유자가 씌운다(장부가 없으면 아무 일도 안 한다).r   )send_contextworkvisit)app.core.send_ledgerrH  )rJ  rK  rH  s      r   _send_contextrM    s    1T//r   c                 V    	 ddl m}  t         |        xs d      S # t        $ r Y yw xY w)u  **샷 trace 안에서** 이 방문의 신원을 읽는다 (Codex BLOCK 1).

    ★부르는 자리가 정해져 있다 — `_shot_capture_scope` 에 **들어간 뒤**
     여야 한다. 그 앞에서 부르면 부모 스텝의 uid 가 잡혀 여러 샷이 같은
     신원으로 적힌다.
    ★못 구하면 **빈 문자열(미상)**. trace 가 꺼져 있으면 그대로 둔다 —
     관측을 위해 억지로 켜지 않는다.
    r   current_shot_uidr   )app.modules.llm.opik_tracerP  r$   rt   rO  s    r   _owner_send_visitrR    s0    ?#%+,, s    	((c                D     ddl }|j                         d fd       }|S )u  걷기 전체에 **발송 장부를 씌운다** (2026-09-20 Codex BLOCK 2).

    ★설치를 본문 안에 두고 정상 흐름에서만 복원·보고했더니, 걷기 도중
     상한 예외가 나가면 ①앞 샷들의 발송 보고가 **통째로 사라지고**
     ②끝난 걷기의 장부가 **스레드에 남아** 다음 작업이 거기 들어갔다.
     그래서 범위를 **함수 바깥**으로 올려 성공·예외 어느 쪽이든 복원·
     보고한다.

    ★`functools.wraps` 로 감싼다 — `inspect.getsource` 가 **본문**을
     그대로 돌려줘야 한다. 이름을 바꾸거나 껍질을 노출하면 본문을 읽는
     기존 시험 여덟이 **엉뚱한 소스를 본다**(실측).

    ★장부는 **보고값이지 제동이 아니다.** 기존 예산·상한·래치는 그대로
     둔다 — 아직 못 재는 경로를 0 으로 치고 제동을 푸는 것이 이 판의
     병이었다.
    ★`llm_call_log`·Opik 과 **합산하지 않는다**(같은 발송을 두 번 센다).
    r   Nc                 v    ddl m}m} dd} | |       |      5   | i |cd d d        S # 1 sw Y   y xY w)Nr   )
SendLedgerledger_scopec                L    t         j                  d| j                                y )Nu   still_recipe 발송 장부: %s)r?   r@   summary)leds    r   _reportz4_with_send_ledger.<locals>._wrapped.<locals>._report  s    NN;S[[]Kr   )report)rY  r   r   r  )rL  rU  rV  )argskwargsrU  rV  rZ  fns        r   _wrappedz#_with_send_ledger.<locals>._wrapped  s3    A	L *,w7t&v& 877s   /8)r\  r   r]  r   r   r   )	functoolswraps)r^  r`  r_  s   `  r   _with_send_ledgerrb    s*    $ __R' ' Or   )target_scenesc                D   
GHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ ddl m ddlm}m}mymzm}m}m	{m
}mm}mG ddlm}m^m_mm ddlm} ddlm}m} ddlm}m}m} ddlm} j<                  } t?        j@                        tC        jD                        ddrtG        tI        d	d
      xs d
      nd
}!d}"|!dk(  rddlm%}#  |#       }"tC        jL                        }$tC        tI        dd            }%tC        tI        dd            }&tC        tI        dd            }'tC        tI        dd            }(tC        tI        dd            })|)xr tC        tI        dd            }*tO        tI        dd            }+|+r)tP        jS                  dtU        |+      tW        |+             tY        | d      },|,j[                  di       xs i a|,j[                  di       xs i `|,j[                  d      xs dj]                         }-|-rd|- ndtY        | d      }.tY        | d      }/|)r|(sddl/m0}0  |0d d!d"#      tC        tI        dd            r|)sddl/m0}0  |0d$d%d"#      |(rMddl/m0}0 dd&lm1}1  |1|)rd'nd(      }2|/j[                  d)      |2k7  r! |0d*d+|2 d,|/j[                  d)      d-d"#      i }3te        | d.      j[                  d/i       xs i }4|4j[                  d0      xs i j[                  d1      rtg        |4d0   d1         }3i ui }5|4j[                  d0      xs i j[                  d2      xs g D ]  }6tG        |6xs i j[                  d3      xs d      }7|6xs i j[                  d4      xs g D ]  }8|7utG        |8      <    |6xs i j[                  d5      xs g D 9cg c]B  }9ti        |9tf              r0tG        |9xs i j[                  d6      xs d      j]                         D }:}9|7stk        |:      s|:D ;cg c]  };|;s|;	 c};|5|7<    i }<te        | d7      j[                  d/i       xs i j[                  d8g       xs g D ]  }=ti        |=tf              stG        |=j[                  d9      xs d      j]                         }>|>sCtG        |=j[                  d:      xs d      j]                         }?|=j[                  d;      xs g D @cg c]4  }@tG        |@      j]                         rtG        @      j]                         6 }A}@|>}B|?rBd<|? z  }BArBd=d>jm                  A      z   d?z   z  }BB|<|><    te        | d@      j[                  d/i       xs i j[                  dAi       xs i Wte        | dB      }Cto        |C      }DdWfdC}E|/j[                  dDi       xs i c|/j[                  dEi       xs i ~ddFlm8}Fm9}Gm:}Hm;}Im<}J |/j[                  dGi       xs i }Kt{        |KtC        |(xr |*      H       ddIlm>}Lm?}M  |La |M             a|/j[                  dJi       xs i }N ||       }OddKlm@}P t               }Q~j                         D ]m  \  }R|Rxs i j[                  dL      }S|Sst        S      j                         s9 P      \  }T}Ut        S      O|T dM|U <   Qj                  |T dM|U        o tC        tI        dNd            }VtC        tI        dOd            }Wi }Xi }Y|VrddPlFmG}ZmH}[  |Z|       \  }\}Y |[|\      }Xte        | dQ      j[                  d/i       }]i }^|]j[                  dRg       xs g D ]>  }_|_j[                  dS      }Tti        |Tt>              s%_j[                  dT      s7_dT   ^T<   @ te        | dU      j[                  d/i       }`i |`j[                  dg       xs g D ]:  }a|aj[                  dS      }T|Taj[                  dV      s)adV   t?        T      <   <  | ^      xddWlImJ}b ddXlKmL}cmM}d ddY[te        | dZ      j[                  d/i       xs i }ei V|ej[                  d[      xs g D ]  }6|6j[                  d\      xs g D ]x  }ftG        |fj[                  d]      xs d      j]                         }g|gs2fj[                  d^      }h|hd_u rdnhdu rcnd}igVv rVg   ik7  rdVg<   fVj                  gi       z   j                  b      j                  |bj                  k(  |bj                  d`k(        j                         D jci c]  }j|jj                  rjj                  |j c}jLdLfdaMd MV[fdbNddc}ki }lj                         D ]d  \  }m}n k|ndd      }o|os	 ti        otF              rt        j                  o      no}pti        |pt              rdejm                  df pD              lm<   f i }qi }r|D ]8  }s|sj[                  dS      |sj[                  dg      }U}T|TU+g }ti }u	 t        j                  sj[                  dh      xs di      D ]  }vti        |vtf              rtvj[                  dj      xs vj[                  dk      }mti        |mtF              sHmsKtj                  m       vj[                  dl      }wti        |wtF              s~wswum<   ti        vtF              svstj                  v        	 tqt?        T      t?        U      f<   urt?        |T      t?        |U      f<   ; |D sci c]  }s|sj                  tI        |sdmd      xs d  }x}sddnlm\}ym]}z  |y      }{|D |ci c]!  }|||j                   ztI        ||dod      {      # }}}|ddplm^}~m_}m`} dd&lm1  dqGr      w |       } |       }tI        dsdt      }|duk(  rj                  ndvk(  rtI        dwd      nj                   dx       |G       ~G      dyidtk7  r idz<   dd{lmc}md}  |       }||k7  rid|<   tC        tI        d}d            ttr|id~<    ||      id<    ~|      id<   tC        tI        dd            rGddlme}mf} |id<   j                   dj                   id<    ||      id<    ~|      id<   tC        tI        dd            ssraddlmi}mj} |id<   ddlmk} |id<   ddlm`}  |       id<   dr3 |      id<    ~|      id<   tG        tI        dd            id<   dxr tC        tI        dd            ki jkr<ddlml}mm}mn}  ||      jd_id<    ||      id<    ~|      id<    |       id<   tC        tI        dd            hhr&ddlKmo}mp}mq} |id<    |       id<    |       id<   tC        tI        dd            }tC        tI        dd            }ddlrms}  
        n	t               }ddltmumv}  |d j                         D              d
fd}t               fi }i }rddlImw}mJ}b ddlxmy}  |       D ]7  }j                  |j                  g       j                  |j                         9 j                         D ch c]  }|D ]  }|  }}}|r} j                  b      j                  |bj                  j                              j                         D ]3  }tI        |d:d      xs dj]                         }|s%j                  <   5 tC        tI        dd            }i }|rFddl~m}m}m}  |        |       tG        tI        dwd            tG        tI        dd            |d}|$rddlm}  |      id<   |%rddlm}  |      id<   |&rddlm<}  |      id<   |(rddlm}m}mH  H      id<   |id<   |id<   tG              id<   |)rddlm}m} |id<    |      id<   tC        tI        dd            r*ddlm}m}m}  |      id<   |id<    |      id<   Kr- H      id<    G      id<    I      id<   Fid<   ddlm} ddlm} tI        dsdt      }|duk(  rddlm}  |       ndvk(  rddlm}  |       n         ī      tC        tI        dd            }d}d}d}d}i }d}|xr tC        tI        dd            }rQddlm}m} ddlm} ddlm}m}m}m}m1} rn}rdn       }       } |      }        } |d         }dd{fd̄}drsrddlm}  |ƫ       rddr{fd̈́| zwd    _       d_ϫ      dЬѫ      vsrddlm}  | ^d_kӫ      dԐkի      enTr | ^d_kӫ      dԐkի      en8tr | ^k֫      dԐkի      en ywd    ^k֫      dԐkث      ei UdGU^_ekstyzfdڄTdltC        tI        dd            ritC        tI        dd            rRddlm}  ddqGr      } ||      } z|d    _ dޫ      d_ϫ      d|ʬ      ltG              id<   |ʐid<   tC        tI        dd      xr tI        dd            qdpi oi mi OddGO_zfdnqrXt?        dt?        tI        dd                  PddiQdPQfdptG              |doddlm}m%}  |̫       m|ːod<   dbdrhtsesbss_tC        tI        dd            rHddlm}m}m
}  | ^k֫      kd      b ||ͫ      id<   tG        tI        dd            id<   tC        tI        dd            }d}i }i }|rddlm}m}m}  |dx      j]                         } |dx      id<   |Ԑid<   tG              id<   i }dD ]  } |dqGr      }||<    z|d    _ |ث      d_ϫ      dѬ      |<   sr!ddlm}  | ^d_kӫ      dԐkի      <   ]r | ^d_kӫ      dԐkի      <   {tr | ^k֫      dԐkի      <    yd    ^k֫      dԐkث      <    d}d}d}d}dK|(rddlm} ddlm}  |       } ddqGr      } z|d    _ dޫ      d_ϫ      d|ެ      }ېsrddlm}  | ^d_kӫ      dԐkի      }nPr | ^d_kӫ      dԐkի      }n5tr | ^k֫      dԐkի      }n yd    ^k֫      dԐkث      } ߐtU        jV                              K|dz  jY                  d_d_       t[        dz        	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d	HKX ~fd}	 	 d
	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dKMNR\ fghufd}i d fdXi }tW        |D scg c]&  }s|sj[                  dS      sj[                  dg      s( c}sd 	      }|D sci c]'  }s |t?        |sdS         t?        |sdg               |sdj   ) }}sD sci c]0  }s |t?        |sdS         t?        |sdg               t?        |sdS         2 c}s\i }t        uj                               D ]  }7|7stW        uj                         D 86ch c]  \  }8}6|6|7k(  r|8\v r\|8    c}6}8      }tW        |D ch c]%  }|<j[                  xj[                  |d      d      ' c}dhz
        }d
jm                  |      t]        |5j[                  |7d            d|7<    d\`acxfdRd}|rddlm}m}m}m}m}m}  ||      }j                         D vci c]  \  }}v|v|
 }}}vD cg c]  }|   	 }} t              a|3      } ||t        |            \  }}|D @ch c]  }@|@   	 }}@  |        |D @cg c]  }@|@   	 c}@d             tP        jm                  dt        |      tU              tU              tU                     tU              }|}d}'tU        D cg c]  }|dj   v r	dj   |vr c}      }d}d}d} d}d}g }g }to               rtI        dd_      stq        d      g }g }g }g gd}d}	g }
t?        dt?        tI        dd                  }D ch c]#  } |t?        |dS         t?        |dg               % }}tC        tI        dd_            }|r4tr        z  j                         rtu        dtr        z   d      tw              D I]  \  }}st?        |sdS         t?        |sdg         }U}T ||T|U      |sdj   vr<d}|v rtI        dd_      sUti        jx                  j[                        tf              s(dz  }|dk(  rtP        jS                  d        k\  rCt{               }tu        d d d| d| d|  d| d?      d_}t}              }	 t?        jx                  j[                        xs i j[                  d      xs d      }	t        TU       5  t        t               !      5  aj[                        xs i }|j[                  d"d_       }tG        |j[                  d#      xs d      j]                         }Kj[                        xs i }d}d}d}d}d}d}d}d}|rAj[                  d$      d%k(  r)j[                  d&      xs d}||d'k(  rd(j[                  d)       ndz   }j[                  d*      xs d}|d+vrMd,d-}tP        j                  d.|       |j                  |       	 ddd       ddd       ǐd/v rj[                  d)      d0k(  } d1k(  r s	j[                  d2      xs d}!j[                  d      }"|!rt        !      j                         r"sMd3!d4}tP        j                  d.|       |j                  |       	 ddd       ddd       Oj[                  T dMU       Gd5}tP        j                  d.|       |j                  |       	 ddd       ddd       t        !      }"}n֐d1k7  rϐd6k(  xs j[                  d)      d7k(  }#|#rj[                  d       xs d}$j[                  d      }"|$rt        $      j                         r"sMd8$d9}tP        j                  d.|       |j                  |       	 ddd       ddd       t        $      }"}d6k(  }nWd:tG        j[                  d;      xs d<       z   }tP        j                  d.|       |j                  |       	 ddd       ddd       Hrj[                  d=      xs d}%j[                  d&      d>k7  s%rt        %      j                         s|+v rtP        jS                  d?       n}d@tG        j[                  d;      xs dA%       z   }tP        j                  d.|       |j                  |       	 ddd       ddd       "d_}t        %      }j[                  d0      }&|3j[                        }'|'ddBlmǐ}(  |(&'      }&ti        'tf              xr 'j[                  dC      d0k(  })d}*d}+tC        &      xr	  xs )},|,rt        &      rtg        jx                  j[                        xs i       }-|-j[                  dD      }.ti        |.tf              r/.j[                  dE      t        k(  r.j[                  dF      }.t        &t               .dG-dD<   |-jx                  <   j                          j                         tP        jS                  dH|&       	 ddd       ddd       Аto               rt               r)r)&r%& dIz  }/|/j                         r/}*nddJlmΐ}0 ddKlImϐ}1 j[                  &      }2|2r j                  1      j                  |1j                  k(  |1j                  k(  |1j                  2k(  |1j                  dLk(  |1j                  dk(        j                         nd}3|3r 03j                        nd}S|S"Sj                         rS}*3j                  }+ntP        jS                  dM&       r=*:)r7d}xs d6dNz   }d}d}d}d}tP        jm                  dO&       r>)r;*8rd(z   nddPz   }d}d}d}d}tP        jm                  dQ&       |j                  sj[                  dh            }4t        |4      }5 TU      }6|4D vch c]#  }vti        |vtf              rvj[                  dj      % }7}vg }86D ]  }9j[                  |9      xs i }:|:j[                  dR      };|;r5j                  tG        ;             97vsU8j                  9;:j[                  d9      dSdT        d}<rtC        j[                  dU            rsddVl~mؐ}=mِ}> |.j[                  dW      xs i j[                        xs i }?	 t        |.?5X      }@dZjm                  d[ d\tG        xj[                        xs sj[                  d]      xs d      z   d^@z   d_tG        j[                  d`      xsA `j[                  tG        T      i       j[                  d`      xs xj[                  Td            z   fD              }B da}C =|B      }Djx                  j[                  |C      }Eti        |Etf              rdbEvsEj[                  dc      Dk7  r< >Bī      }ED|Edc<   |Ejx                  C<   j                          tC        Ej[                  db            }<|<s8tP        jm                  ddtG        Ej[                  de            ddf        tC        j[                  dU            xr
  xr < }F|*xr }Gddglmݐ}H  |H|Gh      }I|IrdnOj[                  T dMU       Grnri ncj[                        xs i }J|Jj[                  d=      }K|Kr&t        K      j                         rt        K      nd}Ld}Mddilmސ}N <rdj}OnLtG        Jj[                  dL            tG              k7  r\dkJj[                  dL      dl}tP        j                  d.|       |j                  |       	 ddd       ddd       dj}On" NV*duT dMU Qv dum      }OOdnk(  r>Yj[                  T dMU       xs d}PddolFmߐ}Qm}R  |Q|P      }=Xj[                  |=xs dg       }SPr6tU        S      dkD  r%ddplm}T  Rxj[                        xs sj[                  d]      xs dj[                  d`      xsA `j[                  tG        T      i       j[                  d`      xs xj[                  Td      PSTq      \  }U}V}M|U|Pk7  rtP        jm                  drPUMxs i j[                  ded             VnGOdsk(  r@ddtlm}W 	  WVrNj[                        ndJj[                  dL      u      \  }Me<sbj                         sMdv dw}tP        j                  d.|       |j                  |       	 ddd       ddd       3dxk(  rM*J<sGdy}tP        j                  d.|       |j                  |       	 ddd       ddd       ddzlm}Y *! Y|.j[                  d{      xs g &      n	t               }Z |qTUf      \  }[}\g }]6D ]a  }9|9[vs[j                  9       ]j                  tG        j[                  |9      xs i j[                  dR      xs 9             c }j[                        xs i }^d||^v rd}^d|    nd~^v rd^d~    nd}_|_rCtP        j                  d._       |j                  |_       	 ddd       ddd       i rj[                  TUfi       j                         D vci c]  \  }}v| {|v      xs v c}v}^}`|j                  t        4      8z   |
r
j[                  T dMU       nd      }a4D vci c]4  }vti        |vtf              r"vj[                  dj      |vj[                  dR      6 }b}vg ]g i 	 	 	 	 dfdY	 	 d]fdJg }cg }dg }eg }fg }gg }h[D ]e  }mj[                  |m      }n|nsnj[                  d9      xs m}inj[                  d      xs d}j|jdSk(  rlj[                  m      }kej                  |kri dk d?ni       mv rfj                  i       bj[                  m      xs nj[                  dR      xs d}l|lr&lZv r mv rhj                  i dl d?       nElrBlZv r<gj                  i dl d?       tP        jm                  d|i|l&       0ddlm}m  |mmbj[                  |m      xs nj[                  dR      xs da`|      }n|nr֐cj                  i|n   f        Y||n   |	j[                  |n      d        Jd|i|	j[                  |n      |n       |nj                  d      r`j[                  m      xs dnd}ororj[                  o      nd}p|psed    dp |ed<   tP        jm                  di       KsO`j[                  m      }q|qrqgnj[                  m      xs g }StU        |S      dk(  rj[                  Sd         nd}p|pr0ed    dp |ed<   tP        jm                  di       tP        jm                  ditU        S             jdk(  sm|v sdj                  i|m   f        Y||m   |	j[                  |m      d        Jd|i|	j[                  |m      |m       h ddlm}rm}sm}tm}u d}v |uJ      }w|(rj|)rhwre<sbJxs i j[                  d      dk(  rGd}tP        j                  dY|       |j                  |       	 ddd       ddd       |+v }x|xrtP        jS                  d       |(rxs<s|)r tw *du|*      r~n sw *dududu      r^ rJL      }y|yrKdyz   }tP        j                  d.|       |j                  |       	 ddd       ddd       gd_}vrOLGsI Yj[                  d      d        Jdd|j[                  d      tG        |              Yd       |!vs<s JddtG                      Yd       |'s*!vs<s JddtG                     dX~fdZdJYZfd}z*vs<s z        *yvsv<ssj[                  &xs d      xs +}{|{r! Y*{d        Jdd& |{       n3j                  ddd& j[                  |&xs d      d       Wxs xr$  xr  xr *du xr Lduxr
 v xr < }|rj|sgvsd<sadtG        L      z   d d&z   }tP        j                  d.|       |j                  |       	 ddd       ddd       q YLJj[                  d      d       |s:s7*4L1vs.<s+ JddJj[                  d      tG        L             d}}rT*P&rLddl}~|~j                  dtG        &            }|r#ddlm}  |qt?        j                  d            t?        |j                  dޫ            f      \  }}aj[                  &      xs i j[                  d"d_       }t               t?        j                  d            t?        |j                  dޫ            |      D cg c]  }|vr c}z   }rC\r@dfd} |       |[      z  } tW        fd|D              d_      }}|.j[                  dW      xs i j[                        xs i }	 t        |.5X      }rHnInGndx}tI        dsdt      duk(  }ddlm}  ||      Sd}|$rBIs?ddlm}  |
r
j[                  T dMU       ndSt                    }d}|$r-Ir*ddlm}  |
r
j[                  T dMU       nd      }d}|%r*ddlm}  |
r
j[                  T dMU       nd      }d}r$ddl}ddlm}m}m}m}m} ddlm} xj[                        xs sj[                  d]      xs d}j[                  d`      xsA `j[                  tG        T      i       j[                  d`      xs xj[                  Td      }tG        tI        dd      xs d      }j                  djm                                  |g      j                  d            j                         dd } d}jx                  j[                  |      }ti        |tf              rj[                  d      k(  s	  d«      }|j[                  dë      xs g j[                  dī      xs g j[                  dū      xs g dƜ}|jx                  <   j                          ti        tf              r j[                  dë      xs g       }d}|'rcrsddlm }  |d_Sɫ      } |di dxj[                        xs sj[                  d]      xs ddj[                  d`      xsA `j[                  tG        T      i       j[                  d`      xs xj[                  Td      d`j[                  tG        T      i       j[                  d      xs ddːd7d̐*dud͐j[                  dΫ      xs ddϐrg n ||.j[                  d{      xs g       dАj[                  dЫ      xs ddѐj[                  dѫ      xs ddҐd#dӐedԐ\dՐfd֐Irdnddؐdudِdudڐduxr *du xs vdېdܐdݐd|&rJnddߐd}dddSd}vr}|$rBs?ddlm}  |
r
j[                  T dMU       ndSt                    } |di dxj[                        xs sj[                  d]      xs ddj[                  d`      xsA `j[                  tG        T      i       j[                  d`      xs xj[                  Td      d`j[                  tG        T      i       j[                  d      xs ddːd7dddddd ||.j[                  d{      xs g       dАj[                  dЫ      xs ddѐj[                  dѫ      xs ddҐdӐedԐ\dՐfddddddd#dd_dېdݐd|&rJnddߐdddxdS}ddlm}  |      r       } |L*cdGrdnF}tC                    }|stP        jS                  d       "|j                  d d?dސz   dz          n&|j                  d d?dz   dz          |dz  }	 ddlm 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dTbdeijklmnopqrvw|}fd}dSfdIdIfd}d }d}<rddl}ddl~m}m}m}m}m}m	}m
} tG        j[                  d`      xsA `j[                  tG        T      i       j[                  d`      xs xj[                  Td            }j                  |j                  d            j                         dd }d| }d| dz  } |      }jx                  j[                  |      }|j                         rHj                         j                  dkD  r(ti        tf              rj[                  dc      k(  sC        tG        |      |djx                  <   j                                 } dz  } d} |      }jx                  j[                  |      }ti        |tf              rvj                         rej                         j                  dkD  rEtG        j[                  d      xs d      j]                         rj[                  dc      k(  sD ī      \  }}|dc<   |jx                  <   j                           JddtG                      tG        d               }||fgcd}hrddlKm}  N\j[                              \  }Đ}Ő} M|xs d      } Ðd|xs tG        xs d      ĐŐƐfdfdKf      }ddlKm}ɐm}  |ʐ |ɐ|ȫ            \  }}ː|r# Jːd   |ːd    d|ːd   |ːd                 } d z   I|̫      |D ci c]  }͐|͐
 c}d_d_d_i i
      \  }ΐ}ϐtG        jx                  j[                   da      xs i j[                  de      xs d      tC        j[                  d            t        |j[                  d      xs g       dhr!rdd	D ci c]  }|v r|    c}ini ϐd<   j                          rvs<sdd
lm}  d} |Аxj[                        xs sj[                  d]      xs djx                  j[                  ѫ            \  }}Ґ}Ӑ|Ґ||Ӑdjx                  |<   j                          <rnvr-ddlm}Ԑm}Րm}֐m}אm}ؐm} d}ڐ}d}d}d}d}|)r}ݐ}ސGr-t        ԛ d d d      Ԑ}d}d}ܐnnd}ڐ}ې}ܐnZ+*(|*r&d0}ڐ*}j[                  &xs d      xs +}ܐn,(uj[                        }ߐ|st        d      d} ߐLJj[                  d      j[                  d`      xsA `j[                  tG        T      i       j[                  d`      xs xj[                  Td      `j[                  tG        T      i       j[                  d      xs dj[                  ߫      xs i j[                  dd      t]        j[                  ߫      xs i j[                  d5d            	      \  }ې}ܐڐk7  r-ہېj                         st        dۛ dڛ d      dk(  rہ Z       } Yې|ܐd       ڐd0k(  r Yېܐd       ڐdk(  r Yېܐd       ڐdk(  r Yېܐd       ddlm}  |
r
j[                  T dMU       ndt                    }ddlm}m} ڐk(  } xj[                        xs sj[                  d]      xs dj[                  d`      xsA `j[                  tG        T      i       j[                  d`      xs xj[                  Td      `j[                  tG        T      i       j[                  d      xs dr Ej[                  d      xs d      ndrDnd|rn|)rnH	      }݁dZz    ٫       z   }d}d}d}hrddlKm}  NT      \  }}} M|xs d      } d|xs_ tG        j[                  d`      xsA `j[                  tG        T      i       j[                  d`      xs xj[                  Td            fd fd!Kf      }dd"lKm}m}  | ||      |      \  }}} LېJj[                  d      ܐݐސڐ#      \  }} Y||d$        ؐ|GrdnLcdFxr G %      }G}d}|s:ڐd0k(  r}n. Րڐd&v rndLcdڐdk(  rnd'      \  }} dޫ      } אxs GrnHGF(      }rO       } d z  d_ I|̫      |D ci c]  }͐|͐
 c}d_d_)	      \  }ΐ}n[ d z  dd_ސd   |d          i|d   |d   |id_d_t        |      d_|ސ*      \  }ΐ}tg        ϫ      }ϐt1        |tG        |j[                  d+      xs d            }rd_n	d   k(  }tG               d,|d-ϐd.<   |)r4ڐϐd.   d/<   rߐϐd.   d3<   ܐ|ϐd.   d0<   ݁d_ϐd.   d1<   dd2lm}  |ڐduG 3      D ]?  }i|id4k(  r, JddJj[                  d      tG        L             6id$k(  r Jd$d5tG                     Xidk(  r	 z        fidk(  r Jdd6tG        ۫             id7k(  r Jd8d6tG        ۫             id0k(  rJr Jdd& ܫ       Ɛj                  ddd& j[                  |&xs d      d       idk(  r JddtG                     id9k(  s% JddtG                     B nӐ|rАrdd:lm} dd;lm}m}m}m}  |ՐLcd'      \  }} d<      } d |z  d<Ґd<   Ӑd<   אd<    |d=   |>       |||      d_d_t        |      d_ѐ?      \  }ΐ}tg        |ϫ      } ||ϐd+         } |       |ϐd@<   ||ϐdA<   |r JddJj[                  d      tG        L             nr`ddBlm}  d z  dd   d   d    |d=    dޫ      >      d_d_ѐC      \  }ΐ}tg        |ϫ      }ϐne|r'ddDlm}  dd:lm}  |ՐLcd'      \  }} d      } d dE| dF dGz  dH      \  }} |d dI| dJ dKz  d|d          iL      \  }} | t        |      t        |      jx                  j[                   dM      j                  N      }dOD ci c]	  }||    c}jx                   dM<   j                          dP   }|dQk(  r	d dEnd dI}dQk(  rtg              fntg              f\  }ΐ}ϐdR   |j[                  dSd_      tG              tG              dT|ϐdU<   ddVlm }  | dIz  t        |Ϋ      jC                                 dIz  }ΐ|dQk(  rf JddJj[                  d      tG        L             n:       }	 d z   I|	      d_|!|"d_d_W
      \  }ΐ}ϐdXnd}
dYndZ}<r
d[ϐd\<   nr/d]j[                  d$       d^rdn*d_nd`z   ϐd\<   n}vrOdYdadbj[                  ϐd.   j[                  d/      xs ddZ      }ϐd.   dc   rddn deϐd\<   n+|rrj[                  d+      }rdfndg}j[                  d@      xs i j[                        xs i } dh|j[                  di       }j[                  dA      r dj
 dk dl d?n 
 dk dm d?ϐd\<   n|r\j[                  dUi       j[                  dP      }rdnndo}dQk(  r dj
 dk dpn 
 dk dqϐd\<   n!r*drn 
 dsn*dtnduϐd\<   'tg        '      ϐdv<   rϐdw<   grgϐdx<   hrhϐdy<   ]r]ϐdz<   MrMϐd{<   tE        ϫ      rzr9t}              k7  r$ dz  } tP        jS                  d||        j                         tP        jS                  d}       	 ddd       ddd       7\t        Ϋ      }d}dd~lm#} r       nd}|Fdd_ddtG        j[                  d      xs d      z   d}tP        jS                  d       nrddlm$}m%} }rddlm} 
r
j[                  T dMU       nd}ti        |tf              si } tG        j[                  d      xs d      tG        j[                  d      xs d            }t               d!      5   t        Ϋ      d   |dtM              TUd      }ddd       j[                  d      r)j[                  d      rtG        d         z  }nj[                  d      rԐtO        j[                  dʫ      xs d      D ]  \  }}}tP        jm                  d|j[                  dʫ             t         |      d!      5   t        Ϋ      d   |dtM        |      TUd      }ddd       j[                  d      s n j[                  d      r)j[                  d      rtG        d         z  }nj[                  d      rCj                         tP        jS                  dj[                  d      xs d       nhj[                  d      rBj                         tP        jS                  dj[                  d      xs d       nj                         ϐjx                  <   j                          rTddJlmΐ}0 ddKlImϐ}1 t}              k7  }xs i j[                  d      }d} ti        |tf              rj[                  d      	 t?        xs i j[                  d      xs d      }!|!	k(  }"j[                  d      }#tC        "xrB t}        tG        j[                  d            #tG        #      nd      k(        }  r
j                         d} j                  1      j                  |1j                  k(  |1j                  k(  |1j                  k(  |1j                  dLk(  |1j                  dk(        j                         }$|$}%|$ÐtS        $      r j                  1      j                  |1j                  k(  |1j                  k(  |1j                  k(  |1j                  dLk(  |1jT                  tV        k7        jY                  |1jZ                  j]                               j                         xs $}%%r 0%j                        nd}&	 &duxrK &j                         xr8 j                         xr% &jC                         jC                         k(  }''rstE        ϫ      r>j                         tP        jS                  d       	 ddd       ddd       >'dz  }%j                  <   ta        | $j                   0|$j                               	 ddd       ddd       >tC        xr) j[                  d      xr j[                  d             }(tC        xr) j[                  d      xr j[                  d             })tC        xr) j[                  d      xr j[                  d             }*'r(s)s*stE        ϫ      rRdz  } dz  } j                         tP        jS                  d|        	 ddd       ddd       ?dz  } dz  } tP        jS                  d|        %j                  <   ta        | $j                   0|$j                               	 ddd       ddd       @ rtP        jS                  d       n$ dz  } tP        jS                  d|        |tc        jd                          dz  }+|+jf                  jY                  d_d_       ti        jj                  |+       ddlm6},m7}-m8}.  |.]      \  }/}0tC        xr j[                  d            }1 -ϫ      }2|2r tG        j[                  d      xs d      nd}3d}42r3dk7  rddl}5tG        j[                  d+      xs d      j]                         js                         } dM| dz  }6d|6jt                  |6j                         r25j                  6jC                               j                         ndd}4d}7d}8	 ddlm;}9 |jy                  d |9ϫ            }8|j{                  8      }:d};1r>	 |jy                  dt}                    }7	 |j                  7      };n8}7d}<1s	 |j                  8      }<1rg }=g }>ddxs i j[                  d      xs i j[                  d      dg}?t        xs i j[                  d      xs dj[                  d+      23      }@|@r5?D ]/  }A|Aj[                  d      dk(  sAj                  @       1 }B}CnU/}=]}>}?2r4rt              4gz   }?:xs i j[                  d      xs  ,ϐ      }B       }C|j                  i djtG        tc        jd                               ddLdkddːddtG        +      dBdt        1ti        ;tF              r;ndtG        xs i j[                  d      xs d      tG        :xs i j[                  d      xs d      tG        tI        dsdt            tC        s      tC        2      ti        <tF              r<ndj                  j                  
      ddddd&dd=d>d?dj[                  d      rj[                  d      ndd7dt        j                  dÐj[                  d+      |j[                  dī      |j[                  d\      2dŜ|2rj[                  d      rdd   ini dƐj[                  dǫ      xs i j[                  dƫ      iirdȐ1|1rdndjdʜxs i j[                  d      rd_xs i j[                  d      d˜ni xs i j[                  d      rd_xs i j[                  d      xs i j[                  d̫      xs i j[                  dͫ      xs i j[                  dΫ      xs i j[                  dͫ      xs i j[                  dϫ      xs i j[                  dͫ      xs i j[                  dЫ      xs i j[                  dͫ      xs i j[                  dѫ      dҜdӜni xs i j[                  dԫ      xs i j[                  dի      xs i j[                  d;      xs i j[                  d      xs i j[                  d      d֜ini :r1sdא:d   |:d   8dٜini 1r>d       /]8dۜ2r	4rdܐ4ini :rdא:d   |:d   dݜini ini dޫ      dߐt               iddCt        j                  0      d      }D|Dj                  <   |D}EtI        |Ddd      s j                  1      j                  |1j                  k(  |1j                  k(  |1j                  k(  |1j                  dLk(  |1j                  dk(        j                         }F|F5F}EtP        jm                  dDj                  |Fj                         |j                  Dj                  gEj                  |E|Du rtG        +      ntG         0Ej                              Dj                  tG        +      d       dz  }tP        jm                  dj[                  d+      tC        |j[                  d                   ddd       ddd       I r'tP        jS                  dtU              |dd        
r'tP        jS                  dtU        
      |
dd        s	 ssr)tP        jm                  d tU                     dkD  rU k\  rNt{        d t                    }tu        d d| d| d|  d| d| d?      rVt        dtU               ddejm                  |dd        tU        |      dkD  rdnd d d  d d?      rJtP        jS                  dtU              dejm                  |dd       tU        |      dkD  rdnd       rJtP        jS                  dtU              dejm                  |dd       tU        |      dkD  rdnd       rIt        dtU               ddejm                  |dd        tU        |      dkD  rdnd d      grIt        dtU        g       ddejm                  gdd        tU        g      dkD  rdnd d      |j                  dndz   ndz          S c c}9w c c};w c c}@w c c}jw # t        $ r Y ]w xY w# t        j                  $ r Y \1w xY wc c}sw c c}|w c c}}w c c}sw c c}sw c c}sw c c}6}8w c c}w c c}v}w c c}w c c}@w c c}@w c c}w c c}w # t~        t        f$ r d}	Y Kw xY wc c}vw # t        $ rf}AtP        j                  dYAj                         |j                  |Aj                         Y d}A~Addd       ddd       M;d}A~Aww xY w# t        $ rY}XtP        j                  d.X       |j                  tG        |X             Y d}X~Xddd       ddd       Md}X~Xww xY wc c}v}w c c}vw c c}w # t        $ rf}AtP        j                  dYAj                         |j                  |Aj                         Y d}A~Addd       ddd       N%d}A~Aww xY w# t        $ r-}tP        jS                  dǐ       d}Y d}~0d}~ww xY wc c}w c c}w c c}w c c}w # 1 sw Y   xY w# 1 sw Y   xY w# t        $ rm}AtP        jQ                  d       |j                  tG        A             rj                         Y d}A~Addd       ddd       Od}A~Aww xY w# t~        t        f$ r d}"Y w xY w# t^        $ r d}'Y fw xY w# t        $ r Y 7w xY w# t        $ r Y w xY w# t        $ r Y w xY w# t        $ r Y w xY w# 1 sw Y   xY w# 1 sw Y   OxY w(  u  레시피 v1 순차 생성. 반환 = 생성 완료 샷 수.

    target_scenes (2026-07-23 슬라이스 실행, Codex 설계 합의): 표적 씬
    목록 — 설정 시 **실행 루프만** effective allowlist(표적 씬 스틸+
    effective prev 체인 재귀 클로저)로 제한. 위쪽 컨텍스트(tag map/
    groupbg_context/group_sig/canonical origin)는 전체 stills 파생
    그대로 유지(BLOCKING-1 — 지문 불변). None(default)=전체 byte-
    identical.
    r   r+   )GQ_CRITIQUE_PACK_VERSIONGQ_SELECT_POLICY_VERSIONmake_gemini_critique_fnmake_gemini_judge_fnmake_gq_critique_fnmake_qk_critique_fnmake_nb2_gen_fnresolve_judge_pack_versionresolve_judge_texts%STILL_FIX_REJUDGE_HEADER_PACK_VERSIONSTILL_JUDGE_PACK_VERSION)GATE_REROLL_POLICY_VERSIONbuild_critique_schemabuild_judge_schemaroll_labelsrun_multiroll_select)resolve_shot_plate_map)derive_location_by_scenetag_of)build_still_promptbuild_still_refsve_ids_for_shot_ex)build_pose_clausesstill_repair_methodeditNr  )resolve_still_regen_textsstill_recipe_lighting_enabledFstill_recipe_conduct_enabledstill_identity_ref_role_enabledstill_bgfirst_enabledstill_bgfirst_full_enabledstill_lane_prev_bgfirst_enabledbgfirst_no_conti_exempt_tagsr   ul   still_recipe: 운영자 선언 무콘티 예외 %d샷 — BGFIRST 대상 제외 후 기존 경로 생성: %sshot_ref_classifyshotsscenesworld_anchor_enu    — shot_continuityshot_conti_lightrP   z*still_recipe.bgfirst_full_requires_bgfirstuv   still_bgfirst_full_enabled=true 는 still_bgfirst_enabled=true 전제 — 조용한 부분 적용 금지 (fail-closed)rX   rY   z2still_recipe.lane_prev_chain_requires_bgfirst_fullu   still_lane_prev_bgfirst_enabled=true 는 still_bgfirst_full_enabled=true 전제 — 체인 자체가 없는 상태에서 조용한 no-op 금지 (fail-closed))resolve_prompt_version52
conti_packz(still_recipe.bgfirst_conti_pack_mismatchuL   still_bgfirst_enabled=true 인데 shot_conti_light CP 가 기대 콘티 팩(u   )이 아님 (conti_pack=u4   ) — shot_conti_light 를 먼저 재실행하세요background_share_planr}   plan
shot_plansshare_groups	group_key	shot_tagsevidencequote_koentity_merge	locationsrH   descriptionvisual_traitsr,  u
    (특징: z; )outdoor_place_specgroupsvisual_world_rulesc                   xs i j                  |       }t        |t              r|j                  d      r%t        d| d|xs i j                  d      d      |j                  d      r!t        d| d|j                  d      d      |j                  d      }t        |t              st        d| d	      t	        |      }|j                         st        d| d
      |S )u  lane 샷의 장소 사실 블록 — 결손이면 fail-closed.

        성공 entry 는 {spec, attempts, outdoor_loc_ids, scene_indices}
        이고 `status` 키가 **없다**(실패 entry 만 error 를 갖는다,
        outdoor_place_spec_step.py:228-233). canon CP 는 status 를 갖는
        다른 shape 라 혼동하지 말 것.

        세 번째 shape 가 더 있다 — 근거 씬 0 인 그룹의 저작 스킵
        {skipped, outdoor_loc_ids} (같은 파일 197-200). spec 키 자체가
        없어 어차피 아래 dict 가드에 걸리지만, 운영자에게는 "dict 아님"이
        아니라 "저작이 스킵됐다"로 보여야 원인(씬 매핑 결손)에 닿는다.
        erroru   lane 배경: place spec 그룹(u   ) 결손/실패 (u=   ) — 장소 사실 없이 배경 생성 금지 (fail-closed)skippedu   ) 저작 스킵 (uq   ) — 근거 씬이 매핑되지 않아 스펙이 없음, 장소 사실 없이 배경 생성 금지 (fail-closed)specu*   ) 의 spec 이 dict 아님 — fail-closedu:   ) 에서 장소 사실 블록이 비었음 — fail-closed)r%   r"   r#   
ValueErrorr   r&   )r  rf   r  block_place_spec_groupss       r   _lane_place_factsz6run_still_recipe_generation.<locals>._lane_place_facts  s    $)r..y9%&%))G*<1) ?[b%%g.1 255 
 99Y1) ?IIi(+ ,\\ 
 yy $%1) ?. .  (-{{}1) ?= =  r   contis	map_conti)COMPLEX_AB_CONTRACT_VERSIONCOMPLEX_PROMPT_VERSIONLANE_PROMPT_VERSIONSEED_BG_PROMPT_VERSIONSTILL_CONDUCT_PROMPT_VERSION
lane_conti)rd   )#force_person_visible_for_charactersload_character_sids_by_tagplate_authority)	parse_tag
plate_pathr   still_plate_select_enabledstill_conti_ab_enabled)load_bg_groups_and_assignmentplate_candidates_by_location
scene_savesegmentsrB  headingscene_directorprimary_location)EntityCanon)SCOPE_ROLE_EXTERIORSCOPE_ROLE_INTERIORc                     dd l }|j                  dj                  |       j                  d            j	                         d d S )Nr    rm      )hashlibsha256joinencode	hexdigest)parts_hs     r   _sha16z+run_still_recipe_generation.<locals>._sha16  s<    yyu-44W= $9;s, 	,r   background_classifybuilding_groupsmembersloc_id	is_indoorTlocationc                    j                  |       }|ydj                  d t        |j                  xs d      j	                         t        |j
                  xs d      j	                         fD              S )ue  판별에 **실제로 보내는** 정본 내용 — 이름 + 안정된 서술.

        ★샷별 `place_text`·`location_detail_en` 을 안 쓴다. 키에서만 빼면
         「첫 샷의 문안이 그 장소 전체의 결과가 되는」 순서 의존 캐시가
         된다(Codex). 여기서 만든 것이 신원이자 판별 입력이다.
        r   
c              3  $   K   | ]  }|r| 
 y wr2   r   r3   s     r   r6   zGrun_still_recipe_generation.<locals>._era_canon_text.<locals>.<genexpr>  s!       %
q   %
s   )r%   r  r$   rH   r&   r  )loc_short_idrow_canon_rowss     r   _era_canon_textz4run_still_recipe_generation.<locals>._era_canon_text  sn     ool+;yy B%%'%2&,,.%
   	r   c                    | yj                  t        |             xs d}|syj                  |      }||ddfS  |      }|s||dfS || |      fS )uU   (정본 id, 역할, 정본 내용 해시) — 하나라도 모르면 None 을 준다.NNNNr   )r%   int)rB  lidrole
canon_textr  	_loc_roler  scene_primarys       r   
_era_scopez/run_still_recipe_generation.<locals>._era_scope  s|     %K 017R%}}S!<t$$ %S)
t$$T6*-..r   c                H    t        | t              r| j                  |      S d S r2   r"   r#   r%   )ekeys     r   _entity_fieldz2run_still_recipe_generation.<locals>._entity_field  s    '40quuSz:d:r   stable_traitsz, c              3  2   K   | ]  }t        |        y wr2   r$   )r4   r   s     r   r6   z.run_still_recipe_generation.<locals>.<genexpr>  s     -Cdc!fds   rC  visible_entities_jsonz[]id	entity_id
outlook_idshot_description)build_short_id_resolverextract_outfit_assignmentst2i_variations_json)judge_pack_content_hashresolve_select_judge_model#resolve_select_judge_model_physicaljudge_still
judge_namepack_versionr9  nb2r3  r4  r5  1)image_modeljudge_modelselect_judge_model_physicalrecipe_pack
judge_packjudge_pack_contentimage_backend)GROK_SHED_POLICY_BASELINEgrok_shed_policy_signaturegrok_shed_policymultiroll_gq_judge_enabledgq_select_policygq_critique_packgq_critique_pack_contentmultiroll_qk_judge_enabled)QK_CRITIQUE_PACK_VERSIONQK_SELECT_POLICY_VERSIONqk_select_policy|qk_judge_modelsqk_critique_packqk_critique_pack_contentmultiroll_gg46_judge_enabled)GG46_CRITIQUE_PACK_VERSIONGG46_SELECT_POLICY_VERSIONgg46_select_policy) CROSS_MODEL_ORDER_POLICY_VERSIONselect_order_policy)r  select_judge_models_physicalgg46_critique_packgg46_critique_pack_contentgrok_image_modelgg46_fix_image_modelstill_fix_ref_gate_enabled)FIX_MISSING_PACK_VERSIONfix_ref_contract_shaload_fix_missing_textsfix_ref_gatefix_missing_packfix_missing_pack_contentfix_ref_contractera_research_enabled)ERA_RESEARCH_POLICY_VERSIONera_pack_content_hashresolve_era_packera_research_policyera_research_packera_research_pack_contentsignage_author_enabled still_cast_wardrobe_lock_enabled)body_identity_entity_ids)staged_in_frame_character_idsunique_character_ids_by_namec              3     K   | ]F  \  }}t        |t              r1|j                  d       dk(  r||xs i j                  d      xs df H yw)entity_type	characterrH   r   Nr  )r4   eidr  s      r   r6   z.run_still_recipe_generation.<locals>.<genexpr>  sN      :H+FCa155#7;#F 
qwBmmF#)r*+s   AAc                    |ssg S j                  |  d|       }t        |t              sg S  |j                  d      xs g |j                  d            S )u  그 샷의 촬영 계획이 화면 안에 세운 등록 인물 id — **한 자리**.

        이 샷의 CARRIED 거르기·참조·PEOPLE·상태 변형 판정과, 다음 샷이 이
        샷을 앞 샷으로 받을 때의 인물 명단이 모두 이것을 쓴다(Codex 2026-09-19:
        명단이 둘로 갈리면 앞 샷에 그린 인물을 다음 샷이 「없던 사람」으로 뺀다).
        배경 전용 샷은 빈 목록(분류가 사람을 빼기로 한 샷).r   character_anglespov_character)r%   r"   r#   )si_shi_bg_only_ststaged_char_id_by_namer.  staging_maps       r   _staged_in_framez5run_still_recipe_generation.<locals>._staged_in_frame  sd     ;I__uAdV_-"d#I,FF%&,".DFF?#% 	%r   )CharacterOutlookr  )episode_outlook_rowsstill_confined_fp_enabled)CONFINED_FP_POLICY_VERSIONconfined_fp_pack_content_hashresolve_confined_fp_packgemini_text_model)confined_fp_packconfined_fp_pack_contentconfined_fp_modelconfined_fp_readback_modelconfined_fp_policy)CAMERA_FRAME_PROMPT_VERSIONrecipe_camera_frame_pack)LIGHTING_MOOD_PROMPT_VERSIONrecipe_lighting_pack)r  recipe_conduct_pack)BGFIRST_BG_IMAGE_MODELBGFIRST_CONTRACT_VERSIONBGFIRST_PROMPT_VERSIONrecipe_bgfirst_packbgfirst_contractbgfirst_bg_modelbgfirst_judge_model_physical)BGFIRST_FULL_CONTRACT_VERSIONBGFIRST_FULL_PROMPT_VERSIONbgfirst_full_contractrecipe_bgfirst_full_pack)BGFIRST_LANE_CONTRACT_VERSIONBGFIRST_LANE_PROMPT_VERSION CHAIN_BG_LOCATION_PROMPT_VERSIONbgfirst_lane_packbgfirst_lane_contractchain_bg_location_packrecipe_lane_packrecipe_complex_packrecipe_seed_bg_packcomplex_ab_contract)GeminiImageClient)PromptSanitizer)GrokImageClient)GptImageClient)project_configstill_cine_transform_enabled"still_cine_stage_direction_enabled)r.   r/   )CINE_TRANSFORM_STEM)#CINE_STAGE_DIRECTION_PROMPT_VERSIONCINE_TRANSFORM_PROMPT_VERSIONbuild_cine_transform_promptrecipe_stem_content_hashr  providerr   c           	     $     dd| i      S Nstill_recipe_rollr   )rv   rw   operation_typegemini_client	sanitizercontext_extrar   )r   _branch_tagrw   rk  rv   shared_image_clientshared_sanitizers     r   make_shot_gen_fnz5run_still_recipe_generation.<locals>.make_shot_gen_fn  s(    
 !j.-&%x0
 	
r   c           	     $     dd| i      S rr  r   )r   rx  rw   gg46_fix_clientrk  rv   rz  s     r   make_shot_fix_gen_fnz9run_still_recipe_generation.<locals>.make_shot_fix_gen_fn  s&    !j.)&%x0
 	
r   	judge_syswith_physicsstill_recipe_judger  judge_schemarh  step_tag)make_gg46_critique_fn)with_severitywith_ref_gatestill_recipe_critique)critique_schemarh  r  ref_gater  critique_sysr  r  rh  r  r  nc                    | vrO | d      } |d     |       d      d      }}
sss |d    		      d
	      }|||f| <   |    S )Nr  r  r  Tr  r  r  r  r  r  r  r   )r  _jt_n_jf_n_cf_nro  _judge_sets_by_countrq  rr  critique_fnfix_ref_gate_onr:  gq_judge_onrg  rh  rh  qk_judge_onrm  rs  s       r   _judge_set_for_countz9run_still_recipe_generation.<locals>._judge_set_for_count1  s    (('m57E ),/N7--E  E![K/!&~!6$9&5%7#14, (-eU&; ##A&&r   still_recipe_critique_enabledmultiroll_fix_rejudge_enabled)load_fix_rejudge_header   still_recipe_fix_rejudge)r  r  rh  r  prompt_header fix_rejudge_judge_model_physicalfix_rejudge_judge_headerr   still_gate_reroll_enabledc           
         t        |       t        |xs d      f}|vrA 
|d   d      }i }|d   r|d   |d<    d|d     |d         d	      	d
d||<   |   S )uP   후보 `n_labels` 개짜리 재판정기. 같은 조합은 한 번만 짓는다.r   r   r  r  r^   r  r  Tr  still_recipe_gate_rejudger  r   )r  r$   )n_labelsheaderr  _t_kwro  _gate_rejudge_cacherr  rh  rh  rm  rs  s        r   gate_rejudge_forz5run_still_recipe_generation.<locals>.gate_rejudge_for  s    8}c&,B/0))$A=57B #%C1v'*1vO$'; ([//A'd<-4( ($ #3''r   still_gate_reroll_run_limit   c                 6     r	d    k\  rydxx   dz  cc<   y)Nr  Fr^   Tr   )	_gr_limit_gr_useds   r   gate_reroll_allow_fnz9run_still_recipe_generation.<locals>.gate_reroll_allow_fn  s%    Xc]i7SMQMr   )model_physicalpolicy)STILL_REGEN_PACK_VERSIONr~  
regen_pack!multiroll_gpt_composition_enabled)GPT_COMPOSITION_PACK_VERSION make_gpt_composition_critique_fnrl  still_recipe_gpt_composition)r  r  rh  r  gpt_composition_packopenai_modelgpt_composition_model_physicalstill_variants_enabled)STILL_VARIANTS_CONTRACT_VERSIONload_variant_judge_headerresolve_variants_pack_versionstill_variants_packstill_variants_contract#still_variants_judge_model_physical)r     )openai_client)load_bgfirst_judge_header)timeoutrecipe)parentsexist_okzrecords.jsonplate	seed_pathseed_asset_idc                    ./0 ddl /ddlm} ddlm. ddlm} ddlm} ddl	m
} ddlm} dd	lm} dd
lm}m}m}m} ddlm0 8  dz  }  d}d|fg}||j-                  d|f       || 91      |d}||j-                  d|f       |
|j-                  d|
f       |	dk7  s||	|d<    |||dd|      }:j.                  j1                  |      xs i }|}|j3                         xr3 |j5                         j6                  dkD  xr |j1                  d      |k(  }|s|j9                         rt:        j=                  d         ||       |}dD ]V  }	  |d        |2d||g||gng z   ||gng z   |
|
gng z   ||ddddd d !      } | st?        d"       |||        |} n n|j1                  d*      xs |}dd+lm$}& d}'|d|xs` 6j1                         xs i j1                  d,      tC        |      k(  r$6j1                         xs i j1                  d-      ndxs  3|      }' |&||'|||du|	.      }(d6.47fd/})./457fd0}*0 fd1}+ ||||(||)|*|+2      },4jK                          |||tC        |      |,jL                  |(d3|rd4d5D -ci c]  }-|-|v r|-||-    c}-ini :j.                  |<   :jO                          ||,jL                  fS # t@        $ r}!tC        |!      jE                         }"d#|"v xs d$|"v xs
 d%|"v xs d&|"v }#|dk(  rT|#rR;jG                  |tC        |!      g |      }$|$j1                  d'      xs d(}%|%rt:        j=                  d)        |%}Y d}!~! d}!~!ww xY wc c}-w )7u&  BGFIRST2 Step1 — 콘티 카메라 기준의 인물 0 빈 배경
        (gpt-image-2). **참조 목록은 authority_kind 에 달렸다**: 위치 권위
        사진을 쓰는 모드는 그 사진을 콘티 카메라로 재투영하므로 참조=
        [콘티, 플레이트] 순서 고정(프롬프트의 FIRST/SECOND 지칭과 동조),
        LANE_CONTI_ONLY 는 참조=[콘티] 1장뿐이다(아래 2026-07-26 항).

        재개=records `{tag}::bgfirst_bg` 지문(프롬프트+참조 내용+엔진·팩·
        계약) 일치 + **비어 있지 않은 파일**(Codex 리뷰 6) 시 재사용,
        mismatch=stale 아카이브 후 재생성(conti 관례). moderation=
        sanitizer 1회 재시도(effective_prompt 로 provenance 병록).
        반환=(bg_path, bg_asset_id) — 등록(아래 _register)은 재사용
        경로에서도 매번 idempotent upsert 라 file+row+fingerprint 가 함께
        검증된다(Codex 리뷰 2).

        fix③④ full 확장: plate_path=위치 권위(플레이트/seed-bg/groupbg
        — plate_asset_id_override 로 UUID 직접 전달), seed_path=STRUCTURE
        LOOK 3번째 참조(complex 샷 — bg_prompt 에 seed 절은 호출자가
        포함, input_ids 3 UUID). 신규 인자 default=기존 경로 지문·참조
        byte-identical.

        2026-07-26 확정 흐름: authority_kind=LANE_CONTI_ONLY 면
        plate_path=None 이고 참조는 [콘티] 1장이다 — 외부 사진 없이
        콘티 자체를 편집해 배경을 입힌다(장소 사실은 텍스트 권위).
        r   Nto_relative_image_path
ImageAssetcall_gpt_image_bytesreserve_current_callatomic_write_bytescompute_input_fingerprintarchive_stale_output)rO  BGFIRST_BG_SIZErP  register_bgfirst_bg_assetannotate_generated_assetz__bgfirst_bg.png::bgfirst_bgcontir  )modelsizerg   contractseedera	authorityr^   Fpromptlabeled_refs
roll_countcritique_enabledextrainput_fingerprintuc   still_recipe %s: bgfirst 배경 지문 불일치/무효 파일 — stale 아카이브 후 재생성r^   r  zstill_recipe.bgfirstsourcer}  highr  r  qualityr  still_recipe_bgfirst_bg)rt  r   shot_tagmoder  	ref_pathscall_kwargscapture_rolecapture_metadataz!empty image bytes (bgfirst step1)
moderationsafetycontent_policyrejectedsanitized_promptr   uA   still_recipe %s: bgfirst 배경 moderation — sanitize 재시도effective_prompt)bgfirst_require_input_idsr  asset_id)conti_asset_idplate_asset_idr  r  seed_attachedauthority_kindc                    j                        j                  j                  k(  j                  | k(        j	                         S r2   queryfilterrv   	file_pathfirstrelr  r   rv   s    r   _find_by_relzJrun_still_recipe_generation.<locals>._run_bgfirst_bg.<locals>._find_by_rel_
  C    $))Z7((C/ r   c                     t        j                               	|d 
| ||dt                     }j                  |       |S N	generated)r  rv   
asset_typer  r   rw   r  prompt_usedgeneration_modelrU   
created_atr$   uuid4rN   r>   r  r  r  r  assetr  _uuidr   rw   rv   r   s        r   
_new_assetzHrun_still_recipe_generation.<locals>._run_bgfirst_bg.<locals>._new_asseti
  M    u{{}%%%!%"!&"6E FF5MLr   c               (     | |d|di|       y )Nstill_reciper  pipeline_roler  input_image_idspipeline_metadatar   )r  r  	input_idsmetar  r   s       r   	_annotatezGrun_still_recipe_generation.<locals>._run_bgfirst_bg.<locals>._annotatez
  s$    $"$ )#-s";d";r   )bg_pathr  r'  rel_fnfind_asset_by_rel	new_assetannotate_fn)r  r  r  r*  r  input_asset_idsera_researchsubjectqueries
picked_urlr  filer  r$   )(uuidapp.core.file_pathsr  app.models.projectr  #app.modules.llm.gpt_image_primitiver  app.core.image_call_budgetr  %app.modules.pipeline.multiroll_geminir  r   r  %app.modules.pipeline.shot_conti_lightr  !app.modules.pipeline.still_reciperO  r  rP  r  #app.services.image_capture.annotater  rB   r}   r%   is_filestatst_sizerp   r?   r@   RuntimeErrorrt   r$   lowersanitizer  flushr  r   )<r   r   
conti_pathr  	bg_promptr  plate_asset_id_overrider  r  r  era_ref_pathera_metar  r  r  r  r  r  rO  r  rP  r  rE   r  _fp_refs	_fp_extrafpprev_recr  reusecurrentattemptpngrz   msg	moderatedsr	sanitizedr  
_plate_aidr'  r  r  r)  bg_assetr   r  r  r  _BGFIRST_PACK_bgfirst_gpt_client_plate_asset_idr   rw   r  rv   r  recipe_pack_versionr   rz  s<   ``                                            @@@r   _run_bgfirst_bgz4run_still_recipe_generation.<locals>._run_bgfirst_bg	  sy   P 	>1LCL	
	
	
 	
	
 cU"233\"j)*!OOWj12+#'60%
	  OOVY/0#OOUL12W$	(=%3Ik"&!"
 <<##C(.B$ KKM 8
""Q&801R7 	
 zz|78; %S)G!4(0FG.+#&'L/9/E
|$&( /8.C	{$&	(
 2>1I~$&( &<$3'-!"	% &?.G(0(+*)C4 *?A A&sC0'.$G "n  (||,>?L9	
 
!0 -MM#&,"11,?z?# s#)r..z:(,- !,	 
 .)%!'#4/)
			 	"	 -#)* !
 	
!# 03x (
 	 )J!")J1= 8A; )J!" # !#
S 	HKK] ! c(..*C$+ Hx3 H+s2H6@C6G  !|	-66#SXr7<$&FF+=$>$D"	$"NN!9:= '0G$#N!"s&   AK!M;!	M8*BM32M33M8r   
place_texttime_of_day_enc	                f
   GHIJKLM ddl }	ddlIddlm}
 ddlmG ddlm} ddlm	} ddl
m} ddlmL dd	lm} dd
lm}m}m}m}m}m}m}m}m}m}m}m} ddlmJ dj?                  d  D              dd }|d|	jA                   jC                  d            jE                         dd z   z  }[d| dz  }d  }]jF                  jI                  |      xs i } tK         fdXjM                         D              d} ||||||dQ|      } | d   }!|!|k(  }"| d   }| d   }| d   } || d   ||!       |||_||      Kd}#d}$d}%Wrdd l'm(}& i }' PRjI                  |!            \  }(})}* O|(xs d      }+ |&d!|+xs d"j?                  tS        d||g            |(|)|*_[]fd#]fd$YNU|'%      },dd&l'm*}-m+}.  |.K |-|,            \  K}/}%|/r|,}#|/d   }$|$rd'|$fgng H|| \|      || |||(      d)|%xs i M|jY                         xr |j[                         j\                  dkD  }0t_        |jI                  d*      t`              r|jI                  d*      ni }1 |W|#Wr'nd|0|1+      }2|2rotb        je                  d,|        ta        |1      Md-|jI                  d.      }4}3t_        |jI                  d/      t`              r|d/   }# Vvr(Vjg                          n ||M|0HKLMfd01      \  }3}4|||d2}5|3s>|jI                  d3      xs K}6|jI                  d.      }7|jI                  d4      xs K}8|}9n|4 LKd5fgHd6d-M7      }4|ji                         rtb        je                  d8|         ||       K}:K}6tk        d  d9      5  d:D ]G  };	  |d;<        |Nd=|:g|$r|$gng ||d>d6d?d@d@||! dAB      }<|<stm        dC       |||<       |:}6 n ddd       |4}7K}8|}9 ||9J      }BdRGSZfdK}CGISTZfdL}DJ fdM}E |||6|B|
|C|D|EdNdNdOP
      }FSjw                          |7M|8|6tq        |      |Fjx                  |B|!||5dQ
|#rd/|#ini ]jF                  |<   ]j{                          |Fjx                  fS # tn        $ r}=tq        |=      js                         }>dD|>v xs dE|>v xs
 dF|>v xs dG|>v }?|;d6k(  rT|?rR^ju                  |:tq        |=      g |;      }@|@jI                  dH      xs d}A|Artb        je                  dI|       A}:Y d}=~= d}=~=ww xY w# 1 sw Y   @xY w)Su  no_plate 그룹의 장소 단위 공유 배경 — 그룹당 1회 생성 (fix③④).

        묶음=share_plan 그룹(LLM 의 '비슷한 배경 공유' 판단). 생성 근거=
        이 그룹에서 스토리 순으로 **처음 도달한** bgfirst 샷(origin,
        record.origin_tag 로 고정 — 처리 루프가 스토리 순이라 결정론)의
        **현재 상류 SOT** 콘티+장소. Codex 3·4차 리뷰 현행 계약: 모든
        멤버가 canonical origin 기준 지문(프롬프트+origin 콘티 bytes)을
        대조해 origin 입력 drift 를 감지하며(자기 콘티 지문 금지 — 멤버별
        진동 차단), 재생성도 항상 canonical origin 입력으로 수행한다.
        share 그룹 재구성(group_sig 변경)·origin 해석 실패=fail-closed.
        샷 특정 정보(SHOT TEXT/카메라)는 프롬프트에 불포함 — 샷별 카메라
        는 Step1 재투영 담당. 등록=bgfirst_bg 와 동일 upsert
        (is_intermediate), role/asset_type=bgfirst_group_bg.
        r   Nr  r  r  r  r  r  r  )rO  r  rV  rW  build_groupbg_promptdecide_groupbg_reuseera_preserve_appliesgroupbg_context_siggroupbg_require_input_idsr   resolve_groupbg_canonical_originvalidate_groupbg_conti_sourcer  r   c              3  L   K   | ]  }|j                         s|d v r|nd  yw)z-_r   N)isalnum)r4   cs     r   r6   zDrun_still_recipe_generation.<locals>._run_groupbg.<locals>.<genexpr>
  s'      
<EqT	As2Is   "$0   r   rm      groupbg_.pngz	groupbg::c              3  4   K   | ]  \  }}|k(  s|  y wr2   r   )r4   r(   r   r  s      r   r6   zDrun_still_recipe_generation.<locals>._run_groupbg.<locals>.<genexpr>
  s       .da!y..s   )r  tagsr_  r`  rG  r  )rO  r   current_inputsorigin_lookup_fncurrent_group_sig
origin_tagr_  r`  r  rG  )rG  r  rv  )r_  r`  world_anchorlocation_detail_enscene_evidenceassess_and_research_cachedera_research_groupbgr  c                    t        j                  j                  |       t              rj                  j                  |       S d S r2   r"   r}   r%   r#   r   r   s    r   <lambda>zCrun_still_recipe_generation.<locals>._run_groupbg.<locals>.<lambda>=  s=    !',,"2"21"5t< LL$$Q' r   c                \    j                   j                  | |      j                         fS r2   r}   __setitem__r   r   r   r   s     r   r  zCrun_still_recipe_generation.<locals>._run_groupbg.<locals>.<lambda>A  s%    LL,,Q2LLN($r   )r  subject_textcanonical_scope_idcanonical_scope_rolecanonical_scope_shaworld_facts_blockout_dir	cache_get	cache_putrh  r  failed_memor   )normalize_era_referenceproject_groupbg_erar  )rx  ry  )r  r  rg   r  	group_sigcontext_sigr(  )era_onrK  r   file_ok	prev_metauc   still_recipe %s: groupbg(%s) era 조사 미성립 — 기존 완성 배경 보존(재생성 억제)Fr  r0  c                 (     dfg dd      S )Nr  r^   Fr  r   )	_era_refsrH  r  rG  r(  s   r   r  zCrun_still_recipe_generation.<locals>._run_groupbg.<locals>.<lambda>  s'    '@$#*J"7!D)!D %*(r   )rO  r(  r  fingerprint_fn)r_  r`  r  r  r  r  r^   r  uY   still_recipe %s: groupbg(%s) 지문/계약 불일치 — stale 아카이브 후 재생성rI  r  zstill_recipe.bgfirst_groupr  r}  r  r  still_recipe_groupbg)rt  r   r  rv  r  r  zempty image bytes (groupbg)r  r  r  r   r  u:   still_recipe %s: groupbg moderation — sanitize 재시도)r  c                    j                        j                  j                  k(  j                  | k(        j	                         S r2   r
  r  s    r   r  zGrun_still_recipe_generation.<locals>._run_groupbg.<locals>._find_by_rel  r  r   c                     t        j                               	|d 
| ||dt                     }j                  |       |S r  r  r  s        r   r  zErun_still_recipe_generation.<locals>._run_groupbg.<locals>._new_asset  r   r   c               (     | |d|di|       y )Nr"  r  r#  r   )r  r  r'  r(  r  r  s       r   r)  zDrun_still_recipe_generation.<locals>._run_groupbg.<locals>._annotate  s$    $"$ )#.	"BT"Br   bgfirst_group_bgbgfirst_groupbg)
r*  r  r'  r+  r,  r-  r.  r  r  chain)
r  r(  r  r  r*  r  r/  rv  r_  origin_inputsr6  )>r  r7  r8  r  r9  r  r:  r  r;  r  r<  r  r   r  r=  r  r>  rO  r  rV  rW  rb  rc  rd  re  rf  r  rg  rh  r?  r  r  r  r  r  r}   r%   sortedrb   !app.modules.pipeline.era_researchr{  r  r  r  r@  rA  rB  r"   r#   r?   r@   rB   rp   rM  rC  rt   r$   rD  rE  rF  r  r   )`r  r   r   rG  r  r_  r`  rx  ry  _hashlibr  r  r  r  r  rO  r  rV  rW  rb  rc  rd  re  rf  r  rg  rh  _saferE   r  rO  r  	canonicalrv  	is_originera_bg_metaera_bg_path_gb_fp_era_cached_gb_era_gb_outcome_gb_sid_gb_role_gb_sha	_gb_canon_era_gb_era_norm_gb_era_groupbg_gb_refsr  
_prev_meta_era_preserver  rN  r  r  	stored_fpstored_promptlineage_conti_aidrQ  rR  rS  rz   rT  rU  rV  rW  r'  r  r  r)  rY  r  r  r  r  rH  r  r(  r[  r  r  _groupbg_origin_now
_si_by_tagr   rw   era_failed_memoera_preserved_keysera_research_ongroup_ofrh  rv   r  r]  r   rz  rw  s`   ` ``                                                                   @@@@@@@r   _run_groupbgz1run_still_recipe_generation.<locals>._run_groupbg
  s   2 	#>1LCL	
	
	
 	
 	
 	
	
  
<E
 

2 	xW%''0y{2A7 7 	7XeWD11)%<<##C(.B &nn. 
	 5("0("0	 1'
	 |,
#%	|,
"#34"#34 3 .)!


 )!)%  2)
	 15&* ,0 /1O *4z**,&GXw'26I$/' 6499VD 2C4 65 ,6#*%-$+"."$  .1+''G0
 +7<0+2'Ix%&qk/:uk*+	+#'(CD5 # /#5-
* |+
. ++-:CHHJ$6$6$: $HLL$8$? ll6*EG 	,"['6ODz3 NN9:=yJ 
#D"HLL1D$EJ (,,~6=&~6  22")))41! NJ" %,,

 '||,>?L9 %89I$LL2?iM !/z.$#*J"7!D)!D %* zz|78;Y %S)G(
 i	{$;4H%G0,4PQ2/!'#*'1 'P:E+2'P *@(7+1%&	) *@2H,4 -0.8-6..  #"./L"MM*34+2(=  & Ij I%M .-,.			 	"	 -#)* !)##
 	
!*# 03x ($$ +
 1<,
S  	HKK} % !#hnn.(C/ 18s? 1/361)S0 "
 #a<I!1!:!: 'S2w"@B(*/A(B(HbI( &%9:=!" +4 (%A IHs>   T&"AR%T&	T#BTT&TT##T&&T0c                N   t        |       }|vry	 ddlm} ddlm}  ||      }j                  |j                        j                  |j                  k(  |j                  |k(        j                         }|r|d   nd |<   |   S |   S # t        $ r d |<   Y |   S w xY w)Nr   r  r  )r$   r8  r  r9  r  r  r  r  rv   r  r  rt   )	pr  r  r  r  r  r   plate_asset_cacherv   s	         r   r\  z4run_still_recipe_generation.<locals>._plate_asset_idA  s    !f''.F9,S1HHZ]]+V"--;",,3 UW  47QD!#& !%% %%  . *.!#& %%.s   A3B B$#B$c                :    t        | d         t        | d         fS )NrB  rC  )r  )ss    r   r  z-run_still_recipe_generation.<locals>.<lambda>_  s    s1]+,c!L/.BCr   )r  z / )detailr  c                F   j                  |       }|t        d|  d      j                  |       xs i }|j                  d      }|rt        |      j                         st        d|  d      j                  |       xs i }|j                  d      xs> j                  t	        |      i       j                  d      xs 	j                  |d      j                  t	        |      i       j                  d      xs dt        |      |j                  d      d	S )
u  origin 샷의 **현재** 상류 SOT 입력 해석 (Codex 3차 NARROW).

        origin 이 already_done 으로 skip 되는 partial resume 에서도
        follower 가 origin 의 현재 place/time/콘티(bytes)로 지문을
        대조·재생성할 수 있게 한다. 해석 실패=ValueError fail-closed
        (원 origin 재실행 요구 — follower 값 대체 금지).
        zgroupbg origin uB    스틸 미존재 — canonical 입력 해석 불가 (fail-closed)
image_pathuB    콘티 미해결 — canonical 입력 해석 불가 (fail-closed)place_enr   r`  r  rr  )r%   r  r   rp   r$   )
o_tago_sio_entryo_cpatho_clsr  classify_scenesclassify_shotsr  location_by_scenes
        r   r  z8run_still_recipe_generation.<locals>._groupbg_origin_now  s-    ~~e$<!% ). .  **U#)r++l+DM002!% ). .  ""5)/R 		*% 3"&&s4y"599*E3$((r2  ##CIr2%&-*,w-%kk*5
 	
r   )build_effective_prev_mapbuild_scope_auditclosure_over_prev_chainrequested_still_idssave_scope_auditscope_audit_path)rc  requested_idsdependency_added_ids	path_kinduK   still_recipe 표적 scope: scenes=%s requested=%d dep_added=%d effective=%dstill_jit_verify_enabledu   게이트가 켜져 있는데 JIT 검증이 꺼져 있다 — 완료 샷이 의존 대기를 푸는 자리에 못 와서 뒤 샷이 영영 붙잡힌다. STILL_JIT_VERIFY_ENABLED 를 켜거나 게이트를 끄고 다시 걸어라.still_jit_regen_limit@   u.   JIT 재생성 상한 래치가 남아 있다: u    — 이전 걷기에서 완료 샷 재생성이 상한에 닿았다. 원인 확인 후 래치 파일을 삭제하고 resume (자동 재시도는 이 예외로 지출 없이 끝난다).r^   um   still_recipe %s: 완료 샷에 record 가 없어 검증 없이 skip — 같은 부류는 끝 요약에 센다)tripped_at_tagfreshregen
spent_same	no_recordu#   완료 샷 JIT 재생성이 상한(u(   )에 닿았다 — 다음 검증 대상 u    앞에서 멈춘다. 완료 샷이 무더기로 어긋나는 것은 지문 체계가 통째로 움직였다는 뜻이라 사람 확인이 필요하다. 래치 uD    를 남겼다 — 원인 확인 후 삭제하고 resume (그대로 u   ·재생성 u   ·record없음 shot_run_spend_attempt_count)r   rB  rC  rI  person_visible
handled_bylanestructure_platerU   ab_select_bypass:bypass_reason	bg_source)r  r  u&   complex 샷 bg_source 허용 밖 값: u4    — fail-closed (shot_conti_light 재실행 필요)u#   still_recipe %s: %s — fail-closed)ab_select_readyr  prevr  r*  u   seed-bg 결손/asset 부재: u)    — LOCATION 권위 없이 진행 금지uu   seed-bg entry 인데 현재 플레이트 존재 — seed→plate 전환 재생성 필요 (shot_conti_light 재실행)r  r+  u   complex 샷 seed/asset 결손: u8    — 구조물 look 앵커·lineage 없이 진행 금지u*   complex 샷 lane 정책 실패/결손 — r  zstatus=r  rV   uZ   still_recipe %s: lane conti 실패 — 운영자 무콘티 예외, 일반 경로로 생성u   lane conti 실패/결손 — u   sketch 부재: )apply_share_plan_prevref_planr   r   r   )r   
blocked_byr  r   u   still_recipe %s: 앞 샷 %s 가 붙잡혀 있다 — 이 샷은 **의존 대기**로 기록한다(앵커를 파일에서도 DB 에서도 안 집는다)r  )resolve_image_pathr  sceneuM   still_recipe %s: prev %s 선정본·primary 부재 — 플레이트만 참조z:share_plan_prev_bypassuY   still_recipe %s: share_plan prev 지휘 — complex A/B 대신 prev 파이프 (anchor=%s)share_plan_prev_bgonlyuf   still_recipe %s: share_plan prev 지휘(배경 전용) — 플레이트 대신 prev 참조 (anchor=%s)short_idr2  )r  r  rH   r1  confined_structure)apt_fingerprintjudge_fp_applicabilitypose_fixr)  zstill_recipe %s: %sz

c              3  f   K   | ])  }|j                  d d      d   j                         r| + yw)r,  r^   N)r=   r&   r3   s     r   r6   z.run_still_recipe_generation.<locals>.<genexpr>  s:      	)3 	5q WWT1%b)//1 *+ 	5s   /1zSHOT TEXT: still_frame_promptzCARRIED STATE: z
LOCATION: r  z::confined_fp_aptappliesr  u1   still_recipe %s: confined fp 판별 제외 — %s	reason_koP   )lane_sketch_mode)	lane_used
lane_chainr+  )plate_flow_modenoneu5   콘티 배경 참조가 seed-bg 와 불일치 (conti=u'   ) — shot_conti_light 재실행 필요)plate_select_on
complex_abr+  	prev_usedr  is_map_plateplate_presentbg_late_select)location_of_bg_idselect_plate_for_shot)call_structured)	shot_descr_  assigned_bg_id
candidatescall_structured_fnrh  u*   still_recipe %s: plate_select %s→%s (%s)	reconcile)resolve_conti_plate_authority)authority_entryconti_plate_pathcurrent_plateu<   복잡 구조물 샷 LOCATION 플레이트 결손/비파일(u   ) — seed-only 금지zab_select_bypass:prevup   complex prev bypass 인데 prev 선정본/primary 결손 — 구조물 권위 없는 일반 경로 하강 금지)locked_pose_short_ids
pose_canon__conflict__zoutfit_assignments conflict: __invalid__zoutfit_assignments invalid: r  r  c                    | |syddl m}  ||       }j                  |t              }|t        u r||f|<   y|||fk7  rd|<   yy)u+  참조 원본의 신원과 역할을 지도에 넣는다. 승패와 무관하게 **미리**.

                `_attach` 와 **분리돼 있다** — 그쪽은 승자 확정 뒤에야 도는
                자리가 있어(A/B conti·bgfirst seed 계열) 지도가 늦거나 빈다.
                Nr   ref_source_key)r>  r  r%   _MISSING)srcr  r  r  r  r  ref_registrys         r   _register_refz2run_still_recipe_generation.<locals>._register_ref  sa     ;hL$S)#''X68#)14(8L%h--(,L% .r   c                f    |rj                  || |d|       y j                  | |d|       y )N)r  r  r   )r  r   )rB   )r  r   r  r  attached_refsunresolved_refss       r   _attachz,run_still_recipe_generation.<locals>._attach  sE    !((%-te " "
 $**!%??r   r1  z ((uJ   still_recipe %s: %s(%s) pose-locked by prev %s — 캐릭터 참조 제외)resolve_char_ref_key)r3  sid
state_sidsoutlook_by_eidscene_ref_image_mapcharacter_ref)ref_keyz
composite:r  u    — wearing: uE   still_recipe %s: %s 합성 시트 + 아웃룩 서술로 의상 잠금uO   still_recipe %s: %s 시트·배정 없음 — 아웃룩 서술로 의상 잠금uR   still_recipe %s: %s 시트 없음·아웃룩 후보 %d개 — 의상 공급 없음propprop_ref)bgfirst_conti_defectbgfirst_eligiblebgfirst_eligible_fullbgfirst_structural_skipskipped_reasonno_plateuW   BGFIRST full 인데 콘티가 no_plate skip — shot_conti_light CP stale (fail-closed)ue   still_recipe %s: 운영자 선언 무콘티 예외 — BGFIRST 대상 제외, 기존 경로로 생성)conti_presentr+  r  r  chain_lane_prev)r3  r+  r  r  r  structure_seed_attachedseed_bg_attachedu<   BGFIRST2 대상 샷 콘티 결손 — legacy 하강 금지: lane_storyboard_sketchzSTORYBOARD SKETCHr  structure_seed_lookzSTRUCTURE LOOKlocation_seed_bgzLOCATION STRUCTURE PHOTOGRAPHc                     j                        xs i } | j                  d      t              k(  r| j                  d      ndxs        S )u   plate 의 자산 id — map_conti 일치 우선, 없으면 fallback.

                ★`_attach_plate` 와 **같은 함수**를 쓴다. 두 벌로 만들면
                두 계산이 갈린다.
                r  r  N)r%   r$   )
_map_entryr\  r  r  r   s    r   _resolve_plate_aidz7run_still_recipe_generation.<locals>._resolve_plate_aid  sT     ']]3/52
 "~~l3s5zA NN:.GK, %U+,r   c                 R            }  | d        dd| t                     y )Nlocation_plateLOCATION PHOTOGRAPHr8  r  )rX  r"  r  r=  r  s    r   _attach_platez2run_still_recipe_generation.<locals>._attach_plate  s/    /1
eZ1AB$&;Z!%jr   
prev_stillzprev=scene_prev_frame)r$  r  r   source_still_idu$   complex A/B 전제 결손 — conti=z
, bg_only=z, prev=conti_lightzLAYOUT SKETCHzS(\d+)sh(\d+)$)build_prev_people_rulec                |    | D ch c]+  }j                  |      xs i j                  d      dk(  r|- c}S c c}w )Nr1  r2  r%   )_ids_ientity_lookups     r   _char_ids_ofz1run_still_recipe_generation.<locals>._char_ids_ofI  sQ    -1$-1r$1$5$5b$9$?R#D#D$1$36A$B !#T$  $s   09c              3  n   K   | ],  }j                  |      xs i j                  d       xs | . yw)rH   NrH  )r4   rJ  rK  s     r   r6   z.run_still_recipe_generation.<locals>.<genexpr>S  sA      #=0;" "/!2!22!6!<" A A& I !&#%!&0;s   25)
cast_known)still_guidance_selector)build_camera_frame_clause)r   )version_selectoromit_camera_direction)build_framing_scale_clause)build_lighting_mood_clause)AUTHOR_MODELSIGNAGE_POLICY_VERSIONauthor_inscriptionsresolve_signage_packsignage_pack_content_hash)build_signage_sectiongemini_flash_modelr  rm   r  z	::signagerN  signage_author)r  	shot_textr_  r  rh  inscriptionscuesdropped)rN  r^  r_  r`  u,   still_recipe %s: 표기 저작 실패 — %r)build_identity_ref_role_clause)rQ  r  rw  r  prev_usage_enusage_enpose_clausesmovement_en
figures_en
carried_en
char_nameschar_names_exactnonhuman_nameslane_ref_modesketchr5  seed_bg_modeplate_attachedcamera_frame_enframing_scale_enlighting_mood_enconduct_versionidentity_role_enprev_people_rule
signage_enprompt_versionguidance_versionchain_bg_mode)attach_cinematic_finish)grok_backendcine_on)r+  r  r  prev_sel	char_refs	prop_refslane_sketchstructure_seedseed_bgrv  r  geom_authorityrt  framing_scale_ownedu^   still_recipe %s: 참조 0 — text-only 생성 (플레이트·콘티·엔티티 전부 부재)u   레시피 스틸 생성 중 ()run_branch_selectc                   ddl m +fd} ||      |d<   |j                  d      }|r-|j                         D ci c]  \  }}| ||       c}}|d<   |!|,k7  r| |      \  }}}|}||n|}||n|}d)d}t	        |	xr t        /dd	            }|rIt        ||n,      }d
|d<   #r3d
|d<     |dz   |
      |d<   "|d<   |d<   i !|dz    ||
      d|d<   t        |d       5   -d*i d| d|d|d|d)d*d(0fdd$'0fdnd d||n%d||nd ||n,d!d"||n&d#||nd$.d%d&d'd(|cd d d        S c c}}w # 1 sw Y   y xY w)+Nr   r  c                    g }| xs g D ]:  \  }}j                   |            }|j                  |r|d   |d   dnd        < |S )Nr   r^   )r  r$  )r%   rB   )seqrE   _lab_srchitr  r  s        r   	_meta_forzCrun_still_recipe_generation.<locals>._run_branch.<locals>._meta_for  s\     +.9"9JD$"."2"2>$3G"HCJJ#& .1Vc!f M,02 ,5
  #
r   ref_role_metadata	roll_refsroll_ref_metadatac                r    | sydd l }|j                  | j                  d            j                         d d S )Nr   r   rm   r  )r  r  r  r  )h_hhs     r   _gate_hdr_shazGrun_still_recipe_generation.<locals>._run_branch.<locals>._gate_hdr_sha7  s:     #%-"zzHHW- //8y{3B @ @r   r   FTwinner_gate_applicablegate_reroll_enabledr^   gate_rejudge_fnr  gate_regen_texts)rejudge_labelsrejudge_header_shagate_rejudge_identityrI  
branch_tagbranch_refsrec_keyout_stemr  r   make_gen_fnc                     |       S r2   r   )btr{  r   s    r   r  zBrun_still_recipe_generation.<locals>._run_branch.<locals>.<lambda>c  s    3CHb3Qr   make_fix_gen_fnc                     |       S r2   r   )r  r~  r   s    r   r  zBrun_still_recipe_generation.<locals>._run_branch.<locals>.<lambda>g  s    ,@2,Nr   judge_fnr  r  r  judge_textsextra_fingerprintrun_fnfix_rejudge_fncomposition_critique_fnr   fix_missing_texts)r  r$   r   r$   r   )r>  r  r%   rb   r   r;   r  rM  )1r  r  r  r  rcjfjtcfefr   gate_header
variant_kwr  _rrlabr  _jf_rc_jt_rc_cf_rcr  _gate_on_g_rollsr  r  r  r  r  r  r  r  r  r  r  r  r  gate_reroll_onr}  r  r  r~  r{  r  r   r  r  r  rt  r,   r   s1                         @r   _run_branchz0run_still_recipe_generation.<locals>._run_branch  s{   " Q# 7@6LJ23$..5C@C		;M@KHCC3/;M
#67 ~"
*:rz1Eb1I.##%>Rv#%>Rv@  $D %FW "=u.F  GH#&R^r#L?C
#;<)@DJ'<=<L (1k=;J'89 !5 ''=>=MJ'9:C"7C2:Q,$1+$>	CJ'>? 'G4@0  '1 (3  %,  &.	 
 $*  %,  )R  $3#> "ODH  ,.>Rx  /1n+  .0^r   .>! " /1n+# & ')n:K' ( $8) * ,:+ , 5L- 2 *93 4 /@(7  A@u;Mt A@s    E3A!E$$E-c                $    ddl m}  || |      S )u  2롤 ab 변주 (2026-08-13 사용자 확정 — **전 백엔드·전
                경로 무조건**): 첫 롤=기준, 나머지 롤=구도 변주 절 동반.
                a 와 b 가 같은 구도·앵글로 나오는 일이 없어야 한다는 사용자
                원칙의 구조 재료 — 이전 "grok 전용·confined/2택1 제외"
                게이트는 같은 날 사용자 재지시로 제거. 구현·시험 SOT=
                still_recipe.build_ab_roll_prompt_map.r   )build_ab_roll_prompt_map)r>  r  )base_promptlabelsr  	_guidances      r   _ab_roll_promptsz5run_still_recipe_generation.<locals>._ab_roll_promptsz  s     4#VY8 8r   c                2     d      } | |      |d      S )u   둘째 후보용 프롬프트(base+구도 변주 절) — 두 후보가
                별도 브랜치/라벨로 생성되는 경로(2택1·레거시 A/B)에서
                b 쪽에 부착한다.r  r^   r   )r  _labsr  rs  s     r   _broll_variantz3run_still_recipe_generation.<locals>._broll_variant  s$     (NE+K?aIIr   r   )FP_REF_LABELbase_fingerprintbuild_confined_gen_promptextract_brief_sectionsproduce_base_fpproduce_shot_fpshot_fingerprint   zconfinedfp::confinedfp_base_ro  )r
  r_  r  z_confinedfp.pngz::confined_fpscene_description_enconfined_fprz  era_research_confinedc                    t        j                  j                  |       t              rj                  j                  |       S d S r2   r~  r  s    r   r  z-run_still_recipe_generation.<locals>.<lambda>  =    #-gll.>.>q.A4#H !( 0 0 3 !*%)!*r   c                \    j                   j                  | |      j                         fS r2   r  r  s     r   r  z-run_still_recipe_generation.<locals>.<lambda>  %     ' 8 8A > '40r   )r  r  r  r  r  r  r  r  r  rh  r  r  )r  project_confined_erakindr2  r5  r  )r5  r  )roll_promptsr  critique_selected_prompt_onlyr   parallel_rollsr  fixed
mismatches)base_key
apt_reasonr  r  r0  r1  )author_still_variantsz
::variants)r  r]  cached_entryrh  )	author_fpauthorr   )LANE_CONTI_ONLYbuild_ab_branch_refsbuild_bgfirst_bg_promptbuild_bgfirst_final_promptbuild_bgfirst_refsbuild_bgfirst_seed_clauseu2    샷에 플레이트/seed_bg 가 공급됨 (plate=z
, seed_bg=uC   ) — 사전 배경 플레이트 금지 계약 위반 (fail-closed)r  uc   BGFIRST full no_plate 샷인데 share_plan 그룹 미배정 — groupbg 묶음 불가 (fail-closed)groupbgr  u$   BGFIRST2 샷 LOCATION 권위 결손(z, kind=u$   ) — 재투영 불가 (fail-closed)r?  r  )rR  )rW  r[  group_id)	r  r_  r`  ro  rq  place_facts_blockr  	lane_fillrv  era_research_platec                    t        j                  j                  |       t              rj                  j                  |       S d S r2   r~  r  s    r   r  z-run_still_recipe_generation.<locals>.<lambda>E  r  r   c                \    j                   j                  | |      j                         fS r2   r  r  s     r   r  z-run_still_recipe_generation.<locals>.<lambda>I  r  r   )r  project_plate_era)rI  r  r  r  rJ  rK  
bgfirst_bg)bgr  r}  r~  r  )r  r  )r  r  r}  r~  r  r  rv  )rv  	mannequinr  )r   r  r  r  r  )r  r  r  r  r   r  r  r  r  
judge_flipflip_priorityr  judge_prompt_headerr   r  )r*  bg_asset_idbg_record_keychain_winnerr   r   r  groupbg_asset_idr  )bgfirst_winner_lineage)	chain_wonr  r5  conti_attachedr  zSHOT BACKGROUNDr@  canon_masterlane_canon_masterr  )r  )ab_label_mapassemble_still_roll_promptsbuild_ab_roll_refswinner_uses_contir  variants)r  r  r  )r  r  r  r  r  r  r  r  r  r  r  variant_mapconti_winner)r  )r  r  r  r  r  r  r  r  )resolve_or_run_outer	_ab_contiz
::ab_conti
__ab_conti)r  _ab_nocontiz::ab_noconti__ab_noconti)r  r  z::conti_ab_decision)r  sel_asel_bprior_decisionjudge_model_physicalrh  )fingerprintwinnerouterr  Ar  judged)r  r  outer_judged_this_run	sel_contisel_noconticonti_abr  )r  r  repair_methodstill_regen_textsr   r  z+seedzseed-bgu   플레이트u*   confined_fp: 도면+장면설명+엔티티r   zlane(u   ): 스케치u   +prev+엔티티u
   +엔티티u   그룹 배경)r  r  r  u5   재투영 배경+콘티+엔티티 (2택1: 체인 승)u!   +엔티티 (2택1: 무콘티 승)u   복잡구조물 4택1u   4택1u   =변형variantu   +콘티u   +엔티티 (u   : 콘티 승·u   : 무콘티 승·u   복잡구조물 A/BzA/Bu   : 콘티 승)u   : 무콘티 승)u&   prev만 (배경 전용·공유 계획)u   만 (배경 전용)u   prev+엔티티u   플레이트+콘티+엔티티r   r   r   r   r   plate_selectu[   still_recipe %s: 게이트에 붙잡혔지만 지출은 났다 — 상한에 센다 (%d/%d)u   still_recipe %s: 게이트 **미해결** — 변환·자산 승격·완료 표시를 하지 않는다 (후보 파일은 남는다)r   humanzhuman:reason)appliedr   rejected_byrejected_reasonuq   still_recipe %s: 사람이 변환본을 거절한 샷 — 원본을 최종본으로 확정 (변환 호출 없음))cine_record_keyresolve_or_run_cine_transform)rn  camera_directionlighting_mood)camera_direction_enrq  r  still_cine_transform)rv   rw   rt  r   r!   rB  rC  )r   sel_pathr  r   clientr  r  identitystem_content_hashrg   rh  contextr  declined)rC   u5   still_recipe %s: 검열 거절 — %s 로 한 번 더)r   r%  r  r   r&  r  r  r'  r(  rg   rh  r   r)  u\   still_recipe %s: 변환을 검열로 포기 — 원본을 최종본으로 확정 (사유=%s)declined_reasonr  r   u_   still_recipe %s: 변환이 불변축을 바꿔 기각 — 원본을 최종본으로 확정 (%s)r  u   still_recipe %s: 생성 실패gate_select_action_this_runfromresumed_pending_pick)r   r   u[   still_recipe %s: 재사용 산출이 게이트 **미해결** — 완료로 세지 않는다)r   r   r   rv   rw   r   r   r   r   u~   still_recipe %s: 산출은 같으나 게이트 **미해결** — 완료로 세지 않는다 (지출은 상한에 셌다 %d/%d)uk   still_recipe %s: JIT 검증 — 지출 흔적(record 갱신) 있으나 산출 동일, 영속 생략 (%d/%d)u   still_recipe %s: **무료 재선택** — 생성·판정 0 이고 선택만 바뀌었다. 상한에 세지 않는다(자식·공유·변환이 움직였으면 이 갈래로 안 온다)uB   still_recipe %s: JIT 검증 — 입력이 낡아 재생성 (%d/%d))effective_prompt_usedfix_stage_wonpartition_lineage_idsr  fix_source_roll)r  r5  r  )winner_exact_multiroll_tagrs  )rt  r!   cine_source_selzSOURCE STILLr#  source_sha256)r  r   r5  r  r"  user_promptr  rw   r  r  r  
model_name)
r6  r0  r7  r8  r9  r:  r$  r1  r;  r<  widthheightr  actual_attached_image_idsactual_attached_refsunresolved_attached_refsr   r   generation_call_idreview_notesr"  totals)r   r?  r   fix_appliedissuescritiquecine_transformcine)r  finish_owner)r*  r+  r  verifyr  roundschangedr=   )r  rG  rH  r=   )r   r  r  rF  rg   r  )rg   r  r  r#  r5  safety_ladderr  )r  r  r=  base_recipe)prompt_file_versionr:  r;  r<  r=  
fix_source)r  r  )r   r  still_recipe_v1)prompt_typecode_versionrK  reference_image_ids
is_primaryuh   still_recipe %s: 사람이 올린 대표를 지킨다 — 새 산출 %s 는 보관하고 CP 대표는 %s)	asset_idsr   r   produced_idproduced_pathr   u-   still_recipe %s: 완료 (selected=%s, fix=%s)
fix_promptu   still_recipe: 게이트 **미해결 %d샷** — 변환·자산 승격·완료 표시를 안 했다. 후보 파일과 판정 기록은 남아 있다: %s   u   still_recipe: **무료 재선택 %d샷** — 생성·판정 0 인데 선택과 산출이 바뀌었다(변환 지출은 따로 센다): %su   still_recipe JIT 검증 요약: 그대로 %d · 재생성 %d (그중 산출동일 %d) · record없음(검증불가 skip) %d · 실패 %du   (걷기 끝))r  r  r  r  r  faileduc   )에 닿은 채 걷기가 끝났다 — completed 로 닫으면 확인 없이 지나간다. 래치 u   ·산출동일 u   JIT 검증 대상 u   샷이 실패했다:    u    …u    — 옛 primary 가 실패를 가리므로 스텝을 완료로 닫지 않는다. resume 이 실패분만 다시 시도한다 (그대로 u:   cine 변환 검열 포기 %d샷(원본이 최종본): %s%su:   cine 변환 검증 기각 %d샷(원본이 최종본): %s%su   cine 변환 실패 u   샷(원본 fallback 영속): u    — 스텝을 완료로 닫지 않는다. resume 재진입이 실패 변환만 다시 시도한다. 영구 실패로 판단되면 STILL_CINE_TRANSFORM_ENABLED=false 전환 여부는 사람이 결정한다.u=   era 조사 미성립으로 기존 배경을 보존한 그룹 u   건: u   — 현재 계약 검증이 미뤄졌으므로 스텝을 완료로 닫지 않는다. resume 이 보존 그룹의 조사만 재시도한다(성공분 재사용 지출 0). 조사가 계속 실패하면 ERA_RESEARCH_ENABLED 전환 여부는 사람이 결정한다.u   레시피 스틸 생성 완료)r  r$   r   r$   )r  r$   r   r$   )r  r$   r   r$   )rB  Optional[int]r   z2Tuple[Optional[str], Optional[str], Optional[str]])r  Dict[str, Any]r  r$   r   r   )r7  r  r8  r  r9  r   r   z	List[str]r   )r   r$   rx  r$   )r  r  r   zTuple[Any, Dict[str, str], Any])r  r  r  r$   r   r   r   r   )NNNr  NN)r   r$   r   r$   rG  r   r  Optional[Path]rH  r$   r  Optional[str]rI  r^  r  r]  r  r^  r  r$   rJ  r]  rK  Optional[Dict[str, Any]]r   Tuple[Path, str])r   r   )r  r$   r   r$   r   r$   rG  r   r  r^  r_  r$   r`  r$   rx  r$   ry  zTuple[str, ...]r   r`  )r  r   r   r^  )r  r$   r   rZ  )r  r   r  r^  r  r$   r   r  )r  r$   r   r$   r  r^  r   r  )r   r^  r  )rI  r   r   r   )NNNNNFr   )r  r$   r  r$   r  r   r  rY  r  r   r  r   r  r   r  r   r   r   r  r$   )r  r$   )r  r$   r   r$   (I  r9   r,   r<  re  rf  rg  rh  ri  rj  rk  rl  rm  rn  ro  r   rp  rq  rr  rs  rt  r=  ru  &app.modules.pipeline.shot_ref_classifyrv  rw  r>  rx  ry  rz  r{  ru   r  still_recipe_roll_countr   r  r$   r;   r~  !still_recipe_camera_frame_enabledr   r?   r@   lenr  r   r%   r&   r_   rQ   r  r{   r#   r"   anyr  r   r  r  r  r  r  ri   r  r  r  r   rb   r   rp   r>   !app.modules.pipeline.plate_selectr  r  r9  r  r  r  r  r   r  r  rv   r1  allr  rq   rr   rA   rt   rB   JSONDecodeErrorr  r  r  r  r  r  r  gemini_image_modelr  r  r
  r  qwen_vlm_modelrD  r  r  r  r  r  r  r%  r&  r'  app.core.body_identityr-  $app.modules.pipeline.shot_visibilityr.  r/  r>  app.core.entity_identityr?  character_idr  valuesin_ app.modules.pipeline.confined_fprA  rB  rC  rJ  rL  rO  rP  rQ  rV  rW  rZ  r[  r\  #app.modules.llm.gemini_image_clientrd  app.modules.prompt_sanitizerre  !app.modules.llm.grok_image_clientrf   app.modules.llm.gpt_image_clientrg  r:   r.   r/   r   rk  rl  rm  rn  ro  r  r  maxr  r  r  #app.modules.pipeline.still_variantsr  r  r  app.core.openai_keysr  r  floatllm_timeout_image_genmkdirr  tuple&app.modules.pipeline.scene_image_scoper  r  r  r  r  r  r   r   rC  r  r   r<   r}   r  r   	TypeErrorr  rF  rM  rR  r  mark_failedr@  r  r   r   r   r   r   r8  r  r  rw   r   r  rQ  r  r  get_visible_entitiesr   r  r  r/  r   r[   r  r   r  r	  app.modules.llm.llm_clientr
  r  r  detect_state_variant_sidsr$  r   r-  r.  r/  r0  rematchrF  grouprO  rP  r   rS  rT  r  #app.modules.pipeline.signage_authorrU  rV  rW  rX  rY  rZ  r  r  r  ra  ry  updater  r  r  r  r  r  r  r  rA  rB  r{  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r   app.modules.pipeline.conti_abr  r  
read_bytesr   r   r  r   r   rI   	exceptionr   r  r   order_byr  descOSErrorr   r7  r  parentshutilcopyr/  r0  r1  rD  rH   r3  _resolve_generation_call_idsafety_ladder_call_provenancer)   call_model_namer%  save_single_scene_assetr=  r   rN   r   r   r   r   (  r   rv   rw   stills
stills_ormrK  ref_image_mapreference_svcr(  scene_ref_asset_id_mapr<  r   persistence_svcprogressrh  	scene_diralready_done_stillsrc  re  rf  ri  rj  rl  rn  rp  ru  rv  rw  rx  ry  rz  r{  ru   r  r  r~  camera_frame_onlighting_on
conduct_onidentity_role_on
bgfirst_onbgfirst_full_onlane_prev_chain_on_no_conti_exemptclassify_war.  
conti_datarQ   conti_pack_version_expected_conti_packshare_plans_sp_datagroup_evidencer   _gkeyr  _ev_quotesqlocation_detail_by_name_loc_lname_ldescr(   _ltraits_detail_vwr_cp_lane_world_blockr  r  _COMPLEX_PACK
_LANE_PACK_SEED_BG_PACK_CONDUCT_PACK_SELr  r  r  r  	plate_mapr  map_plate_keysrf   r  sishir  conti_ab_onplate_cands_by_locplate_assign_by_keyr  r  
_bg_groupsr  scene_headingssegdirectorscr  r  r  
_bclassify_m_lid_ind_rolerr  traits_by_idr3  r  rD   vals	ve_by_keyve_outlook_by_keyr  idsoutlooksr   olshot_desc_by_idr  r  
_norm_uuids_ormoutfit_by_still_idr  r  r  _select_judge_alias_select_judge_physical_still_backend_shed_baseline_shed_sig_fn	_shed_sigr
  r  r  r  r  	_sel_physr  r  r  r%  r&  r'  
signage_oncast_lock_onr-  body_identity_idsr/  r=  outlooks_by_charoutlook_desc_by_idr>  r?  _colsto_o_ids_o_descconfined_fp_onconfined_extra_fingerprintrA  rB  rC  	_CAM_PACK_LIGHT_PACK_CONDUCT_PACK_BGFIRST_BG_MODEL_BGFIRST_CONTRACT_BGF_FULL_CONTRACT_BGF_FULL_PACK_BGF_LANE_CONTRACT_BGF_LANE_PACK_CHAIN_LOC_PACKrd  re  rf  rg  r{  cine_promptcine_stem_hash	cine_packcine_clientcine_identitycine_selcine_stage_dir_onr.   r/   rk  rl  rm  rn  ro  _cine_pack_resolve_Gg46FixClientr  r  	_rj_texts
_rj_header_GR_REGEN_PACK_gr_regen_textsr  r  _judge_pack_resolvevariants_onsv_judge_headerjudge_fn_by_countjudge_texts_by_countr  r  _sv_pack_versioncritique_fn_by_count_n_jt_make_gg46_cfbgfirst_judge_fnbgfirst_critique_fnbgfirst_judge_textsbgfirst_judge_headerr  r  _make_gg46_bgfr^  r  primary_asset_by_tagorderedstill_id_by_taggroupbg_context_scenesr   _detailsexecution_scoper  r  r  r  r  r  _requested_idsr   
_tag_by_idrid_requested_tags_prev_of	_eff_tags_added_tagstotal
exec_total	exec_seens2done	jit_freshjit_regen_countjit_spent_samejit_no_recordjit_failed_tagsgate_unresolved_tagscine_failed_tagscine_declined_tagscine_rejected_tagsjit_snapshot_beforejit_spend_beforefree_reselect_tagsjit_regen_limitjit_known_tagsjit_enabledrG   
jit_verifylatchclsr+  r  
lane_entryr  r  r   lane_sketch_pathstructure_seed_pathstructure_seed_asset_idseed_bg_pathseed_bg_asset_id_status
_bg_sourceerr_is_prev_bypass_bgp	_seed_aid
_need_seed_seed_sketchr   share_shot_planr  share_prev_directedr|  prev_primary_asset_id
_uses_prev_rec_prior_gatecandr  r  prev_sidr  	ve_detailvisible_char_sidsstaged_eids_ve_detail_idsstaged_rows_st_eid_st_e_st_sid_confined_activer  r  _apt_fix_apt_carriedrz   
_apt_brief_apt_key_apt_fp_aptr  r  r  lane_sketch_usedconti_entryrG  r  plate_select_recr   _flow	_assignedr  r	  _candsr
  
_chosen_id_chosen_pathr  _pa_excr  locked_pose_sidsve_idsve_exactstaged_added
outfit_map_outfit_errr'  r&  
sid_by_eidr}  r~  rh  rj  locked_excludedlocked_kept_identityrH   etypetraits_ve_sidr$  r  _comp_ol_wdesc_aolr-  r.  r/  r0  bgfirst_used_conti_structural_skip_op_no_conti_conti_defectrA  	_prev_aid	ab_activert  _re_pmrF  _a_ids_a_exact
_a_bg_only_erL  _shared_idsr  r(  _pack_grok_backend_sel_of_backendro  rP  rp  rS  rq  rT  ru  _sg_hashlib	_sg_model
_sg_policyrW  _sg_pack_fn_sg_pack_contentrZ  _sg_shot	_sg_place_sg_model_real_sg_fp_sg_key_sg_rec_sg_out_sg_excrs  ra  prompt_chain
_chain_cam_bcfcry  refsr  r  winner_branch_tagvariants_data_hlr  r  r  r  r  r  r  _place_text
_space_key	_base_key
_base_path_base_fp_sig	_base_rec	_sections_shot_fp_cfp_key_shot_fp_sig_cfpr   _cfp_prompt	_cfp_refs_era_cached_cf_sid_cf_role_cf_sha	_cf_canon_era_cf	_era_norm_era_confined_cf_lineage	_labels_nlnr%  r   r  _vkey_vfp_vreusedr  r  r  r  r  r  _authority_kind_authority_path_authority_aid_chain_seed_path_chain_seed_aid_groupbg_key_bg_cam_BGF_FULL_PACK_SEL_BGF_LANE_PACK_SEL
_lane_fillrH  _era_pl_pl_path_pl_meta_era_cached_pl_pl_sid_pl_role_pl_sha	_pl_canon_era_norm_pl
_era_plater*  r  
refs_chain_chain_onlyrefs_b_labels2_chain_prompt_win_origin
_chain_wonr  r  r  r  r   refs_a_labels4_w_contir  _ab1r	  rec_ar
  rec_bdecisionr  r  	_labels_d
_seed_note_bg_note
_auth_note_sel_lab_kind_vm_vnote_w	final_srcr'   r   _human_keepr  r   _cine_prompt_build_cine_prompt_cine_st_slot
_fb_client	_fb_ident_records_changed_act_free_select
_spend_now_spend_same
_pend_back_prior
_cmp_prior_prior_path
_unchanged_cine_fresh_success_cine_fresh_decline_cine_fresh_reject
final_pathr/  r0  r1  attached_idsentity_ref_ids_cine_applied_fix_won_repair_mode_fix_src_descr  _fix_src_path_gen_call_id_base_roll_call_idr3  _ladder_prov_cine_call_model_base_call_model_direct_attached_ids_direct_attached_refs_direct_unresolved
_cine_desc_u_prompt_used_pack_provenancer  _shown_heldro  rZ  r  r"  r[  r  r  r  r  r  r  r  r  r  r  r  r  r\  r  r=  r  r  r   rq  rr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r}  r:  r  r  r  r  r  rg  rh  rk  r~  r{  r  r  r  r  r  r  r]  r   r  rm  r  rs  r  rt  r  r,   ry  rz  r;  r.  r   r   r!  rw  s  ```  `    `   `                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@r   run_still_recipe_generationr    sr   > )      M 
 ((LX556JHBBC  	GH3V<FG!'  $	
 678EEFO 95ACK 8%@BJ ;UCE
 gh(?GHJ 6>@O ) ET;UC.E 28"=?+ !6*:#;	
  j*.AH &.\\'2%>%D"N&.ll8R&@&FBO <<)*0b
7
7
9C$'U3%=RL!j*.?J "j*.@J z,=P 
 	
 	WX@%HI,E7 
 	
 ,	
  2"C ->>,'+???))=(> ?##->>,#?"B CEE
  	 	 #%Kj*.E	c&"o  	V"''58F+L9:  "H+-N||F#)r..~>D"DRX2NN;/5268..-33B %HSW 4 b~~j17R7
7#t$ 
+1r288:7 	 

 S\07$=11Q$=N5! E /1z:~F	VR		c+r! !! $%TXXf%+,224TXXm,2399;%)XXo%>%D"%D
%Dq1v||~ FLLN%D 	 
 F8}$G|dii&99C??G*1''!. 	z:%	''*s62	=:<	c(B*   j*.BDG/8&P (^^Hb9?RF *{B ? E2I  ",b!A!GRJ :(:;
 9"2z:>@N
 	("-3  '|ZLI@%Noo'
U[bl+a!nGB'+AwIAcUm$"Qse}- ( 6>@O 2E:<K)+*,	

 +H*j+2'
'9*E j*l	c&"o  &(N~~j"-33WW]#b#3779#5!$YN2 4 j*.>	c&"o  %'Mll8R(.B.VVM">bff%78%'(:%;M#b'" / 1
J~. /,
 j*.C	c&"o  +-I~~/06B666)$**Brvvh'-2.446D66+&D,0DL(15-D y Yt_%="&	$$$T51 + 7 +&--""j0##z1
 #%A :: 	


AK / /(; $&L%%'QA/	&0c&:4::c?D$%$(II-Cd-C$CS! ( 35I?A%%&l(;C:#%	ZZ&= > F$Ga&%%+;{);C!#s+

3UU<0%b#.2,.HSM3'AJJqM H *-	3r7CH%&193r7CH-.+ 2 'A 	
wq,d39r9  '
 )7J  	5  E 	,E0$7
 	
  	  5 
 &}-/K 56@B X'<eDN *87)BH%%( #7<,,*'=*3/ 11IJ
 6$&#( -;/*
	

 !N	&4=01 wx)EuMNK0H,-0J$1&,- $$<= 	45 wx)EuMNK	

 1I,- &&'q)C)C(DE 	+,0J$1&,- $$<= 	45 8%@BM	
 3M./
	
 - 	/0	
 =FK89 *+EF 23 ((BC :;8;"4b99;45( 	 	I#?GH  )+	
 	
 33KL,0.)0J$1&,- $$<= 	45 1E0F,-
 78-CUKLO	
 	
 4O/01A1C-.!# 	56 gh(@%HIJ
 <eDFL
 @ > 	!Z<"u 
 
 : :H#))+:H H
% %, 5O-/)+D 	B'J
CC''  "&&,fS^^&< D  0668F8#Q!#!8F%**623 
 !]D9?RFFH05&ruu- 5u=?N 24	
 	
 !9 :(E(G!$"6;"= +."5r:+<"<	&
" 	
 9L945	
 5H501	
 4G4/0	
 	
 4G4/00A,-0A,-<?"=$89
 :L56#N3 89"CUKL  6I6 129K56
 $O4 670C1,- 4G4/03F4/0 ( 	/0E< X'<eDN E-/	7	" 	D,./1 'nE 78%CUKLGKNIK$&MH   HD>F%H	
 	L	
 	
 <M76 	 /r7A 	1)+&x0	
 /0'j(AB
 
 
&  O	
 )*
 
 
 $k*'
#$8%%H 
	
 ,1"/C),$
 

 *1"/C),$
 
 *1-/),$
 .$^41-/),$
  HJ' ' ' ' 'R NWX>FGWX'FNO	
 (-13	
 -13
-,+AT3)/$
 AD"A
<= 9C45 5u= 	BH95ACN !%,.')68( ( ((  s78%BBGHJ	8	 	" ""890!
	

 +,.<l+ $( K!d=uE'	
 	
 #C1-/$)3#
 5H(5*01>AHnb1?
:;
 wx)A5IJK%)O(*68	
 	
 4C8>>@3CC3H/0+ 	34 DG"D
?@ 02B%}57C (+ $$8k*/O$8---%b! 
 ,9$9&*/%K#14,,$R(  ,?$9&*/%K#14,,$R(  ,?$9&5%7#14,,$R( ,C!$^!4$9&5%7#14,,$R(u H !## $#6	
  9:1-13 0)+6+AT3)).
 
 #1 5"&o!G-0(# 
 #6 5"&o!G-0(#  #6 5"1!3-0(# #:0@ 5"1!3-0(# ,(889

 X%JTD1zN23G 26$('+% (,-1{ { {  {  #	{ 
 {  &{  "/{  "{  %{  {  %{  +{  
{  {  {  { J #%*,^ ^ ^  ^  	^ 
 &^  ^  ^   ^  (^  
^  ^  ^  ^  ^ B 35& &0 ,. 	.FqEE- ,UU< , 
F 	. D	G A 	s1]#$c!L/&:;QtWD    A 	s1]#$c!L/&:;- !	"J
 24OX__&'"..*
*BU{rZ/ rN*
 
 
 $''(9(=(=b"(ErJ
 D 
 jj*n00;<"
 (""
 "
 "
V &*O	
 	
 	
 -WmD'6'<'<'>?'>tq!ad'>
?6DEns:c?nE+!>;@!8Xs?';"=	;7@Ay!?1-yA\:zB+,0;&=0;1OA&&="		
 	 /^1Dc/2	
 LE JI" 
 2$x?*4 33 
 

 D IONM!#O ') |G0$8[\ 	\ #%$&$& %' $&	3wx!8"=>@O B 	s2m$%s2l+;'<=   wx)CTJKK
%77??A )<../ 0RST 	T
 '"1a&'Q|_)=CRoT7&8?+J
 
** 8%?Fgll..s3T:
 " A%NNPQTV /1(s#?-H 19/9J K::= ?W g ""+L8I%m_A78 8 J #4n#.%#&\\%%c*0b5568 =;<$> 2 !
2#
 c):)<= $$S)/RC''"2D99GSWW\28b9??AJ
 $,2JIJK/32659#+/L.2jnnV48II$..28b%"44 
789:< (^^K8CG
%66@ OJ J  LL!FSQ((37C >
 
J EE"76A $!V+O  *~~i8>B$.NN?$C	 $DJ,>,>,@#, #@x HG !G   #LL EsCQ$003?$m >
 
x %==B4q7C!?  
 #LL EsCQ$003?$E >
 
L (,Dz+4(#v- $'88 L)~~o>)K # &$.NN;$?$E2E(2(GI %*e1D1D1F'0 'FeY OZ %Z !$ !'$I$'!. !) 4 4Xs C (y >
 
@ 37u+/6?3!(,=!=J
 EjnnW5L77)9LMN  LL!FSQ((37S >
 
Z $..6<"NN8,4"$w-*>*>*@..
 >?B <!*.."9 #A'6wi%@BB 
 A3M ,,Xs; E >
 
N !%I'+G}$wwvH)ooc2O* 1?K
 ?D1 >#''
3v=   (,H37! hP[-O<OJ5gxH GLL,,S17R8
 #hhv.{D1'OOI6/I"-//'":K."*24( V %)S!$++C0%&)85 I >
 
\ |'52!xj$99;;=#H G=.228<H " ,&11Z?&11Z?&//8;&11W<&11Q6 '+  >A*3==9dA}#$03-5698 x38K"
 5$5/0  '+#*.'##' 125x .83G*5[3&2./  '+#*.'##' BCFP &::-.0I ,Y 7 +2sG<K 4= 69a!+At!4  eeDk9N 602K&%))'28b))J/%))#g,7.0&&%7 %		& 1'2(4 5 '  %40D(E#F%  'NN:6<"AA#FL"#2"C*;W$NL $[[ 	)3!C'++H5 =55!56=:<%> > &4 3
+ 9*..s2w;??
K9,00R8$: :	5 	)3 	3
 "U"34)*5||''1"4.)42G88$78GC1ZHD07D,--1GLL*LLN#'(;#< 'KKKS+!67<>
 #377+?#@A I&/-I8H4H +9	J K/#
G M  )immrd!C5M.J  )
%bFJJsO,Ar  %6J $z"2"9"9"; Z AE  :>I
 ) %KOOL9:c,>OO""-//,"?!B C<< 
 LL=sCI((37U >
 
\ '$3)#&d2'$&4q.!@"'t"3 (($ 3 7 72$au F L"I 
 -Y7D/33DJBCF S[1_N 2*9*=*=h*G +E#$55)=#>+EBD %(GGJ$7 %E'6':':3r7B'G%(S_%E (9'<'<R'D/8+13B/= C
L2B$ &2"KK L #Y
!1!7R < <[" M
 %1E+%.K  / ,//448)4)F&+/+E+& #.7GU]]_ SSXRY Z' '  BCM$$Xs3I >
 
P 55(:J,J  BCM$$Xs3[ >
 
j P
 ' &NN<06BXG-0U   2)b#YGFH ')L&&(MM'* '']..w7=2BB&( 3+245 ' ,//9?RJ "Z/ 0
>0J/KL !J. 4J}4M3NO  BCU$$X{;k >
 
r !2 5 5r3i D J J L L1 
1** L
 N '@@Y+-}#2=2$au.4J #"AjD&9 dQUU:.."   35M46O BDL-$'-,0- -$
$(
 
 02I/1I$&J
 )+N)+O.0 !%%c*uuV}+m,2K')--c2F%%fb&:$O//&--d3(nnS1LQUU:5FL"GG/?$? #'8 8 -33tfAgYa4HI W0@%@ (..$q	/CD67:D'8 ! /&NN3/J1553DJ#-'5,?C !(($0CC0H)IJ%/4266s;_N  +T266s;S (+~~l'C %3$6$6s$;$ArIK ! '3x #5"8"8"BFJ !#-b>"2. I 'rN"KK!:;>F &  .11#6,04&'7';';C'@'FB  &)[A%5 #5"8"8"C;? !#-b>"2. I 'rN"KK!:;>F #KK!ABEt #F- f_11!(($0CC0H)IJ%/4266s;ZI  &266s;S } R   !L
 &=[%I"3I( &B++,<=K
-  2C=$$Xs3} >
 
L "22L67: ,7G # &&<"<#&d2'$6 &&<"<#&d2'),?t,K%1%= !5[% H V'(  LL!FSQ((37S >
 
Z  $
 -9*.
z0J68,.ANN:.!"23 -/F/1".|,)+;+!"56 ,(8:LM'W8H(1A&(G$!,/
, 
,   X%5l, #L,(,,X^< -,  !(I|DLE(*<iH $**); ,#(
!3+:+>+>x~2+N	,  *
 )!M)*1k)$)).d):)
 %$) )(  )L,
 ;%j!%/y|#LM  BCM$$Xs3s >
 
~ %!<mLW1A),,!?OOJ/3u:  " 4 ii 13x=A (:!C		!$5s399Q<7H#I(K$FH '5&8&8&B ',)+SS1A4-H"IJ!&\%5		!-s399Q</@*&N--&NrV+  &N-- -F  H  '36&:\">$ '$+A" #=0;#= = (,	,( >>*-388=CC)S&7J (
'3'?m-@-LM!$	  "7?7J  (6I !O'7 #<6AKOOrd!C5M2t%.*A"3+5#"  "#3 $>6AKOOrd!C5M2t$M 
  " $>6AKOOrd!C5M2t$  J-   ,//9 A uu%9:A>@  GGJ' 5&**3r7B7;;JG5(,,R4  "%H&:B?E2"G$++DIIi/?/A~7 - 6'?	$ %.IK	5
 !E+!,,**73"7D1#KK-7'"5%5&.9.:+9	#" #),3KK,G,M2 %,KK$7$=2'.{{9'='C# 18W-gt,!6N39r";J  "  Ig  $B9$6 ' L)--h7 555-.524L GGJ' 5&**3r7B7;;JG5(,,R4L $''B4889IJPbL *L  L #$.L  "ggj17R!L$ "B'9"|4:C(%L,  GGM28b-L. 77<06B/L0 #1L4 &5L6 &7L8 "*9L:  .;LR ,<xSLT )<4(GULV *5WL| $&;8t+;L}L@ !0ALD "2ELF "2GLJ *4%KLN "2OLP "2QLR &SLT  %ULV "+WLFd L" ,
": "':E2$au64)2.E"3/5"J  2 1 -11(; 9uu129681  
+ 9*..s2w;??
K9,00R81  (++CGR8<<=MN 1  ".1  "1  $1  #%1   "4"|4:C"!1 & !$ 6 <"'1 (  #ww|4:)1 *  '+1 ,  *-1 . &./1 0 $211 2 #%31 4 -251 6 "'71 >  *?1 H #'I1 J %/K1 L &6M1 N ;E%6"O1 T &6U1 \  *]1 ^ $'_1 ` &/a1 J  -]GEF6 }# % $!## %/D4D2$$%-!1 %))9$:'D* /03
 &3C5:AE519 3C5:A	MN Q	^
 PO EIJN=B35	v*.v4Av$'v47vDGv %(v 7;v .1	v v v v v v v vp8 8J J '-SEN!:>
 $)     #&
+ 9*..s2w;??
K9,00R8#K
 "%#**73"55>Y[""FJ".zl ;I"'7
|4%HH #3K#@L ' 0 0 ;I '--/ * 1 9 9A = *9d ; ).A B+!,'
KL$'
O*51=3Y/
   6v >I)se?,CCH"%m4H#3J	#JL"<<++H5D&tT2x7H ( 7 7! ; #DHH-C$D %*')!++057!3 $)< = M"1Y+9#;4 5A0115X.
 M< CM;";D!7896#CK &x08J3<8J?H8JI '& & 6@&NN3/6127$3GMr$B	"-%<*3 +D-01B-C/61907.:$.'+'0 ,:*=(7%#, 
 2?%y'92;.	;& $K$7Y9O$({6/B+6x+@B !,J 7I (3 	3
S8H%5k9%M;D"E9R2y=9"E6: " (,N/N3MN'($Hf. %.&)$\\--5F.GHNB S-413'5 "&dhhw&7!8&*488L+A+GR&H- .' +42--42a  !G| wqzM 42-- .
 @B-F=)  LLN |<L   #e:.E4I$*"1"5"5h"? #=55!56#=:<%,\\%5%5e%<'551M4 &*"/"*+GLL'
 LLN# !    '.O&+O48N7;$59O26L&.:/B,.EO%,  %0L4L&0'6&7 8<<A7 C//;n =V%V'" !" />O.2O-1N"]|/G.7O.:O-=N!Mh.B 2 /5O.6O 4 8 8R H !9#8 + #]+3<<+<L#/&0%4'" !"
 /8O>J ,c8U +
 ;$'GGJ$7 %E'6':':3r7B'G%(S_%E (9'<'<R'D %4$7$7B$D%(S)9%:%A>@ "1!4!4\!B!Hb!$Xr!2 %%4%8%8%F%L"%(SR%8!"#?;O^2 '/9'/.668(B?BS T%%4$5 6,,  ''1o6Q);)=%o~&68&&0%o~&24&)3%o~&8:&)3%o~&8: 8& $2$au6,0.E"3/5G  "1O!CJ 7"1"5"5h"? #=55!56#=:<GGJ/ =.223r7B?CCJO=044R< ,//B< S!12968(/)9  * .jnnZ.H.NBO/1 2<-",
 3=.7F!3!.9!I> (3 &.1J1LL " #G  $H#H&& & 6@^27$3GMr$B	"0%9*3 +Bs #
 3 !A#2#6#6s2w#C!$Z!A $5#8#8R#@	8B
 071907.:$.'+'0 ,:*=(7+#. 
 9C%|G'<g9G5	8X+:Xuoy#
30>"2&5'6%-!)	,(G[ "';E!3"*$%"+y (6'Hj."J$ #-K #'F&*f4 &*F(< (7:N'N %4)-&+*3y/B4Cy4PL)-/4%)IAv(  +1~H %?$.2<.!.", (6%M #
 %0
$;	+6$SENJZ#=M "& *: -y*:@I&J	"r:~	&J ;? ,01,(&6 ,7$SENFCc9I %5:M2 "&3G !)] (^F-C
* !)Z (V' ,0'+*.x.:>0D=,(&@ "&\F #7FJJz$:$@b A#CK !,(HQK7 
 $'w<'2,/5)=(2)4)F9% '9Hy)+6'=IF9-k: . #9-.@A+7AEF9-o>  "8",'60@0L ,6~" " !G+# - +
 ;*-e*
 #l2# ,.? +s7| #g-)O"i/# 24I .*-o*>
 #n4# 35J .*-o*>
 #f_  . '$0E(2D$2!"
 !0 6 65G,8/4XJ-?7F7J7J(0B88	8" !# #i/# 2 ? 0*-l*;	  #&66# 57G 7*-.A*B y"B ;    &:#5"+y': ,',&NFF  +1~H (3 Z#5E!21!5/2/2%@(.%2:%>#+&
 #5VV"D'+#'&*8n6:,;!($Hf$ "&\F0
1CDH,8NF=)-5F>*  )?'OOJ73u:  !  (3 c:3C!21!5/2/2%@(.%2:%>#.q>&
 (,6:,;($Hf "&\F   &:#5"+y': ,',&NFF 'q>D#. Y/%z*JC5
9K,K$LE5 $/ [16%|,jcU,;O.O&*1g~f/E%F	$HLE5
  4%T%[U'.||'7'7"e#67(9-5-G-G'5 H "DA!CA 8A;!CAGLLC5(;!<= LLN%h/F39S=&Y/%cU+6 & 17#U,#T%[1 %Hf #)!)'!219h1M%(Z'*5z*F:&  '"uH%55X1135  *se8,<<H })?'OOJ73u: !,J 7I'2 c:3C%5fi%H6: '4*; " (,3($Hf6 )<(GWR
!-!9I~ # *VF:&
v 67|D!(2191E-!-0 :& "#,#2" c&+//<G(*  "),^< P *|+LM :&
 ;%zz*5H7A3wE!::m4:??IORC (z1C0DEF "::n5 $*GJ< 8"G>&< !)z* 6""'(9&D	 :& J377AB5?1UE 9 $*GJ<|E7-X (z*\%HXY :& # %0 B!)
:,6IJ2:2F.#B :& #.+/+@F<(,7F=)":IF67', @A8DF45#-=F>* #6* "-gsNK23'1,B/C )//4NNa aP >
 
hP !N	59 
 #*  37C@/3 *#(d'.+3c'OOH5;7= ,= H NNHILN   $/L(
 (3 %0OOrd!C5M$B8< !)(D9')H'9$03 (-? @ FB1H-0 (_ = C.E	( '!0!5TC#@ #d8n'17#.| #0"8%2.<9+9.8.82H,41:3/1%$C*  ||I.8<<3G$.Xf5E1F$F	!j1 !;2?2C2C(234 3:79!; !; 9E:y #KK W #Y]]:%>@ "/)8e)D*."0 ,I(+d8n/97+5l*3G*<y6D)2>
 */6@6@:P4<9B39N79-&,""00  (||I6 %E!;F  ||I.8<<3G$.Xf5E1F$F	!j1 +11#6A.?!@!PLR "j1 +11#6D.?!@!FBH )//4$*S!  C9 &gsNC*+ !  "))*GH$dD)dhhv.>.J,%(#\r.. >@ ECD&F
 '14D&D "&*@!AJ#'# /-#S..1$((62B.C $.#9 !$J?CF //$0L  &--c2',$HHZ(V"--;"--;"++x7"--8"--2 UW   $
%*:6*B,&11Z?&11Z?&//8;&11W<&226JJ "*"7"7"<"<">?"     " 'z';';<'+ ' $4/ 2K4F4F4H 2%,,.2'224$//12  &6 'v.,33C8=>AC !MY >
 
VY NI 1;(-)!)H#-* &		"4V5E5E"F! kY >
 
~Y '+ 3i!8 3$LL22'4# '+ 3j!9 3$LL22'4# &* 3j!9 3$LL22&4" ':*=*< 'v.&!+'1,,33C8`/C !}Z >
 
D[ #a'N#q(ONNI_o? 1;(-)!)H#-* &		"4V5E5E"F! _[ >
 
f[   NNPQTV
 $q(ONN"#&J #

~T%::J##D4#@KK	:.   ,A+O(L. !!Ehll9.EFM %V,H 9AFJJ}-34b 6:MLL8*vzz*5;<BBDJJL *uAhZt-D D-).. )002 !)44688A	8<!  L!%  &5%P%Pj9L"<)6#3 &Q &" +HH"$L  $

 $3#N#N *'=&6x&E $O $L'6'F'F$(&$
  2  $ '6'F'F*(,$ 24$>@%-+%^00?'~222?C	= <" 2!)R 4 4] C Ir#ZZ
3$ ,	
 066&>->>IIj1 1  ,#, '3$(5%%4" *.o)>-)P&
 "'R,,]; =,VV<  $7u#= #;;#djjl+ '   	
 !*  Z "<B '(@%2  **:C@ -FH#&B';';G'D'J#K%()/R44\BHb&J,/$&;U1D -E&*=&9 $X
  **:C@ -FH#+#<#<%-%@%@/)Ct Tuv dwx ky@ 01EAB +,ACD /0BEN #!::&9: 

>2@DST ),UV #DJJ*,2JJz,B*0**X*>,2JJz,B 08- (0FJJ~4N %3F>4J#K(*- !)6::j+A+GR*L*L$,+"-oZ #*m !1+8 /<F63. (0~2&:&::&F 158@B7K7K(98;$< MO/63Z (0~2&:&::&F! 158@B7K7K(98; 5=N3G3G(547 7?n"5I5I,466 6<9;SS_4<N3G3G,446 4<9;SS]5=^4H4H,456 5<9;SS^3;>r2F2F,436 3<9;SS\	/&$'  MO[63\ *2R(<(<V(D08B/C/C$103*2.b)=)=g)F08B/C/C$1032:.b1E1E$325i63 6 l 02[oj $0	 !0)5g)>4@4N6H2  
 %'mo\ #0) !.7J$)8+=I8E<K6H0 (0M %1-#@HJ0& '3	 %4-9'-B(4\(B6" $# 9;'0  ( 68]o` &+cr%W| !$&}J $5$5
 ,< ,0::n+ECQEd ). % F5,2HHZ(V"--;"--;"++x7"--8"--2 UW  $"FKK>?BEHHehhX ##"'(("())+1U?J !3F4D4D!EF#(88%(_"%
 AIDKK?VZZ
+T&**\2J-KSi >
 
] #~k  	X$%';CR'@	B  	I"#%7%<	> O} 	R 		"
 /A !~?%(	*
 )1/1B CW #L0Aom_A	?@ 	@  ' _!5 66Kyy!,-._-1vr: ;;;D+\}oQ@A 	A  	H"#TYY/A"1/E%F,-1Fr	;  	H"#TYY/A"1/E%F,-1Fr	; 
 +!#&6"7!88Uyy)"1-./-.2v; <789 	9 
 )K%&'uyy+BQ/01/014v"= > 	 OO(!)zQ>!)zQ>
 Kq
 %>
Xp  		. ## 		
'5l G\*	.



@ @E
 B&=$
dL z* %#$ %~
6H - LL!6S[[I((3;;?[ >
 
ZL " LL=sGM((3w<@i >
 
fNp--H ) 2CE$$Xs{{;C  >
 
B D % 'J* #'	'X #F8--V 'KjA@C CP"0 "0v    !A3G$$Xs3x8 $**3/gU >
 
\UZ &z2 , ',,F  '!&J'J  2 !  !  ! [_ >=
 
s  AF^32F^8:F^89F^=5 F_AF_%A/F_F_2F_F_F_%F_(F_5#F_1.&F_6/F_;_+F``,F``:5F`b.F`c*F`
fF`fF`!gF`&g8F`+i+F`0l(F`5rA F`:s$Fls>D?Flx=FlyB3Fl|Fl|AFl}Fl}1CFl@6FlAA6FlB>FlCCFlFFlF*FFlMFlMHFlU$(Fa
VAFlW*B
FlY5FaZLFlfFlfE<Fll7FcmAFln)Fln;AFlo=FlpAFlq'C	Flt0Flu&Flu(Fd3u?A
Flw	9Fd9
xIFlA2FlBB:FlE
FlECFlH!FlH3B*FlKFlK/G8FlS'FlS9EFlYFd>Y!A8Fl[Fe[1IFleFf7eS6FlyQ$Fh J7Fg0KB&Fh M*Fg6M=Y6Fh g3Fg;h IFh qJFh {Fh
{&O+Fh KFlK$D Fh PA Fh	QCFh T	AFhUFh U,D"Fh ZA)Fl[8-Fj\%G%FldAFj4e?FlfFlf/AFlg<FlhDFllFll!A3FlnFln&G	Flu0-FkvFlv8'Fkw Fk(w4Flx Fk8xBFlz3YFlTFl_	F__F__F_._-F_.`:FaaFaaFlaFc
	a%AFc	b+Flb1FlcFc
	c
FlcFd0	c9Fd)	dFldFld)Fd0	d0FleFf4	eAFf-	fFlfFlf-Ff4	f4Flf7
Fg-	gFg&	gFlg&Fg-	g-Flg0Fh hFhhFh hFhhFh h 
Fj	h*AFj	i7Fli=FljFj	jFljFj1	j-Flj0Fj1	j1Flj4Fk	kFlkFk	kFlk	Fk	kFlkFk	kFlk	Fk%	k!Flk$Fk%	k%Flk(	Fk5	k1Flk4Fk5	k5Flk8	Fl	lFllFl	lFllFllFllFl	r[  )r   r$   r   r$   r   r$   )r'   r   r   r$   r   r$   )rC   r$   )r   r$   )rc   rZ  rd   r   r   r  )
ru   r$   rv   r$   rw   r$   rx   r$   r   rZ  )rD   r   r   r   )r   r$   r   r   r\  )r   r_  r   r   )r   r$   r   r   )r   r$   rv   r$   rw   r$   r   r$   r   r$   r   r  )r   r$   r   r   r   r   )r   rZ  r   r$   r   r$   r  )r   z
'_Records'r   r$   r   zOptional[set]r   r^  r   r^  r   r$   )r  r   r   r   r   r   )
r#  r$   r   r^  r$  r   r  r$   r   rZ  )r.  rZ  r   r$   r  rZ  r*  z
'set[str]'r+  r   r   r$   )r6  r   r7  r$   r8  r$   r9  r$   r:  r   r$  r   r;  r$   r<  r$   r0  r$   r1  r$   r   r^  )rv   r$   rw   r^  r   r^  rB  rY  rC  rY  r   zIterator[None])rJ  r$   rK  r^  r   r   )r^  r   r   r   )&r   r   rv   r$   rw   r$   r  zList[Dict[str, Any]]r  z	List[Any]rK  zDict[str, Dict[str, Any]]r  Dict[str, bytes]r  r   r(  r  r  zDict[str, str]r<  rZ  r   r   r  r   r  r   rh  r_  r  r   r  r   rc  zOptional[Sequence[int]]r   r  )Ir   
__future__r   rq   loggingr  r7  
contextlibr   r   r   pathlibr   typingr   r	   r
   r   r   r   r   app.core.world_contextr   r>  r   r-  r   r   "app.services.image_service_helpersr   r   	getLoggerr   r?   r   r)   rI   rN   ri   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rC  r   r   r   r   r  r  r  objectr  r%  r/  r=  rF  rM  rR  rb  r  r   r   r   <module>r     s}    #     % '  G G G ; E

 
		8	$>"J2C C26C	CL#&47BE#&47BE2. K # +,8v	AF(
5p--03-AD--"%- 
-`%)	B0 @D'+-1JBJB!JB/<JB$JB +JB 		JBZ	! 	!C| C	)< 	)E E , 2   , 8
  A A#0 A;? A A  AFFF	F 
F
 "F F 	FJ 99 9 	9
 9 9 9 9 9 9 9 9x *** 	*
 * * * *Z0"D ( .2'Q\Q\ Q\ 	Q\
 !Q\ Q\ -Q\ $Q\ Q\ *Q\ +Q\  Q\ Q\ Q\ Q\  -!Q\" #Q\$ %Q\& +'Q\( 	)Q\ Q\r   