Ë
    IáËj±*  ã            	       ó¢  — d Z ddlZddlZddlZddlZej
                  j                  ej
                  j                  ej
                  j                  ej
                  j                  e«      «      «      «      Z	ej
                  j                  dej
                  j                  e	d«      «       ej
                  j                  dej
                  j                  e	d«      «       ej
                  j                  dej
                  j                  e«      «       ddlZddlZddlZddlmZ d„ Zd„ Zd„ Zed	k(  r eej,                  d
   «       yy)a`  Card for a finished Astra vehicle job: tools/import_job.py (blob + card) then the vehicle runtime fields a game reads:
nodes (wheels, steering, rider points, doors), sockets with measured positions, paint (Paint material factor + the
six paints from nodes.json) and gameplay (wheelbase, track). usage: python3 tools/vehicles/import_vehicle.py <job_dir>é    NÚlibÚtools)Úworld_nodesc                 óö  ‡'‡(‡)‡*— t         j                  j                  | «      } t        j                  t        | › d�«      «      }t        j                  t        |d   |j                  dd«      dœ«      }t         j                  j                  |«      rŸt        j                  t        |«      «      j                  d«      xs i j                  d«      }|r]|t         j                  j                  | «      k7  r;t        j                  |› d|› d	t         j                  j                  |«      › d
�«       t        j                   | «       t        j                  t        |d   |j                  dd«      dœ«      }t        j                  t        |«      «      }| › d|d   › d�}t#        j$                  |«      d   Š't'        ‰'«      Š*‰*j)                  «       D ��ci c]  \  }}||d   “Œ c}}Š(|j                  d«      }	|	dv }
d}d„ }t+        ‰(D �cg c]  }t-        j.                  ||«      sŒ|‘Œ c}|¬«      }ˆ'ˆ*fd„Š)t+        ˆ)fd„‰(D «       «      }|
rdgn|D �cg c]	  }|dv sŒ|‘Œ c}}dD �cg c]	  }|‰(v sŒ|‘Œ c}d d }|||dœ}ˆ(fd„}dD ]  \  }} ||«      sŒ ||«      ||<   Œ d‰(v rdgdD �cg c]	  }|‰(v sŒ|‘Œ c}z   |d<   |r||d<   g }|D ]U  }|j1                  t3        |j5                  «       d |‰(|   g d!¢d"t7        ‰(|   d   d#«      ||v xs	 |
xr |d$k(  d%¬&«	      «       ŒW d'd(d)d*d+d,d-d.d'd/d0d0d1d2œ}‰(j)                  «       D ]t  \  }}|j5                  «       }|j9                  d3«      d   }||v sŒ/||vsŒ4‰'d4   ‰*|   d      j                  d5«      �ŒR|j1                  t3        |||   d |d d6¬7«      «       Œv g }t         j                  j                  | › d8�«      r5	 t        j                  t        | › d8�«      «      j                  d9«      xs g }d:„ }|D �cg c]%  }t=        |t2        «      r|j                  d;«      nd ‘Œ' }}t?        ||«      D ��cg c]  \  }} ||«      sŒ ||«      |f‘Œ }}}|D ��cg c]  \  }}|‘Œ	 c}}tA        |«      D ���cg c]  \  }\  }}|xs d<|dz   › �‘Œ }}}}}‰'j                  d=g «      D � ci c]  } | j                  d;«      | “Œ }!} |!j                  d>i «      j                  d?i «      xs i j                  d@g dA¢«      d d# }"dBd>|"D �#cg c]  }#t7        |#dC«      ‘Œ c}#|xs |"D �#cg c]  }#t7        |#dC«      ‘Œ c}#g|r|ndDgdEdFdGœ|dH<   ||d4<   ||dI<   |D �cg c]  }|dJv sŒ‰(|   dK   ‘Œ }$}|D �cg c]  }|dJvsŒ‰(|   dK   ‘Œ }%}dLd%i}&|$r2|%r0t7        tC        |$«      tE        |$«      z  tG        |%«      z
  d#«      |&dM<   dN‰(v r"dO‰(v rt7        ‰(dN   d   ‰(dO   d   z
  d#«      |&dP<   |&|dQ<   dRdRdSdTdUdVœj                  |	dW«      |dX   dY<   |j                  dZ«      rtI        | ||‰'‰*‰(«       |j                  d[«      r6t+        tK        |j                  d[g «      «      tK        |d[   «      z  «      |d[<   t+        tK        |j                  d\g «      «      d]d^hz  «      |d\<   t        jL                  |«      |d_<   tO        t        jP                  t        |«      tE        |«      d`tE        |dH   d9   «      d9«       y c c}}w c c}w c c}w c c}w c c}w # t:        $ r g }Y �Œ'w xY wc c}w c c}}w c c}}w c c}}}w c c} w c c}#w c c}#w c c}w c c}w )aNz	/job.jsonÚidÚversioné   )r   r   Ú
provenanceÚjobz belongs to job z3: set job.json version to a free card version (see ú)ú/Úslugú.glbr   Úfamily)ÚmotosÚbikesz)Wheel_(F|R|FL|FR|RL|RR|RL2|RR2|L\d+|R\d+)c                 ób   — g d¢}| |v rd|j                  | «      dfS d| d   t        | dd  «      fS )N)ÚWheel_FÚWheel_FLÚWheel_FRÚWheel_RÚWheel_RLÚWheel_RRÚ	Wheel_RL2Ú	Wheel_RR2r   r	   é   é   )ÚindexÚint)ÚnÚbases     úL/home/claude-agent/forge-build/forge-assets/tools/vehicles/import_vehicle.pyÚworderzmain.<locals>.worder   s<   € ÚoˆØ()¨T©	��4—:‘:˜a“= !Ð$ÐL¸¸1¸Q¹4ÄÀQÀqÀrÀUÃÐ7LÐLó    )Úkeyc                 ó’   •— ‰d   ‰|    d      j                  d«      d uxs& t        ‰d   ‰|    d      j                  d«      «      S )NÚnodesr	   ÚmeshÚchildren)ÚgetÚbool)r    ÚdocÚwns    €€r"   ú<lambda>zmain.<locals>.<lambda>!   sU   ø€ �c˜'‘l 2 a¡5¨¡8Ñ,×0Ñ0°Ó8ÀÐDÒtÌÈSÐQXÉ\ÐZ\Ð]^ÑZ_Ð`aÑZbÑMc×MgÑMgÐhrÓMsÓHt€ r$   c              3   ób   •K  — | ]&  }t        j                  d |«      sŒ ‰|«      sŒ#|–— Œ( y­w)z2(Door_\w+|BayDoor_[LR]|Ramp|Canopy|Hatch_\w+|Hook)N©ÚreÚ	fullmatch)Ú.0r    Úsolids     €r"   ú	<genexpr>zmain.<locals>.<genexpr>"   s)   øè ø€ Òy˜¤R§\¡\Ð2gÐijÕ%kÑpuÐvwÕpx”1Ñyùs   ƒ/Ÿ/¨/ÚFork)r   r   )ÚBodyÚFrameÚHullÚFuselage)ÚbodyÚwheelsÚsteerc                 ó.   •‡ — t        ˆ fd„‰D «       «      S )Nc              3   óP   •K  — | ]  }t        j                  ‰|«      sŒ|–— Œ y ­w)Nr0   )r3   r    Úrxs     €r"   r5   z)main.<locals>.<lambda>.<locals>.<genexpr>&   s   øè ø€ ÒC 1¬r¯|©|¸BÀÕ/BœQÑCùs   ƒ&Ÿ&)Úsorted)r@   Úposs   `€r"   r.   zmain.<locals>.<lambda>&   s   ù€ ”fÓC¨ÔCÓC€ r$   )
)Ú	handlebarÚ	Handlebar)Ústeering_wheelÚSteeringWheel)Ú	kickstandÚ	Kickstand)ÚturretÚTurret)Úgunsz!(Gun|Gun_[LR]|Gun_Hull|MG|MG_\d+))ÚbarrelsÚBarrel)Útracksz
Track_[LR])Úrotorsz5(MainRotor|TailRotor|Rotor_Front|Rotor_Rear|Rotodome))ÚgearzGear_\w+)ÚsurfaceszI(Aileron|Elevon|Elevator|Stabilator|Rudder|Canard|Flap|DragRudder)(_\w+)?ÚCrank)ÚPedal_LÚPedal_RÚcrankÚdoorsÚwheel)r   r   r   r	   ÚXé   r   Úmeasured)	ÚnameÚroleÚparentrB   ÚrotÚ	spin_axisÚradiusr=   ÚsourceÚseatÚhandÚfootÚdoorÚlightÚexhaustÚmuzzleÚ	hardpointÚfxÚnozzleÚcenter_of_mass)rb   rc   rd   re   rf   rg   rh   ri   Útrooprj   rk   ÚengineÚcenterÚ_r'   r(   Úauthored)r[   r\   r]   rB   r^   ra   z/nodes.jsonÚpaintsc                 óú   — t        | t        «      r!t        d„ | j                  «       D «       d «      } t        | t        «      r4t        | «      dk\  r&| d d D �cg c]  }t        t        |«      d«      ‘Œ c}S d S c c}w )Nc              3   ó�   K  — | ]>  \  }}t        |t        «      r t        |«      d k\  rd|j                  «       v s|dv sŒ;|–— Œ@ y­w)rY   Úrgb)ÚlinearÚcolorÚcolourN)Ú
isinstanceÚlistÚlenÚlower)r3   ÚkÚvs      r"   r5   z$main.<locals>.rgb.<locals>.<genexpr>?   sQ   è ø€ ò  S™D˜A˜q´¸A¼tÔ1DÌÈQËÐSTÊÐY^Ðbc×biÑbiÓbkÑYkÐopð  uRò  pR”añ  Sùs
   ‚<A¿ArY   é   )ry   ÚdictÚnextÚitemsrz   r{   ÚroundÚfloat)ÚpÚxs     r"   ru   zmain.<locals>.rgb=   sr   € Ü�aœÔÜñ  S A§G¡G£Iô  Sð  UYó  ZˆAÜ6@ÀÄDÔ6IÌcÐRSËfÐXYÊk¨A¨b¨q¨EÖ2 q””e˜A“h Õ"Ò2ÐcÐ_cÐcùÒ2s   ÁA8r[   zpaint Ú	materialsÚPaintÚpbrMetallicRoughnessÚbaseColorFactor)r	   r	   r	   r	   zmaterial factorr   Údefaultrv   zPset the Paint material's color (linear RGB) to recolour; nothing else uses Paint)ÚencodingÚmaterialr‹   rr   ÚnamesÚcolour_spaceÚhowÚpaintÚsockets)r   r   r   é   ra   Ú	wheelbaser   r   ÚtrackÚgameplayz"library/two-wheel-+Z-front-+X-leftz5library/tracked-+Z-front-+X-left-origin-ground-centrez4library/rotorcraft-+Z-nose-+X-left-origin-under-mastz7library/aircraft-+Z-nose-+X-left-origin-under-main-gear)r   r   ÚtanksÚrotorÚjetsz	garage/v2ÚframeÚcontractÚdamageÚtagsÚ
techniqueszpaint-factorz	baked-pbrÚreleasezsockets,))ÚosÚpathÚabspathÚjsonÚloadÚopenÚcardlibÚpath_ofÚROOTr*   ÚexistsÚbasenameÚsysÚexitÚdirnameÚ
import_jobÚmainÚglbÚreadr   r‚   rA   r1   r2   Úappendr€   r|   rƒ   ÚsplitÚ	Exceptionry   ÚzipÚ	enumerateÚsumr{   ÚminÚdamage_fieldsÚsetÚrelease_hashÚprintÚwrite)+ÚjdÚjÚp0Úwasr…   ÚcÚfr    r~   ÚfamÚtwoÚWREr#   r<   rV   r=   r;   r'   Úpickr%   r@   r’   ÚrolesÚlowÚheadrr   ru   rŽ   ÚpairsÚarp   ÚiÚmÚmatsÚfacr†   ÚfzÚrzÚgpr,   rB   r4   r-   s+                                          @@@@r"   r¯   r¯      st  û€ Ü	�‰�‰˜Ó	€B¤$§)¡)¬D°B°4°yÐ1AÓ,BÓ"C˜aô 
�‰œ a¨¡g¸!¿%¹%À	È1Ó:MÑNÓ	O€BÜ	‡w�w‡~�~�bÔÜ�y‰yœ˜b›Ó"×&Ñ& |Ó4Ò:¸×?Ñ?ÀÓFˆÙ�3œ"Ÿ'™'×*Ñ*¨2Ó.Ò.Ü�H‰H˜�tÐ+¨C¨5Ð0cÔdf×dkÑdk×dsÑdsÐtvÓdwÐcxÐxyÐzÔ{Ü‡O�O�BÔÜ�‰œ Q t¡W¸¿¹¸yÈ!Ó9LÑMÓN€AÜ�	‰	”$�q“'Ó€AØˆ$ˆa��&‘	ˆ{˜$Ð€AÜ
�(‰(�1‹+�a‰.€CÜ	�SÓ	€BØ!Ÿx™x›z×
*‘t�q˜!ˆ1ˆa�‰d‰7Ó
*€CØ
�%‰%�‹/€C Ð(:Ð!:˜3Ø
6€CòMô  Ö<˜1¤r§|¡|°C¸Õ';’QÒ<À&ÔI€FÜt€EÜÓy˜cÔyÓy€EÙˆV‰H¨VÖ!U¨°qÐ<TÒ7T¢!Ò!U€EØ<ÖI�!ÀÀSÂŠAÒIÈ"È1ÐM€DØ V°eÑ<€EÛC€DðGò +‰ˆˆRñ ��8¡$ r£(�U˜3’Zð+ð �#�~¨¨	Ð@VÖ4c¸1ÐZ[Ð_bÒZb²QÒ4cÑ(c�u˜W‘~Ù˜uˆe�G‰nØ€GØò |ˆØ�‰”t §¡£°ÀÈÈAÉÒT`ÐloÜ#(¨¨Q©°©°AÓ#6¸qÀE¸zÒ>fÈsÒOeÐWXÐ\eÑWeÐoyô{õ 	|ð|ð  V°VÀVÐV]Ðjsð  @HØ%°¸dÈhÐbjð  wGñH€Eà—	‘	“ò n‰ˆˆ1Ø�g‰g‹iˆ §	¡	¨#£¨qÑ 1˜Ø�5Š=˜Q eš^°°G±¸RÀ¹UÀ1¹XÑ0F×0JÑ0JÈ6Ó0RÑ0ZØ�N‰Nœ4 S¨u°T©{À4ÈQÐTXÐakÔlÕmðnð €FÜ	‡w�w‡~�~˜˜˜KÐ(Ô)ð	Ü—Y‘Yœt r d¨+Ð$6Ó7Ó8×<Ñ<¸XÓFÒLÈ"ˆFòdð FLÖLÀœj¨¬DÔ1ˆQ�U‰U�6Œ]°tÑ;ÐL€EÐLÜ%(¨°Ó%7×B™T˜Q ¹3¸q½6‰c�!‹f�aŠ[ÐB€EÑBØ#(×)™4˜1˜a’QÓ)ÔS\Ð]bÓSc×+dÐ+dÁiÀaÉÈ!ÈQ¨AÒ,A°6¸!¸a¹%¸Ð1AÑ,AÐ+dˆEÒ+d€FØ&)§g¡g¨k¸2Ó&>Ö? ˆA�E‰E�&‹M˜1ÑÐ?€DÐ?Ø�8‰8�G˜RÓ ×$Ñ$Ð%;¸RÓ@ÒFÀB×
KÑ
KÐL]Ò_kÓ
lÐmoÐnoÐ
p€CØ/¸WÐgjÖQkÐbcÔRWÐXYÐ[\ÕR]ÒQkØ"ÒB¸SÖ'A¸¬¨a°­Ò'AÐ&BÑV\ÉUÐclÐbmð  @HØkñm€A€g�Jð €A€g�JØ€A€i�LØ#Ö	P˜ qÐ,OÒ'Oˆ#ˆa‰&�‹)Ð	P€BÐ	PØ#Ö	T˜ qÐ0SÒ'Sˆ#ˆa‰&�‹)Ð	T€BÐ	TØ
�JÐ	€BÙ	‰bÜ¤ B£¬#¨b«'Ñ 1´C¸³GÑ ;¸QÓ?ˆˆ;‰Ø�SÑ˜Z¨3Ñ.Ü˜C 
™O¨AÑ.°°Z±ÀÑ1CÑCÀQÓGˆˆ7‰Ø€A€j�MØ'KÐVzØ'^Ø']Ø&_ña÷ beÑadÐehÐjuÓavð €g�JˆzÑð 	‡u�uˆX„Ü�b˜!˜Q  R¨Ô-Ø‡u�uˆV„}Üœ3˜qŸu™u V¨RÓ0Ó1´C¸¸&¹	³NÑBÓCˆˆ&‰	ÜœS §¡ |°RÓ!8Ó9¸^È[Ð<YÑYÓZ€A€l�OÜ×'Ñ'¨Ó*€A€i�LÜ	Œ'�-‰-œ˜aÓ
 ¤# g£,°
¼CÀÀ'Á
È8Ñ@TÓ<UÐW_Õ`ùóG +ùò =ùò "VùÚIùò 5døô  ò 	Ø‹Fð	üò MùÛBùÛ)ùÔ+dùÚ?ùâQkùÚ'Aùò 
QùÚ	Ts�   Ç\È\$È*\$É	\)É$\)É/	\.É9\.Ê6	\3Ë \3Ï+4\8 Ð&*]
Ñ!]Ñ2]Ò]Ò$]
Ó]"Ô2]'Õ],
Ö	]1Ö
]1Ö	]6Ö%
]6Ü8]Ý]c                 ó`  ‡‡‡‡‡ ‡!— ddl }ddl}ddlm}  || |‰‰d«      }	‰j	                  «       D �
���ci c]=  \  }
\  }}|
dv sŒ|
t        ‰|«      D �ch c]  }‰d   |   j                  d«      ’Œ c}“Œ? }}}}
}|j                  dt        «       «      Š!t        |j                  d«      t        «      r|d   ni }|d	   d
   }|d   dz  |d   dz  cŠ Šˆˆ ˆ!ˆfd„}t        ˆˆfd„‰D «       «      }d|	d   g i i i i dœ}| › d|d   › d�}i }t        j                  j                  |«      r³|j                  t        |d«      j!                  «       «      j#                  «       }|j%                  |t&        › d|› d�«       d|› �|d   d<   t)        j                   |«      d   }t+        |«      }t)        j,                  |«      }d|d   |d   t/        |d   d«      d œ|d!<   |D ]2  }
d"|
d#d z   }|d$   j1                  |
||v r|nd ||
«      ‰|
   d%œ«       Œ4 t        |«      D ]=  }
|
j3                  d&«      sŒ|
|d'   |
d#d j5                  «       j7                  d(d)«      <   Œ? d*‰v rd*nd+}d,d-|d.ffD ]  \  }}||v sŒ|‰v sŒ||d/   |<   Œ d0D ]  \  }}
|
|v sŒ|
|d1   |<   Œ d2|v rd3|d4   d2<   d5|v rd‰v rdnd3|d4   d5<   t        ‰«      D �
ci c]+  }
|
j3                  d6«      sŒ|
d7d j5                  «       ‰|
   “Œ- c}
|d8<   d9|d:<   ||d   d;<   |	d<   s|	d=   r|	d<   |	d=   d>œ|d?   d;<   t        |d   j                  d@«      xs i «      t        |d   j                  dA«      xs i «      }}|d   j                  dBg «      D ]U  }
g dC¢g dD¢dEœ||
<   |
d*k(  rd‰v r	ddgdFdGgdEœn1|
d*k(  r	dHdIgdJdKgdEœn#|
dLv r	dMdNgdJdGgdEœn|
dOk(  r	ddgdJdIgdEœndPdQgdRdSgdEœ||
<   ŒW d‰v rg dC¢|d<   |d   j                  dTg «      D ]  }
g dU¢||
<   ddGg||
<   Œ ||c|d   d@<   |d   dA<   yc c}w c c}}}}
w c c}
w )Vzætank-damage/v1 (11 Oct 2026): c.files.damage_glb + c.nodes.damage = what a game shows and hides for each state,
    read from the node NAMES of the two files (never from the author's own JSON), + standard tank axes and aim limits.r   N)Úcheck_damage)rJ   r'   r[   rJ   ÚboundsÚsizeÚ
measured_mÚwr“   Úlc                 óâ   •— | ‰v s| j                  d«      ry‰	|    \  }}}|‰z  |‰z  }}t        |«      dk  rt        |«      dk  ryt        |«      t        |«      k\  r	|dkD  rdS dS |dkD  rd	S d
S )N)ÚPart_TurretÚ
Dmg_TurretrI   gÍÌÌÌÌÌÜ?gš™™™™™á?Útopr   ÚleftÚrightÚfrontÚrear)Ú
startswithÚabs)
r    r†   ÚyÚzÚnxÚnzÚhlÚhwÚ	on_turretrB   s
         €€€€r"   Úzonezdamage_fields.<locals>.zonej   sƒ   ø€ Ø�	‰>˜QŸ\™\Ð*GÔHÐQYØ�a‘&‰ˆˆ1ˆa 1 r¡6¨1¨r©6˜b˜"Üˆr‹7�TŠ>œc "›g¨šn°UÜ14°R³¼CÀ»GÒ1C˜!˜aš%�Ðg WÐgÐUVÐYZÒUZÈ'ÐgÐ`fÐgr$   c              3   ó‚   •K  — | ]6  }|j                  d «      sŒ‰d   ‰|   d      j                  d«      €Œ3|–— Œ8 y­w)ÚPart_r'   r	   r(   N)rã   r*   )r3   r    r,   r-   s     €€r"   r5   z damage_fields.<locals>.<genexpr>o   s?   øè ø€ Òn˜ Q§\¡\°'Õ%:¸sÀ7¹|ÈBÈqÉEÐRSÉHÑ?U×?YÑ?YÐZ`Ó?aÑ?m”1Ñnùs   ƒ?š?¸?ztank-damage/v1Ústates)r›   rï   ÚpartsÚscarsÚbrokenÚwreckÚattachr   r   z-damage.glbÚrbz/store/blobs/r   zsha256:ÚfilesÚ
damage_glbÚtrisÚbytesÚgpu_mb_decodedr	   )r%   rø   rù   rú   ÚfileÚDmg_é   rð   )ÚnodeÚtwinrì   rB   ÚScar_rñ   rp   ú-ÚGunÚGun_L)ÚTrack_LÚTrack_L_Broken)ÚTrack_RÚTrack_R_BrokenÚ
Gun_Brokenrò   ))ÚhullÚ
Wreck_Hull)rI   ÚWreck_Turretró   ÚHull_Damager9   rô   ÚTurret_DamageÚFx_rY   rj   a–  load files.damage_glb once, add it at the tank origin, hide all of it; put Turret_Damage under the node in attach (same pivot); hit = show a Scar_ and swap a Part_ for its twin; stripped = hide Part_ nodes (or throw them); broken = swap the node for its _Broken twin; wreck = hide the whole healthy file, show Wreck_Hull (+ Wreck_Turret, which may be thrown off). Paint in both files takes the same colour.r�   rœ   ÚerrorsÚwarnings)r  r  ÚqualityÚaxesÚlimitsrK   )r   r	   r   )éÿÿÿÿr   r   )ÚyawÚpitchg¸…ëQ¸¾¿gffffffÖ?g)\�Âõ(Ü¿g)\�Âõ(Ü?g      Ð¿g333333Ó?)r  ÚGun_RgÍÌÌÌÌÌì¿gÍÌÌÌÌÌì?ÚGun_Hullg      ð¿g      ð?g333333Ã¿g333333ã?rL   )r   r   r  )ÚhashlibÚshutilÚcheck_vehiclerÕ   r‚   Ú_allr*   rº   ry   r€   rA   r    r¡   r©   Úsha256r¥   r±   Ú	hexdigestÚcopyfiler¨   r°   r   Úmeasurerƒ   r²   rã   r|   Úreplace)"r¾   r¿   rÂ   r,   r-   rB   r  r  rÕ   Úrepr    rp   rÍ   r}   ÚkidsÚbrÎ   rì   rð   ÚdrÃ   ÚdnÚhÚddÚdmmÚtÚbase_gunrÌ   Úbbr  r  ré   rê   rë   s"      ```                         @@@r"   r¹   r¹   `   sý  ý€ ÷ Ý*Ù
�r˜1˜c 2 tÓ
,€CØTV×T\ÑT\ÓT^×sÑsÁyÀqÉ&È1ÈaÐbcÐgrÒbrˆA´T¸#¸q³\ÖB°��G‘˜Q‘×#Ñ# FÕ+ÒBÑBÐs€DÓsØ—‘˜¤3£5Ó)€IÜ! !§%¡%¨£/´4Ô8ˆˆ(Š¸b€AØ	ˆ&‰	�,Ñ€A¨!¨C©&°1©*°a¸±f¸q±j   R÷hô
 Ôn˜cÔnÓn€EØ%°°X±ÈÐVXÐdfÐqsð  @Bñ  	C€AØˆ$ˆa��&‘	ˆ{˜+Ð&€AØ	€BÜ	‡w�w‡~�~�aÔØ�N‰Nœ4  4›=×-Ñ-Ó/Ó0×:Ñ:Ó<ˆØ�‰˜œd˜V =°°°4Ð8Ô9Ø%,¨Q¨C =ˆˆ'‰
�<Ñ Ü�X‰X�a‹[˜‰^ˆ¤+¨b£/˜RÜ�k‰k˜!‹nˆØ(°#°f±+ÈÈGÉÔhmÐnqð  sCñ  oDð  FGó  iHñ  Iˆˆ&‰	Øò gˆØ�Q�q�r�U‰NˆØ	ˆ'‰
×Ñ 1°1¸±7©aÀÉdÐSTËgÐ^aÐbcÑ^dÑeÕfðgô �B‹Zò <ˆØ�<‰<˜Õ Ø:;ˆAˆg‰J�q˜˜�u—{‘{“}×,Ñ,¨S°#Ó6Ò7ð<ð  ™‰u¨'€HØ/Ð1NÐQYÐ[gÐPhÐiò 6‰ˆˆ2Ø�Š8˜˜Sš°2 ! H¡+¨a¢.ð6àDò &‰ˆˆ1Ø�Š7 A�A�g‘J˜q’Mð&à˜Ñ¸˜A˜h™K¨Ñ6Ø˜"ÑÈÐUXÉ¹XÐ^d˜a ™k¨/Ñ:Ü.4°S«kÖQ¨¸Q¿\¹\È%Õ=Pˆq��ˆu�{‰{‹}˜c !™fÑ$ÒQ€A€d�GðW€A€e�Hð €A€g�JˆxÑØ
ˆ8‚}˜˜JšØ,/°©MÀsÈ:ÁÑ!Wˆˆ)‰�XÑÜ˜˜'™
Ÿ™ vÓ.Ò4°"Ó5´t¸A¸g¹J¿N¹NÈ8Ó<TÒ<ZÐXZÓ7[ˆ&€DØˆw‰Z�^‰^˜F BÓ'ò BˆÚ#ªjÑ9ˆˆQ‰Ø@AÀUÂ
ÈxÐ[^É˜a ˜V¨u°d¨mÒ<ØFGÈ5Âj˜e T˜]°e¸S°\ÒBØEFÐJ\ÑE\˜d C˜[°E¸4°=ÒAØ@AÀZÂ˜a ˜V¨u°d¨mÒ<Ð^bÐdgÐ]hÐtyÐ{~Ðsñ  VAð 	ˆqŠ	ðBð �3�ª˜˜X™Øˆw‰Z�^‰^˜I rÓ*ò 4ˆÚˆˆQ‰¨1¨d¨)˜f Qšið4à/3°VÐ,€A€g�JˆvÑ˜˜'™
 8Ò,ùòg CùÕsùòB Rs)   ¶P#
ÁP#
ÁPÁ3P#
ËP+Ë#P+ÐP#
c                 óÎ   — g t        | d   |   j                  dg «      «      }}|r?|j                  «       }|j                  |«       || d   |   j                  dg «      z  }|rŒ?|S )Nr'   r)   )rz   r*   Úpopr²   )r,   rÍ   ÚoutÚstackr}   s        r"   r  r  œ   sf   € Ø”T˜#˜g™, q™/×-Ñ-¨j¸"Ó=Ó>ˆ€CÙ
Ø�I‰I‹Kˆ˜Ÿ™ Aœ¨°°W±¸a±×1DÑ1DÀZÐQSÓ1TÑ(T¨ò à€Jr$   Ú__main__r	   )Ú__doc__r£   r    r1   r«   r¡   r­   r¢   Ú__file__r¨   ÚinsertÚjoinr°   Úcardr¦   r®   r  r   r¯   r¹   r  Ú__name__Úargv© r$   r"   ú<module>r:     s  ðñz÷ × Ø	‡w�w‡��r—w‘w—‘ r§w¡w§¡°r·w±w·±ÀxÓ7PÓ'QÓRÓS€Ø ‡�‡���2—7‘7—<‘<  eÓ,Ô -¨s¯x©x¯©¸qÀ"Ç'Á'Ç,Á,ÈtÐU\ÓB]Ô/^Ð`c×`hÑ`h×`oÑ`oÐpqÐsu×szÑsz÷  tCñ  tCð  DLó  tMô  aNß 'Ó 'Ý %òRaòj9<òxð ˆzÒÙˆ�‰�!‰Õð r$   