
    dNja                        d Z ddlZddlZddlZddlZddlZddlmZ ej                  j                  d e ee      j                               ddlZddlZej$                  dz  Zej(                  dz  ZdZej$                  dz  dz  Zej$                  dz  d	z  Zd
j3                  g d      Zd
j3                  g d      Zej8                  Zd Zd Zd Zd Z d
j3                  g d      Z!d Z"d
j3                  dddddddeg      Z#ddddddd did!dd"ddd#dd did$g d$d%Z$d& Z%d
j3                  d'd(d)d*d+d,d-d.d/d0eg      Z&d1 Z'd2 Z(d
j3                  g d3      Z)d
j3                  g d4      Z*d5 Z+d6 Z,d
j3                  g d7      Z-dddd8d9gd:ddddd8d9gd:d d;id did<g d<d%d!d=d>d?gd%Z.d@dAgZ/dB Z0dCZ1dD Z2dE Z3dF Z4dG Z5g dHZ6e7dIk(  rw ejp                         Z9e9ju                  dJdKe6dKgz   L       e9jw                         Z<ej{                  dMdMN       e6D ]%  Z>e<j~                  e>dKfv s  e@       dOe>            ' yy)Pu+  s30 — 맵 기반 샷 적용 체인 (2026-07-09, 실험 전용·커밋 금지).

top2 최종 자산(경찰서 FP 스타일 맵 + VLM 선택·결함 수정 실사)을 구 실험
프로젝트의 옥탑 실외 샷 라인에 적용하는 체인:
  [1] select  — 실외 8샷 라인에서 옥탑방 외부/주변 관련 샷 LLM 선택
  [2] concept — 샷별 "배경을 어찌 그리면 좋을지" LLM 구상
  [3] ground  — 맵 이미지+마커 스펙+구상을 주고 "지도의 어디 주변에서
                어찌 찍을지" grounding (마커 인용 카메라 배치)
  [4] bg      — 샷별 새 배경 플레이트 생성: 최초 bg(룩 SOT)+맵(배치 SOT)
                참조 + "지도의 어느 지점인지" 명시 프롬프트, i2/nb2 비교
  [5] pick    — GPT/Gemini VLM 0-10 합산으로 플레이트 선택(동점=Gemini,
                s29 판정 지식 재사용)
  [6] compose — 선택 플레이트+캐릭터 passport 로 샷 스틸 합성(nb2)
판정 지식: nb2 프롬프트 ID-free(마커 코드→서술명 치환)·참조 관할 라벨
분리(맵=배치/실사=룩)·발명 경계(무근거 날씨·재질 금지)+철제 계단 정정.
사용: backend/.venv/bin/python s30_shot_apply.py [--only <stage>|all]
산출: out/shot_apply/*.png + plans/s30_shot_apply_v1.json + shot_apply.html
    N)Path
shot_applyzshot_apply.htmls30_shot_apply_v1top2ztop2_map_gpt.pngztop2_photo_fixed_nb2.png
)uA   WORLD FACTS (creator-confirmed / evidence-bound — always true):z?- The main building is an aged three-storey multi-family villa;zB  its roof deck sits roughly 8-10 m above the yard, with the smallz3  rooftop-room unit as an extra volume on the deck.zC- The exterior stair is a later-added STEEL retrofit stair climbingzB  the full three storeys: open treads, thin steel plate stringers,z;  support posts, pipe railings. It is NOT a concrete stair.)zCINVENTION BOUNDARY: state world facts (weather, atmosphere, surfacezCwetness, materials, light-source colour, numeric distances, time ofzAday) ONLY when the shot text or its corrections state them; whereuD   they are silent, stay silent too — do not invent moods or weather.c                     t        j                  d      d   } t        j                         d   }t        j                  d      d   }i }| j                         D ]o  \  }}|j	                  |      xs i }i ||j	                  d      |j	                  d      xs g |j	                  |      xs i j	                  d      xs g d||<   q |S )uD   collect(실외 8샷 라인) + recon staging + s24 정정 팩 조인.outdoor_shots_collectshotsspatial_repair_v1staging
charactersstaging_corrections)r   r   corrections)F	load_plan
load_reconitemsget)collectreconrepairr
   skcrs          R/Users/manta/Documents/Projects/TheRoad-I1/scratchpad/forest_exp/s30_shot_apply.py_load_shotsr   <   s    kk127;GLLN7#E[[,-g6FEAIIbMR7q 7QUU9%5#$55#6#<"%+ZZ^%9r$>$>.%0 %6357b	 ! L    c           
         d|  d|j                  d       d|j                  d       g}|j                  d      r&|j                  ddj                  |d         z          |j                  d	      xs i }d
D ]-  }|j                  |      s|j                  | d||           / |j                  d      r,|j                  dt        j                  |d   d      z          |j                  d      r,|j                  dt        j                  |d   d      z          |j                  d      xs g }|r<|j                  d       |D ]&  }|j                  d|d    d|d    d|d    d       ( dj                  |      S )uP   LLM 입력용 샷 블록 — 원문 전체 + 정정 override (자르기 금지).[z] scene_heading=scene_headingzdescription: descriptionr   zcharacters: , r   )framing_scalecamera_directionperspectivelighting_mood: key_bg_elementszkey_bg_elements: Fensure_asciiframe_spatial_contractzframe_spatial_contract: r   u^   STAGING CORRECTIONS (override — each replaces the quoted expression above; corrections win):z- "before_quotez" -> after_enz (field_en)r   )r   appendjoinjsondumps)r   slinesstkcorrr   s          r   
_shot_textr9   K   s   $QUU?%;$<=QUU=1235Euu\^dii,&@@A	
y		RB66!9LLA3bA) 
vv (zz"%6"7eLM 	N	vv&'/zz"%=">/466 	7 55%2D C 	DALL3q01q}oa
m_A/ 0  99Ur   c                 B    | d   }dj                  d |d   D              S )Ndetailr   c              3   D   K   | ]  }d |d    d|d    d|d      yw)z- (codez) name_en    — placement_enN ).0its     r   	<genexpr>z%_legend_with_codes.<locals>.<genexpr>i   s9      +) 2f:,bIuR=O<PQ)s    r   )r1   )specds     r   _legend_with_codesrG   g   s-    XA99 + z+ + +r   c                 @    | d   d   D ci c]  }|d   |
 c}S c c}w )Nr;   r   r=   rA   )rE   rC   s     r   _code_to_itemrI   m   s-    %)(^G%<=%<rBvJN%<===s   )zCYou are a film production planner. You are given several shots fromzAone production. Select the shots whose BACKGROUND is the exteriorz@or the immediate surroundings of the rooftop-room property (roofzCdeck, exterior stair, yard, gate, alley, views of the building fromzAoutside). Exclude shots whose background is an interior seen fromz@inside. For every shot return include=true/false with a one-linezKorean reason.c            
         t               t        j                               } ddddddd| dddiddid	g d	d
didgd
}ddj                  fd| D              z   }t	        j
                  dt        ||      }|d   D cg c]  }|d   s	|d    }}t	        j                  t        ||d       t        dt        |       dt        |        d|        y c c}w )NobjectFr
   arraystringtypeenumrO   boolean)shot_keyinclude	reason_korO   additionalProperties
propertiesrequiredrO   r   zSHOTS:



c              3   <   K   | ]  }t        ||           y wN)r9   )rB   r7   r
   s     r   rD   zstage_select.<locals>.<genexpr>   s     %Lt!jE!H&=ts   
s30_selectrS   rR   )selectselected_shotsz	[select] /u	    선택: )r   sortedkeysr1   r   llmSELECT_SYSTEM	save_planPLANprintlen)rb   schemauserresxpickedr
   s         @r   stage_selectrn   ~   s    ME%**,D% %)14 @ &	2"((!3
 A!
  IF  &++%Lt%LLLD
%%mT6
:C%(\B\Qy\a
m\FBKK?@	Ic&k]!CI;ix
@A Cs   
CCzDYou are the production designer and cinematographer of a live-actionz@film, planning the BACKGROUND PLATE (no people) behind one shot.zDGiven the shot content below, describe how that background should bezDdrawn: what the camera is, what physical elements fill the frame andz)where, and the time-of-day / light state.z=Ground every world fact in the shot text and its corrections;z1corrections always win over the original wording.rK   FrM   z*how to draw this background, 2-4 sentencesrO   r!   rL   rO   rY   zBcamera height/angle/direction and framing for the background plateub   time of day and light, ONLY as grounded by the shot text; if silent, say 'unspecified — neutral')bg_concept_enkey_elements_en	camera_entime_light_ennotes_korU   c            
      n   t               } t        j                  t              }i }|d   D ]i  }dj	                  t
        dt        || |         z   g      }t        j                  d| t        |t              ||<   t        d| d||   d   d d         k ||d	<   t        j                  t        |       y )
Nr_   rZ   SHOT:
s30_concept_z
[concept] r'   rr   P   concept)r   r   r   rf   r1   WORLD_FACTSr9   rc   CONCEPT_SYSTEMCONCEPT_SCHEMArg   re   )r
   planoutr   rj   s        r   stage_conceptr      s    ME;;tD
C#${{KZE"I5N)NOP%%,rd+^T&(B
2$bR!5cr!: ;<=	 %
 DOKKdr   zAYou are the location scout of a live-action film. Attached is thezDSITE PLAN of the single filming property (with circled markers whosezClegend is given as text), plus one shot and its background concept.zDDecide WHERE on this site plan the shot takes place and how to shootzCit there: pick the zone, cite the marker codes the camera stands atzCor looks toward, and describe the camera position and view strictlyz in terms of the mapped elements.zAEvery spatial claim must be consistent with the site plan and thez@marker legend. If the shot looks outward past the property edge,z>say what lies beyond the frame edge on the plan side it faces.c           	          | d   d   D cg c]  }|d   	 }}| d   d   }ddd|dd	d|dd
ddddddidddddidg ddS c c}w )Nr;   r   r=   zone_labels_enrK   FrM   rN   rL   z4markers the camera stands at / looks toward / frames)rO   r   r!   z6where the camera stands, described via mapped elementsro   rO   z8what of the mapped property fills the frame, near to far)map_zoneanchor_markerscamera_position_enlook_direction_enin_frame_enrationale_korU   rA   )rE   rC   codeszoness       r   _ground_schemar      s    "&x."9:"9BRZ"9E:N+,E%!)59'.195(I/=> ,43D#E #)(!3$,,<= $X.
I#  ;s   Ac                  H   t        j                  t        j                        } t	               }t        j                  t
              }t        |       }i }|d   D ]  }dddt        j                  t              ddt        |       z   dddt        |||         z   dddt        j                  |d   |   d	
      z   dg}t        j                  d| t        ||      ||<   t        d| d||   d    d||   d            ||d<   t        j                   t
        |       y )Nr_   textz"SITE PLAN of the filming property:rO   r   zMARKER LEGEND:
rv   zBACKGROUND CONCEPT:
ry   Fr)   s30_ground_z	[ground] z: zone=r   z	 markers=r   ground)r   r   S27SPECr   rf   r   png_data_urlMAP_PNGrG   r9   r2   r3   rc   GROUND_SYSTEMrg   re   )rE   r
   r}   ri   r~   r   partss          r   stage_groundr      s,   ;;sxx DME;;tDD!F
C#$%IJNN7#%7!$'&( )YBb	1J%JK%<zz$y/"-EB&C D
 %%+bT*M5&IB	"WSWZ%8$9#b'"2346 	7 % DNKKdr   )zALOOK REFERENCE: the attached PHOTOGRAPH shows this same property.uE   Match its look exactly — the building, its materials and aging, thez@roof-deck contents, colours, and the surrounding town. It is thez0single source of truth for how everything LOOKS.)zBSITE PLAN REFERENCE: the attached flat drawing is the site plan ofz@this same property. Use it ONLY as the source of truth for WHEREzCthings are (spatial arrangement, adjacency, routes). NEVER draw theuF   plan itself — none of its flat colours, circles, codes or labels mayzappear in the output.c                 r   t        |       |d   |   }|d   |   }dj                  fd|d   D              }dj                  dd|d	   z   d
z   |d   z   dz   |d   z   d|d   z   dz   |z   d|d   z   d|d   z   dz   dj                  |d         z   dz   d|d   z   dz   t        t        t        t
        g
      S )Nr   ry   r   c              3   N   K   | ]  }|v rd |   d    d|   d      yw)z- r>   r'   r@   NrA   )rB   r   c2is     r   rD   z_bg_prompt.<locals>.<genexpr>  s@      2$AS SVIr#a&"8!9:$s   "%r   rZ   zmCreate ONE photorealistic BACKGROUND PLATE for a live-action film still. No people, no animals, an empty set.zCAMERA: r   z
 Looking: r    rr   z'MAP POINT: this plate is taken in the "r   zU" area of the property on the attached site plan, anchored to these mapped elements:
zIN FRAME (near to far): r   zBACKGROUND INTENT: rp   z Key elements: z; rq   .zTIME & LIGHT: rs   z< Do not add weather, atmosphere or colour moods beyond this.)rI   r1   rz   	LOOK_NOTEMAP_NOTENO_ANNOTATION)rE   r   r}   gconanchorsr   s         @r   
_bg_promptr     s#   

CXrA
y/"
Cii 2#$2 2G ;;	7Q+,,|;

 	!#&	'),[)9	:2Qz]B$	$&-	. 	#Q}%55O 44
	"ii,=(>?	@BE	F3// 33 	3!  r   c            
      (   t        j                  t        j                        } t        j                  t              }|j                  di       }|d   D ]  }t        | ||      }|d| dd| dd||<   t        j                  d| d|t        t        gd	t        ||   d
   z         t        j                  d| d|dt        fdt        fgdt        ||   d   z         t        d| d        ||d<   t        j                  t        |       y )Nbgr_   bg_z_i2.pngz_nb2.png)prompti2nb2s30_bg__i2	1536x1024r   )refssizeout_path_nb2u]   LOOK REFERENCE — real photograph of the same property; sole source of how everything looks.uI   SITE PLAN — layout source only; never draw this drawing or its markers.16:9r   aspect_ratior   z[bg] u   : i2+nb2 완료)r   r   r   r   rf   r   r   img_gpt	PHOTO_PNGr   OUTDimg_nb2rg   re   )rE   r}   r   r   ps        r   stage_bgr   5  s%   ;;sxx D;;tD	$	B#$tR&bT)Ct82DF2 	
		GB4s#Qi-A"TBrF4L-@	B			GB4t$a<=FH/079:  &r"ve}0D	F 	bT)* % DJKKdr   )zCYou are given ONE image-generation prompt and TWO candidate images,z@labelled A and B in the order attached, both generated from thatzexact prompt.z@Pick the ONE candidate that most faithfully realises the prompt:zBits camera (height, angle, direction, framing), its stated spatialz@arrangement and anchored elements, materials and state, time andz;light, and its exclusions (no people, no text, no map-stylez+graphics). Ignore generic aesthetic appeal.zAAlso give each candidate an integer score 0-10 for that fidelity.z@Output: winner, and per candidate a score plus a one-line Koreanz*verdict citing the decisive prompt points.ABrN   integer)labelscore
verdict_ko)winnerverdictsr   r   )r   r   )r   r   c                     t        j                  t              } i }| d   D ]  }| d   |   }dd|d   z   dg}t        D ]K  \  }|j	                  dd dd       |j	                  t        j
                  t        ||   z               M i d	d
| dfdd
| dffD ]*  \  }}t        j                  |t        |t        |      |<   , t        D 	ci c]  \  }	t        fddD               }
}}	t        |
j                               }|
j                         D cg c]  \  }}||k(  s| }}}t        |      dk(  r|d   nd   d   |v rd   d   n|d   }t        t              |   }|
||| d   |   |   d||<   t!        d| d|
 d| d| d	        || d<   t        j"                  t        |        y c c}	}w c c}}w )Nr_   r   r   z7THE PROMPT (both candidates were generated from this):
r   r   z
Candidate :gpt	s30_pick__gpt
gemini-pro_gemini)modelc              3   R   K   | ]  }t        fd |   d   D                 yw)c              3   8   K   | ]  }|d    k(  r|d     yw)r   r   NrA   )rB   vlabs     r   rD   z'stage_pick.<locals>.<genexpr>.<genexpr>  s)      '%9gJ#% 7%9s   r   N)next)rB   mjudger   s     r   rD   zstage_pick.<locals>.<genexpr>  s5      , +  'U1Xj%9 ' '*s   $')r   r      r   r   )r   totalsselectedenginefilez[pick] z	: totals=z -> (r/   pick)r   r   rf   CANDr0   r   r   rc   PICK_SYSTEMPICK_SCHEMAsummaxvaluesr   rh   dictrg   re   )r}   r   r   br   engr   tagr   _r   bestttiedselr   s           `      @r   
stage_pickr   r  s*   ;;tDD#$JrN &()(45 6 HCLL&Jse12EFGLLqv67  !Yrd$#78(IbT*ABDJE355k5+',.E%LD ;?@ ;?Q s , +, , , ;? 	 @ 6==?#"(,,.>.QAI.>d)q.tAw\"8,4 ,'1:>q' 	 4jo"f #s JrN3/1R 	t9VHDQse1=>5 %6 DLKKd@
 ?s    G'G5Guz   SETTING PLATE — the exact background of this still; keep its camera, layout, lighting and every visible element exactly.c                    |d   |    }|j                  d      xs i }|j                  d      xs g }dd|j                  d      xs dz   g}|r'|j                  dd	j                  |      z   d
z          n|j                  d       |j                  d      r)|j                  dt        |d         z   dz   |d   z          |j                  d       |j                  t               dj                  |      S )Nr   r   r   u   Create the final live-action film still by staging the moment below inside the attached SETTING PLATE. The plate is the camera and the set — do not change its viewpoint, layout, lighting or any visible element; only add what the moment requires.z MOMENT (authoritative, Korean): r!    u8   CHARACTERS: only the listed reference people appear — r"   zr. Match each reference person's identity exactly (face, hair, build); dress and pose them as the moment describes.z2No people appear unless the moment itself says so.r#   z	FRAMING: z shot; r   z2Photorealistic cinematic still, one single moment.rZ   )r   r0   r1   strr   )r   r4   r}   r   r6   charsr5   s          r   _compose_promptr     s    XrA	
y		RBEE,%2E	
 	+aeeM.B.HbIE Fii	 	IJ	vvo[3r/':#;;iG,-. 	/	LLEF	LL;;ur   c            	         t               } t        j                  t              }t        j                         }t        j
                         d   }i }|d   D ]  }| |   }t        |d   |   d   z  }t        |fg}g g }
}	|j                  d      xs g D ]c  }|j                  |      }|r=|j                  |      r,|j                  d| d||   f       |	j                  |       S|
j                  |       e t        |||      }d| d	}|||	|
|d   |   d
   d||<   t        j                  d| ||dt        |z         t        d| d|	 d|
         ||d<   t        j                  t        |       y )Ncharacter_name_to_sidr_   r   r   r   u   CHARACTER REFERENCE — z*: the exact person to place in the moment.still_.pngr   )r   r   
chars_usedchars_missing_passport	bg_engine
s30_still_r   r   z
[compose] z: chars=z	 missing=compose)r   r   r   rf   query_passportsr   r   BG_LABELr   r0   r   r   rg   re   )r
   r}   	passportsname_to_sidcompr   r4   bg_pathr   usedmissingnamesidr   fns                  r   stage_composer     s   ME;;tD!!#I,,.!89KD#$"Ifb)&117#$BgEE,'-2-D//$'Cy}}S)7v >? ?&s^- . D!t$ . B4(bT4.5!%fb!1(!;=R 	
		Jrd#Q6"9	&
2$htfIgY?@+ %, DOKKdr   c                 N   t         dz  }|j                  dd       i }|d   D ]~  }| |   j                  d      xs g }|st        j                  |d   d   z  }|j                         sH|| dz  }|j                         st        j                  ||       d	| d||<    |S )
NbaselineTparentsexist_okr_   imagesr   srcr   z	baseline/)r   mkdirr   r   ROOTexistsshutilcopyfile)r
   r}   baser~   r   imgsr  dsts           r   _copy_baseliner    s    *DJJtdJ+
C#$Ry}}X&,"fftAwu~%::<B4t$C::<S)!"T*CG % Jr   c                     t               } t        j                  t              }t	        | |      }d dPfd	}dj                  fd|j                  di       j                  dg       D              }d}|d   D ]  }| |   }|j                  d      xs i j                  |      xs i }|j                  d	      xs i j                  |      xs i }	|j                  d
      xs i j                  |      xs i }
|j                  d      xs i j                  |      xs i }|j                  d      xs i j                  |      xs i }d}|j                  d      xs i j                         D ]0  \  }}|d   D ]#  }|d| d|d    d|d    d |d          d	z  }% 2 d}||v r| |d||    d      z  }t        D ]]  \  }}|
j                  |      s| |d|
|    d| d| d|j                  d      |k(  rdndz   |j                  d      |k(        z  }_ |j                  d      r%| |d|d    d|j                  d       d      z  }|dj                  g d  |       d! |j                  d"             d# |j                  d$             d% |j                  d&d             d' |j                  d(d             d) |j                  d*d             d+ |	j                  d,d-             d. d/j                  |	j                  d0g                    d1 |	j                  d2d             d3 |	j                  d4d             d5 |	j                  d6d             d7 |	j                  d8d             d9| d:| d; |
j                  d<d             d= |j                  d>g              d? |j                  d@g              dA |j                  d<d             dB      z  } dC |dDdEdF       dG |dHdIdF       dJ| dK| dL	}t        j                  |dMN       t        dOt                y )QNc                 >    t        j                  t        |             S r\   )_htmlescaper   )r   s    r   esczstage_html.<locals>.esc  s    ||CF##r   c                 @    |rdnd}d| d|  d|  d| d |       dS )	Nz class='sel'r   z<figure style='width:z%'><a href='z'><img src='z' loading='lazy'z></a><figcaption>z</figcaption></figure>rA   )relcapwidthr   clsr  s        r   figzstage_html.<locals>.fig  sH     #n'wl3% @ E!1# 7"3xj(>@ 	Ar   r   c           
   3   \   K   | ]#  }d |d    d|d   rdnd d |d          d % yw)	<tr><td>rR   	</td><td>rS   OXrT   
</td></tr>NrA   )rB   rl   r  s     r   rD   zstage_html.<locals>.<genexpr>  sJ      : 9A 1Z=/!I,3C*H
C+'(
	48s   ),r^   r
   r_   ry   r   r   r   r   r   r   r  r  r   r   r   r!  zout/shot_apply/u   기존 production 스틸u   새 배경 r   r/   r   u
    ★선택)r   r   u   최종 스틸 (nb2 합성, bg=r   z
<h2>r?   r    z	</h2>
<p>r!   u!   </p>
<p><b>②구상</b> camera: rr   z<br>
concept: rp   z<br>
time/light: rs   u$   </p>
<p><b>③grounding</b> zone=<b>r   ?z</b>,
markers=r"   r   z<br>
camera: r   z<br>
look: r   z<br>
in frame: r   z<br>
<i>r   z	</i></p>
uJ   
<table><tr><th>VLM</th><th>후보</th><th>score</th><th>판정</th></tr>
u@   </table>
<details><summary>④배경 프롬프트</summary><pre>r   uA   </pre></details>
<details><summary>⑥합성 프롬프트 (chars=r   u   ,
passport 없음=r   z)</summary>
<pre>z</pre></details>
u  <!doctype html><html lang=ko><head><meta charset=utf-8>
<title>s30 — 맵 기반 샷 적용 체인</title><style>
body{font-family:'Apple SD Gothic Neo',sans-serif;margin:24px;max-width:1500px}
figure{display:inline-block;margin:1%;vertical-align:top}
img{width:100%;border:1px solid #ccc} img.sel{outline:4px solid #2a7ae2}
figcaption{font-size:13px;text-align:center}
pre{font-size:11px;background:#f7f7f7;border:1px solid #ddd;padding:8px;
white-space:pre-wrap;max-height:320px;overflow:auto}
table{border-collapse:collapse;font-size:12px;width:100%}
td,th{border:1px solid #ccc;padding:4px 6px;text-align:left}
h2{border-bottom:2px solid #333;padding-bottom:4px;margin-top:36px}</style>
</head><body>
<h1>s30 — 맵 기반 샷 적용 체인 (2026-07-09)</h1>
<p>자산: top2 맵(배치 SOT)+수정 실사(룩 SOT). 체인=①샷 선택→②배경 구상
→③맵 grounding(마커 인용)→④배경 플레이트 i2/nb2→⑤VLM 선택→⑥passport
합성(nb2). 발명 경계+철제 계단 정정+ID-free(nb2) 적용.</p>
z$out/forest_map/top2/top2_map_gpt.pngu   배치 SOT — top2 맵   r   z,out/forest_map/top2/top2_photo_fixed_nb2.pngu   룩 SOT — 수정 실사ui   
<h2>① 샷 선택 (실외 8샷 라인)</h2>
<table><tr><th>shot</th><th>선택</th><th>이유</th></tr>z	</table>
z
</body></html>zutf-8)encodingz[html] )   F)r   r   r   rf   r  r1   r   r   r   PAGE
write_textrg   )r
   r}   r  r  sel_rowssecsr   r4   r   r   r   pkcmprowsr   jr   figsr   r   docr  s                        @r   
stage_htmlr0    s   ME;;tDeT*H$A ww : (B'++GR8: :H
 D#$"Ixx	"(b--b17RXXh%2**2.4"XXd^!r&&r*0bhhv$"))"-3hhy!'R,,R06BVVG_*113DAqz]HQCy7 =!!"7 -!!$Q|_!5 6jB C # 4
 >C/(2,8:TUUDHCuuSzoafX6)#auA6/1vvj/AS/H|bR "z 2c 9; ;  66&>C/"V*689L8MQOQ QD    WIquu_-./0m !b!9:;<
 cggor*
+	,	-	
 "-./
0  !$AEE*c$: ;<=	 
TYYquu-r23	456	 
QUU',	-./ 155$b)*+, quu]B'(
)* nb!"#$  8 9<AEE(B<O8P7QR1  25RVVL"5M1N0O! P!" RVV4b9:;#"<#$ 
"&&2
 %$!% 	3 %\  +-FK L M35PRTU V W<<D: F )C, 	OOC'O*	GD6
r   )r^   ry   r   r   r   r   html__main__z--onlyall)defaultchoicesTr  stage_)A__doc__argparser1  r  r2   r  syspathlibr   pathinsertr   __file__parent
forest_libr   s27_forest_mapr   OUTr   EXPr&  rf   r   r   r1   rz   INVENTION_BOUNDARYr   r   r9   rG   rI   rd   rn   r{   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r0  STAGES__name__ArgumentParserapadd_argument
parse_argsar  r6   onlyglobalsrA   r   r   <module>rM     s%  $     
  3tH~,,- .  uu|uu  
''F
/
/GGf99	 ii   YY     !!8+> 		  B8 JFJJ/C7	 	 e"**+, %,vx6HI&&:; #+*78 X&.!*
 		GJIJII&GFD 22 II  	 99  60 ii   e#c3Z8 %&.c
C$i0#)8"4
 =
 :&#( 	\"HK:D"Yx 
Jz	 	 	 	"BOOHeVug5EOF
AJJtdJ+66b%[ $GIrdm$&  r   