
    UHjq                       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m	Z	 ddl
mZ ddlmZ ddlmZmZmZmZ  ee      j)                         j*                  d   Zed	z  Z e ed
dd            ZdZddddddddfZdDdZdEdZdFdZdGdZ dHdIdZ!dJdZ"dKdZ#dLdZ$dMdZ%	 	 	 	 	 	 	 	 	 	 	 	 dNdZ&dOdZ'ed 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dPd!Z(ed 	 	 	 	 	 	 	 	 	 	 	 	 	 dQd"Z)	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dRd#Z*	 	 	 	 	 	 	 	 	 	 	 	 	 	 dSd$Z+dTdUd%Z,dVd&Z-dWd'Z.	 	 	 	 	 	 	 	 	 	 dXd(Z/dYd)Z0dZd*Z1d[d+Z2d,d-d.d/d0d1dd2d3d4d5d6d.d/d0d1dd2d7d0ddd8d9d:d;giZ3d\d<Z4	 	 	 	 	 	 	 	 	 	 d]d=Z5d^d>Z6d_d?Z7d`d@Z8dadAZ9dbdBZ:e;dCk(  r e< e:             y)ca  Scan EXE-side frame rectangle tables for non-map CNS image assets.

Monster sprites already proved a common `u32 x1,y1,x2,y2` table shape.  This
scanner applies that same shape to every non-map CNS image and follows the
descriptor-side pointer field rather than assuming the table always belongs to
the filename immediately before it.  Character tables are often chained, so a
table usually ends at the next referenced table start.
    )annotationsN)Counterdefaultdict)Path)Any)find_cns_stringsoffset_to_varead_sectionsva_to_offset   outiD      i   u32-xyxy-excl   Fschemastride
hasOffset2zu32-xyxy-excl-offset2   Tc                p    	 t        j                  | j                  d            S # t        $ r |cY S w xY w)Nutf-8encoding)jsonloads	read_textFileNotFoundError)pathfallbacks     >/home/exedev/hwanse/tools/probe_cns_frame_rect_exe_patterns.py	load_jsonr"   !   s5    zz$..'.:;; s   $' 55c                    | y d| dS )N0x08x values    r!   hex32r)   (   s    }c{    c                ,    t        |       j                  S N)r   stem)names    r!   	asset_keyr/   .   s    :??r*   c                2    ddddddj                  | |       S )Nu   전투/효과u	   캐릭터u   몬스터/오브젝트u   얼굴u   아이템/UI/문구)battle	characterenemy-objectfaceui-miscget)categorys    r!   category_labelr9   2   s)    ! 0( 
c(Hr*   c                    t        j                  | d      }|dk(  rd| S |dk(  rd| S |dv rd| S |d	k(  r
| d
k(  rd| S |d	k(  rd| S d| S )NT)quoter3   z!../web/monster_review.html?asset=r2   z)../web/field_character_review.html?asset=>   r4   r5   z#../web/ui_window_review.html?asset=r1   btl_etcz.../web/battle_effect_visual_review.html?asset=z"../web/cns_rect_review.html?asset=)htmlescape)assetr8   encodeds      r!   review_href_for_assetrA   <   s    kk%t,G>!27)<<;:7)DD&&4WI>>8 24WI>>8?yII/y99r*   c                d    |dk  s|dz   t        |       kD  ry t        j                  d| |      d   S )Nr   r   <I)lenstructunpack_from)dataoffsets     r!   dword_at_offsetrI   K   s5    zVaZ#d)+dD&1!44r*   c                    t        j                  d|      }g }d}	 | j                  ||      }|dk  r	 |S |dz   }t        ||      }|/|j	                  ||d       C)NrC   r   r   )
fileOffsetrefVa)rE   packfindr	   append)rG   sectionsr(   needlerefssearchhitref_vas           r!   find_value_refsrV   Q   su    [[u%FDF
ii'7 K qh,>389 r*   c                    | D cg c]  }t        |       c}\  }}}}||z
  }||z
  }|dk  s|dk  ry ||||dS c c}w )Nr   xywhint)valuesr(   x1y1x2y2r[   r\   s           r!   source_rect_from_valuesrd   a   sT    .45Uc%j5NBB
RA
RAAva"11-- 6s   ;c                    t        | d         }t        | d         }t        | d         }t        | d         }|dk  s|dk  s
|dk  s|dk  ry||k\  s||k\  ry||kD  s||kD  ry||z   |k  xr ||z   |k  S )NrY   rZ   r[   r\   r   Fr]   )rectwidthheightrY   rZ   r[   r\   s          r!   valid_source_rectri   j   s    DIADIADIADIA1uAa16EzQ&[5yAJq5E>-a!evo-r*   c                    t        |d         }|dk  s||z   t        |       kD  ry t        t        j                  d| |            }|t        |||      sy |j                  d      r't        j                  d| |dz         \  }}||d<   ||d<   |S )	Nr   r   z<IIIIr   z<iir   offsetXoffsetY)r^   rD   rd   rE   rF   ri   r7   )	rG   rH   rg   rh   specr   rf   offset_xoffset_ys	            r!   decode_rect_at_schemarp   x   s     h FzVf_s4y0"6#5#5gtV#LMD|,T5&Axx#//tVb[I("Y"YKr*   c                .    t        | |||t        d         S Nr   )rp   SCHEMA_SPECS)rG   rH   rg   rh   s       r!   decode_rect_atrt      s     vufl1oNNr*   	max_rectsc                   t        ||      }|g S t        |d         }g }	t        |      D ]-  }
t        | ||
|z  z   |||      }| |	S |	j	                  |       / |	S )Nr   )r   r^   rangerp   rO   )rG   rP   table_start_varg   rh   rm   rv   startr   rectsindexrf   s               r!   decode_until_invalid_schemar}      s     >2E}	h FEy! $T556>+A5&RVW<L 	T	
 Lr*   c          	     4    t        | ||||t        d   |      S )Nr   ru   )r}   rs   )rG   rP   ry   rg   rh   rv   s         r!   decode_until_invalidr      s*     'Q r*   c                ,   |||k  ry t        ||      }t        ||      }||||k  ry ||z
  }	t        |d         }
|	|
z  ry |	|
z  }|dk  s	|t        kD  ry g }t        |      D ],  }t	        | |||
z  z   |||      }| y |j                  |       . |S )Nr   r   )r   r^   	MAX_RECTSrx   rp   rO   )rG   rP   ry   boundary_varg   rh   rm   rz   boundarybyte_lenr   countr{   r|   rf   s                  r!   decode_bounded_schemar      s     k^;>2EHk2H}(H,=%Hh F&EzUY&Eu $T556>+A5&RVW<T	
 Lr*   c           
     2    t        | |||||t        d         S rr   )r   rs   )rG   rP   ry   r   rg   rh   s         r!   decode_boundedr      s#     !xeU[]ijk]lmmr*   c                D    | d | D cg c]  }t        |       c}S c c}w r,   )dict)r{   limitrf   s      r!   rect_sampler      s     #(%=14DJ111s   c                   i }| D ]\  }|j                  d      xs' t        t        |j                  d      xs d            }|sAt               }i }|j                  d      xs i }|j                  d      }t	        |t
              r|dkD  r|j                  |       |g|d<   |j                  d      xs i }t	        |t              r|j                  d      nd }	t	        |	t              r|	rt        |	      nd }
t	        |
t
              r|j                  |
       t	        |
t
              r|
nd t	        |t              r|j                  d	      nd t        |      |d
||<   _ |S )NassetKeycns 	frameHint
frameCountr   confirmedFramesr{   source)knownFrameCountknownFrameCountSourceautoCountSetautoCountsByMode)r7   r/   strset
isinstancer^   addr   listrD   sorted)
asset_rowsr   rowr?   countscounts_by_mode
frame_hint
hint_count	confirmedconfirmed_rectsknown_counts              r!   frame_count_hintsr      s<   
C 

#KySWWU^5Ir1J'KWW[)/R
^^L1
j#&:>JJz"+5,N;'GG-.4"	4>y$4O)--0UY.8$.OTcc/*imk3'JJ{#.8c.J{PT@J9VZ@[Y]]8%<ae"6N .	
E
!
, Jr*   c                   | j                  d      xs g }|r|S g }|D ]  }|j                  d      dk7  rt        |j                  d      xs d      }t        |      }|r|j                  d      rU|j	                  |||j                  d      rdnd	d|j                  d
      |j                  d      d        t        |d       S )Nrowskindimager.   r   map_)bosszr3   r5   rg   rh   )r   r   r8   categoryLabelrg   rh   c                    | d   S )Nr   r&   items    r!   <lambda>z"rows_from_assets.<locals>.<lambda>  s    T*-= r*   key)r7   r   r/   
startswithrO   r   )asset_summarypayloadsr   r    r   r.   r-   s          r!   rows_from_assetsr     s    V$*DH 
776?g%3776?(b)tv. .2oom.LNR[!#)''(+		

" ( =>>r*   c                2   t        t              }|j                         D ]  \  }}||   j                  |        g }t	               }|D ]I  }	t        |	j                  d      xs d      }
t        |	j                  d      xs t        |
            }t        |	j                  d      xs d      }t        |	j                  d      xs d      }|
r
|dk  s|dk  rt        |j                  |
g             D ]  }t        | ||      D ]  }t        |d         }t        |d         }t        D ]\  }||z   }t        | |      }|t        ||      $t        D ]/  }t        | |||||d	
      }t!        |      dk  r%||||||d   |d   f}||v r9|j#                  |       |j                  i d|d|
d|	j                  d      xs dd|	j                  d      xs' t%        t        |	j                  d      xs d            d|d|d|dt'        |      d|dt'        |      d|dd|dd|d|dd||z   dt'        ||z         d|t'        |      t!        |      |d   |d   |j                  dd      d        2 _   L |S )!Nr   r   r   rg   r   rh   rK   rL      ru      r   r   r?   r8   r   stringVastringVaHexrefVaHexrefFileOffsetrefFileOffsetHexr$   06xfieldRel
fieldLabelz+dfieldVa
fieldVaHextableStartVar   F)tableStartVaHexinitialValidRectCountr   r   r   )r   r   itemsrO   r   r   r7   r/   r^   r   rV   
FIELD_RELSrI   r   rs   r}   rD   r   r9   r)   )rG   rP   stringsr   name_to_vasvar.   seedsseenr   r   r?   rg   rh   	string_varef
ref_offsetrU   relfield_offsetr(   rm   initial_rectsr   s                           r!   collect_candidate_seedsr     s>    )4D(9KMMO %DD  $% E5D 9#''%.&B'CGGJ'99S>:CGGG$)*SWWX&+!,eqjFaKR 89 2	I&tXyA 1 \!23
S\*% .C#-#3L+D,?E}Xu(E(M  , )(C $!!" &') }-1$$ieT(^UYZbUcd$;$ ' %s !+CGGJ,?,E2 !01I1{^\_`c`g`ghr`s`ywy\zM{	
 !( !)& !+I !.uY/? !( !+E&M !0 !3bC8H4I !+C !-R !*6C<  !-eFSL.A!" !/#$ 49<9<]9K*.x.*.x..2hh|U.K-!).12	9t Lr*   c                $    |D ]  }|| kD  s	|c S  y r,   r&   )ry   table_starts	candidates      r!   next_table_startr   f  s$    ! 	~% r*   c                   t        | d         }t        | d         }t        | d         }| j                  d      xs dt        | j                  d      xs d      t        | j                  d            d	}t        ||      }	t	        ||||	|||      }
|
r|
}d
}|	}nt        ||||||      }d}d }|sy t        |      }t        |j                  d      xs g       }|j                  d      }t        ||      }|t        ||      nd }i d|d   d|d   d|j                  dd      d|d| d| d|dt        |      d|dt        |t               rd|dnd d|d|dt        |      dt        |t               rd|dnd d| d   d| d   d| d   d| d   | d   | d    t        | d         d!k(  t        |t               xr ||k(  ||v t        |      ||j                  d"      t        |      |d#
S )$Nrg   rh   r   r   r   r   r   r   r   next-table-startzinvalid-terminatorr   r   Fr   	imageSizerY   r   tableStartFileOffsettableStartFileOffsetHexr$   r   boundaryKind
boundaryVaboundaryVaHexboundaryFileOffsetHexr   r   r   r   r   r   r   r   )
r   r   fieldPlus4BoundmatchesKnownFrameCountmatchesAutoCountSetr   r   r   
rectSampler{   )r^   r7   boolr   r   r}   rD   r   r   r)   r   r   r   )seedrG   rP   r   	auto_metarg   rh   start_varm   r   boundedr{   boundary_kindboundary_usedr   auto_countsr   start_offsetboundary_offsets                      r!   build_candidater   m  s   WEh F4'(H((8$7dhhx(.B/488L12D
 #8\:K#D(Hk5RXZ^_G*#+D(HeVUYZ,JEimmN39r:K-- 12K(3L?L?Xl8];^bO$x.$x. 	dhh|U3 	e	
 	wax( 	 	5? 	 	"jWZ>[RS'9#:ae 	 	m 	}- 	 z/[^?_2oc%:!;ei 	D$ 	d<(  	d<(!" 	tM*#$ $ !34tJ/0A5",[#">"W5KCW$3{+&!*/F!G!%(7 r*   c                   t        | j                  d      dk7        t        | j                  d      dk7        t        | j                  d             t        | j                  d             t        t        | j                  d      xs d      dz
        t        | j                  d      xs d       t        | j                  d	      xs d
      fS )Nr   r   r   r   r   r   r   r   r   r   )r^   r7   absr   )tables    r!   table_sort_keyr     s    EIIj!Q&'EIIn%);;<		/001		2334C		*%*+a/0	UYY|$)	**EII'(.B/ r*   r<   annotateQ   i  P       rX   MISSz)EXE rect #81 is the bottom-row MISS text.)actionr|   expectedlabelreasoninsert_afteri0  HIT)rY   rZ   r[   r\   r   zyBottom-row HIT text follows MISS in btl_etc.cns but is not present as a separate EXE rect before the next table boundary.)r   
afterIndexexpectedPreviousrf   r  c           	        t         j                  | j                  d            }|sy g }| j                  d      g| j                  d      xs g | j                  d      xs g D ]  }|s||vs|j                  |        g }|D ]  }|j                  d      xs g }t        |      }|D ]h  }|j                  d      xs d}|dk(  rt	        |d	         }	|	d
k  s|	t        |      k\  r@||	   }
|d   }dD ci c]  }||
j                  |       c}|k7  rni |
|j                  d      xs |
j                  d      xs d|d   d||	<   |j                  |	|j                  d      d|       |dk(  st	        |d         }|d
k  s|t        |      k\  r||   }|d   }dD ci c]  }||j                  |       c}|k7  r |dz   }|j                  |i |d   |d   |d       |j                  ||j                  d      d|       k t        |      |d<   t        |      |k7  s||d<   t        |      |d<    |r|| d<   y y c c}w c c}w )Nr?   	bestTabletablescandidateTablesr{   r   replacer   r|   r   r   rX   r   r   r  )r   manualAnnotationr   )r|   r   r  r  r  r   rf   )manualInsertioninsertedAfterOriginalIndexr   originalFrameCountr   manualRectCorrections)MANUAL_RECT_CORRECTIONSr7   rO   rD   r^   insertr   )r   correctionstouched_tablesr   appliedr{   original_frame_count
correctionr   r|   currentr   r   after_indexpreviousexpected_previousinsert_indexs                    r!   apply_manual_rect_correctionsr    s   )--cggg.>?KN''+&h#''(*;*ArhcggN_F`Ffdfh )U.0!!%() G .-		'"(b"5z% '	J^^H-:F#Jw/019U 3,%j15IJcCS))JhV  '^^G4RG8LRPR(28(< e
 599M^C_ncmno>)!*\":;?kSZ&? -$./A$B!6JKsCc**KO``*Q $V,+5h+?6A !-+0995F+G %C'	P *%0lu:--*>E&'"%e*E,].-^ '.#$ I K Ls   <I-Ic                   t        | |      }t        | |||      }t        |D ch c]"  }t        |d         dk(  st        |d         $ c}      }i }|D ]  }	t	        |	j                  d      xs d      }
t	        |	j                  d      xs t        |
            }||
|	j                  d      xs d|	j                  d      xs' t        t	        |	j                  d      xs d            |	j                  d	       d
|	j                  d       |	j                  d	      |	j                  d      dd g d
||<    t        t              }t               }|D ]h  }|j                  |d   i       }t        || |||      }|*|d   |d   |d   |d   f}||v rA|j                  |       ||d      j                  |       j |j                         D ]  \  }}|j                  t                |D cg c]  }|j                  d      s| }}|j                  |      }	|	sQt#        |      |	d<   t#        |      |	d<   |r|d   nd |	d<   ||	d<   ||	d<   t%        |	        t        |j'                         d       S c c}w c c}w )Nr   r   r   r   r   r   r8   r   rg   rY   rh   r   )
r?   r   r8   r   r   rg   rh   
tableCountr  r  r?   r   r   r   candidateTableCountr  r  r  r	  c                6    | j                  d      xs d| d   fS )Nr8   r   r?   r6   r   s    r!   r   zbuild_rows.<locals>.<lambda>7  s!    DHHZ<P<VTVX\]dXe;f r*   )r   r   r   r^   r   r7   r/   r9   r   r   r   r   r   rO   r   sortr   rD   r  r_   )rG   rP   r   auto_meta_by_assetr   r   r   plus4_startsrows_by_assetr   r   r?   candidates_by_assetseen_candidatesmetar   r   r  promoted_tabless                      r!   
build_rowsr)    s    tX.G#D(GZHEe#dS]N^J_cdJd3tN34efL%'M 
#''%.&B'CGGJ'99S>:
+1r WW_5gCGGT^L_LeceHf9gGGG,-Qswwx/@.ABWWW%ggh' 
e
  2=T1BeO 	9!%%d7mR8dHlDI=G}eN3U:5FlH[\/!C DM*11%8	9 -224 +v'.4UU		BS8T5UU&%([!"0L1@?1-dK'H!'%c*+ -&&(.fggY fB Vs   I>I>2J	Jc                   |D cg c]  }|j                  d      s| }}|D cg c]  }|d   j                  d      s| }}|D cg c]  }|d   j                  d      dk(  s| }}|D cg c]  }|d   j                  d      s| }}t        d |D              }t        d |D              }	t        d |D              }
g }d	D ]  t        fd
|D        d       }|s|j                  |d   |d   |d   |d   |j                  d      xs i j                  d      |j                  d      xs i j                  d      |j                  d      xs i j                  d      |j                  dd      |j                  dd      d	        dt	        |       dgdt        |      t        |      t        |      t        |      t        |      t        |      t        t        |j                                     t        t        |	j                                     t        t        |
j                                     ||ddS c c}w c c}w c c}w c c}w )Nr  r   r   r   r   c              3  F   K   | ]  }|j                  d       xs d  ywr8   unknownNr6   .0r   s     r!   	<genexpr>z build_summary.<locals>.<genexpr>?  s!     O3cggj1>Y>O   !c              3  F   K   | ]  }|j                  d       xs d  ywr,  r6   r.  s     r!   r0  z build_summary.<locals>.<genexpr>@  s!     #aCGGJ$7$D9$D#ar1  c              3  D   K   | ]  }|d    j                  d        yw)r  r   Nr6   r.  s     r!   r0  z build_summary.<locals>.<genexpr>A  s      _sc+.22>B_s    )cara_at1cara_at2cara_at3cara_rs1cara_sm1btl_atzk_bigr   c              3  4   K   | ]  }|d    k(  s|  yw)r?   Nr&   )r/  r   r.   s     r!   r0  z build_summary.<locals>.<genexpr>M  s     CTT']d-BDCs   r?   r   r8   r   r   r   r  r   r  )	r?   r   r8   r   bestFrameCountbestTableStartVaHexr   r  r  zKEXE-side u32 x1,y1,x2,y2 frame rectangle table scan for non-map CNS images.zout/cns_frame_assets.jsonzcns-frame-rect-static-scanaK  Non-map CNS images can reuse the monster-proven u32 x1,y1,x2,y2 source-rectangle shape when an EXE descriptor field points to the table.  Character resources commonly chain several tables together, so the nearest next table start is used as the strongest boundary.  Assets without an EXE table remain grid/manual-review candidates.)scoper   status
assetCountrowCountassetsWithExeRectTablesassetsWithPlus4BoundBestTableassetsWithNextTableBoundaryassetsMatchingAutoCountSetcategoryCountstableCategoryCountsboundaryKindCountsexamplesr   
conclusion)	r7   r   nextrO   r   rD   r   r   r   )exe_pathr   r   r   rows_with_tablesplus4_bound
next_boundauto_matchescategory_countstable_category_countsboundary_countsrI  r.   s               @r!   build_summaryrT  :  sE   '+Dsww{/CDD"2^3c+6F6J6JK\6]3^K^!1p#S5E5I5I.5Y]o5o#pJp#3cCs;7G7K7KLa7bCcLcO$OOO##aP`#aa_N^__OH	  CTCTJOO \u: #J!$[!1'*ww{';'Ar&F&F|&T,/GGK,@,FB+K+KL]+^%(WW[%9%?R$D$D^$T"%'',":+.773H!+L
6 _x="=>.*oI#&'7#8),[)9'*:&),&7vo&;&;&=>?#F+@+F+F+H$IJ"6/*?*?*A#BC-! E E^pcs-   I	I	III(I2IIc                   d7dg }| d   D ]  }t        |d   |j                  d            }|j                  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       d	 |j                  dd             d |j                  dd             d        g }| d   D ]  }|j                  d      xs i }t        |d   |j                  d            }dj                  d |j                  d      xs g d d D              }|j                  d| d |d          d |j                  d      xs |j                  d      xs d       d |j                  d
             d |j                  d      xs d       d |j                  d      xs d       d	 |j                  d       xs d       d |j                  d!      xs d       d |j                  d      xs d       d	 |j                  d"             d |j                  d#      xs g        d |xs d       d$        d%j                  fd&d'| d(   fd)| d*   fd+| d,   fd-| d.   fd/| d0   ffD              }d1 | d2          d3| d4d%j                  |       d5d%j                  |       d6	S )8Nc                >    t        j                  t        |             S r,   )r=   r>   r   r'   s    r!   esczhtml_page.<locals>.escv  s    {{3u:&&r*   rI  r?   r8   z<tr><td><a href="z"><code>z</code></a></td><td><code>r   z</code></td><td>r   z	</td><td>r<  -z</td><td><code>r=  z</code></td><td><code>r   r  r   r  z
</td></tr>r   r  z; c           	   3  N   K   | ]  }|d     d|d    d|d    d |d      yw)rY   ,rZ    r[   r\   Nr&   )r/  rf   s     r!   r0  zhtml_page.<locals>.<genexpr>  s<      
CGtCyk49+QtCyk49+>
s   #%r   r   z</code></a></td><td>r   r   r   r   r   r   r   z</code></td></tr>r   c              3  N   K   | ]  \  }}d  |       d |       d  yw)z<div><strong>z</strong><span>z</span></div>Nr&   )r/  r   r(   rW  s      r!   r0  zhtml_page.<locals>.<genexpr>  s4      	C E
|?3s8*MJ	s   "%assetsr@  zEXE rect tablesrB  z
plus4 bestrC  z
next-boundrD  zauto matchesrE  a  <!doctype html>
<html lang="ko">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>CNS Frame Rect EXE Scan</title>
  <style>
    body { margin: 24px; background: #101214; color: #edf2f4; font: 14px system-ui, sans-serif; line-height: 1.45; }
    a { color: #9bd4ff; }
    code { color: #f5eec8; white-space: pre-wrap; word-break: break-word; }
    .cards { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 10px; max-width: 980px; margin: 16px 0; }
    .cards div { border: 1px solid #303940; background: #151a1f; padding: 10px; }
    .cards strong { display: block; font-size: 22px; }
    .cards span { color: #aeb8bd; }
    table { border-collapse: collapse; width: 100%; margin: 12px 0 30px; }
    th, td { border: 1px solid #303940; padding: 6px 8px; text-align: left; vertical-align: top; }
    th { background: #182028; position: sticky; top: 0; }
  </style>
</head>
<body>
  <h1>CNS Frame Rect EXE Scan</h1>
  <p>rJ  z</p>
  <div class="cards">z</div>
  <h2>Examples</h2>
  <table><thead><tr><th>asset</th><th>cns</th><th>size</th><th>frames</th><th>table</th><th>boundary</th><th>promoted</th><th>candidates</th></tr></thead><tbody>z</tbody></table>
  <h2>All Assets</h2>
  <table><thead><tr><th>asset</th><th>category</th><th>size</th><th>frames</th><th>schema</th><th>field</th><th>table</th><th>boundary</th><th>auto match</th><th>auto counts</th><th>sample</th></tr></thead><tbody>z!</tbody></table>
</body>
</html>
)r(   r   returnr   )rA   r7   rO   join)	summaryexample_rowsr   hrefr   r   samplecardsrW  s	           @r!   	html_pagere  u  s   ' Lz" 
$S\377:3FG!F)CG,=+> ?SZ) *s;'() *sww/07C89 :SWW%:;BsCD ESWW^4;<= >sww|Q/01 2sww4a89: ;		

 Jv 
$*$S\377:3FG 
LQIIVbLcLigikmlmKn
 
 	!F)CG,=+> ?sww/M377:3FM#NO Psww{+,- .uyy.5#67 8UYYx07C89 :uyy.5#67 8UYY'89@SAB CUYY~6=#>? @uyy!6789 :UYY~6<"=> ?V]s+, -	

, GG 	 w|,-(A BC7#BCD7#@ABW%ABC
	 	E* 
',
 ! "W b ce  cj  cj  kw  cx  by yV WY  W^  W^  _i  Wj  Vk k5 r*   c                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       y )
NT)parentsexist_okcns_frame_rect_exe_scan.jsonF)rZ  :)ensure_ascii
separators
r   r   )mkdir
write_textr   dumps)r`  out_dirs     r!   write_outputsrr    sC    MM$M.--99

7:FM : r*   c                    | j                         }t        |      }t        |dz  i       }t        |dz  g       }t        ||      }t	        |||t        |            }t        | ||      S )Nzcns_frame_assets.jsonzcns_payloads.json)
read_bytesr
   r"   r   r)  r   rT  )rL  rq  rG   rP   r]  r   r   r   s           r!   run_scanru    so     DT"Hw!88"=F#66;H!&(3JdHj2CJ2OPD:t44r*   c                    t        j                  t              } | j                  dt        t
        dz         | j                  dt        t               | j                         }t        |j                  |j                        }t        ||j                         t        d|j                  dz          t        d|d	    d
|d    d|d    d|d           y)N)descriptionz--exezHwanse2.exe)typedefaultz	--out-dirzwrote ri  zassets=r@  z exeTables=rB  z plus4=rC  z nextBound=rD  r   )argparseArgumentParser__doc__add_argumentr   ROOTOUT
parse_argsru  exerq  rr  print)parserargsr`  s      r!   mainr    s    $$9F
dD=4HI
$<Dtxx.G'4<<(	F4<<"@@A
BC	
','(G<U4V3W X89:+gNkFlEm	o r*   __main__)r   r   r    r   r^  r   )r(   
int | Noner^  
str | None)r.   r   r^  r   )r8   r   r^  r   r,   )r?   r   r8   r  r^  r   )rG   bytesrH   r^   r^  r  )rG   r  rP   
list[dict]r(   r^   r^  r  )r_   ztuple[int, int, int, int]r^  dict | None)rf   r   rg   r^   rh   r^   r^  r   )rG   r  rH   r^   rg   r^   rh   r^   rm   r   r^  r  )
rG   r  rH   r^   rg   r^   rh   r^   r^  r  )rG   r  rP   r  ry   r^   rg   r^   rh   r^   rm   r   rv   r^   r^  r  )rG   r  rP   r  ry   r^   rg   r^   rh   r^   rv   r^   r^  r  )rG   r  rP   r  ry   r^   r   r  rg   r^   rh   r^   rm   r   r^  list[dict] | None)rG   r  rP   r  ry   r^   r   r  rg   r^   rh   r^   r^  r  )   )r{   r  r   r^   r^  r  )r   r  r^  dict[str, dict])r   r   r   r  r^  r  )
rG   r  rP   r  r   zdict[int, str]r   r  r^  r  )ry   r^   r   	list[int]r^  r  )r   r   rG   r  rP   r  r   r  r   r   r^  r  )r   r   r^  tuple)r   r   r^  None)
rG   r  rP   r  r   r  r"  r  r^  r  )rL  r   r   r  r   r  r^  r   )r`  r   r^  r   )r`  r   rq  r   r^  r  )rL  r   rq  r   r^  r   )r^  r^   )=r|  
__future__r   rz  r=   r   rE   collectionsr   r   pathlibr   typingr   probe_exe_scene_tablesr   r	   r
   r   __file__resolverg  r~  r  r  rx   r   r   rs   r"   r)   r/   r9   rA   rI   rV   rd   ri   rp   rt   r}   r   r   r   r   r   r   r   r   r   r   r  r  r)  rT  re  rr  ru  r  __name__
SystemExitr&   r*   r!   <module>r     sd   #     ,   ^ ^ H~''*
Ul5b!$%
	"EB&"DI:5 ..
  	
  (O 
  	
    < 
  	
   (
  	
    >n
nn n 	n
 n n n26?2F
FF F 	F
 FR7t	  !"=A	
 %&)" EBRb5I R	
 (9/x4h
4h4h 4h (	4h
 4hn8vRj5 z
TV
 r*   