
    UHjNd                       d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	 ddl
mZ ej                  j                  d e e	e      j!                         j"                               ddlmZmZmZmZ g dZdd	g d
dZ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$g d%d&d'g d(d&d)d*	d+d,d-d.d/d0dd1d2d3dd4d5dd6d7d8d9d:dd;d<d=d>d?dd@g dAd&dBg dCd&d)d*	dDdEdFdGdHdIddJdKdLddMdNddOdPdQdRdSddTdUdVdWdXddYg dZd&d[g d\d&d)d*	gZd]dd^d_d`dad^dbdcd`dddedfdgd`gZdhZdiZdjZdkZdlZdmZ dnZ!doZ" ejF                  dp      Z$ ejF                  dqejJ                        Z&ddrZ'ddsZ(ddtZ)dduZ*ddvZ+ddwZ,ddxZ-ddyZ.ddzZ/dd{Z0dd|Z1dd}Z2dd~Z3ddZ4dddZ5dhddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZ6ddZ7	 	 d	 	 	 	 	 	 	 	 	 ddZ8dddZ9ddZ:ddZ;ddZ<e=dk(  r e<        yy)z2Parse known fields from Hwanse savedat*.dat files.    )annotationsN)Path)	urlencode)c_stringfind_cns_stringsread_sectionsva_to_offset))herbu   약초   )item_2u	   해독초   )refresh_wateru   리프레시 워터   )mp_recoveryu   마법의 물약   )item_5u   고급한방약   )item_6u	   마수석   zoffsets-unmappedzHDNua/HandyHwanseEditor)zoMainForm.cs only defines and reads/writes money, six item counts, character stat words, and packed skill bytes.zMainForm.Designer.cs contains disabled equipment UI groups, so those labels are useful name candidates but not save-offset evidence.zzout/text_tables.* exports an EXE equipment-name candidate table, but savedat ownership/equipped offsets are still unknown.)statussourcenotesatahoAtahox   z   |   ~   )currentrecovermaximum               )r   r!   i0  i4  i6  i8  i:  atkdeftechquickluck                  )
               )base
valueBases   )#   '   +   /   3   )
individualgroup	keynamelevelhpmp
experience	baseStatsenhanceStatsskillsrinshanRinshaniP  iR  iT  iV  iX  iZ  i\  i^  i`  i  i  i  i  i  if  ij  il  in  ip  i  )	         r   i  )       $   (   smashuSmashui(  i*  i,  i.  i0  i2  i4  i6  i8  i  i  i  i  i  i>  iB  iD  iF  iH  i~  )   rN   rO   i  )      rQ   sceneAndInventoryr   ivE )rD   
saveOffsetsize	runtimeVapartyAndStatsi  iPwE 	tailStatei  i   i`Y                rP      i5-D zmap\d+_\d+[a-z]\.cns$z%window\.HWANSE_MAP_INDEX = (.*?);\s*$c                &    t        | |d       | |   S )N   require_sizedataoffsets     +/home/exedev/hwanse/tools/parse_savedata.pyread_u8ro   d   s    vq!<    c                >    t        | |d       | |   | |dz      dz  z  S )Nra   rh   rf   ri   rk   s     rn   read_u16rr   i   s+    vq!<4
+q011rp   c                V    t        | |d       | |   | |dz      dz  z  | |dz      dz  z  S )Nrb   rh   rf   ra   re   ri   rk   s     rn   read_u24rt   n   s>    vq!<4
+q01T&1*5E5KLLrp   c                J    ||z   t        |       kD  rt        d|dd|       y )Nz$save data is too short for offset 0x04x+)len
ValueError)rl   rm   r]   s      rn   rj   rj   s   s2    }s4y ?s|1TFSTT !rp   c                    d| dS )N0xrv    )rm   s    rn   
hex_offsetr}   x   s    s|rp   c                "    |t        |      ||dS )N)rm   	offsetHexr]   value)r}   )rl   rm   r]   r   s       rn   value_recordr   |   s    '	 rp   c                    | r| j                         si S | j                  d      }t        j                  |      }|st	        |  d      t        j                  |j                  d            }t        |t              st	        |  d      |S )Nutf-8encodingz) does not contain window.HWANSE_MAP_INDEXrh   z map index must be an object)
exists	read_textMAP_INDEX_REsearchry   jsonloadsrA   
isinstancedict)pathtextmatchrl   s       rn   load_map_indexr      s    t{{}	>>7>+D%ED6!JKLL::ekk!n%DdD!D6!=>??Krp   c                   | j                  |      }t        |t              xrj t        |j                  d      t              xrI t        |j                  d      t              xr( d|cxk  xr |d   k  nc xr d|cxk  xr |d   k  S c S )Nwidthheightr   )getr   r   int)	map_indexrD   xyinfos        rn   map_contains_tiler      s    ==D4 	$txx(#.	$txx)3/	$ "T']"	$ #T(^#
 $rp   c                  
 | j                  d      xs i }|j                  d      xs g }|sy |d   d   
|d   d   |D cg c]	  }|v s| }}|sy t        
fd|D        |d         }t        |
      rdnd	}t        | d
   d         t        | d   d         t        
      t              d}	||
||dt	        |	       dt	        |
 d d       dS c c}w )NlinkedResources	fieldMapsr   r   r   c              3  @   K   | ]  }t        |      s|  y wN)r   ).0rD   r   r   r   s     rn   	<genexpr>z#choose_web_start.<locals>.<genexpr>   s"     \d3DYPTVWYZ3[T\s   r   zcoordinate-in-boundszfirst-availablerA   slot)	saveGroupsaveSlotsaveXsaveYz/web/game.html?,)map	startTile)r   reasonr   r   r   availableFieldMapsurlexplicitMapUrl)r   nextr   strr   )selectorpositionr   	resources
field_mapsrD   	availableselectedr   queryr   r   s     `       @@rn   choose_web_startr      s.   ./52I{+1rJgAgA",B$	0ABIB\i\^ghi^jkH'8HaQR'S#YjF'*734(12QQ	E ' 5!1 23+IhXYWZZ[\][^U_6`,a+bc	 	 Cs   	C&C&c           
         | dk(  rddddS t        |      D ]0  \  }}|| cxk  r	|dz   k  sn | d| dd|| |z
  d	z   |d|dd
c S  | d| ddddS )Nr   0x00F)r   valueHexlearnedrb   r{   02xTrh   )r   r   r   
skillIndexrE   	baseValuebaseValueHex)r   r   r   unknown)	enumerate)r   value_basesindexr8   s       rn   decode_skill_valuer      s    z5AA - 
t5$D1H$ s,#)!"$T#J 
 s$	 rp   c                N   |d   }|d   }g }t        t        |            D ]?  }||z   }t        | |      }t        ||      }|j	                  ||t        |      d|       A |t        |      t        |      t        |      D 	cg c]  \  }	}|	|d|dd c}}	|dS c c}}	w )Nr8   r9   )r   rm   r   r{   r   )r   r   r   )
baseOffsetbaseOffsetHexslotsr9   entries)rangerx   ro   r   appendr}   r   )
rl   blockr8   r   r   r   rm   r   decodedr   s
             rn   parse_skill_blockr      s    =D%KGc+&' 
f%$UK8 '/ 		
	
 #D)[! !*+ 6
u !55+>NO
 	 	
s   B!c                0    d fd}|d   |d   t         |d   dt         |d                ||d          ||d          ||d          ||d	          ||d
         |d   j                         D ci c]  \  }}|t         |       c}}d	S c c}}w )Nc                    | j                         D ci c]  \  }}|t        |dt        |              c}}S c c}}w )Nra   )itemsr   rr   )rA   rD   rm   rl   s      rn   
read_groupz#parse_character.<locals>.read_group   sF     !&
f ,tVQv0FGG
 	
 
s   #<rC   rD   rE   ra   rF   rG   rH   rI   rJ   rK   rB   )rA   r   returnr   )r   rr   r   r   )rl   specr   rD   r   s   `    rn   parse_characterr      s    
 E{VdDM1htT']6STd$d$ l!34[ 12"4#78  $H~335
e #D%00
 
s   5Bc                   t        | t              }t        t              D cg c]  }t        | t        |z          }}|d t        |t        |             }i t        | t        d|      dddt        |      D cg c]0  \  }}i t        | t        |z   d|      |d|z   dd|z   d||k  d2 c}}||d	d
dS c c}w c c}}w )Nrh   ivE 
0x004576e8)r^   runtimeVaHexivE r{   08x)r   r^   r   active	candidatezThe save-load path rebuilds runtime descriptor pointers from 0x004576e8 count and 0x004576e9 order bytes before scene selector selection.)count
orderBytesactiveDescriptorIndicesrawOrderValues
confidenceevidence)	ro   ACTIVE_DESCRIPTOR_COUNT_OFFSETr   "ACTIVE_DESCRIPTOR_ORDER_SCAN_BYTESACTIVE_DESCRIPTOR_ORDER_OFFSETminrx   r   r   )rl   r   r   	raw_orderactive_orderr   s         rn   parse_active_descriptor_orderr     s
   D89E => 	4u<=I  9s5#i.9:L
4!?EJ
#(
 !*) 4	
 ut%Ce%KQPUV'%/"$Z%%7$< =%-	
 $0#![) 	
s   B;<5C c                v    t        ||      }||dz   t        |       kD  ry t        j                  d| |      d   S )Nrc   z<Ir   )r	   rx   structunpack_from)rl   sectionsvarm   s       rn   read_exe_u32r   %  s?    (B'F~!c$i/dD&1!44rp   c                h   g }t        |      D ]  }||dz  z   }t        | ||      }| |S |d|d|d|dd}	d|cxk  rdk  rZn nWd|	d<   |j                  |      }
|
r|
|	d	<   n9t        ||      }|+t	        | |      }|rt        d
 |d d D              r|d d |	d<   |j                  |	        |S )Nrc   r{   r   )r   vaHexr   r     @   ` Tpointerstringc              3  N   K   | ]  }d t        |      cxk  xr dk  nc   yw)rR      N)ord)r   chars     rn   r   zdword_window.<locals>.<genexpr>B  s!     $RtR3t9%:s%:%:$Rs   #%rY   0   asciiPrefix)r   r   r   r	   r   allr   )rl   r   stringsstart_var   valuesr   r   r   itemr   rm   maybes                rn   dword_windowr  ,  s    Fu 	!T8R0=& M# "S]U3K(	
 ,*,"DO;;u%D!%X%h6%$T62E$RuSbz$R!R.3CRj]+d-. Mrp   @   rY   )depthr   	max_nodesc          	         	
 t               
g 	g d	fdd 
fd ||       |t        
      	dS )Nc                    | j                  d      r| v ry j                  |        t        j                  |       r| d d vrj                  | d d        y y y )Nz.cns)endswithr   FIELD_MAP_RE	fullmatch)rD   r   linkeds    rn   add_namez$collect_linked_cns.<locals>.add_nameV  s\    }}V$d!!$'D"IZ,Gd3Bi( -H'rp   c                   t        
      k\  s| 
v ry 
j                  |        t        	|       D ]U  }|j                  d      }|r |       |d   }|dkD  s)|j                  d      s;d|cxk  rdk  sGn J ||dz
         W y )	N)r   r   r   r   r   r   r   rh   )rx   addr  r   )r   	remainingr   rD   r   r  r   rl   r  r   seenr   visits        rn   r  z!collect_linked_cns.<locals>.visit]  s    t9	!R4Z x"EJ 	,D88H%DME1})!4u9ZPZ9ZeY]+	,rp   )	scanDepthscannedPointers	linkedCnsr   )rD   r   r   None)r   r   r  r   r   r  )setrx   )rl   r   r   r   r  r   r  r  r   r  r  r  s   ```  ``@@@@@rn   collect_linked_cnsr  H  sL     UDFJ)
, 
, 
(Et9	 rp   c           	        t        | t              }t        | t              }t        | t        d|      t        | t        d|      t        dt        dddddd}||S |j                         }t        |      }t        ||      }t        |d	z  z   }t        |||      }	||d
<   d|d|d<   |	|d<   t        |	t              rd|	dnd |d<   t        |	t              s|S |	|d	z  z   }
t        |||
      }|
|d<   d|
d|d<   ||d<   t        |t              rd|dnd |d<   t        |t              r1d|cxk  rdk  r&n |S t        ||||      |d<   t        ||||      |d<   |S )Nrh   r{   r   i0Y 
0x0059de30i4B 
0x004234a1)rA   r   tableVa
tableVaHexruntimeGlobalVaruntimeGlobalVaHex
loadCodeValoadCodeVaHexrc   rowPointerVarowPointerVaHex
rowPointerrowPointerHexselectedPointerVaselectedPointerVaHexselectedPointerselectedPointerHexr   r   selectedDwordsr   )ro   SCENE_SELECTOR_GROUP_OFFSETSCENE_SELECTOR_SLOT_OFFSETr   SCENE_SELECTOR_TABLE_VA
read_bytesr   r   r   r   r   r  r  )	save_dataexe_pathrA   r   resultexe_datar   r   row_pointer_varow_pointerselected_pointer_vaselected_pointers               rn   resolve_scene_selectorr7  r  s   I:;E989Di)DaOY(BAtL*2378%* %	F ""$HX&Hx2G,uqy8Nx>BK+F>"$^C$8 9F&F<8B;PS8T;s"34Z^F?k3'%q0#Hh8KL"5F')*=c)B%CF!" 0FBLM]_bBcR(8'=#>imF "C(Z;K-Yz-Y M $0(GM]#^ $6x7Td$e !Mrp   c                8   t        | |      }i t        | t        dt        | t                    ddddi t        | t        dt        | t                    ddddd	d
d}t        |      }t        |||      }|t        |       dddt        ||t        |       |t        | ddt        | d            t        D 	
ci c]%  \  }}	}
|i t        | |
dt        | |
            d|	i' c}
}	}t        t        D cg c]  }t        | |       c}g ddS c c}
}	}w c c}w )Nra   ivE 
0x004576dc
0x00424a91)r^   r   placementUseVaHexivE 
0x004576de
0x00424ab6r   z~The original object placement path subtracts these runtime words from object tile coordinates before multiplying by 16 pixels.)r   r   r   r   z"HDNua/HandyHwanseEditor offset maplittle)r   
endiannessrf   rb   rh   rD   )zexact current map idzstory flagszevent flagsz$equipment ownership/equipped offsetszfull inventory namesz0selector single field-map and spawn-tile mapping)filer]   formatruntimeBlockssceneSelectorscenePositionCandidateactiveDescriptorOrderwebStartCandidatemoneyr   equipmentEvidence
charactersunknowns)r7  r   SCENE_POSITION_X_OFFSETrr   SCENE_POSITION_Y_OFFSETr   r   rx   SAVE_BLOCKSr   rt   ITEM_FIELDSro   EQUIPMENT_EVIDENCE
CHARACTERSr   )rl   
file_labelr0  map_index_pathr   r   r   	web_startrC   rD   rm   r   s               rn   parse_savedata_bytesrT    s_    &dH5H
4!8!XdLc=de
#(!-	

4!8!XdLc=de
#(!-	
 "LH& ~.I 8Y?ID	:"
 %!"*!>t!D&dFAxf/EF &1
 
!T6 WLvq'$2GHW&RVWW
 0 #
 D$'

- 


s   :*D5Dc                L    t        | j                         t        |       ||      S r   )rT  r.  r   )r   r0  rR  s      rn   parse_savedatarV    s     13t9hWWrp   c                    | d    d| d    dS )Nr   z (`r   z`)r|   )records    rn   compact_valuerY    s     Woc&"5!6b99rp   c                   ddd| d    dd| d    ddd	dd
t        | d          g}| d   }|j                  ddddt        |d          dt        |d          d|d    d|d    dd|d    dg       |j                  d      r|j                  d|d    d|d    d       |j                  d      r|j                  d|d    d|d    d       |j                  d      xs i }|rd j	                  |j                  d!g             xs d"}d j	                  |j                  d#g       d d$       xs d"}|j                  d%| d&|j                  d'       d(|j                  d)       d*       |j                  d+|        |j                  d,      r|j                  g d-       |d,   d d. D ]b  }|j                  d/      xs( |j                  d0      xs |j                  d1      rd1nd}|j                  d2|d3    d4|d5    d6|xs d" d7       d | d8   }|j                  dd9dd:t        |d;          d<|d;   d=    dd>d j	                  d? |d@   D              xs d"z   dAd j	                  dB |dC   D              z   dD|dE    dF|dG    g       | dH   }	|j                  ddIddJt        |	dK          d<|	dK   d=    dL|	dK   dM    ddNt        |	dO          d<|	dO   d=    dL|	dO   dM    ddD|	dE    dF|	dG    g       | j                  dP      }
|
ri|j                  ddQddR|
dS    dT|
dU    d*dV|
dK    dW|
dO    dX|
dY    ddZ|
d[    dd\d j	                  |
j                  d]      xs g       xs d" g       |j                  g d^       | d_   D ]7  }|j                  d2t        |d`          d4|d   dadb|dc   ddd6|de    d7	       9 |j                  g df       | dg   j                         D ]9  \  }}|j                  dh|j                  de      xs | di|dj    d6|dk    d7       ; | j                  dl      xs i }|rk|j                  ddmddn|j                  dod"       ddp|j                  dqd"       g       |j                  dr      xs g D ]  }|j                  ds|         |j                  g dt       | du   D ]  }|j                  dv|de    ddwdxdyt        |dz          d{d|t        |d}   d~          dt        |d}   d          dt        |d}   d          d7dt        |d   d~          dt        |d   d          dt        |d   d          d7dt        |d   d~          dt        |d   d          d7g       dD ]I  }|j                  dh|j                          dt        |d   |          dt        |d   |          d       K |d   j                         D ]c  \  }}|d   D cg c]  }|j                  d      r| }}d j	                  d |D              xs d"}|j                  dds| d|d    d| g       e |j                  d        |j                  ddg       | d   D ]  }|j                  ds|         dj	                  |      j                         dz   S c c}w )Nz# Save Data Summary zFile: `r@  `zSize: r]   z bytesz	## Globalz	- Money: rG  rC  z## Scene Selectorz	- group: rA   z- slot: r   z- runtime load code: `r!  z"` writes the selected pointer to `r  z
- table: `r  r%  z- row pointer: `z` from `r#  r)  z- selected pointer: `r'  r   z, r   -r     z- linked field maps: z (scan depth r  z, pointers r  )z- linked CNS: r*  )r[  z| va | value | note |z| --- | --- | --- |r3   r   r   r   z| `r   z` | `r   z` | z |rE  z$## Active Descriptor Order Candidatez	- count: r   z, runtime `r   z- active descriptor indices: c              3  2   K   | ]  }t        |        y wr   )r   r   r   s     rn   r   zmarkdown.<locals>.<genexpr>  s     ]ESZ]s   r   z- raw first bytes: c              3  (   K   | ]
  }d |d  yw)r{   r   Nr|   ra  s     rn   r   zmarkdown.<locals>.<genexpr>  s     Ybs,Ys   r   z- confidence: r   z- evidence: r   rD  z## Position Candidatez- tile/camera x candidate: r   z`, placement use `r;  z- tile/camera y candidate: r   rF  z## Web Start Candidatez- map: `r   z` (r   z- tile: r   z- selector URL: `r   z- explicit map URL: `r   z- available selector maps: r   )r[  z## Runtime Save Blocksr[  z*| save offset | size | runtime VA | name |z| ---: | ---: | --- | --- |rB  r\   z#xz` | `0xr^   r   rD   )r[  z## Itemsr[  z| item | offset | value |z| --- | --- | ---: |r   z| z | `r   r   rH  z## Equipment Evidencez- status: `r   z
- source: r   r   z- )r[  z## Charactersr[  rI  z### z4| field | current/base | recover/enhance | maximum |z| --- | ---: | ---: | ---: |z
| level | rE   z
 | - | - |z| HP | rF   r   z | r    r!   z| MP | rG   z| EXP | rH   z | - | r'   rI   rJ   z | - |rK   r   r   c           
   3     K   | ]9  }d |d    d|j                  dd       d|j                  dd       d|d    d		 ; y
w)zslot r   z skill r   ?z lv rE   z (r   r_  N)r   )r   entrys     rn   r   zmarkdown.<locals>.<genexpr>  s_      %
  E&M?'%))L#2N1O P))GS12"U:5F4GqJ%s   ?Az skills at `r   z`: z## Still UnknownrJ  
)	rY  extendr   r   joinr}   r   upperrstrip)summarylinesr   r   r   
linked_cnsr   noter   r   rS  r   rC   rX  	equipment	characterstat
block_namere  r   learned_texts                        rn   markdownrt    s	   

'&/"!$
!(


M''"2345	E 'H	LLhw&789:}Xf%5678$Xo%>$??abjk  cA  bB  BC  D,/02	

 ||O$'(A'B(8TeKfJgghij||()#H-A$B#C8HUkLlKmmno	
 ./52IYYy}}["=>E#
YYy}}["=crBCJs
#J< 0$==56k)--PaBbAccdf	
 	~j\23||$%IJ-.s3 	ZD88H%n-)@nRVRZRZ[dReYkmDLL3tG}oU4
3C2DDQTUWXY	Z 23L	LL2l7&;<=[V]I^_mInHoopq/99]\B[5\]]dadf &))Y,GW:XYYZ \,789<
345	
& /0H	LL#-mHSM.J-K L$SM.9::LXVY][nMoLppqs .mHSM.J-K L$SM.9::LXVY][nMoLppqs Xl3458J/01	
" /0I(9U+,C	(0C/DAF9S>*!IcN+;<#Ie$4#5Q7'	2B(C'DAF-dii	FZ8[8a_a.b.ifi-jk		
 
LL	
 ) 
*U<012%fb7I J$S)eFm_B@	

 
LL   w'--/ gVr&**V,34D9L8MTRXY`RaQbbdefg /06BI#)--#67q9x567
 	 MM'*0b 	&DLL2dV%	& 
LL*+\* 0	y()*F.]9W+=>?zJmIdOI,FGH$Yt_Y%?@A$Yt_Y%?@AE
 mIdOI,FGH$Yt_Y%?@A$Yt_Y%?@AE
 }Y|-DY-OPQQX$Y|%<Y%GHIM#	
. < 	DLLTZZ\N#mIk4J44P&Q%RRU >!:4!@AB&J	
 "+8!4!:!:!< 	J #9-99Y' G 
  99 %
 %%     LLL1G0HL>Z	& 	Ra0d 
LL$b)*
# "r$[!"99U""$t++/s   [c                     t        j                  t              } | j                  dt        d       | j                  dt        t	        d      d       | j                  d	d
d       | j                  dt        t	        d      d       | j                  dt               | j                  dt               | j                         }t        |j                  |j                  rd n|j                  |j                        }|j                  r]|j                  j                  j                  dd       |j                  j                  t        j                   |dd      dz   d       |j"                  rM|j"                  j                  j                  dd       |j"                  j                  t%        |      d       |j                  s/|j"                  s"t'        t        j                   |dd             y y y )N)descriptionsavezpath to savedat*.dat)typehelpz--exezHwanse2.exez7optional Hwanse2.exe path for scene selector resolution)rx  defaultry  z--no-exe
store_truez0skip executable-backed scene selector resolution)actionry  z--maps-indexzout/maps_runtime.jszCoptional web runtime map index for bounds-based start URL selectionz
--json-out)rx  z--outT)parentsexist_okFra   )ensure_asciiindentrf  r   r   )argparseArgumentParser__doc__add_argumentr   
parse_argsrV  rw  no_exeexe
maps_indexjson_outparentmkdir
write_textr   dumpsoutrt  print)parserargsrk  s      rn   mainr    s   $$9F
T0FG
dD4G  OH  I

<>pq
T4@U;V  ^c  d
40
d+DTYY4??[G}}""4$"?  G%PQ!RUY!Ydk lxxdT:HW-@==djjuQ?@ "*=rp   __main__)rl   bytesrm   r   r   r   )rl   r  rm   r   r]   r   r   r  )rm   r   r   r   )
rl   r  rm   r   r]   r   r   r   r   r   )r   Path | Noner   r   )
r   r   rD   r   r   r   r   r   r   bool)r   r   r   r   r   r   r   zdict | None)r   r   r   z	list[int]r   r   )rl   r  r   r   r   r   )rl   r  r   r   r   r   )rl   r  r   r   )rl   r  r   
list[dict]r   r   r   z
int | None)re   )rl   r  r   r  r   dict[int, str]r   r   r   r   r   r  )rl   r  r   r  r   r  r   r   r  r   r   r   r  r   r   r   )r/  r  r0  r  r   r   )NN)
rl   r  rQ  r   r0  r  rR  r  r   r   )r   r   r0  r  rR  r  r   r   )rX  r   r   r   )rk  r   r   r   )r   r  )>r  
__future__r   r  r   rer   syspathlibr   urllib.parser   r   insertr   __file__resolver  probe_exe_scene_tablesr   r   r   r	   rN  rO  rP  rM  r+  r,  rK  rL  r   r   r   r-  compiler
  Sr   ro   rr   rt   rj   r}   r   r   r   r   r   r   r   r   r   r  r  r7  rT  rV  rY  rt  r  __name__r|   rp   rn   <module>r     s=   8 "   	  
  " 3tH~--/667 8 Z Z !'   VG VG"(V<#FFV]cd &vvPV`fg#)9WX$4RS
  VG VG"(V<#FFV]cd &vvPV`fg#)9QR$4LM
  VG VG"(V<#FFV]cd &vvPV`fg#)9KL$4FG
;+
\ !U_`FFQ[\ZX % #     !' !' %& "$ rzz23rzzBBDDI
2
M
U

<,8.B5D '
'' ' 	' ' ' ' 
'T$T !"&	:
:: :  	:
 
:zX:|,~A* zF rp   