
    Jj}                      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 ddl	m
Z
 ddlmZ  ee      j                         j                  d   Zedz  Z ej$                  d	      Zdd
ZddZddZd dZd!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,dZ!d-dZ"d-dZ#d.dZ$d/dZ%e&dk(  r e%        yy)0z-Build a compact browser playtest route index.    )annotationsN)Path)Any)deque   outz\[([^\]]+)\]\(([^)]+)\)c                p    | j                         s|S t        j                  | j                  d            S )Nutf-8encoding)existsjsonloads	read_text)pathfallbacks     9/home/exedev/hwanse/tools/summarize_web_playtest_route.py	load_jsonr      s*    ;;=::dnngn677    c                8    t         | z  j                         r| S d S N)OUTr   )names    r   optional_out_hrefr      s    $J&&(42d2r   c                L   d| i}|j                  |j                         D ci c]  \  }}|	|dk7  s|| c}}       g }|j                         D ]6  \  }}t        |      j                  dd      }|j	                  | d|        8 ddj                  |      z   S c c}}w )Nmap ,%2C=z../web/game.html?&)updateitemsstrreplaceappendjoin)map_nameparamsquerykeyvaluepairstexts          r   web_urlr/      s    HE	LLv||~ceARW\`bWb#u*cdEkkm &
U5z!!#u-uAdV_%& %00 ds   
B 
B 
B 
c                n    | D ]/  }|j                  d      dk(  s|j                  d      dk(  s-|c S  i S )Nsourcemap1_01atargetmap2_02dget)rowsrows     r   find_route_assist_rowr9   '   s>     778
*swwx/@J/NJ Ir   c                V    | j                  d      xs g }|si S t        |d       d   S )NcandidateExitsc                    | j                  d      rdnd| j                  d      | j                  d      nd| j                  d      xs i j                  dd      | j                  d      xs d	fS )
NautoTriggerr   r   edgeDistancei  
targetHintprojectionDeltasider   r5   r8   s    r   <lambda>z#best_blocker_exit.<locals>.<lambda>4   se    'AQ'*ww~'>'JCGGN#PSWW\"(b--.?EGGFO!r	
 r   r+   r   )r6   sorted)	route_row
candidatess     r   best_blocker_exitrH   .   s=    /06BJ	
 	 	r   c                    | xs i j                  d      xs g }|D ci c]%  }|j                  d      r|j                  d      |' c}S c c}w )NcandidateRowsrA   r5   )packetr7   r8   s      r    strict_hotspot_candidate_by_siderL   =   sU    Lbo.4"D 776? 	  s   *Ac                   t        |      }t        |       }g }| j                  d      xs g D ]  }t        |      }|j                  |j                  d            xs i }|r|j                  d      |d<   |j                  d      xs g |d<   |j                  d      xs i j                  d      xs d|d	<   |j                  d      xs i j                  d
      xs d|d<   |j                  |        ||d<   |S )Nr;   rA   promotionStatusstrictHotspotStatusblockReasons
reviewUrlsreviewPacketUrlr   strictReviewUrlrouteAssistUrlstrictRouteAssistUrl)rL   dictr6   r&   )rF   rK   by_sideenrichedexitsr8   exit_row
strict_rows           r   $enrich_route_row_with_strict_hotspotr\   F   s   .v6GIHE}}-.4" 9[[17R
.8nn=N.OH*+'1~~n'E'KH^$+5>>,+G+M2*R*RSd*e*kikH&'0:|0L0RPR/W/WXh/i/omoH+,X "'HOr   c           
         | j                  d      xs i }| j                  d      xs i }| j                  d      xs i }| j                  d      xs i }| j                  d      xs i }| j                  d      xs i }| j                  d      xs g }i d| j                  d      d|j                  d	      |j                  d
      |j                  d      |j                  d      |j                  d      dd|j                  d      |j                  d	      |j                  d
      |j                  d      |j                  d      |j                  d      dd| j                  d      d|j                  d      d|j                  d      du dt        |j                  d      xs d      t        |j                  d      xs d      z   d|j                  d      du d|j                  d      d |j                  d!      d"|j                  d"      d#|j                  d#      d|d$t        |      d%|j                  d%      xs d&d'|j                  d'      xs |j                  d(      xs d&S ))N
sourceTiletargetSpawncoordinateEvidencevariantEvidencereviewEvidencerQ   rP   rA   xygeometryStandablesourceOriginalStandablecenterPairKey)rc   rd   re   rf   rg   targetSpawnOriginalStandableinwardMoveAllowed)rA   rc   rd   rh   ri   rg   rN   coordinateStatusstatuscoordinatePromotable
promotableTcoordinateHitCount
xyHitCountr   
yxHitCount$variantStrictCoordinateEvidenceFoundstrictCoordinateEvidenceFoundvariantCurrentRootHitCountcurrentRootHitCount"variantCharacterDescriptorHitCountcharacterDescriptorHitCountrouteReviewRowCounteventTransitionCountblockReasonCountrT   r   targetSpawnReviewUrltargetReviewUrl)r6   intlen)r8   source_tiletarget_spawn
coordinatevariantreviewurlsblock_reasonss           r    compact_strict_hotspot_candidater   W   s   '','-2K77=)/RL-.4"Jgg'(.BGWW%&,"F77< &BDGGN+1rM%%!,1D!E'27P'Q(___=
 	 $$V,!!#&!!#&,8,<,<=[,\!-!1!12E!F)--o>
" 	377#45#$ 	JNN84%& 	
| < D'( 	c*..">"C!Ds:>>ZfKgKlklGmm)* 	/<[0\`d0d+, 	%gkk2G&H-. 	-gkk:W.X/0 	vzz*?@12 	

+A B34 	56 	C.78 	$((#34:9: 	)? @ eDHHM^D_ ece; r   c                p   | xs i } | j                  d      xs g D cg c]  }t        |       }}| j                  d      xs d| j                  d      xs d| j                  d      xs d| j                  d      du | j                  d      du | j                  d	      du | j                  d
      xs d| j                  d      xs t        |      t        |D cg c]  }|j                  d      dk(  s| c}      | j                  d      xs g | j                  d      xs g |dS c c}w c c}w )NrJ   r1   r   r3   rN   
proofFoundTstrictSourceHotspotProofFoundtileHotspotConfirmed$strictHotspotRejectionClassificationcandidateCountblockedmissingEvidence&failedStrictSourceHotspotReviewGateIds)r1   r3   rN   r   r   r   rejectionClassificationr   rejectedCandidateCountr   failedGateIdsrJ   )r6   r   r}   )rK   r8   rG   s      r    strict_hotspot_runtime_checklistr      s4   \rF ::o.4" 	)-J 
 **X&,"**X&,"!::&78>Bjj.$6)/4S)TX\)\ &

+A Bd J#)::.T#U#[Y[ **%56I#j/"%j&lsCGGL]D^bkDks&l"m!::&78>B$LMSQS# 	 'ms   D.D38D3c                
   g }| j                  d      xs g D ]  }|j                  d      xs i gd   xs i }|j                  d      %|j                  d       d|j                  d       nd }|j                  d      6|j                  d      %|j                  d       d|j                  d       nd }|j                  |j                  d	      |j                  d
      dddt        |j                  d	      xs d||      |r!t        |j                  d
      xs d|d      ndt        |j                  d
      xs dd      |j                  d       d|j                  d       d|j                  d       d|j                  d       d	        t        |      }|rA|j                  d      xs i }|j                  d      xs i }	|j                  |j                  d	      |j                  d
      dd|j                  d      |j                  d      |j                  d      |j                  d       d|j                  d       d|j                  d       d|	j                  d       d|	j                  d       d|	j                  d       |j                  d      |j                  d      xs g dj	                  |j                  d      xs g       d       | j                  d       xs g D ]  }|j                  d	      }
|j                  d
      }|
r|s*|
|j                  d	      k(  r||j                  d
      k(  rS|j                  |
|d!d"|j                  d#      xs d$t        |
d|d%      t        |d      dj	                  |j                  d&      xs g       xs d'd(        | j                  d)      xs g D ]  }|j                  d	      }
|j                  d
      }|
r|s*|j                  d       d|j                  d       }|j                  d*      d+u xr |j                  d      d,v }|j                  |
|d-|rd.nd/|j                  d0      t        |
||ddd|1      t        |d      |j                  d       d| d(        i }|D ]  }|j                  d	      }
|j                  d
      }|
r|r|
|k(  r/|
|f}|j                  |      }|J|j                  d2d3      |j                  d4d      f|j                  d2d3      |j                  d4d      fk  s|||<    t        |j                         d5 6      S )7NconfirmedEdgespointsr   rc   r   rd   spawnXspawnYr1   r3   	confirmedr   )	startTile	focusTilerouteAssistr   trialTransitionsr   overview -> )	r1   r3   kindrankrk   openUrlnextUrl	targetUrldetailsampler?   zrouteAssist-blockerrN   rT   targetSpawnUrlrA    rO   rP   ; )r1   r3   r   r   rk   r   r   r   rO   rP   promotionBlockSummary#saveSelectorCandidateReachableEdgeszsave-selector-trial   promotionRisk	candidate)r   transitionTargetr   	selectors-)r1   r3   r   r   rk   r   r   r   mapExitTrialReachableEdges	standableT>   topleftrightbottomzmap-exit-trial      rk   r   r   	collisionr   r   r   r   c   r   c                    | d   | d   | d   fS )Nr1   r   r3    rB   s    r   rC   z*route_assist_graph_edges.<locals>.<lambda>   s    #h-VVYZbVc9d r   rD   )r6   r&   r/   rH   r'   rE   values)playable_progressrF   edgesedgepoint
start_tile
spawn_tileblocker_exitr   hintr1   r3   tileautobest_by_pairr+   previouss                    r   route_assist_graph_edgesr      sn   E!%%&67=2 ((8$,a07R=BYYs^=W		#'q3(89]a
 yy".599X3F3R yy"#1UYYx%8$9: 	
 	hhx(hhx(!txx17R:Ycdr|wtxx17R:`mn  CE (!3!9rAF3(%))C.)9eii>Q=RRSTYT]T]^fTgShi

 
	& %Y/L!!(+1r-3mmH-mmH-)mm$56#''(89%))*:;##F+,Afjjo->a

3?PPT88F#$Adhhsm_Adhhsm_F $0#3#34I#J(,,^<B%)YY|/?/?/O/USU%V
 	  "%%&KLRPR (#(#VY]]8,,9==;R1R)hh/>;vX^ijk !4hhtxx4:;Bs	
 		" "%%&BCIr (#(#V((3-$((3-1xx$,g&1AEg1g$A1hhx(!.!' !!4&)*!D62!
 	2 L %(#(#Vv'7v##C( 4dhhvr6JKx||\bdfOgiqiuiuv|  A  jB  OC   C $L% ,%%'-deer   c                   i }|D ]&  }|j                  |d   g       j                  |       ( |j                         D ]  }|j                  d         | h}i }| g}t	        | g      }	|	rn|	j                         }
|j                  |
g       D ]F  }|d   }||v r|j                  |       |
|f||<   |j                  |       |	j                  |       H |	rng }|d|dz    D ]M  }g }|}||v r ||   \  }}|j                  |       |}||v r |j                          |j                  |t        |      |r|d   d   g|D cg c]  }|d   	 c}n|g|D cg c]  }|j                  d      |j                  d      |j                  d      |j                  d      |j                  d	      |j                  d
      |j                  d      |j                  d      |j                  d      |j                  d      xs g |j                  d      xs dd c}t        |dd      d       P ||fS c c}w c c}w )Nr1   c                P    | j                  dd      | j                  d      xs dfS )Nr   r   r3   r   r5   rB   s    r   rC   z$route_assist_paths.<locals>.<lambda>   s$    37762#68I8OR"P r   rD   r3   r   r   r   rk   r   r   r   r   rO   rP   r   r   )r1   r3   r   rk   r   r   r   r   rO   rP   r   r   r   r   )r3   hopCountr   stepsr   )
setdefaultr&   r   sortr   popleftr6   addreverser}   r/   )	start_mapr   limit	adjacencyr   r7   seenparentsorderqueuecurrentr3   samplesr   cursorr   steps                    r   route_assist_pathsr      sm   ')I >T(^R077=>  " R		P	QR;D+-GKE9+E
--/MM'2. 	!D(^F~HHV&oGFOLL LL 	!  G%!)$ $V_NHdLLF  	E
QVU1Xh'Me*Ld4>*LM]c\d "  #hhx0"hhx0 HHV,"hhx0"hhx0#xx	2#xx	2!%+!6+/884I+J$(HH^$<$B-1XX6M-N-TRT  vPQR)
 	< '>' +Ms   H9CH>c           	         | syd| v rdnd}g }|j                         D ]<  \  }}||dk(  r|j                  | dt        |      j                  dd              > | |r|dj	                  |      z   z   S dz   S )Nr   ?r!   r    r   r   )r#   r&   r$   r%   r'   )hrefr)   	separatorr-   r+   r,   s         r   add_query_paramsr   ,  s    d{IElln @
U=ERKuAc%j00e<=>?@ %9sxx.@@R@@r   c                   | xs i j                  d      xs g }|sy |d   j                  d      xs i }|j                  d      }|j                  d      }|r|sy |j                  d      xs g }|sy |d   }|j                  d      xs i }t        ||j                  d       d	|j                  d
       |j                  d       d	|j                  d
       ddd|      }t        ||j                  d      %|j                  d       d	|j                  d
       nd |j                  d      %|j                  d       d	|j                  d
       nd d      }	|j                  d       d|j                  d       d	|j                  d
       d|j                  d       d|j                  d       d	|j                  d
       }
|d||g||d|j                  d      |
|d |	dgt        |dd      t        ||      dS )Nr7   r   r   r1   r3   exitCandidatesr?   rc   r   rd   r   r   r   )r   r   r   rA   r   r   zreciprocal-return-trialrN   )r1   r3   r   rk   r   r   r   r   r   )	routeGoal)r3   r   r   r   r   goalStartUrl)r6   r/   r   ) reciprocal_transition_candidatesr7   r   r1   r3   rY   r   r   open_url
target_urlr   s              r   reciprocal_return_path_sampler   8  s&   ,277?E2DAw{{9%+G[["F[["FKK()/REaI==&,"D]]3'()--*<)=>]]3'()--*<)=>&H 8<8QTXXc]O1TXXc]O4W[8<8QTXXc]O1TXXc]O4W[	J == 
!9==#5"6a	c8J7K488F
Adhhsm_Adhhsm_	> 
   ! 1!++&78 #'	
 6MAN(VD# r   c                   | j                  d      xs d}| j                  d      xs i gd   }|j                  d      xs ddd}|j                  d	       d
|j                  d       }t        t        |      |	      }g }|j                  d      xs g D ]*  }|j                  d      xs i }|j                  d      xs i }|j                  |j                  d      |j                  d	      |j                  d      d|j                  d      |j                  d      |j                  d	      |j                  d      |j                  d      d|j                  d      |j                  d      |j                  d      |j                  d      xs g dj	                  |j                  d      xs g       d
       - t        | |      }t        ||      \  }}|D ](  }|j                  d      }|st        ||d|      |d<   * | j                  d      xs g D cg c]  }|j                  d      |j                  d      k(  r|j                  d      |j                  d      k7  r|j                  d      |j                  d      |j                  d      xs g |j                  d       xs g t        |j                  d      xs d!dd"#      t        |j                  d      xs d$d"%      d& c}d d' }|xs i }|j                  d(      xs g }|r|d   ni }|j                  d)      xs i }d*|j                  d      |j                  d      |j                  d+      |j                  d,      |j                  d-      |j                  d.      |j                  d/      |j                  d0      |j                  d1      d2
}t        |      }|r|j                  |       |xs i }|xs i }|xs i }|xs i }|j                  d3      xs i }d4|j                  d5      |j                  d6      |j                  d7      |j                  d8      |j                  d9      |j                  d:      |j                  d,      |j                  d;      |j                  d<      |j                  d=      |j                  d>      |j                  d?      |j                  d+      |j                  d,      |j                  d@      |j                  dA      xs g |j                  dB      xs g |j                  dC      xs g D cg c]U  }|j                  dD      |j                  dE      |j                  dF      |j                  dG      |j                  dH      dIW c}|j                  dJ      |j                  dK      dL|j                  dM      xs g d dN dO} t        dP      }!t        dQ      }"t        dR      }#i dS|!dT|!rdUndVdW|"dX|"rdUndVdY|#dZ|#rdUndVd[|j                  d\      xs d]d^|j                  d_      d`|j                  da      db|j                  dc      xs ddd|j                  de      xs ddf|j                  df      dg|j                  dg      dh|j                  dh      di|j                  di      xs i dj|j                  dj      dk|j                  dk      i dl|j                  dl      dm|j                  dm      dn|j                  dn      xs g do|j                  dp      dq|j                  dr      ds|j                  dt      du|j                  dv      xs i dw|j                  dw      xs g dx|j                  dx      dy|j                  dy      dzd{d|d}d~|j                  d      d|j                  d      dddddddddgdg dddddd}$|xs i }|
xs i }
t        |	      }%|
j                  d      xs g D cg c]U  }|j                  d      |j                  d      |j                  d      |j                  d      |j                  d      dW }&}|j                  d      xs i }'|j                  d      xs i }(d|j                  d:      |j                  d.      |j                  d      |j                  d      |j                  d      |j                  d,      |j                  d      |j                  d      xs g |'j                  d      |'j                  d      |'j                  d      |'j                  d      |'j                  d      |'j                  d      |'j                  d      |'j                  d      |'j                  d      |'j                  d,      d
|(j                  d      |(j                  d      |(j                  d      |(j                  d      |(j                  d      d|j                  d      d})i ddd\dd||t        ||      dd||t        ||d      dd| j                  d      xs g d| j                  d      xs g di d|j                  d      d|j                  d      d\|j                  d\      d,|j                  d,      d|j                  d      xs g d|j                  d      d|j                  d      ddd|j                  d,      d|j                  d      xs dd|j                  d      xs g d|
j                  d,      d|
j                  dë      d|&ddƓddȓd|)j                  dʫ      |)j                  d,      |%d˜d|d|d|d| d|$d|)dt        |      dt        |      d|d|dddt        |       d؝ddddd|"sdndd|$d[    d|$dl    ddd| j                  d7       dd| j                  d      xs i j                  d<       d| j                  d      xs i j                  d=       dd|j                  d       d|j                  d       d|j                  d       ddd|%j                  d       d|%j                  d       dt        |%j                  d      xs g        dddddgiS c c}w c c}w c c}w )NstartMapmap1_02bconfirmedEntryRoutesr   r         )rc   rd   rc   r   rd   r;   r   r?   rA   r=   r>   )rc   rd   rA   rT   r   rO   rP   r   )
rA   r   r=   r>   r_   rT   r   rO   rP   r   r3   r   )r   r   r   r   r   r1   r   leafPointersr4   r   r   map2_18dr   )r1   r3   r   r   r   r      r7   r   z%reciprocal_transition_candidates.htmlclassificationrN   selectorRecordCountstrictEventRecordCountexitCandidateCountreciprocalExitCandidateCountautoExitCandidateCount)
urlr1   r3   r   rN   r   r   r   r   r   inputTransitionContext runtime_title_start_context.jsonselectedPointerStaticHexselectedPointerSelectorlivePointerClassificationselector8FieldRecordSpanHextitleResourceTailSpanHexfieldMapCountroutePromotionAllowedfromSelector
toSelectortoPointerHextoSelectedRootHextoFieldMapCounttoLinkedCnstoReferencedCnstoResourcePayloadsr   r   widthheightbpp)r   r   r  r  r  toSelectionReaderCounttoSelectionWriterCount)r
  r  	toPointertoSelectedRootr   rN   r  r  r  r  r  r  candidateMaps   )	reportUrlselectedPointerselectorr  r  r  r  rN   r	  inputTransitionr  z-save_selector_real_savedata_evidence_gap.htmlzsavedata_sample_deltas.htmlzsavedata_slot_scan.html
realGapUrlrealGapStatus	availablez&parked until external savedata refreshsampleDeltasUrlsampleDeltasStatusslotScanUrlslotScanReportStatusslotScanStatusrk   unknownslotScanFoundCount
foundCountslotScanValidCount
validCountslotScanRealRouteEvidenceCountrealRouteEvidenceCandidateCount slotScanSyntheticDiagnosticCountsyntheticDiagnosticCountrealCandidateCountvalidRealCandidateCountvalidRealCandidatesAllBlocked#validRealCandidateBlockReasonCountsarchiveCandidateCountarchiveSkippedCountcurrentSelectorRealSaveCountroutePromotionRealSaveCountpublicSampleSelectors,sampleDeltaSelectorDistinguishingOffsetCount!selectorDistinguishingOffsetCount+sampleDeltaCurrentSelectorPublicSampleCount currentSelectorPublicSampleCount%sampleDeltaRoutePairPublicSampleCountroutePairPublicSampleCount"sampleDeltaClosestSourceTargetPairclosestPublicSourceTargetPairpublicSearchNotespublicCurrentFrontierCoveredsyntheticDiagnosticExcludedrequiredSelectorz2:0requiredSelectedPointer
0x00540714requiredSourcerequiredTargetrequiredSaveBytes0x00020x02zscene selector group)offsetr,   label0x00030x00zscene selector slotbrowserScanPatterns)z3SAVEDATA/savedat1.dat through SAVEDATA/savedat9.datz3SAVEDATA/savedat1.zip through SAVEDATA/savedat9.zipz3SaveData/savedat1.dat through SaveData/savedat9.datz3SaveData/savedat1.zip through SaveData/savedat9.zipsavedatUrlDatExamplez4../web/game.html?savedatUrl=../SAVEDATA/savedat2.datz4../web/game.html?savedatUrl=../SAVEDATA/savedat2.zipz../web/game.html?savedatScan=1)savedatUrlZipExamplesavedatScanUrlexternalInputChecklistidneededInputcurrentStateacceptedSignalrefresh)rU  rV  rW  rX  rY  routeStatusconfirmedReferencez!strict_event_source_coverage.htmlstrictEventSourceMapCountstrictEventPairCount strictEventSourceCoveragePercentpromotionAllowedreachableStrictSourceUncovereddirectStrictPairCountsourceStrictEventCounttargetStrictIncomingCount%sourceAsEventSourceStrictClusterCount%sourceAsEventTargetStrictClusterCount"sourceAsManifestStrictClusterCounttargetStrictClusterRoleCount)
r1   r3   ra  rb  rc  rd  re  rf  rg  rN   confirmedReviewCountrejectedReviewCount)r1   r3   ra  rh  ri  
conclusion)r  r  r   r\  r]  r^  rN   r_  r`  router[  rj  titlezHwanse Web Playtest RoutezrouteAssist-requiredconfirmedStart)r   )r   r   r   assistStartr   confirmedReachablereachableFromStartr   blockerr   sourceRouteAssistUrltargetOverviewUrlevidenceMatrixUrlz"route_blocker_evidence_matrix.htmlevidenceMatrixStatusexternalProofHandoffUrlz+route_promotion_external_proof_handoff.htmlexternalProofHandoffPackageIds&externalProofHandoffExpectedPackageIdsexternalProofHandoffStatusexternalProofHandoffAchievedachievedexternalProofRequiredInputscompletionAuditUrlzcompletion_audit.htmlgoalCompletionChecklistUrlzgoal_completion_checklist.htmlstrictEventCoverageUrlr  )strictEventCoverageStatusstrictHotspotChecklistreciprocalReturnpostBlockerCandidateEdgestitleStartContextsavedataEvidencestrictEventCoveragerouteAssistGraphEdgeCountrouteAssistReachableCountrouteAssistReachablerouteAssistPathSamplesplaytestNotesz6Confirmed gameplay reaches map1_02b and map1_01a only.z#RouteAssist can currently navigate zx maps through confirmed, selector-only, and geometry-only trial edges; this is a playtest graph, not normal-route proof.uc   Use assistStart or the in-game 보조 button to continue through trial-only routeAssist candidates.a  The map1_01a -> map1_02b return candidate is listed in [reciprocal transition candidates](reciprocal_transition_candidates.html); it is selector/geometry-only and remains manual-review-only. It is also available as a route path target when routeAssist is enabled.a+  If a captured gameplay save is copied into SAVEDATA/ or original-case SaveData/, open [savedatUrl dat example](../web/game.html?savedatUrl=../SAVEDATA/savedat2.dat) or [savedatUrl zip example](../web/game.html?savedatUrl=../SAVEDATA/savedat2.zip) to load it and check whether it covers selector 2:0.zUse [scan SAVEDATA](../web/game.html?savedatScan=1) to scan SAVEDATA/savedat1.dat through savedat9.dat, SAVEDATA/savedat1.zip through savedat9.zip, and matching SaveData aliases, then load the first selector 2:0 candidate if one is present.zThe terminal real-savedata gap scan also accepts downloaded zip archives and checks savedat*.dat members without manual extraction.zSavedata public sample byte deltas report is parked until an external savedata refresh; current cached values still show selector 2:0 public samples `0` and route-pair public samples `0`.zSavedata public sample byte deltas are summarized in [savedata sample deltas](savedata_sample_deltas.html); they still show selector 2:0 public samples `0` and route-pair public samples `0`.z:Savedata evidence is still blocked: SAVEDATA scan status `z `, current selector real saves `z`.z{Latest public savedata search found no additional non-synthetic selector 2:0 save beyond the preserved calibration samples.zOriginal EXE title/start diagnostics are listed in [runtime title start context](runtime_title_start_context.json); the live pointer is classified as `z` and remains diagnostic-only.z+The observed original input transition is `r  r   zZ` and resolves to non-field-map resource payloads, so it is not normal map-start evidence.zqStrict event source coverage is summarized in [strict event source coverage](strict_event_source_coverage.html); z- is not an extracted strict event source, so zd still needs a strict source hotspot, captured selector 2:0 save, or runtime selected-pointer trace.zRouteAssist blocker candidates keep their strict-hotspot block reasons in the runtime route data, so geometry-only movement stays visibly trial-only until strict event, captured save, or runtime trace evidence exists.zMThe runtime route blocker marker now carries a strict-hotspot checklist with r   z candidates, rejection `r   z`, and z missing proof items.a#  External proof intake is summarized in [route promotion external proof handoff](route_promotion_external_proof_handoff.html); it links the captured savedata intake, runtime trace feasibility, strict hotspot packet, selected-root packet, predecessor fill packet, and opcode24 producer packet.zThe route index mirrors the handoff Required External Inputs table so the three accepted proof paths stay visible from the playtest page: real selector 2:0 save, normal-route runtime trace, and strict source hotspot.zThe same route index links the completion audit so the top-level achieved=false status, prompt-to-artifact checklist, and partial/missing requirements stay one click from the playtest route.zUThese routeAssist steps are for playtesting and do not promote normal-route evidence.)r6   r\   r9   r&   r'   r   r   r/   r   r   r   r}   )*r   route_assist_frontierroute_blocker_matrixreal_savedata_gapsavedata_sample_deltassavedata_slot_scanr   runtime_title_start_contextstrict_event_source_coverage,strict_source_hotspot_external_review_packet&route_promotion_external_proof_handoffr   first_router   start_tile_textrF   candidate_exitsr8   r   r   route_graph_edgesroute_assist_reachableroute_assist_paths_sampler3   r   post_blocker_edgesreciprocal_rowsfirst_reciprocalreciprocal_reversereciprocal_returnreciprocal_path_sampleinput_transitiontitle_start_contextreal_gap_urlsample_deltas_urlslot_scan_urlsavedata_evidencestrict_hotspot_checklistexternal_input_checkliststrict_routestrict_confirmedstrict_event_coverages*                                             r   build_summaryr  n  s%    "%%j1?ZI$(()?@HRD!LK-Cr1CJ#,-Qz~~c/B.CDO4344I O}}-.4" "(bww|$*GGFO **S/

3@77=1GGN3!%#TXXc]DHHU[L\]!gg&67!gg&67#&77+@#AGGN39r%)YYsww~/F/L"%M 
 	 11BIN8J9Vg8h55+ H%%,)!. 	&F>"$ &))*OPVTV 88Hx!88TXXh=OS\S`S`aiSj=j hhx(hhx(+.4" HH^4:txx1?ZR_jkl (!3!AzAN	
 	q
 (H'M2$6::6BHbO-<q)")--i8>B6$((2$((2,001AB-112CD1556KL"4"8"89Q"R0445IJ(:(>(>?](^"4"8"89Q"R ;;[\!(()?@)/R39r+1r"="C2667OPVTV76::;UV/334MN%@%D%DE`%a'B'F'FGd'e$?$C$CD^$_488I6::;LM!<!@!@AX!Y,00@*..|<)--n=.223FG.223CD/334EF/334EF+//>D"/334EFL" ,//0DEK	#   GGFOGGFO WWW-!ggh/775>	# '7&:&:;S&T&6&:&:;S&T+
. 699/JPbRTSTUC"F %%TUL)*GH%&?@M/l/:b/ 	,/ 	->kDl	/
 	}/ 	}Bj/ 	,00:Gi/ 	044\B/ 	044\B/ 	)*<*@*@Ab*c*hgh/ 	+,>,B,BC],^,cbc/ 	/334HI/ 	"#4#8#89R#S/ 	():)>)>?^)_/ 	./@/D/D10
 0#/$ 	 !2!6!67N!O%/& 	0445JK'/( 	'(9(=(=>\(])/* 	&'8'<'<=Z'[+/, 	 !2!6!67N!O!USU-/. 	78N8R8RSv8w//0 	67M7Q7QRt7u1/2 	01G1K1KLh1i3/4 	-.D.H.HIh.i.omo5/6 	.223FGM27/8 	'(9(=(=>\(]9/: 	&'8'<'<=Z'[;/< 	E=/> 	"<?/@ 	)--1A/B 	)--1C/D 	&;QR&;PQ
E/L 	  
M/X 	 VY/Z !W:]/` $@#E2 -S-YWY*?@lm :==>VW][]	   ''$-77=1GGN3!gg&67wwy)	
	  	  033MBHbL3778LMSQS8599/J">"B"BC["\%A%E%EFa%b < @ @AW X,H,L,LMo,p7;;<MN8<<=OP*F*J*JKk*l*rpr"&&x0"&&x0%1%5%56M%N&2&6&67O&P)5)9)9:U)V5A5E5EFm5n5A5E5EFm5n2>2B2BCg2h,8,<,<=[,\+//0AB
 '**84&**84%5%9%9:Q%R$4$8$89O$P#3#7#78M#N
 366|D;>v,v(v 	#9@
v 	#9R_`
v 	/334HIORv 	+//0@AGRv 	 
immH-
immH-
 immH-
 y}}->?	

 y}}->?E2
 #IMM2H$I
  /B!C
  !E
 #$8$<$<=N$O
 &';'?'?@Y'Z (=<
 -$(()QRXVX
 )*P*T*TUf*g
  +,R,V,VWa,b!
" *+C#
$ !"9%
& )*J'
( %&;&?&?&L)
* *?)B)BCT)U&>-
vN 	/OvP 	-QvR 	$%7SvT 	0UvV 	-WvX 	4YvZ 	$S):%;[v\ 	$S)?%@]v^ 	 6_v` 	!";avb 	D1#6L2M1N  OG  Hq{ z  R )v V)):;K)L(M N00AB`0a/bbdf J'++,GHIIgi
(,,->?E2JJ>Z[[_'++,=>D"II,WX YMMV==*++X==*+4	h0G/H IQQJ `+//0@AB C,001JKLG/334EFL"MNNce_-
y dGD
cv vQp	#J	 s   %Cs/
As4(-As9c                $$   d1d2d}| 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                  | j                  d      xs g        d| j                  d       dddj                  | j                  d      xs g        d|j                  d       d|j                  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                  d*       d%|j                  d*       dd+|j                  d,       d%|j                  d,       dd-dj                  |j                  d.      xs g        d/|j                  d0       d1|j                  d2       d	dd3dg}|j                  d4 | d5   D               |j                  d6      xs g }|j                  g d7       |D ]n  }|j                  d8|j                  d9       d:|j                  d;       d<|j                  d=       d<|j                  d>       d?|j                  d@       dA       p |j                  dB      xs i }|j                  ddCddD|j                  d       d|j                  d        d	d|j                  d"       dE|j                  dF       dG|j                  dH       d	dI|j                  dJ       d	dK|j                  dL       dM|j                  dN       d	dOdj                  |j                  dP      xs g       xs dQ ddRdSg       |j                  dT      xs g D ]  }|j                  dU      xs i }	|j                  dV      xs i }
g }|j                  dW      r$|j                  dX|j                  dW       d       |j                  dY      r$|j                  dZ|j                  dY       d       |j                  dj                  g d[|j                  d\       d?|	j                  d       d|	j                  d       d]|	j                  d^       d_|	j                  d`       d:|
j                  d\       d|
j                  d       d|
j                  d       da|
j                  db       dc|j                  dd       de|j                  df       d:|j                  dg       dh|j                  di       d<djj                  |j                  dk      xs g       xs dQ d<dlj                  |      xs dQ dm              | j                  dn      xs i }|j                  do      xs i }|j                  dp      xs i }|j                  ddqddr|j                  ds       d%|j                  ds       ddt|j                  du       dv|j                  dw       dx|j                  dy       dz|j                  d{       d|	d}|j                  d       d|j                  d        d~|j                  d       d|j                  d       d|j                  d       d	d|j                  d       d|j                  d       d|j                  d       d|j                  d       d		d|j                  d       d|j                  d        d~|j                  d       d|j                  d       d|j                  d       d	ddj                  |j                  d      xs g       xs dQ d|j                  d"       d|j                  d       d	g
       | j                  d      xs i }dj                  d |j                  d      xs g D              }|j                  dddd |d|j                  d      |j                  d             d|j                  d       d|j                  d       dh|j                  d       d		d|j                  d       d|j                  d       d	d |d|j                  d      |j                  d             d |d|j                  d      |j                  d             d|j                  d       d|j                  d       d|j                  d       d		d|j                  d       d|j                  d       d|j                  d       d|j                  d       d		d|j                  d       d|j                  d       d	d|j                  d«       d	d|j                  dī       d	ddj                  |j                  dƫ      xs g       xs dQ d| d|j                  dɫ       d|j                  d˫       d|j                  d̫       d	ddjj                  |j                  dΫ      xs g        d|j                  dЫ       d|j                  dҫ       d|j                  dԫ       dg       |j                  g dբ       |j                  d֫      xs g }|r|j                  dׄ |D               n|j                  dث       | j                  d٫      xs i }|j                  dګ      xs i }|j                  d۫      xs g D cg c]K  }|j                  dܫ       d|j                  dޫ       d|j                  d߫       d|j                  d       M }}|j                  ddddr|j                  ds       d%|j                  ds       dd|j                  d       d	d|j                  d       d	d|j                  d       d	d|j                  d       d	d|j                  d       d	d|j                  d"       d|j                  d       d	d|j                  d       d|j                  d       d|j                  d       d|j                  d"       d		d|j                  d       d|j                  d       d|j                  d       d	ddj                  |j                  d      xs g       xs dQ ddj                  |j                  d      xs g       xs dQ d	ddj                  |      xs dQ d	d|j                  d       d |j                  d       d	dddg       |j                  d      xs g D ]  }|j                  d8|j                  d       d:dj                  |j                  d      xs g       xs dQ d<dj                  |j                  d      xs g       xs dQ d|j                  d       d	|j                  d
       d|j                  d       d        |j                  g d       | d   D ]#  }|j                  d      xs i }|j                  dV      xs i }|j                  d[|j                  d\       d?|j                  d       d|j                  d       d:|j                  d       d?|j                  d       d:|j                  d\       d|j                  d       d|j                  d       d:djj                  |j                  dk      xs g       xs dQ d|j                  dW       d|j                  d       d       & | j                  d      xs i }|j                  ddddr|j                  d       d%|j                  d       dd|j                  d       d|j                  d        d	d|j                  d       d|j                  d"       d	d|j                  d       d|j                  dw       d	d|j                  d       d|j                  d        d!|j                  d"       d	g       |j                  g d#       | d$   D ]  }|j                  d[|j                  d       d<|j                  d        d<dj                  |j                  d%      xs g       xs dQ d&|j                  d       d'|j                  d(       d        |j                  g d)       | j                  d*      xs g D ]  }|j                  d+      xs i gd,   }|j                  d[|j                  d        d<|j                  d-       d<dj                  |j                  d.      xs g        d|j                  d/      xs& |j                  d      xs |j                  d       d	        |j                  d       d0j                  |      S c c}w (3  Nrk   c                0    |r	d|  d| dS |  d|xs d dS )N[]()z (znot generatedr   )rM  r   rk   s      r   	md_reportzmarkdown.<locals>.md_report  s3    ugRvQ''64_5Q77r   rm  rn  rq  z# Hwanse Web Playtest Router   z- status: ``z- confirmed start: [r   z `r   rc   r   rd   z`](r   r  z- routeAssist start: [open](z- confirmed reachable: , ro  z- routeAssist reachable: r  z mapsz- routeAssist reachable maps: r  z- blocker: `r1   r   r3   z` / rN   z- evidence: [rt  r  z) / [r  rv  z- completion audit: [r}  z- goal checklist: [r~  z- external proof packages: rw  z- external proof status: `ry  z` / achieved `rz  z## Playtest Notesc              3  &   K   | ]	  }d |   ywz- Nr   .0items     r   	<genexpr>zmarkdown.<locals>.<genexpr>  s     B2dVB   r  r|  )r   z## Required External Inputsr   zA| id | needed input | current state | accepted signal | refresh |z| --- | --- | --- | --- | --- |z| `rU  z` | rV  z | rW  rX  z | `rY  z` |r  z### Strict Hotspot Runtime Checklistz- source-target: `z` / proof `r   z` / tile hotspot `r   z- rejection: `r   z- candidates: `r   z` / rejected `r   z- missing evidence: r   r   zu| side | source tile | source standable | target spawn | coordinate status | reviews/events | block reasons | links |z1| --- | --- | --- | --- | --- | --- | --- | --- |rJ   r^   r_   rT   z	[assist](rz   z[spawn](z| rA   z
` | geom `re   z` / original `rf   z` original `rh   z` | `rj   z` / promotable `rl   rw   /rx   r   rP    / z |r  rk  r[  z## Strict Event Coveragez- report: [r  z- field maps: `r  z` / strict event records: `r   z` / strict source maps: `r\  z` (r^  z%)z
- route: `z` / direct strict pairs `ra  z` / source strict events `rb  z` / target strict incoming `rc  z/- route cluster roles: source-as-event-source `rd  z` / source-as-target `re  z` / source-as-manifest `rf  z` / target roles `rg  z- confirmed reference: `z` / confirmed reviews `rh  z` / rejected reviews `ri  z1- reachable maps without strict source coverage: r`  z- promotion: `z` / allowed `r_  r  c              3  j   K   | ]+  }d |j                  d       d|j                  d       d  - yw)r  rL  r    r,   Nr5   )r  r8   s     r   r  zmarkdown.<locals>.<genexpr>  s;       CGGHa 013s   13rI  z## Savedata Evidencez- slot scan: zSAVEDATA slot scanr$  r%  z / status `r&  z` / found-valid `r(  r*  z"- slot scan real route evidence: `r,  z` / synthetic diagnostics: `r.  z- real savedata gap: zreal savedata evidence gapr  r   z- public sample deltas: zsavedata sample deltasr"  r#  z$ / selector-distinguishing offsets `r9  z!` / selector 2:0 public samples `r;  z` / route-pair public samples `r=  z- real savedata candidates: `r0  z` / valid `r1  z` / archive `r4  z` / archive skipped `r5  z&- valid real candidates all blocked: `r2  z` / block counts `r3  z - current selector real saves: `r6  z- route-promotion real saves: `r7  z- public sample selectors: r8  z - required captured-save bytes: z- required selected pointer: `rE  z` covering `rG  rH  z- browser scan patterns: rP  z- browser links: [dat](rQ  z
) / [zip](rR  z) / [scan](rS  )r   z### Public Search Notesr   rA  c              3  &   K   | ]	  }d |   ywr  r   r  s     r   r  zmarkdown.<locals>.<genexpr>0  s     :Tr$[:r  z-- No additional public search notes recorded.r  r  r  r   :r   r  r  z## Original Title/Start Contextz- selected pointer: `r  z- selector: `r  z - live pointer classification: `r  z#- selector 8:0 field-record span: `r  z- title resource tail span: `r  r	  z- Input transition: `r
  r  z` / `r   z` / promotion `z$- Input transition target: pointer `r  z	`, root `r  z`, field maps `r  z - Input transition CNS: linked `r  z`, referenced `r  z- Input transition payloads: `z+- Input transition selector rows: readers `r  z`, writers `r  z5| map | scene ids | tilesets | open | walk | review |z%| --- | --- | --- | --- | --- | --- |r  sceneIdstilesetsz
 | [open](r   z) | [walk](walkUrlz) | [review](	reviewUrlz) |)r   z## Candidate Exitsr   z>| side | tile | auto | status | spawn | block reasons | open |z+| --- | --- | --- | --- | --- | --- | --- |r;   r   r=   rO   z | [assist](z) / [spawn](r   r  z## Reciprocal Return Candidatez- reverse: `z
- class: `z- selector records: `r   z` / strict events: `z
- exits: `r   z` / reciprocal hints: `r   z` / auto exits: `r   )r   z## Post-Blocker Candidate Edgesr   z&| source | target | selectors | open |z| --- | --- | --- | --- |r  r   z | [source](z) / [target](r   )r   z## RouteAssist Path Samplesr   z%| target | hops | path | first open |z| --- | ---: | --- | --- |r  r   r   r   r   r   
r   )rM  r$   r   
str | Nonerk   r  returnr$   )r'   r6   extendr&   )summaryr  startassistrq  linesexternal_inputsr8   strict_hotspotr~   r   linksstrictr  r  savedatarequiredpublic_notestitle_contextr  input_payloadsr   spawn
reciprocalfirsts                            r   markdownr    s   8
 $%E]#Fi G%

gh'(*
uU|nBu[/A#/F.Gq{I[\_I`Haadejkpeqdrrst
&ve}oQ7
!$))GKK8L,M,SQS"T!UV
#GKK0K$L#MUS
(7;;?U3V3\Z\)](^_
w{{8,-T'++h2G1HW[[YjMkLlm
$789GKKH[<\;]]bcjcncn  pH  dI  cJ  JL  MT  MX  MX  Yq  Mr  Ls  sx  y@  yD  yD  E^  y_  x`  `b  cj  cn  cn  oH  cI  bJ  JK  	L
,@ AB"W[[QeEfDgghi
gkk*FGH7;;WsKtJuuvw
%dii<\0]0cac&d%ef
$W[[1M%N$O~^e^i^i  kI  _J  ^K  KL  	M

#E& 
LLB)ABBkk"?@FBO	LL    
#''$-SWW]%;$<C@W?XX[ww'()cggi.@-AF	


 [[!9:@bN	LL
-

^//9:$~?Q?QRZ?[>\\]^
n(():;<KHZHZ[gHhGii{  }K  }O  }O  Pf  }g  |h  hi  	j
++,EFGqI
.,,-=>?~nN`N`ayNzM{{|}
tyy););<M)N)TRTU\Y\]^
;  !!/28b 
ggl+1rww}-377#$LL9SWW-=%>$?qAB77)*LL8CGG,B$C#DAFG` `b `! ` `kooc&:%; `1 `[__S=Q<R ` S ` __%89:`:H`ITYrIsHt`tx`'(`(*`+7+;+;C+@*A`AB`COCSCSTWCXBY`Ye`frfvfv  xV  gW  fX`X` *+,` -=` >AWWE[=\<]` ^b` ww,-.	` /0	` 148N0O/P	` QT	`
 yy06B7>3?`
 @C`
 DI::eCTC[X[B\`
 ]_`	

  [[./52F::g&,"Lzz"67=2	LL
"

fjj-.bK1H0IK
&**_566QRXR\R\]uRvQw  xQ  RX  R\  R\  ]x  Ry  Qz  z}  ~D  ~H  ~H  Ik  ~l  }m  mo  	p
\%%h/0\5E5Eh5O4PPijvjzjz  |S  kT  jU  Uo  p|  p@  p@  AY  pZ  o[  [w  xD  xH  xH  Id  xe  wf  fg  	h
9,:J:JKr:s9t  uK  LX  L\  L\  ]D  LE  KF  F^  _k  _o  _o  pT  _U  ^V  Vh  iu  iy  iy  zX  iY  hZ  Z[  	\
"#3#7#7#A"B$GWG[G[\dGeFff  AQ  AU  AU  Vm  An  @o  oF  GW  G[  G[  \r  Gs  Ft  tJ  K[  K_  K_  `u  Kv  Jw  wx  	y
;DIIfjjQqFrFxvx<y  =A  ~A  <B  	C
$567}VZZPbEcDddef  {{-.4"Hyy << 34: H 
LL


	"6]8SU]UaUabxUyz{  |G  HP  HT  HT  Ue  Hf  Gg  gx  yA  yE  yE  FZ  y[  x\  \]  ^f  ^j  ^j  k  ^@  ]A  AB  	C
,X\\:Z-[,\\x  zB  zF  zF  Gi  zj  yk  kl  	m
	*FUaHbdldpdp  rA  eB  !C   D  	E
"9-Ex||TeGfhphtht  vJ  iK  $L  #M  Mq  rz  r~  r~  m  rn  qo  oP  QY  Q]  Q]  ^K  QL  PM  Ml  mu  my  my  za  mb  lc  cd  	e
'5I(J'K;W_WcWcd}W~V  @M  NV  NZ  NZ  [r  Ns  Mt  tI  JR  JV  JV  Wl  Jm  In  no  	p
0>]1^0__qrzr~r~  @e  sf  rg  gh  	i
*8<<8V+W*XXYZ
)(,,7T*U)VVWX
%dii=T0U0[Y[&\&c`c%de
*8*5
(6O)P(QQ]^f^j^jk{^|]}  ~B  CK  CO  CO  P`  Ca  Bb  bc  	d
#DIIhll;P.Q.WUW$X#YZ
!(,,/E"F!GzRZR^R^_uRvQw  xC  DL  DP  DP  Qa  Db  Cc  cd  	e! $ 
LL45<< 34:L:\::DEKK 34:M$(():;Ar $''(<=C
  wwvq 1www #''("3!46N  
LL
)

m''45R8I8I+8V7WWXY
 1 12C DEQG
))*56a8
*=+<+<=X+Y*ZZ[\
-m.?.?@].^-__`a
'(9(9:T(U'VVWX
**+<=>mML]L]^uLvKwwxy
 0 4 4^ DETJZJ^J^_kJlImmr  tD  tH  tH  IY  tZ  s[  [j  k{  k  k  @Q  kR  jS  ST  	U
./?/C/CK/P.QQZ[k[o[o  qA  \B  [C  CR  Sc  Sg  Sg  hy  Sz  R{  {|  	}
*4995E5I5I-5X5^\^+_+fcf*ggvw{  xA  xA  BR  BV  BV  Wh  Bi  Bo  mo  xp  xw  tw  wx  xy  	z
(>)B)Ic(J!L
56F6J6JKc6d5eeq  sC  sG  sG  H`  sa  rb  bc  	d
?/% (   17R 
#''%.!dii
0C0Ir&J&Qc%RRUyy,23:s; <ggi()SWWY5G4HVYV]V]^iVjUkknp	

 
LL   '( 
wwv$"&,"!dhhsm_Adhhsm_DQ^I_H` a-./tEIIf4E3FbSVHXXYZ_ZcZcdgZhYiimyy06B7>3? @ 012,swwGW?X>YY\^	

 /06BJ	LL
(

jnnU+,Bz~~e/D.EQG
z~~h/0Z^^H5M4NaP
Z^^$456ojnnUfFgEhhij

/D EFFZ[e[i[i  kC  \D  [E  EF  	G
Z^^$89::QR\R`R`a  SA  RB  BS  T^  Tb  Tb  c{  T|  S}  }~  		 	 
LL   23 
"#3swwx'8&9TYYsww{G[Ga_a=b=ifi<j k	*+=9M8NcS	


 
LL   {{34: 
!)bT1-"#3swwz':&;3v{{377SY?K`^`?a>b cggn-[91E[QZI[\\_a	

 
LL99Ums   AAHc                =   d9dd:fd| d   }| d   }| d   }| j                  d      xs i }| j                  d      xs i }|j                  d	      xs i }|j                  d
      xs i }| j                  d      xs i }|j                  d      xs i }	|	j                  d      xs g D 
cg c]K  }
|
j                  d       d|
j                  d       d|
j                  d       d|
j                  d       M }}
| j                  d      xs i }g }| d   D ]  }
|
j                  d      xs i }|
j                  d      xs i }|j                  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t        j                  t	        |j                  d                   d |j                  d       d|j                  d       dt        j                  d!j                  |
j                  d"      xs g       xs d#       d$ |
j                  d%      d&       d' |
j                  d(      d)       d*        g }| d+   D ]  }
|j                  dt        j                  t	        |
j                  d,                   d$t        j                  t	        |
j                  d-                   d$t        j                  d.j                  |
j                  d/      xs g       xs d#       d$ |
j                  d0      d,       d' |
j                  d1      d-       d*        g }| j                  d2      xs g D ]  }
|
j                  d3      xs i gd4   }|j                  dt        j                  t	        |
j                  d-                   d$t        j                  t	        |
j                  d5                   d$t        j                  d6j                  |
j                  d7      xs g              d$ |
j                  d8      xs$ |j                  d0      xs |
j                  d0      d9       d*	        d:j                  fd;| d<   D              }g }|j                  d=      xs g D ]  }
|j                  d>t        j                  t	        |
j                  d?                   dt        j                  t	        |
j                  d@                   d$t        j                  t	        |
j                  dA                   d$t        j                  t	        |
j                  dB                   dt        j                  t	        |
j                  dC                   dD        |j                  dE      xs i }g }|j                  dF      xs g D ]3  }
|
j                  dG      xs i }|
j                  d      xs i }|j                  d:j                  g dt        j                  t	        |
j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dHt        j                  t	        |j                  dI                   dJt        j                  t	        |j                  dK                   dt        j                  t	        |j                  d                   d t        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dJt        j                  t	        |j                  dL                   dMt        j                  t	        |
j                  dN                   dOt        j                  t	        |
j                  dP                   dt        j                  t	        |
j                  dQ                   d't        j                  t	        |
j                  dR                   d$t        j                  d!j                  |
j                  d"      xs g       xs d#       d$ |
j                  d%      d&       d' |
j                  dS      d)       d*             6 g }|j                  dT      xs g D ]  }
|j                  d>t        j                  t	        |
j                  dU                   dMt        j                  t	        |
j                  dV                   dt        j                  t	        |
j                  d                   d*        d:j                  dW |j                  dX      xs g D              xs dY}g }|j                  dZ      xs g D ]  }
|j                  d>t        j                  t	        |
j                  d[                   dt        j                  d.j                  |
j                  d\      xs g       xs d#       d$t        j                  d.j                  |
j                  d]      xs g       xs d#       d$ |
j                  d0      d9       d$ |
j                  d^      d_       d$ |
j                  d`      da       d*       	 dbj                  g dcdddedft        j                  | dg          dhdi |j                  dj      |j                  d[      xs dk       d |dl   j                  d       d|dl   j                  d       dm |j                  dj      d9       dn	dot        j                  d.j                  | j                  dp      xs g              dndq| j                  dr       dst        j                  t	        |j                  d[                   dt| j                  du       dvdwt        j                  d.j                  | j                  dx      xs g              dndyt        j                  t	        |j                  d,                   dzt        j                  t	        |j                  d-                   d{t        j                  t	        |j                  d|                   d} |j                  d~      d       d' |j                  d      d       d' |j                  d      d       dnd |j                  d      d       d |j                  d      d       ddt        j                  d.j                  |j                  d      xs g       xs d#       ddt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dd| ddd|dddt        j                  t	        |j                  d,                   dzt        j                  t	        |j                  d-                   dt        j                  t	        |j                  d|                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   ddt        j                  d.j                  |j                  d      xs g       xs d#       dnd|ddd |j                  d      d       dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   ddt        j                  t	        |j                  d,                   dzt        j                  t	        |j                  d-                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d|                   dt        j                  t	        |j                  d                   ddt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  dë                   dt        j                  t	        |j                  dū                   dt        j                  d.j                  |j                  dǫ      xs g       xs d#       ddt        j                  t	        |j                  d,                   dzt        j                  t	        |j                  d-                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  dʫ                   dt        j                  t	        |j                  d̫                   dd͑d |j                  dj      dΫ       dt        j                  t	        |j                  d,                   dzt        j                  t	        |j                  d-                   dt        j                  t	        |j                  dѫ                   dt        j                  t	        |j                  d|                   ddt        j                  t	        |j                  dӫ                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d֫                   dt        j                  t	        |j                  dث                   dt        j                  t	        |j                  dګ                   ddۑd |j                  dݫ      dޫ       d t        j                  t	        |j                  d߫                   dt        j                  t	        |j                  d                   d't        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dd |j                  d      d       dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dd |j                  d      d       dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   d	dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   d	dt        j                  t	        |j                  d                    dt        j                  t	        |j                  d                   ddt        j                  d.j                  |j                  d      xs g       xs d#       dt        j                  t	        |j                  d                   ddt        j                  d!j                  |j                  d      xs g              dd	 |j                  d
      d       d' |j                  d      d       d' |j                  d      d       dd|ddd| ddd |j                  d      d       dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   d{t        j                  t	        |j                  d|                   dt        j                  t	        |j                  d                   ddt        j                  t	        |j                  d                   dt        j                  t	        |j                  d                   dd t        j                  t	        |	j                  d!                   dzt        j                  t	        |	j                  d"                   d#t        j                  t	        |	j                  dѫ                   dt        j                  t	        |	j                  d|                   d$t        j                  t	        |	j                  d%                   d&t        j                  t	        |	j                  d'                   d(t        j                  t	        |	j                  d)                   dd*t        j                  d.j                  |	j                  d+      xs g       xs d#       d,t        j                  d.j                  |	j                  d-      xs g       xs d#       d.t        j                  d.j                  |      xs d#       d/t        j                  t	        |	j                  d0                   d't        j                  t	        |	j                  d1                   dd2|dd3d4|dd5d6|dd7d8|d      S c c}
w (;  NrM  c                    | st        j                  |       dS dt        j                  |        dt        j                  |       dS )Nz+ <span class="muted">(not generated)</span>z	<a href="z">z</a>)htmlescape)r   rM  s     r   linkzhtml_page.<locals>.link  sF    kk%())VWW4;;t,-RE0B/C4HHr   c           	        g }d}t         j                  |       D ]}  }|j                  t        j                  | ||j                                       |j                   |j                  d      |j                  d                   |j                         } |j                  t        j                  | |d               dj                  |      S )Nr   r   r   r   )	MARKDOWN_LINK_REfinditerr&   r  r  r  groupendr'   )r.   partsrL  matchr  s       r   inline_notezhtml_page.<locals>.inline_note  s    %..t4 	!ELLT&%?@ALLekk!nekk!n=>YY[F	! 	T[[fg/0wwu~r   rm  rn  rq  r  r  rk  r[  r  r  r  r   r  r   r  rc   r  r  r;   r   r_   z<tr><td>rA   z</td><td><code>r   rd   z</code></td><td>r=   rO   z <code>r   rP   r   z	</td><td>rT   r  r  r   r  z
</td></tr>r  r1   r3   r  r   r   r   r  r   r   r   r   r   r   openr   c              3  6   K   | ]  }d  |       d  ywz<li>z</li>Nr   )r  r  r  s     r   r  zhtml_page.<locals>.<genexpr>  s      Yd;t,-U3Ys   r  r|  z<tr><td><code>rU  rV  rW  rX  rY  z</code></td></tr>r  rJ   r^   z</code></td><td>geom <code>re   z</code><br>original <code>rf   rh   z</code></td><td><code>rj   z</code><br>promotable <code>rl   rw   rx   rz   rI  rL  r,   c              3  `   K   | ]&  }d t        j                  t        |             d ( ywr  )r  r  r$   r  s     r   r  zhtml_page.<locals>.<genexpr>  s/       t{{3t9%&e,s   ,.rA  z4<li>No additional public search notes recorded.</li>r  r   r  r  r  walkr  r   r  zM<!doctype html><meta charset="utf-8"><title>Hwanse Web Playtest Route</title>a  <style>body{font-family:system-ui,sans-serif;background:#111;color:#eee;max-width:1100px;margin:24px auto}table{border-collapse:collapse;width:100%}td,th{border:1px solid #444;padding:6px 8px;vertical-align:top}code{color:#9bd4ff}a{color:#9bd4ff}.muted{color:#aaa}</style>z"<h1>Hwanse Web Playtest Route</h1>z<p>Status: <code>rk   z</code></p>z<p>Confirmed start: r   r  r   z</code>; routeAssist start: z</p>z<p>Confirmed reachable: ro  z<p>RouteAssist reachable: r  z maps from z across r  z trial graph edges.</p>z<p>RouteAssist maps: r  z<p>Blocker: <code>z -&gt; z</code>; promotion: <code>rN   z</code>; evidence: rt  matrixr  zstrict event coveragerv  zexternal proof handoffz<p>Completion audit: r}  completion_auditz; goal checklist: r~  goal_completion_checklistz.</p>z"<p>External proof packages: <code>rw  z</code>.</p>z <p>External proof status: <code>ry  z</code>; achieved <code>rz  z<ul>z</ul>z!<h2>Required External Inputs</h2>z<table><thead><tr><th>id</th><th>needed input</th><th>current state</th><th>accepted signal</th><th>refresh</th></tr></thead><tbody>z</tbody></table>z)<h2>Strict Hotspot Runtime Checklist</h2>z<p>Route: <code>z</code>; status <code>z</code>; proof <code>r   z</code>; tile hotspot <code>r   z</code>; rejection <code>r   z</code>; candidates <code>r   z</code>; rejected <code>r   z<p>Missing evidence: r   z<table><thead><tr><th>side</th><th>source tile</th><th>source standable</th><th>target spawn</th><th>coordinate</th><th>reviews/events</th><th>block reasons</th><th>links</th></tr></thead><tbody>z<h2>Strict Event Coverage</h2>z<p>Report: r  r  z. Field maps <code>r  z$</code>; strict event records <code>r   z"</code>; strict source maps <code>r\  z</code> (<code>r^  z$%</code>); strict event pairs <code>r]  z#</code>; direct strict pairs <code>ra  z$</code>; source strict events <code>rb  z&</code>; target strict incoming <code>rc  z</code>; promotion <code>z</code>; allowed <code>r_  z5<p>Route cluster roles: source-as-event-source <code>rd  z </code>; source-as-target <code>re  z"</code>; source-as-manifest <code>rf  z</code>; target roles <code>rg  z></code>. reachable maps without strict source coverage: <code>r`  z<p>confirmed reference: <code>z!</code>; confirmed reviews <code>rh  z </code>; rejected reviews <code>ri  z$<h2>Reciprocal Return Candidate</h2>r   z. Reverse: <code>z</code>; class <code>r   z<p>Selector records <code>r   z</code>; strict events <code>z</code>; exit candidates <code>r   z </code>; reciprocal hints <code>r   z</code>; auto exits <code>r   z<h2>Savedata Evidence</h2>z<p>Slot scan: r$  r  r&  z</code>; found/valid <code>r(  r*  z#</code>; real route evidence <code>r,  z%</code>; synthetic diagnostics <code>r.  z<p>Real savedata gap: r  (save_selector_real_savedata_evidence_gapz%. Current selector real saves: <code>r6  z+</code>; route-promotion real saves: <code>r7  z<p>Public sample deltas: r"  r  z). Selector-distinguishing offsets: <code>r9  z,</code>; selector 2:0 public samples: <code>r;  z*</code>; route-pair public samples: <code>r=  z#<p>Real savedata candidates: <code>r0  z</code>; valid <code>r1  z"</code>; archive candidates <code>r4  z</code>; archive skipped <code>r5  z,<p>valid real candidates all blocked: <code>r2  z</code>; block counts <code>r3  z"<p>Public sample selectors: <code>r8  z*</code>. Required selected pointer: <code>rE  z <p>Browser scan patterns: <code>rP  z<p>Browser links: rQ  zsavedatUrl datrR  zsavedatUrl ziprS  zscan SAVEDATAza<table><thead><tr><th>save offset</th><th>required value</th><th>meaning</th></tr></thead><tbody>z<h3>Public Search Notes</h3>z%<h2>Original Title/Start Context</h2>r  z. Selected pointer: <code>r  z</code>; selector: <code>r  z</code>; classification: <code>r  z</code>; allowed: <code>r	  z)<p>Selector 8:0 field-record span: <code>r  z)</code>; title resource tail span: <code>r  z<p>Input transition: <code>r
  r  z</code>; classification <code>z</code>; target pointer <code>r  z</code>; target root <code>r  z</code>; field maps <code>r  z&<p>Input transition CNS: linked <code>r  z</code>; referenced <code>r  z</code>; payloads <code>z-</code>; selector rows readers/writers <code>r  r  z~<table><thead><tr><th>map</th><th>scene ids</th><th>tilesets</th><th>open</th><th>walk</th><th>review</th></tr></thead><tbody>z<h2>Candidate Exits</h2>z<table><thead><tr><th>side</th><th>tile</th><th>auto</th><th>status</th><th>spawn</th><th>block reasons</th><th>open</th></tr></thead><tbody>z%<h2>Post-Blocker Candidate Edges</h2>zc<table><thead><tr><th>source</th><th>target</th><th>selectors</th><th>open</th></tr></thead><tbody>z!<h2>RouteAssist Path Samples</h2>zb<table><thead><tr><th>target</th><th>hops</th><th>path</th><th>first open</th></tr></thead><tbody>)r   r  rM  r$   r  r$   )r.   r$   r  r$   )r6   r&   r  r  r$   r'   )r  r  r  rq  r  r  r  r  r  r  r8   r  r  	exit_rowsr   r  	post_rows	path_rowsr  notesexternal_input_rowsr  strict_hotspot_rowsr~   r   required_rowspublic_note_rowstitle_candidate_rowsr  r  s                               @@r   	html_pager    s#   I
 $%E]#Fi G{{-.4"H[[./52F::g&,"Lzz"67=2KK 34:M$(():;Ar $''(<=C
  wwvq 1www #''("3!46N  /06BJI'( 
wwv$"&,";;s3776?345 6#q# 8;;s377=#9:;< =S1F)G%HIJ K;;s599V#4567wuyy~>NaPUPYPYZ]P^O_ `;;tyy)@)FBGN3OP Q 018<=ScggN^F_ahAi@j k
	

 I23 
;;s3778#4567 8;;s3778#4567 8;;tyy)=)CDKLM N	*H56c$sww{?SU]:^9_ `		

 I{{34: 	
!)bT1-;;s3778#4567 8;;s377:#6789 :;;v{{3776?+@bABC D/]599Y3G]377S\K]_efg h		
	
 GGY@XYYE{{89?R 	
""S%789 :;;s377=#9:;< =;;s377>#:;<= >;;s377+;#<=>? @S);%<=> ?	
	
 [[!9:@bN!!/28b 
ggl+1rww}-3""   ;;s3776?3456S)=%>?@@A {{3{s34567 #kk#koo>Q.R*STU	V	
 #kk#koo>W.X*YZ[
\ ;;s<#3#3F#;<=>? [[\%5%5c%:!;<= >? {{3|//45678 #kk#l.>.>?].^*_`ab S1C)D%EFGH  !%C8N0O,P QRS ;;s377+@#ABCD EH IMTWX[X_X_`vXwTxHyGz{ ;;tyy)@)FBGN3OPQ  018<= >A BFcggNdFegnAo@pq	

* M||/06B 
S):%;<= >S)9%:;< =;;s3777#3456 7	

 ww \\"56<"  @ 
@    17R 

##S%89: ;;;tyy)<)BCJsKL M;;tyy)<)BCJsKL M	*F34 5	*F34 5,h78 9		


 99 nYn 	[n 	-n DKK(9:;;G	n
 tEIIe$4eii6F6Q'RSSZ[`al[m[q[qru[vZwwxy~  @K  zL  zP  zP  QT  zU  yV  Vr  sw  x~  xB  xB  CH  xI  KQ  sR  rS  SW  	Xn #4;;tyyEY9Z9`^`/a#b"ccghn %W[[1L%M$NkZ^ZeZefijpjtjtuzj{f|Z}Y~  G  HO  HS  HS  To  Hp  Gq  qH  	In  DIIgkkBX6Y6_]_,` abbfgn T[[W[[-B)CDEWT[[Y\]d]h]hiq]rYsMtLu  vP  QU  Q\  Q\  ]`  ah  al  al  m~  a  ]@  QA  PB  BU  VZ  [b  [f  [f  gz  [{  }E  VF  UG  GJ  KO  PW  P[  P[  \t  Pu  wN  KO  JP  PS  TX  Y`  Yd  Yd  e~  Y  AY  TZ  S[  [_  	`n  W[[1E%FHZ [\\nost{tt  A]  u^  `{  p|  o}  }B  	Cn -T[[7;;OoCpCvtv9w9~{~-  -A  AM  	Nn +4;;s7;;Gc;d7e+f*gg  AE  AL  AL  MP  QX  Q\  Q\  ]{  Q|  M}  A~  @  K  	Ln ugUn 	,n 	On  
!n" 	#n$ 	4%n& 4;;s>+=+=h+G'HIJ'RVR]R]^abpbtbtu}b~^  SA  RB BC(:(:;L(M$NOP Q{{3~'9'9,'G#HIJ K"kk#n.@.@AW.X*YZ[ \;;s>+=+=>W+X'YZ[ \ KKN,>,>?O,P(QRS T++c.*<*<=U*V&WXYYe	g'n4  DIIn6H6HIZ6[6a_a,b,ifi jkkop5n6 	N7n8 
9n: 	;n< 	)=n> d6::k24RST U KKFJJ,G(HIJ K&&*kk#fjjAY6Z2[&\%] ^$$(KKFJJ?Z4[0\$]#^ _++c&**-O"PQRS T$$(KKFJJ?U4V0W$X#YYe	g?nJ 4;;s<+;+;H+E'FGHPTP[P[\_`l`p`pqy`z\{P|O} ~%%)[[\5E5EF]5^1_%`$a b&&*kk#l6F6FG_6`2a&b%c d((,C8H8HId8e4f(g'h i;;s6::6G+H'IJK LS4F)G%HIJ,	XKnV @CP\P`P`  bI  QJ  MK  AL  @M M""&++c,2B2BCj2k.l"m!n o$$(KKL4D4DEi4j0k$l#m n"kk#l.>.>?].^*_`a b@@DDIIV\V`V`  bB  WC  WI  GI  MJ  MQ  NQ  AR  @S  S_		`Wn` )S9I9M9Mh9W5X)Y(ZZabfbmbmnq  sC  sG  sG  HP  sQ  oR  cS  bT T%%)[[5E5I5IJa5b1c%d$e f##';;s3C3G3GH^3_/`#a"b c""&++c2B2F2FG\2].^"_!``l	nanh 	/inj d:>>%02TUV W++c*..*B&CDEWT[[Y\]g]k]klt]uYvMwLx y{{3z~~6F'G#HIJ K;;s:>>:K+L'MNO|	]knr %T[[Z^^DY5Z1[%\$] ^#{{3z~~>V/W+XYZ [!!%S@T1U-V!W X Y""&++c*..A_2`.a"b!c d KKJNN;S,T(UVWWc		esn| 	%}n~ hll=9;OPQQXY]YdYdehiqiuiu  wG  jH  fI  ZJ  YK  Kf  gk  gr  gr  sv  w  wC  wC  DX  wY  sZ  g[  f\  \_  `d  `k  `k  lo  px  p|  p|  }Q  pR  lS  `T  _U  Ux  y}  yD  yD  EH  IQ  IU  IU  Vv  Iw  Ex  yy  xz  z_  `d  `k  `k  lo  px  p|  p|  }_  p`  la  `b  _c  co  	pn@ !hll<&@Bl!m n  oT  UY  U`  U`  ad  em  eq  eq  rP  eQ  aR  US  TT  T  @D  @K  @K  LO  PX  P\  P\  ]z  P{  L|  @}  ~  ~J  	KAnB $D6G)HJb$c#d  eN  OS  OZ  OZ  [^  _g  _k  _k  lZ  _[  [\  O]  N^  ^J  KO  KV  KV  WZ  [c  [g  [g  hU  [V  WW  KX  JY  YC  DH  DO  DO  PS  T\  T`  T`  aH  TI  PJ  DK  CL  LX  	YCnD .dkk#hllK_>`:a.b-ccxy}  zE  zE  FI  JR  JV  JV  Wp  Jq  Fr  zs  yt  tV  W[  Wb  Wb  cf  go  gs  gs  tK  gL  cM  WN  VO  On  os  oz  oz  {~  G  K  K  La  b  {c  od  ne  eq  	rEnF 7t{{3x||TsGtCu7v6w  xT  UY  U`  U`  ad  em  eq  eq  rW  eX  aY  UZ  T[  [g  	hGnH -T[[8<<PgChCnln9o9vsv-w,x  yc  dh  do  do  ps  t|  t@  t@  AZ  t[  p\  d]  c^  ^j  	kInJ +4;;tyyNcAdAjhj7k+l*mmyzKnL T(,,/E"FHXYZZ]^bckcoco  qG  dH  JZ  _[  ^\  \_  `d  em  eq  eq  rB  eC  ET  `U  _V  V[  	\MnN 	lOnP 
QnR 	SnT 	'UnV  &WnX 	0YnZ d=,,[9;XYZ [##';;s=3D3DEV3W/X#Y"Z [;;s=+<+<Z+H'IJK L!!%S1B1BC^1_-`!a b c KKM,=,=>O,P(QRS T++c-*;*;<S*T&UVWWc	e[nf 4DKKMDUDUVsDt@u4v3w x++/;;s=;L;LMg;h7i+j*kkw	ygnj &dkk#6F6J6J>6Z2[&\%]]deiepepqt  vF  vJ  vJ  KW  vX  rY  fZ  e[ [  $C0@0D0DEU0V,W XY Z;;s+;+?+?@Q+R'STU V  $C0@0D0D[0Q,R ST U![[-=-A-ABR-S)TUV W KK,<,@,@AR,S(TUVVb	dknv 1TYYGWG[G[\iGjGpnp=q=xux1y0z { KK		2B2F2FGX2Y2_]_(`(gdghi j++dii&?&F3GH I//3{{3?O?S?STl?m;n/o.ppstxtt  AD  EU  EY  EY  Zr  Es  At  uu  tv  vB	Cwn~ 	In@ 
AnB 	CnD 	#EnF 	XGnH 
InJ 	KnL 	0MnN 	nOnP 
QnR 	SnT 	,UnV 	mWnX 
YnZ 	[n n nQs   3AAy<c                    |j                  dd       t        j                  | dd      }|dz  j                  |dz   d	       |d
z  j                  t	        |       d	       |dz  j                  d| dd	       y )NT)r   exist_okF)r   r  )ensure_ascii
separatorszweb_playtest_route.jsonr  r
   r   web_playtest_route.htmlzweb_playtest_route_runtime.jsz#window.HWANSE_WEB_PLAYTEST_ROUTE = z;
)mkdirr   dumps
write_textr  )r  out_dir	json_texts      r   write_outputsr    s    MM$M.

7:NI((44D 5  ((44Yw5GRY4Z..::
-i[< ; r   c                    t        j                  t              } | j                  dt        t
               | j                         }t        t        |j                  dz  i       t        |j                  dz  g       t        |j                  dz  i       t        |j                  dz  i       t        |j                  dz  i       t        |j                  d	z  i       t        |j                  d
z  i       t        |j                  dz  i       t        |j                  dz  i       t        |j                  dz  i       t        |j                  dz  i             }t        ||j                         t        d|j                  dz          y )N)descriptionz	--out-dir)typedefaultzplayable_progress.jsonzroute_assist_frontier.jsonz"route_blocker_evidence_matrix.jsonz-save_selector_real_savedata_evidence_gap.jsonzsavedata_sample_deltas.jsonzsavedata_slot_scan.jsonz%reciprocal_transition_candidates.jsonr  z!strict_event_source_coverage.jsonz1strict_source_hotspot_external_review_packet.jsonz+route_promotion_external_proof_handoff.jsonzwrote web playtest route -> r  )argparseArgumentParser__doc__add_argumentr   r   
parse_argsr  r   r  r  print)parserargsr  s      r   mainr    sI   $$9F
$<D$,,!992>$,,!==rB$,,!EErJ$,,!PPRTU$,,!>>C$,,!::B?$,,!HH"M$,,!CCRH$,,!DDbI$,,!TTVXY$,,!NNPRSG '4<<(	(8Q)Q(R
STr   __main__)r   r   r   r   r  r   )r   r$   r  r  )r(   r$   r)   r   r  r$   )r7   
list[dict]r  rV   )rF   rV   r  rV   )rK   dict | Noner  zdict[str, dict])rF   rV   rK   r  r  rV   )r8   rV   r  rV   )rK   r  r  rV   )r   rV   rF   rV   r  r  )@   )r   r$   r   r  r   r|   r  ztuple[list[str], list[dict]])r   r  r)   r   r  r$   )r   r  r  r  )NNNNNNNN)r   rV   r  r  r  rV   r  r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  rV   )r  rV   r  r$   )r  rV   r  r   r  None)r  r  )'r  
__future__r   r	  r  r   repathlibr   typingr   collectionsr   __file__resolver   ROOTr   compiler  r   r   r/   r9   rH   rL   r\   r   r   r   r   r   r   r  r  r  r  r  __name__r   r   r   <module>r!     sp   3 "    	    H~''*
Ul2::89 831	"&R,]f@3l	A3t &**.&*48/304@D:>NN%N N #	N
 (N $N '2N "-N #.N 3>N -8N 
Nb
L^odU* zF r   