
    Tj%]                     F   d Z ddlZddlZddlZddlZddlmZ  ee      j                  Z
ej                  j                  d ee
             ddlZddlZddlZddlZddlZej0                  j                  dz  Zedz  Ze
dz  ZdZg dZd	j;                  g d
      Zd	j;                  g d      Zda d Z!d Z"	 ddZ#d Z$d Z%d Z&d Z'd Z(e)dk(  rQ ejT                         Z+e+jY                  ddg d       e+j[                         Z. e%e'e&e(de.j^                             yy)u  s39 — 옥탑 23샷: 콘티 제외·참조 최소화 + 3롤 VLM 선택 (2026-07-13).

사용자 지시(s38 후속): "콘티 제외하고, 각 샷별로 이전 샷과 배경만
경우에 따라서 판단해서 각각 생성. 대신 3장씩 생성해서 VLM 으로
프롬프트를 가장 잘 따른 것을 판단해 선택. 새 갤러리에 모든 이미지와
GPT/Gemini VLM 판정 결과를 보여줘."

- 참조 = 단 한 장: prev2 v3 판정(배경 동일성 유일 기준, s38 재사용)이
  prev 를 주면 이전 샷의 '선택본' 실사 / 아니면 배경 플레이트.
  콘티·캐릭터·소품 참조 전부 제외.
- 샷당 nb2 3롤(A/B/C) → GPT+Gemini VLM 이 프롬프트(+참조 일관성)
  충실도 0-10 판정 → 합산 최고 선택(동점=Gemini 랭킹, s29 계약).
- 선택본({tag}_sel.png)이 후속 샷의 prev 앵커 → 스토리 순서 순차 생성.

사용: backend/.venv/bin/python s39_threeroll_vlm.py --only <stills|html>
    N)Paths39stillszs39_threeroll_vlm.htmls39_threeroll_v1)ABC
)z?PROPS FACE THE RIGHT WAY: every handheld or used object must bezBoriented exactly as its real-world use requires. A person reading,z@watching or operating something (a phone, a photograph, a paper,uF   any device) has its functional side — screen, front, page — facingz>THEIR OWN eyes; the camera then sees whatever side the stagingzBgeometry implies (often its back). Show the functional side to thezBcamera ONLY when the shot text itself stages it toward the viewer.z9Never flip, mirror or reverse an object's front and back.)zAYou are given ONE image-generation prompt, the REFERENCE image(s)z@that were attached to it (labelled), and THREE candidate images,z?labelled A, B, C in the order attached, all generated from thatz)exact prompt with those exact references.z@Pick the ONE candidate that most faithfully realises the prompt.zAJudge ONLY fidelity to the prompt and its reference instructions:z>the shot text's moment and action, who is and is NOT in frame,zAcamera framing, time of day, the LOCATION lock (the place must beu=   the one the reference shows — same architecture, materials,z?fixtures), pose/immobility and carried-state clauses, and everyz?exclusion (no text, no invented people or objects). Consistencyz<with the attached reference image counts as prompt fidelity.z Ignore generic aesthetic appeal.z@Check every candidate point by point before deciding; base everyz verdict only on what is visible.z=Also give every candidate an integer score 0-10 for that samez	fidelity.z@Output: winner, ranking best-to-worst, and per candidate a scorezAplus a one-line Korean verdict citing the decisive prompt points.c                     t         ddl} ddl}ddl}dt        j
                   d}i |j                  ddi}|j                  ddd	d
dddd|g	dd|d      j                  }i a |j                         j                         D ]R  }d|vr|j                  dd      \  }}	 dj                  | j                  |            t         |j                         <   T t         S # t        $ r Y fw xY w)uH   캐릭터 short_id → EN traits 문자열 (entity_canon.stable_traits).Nr   zCSELECT short_id, stable_traits FROM entity_canon WHERE project_id='z' AND entity_type='character'
PGPASSWORDtheroad_dev_2026psqlz-h	localhostz-Utheroadz-dz-tAcT)capture_outputtextenvcheck|   z, )_TRAITS_CACHEjsonos
subprocessF
PROJECT_IDenvironrunstdoutstrip
splitlinessplitjoinloads	Exception)	_jsonr   r   sqlr   outlinesidtraitss	            U/Users/manta/Documents/Projects/TheRoad-I1/scratchpad/forest_exp/s39_threeroll_vlm.py_char_traitsr-   L   s	    %%&\\N 3.. ?>\+=>nnT;iyS*.Ts    	 IIK**,D$**S!,KC-1YYKK'.)ciik* -   s    5C	C)(C)c                    |t         j                  k7  rt        j                  d|  dft        j                  d|  dft        j                  d|  dft         j                  d|  dffD ]  \  }}||z  j	                         s||z  c S  t        d|        |d   D ]%  }| |d   v st         j                  d	|d
    dz  c S  t        d|        )Nbg4_.pngbg3_bg2_bg_u   플레이트 없음: 
int_platescoversplate_keyu   실내 플레이트 미배정: )W	INT_GROUPL8OUTexists
SystemExit)taggkeyp37pfx_dirnamep_s         r,   	_plate_ofrD   h   s    q{{!vvcU$'78!vvcU$'78!vvcU$'78 uuC5o68MGT $&&(~%8 0677,"X,55VBuI;d333   6se<
==    c                 (   t         j                  t        j                  |          }|j                  di       j                  |       xs i }	|j                  | i       }
|	j                  d      xs |
j                  dd      }|	j                  d      xs |
j                  dd      }|	j                  d      xsG |t        j
                  k(  r2|j                  di       j                  | i       j                  dd      nd}t        j                         }t        j                         }i }|j                         D ]1  \  \  }}}|j                  |t                     j                  |       3 |j                  t        j                  |       g       }|s9t        |j                  t        j                  |       d	   t                           }t               }|D cg c]+  }||v r%||   d	   |j                  |      r	d
||    dndz   - }}dt        j                  |       z   dz   dt        j                   |d          d||   d    d|rdndz   g}|r:|j#                  d       |r'|j#                  dt        j                   |      z          |rg nt%        j&                  || g      }|r |j#                  dj)                  |             |j#                  t        j*                         |j#                  t$        j,                         |j#                  t.               |r'|j#                  dt        j                   |      z          |r'|j#                  dt        j                   |      z          |r'|j#                  dt        j                   |      z          |r|j#                  d       n:|r'|j#                  ddj)                  |      z   dz          n|j#                  d       |j#                  d        d!j)                  |      S c c}w )"Npose_fixmovement_enmovement 
figures_enfigures
carried_enint_contr   z ()u   Create ONE FINAL photorealistic live-action film still of the moment below — contemporary South Korea, 2026; all people are Korean unless stated. TIME OF DAY (lock): .z#SHOT TEXT (authoritative, Korean): desczLOCATION (lock): place_enu,    The shot takes place here — the attached z+PREVIOUS SHOT STILL shows this exact place.z)LOCATION PHOTOGRAPH shows the exact spot.u1  THIS SHOT CONTINUES THE PREVIOUS SHOT: everything the attached still established — the place, its fixed features and wear, each person's clothing and state — persists. Any person in it who cannot move stays PRECISELY as photographed (body, pose, contact points, held objects); only the camera changes.ud   PREVIOUS STILL USAGE (follow exactly — what to take from the attached still and what to exclude): r
   zMOVEMENT (follow exactly): u+   FIGURES — size & depth (follow exactly): uU   CARRIED STATE (persist exactly — must match the neighbouring shots of this scene): u   NO PEOPLE IN THIS SHOT: the shot text shows only the place and its state — no living person or any body part appears in frame, unless the shot text itself explicitly says so.zzPEOPLE: the SHOT TEXT alone decides whether any person is visible in this shot. IF a person appears, they must be one of: z; u9   — never anyone else, and never add a person the shot text does not show. IF only part of a person is in frame (a hand, arm, foot, back, silhouette), that body part belongs to the specific person the shot text names — its sex, age, build, skin and grooming must unmistakably match that person's profile above.z5No people appear unless the shot text itself says so.z6No text, captions, watermarks or annotations anywhere.z

)RSHOT_keygetr8   r9   S
_char_refs_ve_idsitems
setdefaultsetupdatesortedr-   _time_of_softenappendr:   _pose_clausesr#   REALIZE_STILLEXPRESSION_REALISMPROP_ORIENTATION)r>   r?   r@   mvgmap	prev_used
prev_usagebg_onlysfixmrI   rL   carriedcharsvescene_unionsi_shiidsve_idsr+   cid
char_namespartspcs                             r,   _build_promptrz   w   s   	qvvc{A
''*b
!
%
%c
*
0bC
sBAww}%>z2)>Hggl#;quuY';Gggl# (1;; 	
B##C,00rB$&  LLNE	
BK88:
TCr35)005 &VVAFF3K$FsA>?^F + CSE\ 	c
1"(**S/Rs}Ar	;  +
	A **S/	  	  .aii&	.B-CD
DJz23 4( 	(  9	E 7	8 LLB))J'()
 B,,S3%8B	TYYr]#	LL!	LL&&'	LL!"2QYYx5HHIByy)* 	+ @yy)* 	+ I	J 
!YYz2322		3 	 ! 	"	LL  ;;uE+s   0Pc                 
  	 | d   }|d   D ci c]  }|d   |d    }}t        |j                               }|j                         D cg c]  \  }}||k(  s| }}}|d   	t        |	fd      }||fS c c}w c c}}w )u5   Gemini 점수 단독 선정 — 동점=Gemini 랭킹.
gemini-proverdictslabelscorerankingc                 2    | v rj                  |       S dS )Nc   )index)labranks    r,   <lambda>z _gemini_select.<locals>.<lambda>   s$    Tk *.C **')**rE   )r7   )maxvaluesrZ   min)
judgegemvtotalsbestr   ttiedselectedr   s
            @r,   _gemini_selectr      s    

C.1*o>oaj!G*$oF>v}}D$lln:nFCT	CnD:y>D4 * +H8 ?:s   A:A?A?c            
      n   t        j                         } t        j                  |       }dj                  g d      }ddddddddidd	iddid
g d
ddidgd}dj                  d |D              }t	        j
                  d|d| |      }|d   D ci c]  }|d   |
 }}|D cg c]	  }||vs| }	}|	rt        d|	       t	        j                  t              }
||
d<   t	        j                  t        |
       |D ]'  }||   }|d   rdnd}t        d| d| d|d           ) yc c}w c c}w )u   배경 전용 샷 판정 (07-13 사용자: "S14sh5 같이 배경만 있는 샷은
    앞쪽 샷 참조 말고 배경 기반으로") — 실물 인물이 프레임에 없는
    샷은 prev 대신 플레이트를 참조한다.r
   )
uW   당신은 콘티 판독가다. 샷 목록을 받는다. 각 샷마다, 샷 텍스트가u[   묘사하는 프레임 안에 '살아있는 인물의 실물 몸'이 직접 등장하는지u   판정하라 (person_visible).uH   · 신체 일부(손·손목·발·뒷모습)만 보여도 등장이다.uR   · 거울·수면 등 반사상에 인물이 보이는 것도 등장으로 친다.uZ   · 다음은 등장이 아니다: 벽·바닥·가구 등 공간의 상태만 보여주는uZ     샷, 인물의 그림자만 맺힌 샷, 사진·액자·화면 '속' 인물 이미지만u7     보이는 샷, 발자국 같은 흔적만 있는 샷.uE   샷 텍스트에 적힌 것만 근거로 판단하라. 각 샷: shot,u,   person_visible(bool), reason_ko(한 구절).objectFrZ   arraytypestringboolean)shotperson_visible	reason_ko)r   additionalProperties
propertiesrequired)r   rZ   c              3   x   K   | ]2  }| d t         j                  t        j                  |         d     4 yw): rQ   N)rS   rT   rU   ).0r   s     r,   	<genexpr>zstage_bgonly.<locals>.<genexpr>   s6      ;591#Rqvvay!&)*+Ts   8:
s39_bgonlyu   샷 목록:
r   u   bgonly 누락: bgonlyr   u   인물u   ★배경 전용z	[bgonly] r   z | r   N)r:   _plan37_all_tags_story_orderr#   r   llmr=   	load_planPLAN	save_planprint)r@   tagsSYSSCHEMA	shots_txtresitgotr   missingplanmarks               r,   stage_bgonlyr      s~    **,C##C(D
))  C $w"E%x0)/(;$*H#5!7 FBG 'H I #)%F 		 ;59; ;I
%%c]9+#>
GC$'L
1Lb2f:r>LC
1/$Q!3,q$G/?7)455;;tDDNKKdV./x5G	!BtfC;'89:  2/s   D-(	D22D2c            	      
   t        j                  t              } g }| d   j                         D ]  \  }}|d   }t	        |d         \  }}||d<   ||d<   t        j                  t        | d|j                          dz  t        | dz         ||k7  r|j                  |||f       t        d| d	| d
| ||k7  r	d| d| dndz           t        j                  t        |        t        dt        |       d|        y)uJ   기저장 판정에서 Gemini 점수만으로 재선정 + _sel.png 갱신.shotsr   r   r   _r0   _sel.pngz[reselect] z	: gemini= sel=u	    (변경 u   →rO   rJ   u   [reselect] 변경 u   건: N)r   r   r   rZ   r   shutilcopyOUTSlowerra   r   r   len)r   changedr>   mtoldr   r   s          r,   stage_reselectr     s   ;;tDG=&&(Rn)"W+68!:DcU!HNN$4#5T::cU(++	-s?NNCh/0C5	&xjA4<O9SEXJa0M 	N ) KKd	s7|nE'
;<rE   c                  V	   t        j                         } t        j                         }t        j                  |      }|d   D ci c]  }|d   |
 }}t        j
                  D ci c]  }||   d   D ]  }||  }}}|j                  | d   D ci c]  }|t        j                   c}       t        j                  t         j                        j                  d      xs i }|sJ d       t        dz  t         dz  j                         rt        j                  t              ni }	|	j                  di       }
t        j!                  d	d	
       t        j"                  |       D ]%  }t        | dz  }|j                         rt%        d| d       0||   }|j                  |      xs i }|j                  d      }|j                  dd      }d}|	j                  d      xs i j                  |      }|r|r
|d   sd\  }}d }|r:t        | dz  j                         r |}t        j&                  t        | dz  fg}nt        j(                  t+        |||       fg}t-        |      xr |d    }t/        ||| |||||      }t0        D ]K  }t        j2                  d| d|j5                          ||dt        | d|j5                          dz         M dd|z   dg}|D ]@  \  }}|j7                  dd| d       |j7                  t        j8                  |             B t0        D ]Y  }|j7                  dd| d d       |j7                  t        j8                  t        | d|j5                          dz               [ i }d!d"| ffD ]>  \  }}t        j:                  |t<        |t        j>                  j@                  |#      ||<   @ tC        |      \  }}tE        jF                  t        | d|j5                          dz  |       |||r|nd||rd$n|rd%nd&|D  !cg c]  \  } }!| tI        |!      d' c}!} ||||d(
|
|<   t        jJ                  t        |	       t%        d| d)|
|   d*    d+| d,| d-| 
       ( y c c}w c c}}w c c}w c c}!} w ).Ngroupsr7   r   int_tagsprev2u3   s38 prev2 판정 없음 — 먼저 s38 --only prev2plansz.jsonTparentsexist_okr   z[s39] z skip(exists)prevusage_enrJ   Fr   r   )NT)rj   s39_r   z16:9r0   )aspect_ratioout_pathr   z<THE PROMPT (all three candidates were generated from this):
)r   r   u   REFERENCE — z
Candidate :r|   s39_judge_gemini_)modelu   prev 선택본u:   배경 플레이트 (★배경 전용 샷 — prev 무시)u   배경 플레이트)r~   path)
r?   rh   ri   	bg_forcedref_moderefspromptr   r   r   u    완료 mode=r   z prev=z totals=r   )&r:   r   r8   _s35	_movement
EXT_GROUPSr]   r9   r   r   r   rV   HEREr<   r[   r   mkdirr   r   PREV_STILL_LABELPLATE_STILL_LABELrD   boolrz   CANDSimg_nb2r   ra   png_data_urlr   JUDGE_SYSTEMTJUDGE_SCHEMAr   r   r   strr   )"r@   plan35rf   grg   gkr   tag2gr   r   metar>   sel_outr?   pjprev_tagri   r   bgorh   r   rj   r   r   rx   rlabrpr   r   jtagr   r   lab_rC   s"                                     r,   stage_stillsr     s   
**,CVVXF	
V	B!'!12!1AAeHaK!1D2\\E\r48G3DaQU3DQ\EE	LL#j/:/Q!Q[[./:;KK $$W-3EGGG5!%TF%.!@ H H J1;;t 	??7B'DJJtdJ+'',C5))>>F3%}-.SzYYs^!r66&>VVJ+
	xx!'R,,S1C(8$9",Hi	8*H 55==? I''8*H0E)EFGD(()Cs*CDEDs)9C(8$9 9sD#r4(*gGCIISE399;-0&$#)#Qsyy{m4&@@B 
 !57=>? @ HD"LL&$24&"9; <LL+,  CLL&Jse12EFGLL#a		}D/I(IJK  )->se+DEGKE455|U!"!1!1@E%L H *%0DcU!HNN$4#5T::GDy(1*r"-6)% [+@%)+%)r  $SW5%)+u 
S	 	
D$se=c:)>(?yk&xjB 	Cu - 3E:v+s   R'RR 2R%c                     t        j                         } t        j                         }t	        j
                  t              }|d   D ci c]  }|d   |
 }}|j                  di       t        dz  j                  dd       d fdt        j                  D cg c]  }||   d   D ]  }||f  c}}| d	   D cg c]  }t        j                  |f c}z   }g d
d }
}	}|D ]0  \  }}||
k7  r<|
|j                  |	dz          d ||   d          d| d ||   d          d}	|}
j                  |      }|s
|	d| dz  }	e|j                  d      rd |d          dn|j                  d      rdnd}|j                  d      rd |d          dnd
}|d   d   d   D ci c]  }|d   |
 }}d
}t        D ]  }|d    |k(  }|j                  |i       }|d!|rd"nd
 d#| d$|j                          d%| d$|j                          d&|rd'nd
z   d(| d)|j                  d*d+       d, |j                  d-d
             d.z   z  } |d   d   }d/|d0    d1d2j                  |d3          }d
j                  fd4|j                  dg       D              }|	d| d5| d6 |       d7| d8 t         j"                  t!        j$                  |         d9          d:| d; |d<          d=| d> |j                  d?d
             d@z  }	3 |
|j                  |	dz          t'        dA j)                         D              }d
j                  fdB|D              }t*        j-                  dC| dDt/              |z
   dEt/               dF| dGd
j                  |       dH       t1        dIt*                y c c}w c c}}w c c}w c c}w )JNr   r7   r   r   Tr   c                 F    t        j                  t        | xs d            S )NrJ   )_htmlescaper   )r   s    r,   esczstage_html.<locals>.escm  s    ||CRL))rE   c                 ,   t        |       }t        |      j                  t        t                    rt        |j	                  t                    S |j
                  z  }|j                         st        j                  ||       d|j
                   S )Nzout/s39/refs/)	r   r   
startswithr   relative_torB   r<   r   r   )path_ssrcdstREFDs      r,   _relzstage_html.<locals>._relp  sk    6ls8s4y)st,--SXXozz|KKS!sxxj))rE   r   rJ   z
</section>z<section><h2>name_koz <span class=k>(z,)</span></h2><div class=note>LOCATION lock: rR   z</div>z<div class=shot><h3>u*   </h3><div class=note>미생성</div></div>rh   z<span class=on>prev=z</span>r   u@   <span class=off>배경 전용 샷 → 플레이트 강제</span>u*   <span class=off>배경 플레이트</span>ri   u   <div class=note>사용 지시: r   r|   r}   r~   r   z<figure class=candz selz><a href='out/s39/stills/r   z-.png' target=_blank><img src='out/s39/stills/z.png' loading=lazy></a>u$   <div class=selbadge>★ 선정</div>z<figcaption><b>u    — Gemini r   ?u   점</b><br>
verdict_ko</figcaption></figure>zGemini winner=winneru    랭킹=>r   c              3      K   | ]K  }d  |d          d |d          d |d   j                  d      d   j                                d M yw)	z<figure class=pn><a href='r   z' target=_blank><img src='z' loading=lazy></a><figcaption>r~   u   —r   r  N)r"   r    )r   rr  r   s     r,   r   zstage_html.<locals>.<genexpr>  su      C
 0B!	 )ai(9 :((,QvY'8 9qz//6q9??ABC$	& 0Bs   AA u   <span class=k> — z</span></h3>z<div class=note>rQ   z</div><div class=row>uG   </div><div class=row><div class=refs><div class=note>참조 (1장) — r   z</div><div class=refrow>uF   </div></div></div><details><summary>프롬프트 전문</summary><pre>r   z</pre></details></div>c              3   D   K   | ]  }|j                  d       sd  yw)rh   r   N)rV   )r   rm   s     r,   r   zstage_html.<locals>.<genexpr>  s     @MqQUU;-?Ms     c              3      K   | ]8  \  }}|v r/d | d| d| d |   d          d|   d   |   d       d : yw)	z)<figure class=ov><a href='out/s39/stills/z1_sel.png' target=_blank><img src='out/s39/stills/z'_sel.png' loading=lazy></a><figcaption>u    — r   z	 (Gemini r   u   점)</figcaption></figure>N )r   _gkr   r   r   s      r,   r   zstage_html.<locals>.<genexpr>  s~      * FCqDy##$# &$$%3 'cs47:#678
DGH%d1gj&9:; <!		" s   >Auc  <!DOCTYPE html>
<html lang=ko><head><meta charset=utf-8>
<meta name=viewport content="width=device-width, initial-scale=1">
<title>s39 — 옥탑 23샷: 3롤 + Gemini VLM 선정</title>
<style>
body { margin:0; padding:24px; background:#0f1216; color:#e6e6e6;
       font:14px/1.6 -apple-system,'Apple SD Gothic Neo',sans-serif; }
h1 { font-size:20px; } h2 { font-size:17px; margin:34px 0 8px;
     border-bottom:1px solid #333; padding-bottom:5px; }
h3 { font-size:15px; margin:6px 0; }
.k { color:#8a939e; font-size:13px; font-weight:400; }
.row { display:flex; gap:14px; align-items:flex-start; margin:10px 0;
        flex-wrap:wrap; }
figure { margin:0; } figcaption { color:#c9d2dc; font-size:12px; }
img { width:100%; border-radius:8px; border:1px solid #2a2f36; }
figure.cand { max-width:430px; position:relative; }
figure.cand.sel img { border:4px solid #7ee2a8;
  box-shadow:0 0 14px rgba(126,226,168,.45); }
.selbadge { position:absolute; top:8px; left:8px; background:#1e3a2a;
  color:#7ee2a8; border:1px solid #7ee2a8; border-radius:6px;
  padding:2px 10px; font-size:13px; font-weight:700; }
figure.ov { max-width:300px; } figure.ov img { max-width:300px;
  border:3px solid #7ee2a8; }
figure.ov figcaption { font-size:11.5px; }
.note { color:#8a939e; }
.box { background:#161b22; border:1px solid #2a2f36; border-radius:8px;
       padding:12px 16px; margin:12px 0; }
.shot { border-top:1px dashed #2a2f36; padding:12px 0; }
.on { background:#1e3a2a; color:#7ee2a8; border-radius:5px;
      padding:1px 8px; font-size:12px; margin-left:6px; }
.off { background:#3a2a1e; color:#e2b57e; border-radius:5px;
       padding:1px 8px; font-size:12px; margin-left:6px; }
.refs { max-width:640px; }
.refrow { display:flex; gap:8px; flex-wrap:wrap; }
figure.pn { max-width:170px; } figure.pn figcaption { font-size:11px;
  max-width:170px; }
details { margin:6px 0; } summary { color:#9ecbff; cursor:pointer; }
pre { background:#161b22; border:1px solid #2a2f36; padding:10px;
      white-space:pre-wrap; font-size:12px; }
</style></head><body>
<h1>s39 — 옥탑 23샷: 콘티 제외·참조 1장 + 3롤 <b>Gemini VLM 단독
선정</b> (prev u    / 플레이트 u  )</h1>
<div class=box>사용자 확정 규칙: ①<b>콘티 제외</b> — 참조는 단 한 장:
prev 판정 v3(배경 동일성 유일 기준, s38 재사용)가 prev 를 주면
<b>이전 샷 선정본</b> / 아니면 <b>배경 플레이트</b>.
②샷당 <b>nb2 3롤(A/B/C)</b> → <b>★Gemini VLM 단독</b>이 프롬프트
(+참조 일관성) 충실도 0-10 판정 → 최고점 선정(동점=Gemini 랭킹).
GPT 판정은 사용자 지시로 평가에서 제외. ③선정본(초록 테두리+★)이
후속 샷의 prev 앵커(스토리 순서 체인). 자세 정본·carried state·
EXPRESSION_REALISM 텍스트 안전망 유지.
이전 판: <a href='s38_lightconti_full.html'
style='color:#9ecbff'>s38 갤러리</a></div>
<section><h2>★ 선정본 모아보기 (Gemini 점수 단독, u   샷)</h2>
<div class=row>z</div></section>
z
</body></html>z[html] )r:   r   r8   r   r   r   r   rV   r;   r   r   r9   ra   r   r   r#   rS   rT   rU   sumr   PAGE
write_textr   r   )r@   r   r   r   rg   r   r   ordersecsbodycurr?   r>   r   badge
usage_htmlr   gvcandsr   selm_gjwinners	ref_itemsn_prevoverviewr  r  r   r   s                              @@@@r,   
stage_htmlr#  d  s   
**,CVVXF;;tD!'!12!1AAeHaK!1D288GR D<DJJtdJ+**  !|| )|2hw' !W' | )%(_
5_AKK_
56E "d$D	c3;D</0#CT
9(=$>#?&tf -DJz234F<D CXXc]+C5 1= > ?DFF;' (B{O(<'=WE FF;' YB	 	 -b./0835 	 '{<0<><! j!m< 	 >CZ.C'CRB$sV$; <++.%q >((+uAciik] ;%&
 >A9bJ $C5 )FF7C()rvvlB/01(*	*
+E  [&#BxL>chhr)}568GG C
 02vvfb/AC C	 	"3%q!#g,|J<s166!&&+#6v#>?@ A#W %r*~./ 0!!* ,x,-..DF		Ga t D<'(@DKKM@@Fww * * *H 	OO )R )#d)f*<)= >@ ADD	{ Kz  m7 7p 
GD6
g 3")
50>s   O%OO6O__main__z--onlyT)r   r   reselecthtml)r   choices)F)0__doc__argparser&  r   r   syspathlibr   __file__parentr   r   insertr   
forest_libr   s35_fullrunrS   s37_rooftop_rebuildr8   s34_stillrunrW   s38_lightconti_fullr:   r;   r   r  r   r   r#   re   r   r   r-   rD   rz   r   r   r   r   r#  __name__ArgumentParserapadd_argument
parse_argsaonlyr  rE   r,   <module>r;     sM       
 H~ 3t9       eellU
X~&& 99 	 	  yy  . 8>   Up	(;V=&HCVWt z	 	 	 	"BOOHtD  F
A=||556VV= ? rE   