
    \IjN              
         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m	Z	 ddl
mZ ej                  j                  d e e	e      j!                         j"                               ddlmZmZ ddlmZmZ  e	e      j!                         j0                  d   Zed	z  Zd
ZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%e!de"de#de$de%diZ&d(dZ'd)dZ(d*dZ)d+dZ*d,dZ+d-d.dZ,d/d Z-d0d!Z.d1d2d"Z/d3d#Z0d3d$Z1edfd4d%Z2d5d&Z3e4d'k(  r e3        yy)6zPSummarize whether the opcode 0x24 payload table reaches the frontier leaf table.    )annotationsN)Path)Any)read_sectionsva_to_offset)handler_for_opcodesection_name_for_va   outmap1_01amap2_02di(T i(T i)T i(T i)T i)T i*T i*T i+T zleaf-table-window-startzroot-table-pointerzwrapper-leafzfrontier-leafzfrontier-readerc                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     K/home/exedev/hwanse/tools/summarize_save_selector_opcode24_payload_table.py	load_jsonr   +   s*    ;;=::dnngn677    c                    d| dS )N0x08x values    r   hex32r!   1   s    c{r   c                "    | rt        | d      S d S )N   )intr   s    r   	parse_hexr%   5   s    "3ub>,,r   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_atr/   9   s?    (B'F~!c#h.dC033r   c                   t        | ||      }|t        |      ||t        |      nd t        |cxk  xr	 t        k  nc d}|d|d<   |S |dz  }t	        | ||      }|j                  d|d|j                  d      |j                  d      |j                  d	      d
       t        ||      }t        |cxk  r	t        k  rn nd|d<   t        |      |d<   |S t        |cxk  r	t        k  r1n n.d|d<   t        |      |d<   t        j                  |d      |d<   |S |t        v r!d|d<   t        |      |d<   t        |   |d<   |S |rd|d<   t        |      |d<   ||d<   |S |dz	  dk  r|dz  dk  rd|d<   |S d|d<   |S )N)r-   vaHexr    valueHexinsidePayloadWindow
unreadablekind   r   02xhandlerVaHexhandlerSectionisCodeHandler)
lowByteHexlowByteHandlerVaHexlowByteHandlerSectionlowByteIsCodeHandlerpayload-pointertargetVaHexleaf-table-pointerzleaf-table-window-valuetargetMeaningfrontier-targetpointertargetSectionr#   i   i  i   pairscalar)r/   r!   PAYLOAD_STARTPAYLOAD_ENDr   updategetr	   LEAF_TABLE_STARTFRONTIER_READERTARGET_VALUES)r+   r,   r-   r    rowopcodehandlersections           r   row_atrS   @   s   S(B'Er$)$5E%L4,AkAC }"F
T\F h7GJJ6#,'&{{>:!(-=!> 'O <	  "(E2G,,'F"5\M" J! 
U	5o	5*F"5\M,008QRO J 
-	'F"5\M,U3O J 
F"5\M&O
 J	 2+%	UV^$?F J FJr   c                   g }t               }|}t        |      D ]:  }||v r!|j                  |t        |      dd        |S |j	                  |       | j                  |      }|s!|j                  |t        |      dd        |S |j                  d      }||d   |j                  d      |j                  d      |j                  d      d	}	|j                  d      d
v rZt        |t              rJ|j                  |	       |t        v s	|t        k\  r$|j                  |dz   t        |      dd        |S |}$d|	d<   |j                  |	        |S  |S )Nloop)stepr1   
stopReasonznot-in-payload-windowr    r1   r2   r5   r@   )rV   r1   r2   r5   r@   >   rC   r?   rA   r
   reached-frontier-targetznon-pointer-valuerW   )
setrangeappendr!   addrK   
isinstancer$   rN   rL   )

rows_by_vastart_va	max_stepsrowsseenr-   rV   sourcetargetitems
             r   pointer_closurerf   k   sm   DUD	Bi  :KKb	PQ8 K7 	#KKb	I`ab. K- G$G_

:.JJv&!::m4
 ::f!]]blmsuxbyKK&&4D*D 1H"6]"; 
  K B0\DK?> Kr   c           	         g }| D ]  }t        |j                  d            }| t        |cxk  r	t        k  rn ndnd}|t        v r
t        |   }nt
        |cxk  r	t        k  rn nd}|j                  |d   |d   ||dk(  |dk7  d        |S )Nr@   zpayload-windowexternalzleaf-table-windowr1   )sourceVaHexr@   
targetKindlocalPayloadEdgefrontierTargetEdge)r%   rK   rH   rI   rN   rL   rM   r[   )
table_rowsedgesrO   rd   target_kinds        r   payload_pointer_edgesrp      s    E 377=12>*76*P[*P&V`]"'/K:?:-Kw<}-% +/? ?"-1A"A
 	  Lr   c           
        i }i }| D ]  }|d   }|d   }|j                  |t                     j                  |       |j                  |t                     j                  |       |j                  |g       j                  |        g }t               }t	        |      D ]!  }||v r	|g}	t               }
|	r^|	j                         }||
v r|
j                  |       |	j                  t	        |j                  |t                     |
z
               |	r^|j                  |
       t	        |
      D cg c]  }|j                  |g       D ]  }|  }}}t	        |D ch c]  }|j                  d      s|d    c}      }t        d |D              }|j                  t        |      t	        |
      ||| |d       $ |S c c}}w c c}w )Nri   r@   rk   c              3  >   K   | ]  }|j                  d         yw)rl   NrK   .0edges     r   	<genexpr>z-payload_pointer_components.<locals>.<genexpr>   s     Z$txx(<=Z   )	componentnodesrn   externalTargetsclosedInsidePayloadreachesFrontierTarget)
setdefaultrY   r\   r[   sortedpopextendrK   rJ   anyr(   )rn   	adjacencyedge_by_sourcerv   rc   rd   
componentsrb   nodestackrz   currentcomponent_edgesexternal_targetsreaches_frontiers                  r   payload_pointer_componentsr      s   %'I,.N ;m$m$VSU+//7VSU+//7!!&"-44T:; JUDy! 4<%iikG%IIgLL	gsu = EFG  	E !-
&**626
  

 

 "'#
88./ #
 
 Z/ZZZE]$/'7#7%5
 	/> '

#
s   5 G!G
c                   t        |       }t        t        t        dz   d      D cg c]  }t	        | ||       }}|D ci c]  }|d   |
 }}|D cg c]  }|j                  d      dk(  s| }}|D cg c]  }|j                  d      dv s| }}|D cg c]  }|j                  d      dk(  s| }	}t        |      }
t        |
      }|
D cg c]  }|j                  d	      r| }}t        |t              }|D cg c]8  }|j                  d
      dk(  s t        |j                  d            t        v r|: }}t        d |xs g D        i       }d}i dt        dt        dt        t               dt        t              dt        t               dt        t               dt        t"              dt        t$              dt        t&              dt        t(              dt        t*              d|j                  d      d|j                  d      d|dt-        |      d|d t-        |      d!|t-        |
      t-        |      |
|t-        |      t-        |      d"k(  t/        d# |D              t-        |	      |t1        |      t1        |      d$g d%|d&S c c}w c c}w c c}w c c}w c c}w c c}w c c}w )'Nr
   r'   r-   r5   r?   >   rC   rA   r=   z.datark   rW   rX   r@   c              3     K   | ]6  }|j                  d       t        k(  r|j                  d      t        k(  r| 8 yw)rc   rd   N)rK   ROUTE_SOURCEROUTE_TARGET)ru   rO   s     r   rw   z build_summary.<locals>.<genexpr>   s9      	
wwx L0SWWX5F,5V 	
s   <>a  The opcode 0x24 payload/action table immediately before the leaf table is pointer-local: its dword pointers stay inside 0x005428e8..0x005429a4, and none point at the leaf table start, the 2:0 root table pointer, wrapper leaf 0x00542a04, frontier leaf 0x00542ae8, or reader 0x00542b0c. The closure from the naive dispatch stop 0x005428f4 stops at 0x005428e8 on a non-pointer value. This rules out using the opcode 0x24 payload table as proof that the 0x005428bc writer path selects the frontier leaf; promotion remains blocked.rc   rd   opcode24VaHexdispatchStopVaHexpayloadWindowHexz..leafTableWindowStartHexrootTablePointerHexwrapperLeafHexfrontierLeafHexfrontierReaderHexgateDispatchStopHexgateFrontierLeafHexfrontierLeafPointerHex	tableRowspayloadPointerCountpayloadPointersleafTablePointerCountleafTablePointersr   c              3  >   K   | ]  }|j                  d         yw)r}   Nrs   )ru   ry   s     r   rw   z build_summary.<locals>.<genexpr>  s     0z\e?V1W0zrx   blocked)zKdecode the selector/table index that chooses current 2:0 leaf table entrieszIprove wrapper 0x00542a04 executes into 0x00542ae8 during the normal routez3find a strict map1_01a source coordinate or hotspot)payloadGraphEdgeCountpayloadGraphComponentCountpayloadGraphEdgespayloadGraphComponentspayloadGraphExternalEdgeCountpayloadGraphAllEdgesLocal!payloadGraphReachesFrontierTargetdataLowByteCountdispatchStopClosureclosureReachesFrontierTargetpayloadDirectlyTargetsLeafTablepromotionStatusremainingProofs
conclusion)r   rZ   rH   rI   rS   rK   rp   r   rf   DISPATCH_STOP_REFr%   rN   nextr   r   r!   OPCODE24_VArL   LEAF_TABLE_ROOTWRAPPER_LEAFFRONTIER_LEAFrM   r(   r   bool)r+   
gate_pathsr,   r-   rm   rO   r^   payload_pointersleaf_table_pointersdata_low_bytesgraph_edgesgraph_componentsrv   graph_external_edgesclosurere   reached_targets
route_gater   s                      r   build_summaryr      s.   S!H6;M;YZ?\]6^_&h+_J_,67S#d)S.7J7'1ZSWWV_HY5YZZ*4u3Kt8t3uu%/_c377;R3SW^3^c_N_'
3K1+>-8]TI[@\D]]j*;<G 88L!%>>TXXm,-> 	O 
 	
&,"	
 	J	8 $,$,$ 	{+$ 	U#45	$
 	u]34Bu[7I6JK$ 	"5)9#:$ 	u_5$ 	%-$ 	5/$ 	U?3$ 	z~~.AB$ 	z~~.FG$ 	Z$ 	s#34$ 	+$  	 %8!9!$" 	0#$$ "%[!1&)*:&;("2),-A)B%()=%>!%C-00ziy0z-z/&(,_(=+/0C+D$

 !G$ $; `7Zu_ ^sA   J) J.J3-J37J8J8J=4J=K+K=K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| d    d| d    d | d!    d"| d#    d$| d%    d&| d'    d| d(   dd)dd*d+g}| d,   D ]  }|j                  d-|j                  d.       d/|j                  d0       d1|j                  d2      xs d3 d4|j                  d5      xs d3 d/|j                  d6      xs d3 d4|j                  d7      xs d3 d8        |j                  g d9       | d:   D ]  }d;j                  d< |j                  d=      xs g D              }|j                  d-|j                  d>       d?|j                  d@       d?|j                  dA       d?d;j                  |j                  dB      xs g        d?|xs d3 d8        |j                  g dC       | dD   D ]  }|j                  dE|d0    d1|j                  d2       d4|j                  d5       d/|j                  d6      xs d3 dF|j                  dG      xs |j                  dH      xs d d/|j                  dI      xs d3 d1|j                  dJ      xs d3 dF|j                  dK      xs d3 d8        |j                  g dL       |j                  dM | dN   D               |j                  d       dOj                  |      S )PNz)# Save Selector Opcode 0x24 Payload Table z	- route: rc   z -> rd   z- opcode 0x24: `r   `z- dispatch stop ref: `r   z- payload window: `r   z- leaf table window start: `r   z- root table pointer: `r   z- wrapper leaf: `r   z- frontier leaf: `r   z- frontier reader: `r   z- payload pointer count: r   z- payload graph components: r   z!- payload graph all edges local: r   z)- payload graph reaches frontier target: r   z- leaf table pointer count: r   z#- closure reaches frontier target: r   z'- payload directly targets leaf table: r   z- promotion status: r   r   z## Dispatch Stop Closurez,| step | va | value | kind | target | stop |z&| ---: | --- | --- | --- | --- | --- |r   z| rV   z | `r1   z` | `r2   -z` | r5   r@   rW   z |)r   z## Payload Pointer Graphr   zH| component | closed inside payload | reaches frontier | nodes | edges |z | ---: | --- | --- | --- | --- |r   , c              3  f   K   | ])  }|j                  d        d|j                  d        + ywri   z->r@   Nrs   rt   s     r   rw   zmarkdown.<locals>.<genexpr>D  7      
 xx&'r$((=*A)BC
   /1rn   ry   z | r|   r}   rz   )r   z## Payload Windowr   z3| va | value | kind | target | low byte | handler |z%| --- | --- | --- | --- | --- | --- |r   z| `z` rB   rE   r;   r<   r=   )r   z## Remaining Proofsr   c              3  &   K   | ]	  }d |   yw)z- Nr   ru   re   s     r   rw   zmarkdown.<locals>.<genexpr>[  s     D2dVDs   r   
)r[   rK   r   join)summarylinesre   ry   	edge_textrO   s         r   markdownr     s   3

GH%&d78+<*=>
7?34A6
 )<!= >a@
g&89:!<
&w/H'I&J!L
!'*?"@!AC
G$456a8
W%678:
w':;<A>
#G,A$B#CD
&w/K'L&MN
+G4O,P+QR
3G<_4`3ab
&w/F'G&HI
-g6T.U-VW
1':[2\1]^
w'89:;

"
605E8 -. 
&!"$txx'8&9txx
?S?ZWZ>[[_xx&3'tDHH],C,Js+K4PTPXPXYePfPmjmOnnpr	


 
LL   56 	
	II 
!g.4"
 
	 	{+,C	>S0T/UUX}}456cyyw/5267s9;K:LBP	
	
 
LL   {# 
#g,uSWWZ%8$9cggfo=N O&-#.b1I1kSWWUdMe1kik0l m%,-U377;P3Q3XUX2YY[\_\c\cd{\|  ]D  AD  \E  EGH	

 
LL01	LLD1B)CDD	LL99Ur   c                0
   g }| d   D ]  }|j                  d|j                  d       dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d      xs d             d	t        j                  t	        |j                  d
      xs d             dt        j                  t	        |j                  d      xs d             d	t        j                  t	        |j                  d      xs d             d         g }| d   D ]v  }|j                  d      xs d d|j                  d      xs |j                  d      xs d }|j                  dt        j                  |d          dt        j                  t	        |j                  d                   d	t        j                  t	        |j                  d
                   dt        j                  |       dt        j                  t	        |j                  d      xs d             dt        j                  t	        |j                  d      xs d             dt        j                  t	        |j                  d      xs d             d       y g }| d   D ]   }dj                  d |j                  d      xs g D              }|j                  d|j                  d       dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  dj                  |j                  d       xs g              dt        j                  |xs d       d!        dj                  d" | d#   D              }	d$j                  g d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5t        j                  | d6          d7t        j                  | d8          d9| d:    d;| d<    d=	d>| d?    d@| dA    dB| dC    dD| dE    d=	dF| dG    dH| dI    dJ| dK    dL| dM    dN| dO    dP| dQ    dR| dS    dTt        j                  | dU          dVdWt        j                  | dX          dVdYdZd[dj                  |       d\d]d^d[dj                  |       d\d_d`d[dj                  |       d\dadb|	 dcddded      S )fNr   z<tr><td>rV   z</td><td><code>r1   z</code></td><td><code>r2   r   z</code></td><td>r5   r@   rW   z
</td></tr>r    rB   rE   r   z<tr><td><code>r;   r<   z</code> r=   r   r   c              3  f   K   | ])  }|j                  d        d|j                  d        + ywr   rs   rt   s     r   rw   zhtml_page.<locals>.<genexpr>|  r   r   rn   ry   z	</td><td>r|   r}   rz   z</code></td></tr>c              3  N   K   | ]  }d t        j                  |       d  yw)z<li>z</li>N)htmlescaper   s     r   rw   zhtml_page.<locals>.<genexpr>  s#     adDT!2 359as   #%r   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">z8  <title>Save Selector Opcode 0x24 Payload Table</title>z	  <style>z[    body { margin: 24px; background: #111; color: #eee; font: 14px system-ui, sans-serif; }zJ    table { border-collapse: collapse; width: 100%; margin: 18px 0 28px; }zP    th, td { border: 1px solid #3a3a3a; padding: 6px 8px; vertical-align: top; }z9    th { background: #202020; position: sticky; top: 0; }z    code { color: #9bd4ff; }z
  </style>z</head>z<body>z2  <h1>Save Selector Opcode 0x24 Payload Table</h1>z  <p>route: rc   z -&gt; rd   z; opcode 0x24 <code>r   z</code>; payload window <code>r   z</code>.</p>z$  <p>leaf table window start: <code>r   z</code>; wrapper leaf <code>r   z</code>; frontier leaf <code>r   z</code>; frontier reader <code>r   z  <p>payload pointer count: r   z; graph components: r   z; graph all edges local: r   z!; graph reaches frontier target: r   z; leaf table pointer count: r   z#; closure reaches frontier target: r   z'; payload directly targets leaf table: r   z; promotion status: r   z</p>z  <p>r   z   <h2>Dispatch Stop Closure</h2>zp  <table><thead><tr><th>step</th><th>va</th><th>value</th><th>kind</th><th>target</th><th>stop</th></tr></thead>z	  <tbody>z</tbody></table>z   <h2>Payload Pointer Graph</h2>z  <table><thead><tr><th>component</th><th>closed inside payload</th><th>reaches frontier</th><th>nodes</th><th>edges</th></tr></thead>z  <h2>Payload Window</h2>zw  <table><thead><tr><th>va</th><th>value</th><th>kind</th><th>target</th><th>low byte</th><th>handler</th></tr></thead>z  <h2>Remaining Proofs</h2>z  <ul>z</ul>z</body>z</html>)r[   rK   r   r   strr   )
r   closure_rowsre   rm   rO   rd   
graph_rowsry   r   proof_itemss
             r   	html_pager   `  s   L-. 

88F#$ %S'):%;<= >S*)=)D%EFG H;;s488F#3#:s;<= >S-)@)GC%HIJ K;;s488L#9#@SABC D		


 J{# 
GGM*1c2!CGGO4L4nPSPWPWXgPh4nln3opS\23 4S)<%=>? @;;s3776?345 6V,- .S)>)E#%FGH IS1F)G)N3%OPQQYZ^ZeZefijmjqjq  sJ  kK  kR  OR  gS  [T  ZU U		

 J56 
	II 
!g.4"
 
	 	==-. /;;s9==1F#GHIJ K;;s9==1H#IJKL MTYYy}}W/E/K%LMN OY%5#67 8	

 ''agN_F`aaK99 ### 	# 	#	#
 	Q# 	C# 	# 	f# 	U# 	[# 	D# 	'# 	# 	# 	#  	=!#" t{{78#456gdkk'RZJ[>\=]]qry  {J  sK  rL  Lj  kr  sE  kF  jG  GS  	T##$ /w7P/Q.RRnov  xH  pI  oJ  Jg  ho  pA  hB  gC  Cb  cj  k~  c  b@  @L  	M%#& 'w/D'E&FFZ[bc  \A  [B  B[  \c  d  \@  [A  Ab  cj  kN  cO  bP  Pl  mt  uL  mM  lN  Nq  ry  zX  rY  qZ  ZA  BI  Jk  Bl  Am  mA  BF  BM  BM  NU  Vg  Nh  Bi  Aj  jn  	o'#( GL12348)#* 	++#, 	{-#. BGGL)**:;/#0 	+1#2 	Q3#4 BGGJ'((895#6 	$7#8 	B9#: BGGJ'((89;#< 	&=#> U#?#@ 	A#B 	C#D 	E# # #r   c                    |j                  dd       |dz  j                  t        j                  | dd      d       |:|j                  j                  dd       |j                  t        |       d       y y )	NT)parentsexist_ok)save_selector_opcode24_payload_table.jsonF),:)ensure_ascii
separatorsr   r   )mkdir
write_textr   dumpsparentr   )r   out_dirhtml_outs      r   write_outputsr     s{    MM$M.::FF

7:F G  dT:Ig.A r   c                    t        j                         } | j                  dt        t        dz         | j                  dt        t
               | j                  dt        d d       | j                         }t        |j                  j                         t        |j                  dz  g             }t        ||j                  |j                         t        d	|j                  d
z          y )Nz--exezHwanse2.exe)typedefaultz	--out-dirz
--html-outz!Optional HTML report output path.)r   r   helpzsave_selector_gate_paths.jsonz#wrote opcode 0x24 payload table -> r   )argparseArgumentParseradd_argumentr   ROOTOUT
parse_argsr   r+   
read_bytesr   r   r   r   print)parserargsr   s      r   mainr     s    $$&F
dD=4HI
$<
4DghD$,,!@@"EG '4<<7	/?j0j/k
lmr   __main__)r   r   r   r   returnr   )r    r$   r   r   )r    z
str | Noner   
int | None)r+   bytesr,   
list[dict]r-   r$   r   r   )r+   r   r,   r  r-   r$   r   dict)   )r^   zdict[int, dict]r_   r$   r`   r$   r   r  )rm   r  r   r  )rn   r  r   r  )N)r+   r   r   zlist[dict] | Noner   r  )r   r  r   r   )r   r  r   r   r   zPath | Noner   None)r   r  )5__doc__
__future__r   r   r   r   r)   syspathlibr   typingr   r   insertr   __file__resolver   probe_exe_scene_tablesr   r   summarize_script_handler_tabler   r	   r   r   r   r   r   r   rH   rI   r   rL   r   r   r   rM   rN   r   r!   r%   r/   rS   rf   rp   r   r   r   r   r   r   __name__r   r   r   <module>r     s=   V "     
   3tH~--/667 8 > R H~''*
Ul   /).?&8-4(V#L*+\CLCLM` 25d Bn zF r   