
    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Zddlm	Z	 ej                  j                  d e e	e      j                         j                               ddl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h dZddZddZd dZd!dZ d"dZ!	 d#	 	 	 	 	 	 	 	 	 	 	 d$dZ"d%dZ#d&dZ$d'dZ%d(dZ&d)d*dZ'	 	 	 	 	 	 	 	 	 	 	 	 d+dZ(d,dZ)efd-dZ*d.dZ+e,dk(  r e+        yy)/zOScan the current save-selector root for hidden map1_01a point-table candidates.    )annotationsN)Path)read_sectionsva_to_offset   outmap1_01amap2_02d      P   >   r   r   r         
                                  !   $   +   ,   /   0   8   C   H   K   Z   m      c                    d| dS )N0x08x )values    ?/home/exedev/hwanse/tools/summarize_map1_01a_root_point_scan.pyhex32r.   :   s    c{    c                    t        | t              rd| vry | j                  dd      \  }}t        |d      t        |d      fS )N..r   r   )
isinstancestrsplitint)r,   startends      r-   parse_hex_ranger8   >   sA    eS!T%6T1%JE3ub>3sB<''r/   c                    | j                  d      }d}|j                  |      st        |  d      t        j                  |t        |      d  j                  d            S )Nutf-8encodingzwindow.HWANSE_MAPS = z. does not contain the expected maps.js wrapperz;
)	read_text
startswith
ValueErrorjsonloadslenrstrip)pathtextprefixs      r-   parse_maps_jsrG   E   s[    >>7>+D$F??6"D6!OPQQ::d3v;<(//677r/   c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   <Ir   )r   rB   structunpack_from)exesectionsvaoffsets       r-   dword_at_varQ   M   s?    (B'F~!c#h.dC033r/   c                   t        ||      }|g g g dS g }g }g }t        t              D ]  }	||	dz  z   }
|
dz   t        |       kD  r nt	        j
                  d| |
      d   }|	dk  r|j                  t        |             |dk(  r nK|dz  }|dz	  }|dk\  s|dk\  r n5||d	}|j                  |       ||k  s||k  s|j                  |        |||dS )
N)	rawPointsinBoundsPointsfirstValuesrI   rJ   r   r   i  r   r   xy)r   rangeMAX_POINT_COUNTrB   rK   rL   appendr.   )rM   rN   ptr_vawidthheightrP   
raw_points	in_boundsfirst_valuesindexitem_offsetr,   rW   rX   points                  r-   read_point_runre   T   s
   (F+F~2bIIJIL' $uqy(?SX%""4k:1=2:e-A:FNRK8qCxa % u9VU#!$$  ## r/   c                :   t        j                  d|      }d}g }d}	 | j                  ||      dk  rn`dz   }t        fd|D        d       }	|	7|	d   z   |	d   z
  }
|dz  }t	        |      |k  r |j                  |	d   t        |
      d       x||d	S )
NrJ   r   r   c              3  d   K   | ]'  }|d    cxk  r|d    |d   z   k  rn n|d   v r| ) yw)rawraw_sizenameNr+   ).0itemhitsection_namess     r-   	<genexpr>z%scan_refs_to_value.<locals>.<genexpr>   sD      ;#FUd:6F(FFLM1 s   -0rO   rh   rj   )sectionrefVaHex)countsamples)rK   packfindnextrB   r[   r.   )rM   rN   r,   rn   sample_limitneedlerr   rs   searchrp   ref_varm   s      `       @r-   scan_refs_to_valuer{   s   s     [[u%FEGF
hhvv&7q$ 
 ?$wu~5
w<,&NNwvE&MRS' ( w//r/   c           
        t        d | D        d       }|rt        |j                  d      t              st	        d      |d   t        | D ch c]&  }t        |j                  d      t              r|d   ( c}      }t        fd|D        d       }|t	        d      t         dt         t              |t               dt        |       |j                  d      xs g d	S c c}w )
Nc              3     K   | ]6  }|j                  d       t        k(  r|j                  d      t        k(  r| 8 yw)groupslotN)getSELECTOR_GROUPSELECTOR_SLOT)rk   rl   s     r-   ro   z&selector_root_range.<locals>.<genexpr>   s9      	
xx N2txx7G=7X 	
s   <>selectedPointerz%could not find save selector 2:0 rootc              3  .   K   | ]  }|kD  s	|  y w)Nr+   )rk   r,   roots     r-   ro   z&selector_root_range.<locals>.<genexpr>   s     =%=s   
z,could not compute save selector 2:0 root end:r1   	fieldMaps)selectorrootVa	rootVaHex	rootEndVarootRangeHexr   )	rv   r2   r   r5   r?   sortedr   r   r.   )save_scene_selectorsrowrl   	all_rootsr7   r   s        @r-   selector_root_ranger      s   
	
,	

 	C j):!;SA@AA !D -	
$((#45s; "#	
I =9=t
DC
{GHH%&a74[ ;-r%*6WW[)/R 	
s   +C,c           
     0   g }| D ]  }|j                  d      t        k7  rt        |j                  d      xs g vr8|j                  d      xs g D ]  }|j                  d      xs i }|j                  d      }|j                  d      }t        |t              rt        |t              s[|j                  |j                  d      |||j                  d      d	         i }|D ]  }|||d   |d   |d   f<    t        |j                               S )
NmapselectorTargetCandidatesexitCandidatessamplerW   rX   sidecomponentIndex)r   rW   rX   r   )r   MAPTARGETr2   r5   r[   listvalues)	map_exit_candidatesrowsmap_row	candidater   rW   rX   uniquer   s	            r-   exit_samplesr      s   D& ;;u$'++&@AGRH %56<" 	I]]8,2F

3A

3Aa%Z3-?KK!f-"+--0@"A	 	" F 847FSXs3x018  r/   c                d    t        |j                  d            }|r|d   | cxk  r|d   k  ry yy)NfrontierClusterRangeHexr   r   current-frontier-clusterz%current-root-outside-frontier-cluster)r8   r   )field_vafrontier_pathsclusters      r-   source_record_roler      s:    n001JKLG71:7WQZ7) 82r/   c                .    | d   ry| d   dk\  ry| d   ryy)	NexactExitHitCountzexact-exit-coordinate-hitscriptishPointRatiog      ?script-like-point-runedgePointCountzedge-like-point-runzpoint-like-pointerr+   )r   s    r-   classify_candidater      s.    $%*&'3.&!"$r/   c                @    dj                  d | d | D              xs dS )N, c              3  6   K   | ]  }|d     d|d      yw)rW   ,rX   Nr+   )rk   rd   s     r-   ro   zpoint_text.<locals>.<genexpr>   s#     Nec
|1U3ZL1Ns   -)join)pointslimits     r-   
point_textr      s#    99Nvfu~NNURUUr/   c           	        t        |       }|t           }|d   }|d   }t        |      }	t        |      }
|
D ch c]  }|d   |d   f }}d}g }t	        |	d   |	d   d      D ]  }t        | ||      }|d	|cxk  rd
k  sn !t        | ||||      }|d   }|s8|dz  }|d   }|D cg c]  }|d   |d   f|v r|d   |d   d }}|D cg c]*  }|d   dk  s|d   |dz
  k\  s|d   dk  s|d   |dz
  k\  r|, }}|D cg c]   }|d   dz  t        v s|d   dz  t        v r|" }}t        |      dk  r|s|st        | ||dh      }t        | ||ddh      }i d|dt        |      d|dt        |      dt        ||      dt        |      dt        |      dt        |      dt        |      d|dt        |      d t        t        |      t        |      z  d      d!|d d" d#|d d" d$|d$   d%|d&   d'|d&   |d(   |d(   d)}t        |      |d*<   |j                  |        |j                  d+ ,       t!        d- |D              }t!        d. |D              }t!        d/ |D              }d0}i d1t        d2t"        d3||d4d5|	d5   d6|	d6   d7|	d7   d8|	d8   d9|j%                  d9      d:|
d;|d<t        |      d=|d>|d?|d@dAdBdCdD|dE|iS c c}w c c}w c c}w c c}w )FNr]   r^   rW   rX   r   r   r   rI   i  @ i  ` rS   r   rT   rV   r   r   r'   z.textz.dataz.rdatafieldVa
fieldVaHex	payloadVapayloadVaHex
sourceRolerawPointCountinBoundsPointCountr   r   exactExitHitsscriptishPointCountr   firstRawPointsr   firstInBoundsPointsrU   textRefCountrr   dataRefCountrs   )textRefsdataRefsclassificationc                4    | d    | d    | d    | d   | d   fS )Nr   r   r   r   r   r+   )r   s    r-   <lambda>zbuild_summary.<locals>.<lambda>*  s=    $%%!""%&&%&	N
 r/   )keyc              3  ,   K   | ]  }|d    s	d  yw)r   r   Nr+   rk   r   s     r-   ro   z build_summary.<locals>.<genexpr>2  s     Oc:M6N1Os   
c              3  2   K   | ]  }|d    dk(  sd  yw)r   r   r   Nr+   r   s     r-   ro   z build_summary.<locals>.<genexpr>3  s      lsC<MQk<k l   c              3  2   K   | ]  }|d    dk(  sd  yw)r   r   r   Nr+   r   s     r-   ro   z build_summary.<locals>.<genexpr>4  s     h#s;K7LPg7gAhr   a  The full current selector-root pointer scan finds many point-shaped candidates, but none contains the geometry-only exit samples for map1_01a -> map2_02d. The highest-scoring rows are script-like runs whose first values decode as VM command words such as 0x00010021, not strict map event point tables. This closes the hidden current-root point-table path as promotion evidence for now.sourcetargetsourceMapSize)r]   r^   r   r   r   r   r   exitSamplespointerLikeCountreportedCandidateCountfrontierClusterCandidateCountexactExitCandidateCountscriptLikeCandidateCountstrictSourceHotspotFoundFpromotionStatusblocked
conclusion
candidates)r   r   r   r   rY   rQ   re   SCRIPTISH_LOW_WORDSrB   r{   r.   r   roundr   r[   sortsumr   r   )rM   map_datar   r   current_root_frontier_pathsrN   
source_mapr]   r^   r   rs   r   sample_pointspointer_like_countr   r   r,   runr_   r`   rd   
exact_hitsedge_points	scriptish	text_refs	data_refsr   exact_exit_countfrontier_cluster_countscript_like_countr   s                                  r-   build_summaryr      s    S!H#JwE!F34D./G5<=cc#hC)=M=J$x.${*;Q? 3%C84=u!B
!BS(E5&A%
a()	 $
c
E#J'=8 *5:.

 
 $
SzQ%*	"9U3Z1_PUVYPZ^dgh^hPh 
 
 $
c
T!&99eCj4>OTg=g 
	 

 y>Aj&sHegYG	&sHegx=PQ	
x
%/
 
 E%L	

 ,X7RS
 S_
 !#i.
 c+.
  Z
 Z
 "3y>
 "5Y#j/)I1#M
 j!n
 "9Ra=
 3}-
  Ig.!
" Ig.#
$ "),!),'
	* '9&C	"#)$g3%j OO
   O
OO  lj llhhh	f #& 	5F; 	D$	
 	T+& 	^, 	T+& 	"#>#B#BC\#] 	w 	. 	!#j/ 	()? 	"#3 	#$5 	#E  	9!" 	j#$ 	j% W >




s   K')K,/K1%K6c                6   | d   D cg c]q  }dt        j                  t        |j                  d      xs d             d|d    d|d    dt        j                  t        |j                  d	                   d
	s }}g }| d   d t         D ]  }|j                  dt        j                  |d          dt        j                  |d          dt        j                  |d          dt        j                  |d          d|d    d|d    d|d    d|d    d|d    dt        j                  t        |d                dt        j                  dj                  |d   d d       xs d       d|d    d|d     d
        d!j                  g d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6| d7    d8| d9    d:| d;    d<| d=    d>| d?    d@| dA    dBdCt        j                  | dD          dEdFdG|dHdIdJ|dHdKdLdM      S c c}w )NNr   z<tr><td>r   r   z	</td><td>rW   r   rX   r   z
</td></tr>r   z<tr><td><code>r   z</code></td><td><code>r   z</code></td><td>r   r   r   /r   r   r   r   r   r   rU      z</td><td>text=r   z data=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>map1_01a Root Point Scan</title>z	  <style>zg    :root { color-scheme: dark; font-family: system-ui, sans-serif; background: #101010; color: #eee; }z&    body { margin: 0; padding: 24px; }z,    h1 { margin: 0 0 8px; font-size: 24px; }z/    h2 { margin: 24px 0 8px; font-size: 18px; }z<    p { max-width: 1120px; color: #bbb; line-height: 1.45; }z[    table { width: 100%; border-collapse: collapse; margin: 12px 0 20px; font-size: 13px; }zi    th, td { border-bottom: 1px solid #303030; padding: 7px 8px; text-align: left; vertical-align: top; }zF    th { position: sticky; top: 0; background: #181818; color: #ddd; }z    code { color: #d7f0ff; }z
  </style>z</head>z<body>z#  <h1>map1_01a Root Point Scan</h1>z  <p>route <code>r   z -&gt; r   z</code>; selector <code>r   z</code> root <code>r   z </code>; exact exit candidates: r   z; promotion <code>r   z</code></p>z  <p>r   z</p>z  <h2>Exit Samples</h2>zT  <table><thead><tr><th>side</th><th>tile</th><th>component</th></tr></thead><tbody>z  </tbody></table>z  <h2>Top Candidates</h2>z  <table><thead><tr><th>field</th><th>payload</th><th>class</th><th>role</th><th>raw/in-bounds</th><th>edge</th><th>exact exit</th><th>scriptish</th><th>first points</th><th>first values</th><th>refs</th></tr></thead><tbody>z</body>z</html> )htmlescaper3   r   REPORT_LIMITr[   r   r   )summaryr   sample_rowscandidate_rowsr   s        r-   	html_pager   Q  s    =) 	{{3swwv5#678 93xj#c( ${{3sww'789:; <	K  N\*=L9 
	Y|%<=> ?Y~%>?@ A;;y)9:;< =;;y678 9_-.a	:N0O/P Q-./ 0012 3234 5;;z)4D*EFGH I;;tyy=)A"1)EFM#NO P!.12&>9R8S T	

  99 %%% 	% 	#	%
 	Q% 	4% 	% 	r% 	1% 	7% 	:% 	G% 	f% 	t% 	Q%  	'!%" 	#%$ 	%%& 	'%( 	.)%* GH-.ggh6G5H I!*-..A'.BYAZ ["")*C"D!E F"#456k	C+%2 GL123483%4 	"5%6 	_7%8 
9%: 	;%< 	$=%> 	k?%@ 
A%B 	C%D 	E%F 	G%H 	I% % %3s   A6Hc                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_okmap1_01a_root_point_scan.jsonFr   )ensure_asciiindentr   r:   r;   )mkdir
write_textr@   dumps)r   out_dirs     r-   write_outputsr	    sC    MM$M...::

7q9D@ ; r/   c                    t        j                  t              } | j                  dt        t
        dz         | j                  dt        t        dz         | 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                  |j                  j!                  d            t        j                  |j"                  j!                  d            t        j                  |j$                  j!                  d                  }t'        ||j(                         t+        d|j(                  dz          y )N)descriptionz--exezHwanse2.exe)typedefaultz--mapszmaps.jsz--save-scene-selectorszsave_scene_selectors.jsonz--map-exit-candidateszmap_exit_candidates.jsonz--current-root-frontier-pathsz.save_selector_current_root_frontier_paths.jsonz	--out-dirr:   r;   z"wrote map1_01a root point scan -> r  )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsr   rM   
read_bytesrG   mapsr@   rA   r   r=   r   r   r	  r  print)parserargsr   s      r-   mainr    sx   $$9F
dD=4HI
tS9_E
0tSKfEfg
/dCJdDde
7dC  SC  MC  D
$<Ddii 

4,,666HI

4++55w5GH

433==w=OPG '4<<(	.t||>]/].^
_`r/   __main__)r,   r5   returnr3   )r,   z
str | Noner  ztuple[int, int] | None)rD   r   r  dict)rM   bytesrN   
list[dict]rO   r5   r  z
int | None)rM   r  rN   r  r\   r5   r]   r5   r^   r5   r  r  )r   )rM   r  rN   r  r,   r5   rn   zset[str]rw   r5   r  r  )r   r  r  r  )r   r  r  r  )r   r5   r   r  r  r3   )r   r  r  r3   )r   )r   r  r   r5   r  r3   )rM   r  r   r  r   r  r   r  r   r  r  r  )r   r  r  r3   )r   r  r  r   r  None)r  r   )-r  
__future__r   r  r   r@   rK   syspathlibr   rD   insertr3   __file__resolveparentprobe_exe_scene_tablesr   r   r   r  r  r   r   r   r   rZ   r   r   r.   r8   rG   rQ   re   r{   r   r   r   r   r   r   r   r	  r  __name__r+   r/   r-   <module>r*     s   U "     
  3tH~--/667 8 > H~''*
Ul	 B(84H 0	00 0 	0
 0 
0D@!23 Vk	kk %k $	k
 "&k 
k\?D 25 a( zF r/   