
    UHj+                       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  ee      j                         j                  d   Zedz  ZddZdd	Zdd
ZddZddZddZddZddZddZddZefddZddZedk(  r e        yy) zGCross-check scene event records against Korean text pointer candidates.    )annotationsN)Path)read_sectionsva_to_offset   outc                    d| dS )N0x08x )values    </home/exedev/hwanse/tools/summarize_scene_event_text_refs.pyhex32r      s    c{    c                L    t        j                  | j                  d            S )Nutf-8encoding)jsonloads	read_text)paths    r   	load_jsonr      s    ::dnngn677r   c                F   i }| j                  d      xs g D ]n  }t        |j                  d      t              s#|j                  d      xs t        |d         |j                  dd      |j                  dd      dd||d   <   p g }| j                  d	      xs g D ]  }g }|j                  d
      xs g D ]  }t        |d   d      }|j	                  ||d   |j                  dd      |j                  dd      dd       |j                  ||d   |j                  dd      |j                  dd      d        |j                  t        |d   d      t        |d   d      |d   |d   |j                  dd      |j                  d      xs g |d        ||fS )N
candidatesvavaHextext classification	candidate)	textVaHexr   r    sourcerefClustersentriesr"      cluster)textVar"   r   r    
startVaHexendVaHex
entryCountr   sampleTexts)startVaendVar)   r*   r+   r,   r%   )get
isinstanceintr   
setdefaultappend)korean_summarytextsrowclustersr'   r%   entrytext_vas           r   
text_indexr:      s   E!!,/52 cggdmS) WWW-As4y1A+"%''*:B"?%	 E#d) H!%%m4: [[+1r 	E%,b1GW";/		&"-"')),<b"A#	'  NN!";/		&"-"')),<b"A	 	 	7<0"5,b1!,/
+!++lA6";;}5;
 	!2 (?r   c           	     4   t        ||      }|g S g }||dz  z
  }|||z
  z
  }t        d|d      D ]e  }||z   }	|	dk  s|	dz   t        |       kD  r||z   }
t        j                  d| |	      d   }|j                  |
t        |
      |t        |      d       g |S )N   r   z<I)r   r   r   valueHex)r   rangelenstructunpack_fromr3   r   )exesectionsstart_va
byte_countoffsetrows
aligned_vaaligned_offsetreloffr   r   s               r   dwords_in_windowrL   A   s    (H-F~	DX\*Jx*45NQ
A& s"7cAgC(#""4c2152Ye	
 	 Kr   c                R   g }t        | j                  d      t              r|j                  d| d   dd       t        | j                  d      t              r|j                  d| d   dd       | j                  d      xs g D ]q  }t        |j                  d      t              r|j                  d	|d   d
d       t        |j                  d      t              sZ|j                  d|d   dd       s i }|D ]  }|||d   |d   f<    t	        |j                               S )NrecordVarecord   )kindr-   byteseventDispatchVadispatcheventDispatchRefsconditionVa	condition`   conditionPayloadVapayloadi   rQ   r-   )r0   r/   r1   r3   listvalues)eventwindowsrefuniquewindows        r   event_windowsrb   W   s   G%))J'-U:5FQUVW%))-.4
u=N7OZ^_`yy,-3 fcggm,c2NNKC<NY]^_cgg23S9NNI#>R:S^cde	f
 F =6<vy 123=  r   c                @    |D ]  }|d   | cxk  r|d   k  s|c S   y )Nr-   r.   r   )r   r7   r'   s      r   cluster_hitrd   h   s7     9:''*::N ; r   c                0   g }g }t               }t               }t        |      D ]  }	t        | ||	d   |	d         D ]  }
|
d   }||v rC|	d   |
d   |f}||vr4|j                  |       |j	                  |	d   |
d   |
d   d||          t        ||      }|^|	d   |
d   |d   f}||vsq|j                  |       |j	                  |	d   |
d   |
d   |d	   |d
   |d   |d   d d d         |j                  d      |j                  d      |j                  d      |j                  d      xs t        |j                  dd            t        |j                  d      xs g       t        t        |            t        |      t        |      ||d
S )Nr-   rR   r   rQ   r   r   r=   )
windowKindrefVaHexr=   r)   r*   r+   r,      )rf   rg   r=   clusterStartVaHexclusterEndVaHexr+   r,   map
sceneIdHex	eventKindrecordVaHexrN   r   rU   )
rk   rl   rm   rn   dispatchRefCountwindowCountdirectTextRefCounttextTableRefCountdirectTextRefstextTableRefs)	setrb   rL   addr3   rd   r/   r   r?   )rB   rC   r]   r5   r7   	text_refs
table_refs	seen_text
seen_tablera   dwordr   keyr'   s                 r   
scan_eventr}   o   s   IJIJ& %c8VI5FwX 	E'NE~f~uT{E:i'MM#&$$&,Vn$)'N$)*$5&  ,	&  "%2G"f~uT{GI4FGj(NN3'%%&,Vn$)'N$)*$5-4\-B+2:+>&-l&;'.}'=bq'A' #	8 yyii-YY{+yy/R5:q9Q3R		*= > D"E=/0!)n _## r   c           
     (   t        |       }t        |      \  }}|D cg c]  }t        | ||||       }}t        d |D              }t        d |D              }	dt	        |      t	        |      t	        |      ||	|dk(  r
|	dk(  rd|dS d|dS c c}w )Nc              3  &   K   | ]	  }|d      yw)rq   Nr   .0r6   s     r   	<genexpr>z build_summary.<locals>.<genexpr>   s     ;s)*;   c              3  &   K   | ]	  }|d      yw)rr   Nr   r   s     r   r   z build_summary.<locals>.<genexpr>   s     9S'(9r   z[Scene event condition/payload windows cross-checked against Korean text pointer candidates.r   zWThe currently extracted scene event records do not directly carry Korean text pointers.zeAt least one scene event window contains Korean text or text-table pointers and needs opcode tracing.)scope
eventCounttextCandidateCounttextClusterCountrq   rr   
conclusionrG   )r   r:   r}   sumr?   )
rB   eventsr4   rC   r5   r7   r]   rG   directtables
             r   build_summaryr      s    S!H 0OE8KQR%JsHeUH=RDR;d;;F9D99En$i!%jM$" {uz f   y  Ss   Bc                   dd| d   dd| d    d| d    d| d	    d
| d    d| d    dddddg}| j                  d      xs g D ]  }g }|j                  d      xs g D ]#  }|j                  |j                  dd             % |j                  d      xs g D ]&  }|j                  |j                  d      xs g        ( dj                  |d d       j	                  dd      xs d}|j                  d|d    d|d    d|d    d |d!    d"|d#    d|d    d|d    d| d$        d%j                  |      d%z   S )&Nz# Scene Event Text Referencesr   r   z- scene event records: r   z"- indexed Korean text candidates: r   z!- indexed text pointer clusters: r   z- direct text refs: rq   z- text table refs: rr   z	## EventszN| map | scene | kind | record | windows | direct text | table refs | samples |z5| --- | --- | ---: | --- | ---: | ---: | ---: | --- |rG   rs   r   rt   r,   ,    |z\|-z| rk   z | rl   rm   z | `rn   z` | rp   z |
)r/   r3   extendjoinreplace)summarylinesr6   samplesr_   sample_texts         r   markdownr      s   '


!',"7!89
,W5I-J,KL
+G4F,G+HI
w';<=>
g&9:;<

X?E  {{6"(b 

77+,2 	0CNN37762./	077?+1r 	9CNN377=17R8	9ii,44S%@GCUCL 12#c+6F5GtCP]L^K__c=!"#c*>&?%@CH[D\C]]`al`mmoq	


 99Ud""r   c                ^   g }| j                  d      xs g D ]1  }g }|j                  d      xs g D ]#  }|j                  |j                  dd             % |j                  d      xs g D ]&  }|j                  |j                  d      xs g        ( |j                  dt        j                  t        |d                d	t        j                  t        |d
                d	|d    dt        j                  |d          d|d    d	|d    d	|d    d	t        j                  dj                  |d d       xs d       d       4 dj                  dddddddddd d!t        j                  | d"          d#d$| d%    d&| d    d'| d    d#d(d)dj                  |       d*d+d,dg      S )-NrG   rs   r   r   rt   r,   z<tr><td>rk   z	</td><td>rl   rm   z</td><td><code>rn   z</code></td><td>rp   rq   rr   r   rh   r   z
</td></tr>r   z<!doctype html>z<html lang="en">z<head>z  <meta charset="utf-8">zF  <meta name="viewport" content="width=device-width, initial-scale=1">z,  <title>Scene Event Text References</title>z  <style>body{font-family:system-ui,sans-serif;background:#101010;color:#eee;margin:24px}table{border-collapse:collapse;width:100%}td,th{border:1px solid #333;padding:6px 8px;vertical-align:top}th{background:#1d1d1d}code{color:#f5d76e}</style>z</head>z<body>z&  <h1>Scene Event Text References</h1>z  <p>r   z</p>z  <p>events: r   z; direct text refs: z; table refs: z  <table><thead><tr><th>map</th><th>scene</th><th>kind</th><th>record</th><th>windows</th><th>direct text</th><th>table refs</th><th>samples</th></tr></thead>z	  <tbody>z</tbody></table>z</body>z</html>)r/   r3   r   htmlescapestrr   )r   rG   r6   r   r_   s        r   	html_pager      s#   D{{6"(b 
77+,2 	0CNN37762./	077?+1r 	9CNN377=17R8	9;;s3u:/0 1;;s3|#4567 8{#$ %S%789 :}%& '+,- .*+, -;;tyy!5<=> ?		

$ 99"P6 	~0
GL12348
-..B7K_C`Baaopw  yL  qM  pN  NR  	S 	i
BGGDM?"23
#  r   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_okscene_event_text_refs.jsonF   )ensure_asciiindentr   r   r   )mkdir
write_textr   dumps)r   out_dirs     r   write_outputsr      sC    MM$M.++77

7q9D@ 8 r   c            	     P   t        j                         } | j                  dt        t        dz         | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  dt        t
               | j                         }t        |j                  j                         t        |j                        t        |j                              }t        ||j                         t        d	|j                  d
z   d|d    d|d    d       y )Nz--exezHwanse2.exe)typedefaultz--eventszscene_events.jsonz--korean-textzkorean_text_candidates.jsonz	--out-dirzwrote scene event text refs -> r   z	 (direct=rq   z	, tables=rr   ))argparseArgumentParseradd_argumentr   ROOTOUT
parse_argsr   rB   
read_bytesr   r   korean_textr   r   print)parserargsr   s      r   mainr     s	   $$&F
dD=4HI

s=P7PQ
dCB_<_`
$<D$++$""#G
 '4<<(	)<<66
7 8/017CV;W:XXY	[r   __main__)r   r1   returnr   )r   r   )r4   dictr   z"tuple[dict[int, dict], list[dict]])
rB   rR   rC   
list[dict]rD   r1   rE   r1   r   r   )r]   r   r   r   )r   r1   r7   r   r   zdict | None)rB   rR   rC   r   r]   r   r5   zdict[int, dict]r7   r   r   r   )rB   rR   r   r   r4   r   r   r   )r   r   r   r   )r   r   r   r   r   None)r   r   )__doc__
__future__r   r   r   r   r@   pathlibr   probe_exe_scene_tablesr   r   __file__resolver   r   r   r   r   r:   rL   rb   rd   r}   r   r   r   r   r   __name__r   r   r   <module>r      s    M "      > H~''*
Ul8$N,!"+\,#>&R 25 ( zF r   