Ë
    ù_ÆjP  ã                   óâ  — d Z ddlZddlZddl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«      «      «      Zej                  j                  dej                  j                  ed«      «       ddlZddlZej                  j%                  d«      Ze› d�Z ej*                   ee› d�«      «      Zd„ Zd„ Zi d	d
“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd“dd “d!d"“d#d$“d%d&“d'd(d)d)d*œ¥Zg d+¢Zg d,¢Zg d-¢Zd.d/d0d1d2d3d4œZg d5¢Zg d6¢Z d7d8d9d:d;œZ!d<d=d>d?œZ"d@„ Z#dA„ Z$dB„ Z%dC„ Z&dD„ Z'dE„ Z(e)dFk(  r e(«        yy)Ga  P0 import: every model we already own -> blob by hash + one card (version 1, gates "legacy").

usage: python3 tools/import_existing.py      (idempotent: same file = same release, cards rewritten)
Sources: FGE assets (garage, store kit, village kit, worldgen props), Cast dist files, IKEA catalog, FPS weapon kit.
Spatial numbers are MEASURED from the file (lib/glb.py; skinned meshes get their size from the browser pass);
kit notes (colliders, footprints, roles) are AUTHORED by the kit's maker; seats and similar are GUESSED.
é    NÚlibz~/forge-buildz/forge-game-enginez/taxonomy/bands.jsonc                 óx   — t        j                  t        | d«      j                  «       «      j	                  «       S )NÚrb)ÚhashlibÚsha256ÚopenÚreadÚ	hexdigest)Úpaths    úD/home/claude-agent/forge-build/forge-assets/tools/import_existing.pyÚshar      s*   € Ü�>‰>œ$˜t TÓ*×/Ñ/Ó1Ó2×<Ñ<Ó>Ð>ó    c                 ó&  — 	 t        j                  t        | «      «      }|j	                  d«      xs |j	                  d«      xs g }|D �ci c]%  }t
        j                  j                  |d   «      |“Œ' c}|fS # t        $ r i i fcY S w xY wc c}w )NÚpiecesÚassetsÚfile)ÚjsonÚloadr   ÚFileNotFoundErrorÚgetÚosr   Úbasename)Úkit_jsonÚdÚpsÚps       r   Ú
kit_piecesr      s†   € ðÜ�I‰I”d˜8“nÓ%ˆð 
�‰ˆx‹Ò	1˜AŸE™E (›OÒ	1¨r€BØ46Ö7¨qŒB�G‰G×Ñ˜Q˜v™YÓ'¨Ñ*Ò7¸Ð:Ð:øô ò Ø�2ˆvŠðüò 8s   ‚A; Á*BÁ;BÂ
BÚkartzvehicle.kart.kartÚracezvehicle.car.racezrace-futureztractor-policezvehicle.utility.tractorÚtractorztractor-shovelzvehicle.utility.loaderÚdeliveryzvehicle.utility.delivery-truckzdelivery-flatÚvanzvehicle.utility.vanÚtruckzvehicle.utility.pickupz
truck-flatÚ	ambulancezvehicle.service.ambulanceÚ	firetruckzvehicle.service.fire-truckzgarbage-truckzvehicle.service.garbage-truckÚpolicezvehicle.service.policeÚtaxizvehicle.service.taxiÚsedanzvehicle.car.sedanzvehicle.car.sportszvehicle.car.hatchbackzvehicle.car.suv)zsedan-sportszhatchback-sportsÚsuvz
suv-luxury))zbed|bunk|mattress|cribzprop.furniture.bed)Úsofazprop.furniture.sofa)Úarmchairzprop.furniture.armchair)z%office_chair|dining_chair|chair_stackzprop.furniture.chair)ztable|desk|tv_benchzprop.furniture.table)zbookcase|shelf|kubbzprop.furniture.shelf)Úwardrobezprop.furniture.wardrobe)Úchest_drawerszprop.furniture.drawers)zlamp|pendantzprop.furniture.lamp)Úkitchenzprop.furniture.kitchen)zvanity|toiletzprop.furniture.bath)Úmirrorzprop.furniture.mirror)z^rug$zprop.furniture.rug)ztrolley|shopping_cart|strollerzprop.retail.cart)zpallet|flatpackzprop.container.pallet)zLgondola|rack|price_stand|sign|stair_market|candle_bin|wire_bin|rug_rack|bin_zprop.retail.stand)Úplantzprop.decor.plant)Úcushionzprop.decor.cushion)Úvasezprop.decor.vase)Úframezprop.decor.frame)Úbookzprop.decor.book)Úplushzprop.decor.plush)Úmeatballzprop.decor.food)zbag|pot_stackúprop.decor.goods))Úentrance_doorszpart.opening.door)Ú	partitionzpart.wall.partition)Úcolumnzpart.structure.column)zstair|escalatorúpart.stair.stair)Ú
balustradezpart.stair.balustrade)Úslabzpart.floor.slab)Ú	tray_railzpart.structure.rail)Úcheckoutzprop.retail.checkout)Úfood_counterzprop.retail.counter)Úball_pitr7   )Úsignzprop.retail.sign)zgondola|rack|bin_zprop.retail.rack))zfloor|terracezpart.floor.floor)Ú
roof_slopezpart.roof.slope)Ú	gable_endzpart.roof.gable-end)Úchimneyzpart.roof.chimney)Ústairr;   )Úbalconyzpart.stair.balcony)Úcornerzpart.wall.corner)Úparapetzpart.wall.parapet)Úgarden_wallzpart.wall.garden-wall)Ú	retainingzpart.wall.retaining-wall)Úwallzpart.wall.modulezvehicle.sea.trawlerzbuilding.fort.towerzbuilding.landmark.lighthousezbuilding.landmark.cranezbuilding.medieval.chapelzbuilding.civic.market)Ú
lm_trawlerÚlm_watch_fortÚlm_lighthouseÚlm_craneÚ	lm_chapelÚlm_fish_hall))Ú	lamp_postzprop.street.lamp)Úbenchzprop.street.bench)zbollard|mooringzprop.harbour.mooring)Úanchorzprop.harbour.anchor)Úbuoyzprop.harbour.buoy)Únet_rackzprop.harbour.net)Úropezprop.harbour.rope)Úlobsterzprop.harbour.lobster-pot)Ú
fish_boxeszprop.harbour.fish-box)Úrowboatzvehicle.sea.rowboat)zboulder|rockúprop.nature.rock)Ú	quay_wallzpart.wall.quay-wall)Ú	dock_deckzpart.floor.deck)zdock_stairs|stone_stepszpart.stair.steps)Úbarrelzprop.container.barrel)Úcratezprop.container.crate)Úfencezprop.farm.fence)Úcartzprop.farm.cart))Útreezprop.nature.tree)zrock|basaltr\   )r:   zbuilding.ruin.column)Úarchzbuilding.ruin.archzmonster.creature.sharkzmonster.construct.brutezmonster.construct.impzmonster.construct.sentry)ÚhajÚbrute_billigÚimp_flatpackÚlamp_sentry)zweapon.firearm.riflezKR-7 assault rifle)zweapon.firearm.smgzSM-9 submachine gun)zweapon.firearm.shotgunzPS-12 pump shotgun)Úkr7Úsm9Úps12c                 óL   — | D ]  \  }}t        j                  ||«      sŒ|c S  y )N)ÚreÚsearch)ÚtableÚnameÚpatr   s       r   Úrulerr   N   s-   € Øò ‰	ˆˆTÜ�9‰9�S˜$ÕØŠKðð r   c                 óL   — t        j                  dd| «      j                  «       S )Nz[_-]+ú )rm   ÚsubÚstrip)rp   s    r   Úhumanizerw   U   s   € Ü�6‰6�(˜C Ó&×,Ñ,Ó.Ð.r   c               #   óâ  K  — t        j                  t        t        › d�«      «      } | d   j	                  «       D ]Â  \  }}|D ]¸  }|d   }|j                  d«      rdn|}t        t        › d|d   › �|› d|› �t        |   |dk(  rd	nd
› dt        |«      › �|j                  dd«      |dk(  rdndd|t        |dk(  rdndd|dk(  |dk(  rdnd¬«      t        |dk(  rd	nd|j                  dd«      d¬«      ¬«
      –— Œº ŒÄ dt        dfdt        dfdfD �]M  \  }}}t        t        › d |› d!�«      \  }	}
t        t        j                  t        › d |› d"�«      «      D �]  }t        j                   j#                  |«      dd# }|d$k(  rt$        j                  |«      nt'        ||«      }|st)        d%||«       Œ\|	j                  t        j                   j#                  |«      «      }t        |d&|j+                  d'd«      › �|d(t        |«      › �|xs i j                  d)«      xs t        |«      › d*�dd+|t        ddd,d-|› d.�¬«      t        d/d0|› �d1¬«      ¬2«
      –— �Œ �ŒP d3t,        fd4d5t.        ffD �]l  \  }}t        t        › d6|› d!�«      \  }	}
t        t        j                  t        › d6|› d"�«      «      D �]"  }t        j                   j#                  |«      dd# }|d7k(  rt0        j                  |«      nt'        ||«      }|st)        d%||«       Œ\|	j                  t        j                   j#                  |«      «      }t        |d8|j+                  d9d«      j+                  d'd«      › �|d:t        |j+                  d9d«      «      › �|xs i j                  d)«      xs t        |«      › d;�dd+|t        ddd,d<|› d=�¬«      t        d/d>|› �d?¬«      ¬2«
      –— �Œ% �Œo t        t        › d@�«      \  }	}
t        t        j                  t        › dA�«      «      D ]ä  }t        j                   j#                  |«      dd# }|	j                  t        j                   j#                  |«      «      }t        |dB|j+                  d'd«      › �t'        t2        |«      dCt        |«      › �|xs i j                  dDd«      xs t        |«      dd+|t        ddd,dE¬«      t        dF|xs i j                  dd«      dG¬«      ¬2«
      –— Œæ t4        › dH�}t        t        j                  |› dI�«      «      D �]t  }|j7                  dJ«      dK   }t        j                   j#                  |«      dd# }|j9                  «       }|dLk(  rdM\  }}nÈ|j                  dN«      rdOt        |«      }}n©|dPv rdQt        |«      }}n—|dRv rdSdTdUdVdRœ|   z   t        |«      }}n{|dWv rdXdY|› dZt        |«      › �}}nc|d[v r/d\|j7                  d«      d]   z   d^|j7                  d«      d]   › �}}n0d_d`dadbdcdddddddddedfœ	j                  |d`«      z   dY|› dt        |«      › �}}t        |dg|› d|j+                  d'd«      › �||dY|› dht        |«      › di�ddjt        ddddk¬«      t        dldm|› �dn¬«      ¬o«	      –— �Œw t        t        j                  t4        › dp�«      «      D ]˜  }t        j                   j#                  |«      dd# }t        |dq|› �drdsdsdsdtdududvdvdvdvdwœ
j                  |dt«      z   dx|j;                  «       › dy�dz|j;                  «       › d{�d|d+t        d}d,d,d~¬«      t        d/dd€¬«      ¬o«	      –— Œš t<        j	                  «       D ]o  \  }\  }}t4        › d�|› dJ|› d‚�}t        j                   j?                  |«      sŒ8t        |dƒ|› �|||› d„�d|d…t        ddd,d†¬«      t        dFd‡|› �dˆ¬«      ¬o«	      –— Œq y­w)‰zlYield dicts: file, slug, path, name, summary, style, frame, licence, provenance, kit piece (or None), extra.z/assets/garage/catalog.jsonÚfamiliesÚidr   z/assets/garage/r   ú-ÚkenneyÚKenneyÚForgert   ÚaboutÚ ÚtoyÚstylizedz	garage/v2Úcc0ÚownedTz8FGE assets/garage/SOURCES.json (Kenney car kit, CC0 1.0)zCFGE tools/garage/forge/kart_standard.py, GPT-6 Astra worker 30 Sept)ÚkindÚgame_useÚraw_redistributeÚevidencezgpt-6-astraÚsourceÚgarage)Úauthorr‰   Úkit)
r   Úslugr   rp   ÚsummaryÚstyler3   rŠ   ÚlicenceÚ
provenanceÚ	furnitureNÚ	structure)ÚenemiesNNz/assets/store-kit/z	/kit.jsonz/*.glbéüÿÿÿr”   ÚUNMAPPEDzstore-Ú_zFlat-pack store Únotesu(    from the MÃ–BELKRIG flat-pack store kitzkit/+Z-frontFzFGE assets/store-kit/uK   : original procedural Blender art by Forge workers (MÃ–BELKRIG, 25-27 Sept)zforge-worker (Blender)zassets/store-kit/z	store-kit)
r   r�   r   rp   rŽ   r�   r3   Úpiecer�   r‘   Ú	buildings)Ú	landmarksNÚpropsz/assets/village-kit/r›   zharbour-Úlm_zHarbour village z from the harbour village kitzFGE assets/village-kit/z=: Blender kit authored by Forge workers (village genre, Sept)zassets/village-kit/zvillage-kitz/assets/props/kit.jsonz/assets/props/*.glbz
tideglass-z
Tideglass r‘   zSFGE assets/props/kit.json: Tideglass biome art by Astra Blender workers, 14-15 Septzgpt-6-astra (Blender)Ú	tideglassz"/omg-cast-20260929/dist/cast-filesz/*/*.glbú/éþÿÿÿÚclips)zmotion.clips.corezUAL core animation clipsÚhairzpart.character.hair)ÚgogglesÚhelmetzfootball-helmetzpart.character.gear)zfootball-ballÚracketÚ	snowboardzprop.sport.Úballr¥   Úboard)ÚfantasyÚmodernÚscifizpart.character.outfitzCast z outfit )zubc-malez
ubc-femalezcharacter.base.é   z
Cast base zcharacter.people.Úcrowdrª   r©   r«   ÚsportÚwater)	r­   rª   r©   r«   ÚfootballÚtennisÚrealÚoutfitÚpaddlezcast-z set: z on the shared UAL skeletonúcast/ualzwomg-cast-20260929/assets/cast/SOURCES.json (Quaternius UBC/UAL CC0 1.0; MPFB/MakeHuman CC0 output; Astra outfits owned)zQuaternius + Forge Cast workerszomg-cast dist/cast-files/Úcast)	r   r�   r   rp   rŽ   r�   r3   r�   r‘   z'/ikea-apartment-20260925/assets/*/*.glbzikea-zprop.furniture.r*   Úchairr+   r.   )
ÚkivikÚklippanÚ
landskronaÚlisaboÚpoangÚ	strandmonÚ	underverkÚrakallÚ	matmassigÚmattraditionzIKEA z reconstructionzReconstruction of the IKEA z from official photos and sizesÚ	realisticzowned-recreationzlikea-apartment-20260925 (Forge Blender rebuild). Real product design + trademark name: not cleared for gameszikea-apartment-20260925Úikeaz/fps-engine-20261005/kit/astra/ú.glbzfps-z/, realistic, named parts + sight/muzzle emptiesz!weapon/grip-origin-muzzle-minus-zzKfps-engine-20261005 kit: Nano Banana Pro sheet + GPT-6 Astra Blender, 5 Octzfps-engine-20261005/kit/astra/zfps-kit) r   r   r   ÚFGEÚitemsÚ
startswithÚdictÚGARAGErw   r   ÚFURNÚSTRUCTr   ÚsortedÚglobr   r   r   ÚENEMYrr   ÚprintÚreplaceÚ	VILLAGE_BÚ	VILLAGE_PÚ
VILLAGE_LMÚWORLDÚFBÚsplitÚlowerÚupperÚWEAPONÚexists)ÚcatÚfamrÆ   ÚeÚbaseÚkeyrŒ   ro   Ú	base_pathr   r   ÚfÚnr   r   r¶   ÚgrpÚlowÚnmÚks                       r   Úsourcesrç   Z   sü  è ø€ ä
�)‰)”DœC˜5Ð ;Ð<Ó=Ó
>€CØ˜*‘o×+Ñ+Ó-ò 
6‰
ˆˆUØò 		6ˆAØ�T‘7ˆD¨D¯O©O¸FÔ,C¡&È˜CÜœs˜e ?°1°V±9°+Ð>ÈÀuÈAÈdÈVÀ_Ô[aÐbeÑ[fØ+.°(ª?™xÀÐHÈÌ(ÐSWË.ÐIYÐZÐde×diÑdiÐjqÐsuÓdvØ&)¨X¢o™U¸:È[ÐabÜ#°#¸²/©ÀwÐY]ÐpsÐwÑpØknÐrzÒkzÑ-gØ)nô pô #'¸#Àº/©hÈ}Ðef×ejÑejÐksÐuwÓexØ+3ô#5ô6ó 6ñ		6ð
6ð $/´°dÐ";¸kÌ6ÐSWÐ=XÐZqÐ!ró |ÑˆˆU�IÜ¤# Ð&8¸¸¸YÐGÓH‰	ˆ�ÜœŸ	™	¤S EÐ);¸C¸5ÀÐ"GÓHÓIó 	|ˆAÜ—‘× Ñ  Ó# C RÐ(ˆAØ#&¨)Ò#3”5—9‘9˜Q”<¼¸eÀQ»ˆDÙÜ�j # qÔ)¨8Ø—
‘
œ2Ÿ7™7×+Ñ+¨AÓ.Ó/ˆAÜ˜A f¨Q¯Y©Y°s¸CÓ-@Ð,AÐ$BÈÐVfÔgoÐpqÓgrÐfsÐTtØ !¢ RŸ}™}¨WÓ5Òq¼HÀQ»K¸=ÐHpÐ9qØ'¨~ÀQÜ#¨¸4ÐRWØ/DÀSÀEð  JUð  .Vô Wä"&Ð.FÐQbÐcfÐbgÐOhÐnyÔ"zô|ô |ò	|ð|ð $¤YÐ/Ð1DÀwÔPYÐFZÐ[ó @‰
ˆˆUÜ¤# Ð&:¸3¸%¸yÐIÓJ‰	ˆ�ÜœŸ	™	¤S EÐ)=¸c¸UÀ&Ð"IÓJÓKó 	@ˆAÜ—‘× Ñ  Ó# C RÐ(ˆAØ(+¨{Ò(:”:—>‘> !Ô$ÄÀUÈAÃˆDÙÜ�j # qÔ)¨8Ø—
‘
œ2Ÿ7™7×+Ñ+¨AÓ.Ó/ˆAÜ˜A h¨q¯y©y¸ÀÓ/C×/KÑ/KÈCÐQTÓ/UÐ.VÐ$WÐ^bØ.¬x¸¿	¹	À%ÈÓ8LÓ/MÐ.NÐOØ !¢ RŸ}™}¨WÓ5Òf¼HÀQ»K¸=ÐHeÐ9fØ'¨~ÀQÜ#¨¸4ÐRWØ/FÀsÀeð  LIð  .Jô Kä"&Ð.FÐQdÐehÐdiÐOjÐp}Ô"~ô@ô @ò	@ð@ô œc˜UÐ"8Ð9Ó:�I€FˆAÜ”D—I‘I¤ Ð%8Ð9Ó:Ó;ò yˆÜ�G‰G×Ñ˜QÓ  Ð$ˆ¨&¯*©*´R·W±W×5EÑ5EÀaÓ5HÓ*I aÜ˜ *¨Q¯Y©Y°s¸CÓ-@Ð,AÐ BÌÌeÐUVËÐ`jÔksÐtuÓkvÐjwÐ^xØšG Ÿ=™=¨°rÓ:ÒI¼hÀq»kÐQ[ÐcqÐyzÜ W°tÈeØ)~ô@ä"Ð*AÈ1Ê7ÐPRÏ-É-ÐX`ÐbdÓJeÐkvÔwô	yó 	yðyô ˆTÐ3Ð4€DÜ”D—I‘I   hÐ/Ó0Ó1ó DˆØ�g‰g�c‹l˜2Ñˆ¤B§G¡G×$4Ñ$4°QÓ$7¸¸Ð$< ÀAÇGÁGÃI¸cØ�'Š>ØF‰HˆD‘"Ø�^‰^˜FÔ#Ø,¬h°q«k�"‰DØÐ<Ñ<Ø,¬h°q«k�"‰DØÐ<Ñ<Ø$¸È8ÐbiÑ'jÐknÑ'oÑoÔqyÐz{Óq|�"‰DØÐ2Ñ2Ø.°%¸°u¸HÄXÈaÃ[ÀMÐ0R�"‰DØÐ.Ñ.Ø(¨3¯9©9°S«>¸!Ñ+<Ñ<À
È3Ï9É9ÐUXË>ÐZ[ÑK\ÐJ]Ð>^�"‰Dà*°wÈ(Ð_hÐszØ;BÈgÐ_fÐryØ9@ñ.BçBEÁ#ÀcÈ7ÓBSñTàW\Ð]`Ð\aÐabÔckÐlmÓcnÐboÐUpð ˆDô ˜ %¨ u¨A¨c¯k©k¸#¸sÓ.CÐ-DÐ EÈDÐWYØ" 3 % v¬h°q«k¨]Ð:UÐVÐ^hÐpzÜ U°TÈDð*@ôAô #Ð*KÐVoÐpsÐotÐTuð  |Bô  CôDô 	Dð%Dô0 ”D—I‘I¤ Ð$KÐLÓMÓNò 
sˆÜ�G‰G×Ñ˜QÓ  Ð$ˆÜ˜ %¨ s Ð2CÐQWÐdjð  {AØ$¨zÈ
ÐajÐvØ )¸9ñHFçFIÁcÈ!ÈWÃoñ3Wà_dÐef×elÑelÓenÐdoÐo~Ð]Ø8¸¿¹»¸ÐCbÐcÐkvØ'ÜÐ%7À%ÐZ_ð*AôBô #Ð*BÐKdÐjpÔqôsó 	sð
sô  Ÿ™›ò D‰ˆ‰:ˆD�"ÜˆdÐ1°!°°A°a°S¸Ð=ˆÜ�7‰7�>‰>˜!ÕÜ˜A d¨1¨# J°TÀÈrÈdð  SBð  MCØ(Ð0SÜ#¨¸4ÐRWØ-zô |ä"&Ð.EÐPnÐopÐnqÐNrð  yBô  #Cô	Dó DñDùs   ‚^1_/Þ4;_/c                 ó‚   — | dj                  | j                  d«      d d «      fD ]  }|t        v sŒ|t        |   fc S  y)Nú.é   )NN)ÚjoinrÖ   ÚBANDS)r   ræ   s     r   Úband_forrí   »   sH   € Ø�C—H‘H˜TŸZ™Z¨›_¨R¨aÐ0Ó1Ð2ò ˆØ”Š:Ø”e˜A‘h�;Òðð r   c                 óH  — |d   \  }}}t        |d   «      }|||dœ|rdnddœ}| d   j                  d«      r|s||d	z  kD  rd
|d<   t        | d   «      \  }}	d}
|	r¥d|	v rdnd}|dk(  r|n|}|	|   \  }}| j                  d«      r"| d   d   dk(  r| d   j                  d«      sd}
n)| d   dk(  r!|r||cxk  r|k  sn t	        |	d   |z  d«      }
|j                  ||||g¬«       |s|r|||
z  cxk  xr |k  nc |d<   |
|d<   | j                  d«      xs i }d|d   i}|j                  d«      rt        d�d d!i|d   ¤d"d#i¤Ž|d<   n1|d   }t        d!|d$   d%   |d&   d%   |d$   d'   |d&   d'   d¬(«      |d<   |j                  d)«      rt        |d)   d#¬*«      |d+<   n™|d   }t        d,t	        |d$   d%   |d&   d%   z   d'z  d«      t	        |d$   d-   |d&   d-   z   d'z  d«      t	        |d$   d'   |d&   d'   z   d'z  d«      t	        |d'z  d«      t	        |d'z  d«      t	        |d'z  d«      d.œgd/¬*«      |d+<   g i i }}}| j                  d«      }|�r4|d0   j                  d1g «      }|d0   j                  d2g «      |d3œ}t        |«      D ]q  \  }}|d4   j                  |«      }|d5   j                  |d'k  rd6nd7«      }|j                  t        t        |«      d8k(  rg d9¢|   n|d:||g d;¢d<||d'k  d¬=«	      «       Œs |j                  d>«      rL|d>   }|j                  t        d?d>d |d@   |dA   |dB   gg d;¢dC|d0   j                  dDdE«      v rd/nd#¬F«      «       |d5   j                  dG«      |d5   j                  dH«      ddIœ}n~|d4   j                  «       D ]h  \  }}|j                  «       }|j                  dJ«      sŒ(|j                  t        ||j                  dK«      d%   j                  dL«      d |d d#¬F«      «       Œj t        t        t!        j                  dM| dN   dOz   | d   j#                  dPdO«      z   dOz   | dQ   z   j                  «       «      «      dEhz
  «      }| j                  dR«      xs | dS   dT   rdUndV}i dW| d   › dX| dN   › �“dY| j                  dYd-«      “dQ| dQ   “dZ| dZ   d d[ “d\|“d| d   “dR|“d]| d]   d^d_| d]   j                  d`«      rdandbdcœ“d5|“d|“dd|j                  de«      |j                  df«      |rd#nd dgœ“dh|“d0|xs
 di|d0   d dj i“dk|rdldmind “dn|do   |dp   |dq   |dr   |ds   |dt   |du   |dv   |dw   dxœ	“d|d   rdy| d]   dzk(  rd{nd|i|d   ¥nd “d}|d}   “|xs d t        |dv   hd~hz
  |d   rdhn	t        «       z  |ds   rd€hnd�hz  «      i | d   ¥d‚| dƒ   j#                  t$        j&                  j)                  d„«      d„«      d…œ¥| dS   | j                  d†d‡«      d dˆœd‰dŠ|› �ig d‹œ¥}t+        j,                  |«      |dŒ<   |S )ŽNÚsize_xyzÚrig)ÚwÚlÚhzpending-browserÚmeasured)Ú
measured_mr‰   r   zvehicle.g333333ó?z-wider than long: the front is probably not +ZÚfront_suspectg      ð?ÚlengthÚheightrŠ   r‘   r‹   r}   zvehicle.kartgffffffþ?r�   r�   Útypicalé   )Ú
class_bandÚ	band_axisÚbandÚin_bandÚscale_to_classr™   ÚgeometryÚboundsÚ	footprintr…   Úrectr‰   ÚauthoredÚminr   Úmaxrê   )r…   ÚminXÚmaxXÚminZÚmaxZr‰   Ú	collision)Úpartsr‰   ÚcolliderÚboxr¬   )ÚtypeÚxÚyÚzÚhxÚhyÚhzÚguessedÚnodesÚwheelsÚbody)r  r  Únode_posÚsizeÚfrontRÚrearRé   )Úwheel_flÚwheel_frÚwheel_rlÚwheel_rrÚwheel)r   r   r   r¬   ÚX)	rp   ÚroleÚparentÚposÚrotÚ	spin_axisÚradiusÚsteerr‰   ÚseatÚseat_driverr  r  r  Ú	estimatedÚseatFromr€   )rp   r%  r&  r'  r(  r‰   Ú	wheelbaseÚtrack)r0  r1  r‰   )ÚmuzzleÚsightÚgripÚejectionÚsocketr,  Úhand_Úexhaustr—   Ú
0123456789z
[^a-z0-9]+r�   rt   ré   rp   Ústatusr�   r†   ÚapprovedÚ	candidaterz   rŸ   ÚversionrŽ   i,  Útagsr3   z+YÚmÚweaponz-Z (muzzle)z+Z)ÚcontractÚupÚunitÚfrontÚ	placementr%  r˜   )r%  r˜   r‰   ÚsocketsÚallé<   ÚpaintÚencodingzCOLOR_0 region ids (garage)ÚrenderÚtrisÚvertsÚ	materialsÚ
draw_callsÚtexturesÚgpu_mb_decodedÚbytesÚcodecÚ
extensions)	rL  rM  rN  rO  rP  rQ  rR  rS  rT  Úskeletonrµ   ÚualÚownÚ
animationsÚnoneÚskinnedÚtexturedzflat-colourz
2026-10-07r   ú~)ÚimportedÚfile_originÚgatesÚlegacy)r_  ÚjudgeÚglbzsha256:)ÚgameplayÚ
techniquesr‘   r�   ÚqualityÚfilesÚdepsÚrelease© )ÚboolrÇ   rí   r   ÚroundÚupdaterÈ   Ú	enumerateÚappendÚlenrÆ   r×   rÖ   ÚrstriprÌ   Úsetrm   rÐ   r   r   Ú
expanduserÚcardlibÚrelease_hash) Úsr?  ró   rñ   ÚhtÚlnrZ  r  rß   rý   ÚscaleÚaxisÚvalÚloÚhir   r  ÚbrF  r  rc  ÚgÚwnÚirå   r'  ÚrÚsträ   r>  r:  Úcards                                    r   Ú
build_cardr„  Â   s(  € Ø�*‘�I€A€rˆ2Ü�1�U‘8‹n€GØ !¨°Ñ4ÑU\Ñ@QÐblÑm€DØˆ�y×Ñ˜JÔ'±¸AÀÀSÁºLØ Oˆˆ_ÑÜ˜˜6™Ó#�I€CˆØ€EÙØ# tÑ+‰x°ˆØ˜HÒ$‰b¨"ˆØ�d‘‰ˆˆBà�5‰5�Œ?˜q ™¨xÑ8¸HÒDÈQÈvÉY×MaÑMaÐbpÔMqØ‰EØˆw‰Z˜5Ò ¡S°"¸´/¸r´/Ü˜$˜y™/¨CÑ/°Ó3ˆEØ�‰˜s¨d¸"¸b¸ˆÔBÙ™3Ø  C¨%¡KÖ5°2Ô5ˆD�‰OØ"€DÐ	ÑØ	�‰ˆg‹Ò˜"€AØ˜!˜H™+Ð&€FØ‡u�uˆ[ÔÜ"ÑT¨ÐT°!°K±.ÑTÈÒTˆˆ{Òàˆh‰KˆÜ"¨°Q°u±X¸a±[ÀqÈÁxÐPQÁ{ÐYZÐ[`ÑYaÐbcÑYdÐklÐmrÑksÐtuÑkvð  @Jô  Kˆˆ{ÑØ‡u�uˆ[ÔÜ!¨¨+©¸zÔJˆˆzÒàˆh‰KˆÜ!°%¼eÀQÀuÁXÈaÁ[ÐSTÐUZÑS[Ð\]ÑS^ÑE^ÐbcÑDcÐefÓ>gÜ/4°a¸±h¸q±kÀAÀeÁHÈQÁKÑ6OÐSTÑ5TÐVWÓ/XÔ_dÐfgÐhmÑfnÐopÑfqÐtuÐv{Ñt|Ð}~ÑtÑfð  DEñ  fEð  GHó  `IÜ05°a¸!±e¸Q³ÄuÈRÐRSÉVÐUVÓGWÔ_dÐegÐjkÑekÐmnÓ_oñ*qð )rð {DôEˆˆzÑð  " 2 r�HˆU€GØ	�‰ˆh‹€AÚØˆw‰Z�^‰^˜H bÓ)ˆØ˜7™Ÿ™¨°Ó3¸rÑBˆÜ˜r“]ò 	@‰EˆAˆrØ�J‘-×#Ñ# BÓ'ˆCØ�&‘	—‘¨!¨aª%™h°WÓ=ˆAØ�N‰Nœ4Ô\_Ð`bÓ\cÐghÒ\hÒ%UÐVWÒ%XÐnpÐw~Ø')¨sºÐPSÐ\]ÐefÐijÑejÐs}ôõ @ð	@ð
 �5‰5�Œ=Ø�6‘ˆBØ�N‰Nœ4 ]¸ÈÐSUÐVYÑSZÐ\^Ð_bÑ\cÐegÐhkÑelÐRmÒsØ4?À1ÀWÁ:Ç>Á>ÐR\Ð^`ÓCaÑ4a¡yÐgqôsô tà!" 6¡§¡¨{Ó!;ÀaÈÁiÇmÁmÐT[ÓF\ÐhrÑs‰à˜‘}×*Ñ*Ó,ò 	8‰GˆB�Ø—(‘(“*ˆCØ�~‰~ÐkÕlØ—‘œt¨°#·)±)¸C³.ÀÑ2C×2JÑ2JÈ<Ó2XÐaeÐknÐtxØ+5ô 7õ 8ð	8ô
 ”#”b—h‘h˜}¨q°©y¸3©ÀÀ6Á×ARÑARÐSVÐX[ÓA\Ñ/\Ð_bÑ/bÐefÐgmÑenÑ/n×.uÑ.uÓ.wÓxÓyÐ}ð  }Añ  Aó  B€DØ�U‰U�8‹_ÒY¨q°©|¸JÒ/G¡È[€FðØ��6‘�˜1˜Q˜v™Y˜KÐ(ðØ*3°Q·U±U¸9ÀaÓ5HðØJPÐRSÐTZÑR[ðØ]fÐhiÐjsÑhtÐuyÐvyÐhzðà�ðà˜q ™zðà+3°Vðð 	˜a ™j°¸cØ,-¨g©J×,AÑ,AÀ(Ô,K™=ÐQUñWðð
 	�ðð
  ðð
 )4¸a¿e¹eÀF»mÐVW×V[ÑV[Ð\cÓVdÑ~Ñpzð  FJñ  6Kðð 	�7ðð $ UÒ%F¨u°a¸±jÀÀ"°oÐ.Fðð 	Á�*Ð;Ñ<Àtðð 	˜1˜V™9¨q°©zÈÈ+ÉÐfgÐhtÑfuØ  ™}ÀÐBRÑ@SÐ^_Ð`gÑ^hÐstÐu|Ñs}Ø!" <¡ñ2ðð 	ÐYZÐ[`ÒYa�
 Q w¡Z°:Ò%=™EÀ5ÐUÈAÈeÉHÑUÐgkðð 	�a˜‘oðð 4<Ò3C¸tÜ˜a ™j˜\¨V¨HÑ4ÀqÈÂx¸¹ÔUXÓUZÑ[ÐopÐq{Òo|Ð`jÑ_kð  DQð  CRñ  Só  Tð D˜˜<™ð  D°lÐSTÐU[ÑS\×SdÑSdÔeg×elÑel×ewÑewÐx{Óe|ð  Bó  TCò  DØ�Y‘<ØŸU™U 7¨HÓ5ÀÑEØ˜7 1 #˜Ð'°ò#€Dô& ×*Ñ*¨4Ó0€Dˆ�OØ€Kr   c                  ó¸  — t        j                  t        › d�d¬«       i g g }}} t        «       D ]ë  }|j	                  d«      st        d|d   «       Œ$t        |d   «      }|| v r|j                  |d   | |   f«       ŒPt        › d|› d	�}t         j                  j                  |«      st        j                  |d   |«       t        j                  |d   «      }t        |||«      }|d
   | |<   t        j                   t        |«       |j                  |«       Œí t        t#        |«      › dt#        |«      › d�«       |d d D ]  \  }}	t        d|d|	«       Œ y )Nz/store/blobsT)Úexist_okr   zNO PATHr   r�   z/store/blobs/rÄ   rz   z cards, z duplicate files skippedé
   z  dupú=)r   ÚmakedirsÚROOTrç   r   rÏ   r   rn  r   rÚ   ÚshutilÚcopyfilerb  Úmeasurer„  rs  Úwritero  )
ÚseenÚcardsÚdupesru  ró   Údstr?  ÚcÚar}  s
             r   Úmainr•    s@  € Ü‡K�K”4�&˜Ð%°Õ5Ø˜R �ˆ%€DÜ‹Yò ˆØ�u‰u�VŒ}Ü�)˜Q˜v™YÔ'¨Ü��&‘	‹NˆØ�‰9Ø�L‰L˜!˜F™) T¨!¡WÐ-Ô.°Ü��m A 3 dÐ+ˆÜ�w‰w�~‰~˜cÔ"Ü�O‰O˜A˜f™I sÔ+Ü�K‰K˜˜&™	Ó"ˆÜ�q˜!˜QÓˆØ�D‘'ˆˆQ‰Ü�‰”d˜AÔØ�‰�Q�ðô 
ŒS�‹ZˆL˜¤ U£ Ð,DÐ
EÔFØ�c�r�
ò "‰ˆˆ1Üˆg�q˜#˜qÕ!ñ"r   Ú__main__)*Ú__doc__rÍ   r   r   r   rm   r‹  Úsysr   ÚdirnameÚabspathÚ__file__rŠ  Úinsertrë   rb  rƒ  rs  rr  rÕ   rÅ   r   r   rì   r   r   rÉ   rÊ   rË   rÑ   rÓ   rÒ   rÔ   rÎ   rÙ   rr   rw   rç   rí   r„  r•  Ú__name__ri  r   r   ú<module>rž     s_  ðñ÷ 0× /× /Ó /à	‡w�w‡��r—w‘w—‘ r§w¡w§¡°xÓ'@ÓAÓB€Ø ‡�‡���2—7‘7—<‘<  eÓ,Ô -ß à‡W�W×Ñ˜Ó(€Ø	ˆÐÐ€Øˆ�	‰	‘$˜$˜Ð3Ð4Ó5Ó6€ò?ò;ð
rˆ&Ð%ð 
r vÐ/Að 
rÀ=ÐRdð 
rØ
Ð5ð
rØ7@ÐB[ð
rØ]mð  pHð
rà
Ð6ð
rà8GÐIið
ràkpð  sHð
rð Ð+ð
rð .:Ð;Sð
rð VaÐb}ð
rð Ð3ð	
rð 6EÐFeð	
rð hpð  rJð	
rð
 Ð(ð
rð
 +2Ð3Fð
rð
 YmØ5Ð>OÐ_pò
r€òP€ò
x€ò
C€	ð
 2ÐDYð  mKØ3ÐB\ð  oFñG€
òm€	ò 	T€Ø(Ð:SÐe|Ø2ñ	4€à?ÐHuØBñ
D€òò/ò
^DòBòNòb"ð, ˆzÒÙ…Fð r   