
    TJjbB                    v   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ZddlZddl	m
Z
 ddlmZ ej                  j                  d e e
e      j#                         j$                               ddlmZmZmZ  e
e      j#                         j.                  d   Zedz  Zd	Zd
ZdZdZdZdZddhZ g dZ!g dZ"dg dddg dddg ddgZ#d*dZ$d+dZ%d,dZ&d-dZ'd.dZ(d/d0dZ)d1dZ*	 d2	 	 	 	 	 	 	 	 	 	 	 	 	 d3d Z+d4d5d!Z,d6d"Z-	 	 	 	 	 	 	 	 	 	 	 	 	 	 d7d#Z.d8d$Z/d9d%Z0d9d&Z1edfd:d'Z2d;d(Z3e4d)k(  r e3        yy)<zKClassify current->predecessor reverse reuse hits in the selector merge gap.    )annotationsN)Path)Any)find_cns_stringsread_sectionsva_to_offset   outmap1_01amap2_02dz0:0z1:0z2:0iDH iDH )z"predecessor-current-forward-bridgezreverse-reuse-fill-site-hitz selector-2:0-runtime-or-savedatazstrict-source-hotspot)z@predecessor/target-side forward bridge into current selector 2:0zKreverse reuse target at predecessor fill site or executable fill/order edgez?selector 2:0 gameplay savedat or selected-pointer runtime tracez,strict map1_01a source coordinate or hotspotHwanse2.exe)z#1:0 predecessor selector root rangez2:0 current selector root rangez%current->predecessor dword reuse hitszpredecessor fill site addresses)pathfieldsz*out/save_selector_merge_bridge_matrix.json)currentToPredecessorHitCount&currentToPredecessorBeforeFillHitCount$currentToPredecessorFillSiteHitCountforwardMergeBridgeHitCountdirectMergeExecutionBridgeFoundz*out/save_selector_merge_execution_gap.json)
proofFound#failedSelectorMergeExecutionGateIdsmissingEvidencec                    d| dS )N0x08x values    J/home/exedev/hwanse/tools/summarize_save_selector_reverse_reuse_context.pyhex32r   G   s    c{    c                "    | rt        | d      S d S )N   )intr   s    r   	parse_hexr$   K   s    "3ub>,,r    c                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)r   fallbacks     r   	load_jsonr.   O   s*    ;;=::dnngn677r    c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   z<Ir   )r   lenstructunpack_from)exesectionsvaoffsets       r   dword_at_var8   U   s?    (B'F~!c#h.dC033r    c                    t        j                  d|       ryt        j                  d|       ry| j                  d      ry| j                  d      ryy	)
Nzmap\d+_\d+[a-z]\.cns	field-mapzmap_[a-z][123]\.cnstilesetcara_	characterface_faceresource)re	fullmatch
startswith)names    r   cns_kindrE   \   sG    	||+T2	||*D1wwr    c                   t        ||      }|y| |||z    j                  dd      }|j                  dd      }g }|D ]P  }t        |      }	|dv r|j	                  d       $d	|	cxk  rd
k  sn d|	cxk  rdk  s=n @|j	                  |       R dj                  dj                  |      j                               d d S )N         cp949ignore)errorsz
	     ~   i   i  P   )r   replacedecodeordappendjoinsplit)
r4   r5   r6   sizer7   rawtextcharscharcodes
             r   decoded_text_sampler]   h   s    (B'F~
fVd]
#
+
+GT
:C::gh:/DE 4y8LLT!T!Vt%=v%=LL 88BGGEN((*+CR00r    c                >   g }t        ||d      D ]  }t        | ||      }|j                  |xs d      }|rt        |      dk7  r6t        | ||dz         }	|j	                  |t        |      |j                  d      |t        |	t              rd|	dnd d        |S )Nr0   r:   z.cnsr   04x)recordVarecordVaHexmapfilename
sceneIdHex)	ranger8   getrE   rT   r   removesuffix
isinstancer#   )
r4   r5   stringsstartendrowsr6   r   rD   scene_ids
             r   field_record_startsro   x   s    DE3" C2.{{5;B'x~4sHb1f5 9$$V,1;Hc1JBxn-PT
 	 Kr    c                    g }||dz  z
  }t        ||dz   d      D ]N  }t        | ||      }	|j                  |	xs d      }
|
s(|j                  t	        |      |
t        |
      d       P || d  S )Nr0   r	   r_   )refVaHexrD   kind)rf   r8   rg   rT   r   rE   )r4   r5   rj   
scan_starttargetlimitrefsaligned_endr6   r   rD   s              r   previous_cns_refsrx      s     DFQJ'KJa3 	C2.{{5;B'b	TN
 		 =r    c                (   g }t        |      D ]  }||dz  z   }t        | ||      }| |S t        |      t        |      d|dz  dd}	||v r||   |	d<   t        ||         |	d<   nt	        ||      d|	d<   nd	|	d<   |j                  |	        |S )
Nr0   r      02x)vaHexvalueHex
lowByteHexcnsrr   pointerscalar)rf   r8   r   rE   r   rT   )
r4   r5   rj   r6   countrm   indexitem_var   rows
             r   dword_sampler      s    Du uqy.C73= K 7^eut|C01

 G CJ"75>2CK(E*6#CK"CKC#$ Kr    c                N    | D cg c]  }|d   |k  s| }}|r|d   S d S c c}w )Nra   r_   r   )field_startsrt   r   previouss       r   nearest_field_beforer      s7    +Is:&/HIHI#8B<-- Js   ""c                   t        |j                  d            }t        |j                  d            }||i S |dz  }t        | ||||      }	t        ||      }
|t        v rd}n|t
        k  r|rd}n|t
        k  rd}nd}t        |      t        |      ||t
        k  |t        v ||
|	t        | |||d	      t        | ||      d

S )Nr}   sourceVaHexr0   zfill-site-targetz unaligned-pre-fill-payload-reusezaligned-pre-fill-payload-reusezpost-fill-or-unknown-reuse   )r   )
r   targetVaHextargetAlignmentbeforePredecessorFilltargetsPredecessorFillSiteclassificationnearestFieldRecordBeforepreviousCnsRefstargetDwordSample
textSample)	r$   rg   rx   r   PREDECESSOR_FILL_SITESFIRST_PREDECESSOR_FILLr   r   r]   )r4   r5   rj   hitpredecessor_startr   rt   source	alignmentprevious_fieldsnearest_fieldr   s               r   classify_hitr      s     swwz*+Fsww}-.F~	
I'Xw@QSYZO(v>M''+	(	(Y;	(	(95V}V}$!'*@!@&,0F&F($1*)#x&PQR)#x@ r    c                @   t        |       }t        | |      }t        d |j                  d      xs g D        d       }|st	        d      t        |j                  dd      j                  dd      d         xs d}t        |j                  dd      j                  dd      d         xs |}t        | ||||      }|j                  d	      xs g D cg c]  }t        | |||||       }	}|	D 
cg c]  }
|
s|
	 }	}
i }i }|	D ]q  }
|
j                  d
      xs d}|j                  |d      dz   ||<   |
j                  d      xs i }|j                  d      xs d}|j                  |d      dz   ||<   s t        d |	D              }t        |	      |z
  }d}i dt        dt        dt        dt        dt        dt        |	      d|j                  d      d|j                  d      dt        d |	D              dt        d |	D              d|d|dt!        t#        |j%                                     d t!        t#        |j%                                     d!|	d d" d#d$d%d$t&        t(        d&t(        t*        t        t*              |d'S c c}w c c}
w )(Nc              3     K   | ]6  }|j                  d       t        k(  r|j                  d      t        k(  r| 8 yw)sourceSelectortargetSelectorN)rg   CURRENT_SELECTORPREDECESSOR_SELECTOR.0r   s     r   	<genexpr>z build_summary.<locals>.<genexpr>   s>      	
ww'(,<<()-AA 	
s   <>pairsz(missing current->predecessor bridge pairtargetRangeHexrG   z..r	   r   hitsr   unknownr   rc   nonec              3  J   K   | ]  }|j                  d       dk(  sd  yw)r   r   r	   Nrg   r   s     r   r   z build_summary.<locals>.<genexpr>   s!     McSWW5F-G1-LMs   ##a  The current 2:0 -> predecessor 1:0 reverse hits are reuse pointers into the predecessor pre-fill payload area: every hit lands before the 0x004844d0/0x004844d8 secondaryBranchState fill sites, none targets a fill site, and many targets are unaligned payload/text positions. They explain shared script/resource material between the selector roots, but they are not a predecessor-to-current execution bridge and cannot prove map1_01a->map2_02d progression.r   rt   r   predecessorSelectorcurrentSelectorreverseHitCountr   r   beforePredecessorFillHitCountc              3  D   K   | ]  }|j                  d       sd  yw)r   r	   Nr   r   s     r   r   z build_summary.<locals>.<genexpr>  s     ,c3#''JaBbQ,c     fillSiteHitCountc              3  D   K   | ]  }|j                  d       sd  yw)r   r	   Nr   r   s     r   r   z build_summary.<locals>.<genexpr>  s     [cSWW=Y5Z[r   alignedTargetCountunalignedTargetCountclassificationCountsnearestFieldRecordCounts
sampleRows   r   FreverseReuseProofFoundblocked)failedReverseReuseGateIdsr   promotionStatusremainingProofsevidenceRefsevidenceRefCount
conclusion)r   r   nextrg   
ValueErrorr$   rV   ro   r   sumr1   SOURCETARGETSOURCE_SELECTORr   r   dictsorteditemsFAILED_REVERSE_REUSE_GATE_IDSMISSING_EVIDENCEEVIDENCE_REFS)r4   merge_bridge_matrixr5   rj   pairr   predecessor_endr   r   rm   r   classification_countsnearest_field_countsr   nearestmap_namealigned_countunaligned_countr   s                      r   build_summaryr      s;   S!HsH-G	
.227;Ar	

 	D CDD!$((+;R"@"F"FtQ"OPQ"RSXWX)92 > D DT1 Ma PQfUfO h9JO\F 88F#)r 	S(GS2CVLD   'C3C'D',.+- S!12?i0E0I0I.Z[0\_`0`n-''45;;;u%/)=)A)A(A)NQR)RX&S MTMMM$i-/O	* && 	/ 	3	
 	+ 	3t9 	%&9&=&=>Z&[ 	*+>+B+BCd+e 	(,c$,c)c 	C[T[[ 	m 	 	V,A,G,G,I%J K 	#D0D0J0J0L)M$N 	d3Bi  	e!" 	!%#$ &C+$+%. 1 - (s   J2J:Jc                `   ddd| d    d| d    dd| d	    d
| d    d| d    d| d    d| d    d| d    d| d    d| d    dd| d    dd| d    dd| d   dddg}|j                  d | d   j                         D               |j                  g d        | d!   D ]  }|j                  d"      xs i }|j                  d#|d$    d%|d&    d'|d(    d)|d*    d)|j                  d+      xs d, d-|j                  d.      xs d, d'|j                  d/      xs d, d0        |j                  g d1       |j                  d2 | d3   D               |j                  g d4       |j                  d5 | d6   D               |j                  g d7       |j                  d8 | d9   D               |j                  g d:       | d;   D ]>  }|j                  d<|d=    d>d?j	                  |j                  d@      xs g               @ |j                  d       dAj	                  |      S )BNz%# Save Selector Reverse Reuse ContextrG   z
- route: `r   z -> rt   `z%- current->predecessor reverse hits: r   z- before predecessor fill: r   z- fill-site hits: r   z- aligned targets: r   z- unaligned targets: r   z- forward merge bridge hits: r   z'- direct merge execution bridge found: r   z- proof found: `r   z- reverse reuse proof found: `r   z- promotion status: `r   r   z## Classification Countsc              3  2   K   | ]  \  }}d | d|   yw)- : Nr   r   keyr   s      r   r   zmarkdown.<locals>.<genexpr>9  s!     _e2cU"UG$_s   r   )rG   z## Sample RowsrG   zR| current ref | predecessor target | class | align | nearest field | text sample |z&| --- | --- | --- | ---: | --- | --- |r   r   z| `r   z` | `r   z` | r   z | r   rc   -z `rb   r   z |)rG   z## Failed Reverse-Reuse GatesrG   c              3  &   K   | ]	  }d |   ywr   Nr   r   items     r   r   zmarkdown.<locals>.<genexpr>I  s     N2dVN   r   )rG   z## Missing EvidencerG   c              3  &   K   | ]	  }d |   ywr   r   r   s     r   r   zmarkdown.<locals>.<genexpr>K       D2dVDr   r   )rG   z## Remaining ProofsrG   c              3  &   K   | ]	  }d |   ywr   r   r   s     r   r   zmarkdown.<locals>.<genexpr>M  r   r   r   )rG   z## Evidence RefsrG   r   z- `r   z`: , r   
)extendr   rg   rT   rU   )summarylinesr   r   refs        r   markdownr   $  s   /

WX&'tGH,=+>a@
/8I0J/KL
%g.M&N%OP
W%789:
g&:;<=
(> ?@A
'0L(M'NO
1':[2\1]^
7<013
(1I)J(K1M
(9 :;1=

"
%E( 
LL_w?U7V7\7\7^__	LL   |$ 
''45;#m$%U3}+=*>d3GWCXBYY\$%&c'++e*<*C)DBw{{S`GaGhehFiimww|$+,B0	

 
LL:;	LLN1L)MNN	LL01	LLD1B)CDD	LL01	LLD1B)CDD	LL-.~& Qs3v;-s499SWWX5F5L"+M*NOPQ	LL99Ur    c                   dj                  d | d   j                         D              }g }| d   D ]  }|j                  d      xs i }|j                  dt	        j
                  |d          dt	        j
                  |d	          d
t	        j
                  |d          d|d    dt	        j
                  |j                  d      xs d       dt	        j
                  |j                  d      xs d       d
t	        j
                  |j                  d      xs d       d        dj                  d | d   D              }dj                  d | d   D              }dj                  d | d   D              }dj                  d | d   D              }dj                  dddd | d!    d"| d#    d$| d%    d&| d'    d(| d)    d*d+| d,    d-| d.    d/| d0    d1| d2    d3| d4    d5| d6    d7t	        j
                  | d8          d9d:t	        j
                  | d;          d<d=| d>d?d@dj                  |      dAdB| d>dC| d>dD| d>dE| d>g      S )FNrG   c              3  Z   K   | ]#  \  }}d t        j                  |       d| d % yw)<li>r   </li>Nhtmlescaper   s      r   r   zhtml_page.<locals>.<genexpr>V  s5      C t{{3 5'/s   )+r   r   r   z<tr><td><code>r   z</code></td><td><code>r   z</code></td><td>r   z	</td><td>r   rc   r   z <code>rb   r   z
</td></tr>c              3  N   K   | ]  }d t        j                  |       d  ywr   r   Nr   r   s     r   r   zhtml_page.<locals>.<genexpr>g  s#     \tDKK-.e4\   #%r   c              3  N   K   | ]  }d t        j                  |       d  ywr   r   r   s     r   r   zhtml_page.<locals>.<genexpr>h  s#     ltT$++d"3!4E:lr   r   c              3  N   K   | ]  }d t        j                  |       d  ywr   r   r   s     r   r   zhtml_page.<locals>.<genexpr>i  s#     ]$T[[./u5]r   r   c              3     K   | ]X  }d t        j                  |d          dt        j                  dj                  |j                  d      xs g              d Z yw)z
<li><code>r   z	</code>: r   r   r   N)r   r   rU   rg   )r   r   s     r   r   zhtml_page.<locals>.<genexpr>j  sY       T[[V-.iDIIcggV^N_NeceDf8g7hhmns   AA r   r   zW<!doctype html><meta charset="utf-8"><title>Save Selector Reverse Reuse Context</title>z<style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1200px;margin:24px auto}table{border-collapse:collapse;width:100%}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}</style>z,<h1>Save Selector Reverse Reuse Context</h1>z<p>Route <code>r   z -&gt; rt   z/</code>; current-&gt;predecessor reverse hits: r   z; before predecessor fill: r   z; fill-site hits: r   z.</p>z<p>Aligned targets: r   z; unaligned targets: r   z; forward merge bridge hits: r   z'; direct merge execution bridge found: r   z; proof found: <code>r   z*</code>; reverse reuse proof found: <code>r   z!</code>; promotion status: <code>r   z</code>.</p>z<p>r   z</p>z"<h2>Classification Counts</h2><ul>z</ul>z<h2>Sample Rows</h2>z<table><thead><tr><th>current ref</th><th>predecessor target</th><th>class</th><th>align</th><th>nearest field</th><th>text sample</th></tr></thead><tbody>z</tbody></table>z'<h2>Failed Reverse-Reuse Gates</h2><ul>z<h2>Missing Evidence</h2><ul>z<h2>Remaining Proofs</h2><ul>z<h2>Evidence Refs</h2><ul>)rU   r   rg   rT   r   r   )	r   countsrm   r   r   proofsfailed_gatesmissingrv   s	            r   	html_pager  U  s   WW !"89??A F D|$ 
''45;S%789 :S%789 :;;s#3456 7()* +;;w{{518S9:'$++gkkZgNhNoloBpAq r;;sww|4;<= >		

 WW\IZA[\\F77lwOjGkllLgg]'J[B\]]G77 >* D 99c 	y6
'(+,GGH4E3FFuv}  P  wQ  vR  Rm  nu  vU  nV  mW  Wi  jq  rD  jE  iF  FK  	L
w';<==RSZ[qSrRs  tQ  RY  Zv  Rw  Qx  x_  `g  hI  `J  _K  K`  ah  iu  av  `w  wa  bi  jB  bC  aD  De  fj  fq  fq  ry  zK  rL  fM  eN  NZ  	[
dkk',/016
,VHE: 	f

1,uE
'y6
'xu5
$TF%0  r    c                   |j                  dd       |dz  }|j                  t        j                  | dd      dz   d	       |9|j                  j                  dd       |j                  t        |       d	       |S )
NT)parentsexist_okz(save_selector_reverse_reuse_context.jsonF   )ensure_asciiindentr   r&   r'   )mkdir
write_textr*   dumpsparentr  )r   out_dirhtml_outjson_outs       r   write_outputsr    s    MM$M.CCH

7q9D@   dT:Ig.AOr    c                    t        j                  t              } | j                  dt        t
        dz         | j                  dt        t        dz         | j                  dt        t               | j                  dt        	       | j                         }t        |j                  j                         t        |j                  i             }t        ||j                  |j                        }t!        d
|        y )N)descriptionz--exer   )typedefaultz--merge-bridge-matrixz&save_selector_merge_bridge_matrix.jsonz	--out-dirz
--html-out)r  z-wrote save selector reverse reuse context -> )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsr   r4   
read_bytesr.   r   r  r  r  print)parserargsr   r  s       r   mainr"    s    $$9F
dD=4HI
/dCJrDrs
$<
40D$**B/G WdllDMMBH	9(
DEr    __main__)r   r#   returnstr)r   z
str | Noner$  
int | None)r   r   r-   r   r$  r   )r4   bytesr5   
list[dict]r6   r#   r$  r&  )rD   r%  r$  r%  )@   )
r4   r'  r5   r(  r6   r#   rW   r#   r$  r%  )r4   r'  r5   r(  rj   dict[int, str]rk   r#   rl   r#   r$  r(  )r0   )r4   r'  r5   r(  rj   r*  rs   r#   rt   r#   ru   r#   r$  r(  )r   )r4   r'  r5   r(  rj   r*  r6   r#   r   r#   r$  r(  )r   r(  rt   r#   r$  zdict | None)r4   r'  r5   r(  rj   r*  r   r   r   r#   r   r(  r$  r   )r4   r'  r   r   r$  r   )r   r   r$  r%  )r   r   r  r   r  zPath | Noner$  r   )r$  None)5r  
__future__r   r  r   r*   rA   r2   syspathlibr   typingr   r   insertr%  __file__resolver  probe_exe_scene_tablesr   r   r   r  r  r  r   r   r   r   r   r   r   r   r   r   r   r$   r.   r8   rE   r]   ro   rx   r   r   r   r   r   r  r  r"  __name__r   r    r   <module>r5     s   Q "    	  
   3tH~--/667 8 P P H~''*
Ul		  # $j1 !   
 =
	 =
)>-84	1 0 	  	
   ...
"	"" " 
	"
 " " 
"J?D.b)X 25d 
F zF r    