
    UHjJ                       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 ddlmZmZ  e	e      j!                         j.                  d   Zed	z  Zd
ZdZg dZg dZg dZdg dd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/dZ%d0dZ&d1dZ'	 d2	 	 	 	 	 	 	 	 	 	 	 	 	 d3d Z(d4d!Z)d5d"Z*	 d6	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d7d#Z+	 	 	 	 	 	 	 	 	 	 d8d$Z,d9d%Z-d9d&Z.efd:d'Z/d;d(Z0e1d)k(  r e0        yy)<zHClassify the current frontier reader payloads as sprite/image rect data.    )annotationsN)Path)Any)read_point_table)read_sectionsva_to_offset   outmap1_01amap2_02d)zin-bounds-source-point-tablezpayload-text-or-code-referencezstrict-hotspot)z8payload decodes as in-bounds map1_01a source point tablez9code/text reference tying payload to a transition hotspotz2strict map1_01a source hotspot in resource payload)z>decode payload as an in-bounds map1_01a point or hotspot tablezAfind code/text refs tying payload to transition hotspot semanticsz;find strict hotspot evidence outside resource payload shapeHwanse2.exe).text.rdata.data)pathfieldszout/cns_payloads.json)namewidthheightkindzout/maps.js)r   r   r   z5out/save_selector_frontier_reader_branch_context.json)siblingGatespassOutcomeevidenceRefsevidenceRefCountc                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)r   fallbacks     K/home/exedev/hwanse/tools/summarize_save_selector_frontier_payload_shape.py	load_jsonr%   :   s*    ;;=::dnngn677    c                   | j                  d      }d}|j                  |      r|j                         j                  d      st	        |  d      t        j                  |t        |      d  j                  d            S )Nr   r   zwindow.HWANSE_MAPS = ;z. does not contain the expected maps.js wrapperz;
)r"   
startswithrstripendswith
ValueErrorr    r!   len)r   textprefixs      r$   load_maps_jsr0   @   sn    >>7>+D$F??6"$++-*@*@*ED6!OPQQ::d3v;=)00788r&   c                    | y d| dS )N0x08x values    r$   hex32r7   H   s    }c{r&   c                <    t        | t              sy t        | d      S )N   )
isinstancestrintr5   s    r$   int_from_hexr=   N   s    eS!ub>r&   c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )N   <Ir   )r   r-   structunpack_from)exesectionsvaoffsets       r$   dword_at_varG   T   s?    (B'F~!c#h.dC033r&   c                |    g }t        |      D ]+  }t        | |||dz  z         }| |S |j                  |       - |S )Nr?   )rangerG   append)rC   rD   start_vacountvaluesindexr6   s          r$   read_dwordsrO   [   sS    Fu C8eai+?@=M 	e	
 Mr&   c                T    | D ]#  }|d   }|d   |d   z   }||cxk  r	|k  s|c S  % y )Nrawraw_sizer4   rD   rF   sectionstartends        r$   section_for_offsetrW   e   sI     enwz22F S N !
 r&   c                h    | D ]-  }|d   }|d   |d   z   }||cxk  r|k  sn "|d   |z   |z
  c S  y )NrQ   rR   rE   r4   rS   s        r$   offset_to_varY   n   sS     2enwz22F S 4=6)E11	2
 r&   c           
        d}g }|D ]  }|d   |vr|d   }	|d   |d   z   }
| |	|
 }t        dt        dt        |      dz
              D ]p  }t        j                  d||      d   }||cxk  r|k  sn +|dz  }t        |      |k\  r?|d   |z   }|j                  |d   t        |      t        |      d	       r  ||d
S )Nr   r   rQ   rR      r@   r	   rE   )rT   refVaHexvalueHex)rL   samples)rI   maxr-   rA   rB   rJ   r7   )rC   rD   rK   end_vasection_namessample_limitrL   r^   rT   	raw_startraw_endrQ   rN   r6   ref_vas                  r$   scan_refs_to_rangerf   w   s     EG 6?-/EN	%.7:#66)G$1c!SX\23 	E&&tS%8;E..QJE7||+T]U*FNN"6?!&M!%L 	& w//r&   c                p    | D ci c]&  }|j                  d      s|j                  d      |( c}S c c}w )Nr   get)cns_payloadsrows     r$   	cns_indexrl      s-    ,8LSCGGFOCGGFOS LLLs   33c                    t        |       dk7  rd| dS | \  }}}}d|cxk  xr |cxk  xr |k  nc xr d|cxk  xr |cxk  xr |k  nc }||||||z
  ||z
  |t        d | D              dS )Nr?   F)validrM   r   c              3  ,   K   | ]  }|d z  dk(    yw)r9   r   Nr4   ).0r6   s     r$   	<genexpr>z!rect_from_quad.<locals>.<genexpr>   s     $IURZ1_$Is   )x0y0x1y1r   r   rn   allValuesMultipleOf16)r-   all)rM   r   r   rr   rs   rt   ru   rn   s           r$   rect_from_quadrx      s    
6{a&11NBB!b!E!<a2&<&<f&<Ebr'!$$I&$I!I	 	r&   c                   t        | |||      }g }	d}
d }t        dt        |      dz
  d      D ]T  }t        |||dz          }|dz  |d<   t	        ||dz  z         |d<   |	j                  |       |d   r||
dz  }
P|S|}V t        | ||||      \  }}t        | ||||dz  z   dh      }t        | ||||dz  z   d	d
h      }t        fd|D              }|
dkD  rt        |      dk(  r
|d   dk(  rdnd}t	        |      t        |      |t        |	      |
||	d d |
rt        d |	d |
 D              ndt        |      t        |      |d d |d d d|d   |d   |d   |ddS )Nr   r[   r?   rN   vaHexrn   r	   r   r   r   c              3  B   K   | ]  }|t              k  sd   yw)r	   N)r_   )rp   r6   image_heightimage_widths     r$   rq   z"analyze_payload.<locals>.<genexpr>   s     XU[,9W0WqXs   rL   sprite-source-rect-table-likezunclassified-payload   c              3  >   K   | ]  }|j                  d         yw)rv   Nrh   )rp   rects     r$   rq   z"analyze_payload.<locals>.<genexpr>   s      .
26DHH,-.
s   F)rawPointCountinBoundsPointCountfirstRawPointsfirstInBoundsPointsr^   )payloadVaHexsampleDwordCountscalarWithinImageBoundCountrectSampleCountcontiguousValidImageRectCountfirstInvalidRect
firstRectsallContiguousRectsMultipleOf16	pointScanrangeTextRefCountrangeDataRefCountrangeDataRefsclassificationpromotionEvidence)
rO   rI   r-   rx   r7   rJ   r   rf   sumrw   )rC   rD   
payload_var}   r|   source_widthsource_heightsample_dword_countdwordsrectscontiguous_validfirst_invalidrN   r   
raw_points	in_bounds
range_text
range_datascalar_countr   s      ``               r$   analyze_payloadr      s    h
4FGFEMq#f+/1- !fU5195{LQ
Wj51945WT=]2!" M! -S(JVcdJ	#C:zL^abLb?beldmnJ#C:zL^abLb?belnvdwxJXfXXL aC	Na$7Jw<OST<T 	(#  j)K'3u:)9)BQi  +. .
:?@QAQ:R.
 +
#( _"%i.(!n#,Ra=	
 (0'0#I.("+ r&   c                    t        |       }t        |      }|t           }t        |d         }t        |d         }g }	|j	                  d      xs g D ]#  }
|
j	                  d      xs i j	                  d      }|j	                  |xs d      xs i }t        |
j	                  d            }|r|r|bt        | ||t        |j	                  d      xs d      t        |j	                  d      xs d      ||      }|	j                  |
j	                  d	      |
j	                  d
      ||j	                  d      |j	                  d      |j	                  d      |
j	                  d      ||d   dd
       & t        d |	D              }t        d |	D              }t        d |	D              }t        |	      xr t        d |	D              }d}i dt        dt        d||dd|j	                  d      d|j	                  d      xs i j	                  d      dt        |	      dt        d |	D              d|d |d!|d"|d#|	d$dd%dd&t        d't        d(t        t         t        t               dd)|d*S )+Nr   r   r   falseTargetKindcns trueFallthroughValueHexr   branchVaHexselectionBufferOffsetHexr   r   F)
r   r   resourceCnsresourceKindresourceWidthresourceHeightr   payloadr   r   c              3  J   K   | ]  }|j                  d       dk(  sd  yw)r   r~   r	   Nrh   rp   rk   s     r$   rq   z build_summary.<locals>.<genexpr>  s"     lsww7G/HLk/k!l   ##c              3     K   | ]<  }|j                  d       xs i j                  d      xs i j                  dd       > yw)r   r   r   r   Nrh   r   s     r$   rq   z build_summary.<locals>.<genexpr>  s>     |psSWWY/52::;GM2RRSgijk|s   AAc              3  f   K   | ])  }|j                  d       xs i j                  dd       + yw)r   r   r   Nrh   r   s     r$   rq   z build_summary.<locals>.<genexpr>  s-     `TW#''),2778KQO`s   /1c              3  l   K   | ],  }|j                  d       xs i j                  dd      dkD   . yw)r   r   r   Nrh   r   s     r$   rq   z build_summary.<locals>.<genexpr>  s4      xlo#'')"4":!?!?@_ab!cfg!g xs   24aT  The 0x00542b0c reader pass payload and its sibling payloads fit the paired character CNS image dimensions as source-rectangle tables. They do not decode as in-bounds map1_01a tile point tables and have no .text refs in the sampled payload windows, so they remain sprite/resource payload evidence rather than a strict map transition hotspot.sourcetargetsourceMapSize)r   r   readerVaHexreaderPassPayloadVaHexr   r]   	gateCountresourceImageGateCountc              3  J   K   | ]  }|j                  d       dk(  sd  yw)r   imager	   Nrh   r   s     r$   rq   z build_summary.<locals>.<genexpr>  s!     %^C377>;RV];]a%^r   rectLikePayloadGateCountallPayloadsFitPairedImagessourceInBoundsPointCountpayloadTextRefCountrows
proofFound frontierPayloadHotspotProofFoundfailedFrontierPayloadGateIdsmissingEvidenceremainingProofsblocked)r   r   strictHotspotFoundpromotionStatus
conclusion)r   rl   SOURCEr<   ri   r=   r   rJ   r   boolrw   TARGETr-    FAILED_FRONTIER_PAYLOAD_GATE_IDS!FRONTIER_PAYLOAD_MISSING_EVIDENCE!FRONTIER_PAYLOAD_REMAINING_PROOFSFRONTIER_PAYLOAD_EVIDENCE_REFS)rC   rj   map_datafrontier_reader_branch_contextrD   payloads_by_name
source_mapr   r   r   gater   r   r   r   rect_like_countin_bounds_pointstext_ref_countall_fitr   s                       r$   build_summaryr      s    S!H .&!Jz'*+L
8,-MD.22>BHb xx)*0b55e< $$SYB/52!$((+D"EF
%:#5!		'"'a(		(#(q)
 	88M2(,1K(L!IIf-"YYw/#ii1 HH%>?%&67!&
 	6 ltllO|w{||`[_``N4jxS xsw xxG	7 && 	<=I 	599-H	
 	!$B$F$F}$U$[Y[#`#`ak#l 	SY 	!#%^4%^"^ 	#O 	%g 	#$4 	~ 	 	e 	+E 	'(H  	<!" 	<#$ 7 >?#$ - r&   c                j   ddd| j                  d       d| j                  d       dd| j                  d	       dd
| j                  d       dd| j                  d       d| j                  d       d| j                  d       d| j                  d       d| j                  d       d| j                  d       d| j                  d       ddj                  | j                  d      xs g       xs d dt        | j                  d      xs g        d | j                  d!       d"| j                  d#       dd| j                  d$      xs ddd%dg}|j                  d& | j                  d      xs g D               |j                  g d'       | j                  d(      xs g D ]  }|j                  d)      xs i }|j                  d*      xs i }|j	                  d+|j                  d,       d-|j                  d.       d/|j                  d0       d1|j                  d2       d3|j                  d4       d5|j                  d6       d/|j                  d7       d1|j                  d8       d9|j                  d:       d;|j                  d<       d1|j                  d=       d>        |j                  g d?       | j                  d(      xs g D ]<  }|j                  d)      xs i }|j	                  d@|j                  d0       dA|j                  d6       d       |j	                  d       |j	                  dB       |j	                  dC       |j                  dD      xs g D ]  }|j	                  dE|j                  dF       d5|j                  dG       d/|j                  dH       dI|j                  dJ       dK|j                  dL       dI|j                  dM       d1|j                  dN       d>        |j	                  d       ? dOj                  |      S )PNz&# Save Selector Frontier Payload Shaper   z
- route: `r   z -> r   `z- reader: `r   z- reader pass payload: `r   z- rect-like payload gates: r   /r   z"- all payloads fit paired images: r   z - source in-bounds point count: r   z- payload text ref count: r   z- proof found: r   z(- frontier payload hotspot proof found: r   z!- failed frontier payload gates: z, r   -z- missing evidence count: r   z- evidence refs: r   z- promotion status: `r   r   z## Missing Evidencec              3  &   K   | ]	  }d |   yw)z- Nr4   rp   items     r$   rq   zmarkdown.<locals>.<genexpr>G  s     N2dVNs   )r   z## Payload Gatesr   zU| branch | offset | resource | image | payload | class | rects | points | text refs |z9| --- | --- | --- | --- | --- | --- | ---: | --- | ---: |r   r   r   z| `r   z` | `r   z` | r   z | r   xr   z | `r   r   r   z | raw=r   , inBounds=r   r   z |)r   z## First Rectanglesr   z### z / `z| index | VA | rect | valid |z| ---: | --- | --- | --- |r   z| rN   rz   rr   ,rs   ..rt   ru   rn   
)ri   joinr-   extendrJ   )summarylinesrk   r   pointsr   s         r$   markdownr   0  s+   0

W[[*+4H0E/FaH
gkk-013
"7;;/G#H"IK
%gkk2L&M%NaPWP[P[\gPhOij
,W[[9U-V,WX
*7;;7Q+R*ST
$W[[1F%G$HI
'++l345
27;;?a3b2cd
+DIIgkkB`6a6geg,h,olo+pq
$S5F)G)M2%N$OP
GKK(:;<=
,= >?qA
L!'R

)E, 
LLN5F)G)M2NN	LL   {{6"(b 

'')$*[)/R#''-()sww7Q/R.SSWww}%&c#''/*B)C1SWWM]E^D_ `'(SWW5E-F,Gs{{:;< =::o./{6::FZ;[:\\_{{./04	


 
LL01{{6"(b '')$*tCGGM2348O7PPQRSR4512KK-3 	DLLTXXg&'tDHHW,=+>d88D>"!DHHTN#32dhhtn5EQtxxPT~FVVY88G$%R)	 	R 99Ur&   c           *     
   g }dj                  d | j                  d      xs g D              }dj                  d | j                  d      xs g D              }| j                  d      xs g D ]  }|j                  d      xs i }|j                  d      xs i }|j                  d	t        j                  t        |j                  d
                   dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   d|j                  d       d|j                  d       dt        j                  t        |j                  d                   dt        j                  t        |j                  d                   d|j                  d       d|j                  d       d|j                  d       d|j                  d       d        g }| j                  d      xs g D ]^  }g }|j                  d      xs i j                  d      xs g D ]  }	|j                  d|	j                  d       dt        j                  t        |	j                  d                    d|	j                  d!       d"|	j                  d#       d$|	j                  d%       d"|	j                  d&       d|	j                  d'       d        |j                  d(t        j                  t        |j                  d                   d)t        j                  t        |j                  d                   d*dj                  |       d+       a d,j                  d-d.d/d0d1d2d3d4d5d6d7t        j                  t        | j                  d8                   d9t        j                  t        | j                  d:                   d;t        j                  t        | j                  d<                   d=t        j                  t        | j                  d>                   d?| j                  d@       dA| j                  dB       dC| j                  dD       dE| j                  dF       dG| j                  dH       dIt        | j                  d      xs g        dJ| j                  dK       dLt        j                  t        | j                  dM                   dNdOt        j                  | j                  dP      xs d       dQdR| dSdT| dSdUdVdWdj                  |       d+dXg|dYdZd      S )[Nr   c              3  N   K   | ]  }d t        j                  |       d  ywz<li>z</li>Nhtmlescaper   s     r$   rq   zhtml_page.<locals>.<genexpr>m  s(      ,0$t{{4 !'   #%r   c              3  N   K   | ]  }d t        j                  |       d  ywr   r   r   s     r$   rq   zhtml_page.<locals>.<genexpr>p  s#     g$T[[./u5gr   r   r   r   r   z<tr><td><code>r   z</code></td><td><code>r   z</code></td><td>r   z	</td><td>r   r   r   z</td><td><code>r   r   r   z</td><td>raw=r   r   r   r   z
</td></tr>r   z<tr><td>rN   rz   rr   r   rs   r   rt   ru   rn   z<h3>z	 / <code>zf</code></h3><table><thead><tr><th>index</th><th>VA</th><th>rect</th><th>valid</th></tr></thead><tbody>z</tbody></table>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">z5  <title>Save Selector Frontier Payload Shape</title>a$    <style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;margin:24px}table{border-collapse:collapse;width:100%;max-width:1280px;margin-bottom:22px}td,th{border:1px solid #333;padding:6px 8px;text-align:left;vertical-align:top}th{background:#1f1f1f}code{color:#9bd4ff}</style>z</head>z<body>z/  <h1>Save Selector Frontier Payload Shape</h1>z  <p>route <code>r   z -&gt; r   z</code>; reader <code>r   z#</code>; reader pass payload <code>r   z'</code>; rect-like payload gates <code>r   r   r   z,</code>; source in-bounds point count <code>r   z</code>; proofFound <code>r   z0</code>; frontierPayloadHotspotProofFound <code>r   z$</code>; missingEvidenceCount <code>z</code>; evidence refs <code>r   z </code>; promotion status <code>r   z</code>.</p>z  <p>r   z</p>z,  <h2>Failed Frontier Payload Gates</h2><ul>z</ul>z  <h2>Missing Evidence</h2><ul>z  <h2>Payload Gates</h2>z  <table><thead><tr><th>branch</th><th>offset</th><th>resource</th><th>image</th><th>payload</th><th>class</th><th>rects</th><th>points</th><th>text refs</th></tr></thead>z	  <tbody>z  <h2>First Rectangles</h2>z</body>z</html>)r   ri   rJ   r   r   r;   r-   )
r   r   failed_gatesmissingrk   r   r   rect_tables	rect_rowsr   s
             r$   	html_pager   k  sY   D77 4;KK@^4_4ece L ggg'++N_B`BfdfggG{{6"(b 
'')$*[)/RS)?%@AB CS1K)L%MNO P;;s377=#9:;< =77?+,Acgg6F.G-H IS)@%ABC D;;s377+;#<=>? @;;>?@ Azz/23;vzzJ^?_>` a;;234 5
	

  K{{6"(b 
	WWY'-222<@FB 	Dxx() *![[TXXg->)?@A Bxx~&a'7r$((4.9I488TX>JZ [xx() *		 	4;;s377=#9:;<IdkkRUVYV]V]^lVmRnFoEp qggi())9;	

  99"P? 	o9
DKKGKK,A(BCDGDKKX[\c\g\ghp\qXrLsKt uCM(B$CDE F%%)[[W[[AY5Z1[%\$] ^))05O)P(QQRSZS^S^_jSkRl m..5kk:T.U-V W#KK56 7229++>`2a1b c&&)'++6G*H*NB&O%P Q&{{+=>? @""&++c'++>O2P.Q"R!SS_		a GKK5;<=TB
6|nEJ
)'%8" 	v
BGGDM?"23%7 8 
9 : 	; < 	= > 	?     r&   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_ok)save_selector_frontier_payload_shape.jsonF   )ensure_asciiindentr   r   r   )mkdir
write_textr    dumps)r   out_dirs     r$   write_outputsr    sD    MM$M.::FF

7q9D@ G r&   c            	        t        j                  t              } | j                  dt        t
        dz         | j                  dt        t               | j                         }t        |j                  j                         t        |j                  dz  g       t        |j                  dz        t        |j                  dz  i             }t        ||j                         t        d	|j                  d
z          y )N)descriptionz--exer   )typedefaultz	--out-dirzcns_payloads.jsonzmaps.jsz1save_selector_frontier_reader_branch_context.jsonz wrote frontier payload shape -> r   )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsr   rC   
read_bytesr%   r  r0   r  print)parserargsr   s      r$   mainr    s    $$9F
dD=4HI
$<D$,,!44b9T\\I-.$,,!TTVXY	G '4<<(	,T\\<g-g,h
ijr&   __main__)r   r   r#   r   returnr   )r   r   r  dict)r6   
int | Noner  
str | None)r6   r  r  r  )rC   bytesrD   
list[dict]rE   r<   r  r  )
rC   r  rD   r  rK   r<   rL   r<   r  	list[int])rD   r  rF   r<   r  zdict | None)rD   r  rF   r<   r  r  )   )rC   r  rD   r  rK   r<   r`   r<   ra   zset[str]rb   r<   r  r  )rj   r  r  zdict[str, dict])rM   r  r   r<   r   r<   r  r  )    )rC   r  rD   r  r   r<   r}   r<   r|   r<   r   r<   r   r<   r   r<   r  r  )
rC   r  rj   r  r   r  r   r  r  r  )r   r  r  r;   )r   r  r  r   r  None)r  r"  )2r  
__future__r   r  r   r    rA   syspathlibr   typingr   r   insertr;   __file__resolveparentextract_scene_eventsr   probe_exe_scene_tablesr   r   r   r  r  r   r   r   r   r   r   r%   r0   r7   r=   rG   rO   rW   rY   rf   rl   rx   r   r   r   r   r  r  __name__r4   r&   r$   <module>r.     s#   N "     
   3tH~--/667 8 1 > H~''*
Ul		$  
% !
% ! .
 (5
 1
 HU" (894 0	00 0 	0
 0 0 
0@M2 !6	66 6 	6
 6 6 6 6 
6rH	HH H %)	H
 
HV8vGT 25 k zF r&   