
    UHj9f                    ,   d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
mZ ddlmZ  e	e      j                         j                   d   Zed	z  Zd
ZdZdddddZdddddZdddddZdddddZg dZg dZdddgdd g d!dd"g d#dgZd>d?d$Zd@d%ZdAd&ZdBd'ZdCd(Z dDd)Z!dEd*Z"dFdGd+Z#dEd,Z$dHd-Z%dFdId.Z&dFdGd/Z'dGd0Z(dJd1Z)dKd2Z*dLd3Z+dMd4Z,dNdOd5Z-dPd6Z.dQd7Z/eef	 	 	 	 	 	 	 	 	 dRd8Z0dSd9Z1dSd:Z2efdTd;Z3dUd<Z4e5d=k(  r e4        yy)VzHAudit route-exit candidates against original CNS layer1 collision flags.    )annotationsN)deque)Path	urlencode)	load_maps   outmap1_01amap2_02d      )topbottomleftrightr   r   r	   r   r   r	   r   r   r   r   r         )downupr   r   )zstrict-source-hotspotzselected-root-executionzreal-selector-2-0-savedataz(runtime-trace-or-equivalent-control-flow)z strict source coordinate/hotspotzselected-root execution proofzreal selector 2:0 captured savez.runtime trace or equivalent control-flow proofzout/maps.jszmap1_01a layer1 collision gridzmap2_02d layer1 collision grid)pathfieldszout/map_exit_candidates.json)exitCandidatestargetHintscollisionModepromotionStatuszout/runtime_movement.json)mapLoaderFunctionVaHexcnsLayer1CollisionGridVaHexcollisionFlagTabledirectionBlockBits"originalCollisionFlagTestsGroundedc                "    | dt        |        S )Nz/game.html?r   )params
web_prefixs     E/home/exedev/hwanse/tools/summarize_original_collision_route_audit.pyweb_hrefr+   K   s    \Yv%6$788    c                t    |dkD  r	t         d   S |dk  r	t         d   S | dk  r	t         d   S | dkD  r	t         d   S y)Nr   r   r   r   r      )$ORIGINAL_LAYER1_DIRECTION_BLOCK_BITSdxdys     r*   direction_bitr3   O   sM    	Av3F;;	Av3D99	Av3F;;	Av3G<<r,   c                .    t         j                  | d      S )Nr   r   )SIDE_VECTORget)sides    r*   side_directionr9   [   s    ??4((r,   c                4    |dkD  ry|dk  ry| dk  ry| dkD  ryy)Nr   r   r   r   r   none r0   s     r*   side_name_for_vectorr=   _   s-    	Av	Av	Av	Avr,   c                    || d   z  |z   S )Nwidthr<   infotile_xtile_ys      r*   
tile_indexrD   k   s    DM!F**r,   c                H    t        | ||      }| d   d   |   | d   d   |   fS )Nlayersr   r	   )rD   )rA   rB   rC   indexs       r*   tile_atrH   o   s7    tVV,E>!U#T(^A%6u%===r,   c                R    d|cxk  xr | d   k  nc xr d|cxk  xr | d   k  S c S )Nr   r?   heightr<   r@   s      r*   	in_boundsrK   t   s/    &g&G1+Gh+GG+GGr,   c                b    t        | ||      syt        | ||      \  }}|t        ||      z  dk(  S )NFr   )rK   rH   r3   )rA   rB   rC   r1   r2   _layer1s          r*   layer1_flag_passesrO   x   s:    T66*ff-IAv]2r**q00r,   c                    t        | ||      S N)rO   r@   s      r*   layer1_tile_passablerR      s    dFF33r,   c                    | d   }||z  dz
  }||z  dz
  }|dz   |z  |dz   |z  f|dz   |z  |dz   |z  f|dz   |z  |dz   |z  f|dz   |z  |dz   |z  fgS )NtileSize   r            r<   )rA   rB   rC   	tile_sizepixel_xpixel_ys         r*   footprint_tiles_for_tiler\      s    Z Iy 2%Gy 2%G
A+)	#gly%@A
B,9	$w|	&AB
A+)	#gly%@A
B,9	$w|	&AB	 r,   c           	     D   g }t        ||      }t        | ||      D ]  \  }}||t        | ||      d|dd}	|	d   r9t        | ||      \  }
}|	j	                  |
|d|dd|dz  d||z  dk(  d	       n|	j	                  d d d d d
d	       |j                  |	        |S )N0x02x)xyinBoundsdirectionBitHexrb   04xr.   01xr   )layer0rN   	layer1HexlowNibbleHexpassesF)r3   r\   rK   rH   updateappend)rA   rB   rC   r1   r2   checksbitfoot_xfoot_yrowrf   rN   s               r*   footprint_checksrq      s    F
B
C24H !$7!#C9~	3
 z?$T66:NFFJJ  !&."$Vd]3$7 8!C<A-  JJ! $  	c12 Mr,   c           
     @    t        d t        | ||||      D              S )Nc              3  *   K   | ]  }|d    du   yw)ri   TNr<   .0rp   s     r*   	<genexpr>zcan_stand_at.<locals>.<genexpr>   s     _s8}$_s   )allrq   )rA   rB   rC   r1   r2   s        r*   can_stand_atrx      s#    _0@vvWY[]0^___r,   c                P    ||z   }||z   }t        | ||      syt        | ||||      S )NF)rK   rx   )rA   rB   rC   r1   r2   target_xtarget_ys          r*   can_move_from_tiler|      s6    {H{HT8X.h"b99r,   c           	        t               }g }t        | d         D ]  }t        | d         D ]  }||f}||v st        | ||      s|j                  |       g }t	        |g      }|rw|j                         \  }}	|j                  ||	f       dD ]I  \  }
}||
z   |	|z   f}||v st        | |d   |d         s(|j                  |       |j                  |       K |rw|j                  |         |j                  t        d       |S )NrJ   r?   )r   r   r   r   r   r	   T)keyreverse)	setrangerR   addr   popleftrk   sortlen)rA   seen
componentsra   r`   startcellsqueuecell_xcell_yr1   r2   	next_cells                r*   connected_componentsr      s(   !$D.0J4>" %tG}% 	%AFE}$8q!$DHHUOE5'NE!&ff-.@ ,FB!'"frk :I D(0DT9UV<YbcdYe0f HHY'LL+,  e$!	%%$ OOTO*r,   c                     d   d   }i }|D ]#  }d|dz  d}|j                  |d      dz   ||<   % t        j                         D ci c]  \  }|t        fd|D               }}}t	               }t         fdt         d	         D              }	 d
    d    d	    d    j                  d      xs  j                  d      g d    d	   z  t         fdt         d	         D              t        d |D              |	t        |      |rt        |d         ndt        t        |j                                     |dS c c}}w )NrF   r	   r^   r.   re   r   c              3  .   K   | ]  }|z  s	d   yw)r	   Nr<   )ru   valuerm   s     r*   rv   zlayer1_stats.<locals>.<genexpr>   s     753;!7s   
c              3  b   K   | ]&  }t        d          D ]  }t        ||      rd  ( ywr?   r	   N)r   rx   ru   ra   r`   rA   s      r*   rv   zlayer1_stats.<locals>.<genexpr>   sC      tG}% a# 	
	s   ,/rJ   namer?   rT   layerTilesetstilesetc              3  d   K   | ]'  }t        d          D ]  }t        ||      sd  ) ywr   )r   rR   r   s      r*   rv   zlayer1_stats.<locals>.<genexpr>   sU       &JAPUVZ[bVcPd  &J1h|  ~B  DE  GH  iIa  &Ja  &Js   #0	0c              3  ,   K   | ]  }|d z  s	d  yw)r.   r	   Nr<   )ru   r   s     r*   rv   zlayer1_stats.<locals>.<genexpr>   s     $K5edlQ$Ks   
)mapr?   rJ   rT   r   	tileCounttileLevelPassableCounttileLevelBlockedCountfootprintStandableTileCountcomponentCountlargestComponentSizelowNibbleCountsdirectionBitBlockedTileCounts)	r7   r/   itemssumr   r   r   dictsorted)
rA   rN   low_nibble_countsr   r~   r   rm   direction_countsr   footprint_standables
   `     `   r*   layer1_statsr      s   (^AF(* C54<$%!2!6!6sA!>!B#C
 >CCE D# 	c7777  &d+J tH~&  F|gx.$/2Ktxx	7J6K']T(^3"%  &JtH~1F  &J  #J!$$KF$K!K':j/6@JqM 2a'8'>'>'@ AB)9 s   E	c                .    t        fd| D        i       S )Nc              3  L   K   | ]  }|j                  d       k(  s|  yw)r   Nr7   )ru   rp   r   s     r*   rv   zsource_row.<locals>.<genexpr>   s      Nswwu~7MNs   $$)next)map_exit_candidatesr   s    `r*   
source_rowr      s    N 3NPRSSr,   c                j    | j                  d      xs g D ]  }|j                  d      |k(  s|c S  i S )Nr   targetr   )	candidater   hints      r*   candidate_target_hintr      s<    m,2 88H'K Ir,   c                V    | | d| | d| dddd}|r
d|d<   ||d<   t        |      S )N,1originalLayer1Flags)r   	startTile	focusTile	collisionr    overviewrouteAssisttrialTransitionstransitionTarget)r+   )r   r`   ra   r   r(   s        r*   candidate_urlr      sU    s!A3Zs!A3Z.F %2!"%+!"Fr,   c                
   |j                  d      xs i }t        |j                  d            }t        |j                  d            }t        | ||      \  }}t        |j                  d      xs d      \  }	}
t	        |	|
      }t        ||      }|j                  d      }|j                  d      }d }t        |t              rt        |t              rt        |||      rt        |||      \  }}t        t        j                  |j                  d      xs dd            \  }}||j                  d      ||||d|dd|dz  d	t        |||      t	        ||      t        |||||      t        |||      d
}i d|j                  d      d|d|d|j                  d      d|j                  d      dk(  xr |j                  d      du d|j                  d      d|d|dd|ddd|dz  d	d|dt        | ||      dt        | |||	|
      dt        | ||	z   ||
z         dt        | |||	|
      dt        | ||      dt        | |||	|
      ||t        | d   ||      t        | d   |||      dS )Nsampler`   ra   r8    r^   rd   r.   re   )r   r8   r`   ra   rf   rN   rg   rh   originalStandableinwardDirectioninwardMoveAllowed	reviewUrledgeDistanceautoTriggerr   	standableTtileClassStandablerf   rN   rg   rh   outwardDirectionr   outwardFootprintDirectionClearoutwardMoveWouldStayInBoundsoutwardMoveAllowedInsideMap	footprintoutwardFootprintr   )
targetHinttargetSpawnOriginalLayer1Flagsr   routeAssistUrl)r7   intrH   r9   r=   r   
isinstancerK   OPPOSITE_SIDErx   r|   r   rq   )source_infotarget_infor   r   r   source_xsource_yrf   rN   r1   r2   direction_nametarget_hintrz   r{   target_spawntarget_layer0target_layer1	inward_dx	inward_dys                       r*   audit_candidater     s!   ]]8$*F6::c?#H6::c?#H[(H=NFFIMM&17R8FB)"b1N'	6:Ks#Hs#H-1L(C Z#%>9[ZbdlCm'.{Hh'O$}-m.?.?PV@W@][]_a.bc	9OOF+##mC01 !5c :;!-k8X!N3IyI!3K8U^`i!j&vxB
	f%X 	X 		n5	
 	y}}^49]fjj>UY]>] 	fjj5 	& 	& 	r&& 	"Vd]3/0 	N 	\+xJ 	),{HhXZ\^*_ 	'	+x"}hY[m(\ 	&'9+xQY[]_a'b  	%k8XF!" 	,[(HbRTU#$ "*6";v#6(K'F(;XxQWX+ r,   c           	     f   | j                  d      xs g D cg c]Y  }|j                  d      xs g v s>|j                  d      xs g v s't        fd|j                  d      xs g D              r|[ }}|D cg c]  }t        |||       }}|j                  d        |S c c}w c c}w )Nr   blockedTargetCandidatesselectorTargetCandidatesc              3  F   K   | ]  }|j                  d       k(    yw)r   Nr   )ru   r   r   s     r*   rv   z#route_candidates.<locals>.<genexpr>J  s     _$"f,_s   !r   c                    t         j                  t        | j                  d            d      | j                  d      xs d| j                  d      xs d| j                  d      xs dfS )Nr8   c   r   r   r`   ra   )
SIDE_ORDERr7   str)rp   s    r*   <lambda>z"route_candidates.<locals>.<lambda>M  sx    z~~c#''&/.BBGQ_I`Iedegjgngnorgsgxwxz}  {B  {B  CF  {G  {L  KL  M r,   )r~   )r7   anyr   r   )source_exit_rowr   r   r   r   
candidatesrowss      `   r*   route_candidatesr   D  s     ),,-=>D"imm$=>D"Eimm$>?E2F_9==;W;][]__	 	J  [eeYOKiHeDeII  MI  NK fs   AB)=B.c                d   | |   }| |   }t        ||      }t        ||      }t        ||||      }t        d |D              }	t        d |D              }
i ddd||dddd	d
dddddddt        t              ddddddddt
        j                         D ci c]  \  }}|d|d c}}dd|j                  d      |j                  d      |j                  d      t        |j                  d      xs g       |j                  d      |j                  d	      d d!|j                  d      |j                  d      |j                  d      t        |j                  d      xs g       |j                  d	      d"d#|t        |      |t        |      id$t        |      d%|	d&|
d'|	t        |      k(  xr t        |      |
t        |      k(  xr t        |      |t        t              t        t              t        t              t        t              | d(| d)d*S c c}}w )+Nc              3  H   K   | ]  }|j                  d       du sd  yw)r   Tr	   Nr   rt   s     r*   rv   z build_summary.<locals>.<genexpr>\  s"     #d#swwGZ?[_c?cA#ds   ""c              3  l   K   | ],  }|j                  d       xs i j                  d      du rd . yw)r   r   Tr	   Nr   rt   s     r*   rv   z build_summary.<locals>.<genexpr>]  s<      $GG45;@@ATUY]] 	
$s   24titlezOriginal Collision Route Auditroutesourcer   r    r   r!   zdiagnostic-onlypromotionAllowedF
proofFound originalCollisionRouteProofFound#failedOriginalCollisionRouteGateIdsreasonzCNS layer1 collision flags can recheck geometry candidates, but they do not provide a strict source hotspot, selected-root execution proof, real selector 2:0 save, or runtime trace.runtimeMappingzout/runtime_movement.*
0x0042449c
0x004319f8
0x0058d7d00x0fr^   r_   )r   r"   collisionHelperFunctionVaHexr#   standabilityBlockMaskHexr%   sourceTileClassExitSummarypassableTileCountr   r   priority)r    r  r   exitCandidateCountr  r!   targetTileClassExitSummary)r    r  r   r	  r!   originalLayer1MapStatsrouteCandidateCount%sourceOriginalStandableCandidateCount!targetOriginalStandableSpawnCount$allSourceCandidatesOriginalStandable -> z geometry candidates can be opened with collisionMode=originalLayer1Flags for collision review, but this is diagnostic only and keeps normal-route promotion blocked.) allTargetSpawnsOriginalStandablerouteCandidatesmissingPromotionEvidencemissingEvidenceevidenceRefsevidenceRefCount
conclusion)r   r   r   list(FAILED_ORIGINAL_COLLISION_ROUTE_GATE_IDSr/   r   r7   r   r   bool)ORIGINAL_COLLISION_ROUTE_MISSING_EVIDENCE&ORIGINAL_COLLISION_ROUTE_EVIDENCE_REFS)mapsr   r   r   r   r   source_exittarget_exitr   source_original_standabletarget_original_standabler   rm   s                r*   build_summaryr"  Q  s    v,Kv,K0&9K0&9K!+{KPJ ##d#d d # $$ !
919
9 	.9 	,9 	E9 	e9 	+E9 	.t4\/]9 	p9  	.&2,8+7(.ImIsIsIu"vID#42c#Y#7"v
!90 	%(___=!,1D!E)oo.>?"%koo6F&G&M2"N#
3*/@A'
19@ 	%(___=!,1D!E)oo.>?"%koo6F&G&M2"N*/@A'
A9N 	!L-L-#
O9V 	s:W9X 	01JY9Z 	,-F[9\ 	/0ISQ[_0\0qaefpaq]9^ -FZ,X,m]abl]m%$()R$S IJCD FGhd6( #j jm9 9, #ws   H,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j                  | d          d	dt        | d          d	d| d    d	d| d    ddj                  | d          dddg| d   D cg c]  }d | 	 c}dd!d| d"   D cg c]  }d#|d$    d%dj                  |d&          ! c}dd'dd(d)}||fD ]D  }	|j                  d*|	d+    d,|	d-    d.|	d/    d,|	d0    d,|	d1    d,|	d2    d,|	d3    d,|	d4    d5       F |j                  g d6       | d7   D ]  }
|
j	                  d8      xs i }|r7|j	                  d9       d:|j	                  d.       d;|j	                  d<       nd=}d>|
d?    d@|
dA    dB}|j                  d*|
d9    d,|
d.    d;|
d<    dC|
dD    d,|
dE    d,|
dF    d,|
dG    d,|
dH    d,| d,|j	                  dFd=       d,| d5        |j                  ddId| dJ   dg       dKj                  |      S c c}w c c}w )LNr   r   r   r  z # Original Collision Route Auditr   zRoute: `r  `z`originalLayer1Flags` rechecks the existing geometry-only exit candidates against the CNS layer1 collision flag grid identified in `out/runtime_movement.*`. This remains diagnostic-only and does not promote the route.z## Gatez- promotionAllowed: `r   z- promotionStatus: `r!   z- proofFound: `r   z%- originalCollisionRouteProofFound: `r   z*- failed original-collision route gates: `, r   z- missingEvidenceCount: `r  z- evidenceRefs: `r  z
- reason: r   z- missing: r  z## Missing Evidencez- z## Evidence Refsr  z- `r   z`: r   z## Map Collision Statszx| map | size | layer1 passable tiles | footprint-standable tiles | components | largest component | low-nibble blocked |z1| --- | ---: | ---: | ---: | ---: | ---: | ---: |z| r   z | r?   r`   rJ   r   r   r   r   r   z |)r   z## Route Candidatesr   z| side | source tile | tileClass standable | original standable | outward flags clear | inside move | target spawn | target original standable | links |z<| --- | --- | ---: | ---: | ---: | ---: | --- | ---: | --- |r  r   r8    r   ra   -z	[review](r   z), [routeAssist](r   ) L1=rg   r   r   r   r   z## Conclusionr  
)joinr   rk   extendr7   )summaryr   r   r   source_statstarget_statsitemreflinesstatsrp   r   target_labellinkss                 r*   markdownr6    s   GE8_F8_F34V<L34V<L*

6($vha(
K 	

(: ;<A>
w'89:!<
',/02
/8Z0[/\\]^
4TYYwGl?m5n4oopq
#C0A(B$C#DAF
G$678:
WX&'(
dii(B CDEF

1&2 #**;"<	=$Btf+	=3&4 	5&6 	7&8 	9&> ~.

 #f+c$))CM":!;<

;&B 	C&D 	!E&F 	G&H 	CI&J 	<K&EN - 
uc%.!15?2C3-./s59V3W2XX[%&'s51G+H*IUSjMkLllnp	

 
LL   () 
ww?@FB  '(,*:*:3*?)@,BRBRSVBWAXY!$ 	 C,-->sCS?T>UUVWVSS
!CH:T#k:J9K3'()S1D-E,Fc345S=Z9[8\\_nC 0 01Dc JK3ugUWY	

 
LL


  99U_ 
>

s   'I$Ic                   | d   }|d   }|d   }| d   D cg c]  }dt        j                  |       d }}| d   D cg c]F  }dt        j                  |d	          d
t        j                  dj                  |d                dH }}g }| d   |   | d   |   fD ]u  }	|j                  dj                  ddt        j                  |	d          dd|	d    d|	d    dd|	d    dd|	d    dd|	d    dd|	d    dd|	d    ddg	             w g }
| d   D ]]  }|j	                  d      xs i }|r7|j	                  d       d|j	                  d       d |j	                  d!       nd"}|
j                  dj                  ddt        j                  t        |d                dd|d    d |d!    d#t        j                  |d$          dd|d%    dd|d&    dd|d'    dd|d(    ddt        j                  |       ddt        j                  t        |j	                  d&d"                   dd)t        j                  |d*          d+t        j                  |d,          d-dg             ` dj                  g d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDt        j                  |       dEt        j                  |       dFdG| dH    dIt        j                  | dJ          dKt        j                  | dL          dMdN| dO    dP| dQ    dRt        j                  d j                  | dS                dTt        | d          dU| dV    dWdXdY|dZd[dY|dZd\d]d^d_|d`dadbd]dcd_|
d`daddt        j                  | de          dMdfdgdh      S c c}w c c}w )iNr   r   r   r  z    <li>z</li>r  z    <li><code>r   z	</code>: r%  r   r  r*  z<tr>z  <td>r   z</td>r?   r`   rJ   r   r   r   r   r   z</tr>r  r   r8   r&  r   ra   r'  r)  rg   r   r   r   r   z  <td><a href="r   z">review</a>, <a href="r   z">routeAssist</a></td>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>Original Collision Route Audit</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; }z0    h2 { margin: 26px 0 10px; font-size: 18px; }zM    p { margin: 0 0 14px; color: #bbb; max-width: 980px; line-height: 1.45; }zX    table { width: 100%; border-collapse: collapse; margin: 0 0 16px; font-size: 13px; }zi    th, td { border-bottom: 1px solid #303030; padding: 7px 8px; text-align: left; vertical-align: top; }zR    th { position: sticky; top: 0; background: #181818; z-index: 1; color: #ddd; }z    code { color: #d8d8d8; }z0    a { color: #8fd0ff; text-decoration: none; }z+    a:hover { text-decoration: underline; }z
  </style>z</head>z<body>z)  <h1>Original Collision Route Audit</h1>z  <p>Route <code>z -&gt; z</code>. The audit rechecks geometry-only exit candidates with <code>originalLayer1Flags</code> and keeps promotion diagnostic-only.</p>z  <p>promotionAllowed=<code>r   z</code>, promotionStatus=<code>r!   z	</code>. r   z</p>z  <p>proofFound=<code>r   z0</code>, originalCollisionRouteProofFound=<code>r   z5</code>, failed original-collision route gates=<code>r   z$</code>, missingEvidenceCount=<code>z</code>, evidenceRefs=<code>r  z</code>.</p>z  <h2>Missing Evidence</h2>z  <ul>z  </ul>z  <h2>Evidence Refs</h2>z  <h2>Map Collision Stats</h2>z	  <table>z    <thead><tr><th>map</th><th>size</th><th>layer1 passable</th><th>footprint standable</th><th>components</th><th>largest</th><th>blocked</th></tr></thead>z    <tbody>z    </tbody>z
  </table>z  <h2>Route Candidates</h2>z    <thead><tr><th>side</th><th>source tile</th><th>tileClass</th><th>original</th><th>outward flags</th><th>inside move</th><th>target spawn</th><th>target original</th><th>links</th></tr></thead>z  <p>r  z</body>z</html>r   )htmlescaper+  rk   r7   r   r   )r-  r   r   r   r0  missing_itemsr1  evidence_ref_items
stats_rowsr3  candidate_rowsrp   r   r4  s                 r*   	html_pager>    s   GE8_F8_FELM^E_`TxD 12%8`M` >*
  T[[V56i{{499S]345U<  J23F;WE]=^_e=fg 
IIU5\2359w(%/):%@789?<=>eD/017567u=678>
 
	

 N() 
ww?@FB  '(,*:*:3*?)@,BRBRSVBWAXY!$ 	 	IISV%567u=S
!CH:T$++c+>N2O1PPUV12359012%8=>?uE:;<EB\2359S)9)9:Ms)S%TUVV[\!$++c+.>"?!@@WX\XcXcdghxdyXzW{  |R  S 	

* 99 ::: 	: 	#	:
 	Q: 	:: 	: 	r: 	1: 	7: 	;: 	X: 	c: 	t: 	]:  	'!:" 	;#:$ 	6%:& 	':( 	):* 	+:, 	4-:. DKK/0F8K7L  MU  	V/:0 'w/A'B&CCbcgcncnov  xI  pJ  dK  cL  LU  VZ  Va  Va  bi  jr  bs  Vt  Uu  uy  	z1:4 %W\%:$; <66=>`6a5b c;;?;;sxxPWX}P~G  <A  ;B B**-g6G.H*I)J K"")*<"=!>l	L5:@ 	&A:B 	C:D 
E:F 	G:H 	#I:J 	K:L 
M:N 	O:P 	)Q:R 	S:T 	gU:V 	W:X 
Y:Z 	[:\ 	]:^ 	&_:` 	a:b 	Pc:d 	e:f 
g:h 	i:j 	k:l GL12348m:n 	o:p 	q:r 	s: : :[ as    O  AOc                    |j                  dd       |dz  j                  t        j                  | dd      dz   d	       |d
z  j                  t	        |       d	       y )NT)parentsexist_okz#original_collision_route_audit.jsonFr   )ensure_asciiindentr*  utf-8encoding#original_collision_route_audit.html)mkdir
write_textjsondumpsr>  )r-  out_dirs     r*   write_outputsrM  ]  se    MM$M.44@@

7q9D@ A  44@@7AS^e@fr,   c                    t        j                  t              } | j                  dt        t
        dz         | j                  dt        t
        dz         | j                  dt               | j                  d	t               | j                  d
t        t
               | j                         }t        t        |j                        t        j                  |j                  j                  d            |j                   |j"                        }t%        ||j&                         t)        d|j&                  dz          y )N)descriptionz--mapszmaps.js)typedefaultz--map-exit-candidateszmap_exit_candidates.jsonz--source)rQ  z--targetz	--out-dirrD  rE  r   z(wrote original collision route audit -> rG  )argparseArgumentParser__doc__add_argumentr   OUTROUTE_SOURCEROUTE_TARGET
parse_argsr"  r   r  rJ  loadsr   	read_textr   r   rM  rL  print)parserargsr-  s      r*   mainr_  f  s    $$9F
tS9_E
/dCJdDde

L9

L9
$<D$))

4++55w5GH{{{{	G '4<<(	4T\\Di5i4j
klr,   __main__)z../web)r(   zdict[str, str]r)   r   returnr   )r1   r   r2   r   ra  r   )r8   r   ra  tuple[int, int])r1   r   r2   r   ra  r   )rA   r   rB   r   rC   r   ra  r   )rA   r   rB   r   rC   r   ra  rb  )rA   r   rB   r   rC   r   ra  r  r5   )rA   r   rB   r   rC   r   r1   r   r2   r   ra  r  )rA   r   rB   r   rC   r   ra  zlist[tuple[int, int]])rA   r   rB   r   rC   r   r1   r   r2   r   ra  
list[dict])rA   r   ra  zlist[list[tuple[int, int]]])rA   r   ra  r   )r   rc  r   r   ra  r   )r   r   r   r   ra  r   rQ   )
r   r   r`   r   ra   r   r   z
str | Nonera  r   )
r   r   r   r   r   r   r   r   ra  r   )
r   r   r   r   r   r   r   r   ra  rc  )
r  zdict[str, dict]r   rc  r   r   r   r   ra  r   )r-  r   ra  r   )r-  r   rL  r   ra  None)ra  rd  )6rT  
__future__r   rR  r8  rJ  collectionsr   pathlibr   urllib.parser   summarize_map_tilesr   __file__resolver@  ROOTrV  rW  rX  r   r6   r   r/   r  r  r  r+   r3   r9   r=   rD   rH   rK   rO   rR   r\   rq   rx   r|   r   r   r   r   r   r   r   r"  r6  r>  rM  r_  __name__r<   r,   r*   <module>rn     s   N "      " ) H~''*
Ul!Q;
	 !E7VT
	( $, (- ) ,,
 /
 ,
	#* &<9	)	+>
H14	>`:2DT2j
  	J
J#J J 	J
 
JZNbk\ 25 gm$ zF r,   