@wildshard/shard-format 0.0.1 → 0.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/brasscap-mesa/blobs/bin/02da0052111419cdff3a29f1c6d0ff0d223e0b53a956c16c65ed63d87928b3b9.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/068a121cd780a2a9164416f6e4fde44834f2d2f3a5ed65c174e480b7a2d3f627.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/07d5a061cd338618e528747d61eb2b17709510550ef0ba40a58b67761b200f3f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/086e3706070555baca863f6ecf9dbca09c084afa501d92d4246d896b09546f36.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/08b1b9ab7c732d7dbe8f961f1fc40e84042d1fe42544f55c9ee89f04dffe3d5e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/18bdbdc704cb8aac93435d208dfe0e9a44374efb73afa3bc58c631650e0a2995.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/1a210fcddcb9749ecb1c244837e8e37ea69b038faae191dee6bbbde228d31a18.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/264ab9ede386504a5ff9814b0a620b879cb29f3f45a80bcfc0c80b8ee236e364.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2b6fbea4c846a23cf4802ebdb1804e128896c8dd87e5d23509db6729e5b1be4e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2d755cc635dee90b0f3958272855a821e2dd605a189a5ffcd480a325155fe84f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/2d76c6829fe77fb55cc2541e4aca5ce5d18b68508dcdf3fa957fe4a83b9c887a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/32c15d55a4548501740593807c5007217c72dbc10a21f4613ef5e0cee0b90d1d.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3539b362cf3a61a79e92e113ebf8f255d0b25ec2d2edd816498879de831fa912.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3af38a2377bc89f6c6c82ee1e83df674efa2793db932b50a23bbce7ec9cd7941.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3c176a7a0d0850fdcee790ed2641216fc3d1cba025928de3d7784262bb9b6f4a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/3fb37e488aa81a64c997b3dd09794e988994c6ee3476c6d653ced1670888dd8e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/424dcc7b320317bf3f2c62c8f19bc80564035127eb38ab811e460934d57ea38c.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/45cea35fab6bb06051a3286fca2307944850c7f9ed7aa89b7c24fafef28efda6.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/499cc7863851f97d79dbfc64e76f9e6978894199184a0d80ebdca13066a8fa78.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/4b7217644763b00c6ee6ae3f176c726914966fb791654a385c0638bb998b6dd2.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/4cf11c7177bb082f335e5bc7a037ef00d09355c5ad8263e284a96a92630ff9ae.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/536b37cab5a1edd6a68a71d122aab6898e44c68a5470a4ca8a9a72c57c02e034.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/55d3628b27e0fcea383df86c434a69761439f51a013359f0829675b07ee2b616.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5652ba90fbd8146edaf42660329cc81798752f2f60b8d03956714460d5ba75ef.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/57459ab5e2ac6cec65ef5e59789dd82b9666d8573df41c4a398df603f1fa456f.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5915b6aed21bba49b841b45574f44f60d26b44810bd68ac70b22f3f3b0dab072.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/5c4a5c7a8e99253561105c5fa3faf14326cf0c23adc32bfe7f8aea4dbf4b05f9.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/61822a412cfd461f4f7ae50bc13f242a0fca6c5c58fca72247b596ab037a1c85.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/673b7712908966718341508469b39cd49e6461f690ca3c23d4621ea7eba0cc30.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/69394a49520f84f6dccc1655f1c89eedc913ac53a7e48ac5dc1bff4141639bb4.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/6e58a53a6c2acd50f9f80fd270ca034c54421df8a587e181101b4b75b952ac5d.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/75dc9f23ee71e11a3a0c67eb77275d741a281c3398808fb42efd52b9973d5d04.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/76c6a403293a68ed3d6ad14e9dd27b555c3a1ef4a3cae12a2bd2ab3e67c5ad02.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/82b73ce3a18e47092840fc029177861887aa2867b007248ac79ffa20895a4491.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8430d9bbfb4e2b678c54595ad95555c3c73d0e1b144a4d6e29664ccb4371baf0.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/848d4492508689f5c4a224079dca8809e872e33b8f2635c9f16da5dc21beed16.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/84941ac387a0d245ea20bd663ff4ee78c5315bedfa058ada0961765aff61acaf.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/859b7bbcf048a4525db0548b8f5afef83bfc4870914767153f44c05e83436ec5.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/87b68b45680a57c796eed9183211b03335a6ad6737372b3ef476c2cf42efa631.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8cef94308af8d09670e4c99a3b6c3d9280b7a27d386653a3bd7d482b2cdf2b65.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8e564bce3f352c2186ae09ed7fbca9739c10abc46fd5f6893c68cb47178bd2b4.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8f89e79d0fb9b04d48c7b5719e1d024161c6a2119835b18dcb193ff51123a9be.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/8fe511ad48656a0b10801100b9100edab1be605a8a182dc5c834d298bf0d9166.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/900bda6562d06fafda54c495e325d57dbb7931813178ee207449c5519d89d537.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/997b1b7d9210bfa77dc71f16a57c6bd66bc7c648686dc2a2666044c95042978a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a111bb4c6cec536bcf57dddc744b871ac9f3d094ce459c16243adca19020db77.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a2208bf899e6c84942eef9fbab569d597f574551afae5864f1953c6a517af068.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/a302ddb2598a72ece53780094b64ad861dc68e6913d8a1ea08f5d141736e2986.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/afcbc671326d0dac14e460662c1f793335877ba53cc965f67c0306833b087e7c.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/b657159e6a28c801a211024f96a7ef60e388ce928a7b41ae3d7555a6f8fd2e3e.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/be6bbc6cd15ba525790075252ba0ed0b28dae5cfbfa118c00dfb9ea1ab95e668.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/c1360e3cbe6b3dc8894bc66c359853854c2e5adeac9c7cd5ba63f5db448be601.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/c7983018dbf8e384ddf73191f526075bd0b29907061ab17642ecdc18ea7b9897.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/cea66f27ca60ea173ee0a2bcd91964dc2638eb5657250fe3aa5bd3e41faf8730.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d052be571a0f3ab69926951f3a4c9d63f05da2ca6d91e5963dd63e04ecb515de.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d162a993a60dd682c8c21dd111429d84d8d30413a000cf481cf98d06ca83e706.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d238c3d3d054911714ebe30dafc99e6ad13925b7a600ba9f8d532d0f515f3f5a.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/d9a98cfe2865a9bb0e94f35c735a570b0625b58f890a6b1f6e14fab2401f0af2.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/dc27ae954b7b8a13a9459d6ca6ef2997f662715ff5f5453ea0da169f141748b8.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/e3ff1fd41cf76668b8e1927c0c2e4056b63a293ebbd300a8f1b1d27d87786271.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/e45b7344d373b3ef4a94f560cf4e17b1eb3b8cd89d1e552fc9be11d6b7b546f0.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/eb14eb898224d5d81d1012bec54f2b79f9377dc60fa1d01e49b4c3e148292d77.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/ed0e0101a3d91a3a615f9e78ef36f7deb8bb0eab0f133241d621925d0b596599.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/f722e3a3b1f0a3d7b9f7d7c66c46d8c87245de5f8eece055daf95c7086f8c267.bin +0 -0
- package/corpus/brasscap-mesa/blobs/bin/f76013aedfd810f136fa689a151024bcb942687ef42ae7edf1fd3513ac4e22c7.bin +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0547e63693282614673b13bade4c08eb772020757b131b7c80f2077873aab70e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0cf89e9b1824440d213c8e9e33fb357734b7241b4c7eedaba3df7f8306e05425.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0e01060e3a507ffff6461c50b5c565c71380a6a67d9760cdd7a09afd3e30b584.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/0ef326c5cf5292cd15b48b851460ee8156f51e0a5b62457c8f1f3c53c41665a3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1112ff4a3f69db3b62c6d2d6ae021e7c43ce0ca1feb1d3130376881decb3c6b0.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/11357cb8a0670fdc9a03780dd79a31e0aa7a0537786cbf66491bae1722d6feb3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/11dbecc73bd343c375bd4b79db8dbda2272e76a6b8426ac29e90f2b1272ccfc2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/133f639cfa837bc5da7915121c71fd32281660c2aaa0248bd59bde47e7faf8bc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/16812a090136b6678633aa4db03e4187920ae0aca776ad6da373c600cd341972.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/17e63980d7934cfe1d2823d78652af338fe9f0c2170106cd4506a2c4e7f4716f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/199224cafc86904bdefec8f01d131d7ca3e076a22b689bfc6a26dd20373cf286.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1a5c8cf223a2f64715ea5eaf14d97a0131f9ebdef4388dc4823dcfa57817724c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1b0ec09ad6718149d7ca514136cee09b04c96425f03af0559fd097112aa0daa5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1e5024bbb1284b2ed39bbca2d0ade3acb5be2a2c6ba643291f269b76098c7f79.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1e7635972e13468ffcbb1608f1d12559b066b4533912be2c35e3db07fd4a679d.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/1f03db3a38a21b8d4d02f8ede30e1303cd8d4c426815326a88f45a268b17a492.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/2624abb7bf45618be40f8c3221445179fca44f7321baff415fdf7ddd5e0afc6f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/27fc3bad6db6e2b5ade5d242867d882362482ddf19c647edef821afc27d52dc2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/29959bdb5b04a9180e88ec1ed976bae55424d3dc50985f13c0f85bae11ae79ee.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/308cbce2b1b6360f9a2dc275d0bc28be1966fc3ff5e0a58844405ba867f3f668.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3674d7be969755aaffa368e57b8d1bb743bc98e766a57948859d54fdc7d2c066.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3736ca95c9c40b30e21302ae6c89148d8ac09264dfbb7e5764b08c265a73ba3c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3bc90e1dc9411d249697e4ec352baa4886f91cacfe4940ac43aed879f60966c9.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/3f519c7c7482307cae908b27602dcb7716e2da4b651eff39c4c37103998d18fa.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4767636d5554b60c94b447b87b77fc1456a2b9af42bfe08585389d27f306dd5e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4a3242773b3a73a73ee746a0cdf30c8d6d904bb4406dfdf9822dcd535d6ae308.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4c7bf3788cba151442d85c3f76553c2e356edf8566ae8243d0a535c9bcde51d0.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4f3b9f4c818ed6d375947e9603dd058c539e14ff05aa193fb5054d899dbb82a2.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/4fdf7ee67d12de1cd30c3c2bbd9409032dcab5feb3a7d3977b92c50b1d161afe.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5821f33aa00e9acd2f4c0a29129978ee7006a879d163ce1463ae476031bfabcf.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5a986c3e44fc686a2efe7648c3945bb7b51cf303918381383f21f898dd312cad.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/5c32fc1de6d198ed606d3e8c3264319acdd950dab18e8b723fc6332bf2f56aea.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/602ce4e8b00a0afbc1a894b65641e48d362ec834a559b9d97a4801473bb01da7.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6180f9f96167522d8cab4de1d52598cecee8d7ee042f48e41669c98cf61c19c3.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6205973ba63f7a554662ba05010d25131bed2d9656de422e2067ca54709d5b3c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/693e556f2165232e8a38b1b2d68676f235ece5705c564992cfa7731426f4d376.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6a46175438bec5527c281b577bd220b6badedf3c74266b997d39e596f83b8853.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6ca1bcad7ea053a259b7f9fc5a7ec388a4cd29d44391d93386ea8b1143d94c21.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6f9bc99656b611890d6acc76ee416f6222ca2d5f62167840b4216a21e020a4c8.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/6fb1e7857996662233ab5314fc13f8aa30703f91c04542e352ec17f9dc4fc054.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7028ec39712143a7e9d09d2e1477282b654d0470102ca9d272ac82b23604cb21.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/73af65ac86efa61099178f3e7075dcd26d389ee9b9aa3546c18dede10c3dfda1.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/73b992b71bd3165ff7701ab1430c075cb5ba9b74e6363d24640377b1011ddc93.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7471261d4df59979ba41a622d93779b66ebecd50353ad433862e603ee65f8748.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/76e9a3fcca962c2f900cf79dc1a0851840bd405dc11231f629f784adbcb69d23.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/79d2d29e8cd8b642386b5f31429b39bc4d6f13e53107dda00ebc463abf80c79d.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/7de66fcfffe4ff108510cbe6bebec44e28ab4b78e98e9c1a38466db5b81881f7.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/811fa798cb81ea99488db98e3d3ddea815aac8f6e7493ad04d0176f603978678.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/89b277f1636be220ff5658ff1f1c62efe14079d6e1f42efb373fbf0246801533.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/905c5fe666d9f6174e987382e47d3f325c5696cf8792d7a4a1dd120a438b8270.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/90efe3e05370ee853c0130b98ee82f00b86f7c7104e96b094715187fa49ac16f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/968a7c5cb13014bce00a29d43b344bd6943ff00ae2908abbc6b40a994f1172a1.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9a955b4e69dfa5b38f071099053c1a3684cf85ec2d346420de2853c61768f8cc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9da2781216a2e482dd8a6ada5ebb43bcf48e0169430e787ac277559cb2ade19a.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/9db02aab14a3b52463deadefbf4ba771809941e7fcb137c905955bdc80ec23bd.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a3fe1788cf5d7f260249c722f0e0695a4d55744d1b14be44122377147a296256.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a5c75af8f090d3c95fa46d2be49be5031138d7cd1bae234ae028edf717bf299e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a771abd40bd337a464c1bd19f841b62e290124faa89b19ec50e85ab36bc740a5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/a94a2ad2ed463a47cdda117df25b06b3cf6be37ddac08594bc5f5d76c7237730.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ad434e4a6490e495994b25f7574a5847a9f7d9c2ca5a2b229a9dfdd2e5e2bb72.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/aeae7b05404b852008a7897689e58aacef44a2c3bc0e87d2519ecdb4cb1e3ff5.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b0c0c8a4985f92be3b358a8e703c67957427501882aeee05b4ccd3c7880930d4.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b25174c3cd13eea6e1d9c3104ee5197dc6330129b2f0f7676e8a429900999d9b.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b3eecdec571df96338edf690443394ff859383b4c94f4cf33d42c240006f8543.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b7aa0c61ff9e7411535c7b7b8e587849a92bad00d431171ab16ad47d55db0a53.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/b9deef944c22331bc05220d1d6e46412e3cb1246ef041a4405d0cbbd90c2d624.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ba9376e4ac39b809133ab717edb4c88b5219118766db492d7c97534ce119c2ec.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/baf338e9c272158b905fb58a712e29410c657a45be2764f1c6c43ca87fd1db48.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/bd442ac9fbe52b9f2e4ba586670017c3f2d9fedf1cbdec77ef24e9f8b3a183c8.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/c142adcf253be43b66f23ede8cea1e8fcfa256ebf53054a1068ace04745718a6.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/c6d7cbdc4b2ee9d416edf4d736a4f374f08aea98ca395ad371a50a1853744cfc.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/cfb165a7675d15cee2c490b31095a58f73bace50ccc1e0fdf2c8dc4400f1df27.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d40f2ee59612473e9f687f17a0e203fdb4ba54c7185b05a8d81a433b04f24134.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d50ce95411156a6b6cf386aefa5ee58db659811813f74be74f323e7c5795056f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/d6af418bbde39b4fc7d22a61401d416be7a3fc1214ea2d3f42b4549c392d22ca.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/de7222ceeb1f72693dfb7fd1f343798659e03772d77f2b498fd8ebece2d5550a.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/e26975b198127ac3b6b4f5c4bc08ad47d6691398feee777743285391cd36d502.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ea428490cd5f2672676a2776a598b819b08246871e76de94b7196f9643144986.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/eb96567a266d24be188cb5b08021112f2fad311cbead939d53c5565da11f6265.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ecf66230bf7b68050c0827c2e4caf3de90e46859d291b794faa0dd3816d9dac6.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ed8f067763a4a8adb83d80c8324b2a9668f1061f5f5352f21295e6cc5132386f.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/ee507a38772865467736d370791fe73c6aa4d83fe3e7ff4baa156b9cb2894c1c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/eedc5b62dc6f27d4a089e9f5b282f626129236d3f1689b001e04f8748bf8859c.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f4119b9c6c23435619682b5d247743459e76584b9b0d6c5cb689d8e156906695.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f576047267a0bf9bd4bfc47072ea3d11066345b839953546292da678d1cb4722.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/f8cdfb11997d4ccabea88bcdd3924cc8b621b33618b18fe5fbfd286edfc1d87e.glb +0 -0
- package/corpus/brasscap-mesa/blobs/glb/fce95ecc5db24c903bd46f338e366e2715411465a5efac180e2f0f46397e59de.glb +0 -0
- package/corpus/brasscap-mesa/blobs/image/0579557f9344df6f2c4b1225e6252e53ab86d417a4c9b504b5c714a08a388e47.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/image/9e18816a2ec16fbbb1f00f4a39c73ac2cbf6a8cdc17b4c96b1eba4cc9a754dc7.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/image/eb453c71cfb1f9441eb00b32281f98e226e49d9dcf75c231455575fcdc652222.jpg +0 -0
- package/corpus/brasscap-mesa/blobs/json/e0072ed82115c519b891f53a194ea3b28fff7d3826d8ddf23460d6f21b7728d9.json +1 -0
- package/corpus/brasscap-mesa/blobs/json/ffb0e08eaaa7188db1f55931c9b6330937316091cc7463ed2eff6767bbfa33de.json +1 -0
- package/corpus/brasscap-mesa/blobs/wasm/1d6ace79610c4d510b60ad0c52915e42b57797d91f1ef292f60d8a3daec03dd6.wasm +0 -0
- package/corpus/brasscap-mesa/blobs/wasm/24a4d4c1292677b1c984b5c0d3497ae2929528bf511df475f80cc20945bb08ec.wasm +0 -0
- package/corpus/brasscap-mesa/blobs/wasm/b86d8afcc269fb063ebf64768fc3787635b65a7409a571115b07be2e4da39733.wasm +0 -0
- package/corpus/brasscap-mesa/cook.json +1 -0
- package/corpus/brasscap-mesa/mounts/shardfiles/brasscap-mesa/discovery.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/creatures.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/crowds.json +1 -0
- package/corpus/brasscap-mesa/sections/actors/species.json +1 -0
- package/corpus/brasscap-mesa/sections/audio/audio.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/encounters.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/items.json +1 -0
- package/corpus/brasscap-mesa/sections/combat/strikes.json +1 -0
- package/corpus/brasscap-mesa/sections/economy/ledger.json +1 -0
- package/corpus/brasscap-mesa/sections/economy/loot.json +1 -0
- package/corpus/brasscap-mesa/sections/look/look.json +1 -0
- package/corpus/brasscap-mesa/sections/look/materials.json +1 -0
- package/corpus/brasscap-mesa/sections/quests/quests.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/client-scripts.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/hooks.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/plumbing.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/scripts.json +1 -0
- package/corpus/brasscap-mesa/sections/sim/sim.json +1 -0
- package/corpus/brasscap-mesa/sections/state/migrations.json +1 -0
- package/corpus/brasscap-mesa/sections/state/state.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/card.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/compendium.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/level.json +1 -0
- package/corpus/brasscap-mesa/sections/ui/ui.json +1 -0
- package/corpus/brasscap-mesa/sections/world/collision.json +1 -0
- package/corpus/brasscap-mesa/sections/world/days.json +1 -0
- package/corpus/brasscap-mesa/sections/world/edge.json +1 -0
- package/corpus/brasscap-mesa/sections/world/movers.json +1 -0
- package/corpus/brasscap-mesa/sections/world/navigation.json +1 -0
- package/corpus/brasscap-mesa/sections/world/props.json +1 -0
- package/corpus/brasscap-mesa/sections/world/spawn.json +1 -0
- package/corpus/brasscap-mesa/sections/world/terrain.json +1 -0
- package/corpus/brasscap-mesa/sections/world/tiles.json +1 -0
- package/corpus/brasscap-mesa/sections/world/traversal.json +1 -0
- package/corpus/brasscap-mesa/sections/world/water.json +1 -0
- package/corpus/brasscap-mesa/sections/world/weather.json +1 -0
- package/corpus/brasscap-mesa/shard.json +1 -0
- package/corpus/brasscap-mesa/validation.json +1 -0
- package/corpus/handwritten/blobs/bin/027822f6ae9c374ce1ced851f2227cb9acb03077e5cc6b7fecb245c31f021abd.bin +0 -0
- package/corpus/handwritten/blobs/bin/0377ce182bd604bcf4d501f14bf954c434ea64ad856ad9d71c502d1045612703.bin +0 -0
- package/corpus/handwritten/blobs/bin/05ad93d239eeeb5d9afa09b00d90c56098d88e8850e5b5e691fcaa7520dec3cd.bin +0 -0
- package/corpus/handwritten/blobs/bin/0c8980141e6e394ea473df1eb11c347ba617a1a9a4b39b3fa1871b5d15b97d87.bin +0 -0
- package/corpus/handwritten/blobs/bin/14eb11f8d809320e0a68b1edea7837d7a5b4a3da71f1ce4f54068e0afe0b039b.bin +0 -0
- package/corpus/handwritten/blobs/bin/16590066c039ac71e5038a9866a53ccb95e21af13db29cb655b379c4fcfef7bb.bin +0 -0
- package/corpus/handwritten/blobs/bin/1795b5147ad52482445d2414ee22823b947c43a917b6e96fd9ec017f17000912.bin +0 -0
- package/corpus/handwritten/blobs/bin/18f2e24ecc1ed1b1d12ae1c89732a5a1a618ab6e973d4ff0332cf9ecc4e4f4a6.bin +0 -0
- package/corpus/handwritten/blobs/bin/1a18ade01095f1a9ebe75650127861ef27dda0bb17c2b91bde057ec88ef2e98a.bin +0 -0
- package/corpus/handwritten/blobs/bin/1dba017cddb874bc147efb00c55418846ffa344a696f4df702bbabeea55034d0.bin +0 -0
- package/corpus/handwritten/blobs/bin/248c703537e4687ddd2b69a40d1ef3936da718626289d6867ce0a6866f562ba4.bin +0 -0
- package/corpus/handwritten/blobs/bin/2612d9fd4727f8c349f2dbfb7b1650bb7a752d0798a4966ac22cf2b6cdd9fcef.bin +0 -0
- package/corpus/handwritten/blobs/bin/28c54c766e90e3b046a2377b9fa015b0ce45cf3da4420f2b10553251f86c06aa.bin +0 -0
- package/corpus/handwritten/blobs/bin/30866b4807b12579f50218f6525c3db00919fbd43c97921daf47b3244b25dca6.bin +0 -0
- package/corpus/handwritten/blobs/bin/3d14fae85d77406a9b8c59f2e973cdae9587d49108ea92fb460679ca860196b8.bin +0 -0
- package/corpus/handwritten/blobs/bin/3f2201a53c441abcfb52089fe9bbb01f26fac8744099d3fb6668452885c2fa11.bin +0 -0
- package/corpus/handwritten/blobs/bin/42f270a99367fc4cc901518ccaa344ab595e265f113be944510da745c11f69d1.bin +0 -0
- package/corpus/handwritten/blobs/bin/43fd4327fedd51a586684ac611bcad4a8b9d62e51e03967de71fb42c9bf0f6e1.bin +0 -0
- package/corpus/handwritten/blobs/bin/484adda0898a881b6f095dad447f6a619bf0933f65efe940b72f1ab7f3630c22.bin +0 -0
- package/corpus/handwritten/blobs/bin/4a38cd49e8797429ce76265c3d8972195d5b0a02a35fc05fc513eab11240f415.bin +0 -0
- package/corpus/handwritten/blobs/bin/4fe636237bbbd4f836b0816bc61702f4c224d4cb91fbd94f244c731e24a1b945.bin +0 -0
- package/corpus/handwritten/blobs/bin/51b1cff782dc7ebb382bc429ee965023d4cdb52c7b3e37d6ffff5ef55c1c2813.bin +0 -0
- package/corpus/handwritten/blobs/bin/52561f02071ecaa98432fab5e8ece407a8e8f733a01f8eb7c543d1efe02614da.bin +0 -0
- package/corpus/handwritten/blobs/bin/556d6333923afea9641c4738741a41d6a46ae28a508288b9a49a749a344c1398.bin +0 -0
- package/corpus/handwritten/blobs/bin/5caeb97f32c7f31e1029eebdf31131f879f781bb5e3a225206a646710d83fd75.bin +0 -0
- package/corpus/handwritten/blobs/bin/5d1131e42a045083225105b640ff72e02c7f353ee6285545ac264d01bea26b1b.bin +0 -0
- package/corpus/handwritten/blobs/bin/5d80b30eee9f8342a92f6756fd0d84fb9d2d2ce994d222627641e584ad45d2a8.bin +0 -0
- package/corpus/handwritten/blobs/bin/5e0f9f7f2a85abe11a0a61ede853c9b9942b4494c3eb9943785cf6ae221e40e3.bin +0 -0
- package/corpus/handwritten/blobs/bin/5fdc5485343bba8201185c9bae862ad8618498ab5ce63b53514e4e0226fa7bdb.bin +0 -0
- package/corpus/handwritten/blobs/bin/6623dcb0b31c9ca0be342f6dca6b9e607ec3c12ff82068fa6030c142c2df77f7.bin +0 -0
- package/corpus/handwritten/blobs/bin/6887131a04175edbd1989aa95e8749d1703e7f2d0b8464e85f6bad28d6964125.bin +0 -0
- package/corpus/handwritten/blobs/bin/6cf89771d998486cad9049e6f4fc177d742a18ad79fafa4596814ff9d3cf1952.bin +0 -0
- package/corpus/handwritten/blobs/bin/74bbb0fc219e8476cd5550014a357ee18abc981ff3fe787ae3e60d4593705ec5.bin +0 -0
- package/corpus/handwritten/blobs/bin/76784a7f519ac43ce113a0c9365881839b75f66f96aa009fe8d3c8ab539ef283.bin +0 -0
- package/corpus/handwritten/blobs/bin/79a2f693ee2da546bb551f8b641b9c3affd2b8bfb5632ed7f417daba9d900af9.bin +0 -0
- package/corpus/handwritten/blobs/bin/7b593b0f9eefb957fb9d58b316d9836971203038d7c8127284bba44ccb3090bb.bin +0 -0
- package/corpus/handwritten/blobs/bin/7bb8e518ca5606de78972a6c648b57623f8bc12d7e06b4bbf43c60ac419a9bbd.bin +0 -0
- package/corpus/handwritten/blobs/bin/7c6133f3350147257fa501f41269cb77cb11d8ed96d351e873333b079cee524a.bin +0 -0
- package/corpus/handwritten/blobs/bin/7f5acf1893828995256f5b2c54948f80ba21e53de72db26ea72ce2479f5b0682.bin +0 -0
- package/corpus/handwritten/blobs/bin/836516253cf0f3e6e79537609fdbe6331c8c5c974f9ec4d3fbe4a7db48cf123d.bin +0 -0
- package/corpus/handwritten/blobs/bin/89900344f82d5c1474d2a163f8d29903447bac64e9c9775123ef499be70c2380.bin +0 -0
- package/corpus/handwritten/blobs/bin/95d76a9273c3edd98b3643c54e2e7989800bdcaf6f815230ef09f601e760330f.bin +0 -0
- package/corpus/handwritten/blobs/bin/a7b5a5fe053a38c93eed899bde5051cddd80e0a3f3c82b6fd814869097f0944b.bin +0 -0
- package/corpus/handwritten/blobs/bin/b29be84df0bfd1bc97a1464fd5ea068130947bfed3328e167640c81326eb45d7.bin +0 -0
- package/corpus/handwritten/blobs/bin/b6518dc352be03332a256f1cd9d1149da262fe6829e87ba43364f19c687ca7c9.bin +0 -0
- package/corpus/handwritten/blobs/bin/b7edb8095beeb158adb61ae3caa1653773757afbcd8fb2764c94b975a43fe9e2.bin +0 -0
- package/corpus/handwritten/blobs/bin/b86d617ae7fa397df51ff7af87cd89fa113ac19abd3840ea8f3a086d6c82905c.bin +0 -0
- package/corpus/handwritten/blobs/bin/bb860b5c67ee7f2fafd67588822152228d6f6c9de1231123eeafa4844732b18b.bin +0 -0
- package/corpus/handwritten/blobs/bin/bf8c3971bbb224075d488ffa9cfc20e322c61f9ca0c59c356838415f6778014b.bin +0 -0
- package/corpus/handwritten/blobs/bin/c2edd52ee14ebdc9fcc01d38c15d6ab3379df7a20098c260c546551898959cd1.bin +0 -0
- package/corpus/handwritten/blobs/bin/c3de13c551c5b45270143dcbb9fc9a31651f6012355823c0709c2fe6cafda940.bin +0 -0
- package/corpus/handwritten/blobs/bin/c57a8d9da18b1289afd16de00dd1ec75027048b8dcf7dd218da36bc3276ff035.bin +0 -0
- package/corpus/handwritten/blobs/bin/cc2975c9dea4c31b1bf380623a8f44059423004653f9cae4f603d374174323b7.bin +0 -0
- package/corpus/handwritten/blobs/bin/d476abba2e1c63ad3c7527617559173484ee837a5be2744d968466d5527c286b.bin +0 -0
- package/corpus/handwritten/blobs/bin/db242f89115c878cf0c3b976a1647e9cdeb6a1a51813b1dacaf1188715603294.bin +0 -0
- package/corpus/handwritten/blobs/bin/dcc4b9b3bc4ca777d11c494ae5478f17ad7cf2efa18dcba30def872d55355bc3.bin +0 -0
- package/corpus/handwritten/blobs/bin/dd99da483f385327d6b8319d6e2e9000b580280069353718aa0fda2230707e8b.bin +0 -0
- package/corpus/handwritten/blobs/bin/dfc139dba26f1789e16f72602e654636f2d99bcd41e3f10454da74b3a6a64dda.bin +0 -0
- package/corpus/handwritten/blobs/bin/e15ab3cc9f60657321cfe8d9751e086f025734f4e7068271e0baf6066a686f18.bin +0 -0
- package/corpus/handwritten/blobs/bin/e16a83a71213db6f804ce1d53981a2308062752c85c440022d9eeb7605fd37c8.bin +0 -0
- package/corpus/handwritten/blobs/bin/e7355876487f660ac9f25c9d9dfcd66eaf432e1e1669eb89d12ce8267a8d3e86.bin +0 -0
- package/corpus/handwritten/blobs/bin/e81a632e2da0f6a4d801f18aadfe2c6e640401cc1178935a9099ebb8e3af6cc1.bin +0 -0
- package/corpus/handwritten/blobs/bin/f0721c60d0b1046579d8c587fac8482a70822f0b39a85f9acc0cfc31f82b7dd2.bin +0 -0
- package/corpus/handwritten/blobs/bin/f301cf574de6d84030f839098ca44705dca115f9d3e4ee848e0b35fff3deaf77.bin +0 -0
- package/corpus/handwritten/blobs/bin/f7797f295a7570c437bf7020a1ddf208fea2a7aab595333320a6396c1608d360.bin +0 -0
- package/corpus/handwritten/blobs/glb/08de0bb2439ac812adef528b4b073bdb954bbeada972a2f3afb1757bd0540396.glb +0 -0
- package/corpus/handwritten/blobs/glb/153681171c35d2898569324e21ebe734b8418d4122833618a1e64ea326be1e5e.glb +0 -0
- package/corpus/handwritten/blobs/glb/1df5ce0b6cae72ec4cf3c41510681ba70ebb474f9745d536ebd4f03e8fc82de9.glb +0 -0
- package/corpus/handwritten/blobs/glb/262031e2fa710bd8d586eafce1019ca1434a2170e407567741aac1d99fc9c5ab.glb +0 -0
- package/corpus/handwritten/blobs/glb/27466efb180fb5b5074b40e424bd0b8d78f7ff0f5f3663748e014daeeeb5bedd.glb +0 -0
- package/corpus/handwritten/blobs/glb/2d2f6d00a14c89a4efb7f679b371118f564f258797ed8b8b42baf4ae60902ea6.glb +0 -0
- package/corpus/handwritten/blobs/glb/31f327d215ed7ef422e2169172f3869769e9816c9da979616844081e74f2eb09.glb +0 -0
- package/corpus/handwritten/blobs/glb/3bfe0e9ca18077ffee9c284ef40fed9f2fc354f7495612c785a6f980b5966559.glb +0 -0
- package/corpus/handwritten/blobs/glb/3db43042b3eeb1dee7ce9de1cc00322cefc348aa18c37d168b0858e6af6ca7a4.glb +0 -0
- package/corpus/handwritten/blobs/glb/46460a50da44fb8e792b48a646ec9ce025bb309d315dbcf67d2e9598591750de.glb +0 -0
- package/corpus/handwritten/blobs/glb/4902213556fedaf269fba6f0f195e424b2e49973ab45dcb8b69e34d253d9d8ff.glb +0 -0
- package/corpus/handwritten/blobs/glb/4dda463c9cd4bf339e5611871d4ba2fe16fe1487389a88b2888e96bc55e45d93.glb +0 -0
- package/corpus/handwritten/blobs/glb/4ed23469bd2b6b73183564cfc80a1ebcd0ffe2666a90a556752af0ca147fd2f7.glb +0 -0
- package/corpus/handwritten/blobs/glb/4fe74a1bed6b67129885b90cfcae01b5ca82e23e6d40507e280f02fca7fda54f.glb +0 -0
- package/corpus/handwritten/blobs/glb/50521bb3a50cc7199d324a0b25bc167c2e9d69770cb500490428efefc81ce3ea.glb +0 -0
- package/corpus/handwritten/blobs/glb/5ecca36d1e503edc092af0ef42f139cdcad99b8c2008318eb6ad337023d57296.glb +0 -0
- package/corpus/handwritten/blobs/glb/60fc036925852568cdb1b9fb85218dc43a8bf2ed86d3971a221ad942ece203a7.glb +0 -0
- package/corpus/handwritten/blobs/glb/611633cee0e5822b744486e6dff5414ad5b159eaabffe1c0ba0bb68be794bfa1.glb +0 -0
- package/corpus/handwritten/blobs/glb/67c7f983a0bcb9f84425378acac121a53f30795dce3181643bc1b763d0ae80b5.glb +0 -0
- package/corpus/handwritten/blobs/glb/6ecc0d307030943727484b49b1872643479c55ccc92252fca06e9e3cbe98fa90.glb +0 -0
- package/corpus/handwritten/blobs/glb/774b366df4de56cb6f9e3c904f02ec98016ac2ec489dc9e214b09220fca2f8e5.glb +0 -0
- package/corpus/handwritten/blobs/glb/785bae514ffc029e611d602259db7d37cbef589409a0814b9d37175d8b6c0a45.glb +0 -0
- package/corpus/handwritten/blobs/glb/79e79524efb2830e90af3c945c5b36ef07c1a38f2da2958112203a99eac52a16.glb +0 -0
- package/corpus/handwritten/blobs/glb/7bebdcdaf0be30d9f8d21bde72af68c32d825d12dc668f48109223ed7ff71c9f.glb +0 -0
- package/corpus/handwritten/blobs/glb/7d8b5ec9326a11362b3f9fa3409cb59d11b99f549cc304319c63c1ec55cbf5ab.glb +0 -0
- package/corpus/handwritten/blobs/glb/82e886f826315e4bf962363165fadadd3d93f85132c1909095045e0a7ccc0b34.glb +0 -0
- package/corpus/handwritten/blobs/glb/84b4ef190c3994ae7ca1b1f7a936526d1d20ad7deac13f949e3fe6bb7ba139ed.glb +0 -0
- package/corpus/handwritten/blobs/glb/85b7153e943fbe8c659bd6e4b323511dc6f6e2c7a3a1185e7a9a29ea6ddfdfa6.glb +0 -0
- package/corpus/handwritten/blobs/glb/85cf2d2be91cedbaf454ca42ad53c0c17b311088528d274695dbcea490d6c684.glb +0 -0
- package/corpus/handwritten/blobs/glb/8662b4cdc626c61a45e63f71dc866746c083cd0d4644b817a373105f936a7047.glb +0 -0
- package/corpus/handwritten/blobs/glb/8a4d33bfbb17d865e5deb0a0bdf3de67fc2312950a7568ed2635c22fbe4b1ecf.glb +0 -0
- package/corpus/handwritten/blobs/glb/8b11171d41c9027411ca8b87797d9ec70355471bdd3a247c114c49b8b781bbd9.glb +0 -0
- package/corpus/handwritten/blobs/glb/9026e1c4f0250832b69a989e69fe3071e5cad72adfe9c22ce11c409b18bb3357.glb +0 -0
- package/corpus/handwritten/blobs/glb/945b946f17b6393ea040230641c3083678bb6ab42e1d7239aeb9c950d0e7d5bb.glb +0 -0
- package/corpus/handwritten/blobs/glb/9afab455d603f1f8a38074c5a6cbed26d7d7f2cfd8a531820bd165d4b37399ee.glb +0 -0
- package/corpus/handwritten/blobs/glb/a6d702fb1be1095517625bfb2a2383f5f9638775059fd7e0d093d2044651b848.glb +0 -0
- package/corpus/handwritten/blobs/glb/aae479c2f99848998a1b499bbcad815d971349c2442bc363786aef63baad4337.glb +0 -0
- package/corpus/handwritten/blobs/glb/b155bd41f260d5303e293d691b657e0fb9b9c8b2f8aa589a0187061baa033eb7.glb +0 -0
- package/corpus/handwritten/blobs/glb/b1e8b770d99e8ca4396f21fd512f632c587149fc13db69deba388f702a46982f.glb +0 -0
- package/corpus/handwritten/blobs/glb/b382c318a5baac35da59a7b99ebaad6992e30c4bac327e85851ce0b2f89aa58b.glb +0 -0
- package/corpus/handwritten/blobs/glb/ba4478198696802808262af9bbfc224fe37e24e3f8c13de91debc87d3e1a9d41.glb +0 -0
- package/corpus/handwritten/blobs/glb/baf02cd967d1bf3c6a2ae878f4ca4ed34d0c39302ca2b8b6e3560a4e87b5c16f.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc14dd152815ea6ed39458dcf89f2d69173d61d6e2b57be99d31ce2da64ccf67.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc4e4d3bcf7ace855183efec0fbf242d444a32714d8b2fd8a45fa7b539ef2c73.glb +0 -0
- package/corpus/handwritten/blobs/glb/bc53475e2aa2fc9c2c0574b36a449fd57259c462d771e2b360def5c338d37c26.glb +0 -0
- package/corpus/handwritten/blobs/glb/c35d9e50f392c29f2587e3a6eb4f21143ba08e48d76a53b9de62d3b5be46c1a5.glb +0 -0
- package/corpus/handwritten/blobs/glb/c6911e059d3ac6aea75bc0ad3dd8b220704bfbba8ba98b57705e7aa3ecbe0050.glb +0 -0
- package/corpus/handwritten/blobs/glb/c84d88b6ed878490bcf9fa985b5e6a7a683de8ee7808ee4151a3b6a898fbe4f2.glb +0 -0
- package/corpus/handwritten/blobs/glb/c9d5d02ef0e38ac2898d3e6ecbc2ea0a6d2bd04531118550ab54b5e83293d7ec.glb +0 -0
- package/corpus/handwritten/blobs/glb/cd9d04e361e4c3d0aeb82f8682d71114ff8318b8fc4980bccee3c5e5c16afc27.glb +0 -0
- package/corpus/handwritten/blobs/glb/d32499928422a0cd1a32b1afaeacc31d2d84d74876f6805b36218dc04402a921.glb +0 -0
- package/corpus/handwritten/blobs/glb/dc7ea629fcddeba445599d73a5d721f4d5004e056c3c140baa3e6817393c6462.glb +0 -0
- package/corpus/handwritten/blobs/glb/dce79b59c85ca5a7f9fc25e585d253b15558f8f5d8497a76923c9071601de8b1.glb +0 -0
- package/corpus/handwritten/blobs/glb/e7fa1b02bae6c8d19ace0e8db44810beab9a1be9f8172d5816324760267d6d11.glb +0 -0
- package/corpus/handwritten/blobs/glb/eb664feed0fdcc3ac73cecbe737109994fe5dfad8a33997de88598965fa936ba.glb +0 -0
- package/corpus/handwritten/blobs/glb/ec6a771ca852b0b69e55a12df9d347384d01e611c8c6151ea771910f1601605d.glb +0 -0
- package/corpus/handwritten/blobs/glb/ede05013f575b4216d2b4b3f8a14d611ef28756f952f702bb169529c8ab02eff.glb +0 -0
- package/corpus/handwritten/blobs/glb/fec21fa96950340a1a031b31b37407468361ab0a7645c683e0d7773c18591a26.glb +0 -0
- package/corpus/handwritten/blobs/glb/ff21ea082bb00b01006900e7dbbb85220f31f45c144405c840a70872f9e09cb9.glb +0 -0
- package/corpus/handwritten/blobs/image/248fe9601e921305ffb35421414bc5f03e9f1b3dba15bf9b5c3387d8f255da17.png +0 -0
- package/corpus/handwritten/blobs/image/4b47420aff1ded28c9c6cf1eb92d6e2d7b01d057f2654654405445ff8d562e55.webp +0 -0
- package/corpus/handwritten/blobs/image/5dbc818ed0be692e6ba3df87898fd623280a2686eed5a538333e1325764b238d.png +0 -0
- package/corpus/handwritten/blobs/image/d5ae692911bbc2b60b5fdde239b70aad4ce9be0d7665c4a91b438de6077e21e3.jpg +0 -0
- package/corpus/handwritten/blobs/ktx2/df0dd2e8adc1d9479148bb198cb750471df454680cf0c9ffd6dc85d6262ed676.ktx2 +0 -0
- package/corpus/handwritten/blobs/wasm/ecc886d8bbebcf190298ff9162b6bb364f2125606f5bdc8cc220ea28044f96ea.wasm +0 -0
- package/corpus/handwritten/cook.json +1 -0
- package/corpus/handwritten/mounts/shardfiles/blender-template/discovery.json +1 -0
- package/corpus/handwritten/sections/actors/creatures.json +1 -0
- package/corpus/handwritten/sections/actors/crowds.json +1 -0
- package/corpus/handwritten/sections/actors/species.json +1 -0
- package/corpus/handwritten/sections/audio/audio.json +1 -0
- package/corpus/handwritten/sections/client/plan.json +1 -0
- package/corpus/handwritten/sections/combat/encounters.json +1 -0
- package/corpus/handwritten/sections/combat/items.json +1 -0
- package/corpus/handwritten/sections/combat/strikes.json +1 -0
- package/corpus/handwritten/sections/economy/ledger.json +1 -0
- package/corpus/handwritten/sections/economy/loot.json +1 -0
- package/corpus/handwritten/sections/look/look.json +1 -0
- package/corpus/handwritten/sections/look/map.json +1 -0
- package/corpus/handwritten/sections/look/materials.json +1 -0
- package/corpus/handwritten/sections/quests/quests.json +1 -0
- package/corpus/handwritten/sections/sim/client-scripts.json +1 -0
- package/corpus/handwritten/sections/sim/hooks.json +1 -0
- package/corpus/handwritten/sections/sim/plumbing.json +1 -0
- package/corpus/handwritten/sections/sim/sim.json +1 -0
- package/corpus/handwritten/sections/state/migrations.json +1 -0
- package/corpus/handwritten/sections/state/state.json +1 -0
- package/corpus/handwritten/sections/ui/card.json +1 -0
- package/corpus/handwritten/sections/ui/compendium.json +1 -0
- package/corpus/handwritten/sections/ui/level.json +1 -0
- package/corpus/handwritten/sections/ui/ui.json +1 -0
- package/corpus/handwritten/sections/world/collision.json +1 -0
- package/corpus/handwritten/sections/world/days.json +1 -0
- package/corpus/handwritten/sections/world/edge.json +1 -0
- package/corpus/handwritten/sections/world/movers.json +1 -0
- package/corpus/handwritten/sections/world/navigation.json +1 -0
- package/corpus/handwritten/sections/world/props.json +1 -0
- package/corpus/handwritten/sections/world/spawn.json +1 -0
- package/corpus/handwritten/sections/world/terrain.json +1 -0
- package/corpus/handwritten/sections/world/tiles.json +1 -0
- package/corpus/handwritten/sections/world/traversal.json +1 -0
- package/corpus/handwritten/sections/world/water.json +1 -0
- package/corpus/handwritten/sections/world/weather.json +1 -0
- package/corpus/handwritten/shard.json +1 -0
- package/corpus/handwritten/validation.json +1 -0
- package/package.json +504 -2
- package/packages/wire/src/net-command.ts +150 -0
- package/src/cli/bin.mjs +9 -0
- package/src/cli/main.ts +148 -0
- package/src/cli/pack.ts +262 -0
- package/src/cli/validate.ts +210 -0
- package/src/cli/version.ts +13 -0
- package/src/format/aacIndex.ts +160 -0
- package/src/format/accent.ts +35 -0
- package/src/format/achievementCounters.ts +22 -0
- package/src/format/actorMoves.ts +615 -0
- package/src/format/actorProjectionV2.ts +93 -0
- package/src/format/admissionControl.ts +66 -0
- package/src/format/admissionLate.ts +22 -0
- package/src/format/admissionLimits.ts +11 -0
- package/src/format/admissionServer.ts +30 -0
- package/src/format/ambientLife.ts +123 -0
- package/src/format/arenaRoomDocument.ts +114 -0
- package/src/format/arenaScriptRows.ts +107 -0
- package/src/format/arenaView.ts +30 -0
- package/src/format/assetAdmission.ts +279 -0
- package/src/format/audio-measure.ts +184 -0
- package/src/format/audio-mp4.ts +234 -0
- package/src/format/audio-rules.ts +271 -0
- package/src/format/audio-waiver.ts +55 -0
- package/src/format/audio.ts +463 -0
- package/src/format/audioBank.ts +37 -0
- package/src/format/audioProfiles.ts +501 -0
- package/src/format/audioRouting.ts +67 -0
- package/src/format/audioScene.ts +342 -0
- package/src/format/bakedTerrainBytes.ts +35 -0
- package/src/format/bakedTerrainSampling.ts +66 -0
- package/src/format/bakedTiles.ts +407 -0
- package/src/format/binarySource.ts +32 -0
- package/src/format/bodySlots.ts +90 -0
- package/src/format/bossEncounter.ts +354 -0
- package/src/format/bossProfiles.ts +709 -0
- package/src/format/bossSocketRig.ts +92 -0
- package/src/format/bowVariantRows.ts +68 -0
- package/src/format/brains.ts +252 -0
- package/src/format/budget.ts +214 -0
- package/src/format/buildings.ts +496 -0
- package/src/format/builtIndexes.ts +26 -0
- package/src/format/catalogueEconomy.ts +65 -0
- package/src/format/caveInterior.ts +225 -0
- package/src/format/cellBounds.ts +47 -0
- package/src/format/cellField.ts +98 -0
- package/src/format/chapterDirector.ts +193 -0
- package/src/format/clientChannels.ts +450 -0
- package/src/format/clientCues.ts +34 -0
- package/src/format/clientNative.ts +358 -0
- package/src/format/clientOwnership.ts +43 -0
- package/src/format/clientPlan.ts +306 -0
- package/src/format/clientScripts.ts +116 -0
- package/src/format/clientState.ts +273 -0
- package/src/format/clientTrails.ts +56 -0
- package/src/format/collectionDisplay.ts +232 -0
- package/src/format/colourFunction.ts +44 -0
- package/src/format/colourLut.ts +4 -0
- package/src/format/commonsCosts.ts +28 -0
- package/src/format/compendiumRows.ts +151 -0
- package/src/format/compendiumSketches.ts +23 -0
- package/src/format/completion.ts +83 -0
- package/src/format/contentBounds.ts +76 -0
- package/src/format/contentCost.ts +50 -0
- package/src/format/contracts.ts +305 -0
- package/src/format/cook-data.ts +148 -0
- package/src/format/cook-preparation.ts +241 -0
- package/src/format/coverAppearance.ts +53 -0
- package/src/format/creatures.ts +175 -0
- package/src/format/crowdPresentation.ts +87 -0
- package/src/format/crowds.ts +46 -0
- package/src/format/cueDirector.ts +134 -0
- package/src/format/dayCycle.ts +28 -0
- package/src/format/dayLook.ts +44 -0
- package/src/format/decisionBindings.ts +80 -0
- package/src/format/decisionPublication.ts +35 -0
- package/src/format/decisionScripts.ts +327 -0
- package/src/format/declaredQuestPage.ts +101 -0
- package/src/format/deviceMemoryCost.ts +50 -0
- package/src/format/director.ts +52 -0
- package/src/format/directorProduct.ts +27 -0
- package/src/format/directorStages.ts +165 -0
- package/src/format/directorWhen.ts +78 -0
- package/src/format/discoveryValues.ts +416 -0
- package/src/format/easedFields.ts +48 -0
- package/src/format/edgeProfiles.ts +40 -0
- package/src/format/eliteContinuation.ts +110 -0
- package/src/format/eliteEntryRows.ts +351 -0
- package/src/format/eliteFeature.ts +605 -0
- package/src/format/eliteScripts.ts +60 -0
- package/src/format/encounterRows.ts +1030 -0
- package/src/format/encounters.ts +65 -0
- package/src/format/engine-music.ts +42 -0
- package/src/format/entryClearance.ts +86 -0
- package/src/format/entryCoverage.ts +61 -0
- package/src/format/entryGeometry.ts +56 -0
- package/src/format/entryLanding.ts +83 -0
- package/src/format/entryReads.ts +45 -0
- package/src/format/entrywayAssets.ts +33 -0
- package/src/format/entryways.ts +58 -0
- package/src/format/exchange.ts +25 -0
- package/src/format/explorerCatalogue.ts +312 -0
- package/src/format/feature-sides.ts +233 -0
- package/src/format/fieldPresentation.ts +62 -0
- package/src/format/figures.ts +437 -0
- package/src/format/findsCatalogue.ts +67 -0
- package/src/format/fixedDraws.ts +24 -0
- package/src/format/flyers.ts +226 -0
- package/src/format/forestNativeInputs.ts +37 -0
- package/src/format/forestPage.ts +285 -0
- package/src/format/forestWeather.ts +333 -0
- package/src/format/geometryPack.ts +136 -0
- package/src/format/glbBuffers.ts +77 -0
- package/src/format/glbCost.ts +212 -0
- package/src/format/glbImages.ts +95 -0
- package/src/format/glbTriangles.ts +95 -0
- package/src/format/graphArmsRows.ts +200 -0
- package/src/format/grapple.ts +123 -0
- package/src/format/grazers.ts +164 -0
- package/src/format/grid-catalogue.ts +247 -0
- package/src/format/gridReadiness.ts +49 -0
- package/src/format/groupBrains.ts +249 -0
- package/src/format/heldArms.ts +576 -0
- package/src/format/heldEquipment.ts +78 -0
- package/src/format/heldFinishes.ts +415 -0
- package/src/format/heldGear.ts +68 -0
- package/src/format/heldJianDocument.ts +75 -0
- package/src/format/heldMelee.ts +866 -0
- package/src/format/heldView.ts +26 -0
- package/src/format/heldWeaponDocuments.ts +36 -0
- package/src/format/herdShelter.ts +58 -0
- package/src/format/hooks.ts +45 -0
- package/src/format/immutable.ts +59 -0
- package/src/format/inputDeclarations.ts +157 -0
- package/src/format/islandLibrary.ts +51 -0
- package/src/format/items.ts +229 -0
- package/src/format/json.ts +143 -0
- package/src/format/keyedSky.ts +314 -0
- package/src/format/kitFigure.ts +68 -0
- package/src/format/ktx2Cost.ts +47 -0
- package/src/format/ledger.ts +56 -0
- package/src/format/liftApproach.ts +75 -0
- package/src/format/liftRider.ts +10 -0
- package/src/format/lightEmitters.ts +105 -0
- package/src/format/lights.ts +135 -0
- package/src/format/limbCollision.ts +136 -0
- package/src/format/limbPopulation.ts +33 -0
- package/src/format/limbRig.ts +202 -0
- package/src/format/loadout.ts +156 -0
- package/src/format/look-light.ts +153 -0
- package/src/format/lootBag.ts +145 -0
- package/src/format/lootEconomy.ts +235 -0
- package/src/format/materialFamilies.ts +565 -0
- package/src/format/materialGraph.ts +1220 -0
- package/src/format/materials.ts +449 -0
- package/src/format/memoryAdmission.ts +84 -0
- package/src/format/memoryGates.json +7 -0
- package/src/format/meshCollision.ts +56 -0
- package/src/format/meshCollisionAssets.ts +19 -0
- package/src/format/meshCollisionBytes.ts +102 -0
- package/src/format/meshEntryways.ts +54 -0
- package/src/format/meshopt-decoder.wasm +0 -0
- package/src/format/meshopt-module.ts +177 -0
- package/src/format/meshopt-static.mjs +11 -0
- package/src/format/meshopt-wasm.ts +61 -0
- package/src/format/migrations.ts +209 -0
- package/src/format/minimap.ts +1052 -0
- package/src/format/mixedPopulation.ts +222 -0
- package/src/format/modes.ts +304 -0
- package/src/format/mountedSpecimenRows.ts +64 -0
- package/src/format/moverLifecycle.ts +34 -0
- package/src/format/moverMotion.ts +271 -0
- package/src/format/movers.ts +224 -0
- package/src/format/namedJsonContracts.ts +423 -0
- package/src/format/nativeActors.ts +45 -0
- package/src/format/nativeAssembly.ts +141 -0
- package/src/format/nativeGround.ts +37 -0
- package/src/format/nativeGroundAssets.ts +35 -0
- package/src/format/nativeItems.ts +184 -0
- package/src/format/nativePhysics.ts +140 -0
- package/src/format/nativeQuestComposition.ts +398 -0
- package/src/format/nativeRiding.ts +103 -0
- package/src/format/nativeRuntimePlan.ts +89 -0
- package/src/format/navigation.ts +99 -0
- package/src/format/navigationBytes.ts +111 -0
- package/src/format/nearPlaceholder.ts +111 -0
- package/src/format/nearPlaceholderAssets.ts +23 -0
- package/src/format/netCommand.ts +11 -0
- package/src/format/npcs.ts +546 -0
- package/src/format/outputAddress.ts +11 -0
- package/src/format/outputDownload.ts +34 -0
- package/src/format/outputFields.ts +123 -0
- package/src/format/outputIndex.ts +352 -0
- package/src/format/overdraw.ts +41 -0
- package/src/format/pageLife.ts +303 -0
- package/src/format/pagePreparation.ts +60 -0
- package/src/format/paintedLook.ts +55 -0
- package/src/format/paintedResources.ts +158 -0
- package/src/format/panelTemplate.ts +139 -0
- package/src/format/placeholderSource.ts +209 -0
- package/src/format/platformDataSections.ts +146 -0
- package/src/format/platformFileFamilies.ts +299 -0
- package/src/format/plumbing.ts +165 -0
- package/src/format/populationEnvironment.ts +210 -0
- package/src/format/populationKeeper.ts +163 -0
- package/src/format/populationProjection.ts +496 -0
- package/src/format/populationRespawn.ts +48 -0
- package/src/format/populationRoster.ts +158 -0
- package/src/format/portalFloor.ts +56 -0
- package/src/format/portalLink.ts +112 -0
- package/src/format/portalLinkAssets.ts +42 -0
- package/src/format/portalRide.ts +22 -0
- package/src/format/postGraphDocument.ts +36 -0
- package/src/format/postGraphLook.ts +477 -0
- package/src/format/postStack.ts +114 -0
- package/src/format/practiceCourseRows.ts +466 -0
- package/src/format/preflight.ts +155 -0
- package/src/format/presentation.ts +33 -0
- package/src/format/product-audio.ts +76 -0
- package/src/format/product-reads.ts +178 -0
- package/src/format/product-stream-admit.ts +100 -0
- package/src/format/product-stream-assets.ts +493 -0
- package/src/format/product-stream-facts.ts +208 -0
- package/src/format/product-stream-miss.ts +12 -0
- package/src/format/product-stream-node.ts +47 -0
- package/src/format/product-stream-packs.ts +242 -0
- package/src/format/product-stream-rows.ts +202 -0
- package/src/format/product-stream-tar.ts +192 -0
- package/src/format/product-stream.ts +284 -0
- package/src/format/product.ts +358 -0
- package/src/format/productValidation.ts +205 -0
- package/src/format/propMaterials.ts +254 -0
- package/src/format/props.ts +137 -0
- package/src/format/questContinuation.ts +42 -0
- package/src/format/questFigures.ts +227 -0
- package/src/format/questGraph.ts +30 -0
- package/src/format/questHost.ts +314 -0
- package/src/format/questInteractionSource.ts +57 -0
- package/src/format/questInteractions.ts +642 -0
- package/src/format/questPageComposition.ts +92 -0
- package/src/format/questPageFacets.ts +121 -0
- package/src/format/questRuntime.ts +118 -0
- package/src/format/questSteps.ts +182 -0
- package/src/format/questStory.ts +512 -0
- package/src/format/questStoryBindings.ts +43 -0
- package/src/format/questWorld.ts +36 -0
- package/src/format/quests.ts +333 -0
- package/src/format/rainPresentation.ts +131 -0
- package/src/format/rangedPage.ts +117 -0
- package/src/format/receipt-cost.ts +71 -0
- package/src/format/registeredJson.ts +530 -0
- package/src/format/returnProgramDocument.ts +40 -0
- package/src/format/returnProjectionV2.ts +84 -0
- package/src/format/riding.ts +377 -0
- package/src/format/riggedHulls.ts +160 -0
- package/src/format/roamingBossProjection.ts +178 -0
- package/src/format/roamingCombat.ts +22 -0
- package/src/format/ropeDeckSite.ts +148 -0
- package/src/format/rows.ts +86 -0
- package/src/format/runtime.ts +38 -0
- package/src/format/runtimeBinds.ts +49 -0
- package/src/format/runtimeCost.ts +80 -0
- package/src/format/runtimeSpawns.ts +73 -0
- package/src/format/scalarChannel.ts +38 -0
- package/src/format/scaledPost.ts +27 -0
- package/src/format/scaledPostContract.ts +51 -0
- package/src/format/sceneBuffers.ts +122 -0
- package/src/format/sceneDraws.ts +89 -0
- package/src/format/sceneDressing.ts +247 -0
- package/src/format/sceneInstances.ts +192 -0
- package/src/format/sceneMotion.ts +122 -0
- package/src/format/sceneRefs.ts +71 -0
- package/src/format/sceneSources.ts +730 -0
- package/src/format/script-side-grandfather.ts +62 -0
- package/src/format/script-sides.ts +289 -0
- package/src/format/scriptAbi.ts +14 -0
- package/src/format/scriptAbiV1.ts +56 -0
- package/src/format/scriptActionsV2.ts +101 -0
- package/src/format/scriptAdmission.ts +165 -0
- package/src/format/scriptAdmissionV2.ts +126 -0
- package/src/format/scriptContract.ts +170 -0
- package/src/format/scriptFuelV2.ts +124 -0
- package/src/format/scriptGroupBankV2.ts +54 -0
- package/src/format/scriptGroupStepV2.ts +165 -0
- package/src/format/scriptInputStateV2.ts +52 -0
- package/src/format/scriptLimits.ts +5 -0
- package/src/format/scriptMemoryV2.ts +17 -0
- package/src/format/scriptModuleV2.ts +116 -0
- package/src/format/scriptObservationColumnsV2.ts +226 -0
- package/src/format/scriptQueriesV2.ts +164 -0
- package/src/format/scriptQueryStateV2.ts +40 -0
- package/src/format/scriptRngV2.ts +52 -0
- package/src/format/scriptWireV2.ts +106 -0
- package/src/format/scripts.ts +31 -0
- package/src/format/sections.ts +140 -0
- package/src/format/shardSchema.ts +632 -0
- package/src/format/shardSections.ts +383 -0
- package/src/format/sketch.ts +79 -0
- package/src/format/skin-materials.ts +172 -0
- package/src/format/skinAssets.ts +107 -0
- package/src/format/skinData.ts +110 -0
- package/src/format/skinLayers.ts +90 -0
- package/src/format/skins.ts +37 -0
- package/src/format/socketLift.ts +58 -0
- package/src/format/socketLiftAssets.ts +81 -0
- package/src/format/socketRigCreature.ts +66 -0
- package/src/format/sourceResidency.ts +16 -0
- package/src/format/spawnCombat.ts +26 -0
- package/src/format/spawnScriptV2.ts +145 -0
- package/src/format/spawnScripts.ts +229 -0
- package/src/format/spawnTables.ts +46 -0
- package/src/format/spawnView.ts +26 -0
- package/src/format/speciesActorsFile.ts +86 -0
- package/src/format/speciesBookRows.ts +84 -0
- package/src/format/speciesBrain.ts +96 -0
- package/src/format/speciesLooks.ts +1021 -0
- package/src/format/speciesPrograms.ts +97 -0
- package/src/format/speciesScripts.ts +45 -0
- package/src/format/specimenCatalogue.ts +94 -0
- package/src/format/splatTerrain.ts +192 -0
- package/src/format/standalone-catalogue.ts +144 -0
- package/src/format/standaloneControl.ts +44 -0
- package/src/format/state.ts +61 -0
- package/src/format/stateLineage.ts +71 -0
- package/src/format/stealth.ts +106 -0
- package/src/format/stillImage.ts +135 -0
- package/src/format/streamedCover.ts +105 -0
- package/src/format/surfaceLooks.ts +50 -0
- package/src/format/tar-fields.ts +54 -0
- package/src/format/tar-paths.ts +103 -0
- package/src/format/tar-source.ts +13 -0
- package/src/format/tar-write.ts +152 -0
- package/src/format/tar.ts +203 -0
- package/src/format/targets.ts +217 -0
- package/src/format/terrain.ts +241 -0
- package/src/format/terrainTileBytes.ts +104 -0
- package/src/format/tierSelection.ts +195 -0
- package/src/format/toonLighting.ts +32 -0
- package/src/format/toonLook.ts +332 -0
- package/src/format/trail.ts +17 -0
- package/src/format/traversal.ts +13 -0
- package/src/format/treeSetRows.ts +93 -0
- package/src/format/ui.ts +90 -0
- package/src/format/uiStrings.ts +17 -0
- package/src/format/uniformRows.ts +31 -0
- package/src/format/upload-wire.ts +184 -0
- package/src/format/validationReceipt.ts +142 -0
- package/src/format/version.ts +9 -0
- package/src/format/vertexWear.ts +45 -0
- package/src/format/viewProgram.ts +329 -0
- package/src/format/voicePatches.ts +47 -0
- package/src/format/water.ts +247 -0
- package/src/format/waterWaves.ts +7 -0
- package/src/format/waterWorld.ts +34 -0
- package/src/format/weaponProfiles.ts +1315 -0
- package/src/format/weatherBundle.ts +36 -0
- package/src/format/weatherEffects.ts +78 -0
- package/src/format/weatherProgram.ts +422 -0
- package/src/format/wildlifePopulation.ts +210 -0
- package/src/format/wireLimits.ts +9 -0
- package/src/format/worldAssembly.ts +104 -0
- package/src/format/worldEntry.ts +151 -0
- package/src/format/worldPhysics.ts +292 -0
- package/src/format/worldSceneBatch.ts +106 -0
- package/src/format/worldSceneModels.ts +79 -0
- package/src/format/worldScenePages.ts +89 -0
- package/src/format/worldScenePlacement.ts +191 -0
- package/src/format/worldSceneSlabs.ts +43 -0
- package/src/format/worldSceneSurface.ts +113 -0
- package/src/format/worldSceneWeld.ts +702 -0
- package/src/format/worldScenes.ts +184 -0
- package/src/format/worldTargets.ts +111 -0
- package/src/format/worldUpdates.ts +229 -0
- package/src/hook/format-hook.d.mts +2 -0
- package/src/hook/format-hook.mjs +47 -0
- package/README.md +0 -8
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/** Bounds for one indexed collision chunk; larger geometry must be partitioned before encoding. */
|
|
2
|
+
export const MESH_COLLISION_LIMITS: Readonly<{ vertices: 120000; triangles: 40000; coordinate: 250; }> = Object.freeze({ vertices: 120000, triangles: 40000, coordinate: 250 });
|
|
3
|
+
const MAGIC = 0x31434d57; // WMC1, little endian.
|
|
4
|
+
const HEADER = 24;
|
|
5
|
+
|
|
6
|
+
/** Cell-local triangle geometry. Each index names a vertex in the packed XYZ array; winding is preserved. */
|
|
7
|
+
export interface MeshCollisionData { vertices: Float32Array; indices: Uint32Array }
|
|
8
|
+
|
|
9
|
+
function counts(vertices: number, indices: number): number {
|
|
10
|
+
if (!Number.isSafeInteger(vertices) || vertices < 3 || vertices > MESH_COLLISION_LIMITS.vertices
|
|
11
|
+
|| !Number.isSafeInteger(indices) || indices < 3 || indices % 3 !== 0 || indices / 3 > MESH_COLLISION_LIMITS.triangles) {
|
|
12
|
+
throw new Error('Mesh collision counts exceed chunk limits');
|
|
13
|
+
}
|
|
14
|
+
return HEADER + vertices * 12 + indices * 4;
|
|
15
|
+
}
|
|
16
|
+
function validate(data: MeshCollisionData): void {
|
|
17
|
+
const n = data.vertices.length / 3;
|
|
18
|
+
counts(n, data.indices.length);
|
|
19
|
+
for (const value of data.vertices) if (!Number.isFinite(value) || Math.abs(value) > MESH_COLLISION_LIMITS.coordinate) throw new Error('Mesh collision position outside finite bounds');
|
|
20
|
+
const used = new Uint8Array(n);
|
|
21
|
+
for (let i = 0; i < data.indices.length; i += 3) {
|
|
22
|
+
const a = data.indices[i], b = data.indices[i + 1], c = data.indices[i + 2];
|
|
23
|
+
if (a === undefined || b === undefined || c === undefined || a >= n || b >= n || c >= n) throw new Error('Mesh collision index outside vertex array');
|
|
24
|
+
used[a] = 1; used[b] = 1; used[c] = 1;
|
|
25
|
+
const ax = data.vertices[a * 3], ay = data.vertices[a * 3 + 1], az = data.vertices[a * 3 + 2];
|
|
26
|
+
const bx = data.vertices[b * 3], by = data.vertices[b * 3 + 1], bz = data.vertices[b * 3 + 2];
|
|
27
|
+
const cx = data.vertices[c * 3], cy = data.vertices[c * 3 + 1], cz = data.vertices[c * 3 + 2];
|
|
28
|
+
if (ax === undefined || ay === undefined || az === undefined || bx === undefined || by === undefined || bz === undefined || cx === undefined || cy === undefined || cz === undefined) throw new Error('Mesh collision missing vertex');
|
|
29
|
+
const ux = bx - ax, uy = by - ay, uz = bz - az, vx = cx - ax, vy = cy - ay, vz = cz - az;
|
|
30
|
+
if (uy * vz - uz * vy === 0 && uz * vx - ux * vz === 0 && ux * vy - uy * vx === 0) throw new Error('Mesh collision degenerate triangle');
|
|
31
|
+
}
|
|
32
|
+
if (used.includes(0)) throw new Error('Mesh collision unreferenced vertex');
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Identify WMC1 bytes without allocating or admitting their contents. */
|
|
36
|
+
export function isMeshCollisionData(bytes: Uint8Array): boolean {
|
|
37
|
+
return bytes.byteLength >= 4 && new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(0, true) === MAGIC;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Encode bounded indexed geometry deterministically, with no simplification or heightfield conversion. */
|
|
41
|
+
export function encodeMeshCollision(data: MeshCollisionData): Uint8Array {
|
|
42
|
+
validate(data);
|
|
43
|
+
const bytes = new Uint8Array(counts(data.vertices.length / 3, data.indices.length));
|
|
44
|
+
const view = new DataView(bytes.buffer);
|
|
45
|
+
view.setUint32(0, MAGIC, true); view.setUint16(4, 1, true);
|
|
46
|
+
view.setUint32(8, data.vertices.length / 3, true); view.setUint32(12, data.indices.length, true);
|
|
47
|
+
let at = HEADER;
|
|
48
|
+
for (const value of data.vertices) { view.setFloat32(at, value, true); at += 4; }
|
|
49
|
+
for (const index of data.indices) { view.setUint32(at, index, true); at += 4; }
|
|
50
|
+
return bytes;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Admit exact WMC1 wire bytes before native allocation and return owned arrays, including for unaligned input. */
|
|
54
|
+
export function decodeMeshCollision(bytes: Uint8Array): MeshCollisionData {
|
|
55
|
+
if (bytes.byteLength < HEADER) throw new Error('Mesh collision truncated header');
|
|
56
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
57
|
+
if (view.getUint32(0, true) !== MAGIC || view.getUint16(4, true) !== 1 || view.getUint16(6, true) !== 0
|
|
58
|
+
|| view.getUint32(16, true) !== 0 || view.getUint32(20, true) !== 0) throw new Error('Mesh collision unsupported header');
|
|
59
|
+
const n = view.getUint32(8, true), m = view.getUint32(12, true);
|
|
60
|
+
if (bytes.byteLength !== counts(n, m)) throw new Error('Mesh collision wire length mismatch');
|
|
61
|
+
const vertices = new Float32Array(n * 3), indices = new Uint32Array(m);
|
|
62
|
+
let at = HEADER;
|
|
63
|
+
for (let i = 0; i < vertices.length; i++) { vertices[i] = view.getFloat32(at, true); at += 4; }
|
|
64
|
+
for (let i = 0; i < indices.length; i++) { indices[i] = view.getUint32(at, true); at += 4; }
|
|
65
|
+
const data = { vertices, indices }; validate(data); return data;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Provisional collision residency: two wire copies, 64 bytes/vertex and 256 bytes/triangle; no render resources.
|
|
69
|
+
* Native snapshot probes are a lower-bound check, not a native-heap measurement. SF22a must replace this model
|
|
70
|
+
* with measured allocation costs before a shard using mesh collision ships.
|
|
71
|
+
*/
|
|
72
|
+
export function meshCollisionCost(data: MeshCollisionData): { decoded: number; gpu: number; triangles: number; draws: number } {
|
|
73
|
+
validate(data);
|
|
74
|
+
const vertices = data.vertices.length / 3, triangles = data.indices.length / 3;
|
|
75
|
+
return { decoded: counts(vertices, data.indices.length) * 2 + vertices * 64 + triangles * 256, gpu: 0, triangles: 0, draws: 0 };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Lowest projected authored surface for the legacy two-dimensional terrain fallback, undefined over a void.
|
|
79
|
+
* This metadata lookup never creates a heightfield or selects a creature/player contact layer; native floor
|
|
80
|
+
* queries from the actor's actual height own stacked floors, decks and overhangs. Input was decoded/admitted.
|
|
81
|
+
*/
|
|
82
|
+
export function lowestMeshHeight(data: MeshCollisionData, x: number, z: number): number | undefined {
|
|
83
|
+
if (!Number.isFinite(x) || !Number.isFinite(z)) throw new RangeError('Invalid mesh terrain query');
|
|
84
|
+
let lowest: number | undefined;
|
|
85
|
+
for (let i = 0; i < data.indices.length; i += 3) {
|
|
86
|
+
const a = data.indices[i], b = data.indices[i + 1], c = data.indices[i + 2];
|
|
87
|
+
if (a === undefined || b === undefined || c === undefined) throw new Error('Missing mesh height triangle');
|
|
88
|
+
const ax = data.vertices[a * 3], ay = data.vertices[a * 3 + 1], az = data.vertices[a * 3 + 2];
|
|
89
|
+
const bx = data.vertices[b * 3], by = data.vertices[b * 3 + 1], bz = data.vertices[b * 3 + 2];
|
|
90
|
+
const cx = data.vertices[c * 3], cy = data.vertices[c * 3 + 1], cz = data.vertices[c * 3 + 2];
|
|
91
|
+
if (ax === undefined || ay === undefined || az === undefined || bx === undefined || by === undefined || bz === undefined || cx === undefined || cy === undefined || cz === undefined) throw new Error('Missing mesh height vertex');
|
|
92
|
+
if (x < Math.min(ax, bx, cx) || x > Math.max(ax, bx, cx) || z < Math.min(az, bz, cz) || z > Math.max(az, bz, cz)) continue;
|
|
93
|
+
const determinant = (bz - cz) * (ax - cx) + (cx - bx) * (az - cz);
|
|
94
|
+
if (determinant === 0) continue; // A vertical wall has no projected terrain area.
|
|
95
|
+
const u = ((bz - cz) * (x - cx) + (cx - bx) * (z - cz)) / determinant;
|
|
96
|
+
const v = ((cz - az) * (x - cx) + (ax - cx) * (z - cz)) / determinant;
|
|
97
|
+
if (u < -1e-12 || v < -1e-12 || u + v > 1 + 1e-12) continue;
|
|
98
|
+
const height = ay * u + by * v + cy * (1 - u - v);
|
|
99
|
+
if (lowest === undefined || height < lowest) lowest = height;
|
|
100
|
+
}
|
|
101
|
+
return lowest;
|
|
102
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { decodeMeshCollision } from './meshCollisionBytes.ts';
|
|
2
|
+
import type { ShardMeshCollision } from './meshCollision.ts';
|
|
3
|
+
import type { ShardEntryways } from './entryways.ts';
|
|
4
|
+
import { clipEntryPolygon, entryFootprints, obstructsEntry, type EntryVertex } from './entryGeometry.ts';
|
|
5
|
+
import { convexEntryHull, entryCoverage } from './entryCoverage.ts';
|
|
6
|
+
|
|
7
|
+
/** Visit immutable collision triangles without allocating a physics world or retaining decoded chunks. */
|
|
8
|
+
export function visitMeshTriangles(file: string, assets: ReadonlyMap<string, Uint8Array>, visit: (triangle: readonly EntryVertex[]) => void): void {
|
|
9
|
+
const bytes = assets.get(file); if (bytes === undefined) throw new Error('Missing mesh collision asset');
|
|
10
|
+
const mesh = decodeMeshCollision(bytes);
|
|
11
|
+
const vertex = (index: number): EntryVertex => {
|
|
12
|
+
const x = mesh.vertices[index * 3], y = mesh.vertices[index * 3 + 1], z = mesh.vertices[index * 3 + 2];
|
|
13
|
+
if (x === undefined || y === undefined || z === undefined) throw new Error('Missing mesh collision vertex');
|
|
14
|
+
return { x, y, z };
|
|
15
|
+
};
|
|
16
|
+
for (let i = 0; i < mesh.indices.length; i += 3) {
|
|
17
|
+
const a = mesh.indices[i], b = mesh.indices[i + 1], c = mesh.indices[i + 2];
|
|
18
|
+
if (a === undefined || b === undefined || c === undefined) throw new Error('Missing mesh collision triangle');
|
|
19
|
+
visit([vertex(a), vertex(b), vertex(c)]);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Prove continuous road-height mesh ground; future panel states cannot supply ground or conceal obstructions. */
|
|
24
|
+
export function validateMeshEntryways(source: { meshCollision: ShardMeshCollision | null; entryways: ShardEntryways }, assets: ReadonlyMap<string, Uint8Array>): void {
|
|
25
|
+
const data = source.meshCollision; if (data === null) return;
|
|
26
|
+
const footprints = entryFootprints(source.entryways), surfaces = footprints.map((): EntryVertex[][] => []);
|
|
27
|
+
const inspect = (triangle: readonly EntryVertex[], permanent: boolean): void => {
|
|
28
|
+
let minX = Infinity, maxX = -Infinity, minZ = Infinity, maxZ = -Infinity;
|
|
29
|
+
for (const point of triangle) {
|
|
30
|
+
minX = Math.min(minX, point.x); maxX = Math.max(maxX, point.x);
|
|
31
|
+
minZ = Math.min(minZ, point.z); maxZ = Math.max(maxZ, point.z);
|
|
32
|
+
}
|
|
33
|
+
for (const [index, rect] of footprints.entries()) {
|
|
34
|
+
const entry = source.entryways[index], flat = surfaces[index];
|
|
35
|
+
if (entry === undefined || flat === undefined) throw new Error('Missing mesh entry footprint');
|
|
36
|
+
// Only disjoint projections can skip exact clipping; touching edges still take the original proof.
|
|
37
|
+
if (maxX < rect.minX || minX > rect.maxX || maxZ < rect.minZ || minZ > rect.maxZ) continue;
|
|
38
|
+
if (obstructsEntry(triangle, rect)) throw new Error(`illegal shard: mesh entryway ${entry.edge} footprint obstructed above road height`);
|
|
39
|
+
if (!permanent || (entry.kind ?? 'ground') !== 'ground') continue;
|
|
40
|
+
const clipped = clipEntryPolygon(triangle, rect);
|
|
41
|
+
if (clipped.length >= 3 && clipped.every(point => point.y === 0)) flat.push(convexEntryHull(clipped));
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
for (const row of data.tiles) visitMeshTriangles(row.file, assets, triangle => inspect(triangle, true));
|
|
45
|
+
for (const row of data.panels) visitMeshTriangles(row.file, assets, triangle => inspect(triangle, false));
|
|
46
|
+
for (const [index, rect] of footprints.entries()) {
|
|
47
|
+
const entry = source.entryways[index], flat = surfaces[index];
|
|
48
|
+
if (entry === undefined || flat === undefined) throw new Error('Missing mesh entry footprint');
|
|
49
|
+
if ((entry.kind ?? 'ground') !== 'ground') continue;
|
|
50
|
+
entryCoverage(flat)([{ x: rect.minX, y: 0, z: rect.minZ }, { x: rect.maxX, y: 0, z: rect.minZ },
|
|
51
|
+
{ x: rect.maxX, y: 0, z: rect.maxZ }, { x: rect.minX, y: 0, z: rect.maxZ }],
|
|
52
|
+
`illegal shard: mesh entryway ${entry.edge} requires continuous road-height ground across the full footprint`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// The meshopt decoder over an instance the host made (API-CLOUDFLARE AC6a).
|
|
2
|
+
// `meshoptimizer/decoder` compiles its WebAssembly from bytes when it loads,
|
|
3
|
+
// which a Worker refuses; a Worker imports `meshopt-decoder.wasm` as a
|
|
4
|
+
// compiled module instead (meshopt-static.mjs) and decodes through this, the
|
|
5
|
+
// decoder's own `decode` step for step.
|
|
6
|
+
|
|
7
|
+
type Decode = (
|
|
8
|
+
...args: readonly [
|
|
9
|
+
target: number,
|
|
10
|
+
count: number,
|
|
11
|
+
size: number,
|
|
12
|
+
source: number,
|
|
13
|
+
length: number,
|
|
14
|
+
]
|
|
15
|
+
) => number
|
|
16
|
+
type Filter = (
|
|
17
|
+
...args: readonly [target: number, count: number, size: number]
|
|
18
|
+
) => void
|
|
19
|
+
type Sbrk = (bytes: number) => number
|
|
20
|
+
|
|
21
|
+
/** The exports of `meshopt-decoder.wasm` this decoder calls. */
|
|
22
|
+
interface MeshoptInstance {
|
|
23
|
+
readonly exports: Readonly<Record<string, unknown>>
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** The part of `meshoptimizer/decoder`'s interface format calls. `target` is written. */
|
|
27
|
+
interface MeshoptStaticDecoder {
|
|
28
|
+
readonly ready: Promise<void>
|
|
29
|
+
readonly supported: true
|
|
30
|
+
readonly decodeGltfBuffer: (
|
|
31
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- `target` is the output the caller reads
|
|
32
|
+
...args: readonly [
|
|
33
|
+
target: Uint8Array,
|
|
34
|
+
count: number,
|
|
35
|
+
size: number,
|
|
36
|
+
source: Readonly<Uint8Array>,
|
|
37
|
+
mode: string,
|
|
38
|
+
filter?: string,
|
|
39
|
+
]
|
|
40
|
+
) => void
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** The decoder's exports, by name. */
|
|
44
|
+
interface Exports {
|
|
45
|
+
readonly heap: () => Uint8Array
|
|
46
|
+
readonly sbrk: Sbrk
|
|
47
|
+
readonly decoders: ReadonlyMap<string, Decode>
|
|
48
|
+
readonly filters: ReadonlyMap<string, Filter>
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** One decode: the decoder and filter, and where the decoded elements sit in the heap. */
|
|
52
|
+
interface Run {
|
|
53
|
+
readonly decode: Decode
|
|
54
|
+
readonly filter: Filter | undefined
|
|
55
|
+
readonly count: number
|
|
56
|
+
readonly size: number
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const FILTERS: ReadonlyMap<string, string> = new Map([
|
|
60
|
+
['OCTAHEDRAL', 'meshopt_decodeFilterOct'],
|
|
61
|
+
['QUATERNION', 'meshopt_decodeFilterQuat'],
|
|
62
|
+
['EXPONENTIAL', 'meshopt_decodeFilterExp'],
|
|
63
|
+
['COLOR', 'meshopt_decodeFilterColor'],
|
|
64
|
+
])
|
|
65
|
+
const DECODERS: ReadonlyMap<string, string> = new Map([
|
|
66
|
+
['ATTRIBUTES', 'meshopt_decodeVertexBuffer'],
|
|
67
|
+
['TRIANGLES', 'meshopt_decodeIndexBuffer'],
|
|
68
|
+
['INDICES', 'meshopt_decodeIndexSequence'],
|
|
69
|
+
])
|
|
70
|
+
// The decoder writes whole groups of four elements.
|
|
71
|
+
const GROUP = 4
|
|
72
|
+
const OK = 0
|
|
73
|
+
const START = 0
|
|
74
|
+
|
|
75
|
+
function exported(instance: Readonly<MeshoptInstance>, name: string): unknown {
|
|
76
|
+
const value = instance.exports[name]
|
|
77
|
+
if (value === undefined) {
|
|
78
|
+
throw new TypeError(`meshopt: missing export ${name}`)
|
|
79
|
+
}
|
|
80
|
+
return value
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function exportedFunctions<Value>(
|
|
84
|
+
instance: Readonly<MeshoptInstance>,
|
|
85
|
+
names: ReadonlyMap<string, string>,
|
|
86
|
+
): Map<string, Value> {
|
|
87
|
+
return new Map(
|
|
88
|
+
[...names].map(
|
|
89
|
+
([key, name]: readonly [string, string]): [string, Value] => [
|
|
90
|
+
key,
|
|
91
|
+
// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- the module is ours; the decoder calls it so
|
|
92
|
+
exported(instance, name) as Value,
|
|
93
|
+
],
|
|
94
|
+
),
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function exportsOf(instance: Readonly<MeshoptInstance>): Exports {
|
|
99
|
+
// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- the module is ours; its memory export
|
|
100
|
+
const memory = exported(instance, 'memory') as Readonly<{
|
|
101
|
+
buffer: ArrayBuffer
|
|
102
|
+
}>
|
|
103
|
+
return {
|
|
104
|
+
heap: (): Uint8Array => new Uint8Array(memory.buffer),
|
|
105
|
+
// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- the module is ours; its allocator export
|
|
106
|
+
sbrk: exported(instance, 'sbrk') as Sbrk,
|
|
107
|
+
decoders: exportedFunctions<Decode>(instance, DECODERS),
|
|
108
|
+
filters: exportedFunctions<Filter>(instance, FILTERS),
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/** Decode `source` into the heap and filter it; the decoder's result and the target's heap offset. */
|
|
113
|
+
function decodeInHeap(
|
|
114
|
+
exports: Exports,
|
|
115
|
+
run: Readonly<Run>,
|
|
116
|
+
source: Readonly<Uint8Array>,
|
|
117
|
+
): readonly [number, number] {
|
|
118
|
+
const groups = Math.ceil(run.count / GROUP) * GROUP
|
|
119
|
+
const tp = exports.sbrk(groups * run.size)
|
|
120
|
+
const sp = exports.sbrk(source.length)
|
|
121
|
+
exports.heap().set(source, sp)
|
|
122
|
+
const result = run.decode(tp, run.count, run.size, sp, source.length)
|
|
123
|
+
if (result === OK) {
|
|
124
|
+
run.filter?.(tp, groups, run.size)
|
|
125
|
+
}
|
|
126
|
+
return [result, tp]
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/** The decoder's `decode`: decode, copy out, free, then refuse a malformed buffer. */
|
|
130
|
+
function decode(
|
|
131
|
+
exports: Exports,
|
|
132
|
+
run: Readonly<Run>,
|
|
133
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- `target` is the output the caller reads
|
|
134
|
+
io: Readonly<{ target: Uint8Array; source: Readonly<Uint8Array> }>,
|
|
135
|
+
): void {
|
|
136
|
+
const [result, tp] = decodeInHeap(exports, run, io.source)
|
|
137
|
+
io.target.set(exports.heap().subarray(tp, tp + run.count * run.size))
|
|
138
|
+
exports.sbrk(tp - exports.sbrk(START))
|
|
139
|
+
if (result !== OK) {
|
|
140
|
+
throw new Error(`Malformed buffer data: ${String(result)}`)
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** A decoder over `instance`, after its constructors run once. */
|
|
145
|
+
function meshoptDecoderFrom(
|
|
146
|
+
instance: Readonly<MeshoptInstance>,
|
|
147
|
+
): MeshoptStaticDecoder {
|
|
148
|
+
// oxlint-disable-next-line typescript/no-unsafe-type-assertion -- the module is ours; its constructor export
|
|
149
|
+
;(exported(instance, '__wasm_call_ctors') as () => void)()
|
|
150
|
+
const exports = exportsOf(instance)
|
|
151
|
+
return {
|
|
152
|
+
ready: Promise.resolve(),
|
|
153
|
+
supported: true,
|
|
154
|
+
decodeGltfBuffer: (
|
|
155
|
+
// oxlint-disable-next-line typescript/prefer-readonly-parameter-types -- `target` is the output the caller reads
|
|
156
|
+
...[target, count, size, source, mode, filter]
|
|
157
|
+
): void => {
|
|
158
|
+
const run = exports.decoders.get(mode)
|
|
159
|
+
if (run === undefined) {
|
|
160
|
+
throw new Error(`meshopt: unknown mode ${mode}`)
|
|
161
|
+
}
|
|
162
|
+
decode(
|
|
163
|
+
exports,
|
|
164
|
+
{
|
|
165
|
+
decode: run,
|
|
166
|
+
filter: exports.filters.get(filter ?? 'NONE'),
|
|
167
|
+
count,
|
|
168
|
+
size,
|
|
169
|
+
},
|
|
170
|
+
{ target, source },
|
|
171
|
+
)
|
|
172
|
+
},
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export type { MeshoptInstance, MeshoptStaticDecoder }
|
|
177
|
+
export { meshoptDecoderFrom }
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// `meshoptimizer/decoder` for a Worker (API-CLOUDFLARE AC6a). The Worker's
|
|
2
|
+
// bundler (wrangler, esbuild) makes this `.wasm` import a compiled
|
|
3
|
+
// WebAssembly.Module, so nothing compiles at runtime, which Workers refuse.
|
|
4
|
+
// Bundle with an alias: `meshoptimizer/decoder` -> this file.
|
|
5
|
+
import wasm from './meshopt-decoder.wasm'
|
|
6
|
+
import { meshoptDecoderFrom } from './meshopt-module.ts'
|
|
7
|
+
|
|
8
|
+
// oxlint-disable-next-line typescript/no-unsafe-argument -- the bundler types a .wasm import as a compiled module
|
|
9
|
+
const MeshoptDecoder = meshoptDecoderFrom(new WebAssembly.Instance(wasm, {}))
|
|
10
|
+
|
|
11
|
+
export { MeshoptDecoder }
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// The SIMD module `meshoptimizer/decoder` carries as packed text, unpacked by
|
|
2
|
+
// the decoder's own `unpack` rule (API-CLOUDFLARE AC6a). It is committed as
|
|
3
|
+
// meshopt-decoder.wasm for a Worker to import; after a meshoptimizer bump,
|
|
4
|
+
// meshopt-module.test.ts fails until it is written again:
|
|
5
|
+
// node -e "import('./src/format/meshopt-wasm.ts').then(m => require('fs').writeFileSync(
|
|
6
|
+
// 'src/format/meshopt-decoder.wasm', m.meshoptWasm(require('fs').readFileSync(
|
|
7
|
+
// 'node_modules/meshoptimizer/meshopt_decoder.mjs', 'utf8'))))"
|
|
8
|
+
|
|
9
|
+
const PACKED = /var wasm_simd =\s*'(?<packed>[^']*)'/u
|
|
10
|
+
const TABLE = /var wasmpack = new Uint8Array\(\[(?<table>[^\]]*)\]\)/u
|
|
11
|
+
const LOWER = 96
|
|
12
|
+
const UPPER = 64
|
|
13
|
+
const LOWER_BASE = 97
|
|
14
|
+
const UPPER_BASE = 39
|
|
15
|
+
const DIGIT_SHIFT = 4
|
|
16
|
+
const TABLE_CODES = 60
|
|
17
|
+
const SPAN = 64
|
|
18
|
+
const START = 0
|
|
19
|
+
const NEXT = 1
|
|
20
|
+
|
|
21
|
+
function sixBit(code: number): number {
|
|
22
|
+
if (code > LOWER) {
|
|
23
|
+
return code - LOWER_BASE
|
|
24
|
+
}
|
|
25
|
+
return code > UPPER ? code - UPPER_BASE : code + DIGIT_SHIFT
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** The six-bit codes back to bytes: a code under 60 names a table byte, a higher one starts a two-code byte. */
|
|
29
|
+
function unpack(
|
|
30
|
+
codes: readonly number[],
|
|
31
|
+
table: readonly number[],
|
|
32
|
+
): Uint8Array {
|
|
33
|
+
const out: number[] = []
|
|
34
|
+
for (let at = START; at < codes.length; at += NEXT) {
|
|
35
|
+
const code = codes[at] ?? START
|
|
36
|
+
if (code < TABLE_CODES) {
|
|
37
|
+
out.push(table[code] ?? START)
|
|
38
|
+
} else {
|
|
39
|
+
at += NEXT
|
|
40
|
+
out.push((code - TABLE_CODES) * SPAN + (codes[at] ?? START))
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return Uint8Array.from(out)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** The decoder module's bytes, from the decoder's source text. */
|
|
47
|
+
function meshoptWasm(decoderSource: string): Uint8Array {
|
|
48
|
+
const packed = PACKED.exec(decoderSource)?.groups?.['packed']
|
|
49
|
+
const table = TABLE.exec(decoderSource)
|
|
50
|
+
?.groups?.['table']?.split(',')
|
|
51
|
+
.map(Number)
|
|
52
|
+
if (packed === undefined || table === undefined) {
|
|
53
|
+
throw new Error('meshopt-wasm: the decoder layout changed')
|
|
54
|
+
}
|
|
55
|
+
const codes = Array.from(packed, (letter: string): number =>
|
|
56
|
+
sixBit(letter.codePointAt(START) ?? START),
|
|
57
|
+
)
|
|
58
|
+
return unpack(codes, table)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export { meshoptWasm }
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { isJsonData } from './json.ts';
|
|
2
|
+
import * as v from 'valibot';
|
|
3
|
+
|
|
4
|
+
const positive = v.pipe(v.number(), v.integer(), v.minValue(1), v.maxValue(0x7fffffff));
|
|
5
|
+
const name = v.pipe(v.string(), v.minLength(1), v.maxLength(256));
|
|
6
|
+
const scalar = v.union([v.boolean(), v.pipe(v.number(), v.finite()), v.pipe(v.string(), v.maxLength(4096))]);
|
|
7
|
+
const fieldType = v.picklist(['bool', 'i32', 'f64', 'string']);
|
|
8
|
+
const scope = v.picklist(['shared', 'player']);
|
|
9
|
+
const savedField = v.strictObject({ id: positive, name, type: fieldType, value: scalar });
|
|
10
|
+
/** Stable ids and typed values are the portable part of a checkpoint; executable script memory is deliberately excluded. */
|
|
11
|
+
export const LogicalStateSchema: v.GenericSchema<LogicalStateInput, LogicalState> = v.strictObject({ version: positive, shared: v.pipe(v.array(savedField), v.maxLength(4096)),
|
|
12
|
+
players: v.pipe(v.array(v.strictObject({ actorId: name, fields: v.pipe(v.array(savedField), v.maxLength(4096)) })), v.maxLength(10000)) });
|
|
13
|
+
/** Detached declared state for additive or explicitly authored revision migration. */
|
|
14
|
+
|
|
15
|
+
const operation = v.variant('op', [
|
|
16
|
+
v.strictObject({ op: v.literal('default'), scope, field: savedField }),
|
|
17
|
+
v.strictObject({ op: v.literal('rename'), scope, id: positive, name }),
|
|
18
|
+
v.strictObject({ op: v.literal('drop'), scope, id: positive }),
|
|
19
|
+
v.strictObject({ op: v.literal('map'), scope, id: positive, type: fieldType,
|
|
20
|
+
values: v.pipe(v.array(v.strictObject({ from: scalar, to: scalar })), v.minLength(1), v.maxLength(256)), fallback: v.picklist(['keep', 'reject']) }),
|
|
21
|
+
]);
|
|
22
|
+
const equipmentSlot = v.pipe(v.string(), v.regex(/^[a-z][a-zA-Z0-9.-]*$/u), v.maxLength(256));
|
|
23
|
+
const slotRename = v.strictObject({ from: equipmentSlot, to: v.pipe(equipmentSlot, v.regex(/^declared\.weapon\.[a-z][a-zA-Z0-9.-]*$/u)) });
|
|
24
|
+
/** Sequential state-version rows are pure data. asHook is reserved and must remain null until an admitted AS migration ABI exists. */
|
|
25
|
+
export const MigrationsSchema: v.GenericSchema<DeclaredMigrationsInput, DeclaredMigrations> = v.pipe(v.unknown(), v.check(isJsonData, 'Migrations require plain JSON'), v.array(v.strictObject({ from: positive, to: positive,
|
|
26
|
+
fields: v.pipe(v.array(operation), v.maxLength(256)), equipmentSlots: v.exactOptional(v.pipe(v.array(slotRename), v.maxLength(64))), asHook: v.optional(v.null(), null) })), v.maxLength(64),
|
|
27
|
+
v.check((rows) => new Set(rows.map((row) => row.from)).size === rows.length && rows.every((row) => row.to === row.from + 1), 'Unique consecutive migration versions'),
|
|
28
|
+
v.check((rows) => rows.every((row) => {
|
|
29
|
+
const identity = (field: v.InferOutput<typeof operation>) => `${field.scope}/${field.op === 'default' ? field.field.id : field.id}`;
|
|
30
|
+
const keys = row.fields.map((field) => `${identity(field)}/${field.op}`);
|
|
31
|
+
return new Set((row.equipmentSlots ?? []).map(slot => slot.from)).size === (row.equipmentSlots?.length ?? 0)
|
|
32
|
+
&& (row.equipmentSlots ?? []).every(slot => slot.from !== slot.to)
|
|
33
|
+
&& new Set(keys).size === keys.length && row.fields.every((field) => field.op !== 'map'
|
|
34
|
+
|| new Set(field.values.map((value) => JSON.stringify(value.from))).size === field.values.length)
|
|
35
|
+
&& row.fields.every((field) => (field.op !== 'drop' && field.op !== 'default') || row.fields.filter((other) => identity(other) === identity(field)).length === 1);
|
|
36
|
+
}), 'Unique migration edits and value sources; drop/default cannot combine with other edits'));
|
|
37
|
+
/** Author migration rows accepted by both build-time admission and browser loading. */
|
|
38
|
+
|
|
39
|
+
/** Rename persisted equipment-slot keys before the cosmetics owner filters them against current rows.
|
|
40
|
+
* Canonical keys win when an interrupted upgrade left both names. Repeated loads are idempotent. */
|
|
41
|
+
export function migrateEquipmentSlots(input: Readonly<Record<string, string>>, migrations: DeclaredMigrations): Record<string, string> {
|
|
42
|
+
if (!isJsonData(input)) throw new Error('Saved slots require plain data');
|
|
43
|
+
const worn = { ...input };
|
|
44
|
+
for (const step of [...parseMigrations(migrations)].sort((a, b) => a.from - b.from)) for (const row of step.equipmentSlots ?? []) {
|
|
45
|
+
if (!Object.hasOwn(worn, row.from)) continue;
|
|
46
|
+
const value = worn[row.from];
|
|
47
|
+
if (value === undefined) continue;
|
|
48
|
+
if (!Object.hasOwn(worn, row.to)) worn[row.to] = value;
|
|
49
|
+
delete worn[row.from];
|
|
50
|
+
}
|
|
51
|
+
return worn;
|
|
52
|
+
}
|
|
53
|
+
/** Target declarations supply additive defaults and constrain every migrated value. */
|
|
54
|
+
export interface MigrationFieldDeclaration {
|
|
55
|
+
id: number; name: string; type: 'bool' | 'i32' | 'f64' | 'string'; default: number | boolean | string; min?: number | undefined; max?: number | undefined;
|
|
56
|
+
}
|
|
57
|
+
/** Parse author data; rename and map may compose, while repeated or conflicting edits and duplicate value sources are refused. */
|
|
58
|
+
export function parseMigrations(input: unknown): DeclaredMigrations {
|
|
59
|
+
return v.parse(MigrationsSchema, input);
|
|
60
|
+
}
|
|
61
|
+
/** Full-format admission must reject future migration steps before executing a simulation. */
|
|
62
|
+
export function migrationRules(rows: DeclaredMigrations, stateVersion: number): string[] {
|
|
63
|
+
const parsed = v.safeParse(MigrationsSchema, rows);
|
|
64
|
+
if (!parsed.success) return ['valid unambiguous migration rows'];
|
|
65
|
+
return parsed.output.some((row) => row.to > stateVersion) ? ['migration target within declared state version'] : [];
|
|
66
|
+
}
|
|
67
|
+
interface StateDeclaration { version: number; shared: readonly MigrationFieldDeclaration[]; player: readonly MigrationFieldDeclaration[] }
|
|
68
|
+
/** Admission checks field lineage without guessing saved enum values; rejected values are checked atomically during restore. Dropped ids remain reserved. */
|
|
69
|
+
export function assertMigrationCompatibility(previous: StateDeclaration, next: StateDeclaration, migrations: DeclaredMigrations = []): void {
|
|
70
|
+
const rows = parseMigrations(migrations);
|
|
71
|
+
if (next.version < previous.version || migrationRules(rows, next.version).length > 0) throw new Error('Invalid migration target version');
|
|
72
|
+
const fields = { shared: previous.shared.map((field) => ({ ...field })), player: previous.player.map((field) => ({ ...field })) };
|
|
73
|
+
const owners = new Map([...previous.shared.map((field) => [field.id, 'shared'] as const), ...previous.player.map((field) => [field.id, 'player'] as const)]);
|
|
74
|
+
const dropped = new Set<number>();
|
|
75
|
+
for (const row of rows.filter((step) => step.from >= previous.version && step.to <= next.version).sort((a, b) => a.from - b.from)) {
|
|
76
|
+
for (const op of row.fields) {
|
|
77
|
+
const list = fields[op.scope], id = op.op === 'default' ? op.field.id : op.id, index = list.findIndex((field) => field.id === id), field = list[index];
|
|
78
|
+
if (op.op === 'default') {
|
|
79
|
+
if (field === undefined) {
|
|
80
|
+
if (owners.has(id)) throw new Error('State id cannot be reused');
|
|
81
|
+
owners.set(id, op.scope); list.push({ ...op.field, default: op.field.value });
|
|
82
|
+
}
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
if (field === undefined) throw new Error('Migration names a missing stable field');
|
|
86
|
+
if (op.op === 'drop') { list.splice(index, 1); dropped.add(id); }
|
|
87
|
+
else if (op.op === 'rename') field.name = op.name;
|
|
88
|
+
else field.type = op.type;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
for (const kind of ['shared', 'player'] as const) {
|
|
92
|
+
for (const field of fields[kind]) {
|
|
93
|
+
const replacement = next[kind].find((entry) => entry.id === field.id);
|
|
94
|
+
if (replacement === undefined || replacement.name !== field.name || replacement.type !== field.type) throw new Error('State change requires an explicit valid migration');
|
|
95
|
+
}
|
|
96
|
+
for (const field of next[kind]) {
|
|
97
|
+
const owner = owners.get(field.id);
|
|
98
|
+
if (dropped.has(field.id) || (owner !== undefined && owner !== kind)) throw new Error('State id cannot be reused');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function valueValid(field: MigrationFieldDeclaration, value: number | boolean | string): boolean {
|
|
103
|
+
if (field.type === 'bool') return typeof value === 'boolean';
|
|
104
|
+
if (field.type === 'string') return typeof value === 'string' && value.length <= 4096;
|
|
105
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= (field.min ?? -Number.MAX_VALUE) && value <= (field.max ?? Number.MAX_VALUE)
|
|
106
|
+
&& (field.type !== 'i32' || (Number.isInteger(value) && value >= -2147483648 && value <= 2147483647));
|
|
107
|
+
}
|
|
108
|
+
/** Migrate a detached copy by stable ids; additions take target defaults, while rename/drop/type/value changes require author rows. Never execute author code. */
|
|
109
|
+
export function migrateLogicalState(input: unknown, target: { version: number; shared: readonly MigrationFieldDeclaration[]; player: readonly MigrationFieldDeclaration[] }, migrations: DeclaredMigrations = []): LogicalState {
|
|
110
|
+
const state = v.parse(LogicalStateSchema, structuredClone(input)), rows = parseMigrations(migrations);
|
|
111
|
+
if (!Number.isSafeInteger(target.version) || target.version < state.version || rows.some((row) => row.to > target.version)) throw new Error('Invalid migration target version');
|
|
112
|
+
if (new Set(state.players.map((player) => player.actorId)).size !== state.players.length) throw new Error('Duplicate logical actor');
|
|
113
|
+
const owners = new Map([...state.shared.map((field) => [field.id, 'shared'] as const), ...state.players.flatMap((player) => player.fields.map((field) => [field.id, 'player'] as const))]);
|
|
114
|
+
const dropped = new Set<number>();
|
|
115
|
+
const lists = (kind: 'shared' | 'player') => kind === 'shared' ? [state.shared] : state.players.map((player) => player.fields);
|
|
116
|
+
for (const row of rows.filter((step) => step.from >= state.version && step.to <= target.version).sort((a, b) => a.from - b.from)) {
|
|
117
|
+
for (const op of row.fields) for (const fields of lists(op.scope)) {
|
|
118
|
+
const id = op.op === 'default' ? op.field.id : op.id, index = fields.findIndex((field) => field.id === id), field = fields[index];
|
|
119
|
+
if (op.op === 'default') { if (field === undefined) { if (dropped.has(id)) throw new Error('State id cannot be reused'); fields.push({ ...op.field }); } continue; }
|
|
120
|
+
if (field === undefined) throw new Error('Migration names a missing stable field');
|
|
121
|
+
if (op.op === 'drop') { fields.splice(index, 1); dropped.add(id); }
|
|
122
|
+
else if (op.op === 'rename') field.name = op.name;
|
|
123
|
+
else {
|
|
124
|
+
const replacement = op.values.find((value) => value.from === field.value);
|
|
125
|
+
if (replacement === undefined && op.fallback === 'reject') throw new Error('Unmapped migration value');
|
|
126
|
+
field.value = replacement?.to ?? field.value; field.type = op.type;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const finish = (fields: LogicalState['shared'], declarations: readonly MigrationFieldDeclaration[]): LogicalState['shared'] => {
|
|
131
|
+
if (new Set(fields.map((field) => field.id)).size !== fields.length || new Set(declarations.map((field) => field.id)).size !== declarations.length) throw new Error('Duplicate stable state id');
|
|
132
|
+
for (const field of fields) {
|
|
133
|
+
const next = declarations.find((entry) => entry.id === field.id);
|
|
134
|
+
if (next === undefined || next.name !== field.name || next.type !== field.type || !valueValid(next, field.value)) throw new Error('State change requires an explicit valid migration');
|
|
135
|
+
}
|
|
136
|
+
return declarations.map((field) => {
|
|
137
|
+
const value = fields.find((prior) => prior.id === field.id)?.value ?? field.default;
|
|
138
|
+
if (!valueValid(field, value)) throw new Error('Invalid migration default');
|
|
139
|
+
return { id: field.id, name: field.name, type: field.type, value };
|
|
140
|
+
}).sort((a, b) => a.id - b.id);
|
|
141
|
+
};
|
|
142
|
+
for (const kind of ['shared', 'player'] as const) for (const field of target[kind]) {
|
|
143
|
+
const owner = owners.get(field.id);
|
|
144
|
+
if (dropped.has(field.id) || (owner !== undefined && owner !== kind)) throw new Error('State id cannot be reused');
|
|
145
|
+
}
|
|
146
|
+
return { version: target.version, shared: finish(state.shared, target.shared),
|
|
147
|
+
players: state.players.map((player) => ({ actorId: player.actorId, fields: finish(player.fields, target.player) })) };
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** Admitted data contracts, independent of validator implementation metadata. */
|
|
151
|
+
export type LogicalStateInput = LogicalState;
|
|
152
|
+
interface LogicalStateFields {
|
|
153
|
+
version: number;
|
|
154
|
+
shared: ({
|
|
155
|
+
id: number;
|
|
156
|
+
name: string;
|
|
157
|
+
type: 'bool' | 'i32' | 'f64' | 'string';
|
|
158
|
+
value: (boolean) | (number) | (string);
|
|
159
|
+
})[];
|
|
160
|
+
players: ({
|
|
161
|
+
actorId: string;
|
|
162
|
+
fields: ({
|
|
163
|
+
id: number;
|
|
164
|
+
name: string;
|
|
165
|
+
type: 'bool' | 'i32' | 'f64' | 'string';
|
|
166
|
+
value: (boolean) | (number) | (string);
|
|
167
|
+
})[];
|
|
168
|
+
})[];
|
|
169
|
+
}
|
|
170
|
+
export type LogicalState = { [Key in keyof LogicalStateFields]: LogicalStateFields[Key] };
|
|
171
|
+
export type DeclaredMigrationsInput = unknown;
|
|
172
|
+
export type DeclaredMigrations = ({
|
|
173
|
+
from: number;
|
|
174
|
+
to: number;
|
|
175
|
+
fields: (({
|
|
176
|
+
op: 'default';
|
|
177
|
+
scope: 'shared' | 'player';
|
|
178
|
+
field: {
|
|
179
|
+
id: number;
|
|
180
|
+
name: string;
|
|
181
|
+
type: 'bool' | 'i32' | 'f64' | 'string';
|
|
182
|
+
value: (boolean) | (number) | (string);
|
|
183
|
+
};
|
|
184
|
+
}) | ({
|
|
185
|
+
op: 'rename';
|
|
186
|
+
scope: 'shared' | 'player';
|
|
187
|
+
id: number;
|
|
188
|
+
name: string;
|
|
189
|
+
}) | ({
|
|
190
|
+
op: 'drop';
|
|
191
|
+
scope: 'shared' | 'player';
|
|
192
|
+
id: number;
|
|
193
|
+
}) | ({
|
|
194
|
+
op: 'map';
|
|
195
|
+
scope: 'shared' | 'player';
|
|
196
|
+
id: number;
|
|
197
|
+
type: 'bool' | 'i32' | 'f64' | 'string';
|
|
198
|
+
values: ({
|
|
199
|
+
from: (boolean) | (number) | (string);
|
|
200
|
+
to: (boolean) | (number) | (string);
|
|
201
|
+
})[];
|
|
202
|
+
fallback: 'keep' | 'reject';
|
|
203
|
+
}))[];
|
|
204
|
+
equipmentSlots?: ({
|
|
205
|
+
from: string;
|
|
206
|
+
to: string;
|
|
207
|
+
})[];
|
|
208
|
+
asHook: null;
|
|
209
|
+
})[];
|