@blockcast/mmt-container 0.1.0-main.149f78a4adae
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/README.md +432 -0
- package/dist/.build-stamp +0 -0
- package/dist/__tests__/test-utils.d.ts +71 -0
- package/dist/__tests__/test-utils.d.ts.map +1 -0
- package/dist/align.d.ts +148 -0
- package/dist/align.d.ts.map +1 -0
- package/dist/align.js +88 -0
- package/dist/align.js.map +7 -0
- package/dist/audio-init-parser.d.ts +66 -0
- package/dist/audio-init-parser.d.ts.map +1 -0
- package/dist/audio-init-parser.js +118 -0
- package/dist/audio-init-parser.js.map +7 -0
- package/dist/audio-ring-buffer.d.ts +50 -0
- package/dist/audio-ring-buffer.d.ts.map +1 -0
- package/dist/audio-ring-buffer.js +93 -0
- package/dist/audio-ring-buffer.js.map +7 -0
- package/dist/authored-timing.d.ts +32 -0
- package/dist/authored-timing.d.ts.map +1 -0
- package/dist/authored-timing.js +32 -0
- package/dist/authored-timing.js.map +7 -0
- package/dist/browser-runtime.js +17109 -0
- package/dist/browser-runtime.js.map +7 -0
- package/dist/carp-catalog.d.ts +318 -0
- package/dist/carp-catalog.d.ts.map +1 -0
- package/dist/carp-catalog.js +549 -0
- package/dist/carp-catalog.js.map +7 -0
- package/dist/catalog-fec-params.d.ts +82 -0
- package/dist/catalog-fec-params.d.ts.map +1 -0
- package/dist/catalog-fec-params.js +66 -0
- package/dist/catalog-fec-params.js.map +7 -0
- package/dist/catalog-network-source.d.ts +19 -0
- package/dist/catalog-network-source.d.ts.map +1 -0
- package/dist/catalog-network-source.js +22 -0
- package/dist/catalog-network-source.js.map +7 -0
- package/dist/catalog-validator.d.ts +18 -0
- package/dist/catalog-validator.d.ts.map +1 -0
- package/dist/catalog-validator.js +7747 -0
- package/dist/catalog-validator.js.map +7 -0
- package/dist/cmaf-block-assembler.d.ts +168 -0
- package/dist/cmaf-block-assembler.d.ts.map +1 -0
- package/dist/cmaf-block-assembler.js +1755 -0
- package/dist/cmaf-block-assembler.js.map +7 -0
- package/dist/cmaf-group-batcher.d.ts +38 -0
- package/dist/cmaf-group-batcher.d.ts.map +1 -0
- package/dist/cmaf-group-batcher.js +195 -0
- package/dist/cmaf-group-batcher.js.map +7 -0
- package/dist/cmcd-producer.d.ts +104 -0
- package/dist/cmcd-producer.d.ts.map +1 -0
- package/dist/cmcd-producer.js +207 -0
- package/dist/cmcd-producer.js.map +7 -0
- package/dist/codec-utils.d.ts +235 -0
- package/dist/codec-utils.d.ts.map +1 -0
- package/dist/codec-utils.js +1225 -0
- package/dist/codec-utils.js.map +7 -0
- package/dist/fec-codec.d.ts +32 -0
- package/dist/fec-codec.d.ts.map +1 -0
- package/dist/fec-codec.js +47 -0
- package/dist/fec-codec.js.map +7 -0
- package/dist/fec-manager.d.ts +266 -0
- package/dist/fec-manager.d.ts.map +1 -0
- package/dist/fec-manager.js +1447 -0
- package/dist/fec-manager.js.map +7 -0
- package/dist/fec-starvation-detector.d.ts +59 -0
- package/dist/fec-starvation-detector.d.ts.map +1 -0
- package/dist/fec-starvation-detector.js +75 -0
- package/dist/fec-starvation-detector.js.map +7 -0
- package/dist/fec-worker-setup.d.ts +76 -0
- package/dist/fec-worker-setup.d.ts.map +1 -0
- package/dist/fec-worker-setup.js +603 -0
- package/dist/fec-worker-setup.js.map +7 -0
- package/dist/fmp4-completion.d.ts +30 -0
- package/dist/fmp4-completion.d.ts.map +1 -0
- package/dist/fmp4-completion.js +21 -0
- package/dist/fmp4-completion.js.map +7 -0
- package/dist/fmp4-reader.d.ts +37 -0
- package/dist/fmp4-reader.d.ts.map +1 -0
- package/dist/fmp4-reader.js +100 -0
- package/dist/fmp4-reader.js.map +7 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +330 -0
- package/dist/index.js.map +7 -0
- package/dist/iso-bmff-timing.d.ts +47 -0
- package/dist/iso-bmff-timing.d.ts.map +1 -0
- package/dist/iso-bmff-timing.js +526 -0
- package/dist/iso-bmff-timing.js.map +7 -0
- package/dist/loc.d.ts +68 -0
- package/dist/loc.d.ts.map +1 -0
- package/dist/loc.js +143 -0
- package/dist/loc.js.map +7 -0
- package/dist/manifest-auth-plan.d.ts +30 -0
- package/dist/manifest-auth-plan.d.ts.map +1 -0
- package/dist/manifest-auth-plan.js +1267 -0
- package/dist/manifest-auth-plan.js.map +7 -0
- package/dist/media-router.d.ts +338 -0
- package/dist/media-router.d.ts.map +1 -0
- package/dist/media-router.js +802 -0
- package/dist/media-router.js.map +7 -0
- package/dist/mfu-reassembler.d.ts +264 -0
- package/dist/mfu-reassembler.d.ts.map +1 -0
- package/dist/mfu-reassembler.js +2668 -0
- package/dist/mfu-reassembler.js.map +7 -0
- package/dist/mfu-reassembly-policy.d.ts +24 -0
- package/dist/mfu-reassembly-policy.d.ts.map +1 -0
- package/dist/mfu-reassembly-policy.js +99 -0
- package/dist/mfu-reassembly-policy.js.map +7 -0
- package/dist/mmtp-container-parser.d.ts +304 -0
- package/dist/mmtp-container-parser.d.ts.map +1 -0
- package/dist/mmtp-container-parser.js +5378 -0
- package/dist/mmtp-container-parser.js.map +7 -0
- package/dist/mmtp-container-parser.no-modules.js +7853 -0
- package/dist/mmtp-container-parser.no-modules.js.map +7 -0
- package/dist/mmtp-decode-pipeline.d.ts +96 -0
- package/dist/mmtp-decode-pipeline.d.ts.map +1 -0
- package/dist/mmtp-decode-pipeline.js +5589 -0
- package/dist/mmtp-decode-pipeline.js.map +7 -0
- package/dist/mmtp-router.d.ts +383 -0
- package/dist/mmtp-router.d.ts.map +1 -0
- package/dist/mmtp-router.js +8384 -0
- package/dist/mmtp-router.js.map +7 -0
- package/dist/mmtp-to-cmaf.d.ts +166 -0
- package/dist/mmtp-to-cmaf.d.ts.map +1 -0
- package/dist/mmtp-to-cmaf.js +781 -0
- package/dist/mmtp-to-cmaf.js.map +7 -0
- package/dist/multicast-auth-catalog.d.ts +115 -0
- package/dist/multicast-auth-catalog.d.ts.map +1 -0
- package/dist/multicast-auth-catalog.js +202 -0
- package/dist/multicast-auth-catalog.js.map +7 -0
- package/dist/multicast-input.d.ts +107 -0
- package/dist/multicast-input.d.ts.map +1 -0
- package/dist/multicast-input.js +256 -0
- package/dist/multicast-input.js.map +7 -0
- package/dist/multicast-manager.d.ts +330 -0
- package/dist/multicast-manager.d.ts.map +1 -0
- package/dist/multicast-manager.js +11032 -0
- package/dist/multicast-manager.js.map +7 -0
- package/dist/multicast-transport.d.ts +62 -0
- package/dist/multicast-transport.d.ts.map +1 -0
- package/dist/multicast-transport.js +338 -0
- package/dist/multicast-transport.js.map +7 -0
- package/dist/multicast-unwrap.d.ts +57 -0
- package/dist/multicast-unwrap.d.ts.map +1 -0
- package/dist/multicast-unwrap.js +384 -0
- package/dist/multicast-unwrap.js.map +7 -0
- package/dist/no-modules.d.ts +9 -0
- package/dist/no-modules.d.ts.map +1 -0
- package/dist/no-modules.js +7819 -0
- package/dist/no-modules.js.map +7 -0
- package/dist/phase14-catalog-override.d.ts +126 -0
- package/dist/phase14-catalog-override.d.ts.map +1 -0
- package/dist/phase14-catalog-override.js +155 -0
- package/dist/phase14-catalog-override.js.map +7 -0
- package/dist/repair-fetch.d.ts +58 -0
- package/dist/repair-fetch.d.ts.map +1 -0
- package/dist/repair-fetch.js +117 -0
- package/dist/repair-fetch.js.map +7 -0
- package/dist/sample-combiner.d.ts +182 -0
- package/dist/sample-combiner.d.ts.map +1 -0
- package/dist/sample-combiner.js +571 -0
- package/dist/sample-combiner.js.map +7 -0
- package/dist/signaling.d.ts +29 -0
- package/dist/signaling.d.ts.map +1 -0
- package/dist/signaling.js +232 -0
- package/dist/signaling.js.map +7 -0
- package/dist/source-auth.d.ts +2 -0
- package/dist/source-auth.d.ts.map +1 -0
- package/dist/source-auth.js +1220 -0
- package/dist/source-auth.js.map +7 -0
- package/dist/switching-set-alignment.d.ts +61 -0
- package/dist/switching-set-alignment.d.ts.map +1 -0
- package/dist/switching-set-alignment.js +85 -0
- package/dist/switching-set-alignment.js.map +7 -0
- package/dist/timestamp-codec.d.ts +34 -0
- package/dist/timestamp-codec.d.ts.map +1 -0
- package/dist/timestamp-codec.js +456 -0
- package/dist/timestamp-codec.js.map +7 -0
- package/dist/track-pipeline-setup.d.ts +72 -0
- package/dist/track-pipeline-setup.d.ts.map +1 -0
- package/dist/track-pipeline-setup.js +306 -0
- package/dist/track-pipeline-setup.js.map +7 -0
- package/dist/track-pipeline.d.ts +121 -0
- package/dist/track-pipeline.d.ts.map +1 -0
- package/dist/track-pipeline.js +229 -0
- package/dist/track-pipeline.js.map +7 -0
- package/dist/track-session.d.ts +269 -0
- package/dist/track-session.d.ts.map +1 -0
- package/dist/track-session.js +597 -0
- package/dist/track-session.js.map +7 -0
- package/dist/transport-pool.d.ts +69 -0
- package/dist/transport-pool.d.ts.map +1 -0
- package/dist/transport-pool.js +88 -0
- package/dist/transport-pool.js.map +7 -0
- package/dist/wasm-mfu-reassembler.d.ts +81 -0
- package/dist/wasm-mfu-reassembler.d.ts.map +1 -0
- package/dist/wasm-mfu-reassembler.js +1915 -0
- package/dist/wasm-mfu-reassembler.js.map +7 -0
- package/dist/wasm-mmtp-container-parser.d.ts +10 -0
- package/dist/wasm-mmtp-container-parser.d.ts.map +1 -0
- package/dist/wasm-mmtp-container-parser.js +5635 -0
- package/dist/wasm-mmtp-container-parser.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/README.md +213 -0
- package/node_modules/@blockcast/fec-worker/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts +80 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js +270 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-client.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts +252 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js +11 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker-types.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts +14 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.js +565 -0
- package/node_modules/@blockcast/fec-worker/dist/fec-worker.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/dist/index.d.ts +10 -0
- package/node_modules/@blockcast/fec-worker/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/index.js +8 -0
- package/node_modules/@blockcast/fec-worker/dist/index.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts +20 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js +349 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-fec-worker.js.map +7 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts +104 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js +181 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-client.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts +179 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js +47 -0
- package/node_modules/@blockcast/fec-worker/dist/shred-worker-types.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts +9 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.d.ts.map +1 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.js +13 -0
- package/node_modules/@blockcast/fec-worker/dist/transfer.js.map +1 -0
- package/node_modules/@blockcast/fec-worker/package.json +59 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker-client.ts +309 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker-types.ts +268 -0
- package/node_modules/@blockcast/fec-worker/src/fec-worker.ts +1048 -0
- package/node_modules/@blockcast/fec-worker/src/index.ts +32 -0
- package/node_modules/@blockcast/fec-worker/src/shred-fec-worker.ts +558 -0
- package/node_modules/@blockcast/fec-worker/src/shred-worker-client.ts +222 -0
- package/node_modules/@blockcast/fec-worker/src/shred-worker-types.ts +194 -0
- package/node_modules/@blockcast/fec-worker/src/transfer.ts +12 -0
- package/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
- package/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
- package/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
- package/node_modules/@blockcast/mmt-base/README.md +120 -0
- package/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
- package/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
- package/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +275 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js +644 -0
- package/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
- package/node_modules/@blockcast/mmt-base/package.json +49 -0
- package/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
- package/node_modules/@blockcast/mmt-base/src/mmtp.ts +898 -0
- package/node_modules/@blockcast/mmt-fec/README.md +270 -0
- package/node_modules/@blockcast/mmt-fec/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts +80 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.js +294 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-manager.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts +72 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.js +192 -0
- package/node_modules/@blockcast/mmt-fec/dist/block-processor.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts +46 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js +96 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-recovery.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts +33 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js +57 -0
- package/node_modules/@blockcast/mmt-fec/dist/cmaf-symbols.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts +185 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js +273 -0
- package/node_modules/@blockcast/mmt-fec/dist/fec-block-mapper.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts +22 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.js +22 -0
- package/node_modules/@blockcast/mmt-fec/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts +20 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js +28 -0
- package/node_modules/@blockcast/mmt-fec/dist/loc-symbols.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts +174 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.js +256 -0
- package/node_modules/@blockcast/mmt-fec/dist/oti.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts +41 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js +81 -0
- package/node_modules/@blockcast/mmt-fec/dist/reorder-buffer.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/README.md +181 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts +57 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js +115 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/package.json +50 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-alta-parse/src/index.ts +136 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/README.md +120 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts +2 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js +2 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts +275 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js +644 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/dist/mmtp.js.map +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/package.json +49 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/index.ts +1 -0
- package/node_modules/@blockcast/mmt-fec/node_modules/@blockcast/mmt-base/src/mmtp.ts +898 -0
- package/node_modules/@blockcast/mmt-fec/package.json +79 -0
- package/node_modules/@blockcast/mmt-fec/src/block-manager.ts +369 -0
- package/node_modules/@blockcast/mmt-fec/src/block-processor.ts +277 -0
- package/node_modules/@blockcast/mmt-fec/src/cmaf-recovery.ts +127 -0
- package/node_modules/@blockcast/mmt-fec/src/cmaf-symbols.ts +68 -0
- package/node_modules/@blockcast/mmt-fec/src/fec-block-mapper.ts +332 -0
- package/node_modules/@blockcast/mmt-fec/src/index.ts +77 -0
- package/node_modules/@blockcast/mmt-fec/src/loc-symbols.ts +34 -0
- package/node_modules/@blockcast/mmt-fec/src/oti.ts +319 -0
- package/node_modules/@blockcast/mmt-fec/src/reorder-buffer.ts +101 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/.build-stamp +0 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts +28 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js +128 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/admission.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts +4 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js +4 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/index.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts +37 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js +179 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/source-auth.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts +90 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.d.ts.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js +462 -0
- package/node_modules/@blockcast/mmt-manifest-verify/dist/verifier.js.map +1 -0
- package/node_modules/@blockcast/mmt-manifest-verify/package.json +45 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/admission.ts +171 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/index.ts +3 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/source-auth.ts +230 -0
- package/node_modules/@blockcast/mmt-manifest-verify/src/verifier.ts +636 -0
- package/node_modules/@noble/hashes/LICENSE +21 -0
- package/node_modules/@noble/hashes/README.md +521 -0
- package/node_modules/@noble/hashes/_assert.d.ts +17 -0
- package/node_modules/@noble/hashes/_assert.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_assert.js +18 -0
- package/node_modules/@noble/hashes/_assert.js.map +1 -0
- package/node_modules/@noble/hashes/_blake.d.ts +14 -0
- package/node_modules/@noble/hashes/_blake.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_blake.js +50 -0
- package/node_modules/@noble/hashes/_blake.js.map +1 -0
- package/node_modules/@noble/hashes/_md.d.ts +51 -0
- package/node_modules/@noble/hashes/_md.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_md.js +162 -0
- package/node_modules/@noble/hashes/_md.js.map +1 -0
- package/node_modules/@noble/hashes/_u64.d.ts +55 -0
- package/node_modules/@noble/hashes/_u64.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_u64.js +90 -0
- package/node_modules/@noble/hashes/_u64.js.map +1 -0
- package/node_modules/@noble/hashes/argon2.d.ts +32 -0
- package/node_modules/@noble/hashes/argon2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/argon2.js +401 -0
- package/node_modules/@noble/hashes/argon2.js.map +1 -0
- package/node_modules/@noble/hashes/blake1.d.ts +106 -0
- package/node_modules/@noble/hashes/blake1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake1.js +459 -0
- package/node_modules/@noble/hashes/blake1.js.map +1 -0
- package/node_modules/@noble/hashes/blake2.d.ts +116 -0
- package/node_modules/@noble/hashes/blake2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2.js +420 -0
- package/node_modules/@noble/hashes/blake2.js.map +1 -0
- package/node_modules/@noble/hashes/blake2b.d.ts +11 -0
- package/node_modules/@noble/hashes/blake2b.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2b.js +14 -0
- package/node_modules/@noble/hashes/blake2b.js.map +1 -0
- package/node_modules/@noble/hashes/blake2s.d.ts +20 -0
- package/node_modules/@noble/hashes/blake2s.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2s.js +24 -0
- package/node_modules/@noble/hashes/blake2s.js.map +1 -0
- package/node_modules/@noble/hashes/blake3.d.ts +54 -0
- package/node_modules/@noble/hashes/blake3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake3.js +255 -0
- package/node_modules/@noble/hashes/blake3.js.map +1 -0
- package/node_modules/@noble/hashes/crypto.d.ts +2 -0
- package/node_modules/@noble/hashes/crypto.d.ts.map +1 -0
- package/node_modules/@noble/hashes/crypto.js +5 -0
- package/node_modules/@noble/hashes/crypto.js.map +1 -0
- package/node_modules/@noble/hashes/cryptoNode.d.ts +2 -0
- package/node_modules/@noble/hashes/cryptoNode.d.ts.map +1 -0
- package/node_modules/@noble/hashes/cryptoNode.js +18 -0
- package/node_modules/@noble/hashes/cryptoNode.js.map +1 -0
- package/node_modules/@noble/hashes/eskdf.d.ts +47 -0
- package/node_modules/@noble/hashes/eskdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/eskdf.js +166 -0
- package/node_modules/@noble/hashes/eskdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_assert.d.ts +17 -0
- package/node_modules/@noble/hashes/esm/_assert.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_assert.js +15 -0
- package/node_modules/@noble/hashes/esm/_assert.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_blake.d.ts +14 -0
- package/node_modules/@noble/hashes/esm/_blake.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_blake.js +45 -0
- package/node_modules/@noble/hashes/esm/_blake.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_md.d.ts +51 -0
- package/node_modules/@noble/hashes/esm/_md.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_md.js +155 -0
- package/node_modules/@noble/hashes/esm/_md.js.map +1 -0
- package/node_modules/@noble/hashes/esm/_u64.d.ts +55 -0
- package/node_modules/@noble/hashes/esm/_u64.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/_u64.js +67 -0
- package/node_modules/@noble/hashes/esm/_u64.js.map +1 -0
- package/node_modules/@noble/hashes/esm/argon2.d.ts +32 -0
- package/node_modules/@noble/hashes/esm/argon2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/argon2.js +392 -0
- package/node_modules/@noble/hashes/esm/argon2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake1.d.ts +106 -0
- package/node_modules/@noble/hashes/esm/blake1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake1.js +452 -0
- package/node_modules/@noble/hashes/esm/blake1.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2.d.ts +116 -0
- package/node_modules/@noble/hashes/esm/blake2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2.js +413 -0
- package/node_modules/@noble/hashes/esm/blake2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2b.d.ts +11 -0
- package/node_modules/@noble/hashes/esm/blake2b.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2b.js +11 -0
- package/node_modules/@noble/hashes/esm/blake2b.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2s.d.ts +20 -0
- package/node_modules/@noble/hashes/esm/blake2s.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake2s.js +21 -0
- package/node_modules/@noble/hashes/esm/blake2s.js.map +1 -0
- package/node_modules/@noble/hashes/esm/blake3.d.ts +54 -0
- package/node_modules/@noble/hashes/esm/blake3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/blake3.js +251 -0
- package/node_modules/@noble/hashes/esm/blake3.js.map +1 -0
- package/node_modules/@noble/hashes/esm/crypto.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/crypto.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/crypto.js +2 -0
- package/node_modules/@noble/hashes/esm/crypto.js.map +1 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.js +15 -0
- package/node_modules/@noble/hashes/esm/cryptoNode.js.map +1 -0
- package/node_modules/@noble/hashes/esm/eskdf.d.ts +47 -0
- package/node_modules/@noble/hashes/esm/eskdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/eskdf.js +160 -0
- package/node_modules/@noble/hashes/esm/eskdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/hkdf.d.ts +36 -0
- package/node_modules/@noble/hashes/esm/hkdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/hkdf.js +82 -0
- package/node_modules/@noble/hashes/esm/hkdf.js.map +1 -0
- package/node_modules/@noble/hashes/esm/hmac.d.ts +35 -0
- package/node_modules/@noble/hashes/esm/hmac.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/hmac.js +86 -0
- package/node_modules/@noble/hashes/esm/hmac.js.map +1 -0
- package/node_modules/@noble/hashes/esm/index.d.ts +2 -0
- package/node_modules/@noble/hashes/esm/index.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/index.js +33 -0
- package/node_modules/@noble/hashes/esm/index.js.map +1 -0
- package/node_modules/@noble/hashes/esm/legacy.d.ts +71 -0
- package/node_modules/@noble/hashes/esm/legacy.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/legacy.js +281 -0
- package/node_modules/@noble/hashes/esm/legacy.js.map +1 -0
- package/node_modules/@noble/hashes/esm/package.json +10 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.d.ts +23 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.js +97 -0
- package/node_modules/@noble/hashes/esm/pbkdf2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/ripemd160.d.ts +13 -0
- package/node_modules/@noble/hashes/esm/ripemd160.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/ripemd160.js +13 -0
- package/node_modules/@noble/hashes/esm/ripemd160.js.map +1 -0
- package/node_modules/@noble/hashes/esm/scrypt.d.ts +34 -0
- package/node_modules/@noble/hashes/esm/scrypt.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/scrypt.js +228 -0
- package/node_modules/@noble/hashes/esm/scrypt.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha1.d.ts +11 -0
- package/node_modules/@noble/hashes/esm/sha1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha1.js +11 -0
- package/node_modules/@noble/hashes/esm/sha1.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha2.d.ts +159 -0
- package/node_modules/@noble/hashes/esm/sha2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha2.js +375 -0
- package/node_modules/@noble/hashes/esm/sha2.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha256.d.ts +20 -0
- package/node_modules/@noble/hashes/esm/sha256.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha256.js +20 -0
- package/node_modules/@noble/hashes/esm/sha256.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.d.ts +142 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.js +393 -0
- package/node_modules/@noble/hashes/esm/sha3-addons.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3.d.ts +53 -0
- package/node_modules/@noble/hashes/esm/sha3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha3.js +234 -0
- package/node_modules/@noble/hashes/esm/sha3.js.map +1 -0
- package/node_modules/@noble/hashes/esm/sha512.d.ts +26 -0
- package/node_modules/@noble/hashes/esm/sha512.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/sha512.js +26 -0
- package/node_modules/@noble/hashes/esm/sha512.js.map +1 -0
- package/node_modules/@noble/hashes/esm/utils.d.ts +161 -0
- package/node_modules/@noble/hashes/esm/utils.d.ts.map +1 -0
- package/node_modules/@noble/hashes/esm/utils.js +281 -0
- package/node_modules/@noble/hashes/esm/utils.js.map +1 -0
- package/node_modules/@noble/hashes/hkdf.d.ts +36 -0
- package/node_modules/@noble/hashes/hkdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/hkdf.js +88 -0
- package/node_modules/@noble/hashes/hkdf.js.map +1 -0
- package/node_modules/@noble/hashes/hmac.d.ts +35 -0
- package/node_modules/@noble/hashes/hmac.d.ts.map +1 -0
- package/node_modules/@noble/hashes/hmac.js +91 -0
- package/node_modules/@noble/hashes/hmac.js.map +1 -0
- package/node_modules/@noble/hashes/index.d.ts +1 -0
- package/node_modules/@noble/hashes/index.d.ts.map +1 -0
- package/node_modules/@noble/hashes/index.js +33 -0
- package/node_modules/@noble/hashes/index.js.map +1 -0
- package/node_modules/@noble/hashes/legacy.d.ts +71 -0
- package/node_modules/@noble/hashes/legacy.d.ts.map +1 -0
- package/node_modules/@noble/hashes/legacy.js +287 -0
- package/node_modules/@noble/hashes/legacy.js.map +1 -0
- package/node_modules/@noble/hashes/package.json +266 -0
- package/node_modules/@noble/hashes/pbkdf2.d.ts +23 -0
- package/node_modules/@noble/hashes/pbkdf2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/pbkdf2.js +101 -0
- package/node_modules/@noble/hashes/pbkdf2.js.map +1 -0
- package/node_modules/@noble/hashes/ripemd160.d.ts +13 -0
- package/node_modules/@noble/hashes/ripemd160.d.ts.map +1 -0
- package/node_modules/@noble/hashes/ripemd160.js +16 -0
- package/node_modules/@noble/hashes/ripemd160.js.map +1 -0
- package/node_modules/@noble/hashes/scrypt.d.ts +34 -0
- package/node_modules/@noble/hashes/scrypt.d.ts.map +1 -0
- package/node_modules/@noble/hashes/scrypt.js +232 -0
- package/node_modules/@noble/hashes/scrypt.js.map +1 -0
- package/node_modules/@noble/hashes/sha1.d.ts +11 -0
- package/node_modules/@noble/hashes/sha1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha1.js +14 -0
- package/node_modules/@noble/hashes/sha1.js.map +1 -0
- package/node_modules/@noble/hashes/sha2.d.ts +159 -0
- package/node_modules/@noble/hashes/sha2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha2.js +384 -0
- package/node_modules/@noble/hashes/sha2.js.map +1 -0
- package/node_modules/@noble/hashes/sha256.d.ts +20 -0
- package/node_modules/@noble/hashes/sha256.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha256.js +23 -0
- package/node_modules/@noble/hashes/sha256.js.map +1 -0
- package/node_modules/@noble/hashes/sha3-addons.d.ts +142 -0
- package/node_modules/@noble/hashes/sha3-addons.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha3-addons.js +402 -0
- package/node_modules/@noble/hashes/sha3-addons.js.map +1 -0
- package/node_modules/@noble/hashes/sha3.d.ts +53 -0
- package/node_modules/@noble/hashes/sha3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha3.js +239 -0
- package/node_modules/@noble/hashes/sha3.js.map +1 -0
- package/node_modules/@noble/hashes/sha512.d.ts +26 -0
- package/node_modules/@noble/hashes/sha512.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha512.js +29 -0
- package/node_modules/@noble/hashes/sha512.js.map +1 -0
- package/node_modules/@noble/hashes/src/_assert.ts +22 -0
- package/node_modules/@noble/hashes/src/_blake.ts +50 -0
- package/node_modules/@noble/hashes/src/_md.ts +176 -0
- package/node_modules/@noble/hashes/src/_u64.ts +91 -0
- package/node_modules/@noble/hashes/src/argon2.ts +497 -0
- package/node_modules/@noble/hashes/src/blake1.ts +534 -0
- package/node_modules/@noble/hashes/src/blake2.ts +486 -0
- package/node_modules/@noble/hashes/src/blake2b.ts +10 -0
- package/node_modules/@noble/hashes/src/blake2s.ts +20 -0
- package/node_modules/@noble/hashes/src/blake3.ts +272 -0
- package/node_modules/@noble/hashes/src/crypto.ts +9 -0
- package/node_modules/@noble/hashes/src/cryptoNode.ts +15 -0
- package/node_modules/@noble/hashes/src/eskdf.ts +187 -0
- package/node_modules/@noble/hashes/src/hkdf.ts +88 -0
- package/node_modules/@noble/hashes/src/hmac.ts +94 -0
- package/node_modules/@noble/hashes/src/index.ts +31 -0
- package/node_modules/@noble/hashes/src/legacy.ts +293 -0
- package/node_modules/@noble/hashes/src/pbkdf2.ts +122 -0
- package/node_modules/@noble/hashes/src/ripemd160.ts +12 -0
- package/node_modules/@noble/hashes/src/scrypt.ts +257 -0
- package/node_modules/@noble/hashes/src/sha1.ts +10 -0
- package/node_modules/@noble/hashes/src/sha2.ts +402 -0
- package/node_modules/@noble/hashes/src/sha256.ts +24 -0
- package/node_modules/@noble/hashes/src/sha3-addons.ts +499 -0
- package/node_modules/@noble/hashes/src/sha3.ts +258 -0
- package/node_modules/@noble/hashes/src/sha512.ts +34 -0
- package/node_modules/@noble/hashes/src/utils.ts +395 -0
- package/node_modules/@noble/hashes/utils.d.ts +161 -0
- package/node_modules/@noble/hashes/utils.d.ts.map +1 -0
- package/node_modules/@noble/hashes/utils.js +313 -0
- package/node_modules/@noble/hashes/utils.js.map +1 -0
- package/package.json +203 -0
- package/schemas/catalog.schema.json +283 -0
- package/src/align.ts +235 -0
- package/src/audio-init-parser.ts +189 -0
- package/src/audio-ring-buffer.ts +120 -0
- package/src/authored-timing.ts +63 -0
- package/src/carp-catalog.ts +776 -0
- package/src/catalog-fec-params.ts +167 -0
- package/src/catalog-network-source.ts +49 -0
- package/src/catalog-validator.ts +34 -0
- package/src/cmaf-block-assembler.ts +1058 -0
- package/src/cmaf-group-batcher.ts +104 -0
- package/src/cmcd-producer.ts +329 -0
- package/src/codec-utils.ts +1539 -0
- package/src/fec-codec.ts +61 -0
- package/src/fec-manager.ts +1939 -0
- package/src/fec-starvation-detector.ts +128 -0
- package/src/fec-worker-setup.ts +177 -0
- package/src/fmp4-completion.ts +47 -0
- package/src/fmp4-reader.ts +112 -0
- package/src/index.ts +443 -0
- package/src/iso-bmff-timing.ts +688 -0
- package/src/loc.ts +181 -0
- package/src/manifest-auth-plan.ts +107 -0
- package/src/media-router.ts +1185 -0
- package/src/mfu-reassembler.ts +2842 -0
- package/src/mfu-reassembly-policy.ts +134 -0
- package/src/mmtp-container-parser.ts +1498 -0
- package/src/mmtp-decode-pipeline.ts +315 -0
- package/src/mmtp-router.ts +3027 -0
- package/src/mmtp-to-cmaf.ts +956 -0
- package/src/multicast-auth-catalog.ts +340 -0
- package/src/multicast-input.ts +439 -0
- package/src/multicast-manager.ts +1503 -0
- package/src/multicast-transport.ts +320 -0
- package/src/multicast-unwrap.ts +132 -0
- package/src/no-modules.ts +20 -0
- package/src/phase14-catalog-override.ts +336 -0
- package/src/repair-fetch.ts +217 -0
- package/src/sample-combiner.ts +846 -0
- package/src/signaling.ts +78 -0
- package/src/source-auth.ts +1 -0
- package/src/switching-set-alignment.ts +109 -0
- package/src/timestamp-codec.ts +265 -0
- package/src/track-pipeline-setup.ts +189 -0
- package/src/track-pipeline.ts +332 -0
- package/src/track-session.ts +778 -0
- package/src/transport-pool.ts +128 -0
- package/src/wasm-mfu-reassembler.ts +372 -0
- package/src/wasm-mmtp-container-parser.ts +23 -0
- package/test-vectors/align.json +199 -0
- package/test-vectors/catalog/README.md +25 -0
- package/test-vectors/catalog/negative/legacy-selection-params.json +15 -0
- package/test-vectors/catalog/negative/missing-mmtp-fields.json +12 -0
- package/test-vectors/catalog/negative/multicast-auth-padded-key.json +37 -0
- package/test-vectors/catalog/negative/multicast-auth-reused-track-format.json +53 -0
- package/test-vectors/catalog/negative/multicast-auth-trailing-pad-bits.json +37 -0
- package/test-vectors/catalog/negative/multicast-endpoint-missing-protocol-and-source.json +24 -0
- package/test-vectors/catalog/negative/network-source-object.json +25 -0
- package/test-vectors/catalog/negative/raptorq-unaligned-symbol.json +26 -0
- package/test-vectors/catalog/negative/repair-track-legacy-shape.json +18 -0
- package/test-vectors/catalog/negative/track-role-empty.json +16 -0
- package/test-vectors/catalog/negative/track-role-non-string.json +16 -0
- package/test-vectors/catalog/positive/fec-multicast.json +51 -0
- package/test-vectors/catalog/positive/flat-av.json +30 -0
- package/test-vectors/catalog/positive/multicast-auth-rotation.json +55 -0
- package/test-vectors/catalog/positive/ticks-and-mixed-timescales.json +39 -0
- package/test-vectors/catalog/positive/track-role.json +49 -0
- package/test-vectors/catalog/releases/moqcast-native-v16-v1/catalog.json +65 -0
- package/test-vectors/catalog/releases/moqcast-native-v16-v1.archive.sha256 +1 -0
- package/test-vectors/catalog-multicast-auth-v1.json +26 -0
- package/test-vectors/catalog-validation.json +148 -0
- package/test-vectors/catalog-validator-public-api.mjs +25 -0
- package/test-vectors/generate-source-auth-fixture.mjs +114 -0
- package/test-vectors/source-auth-v1.json +61 -0
- package/test-vectors/subsample-placement-v1.json +230 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../mmt-manifest-verify/node_modules/@noble/hashes/src/utils.ts", "../../mmt-manifest-verify/node_modules/@noble/hashes/src/_md.ts", "../../mmt-manifest-verify/node_modules/@noble/hashes/src/_u64.ts", "../../mmt-manifest-verify/node_modules/@noble/hashes/src/_blake.ts", "../../mmt-manifest-verify/node_modules/@noble/hashes/src/blake2.ts", "../../mmt-manifest-verify/node_modules/@noble/hashes/src/blake3.ts", "../../mmt-manifest-verify/src/source-auth.ts", "../../mmt-manifest-verify/src/admission.ts", "../../mmt-manifest-verify/src/verifier.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number): void {\n if (!Number.isSafeInteger(n) || n < 0) throw new Error('positive integer expected, got ' + n);\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n if (!isBytes(b)) throw new Error('Uint8Array expected');\n if (lengths.length > 0 && !lengths.includes(b.length))\n throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\n/** Asserts something is hash */\nexport function ahash(h: IHash): void {\n if (typeof h !== 'function' || typeof h.create !== 'function')\n throw new Error('Hash should be wrapped by utils.createHasher');\n anumber(h.outputLen);\n anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n abytes(out);\n const min = instance.outputLen;\n if (out.length < min) {\n throw new Error('digestInto() expects output buffer of length at least ' + min);\n }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n for (let i = 0; i < arrays.length; i++) {\n arrays[i].fill(0);\n }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n return (\n ((word << 24) & 0xff000000) |\n ((word << 8) & 0xff0000) |\n ((word >>> 8) & 0xff00) |\n ((word >>> 24) & 0xff)\n );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n ? (n: number) => n\n : (n: number) => byteSwap(n);\n\n/** @deprecated */\nexport const byteSwapIfBE: typeof swap8IfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n for (let i = 0; i < arr.length; i++) {\n arr[i] = byteSwap(arr[i]);\n }\n return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n ? (u: Uint32Array) => u\n : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n // @ts-ignore\n typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n abytes(bytes);\n // @ts-ignore\n if (hasHexBuiltin) return bytes.toHex();\n // pre-caching improves the speed 6x\n let hex = '';\n for (let i = 0; i < bytes.length; i++) {\n hex += hexes[bytes[i]];\n }\n return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n // @ts-ignore\n if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n const hl = hex.length;\n const al = hl / 2;\n if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n const array = new Uint8Array(al);\n for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n const n1 = asciiToBase16(hex.charCodeAt(hi));\n const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n if (n1 === undefined || n2 === undefined) {\n const char = hex[hi] + hex[hi + 1];\n throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n }\n array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n }\n return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n iters: number,\n tick: number,\n cb: (i: number) => void\n): Promise<void> {\n let ts = Date.now();\n for (let i = 0; i < iters; i++) {\n cb(i);\n // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n const diff = Date.now() - ts;\n if (diff >= 0 && diff < tick) continue;\n await nextTick();\n ts += diff;\n }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n if (typeof str !== 'string') throw new Error('string expected');\n return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n return new TextDecoder().decode(bytes);\n}\n\n/** Accepted input of hash functions. Strings are converted to byte arrays. */\nexport type Input = string | Uint8Array;\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data: Input): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput): Uint8Array {\n if (typeof data === 'string') data = utf8ToBytes(data);\n abytes(data);\n return data;\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n let sum = 0;\n for (let i = 0; i < arrays.length; i++) {\n const a = arrays[i];\n abytes(a);\n sum += a.length;\n }\n const res = new Uint8Array(sum);\n for (let i = 0, pad = 0; i < arrays.length; i++) {\n const a = arrays[i];\n res.set(a, pad);\n pad += a.length;\n }\n return res;\n}\n\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n defaults: T1,\n opts?: T2\n): T1 & T2 {\n if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n throw new Error('options should be object or undefined');\n const merged = Object.assign(defaults, opts);\n return merged as T1 & T2;\n}\n\n/** Hash interface. */\nexport type IHash = {\n (data: Uint8Array): Uint8Array;\n blockLen: number;\n outputLen: number;\n create: any;\n};\n\n/** For runtime check if class implements interface */\nexport abstract class Hash<T extends Hash<T>> {\n abstract blockLen: number; // Bytes per block\n abstract outputLen: number; // Bytes in output\n abstract update(buf: Input): this;\n // Writes digest into buf\n abstract digestInto(buf: Uint8Array): void;\n abstract digest(): Uint8Array;\n /**\n * Resets internal state. Makes Hash instance unusable.\n * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n * by user, they will need to manually call `destroy()` when zeroing is necessary.\n */\n abstract destroy(): void;\n /**\n * Clones hash instance. Unsafe: doesn't check whether `to` is valid. Can be used as `clone()`\n * when no options are passed.\n * Reasons to use `_cloneInto` instead of clone: 1) performance 2) reuse instance => all internal\n * buffers are overwritten => causes buffer overwrite which is used for digest in some cases.\n * There are no guarantees for clean-up because it's impossible in JS.\n */\n abstract _cloneInto(to?: T): T;\n // Safe version that clones internal state\n abstract clone(): T;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash function */\nexport type CHash = ReturnType<typeof createHasher>;\n/** Hash function with output */\nexport type CHashO = ReturnType<typeof createOptHasher>;\n/** XOF with output */\nexport type CHashXO = ReturnType<typeof createXOFer>;\n\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher<T extends Hash<T>>(\n hashCons: () => Hash<T>\n): {\n (msg: Input): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(): Hash<T>;\n} {\n const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest();\n const tmp = hashCons();\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = () => hashCons();\n return hashC;\n}\n\nexport function createOptHasher<H extends Hash<H>, T extends Object>(\n hashCons: (opts?: T) => Hash<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): Hash<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\n\nexport function createXOFer<H extends HashXOF<H>, T extends Object>(\n hashCons: (opts?: T) => HashXOF<H>\n): {\n (msg: Input, opts?: T): Uint8Array;\n outputLen: number;\n blockLen: number;\n create(opts?: T): HashXOF<H>;\n} {\n const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n const tmp = hashCons({} as T);\n hashC.outputLen = tmp.outputLen;\n hashC.blockLen = tmp.blockLen;\n hashC.create = (opts?: T) => hashCons(opts);\n return hashC;\n}\nexport const wrapConstructor: typeof createHasher = createHasher;\nexport const wrapConstructorWithOpts: typeof createOptHasher = createOptHasher;\nexport const wrapXOFConstructorWithOpts: typeof createXOFer = createXOFer;\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n if (crypto && typeof crypto.getRandomValues === 'function') {\n return crypto.getRandomValues(new Uint8Array(bytesLength));\n }\n // Legacy Node.js compatibility\n if (crypto && typeof crypto.randomBytes === 'function') {\n return Uint8Array.from(crypto.randomBytes(bytesLength));\n }\n throw new Error('crypto.getRandomValues must be defined');\n}\n", "/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { type Input, Hash, abytes, aexists, aoutput, clean, createView, toBytes } from './utils.ts';\n\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nexport function setBigUint64(\n view: DataView,\n byteOffset: number,\n value: bigint,\n isLE: boolean\n): void {\n if (typeof view.setBigUint64 === 'function') return view.setBigUint64(byteOffset, value, isLE);\n const _32n = BigInt(32);\n const _u32_max = BigInt(0xffffffff);\n const wh = Number((value >> _32n) & _u32_max);\n const wl = Number(value & _u32_max);\n const h = isLE ? 4 : 0;\n const l = isLE ? 0 : 4;\n view.setUint32(byteOffset + h, wh, isLE);\n view.setUint32(byteOffset + l, wl, isLE);\n}\n\n/** Choice: a ? b : c */\nexport function Chi(a: number, b: number, c: number): number {\n return (a & b) ^ (~a & c);\n}\n\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a: number, b: number, c: number): number {\n return (a & b) ^ (a & c) ^ (b & c);\n}\n\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport abstract class HashMD<T extends HashMD<T>> extends Hash<T> {\n protected abstract process(buf: DataView, offset: number): void;\n protected abstract get(): number[];\n protected abstract set(...args: number[]): void;\n abstract destroy(): void;\n protected abstract roundClean(): void;\n\n readonly blockLen: number;\n readonly outputLen: number;\n readonly padOffset: number;\n readonly isLE: boolean;\n\n // For partial updates less than block size\n protected buffer: Uint8Array;\n protected view: DataView;\n protected finished = false;\n protected length = 0;\n protected pos = 0;\n protected destroyed = false;\n\n constructor(blockLen: number, outputLen: number, padOffset: number, isLE: boolean) {\n super();\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.padOffset = padOffset;\n this.isLE = isLE;\n this.buffer = new Uint8Array(blockLen);\n this.view = createView(this.buffer);\n }\n update(data: Input): this {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n const { view, buffer, blockLen } = this;\n const len = data.length;\n for (let pos = 0; pos < len; ) {\n const take = Math.min(blockLen - this.pos, len - pos);\n // Fast path: we have at least one block in input, cast it to view and process\n if (take === blockLen) {\n const dataView = createView(data);\n for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n pos += take;\n if (this.pos === blockLen) {\n this.process(view, 0);\n this.pos = 0;\n }\n }\n this.length += data.length;\n this.roundClean();\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n aoutput(out, this);\n this.finished = true;\n // Padding\n // We can avoid allocation of buffer for padding completely if it\n // was previously not allocated here. But it won't change performance.\n const { buffer, view, blockLen, isLE } = this;\n let { pos } = this;\n // append the bit '1' to the message\n buffer[pos++] = 0b10000000;\n clean(this.buffer.subarray(pos));\n // we have less than padOffset left in buffer, so we cannot put length in\n // current block, need process it and pad again\n if (this.padOffset > blockLen - pos) {\n this.process(view, 0);\n pos = 0;\n }\n // Pad until full block byte with zeros\n for (let i = pos; i < blockLen; i++) buffer[i] = 0;\n // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n // So we just write lowest 64 bits of that value.\n setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n this.process(view, 0);\n const oview = createView(out);\n const len = this.outputLen;\n // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n if (len % 4) throw new Error('_sha2: outputLen should be aligned to 32bit');\n const outLen = len / 4;\n const state = this.get();\n if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state');\n for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE);\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to?: T): T {\n to ||= new (this.constructor as any)() as T;\n to.set(...this.get());\n const { blockLen, buffer, length, finished, destroyed, pos } = this;\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n if (length % blockLen) to.buffer.set(buffer);\n return to;\n }\n clone(): T {\n return this._cloneInto();\n }\n}\n\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n 0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n 0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n 0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n", "/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\nfunction fromBig(\n n: bigint,\n le = false\n): {\n h: number;\n l: number;\n} {\n if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false): Uint32Array[] {\n const len = lst.length;\n let Ah = new Uint32Array(len);\n let Al = new Uint32Array(len);\n for (let i = 0; i < len; i++) {\n const { h, l } = fromBig(lst[i], le);\n [Ah[i], Al[i]] = [h, l];\n }\n return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number): bigint => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number): number => h >>> s;\nconst shrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number): number => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number): number => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number): number => l;\nconst rotr32L = (h: number, _l: number): number => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number): number => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number): number => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number): number => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number): number => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(\n Ah: number,\n Al: number,\n Bh: number,\n Bl: number\n): {\n h: number;\n l: number;\n} {\n const l = (Al >>> 0) + (Bl >>> 0);\n return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number): number => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number): number =>\n (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number): number =>\n (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number): number =>\n (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig\n};\n// prettier-ignore\nconst u64: { fromBig: typeof fromBig; split: typeof split; toBig: (h: number, l: number) => bigint; shrSH: (h: number, _l: number, s: number) => number; shrSL: (h: number, l: number, s: number) => number; rotrSH: (h: number, l: number, s: number) => number; rotrSL: (h: number, l: number, s: number) => number; rotrBH: (h: number, l: number, s: number) => number; rotrBL: (h: number, l: number, s: number) => number; rotr32H: (_h: number, l: number) => number; rotr32L: (h: number, _l: number) => number; rotlSH: (h: number, l: number, s: number) => number; rotlSL: (h: number, l: number, s: number) => number; rotlBH: (h: number, l: number, s: number) => number; rotlBL: (h: number, l: number, s: number) => number; add: typeof add; add3L: (Al: number, Bl: number, Cl: number) => number; add3H: (low: number, Ah: number, Bh: number, Ch: number) => number; add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number; add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number; add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number; add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number; } = {\n fromBig, split, toBig,\n shrSH, shrSL,\n rotrSH, rotrSL, rotrBH, rotrBL,\n rotr32H, rotr32L,\n rotlSH, rotlSL, rotlBH, rotlBL,\n add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n", "/**\n * Internal helpers for blake hash.\n * @module\n */\nimport { rotr } from './utils.ts';\n\n/**\n * Internal blake variable.\n * For BLAKE2b, the two extra permutations for rounds 10 and 11 are SIGMA[10..11] = SIGMA[0..1].\n */\n// prettier-ignore\nexport const BSIGMA: Uint8Array = /* @__PURE__ */ Uint8Array.from([\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3,\n 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4,\n 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8,\n 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13,\n 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9,\n 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11,\n 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10,\n 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5,\n 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0,\n 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3,\n // Blake1, unused in others\n 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4,\n 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8,\n 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13,\n 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9,\n]);\n\n// prettier-ignore\nexport type Num4 = { a: number; b: number; c: number; d: number; };\n\n// Mixing function G splitted in two halfs\nexport function G1s(a: number, b: number, c: number, d: number, x: number): Num4 {\n a = (a + b + x) | 0;\n d = rotr(d ^ a, 16);\n c = (c + d) | 0;\n b = rotr(b ^ c, 12);\n return { a, b, c, d };\n}\n\nexport function G2s(a: number, b: number, c: number, d: number, x: number): Num4 {\n a = (a + b + x) | 0;\n d = rotr(d ^ a, 8);\n c = (c + d) | 0;\n b = rotr(b ^ c, 7);\n return { a, b, c, d };\n}\n", "/**\n * blake2b (64-bit) & blake2s (8 to 32-bit) hash functions.\n * b could have been faster, but there is no fast u64 in js, so s is 1.5x faster.\n * @module\n */\nimport { BSIGMA, G1s, G2s } from './_blake.ts';\nimport { SHA256_IV } from './_md.ts';\nimport * as u64 from './_u64.ts';\n// prettier-ignore\nimport {\n abytes, aexists, anumber, aoutput,\n clean, createOptHasher, Hash, swap32IfBE, swap8IfBE, toBytes, u32,\n type CHashO, type Input\n} from './utils.ts';\n\n/** Blake hash options. dkLen is output length. key is used in MAC mode. salt is used in KDF mode. */\nexport type Blake2Opts = {\n dkLen?: number;\n key?: Input;\n salt?: Input;\n personalization?: Input;\n};\n\n// Same as SHA512_IV, but swapped endianness: LE instead of BE. iv[1] is iv[0], etc.\nconst B2B_IV = /* @__PURE__ */ Uint32Array.from([\n 0xf3bcc908, 0x6a09e667, 0x84caa73b, 0xbb67ae85, 0xfe94f82b, 0x3c6ef372, 0x5f1d36f1, 0xa54ff53a,\n 0xade682d1, 0x510e527f, 0x2b3e6c1f, 0x9b05688c, 0xfb41bd6b, 0x1f83d9ab, 0x137e2179, 0x5be0cd19,\n]);\n// Temporary buffer\nconst BBUF = /* @__PURE__ */ new Uint32Array(32);\n\n// Mixing function G splitted in two halfs\nfunction G1b(a: number, b: number, c: number, d: number, msg: Uint32Array, x: number) {\n // NOTE: V is LE here\n const Xl = msg[x], Xh = msg[x + 1]; // prettier-ignore\n let Al = BBUF[2 * a], Ah = BBUF[2 * a + 1]; // prettier-ignore\n let Bl = BBUF[2 * b], Bh = BBUF[2 * b + 1]; // prettier-ignore\n let Cl = BBUF[2 * c], Ch = BBUF[2 * c + 1]; // prettier-ignore\n let Dl = BBUF[2 * d], Dh = BBUF[2 * d + 1]; // prettier-ignore\n // v[a] = (v[a] + v[b] + x) | 0;\n let ll = u64.add3L(Al, Bl, Xl);\n Ah = u64.add3H(ll, Ah, Bh, Xh);\n Al = ll | 0;\n // v[d] = rotr(v[d] ^ v[a], 32)\n ({ Dh, Dl } = { Dh: Dh ^ Ah, Dl: Dl ^ Al });\n ({ Dh, Dl } = { Dh: u64.rotr32H(Dh, Dl), Dl: u64.rotr32L(Dh, Dl) });\n // v[c] = (v[c] + v[d]) | 0;\n ({ h: Ch, l: Cl } = u64.add(Ch, Cl, Dh, Dl));\n // v[b] = rotr(v[b] ^ v[c], 24)\n ({ Bh, Bl } = { Bh: Bh ^ Ch, Bl: Bl ^ Cl });\n ({ Bh, Bl } = { Bh: u64.rotrSH(Bh, Bl, 24), Bl: u64.rotrSL(Bh, Bl, 24) });\n (BBUF[2 * a] = Al), (BBUF[2 * a + 1] = Ah);\n (BBUF[2 * b] = Bl), (BBUF[2 * b + 1] = Bh);\n (BBUF[2 * c] = Cl), (BBUF[2 * c + 1] = Ch);\n (BBUF[2 * d] = Dl), (BBUF[2 * d + 1] = Dh);\n}\n\nfunction G2b(a: number, b: number, c: number, d: number, msg: Uint32Array, x: number) {\n // NOTE: V is LE here\n const Xl = msg[x], Xh = msg[x + 1]; // prettier-ignore\n let Al = BBUF[2 * a], Ah = BBUF[2 * a + 1]; // prettier-ignore\n let Bl = BBUF[2 * b], Bh = BBUF[2 * b + 1]; // prettier-ignore\n let Cl = BBUF[2 * c], Ch = BBUF[2 * c + 1]; // prettier-ignore\n let Dl = BBUF[2 * d], Dh = BBUF[2 * d + 1]; // prettier-ignore\n // v[a] = (v[a] + v[b] + x) | 0;\n let ll = u64.add3L(Al, Bl, Xl);\n Ah = u64.add3H(ll, Ah, Bh, Xh);\n Al = ll | 0;\n // v[d] = rotr(v[d] ^ v[a], 16)\n ({ Dh, Dl } = { Dh: Dh ^ Ah, Dl: Dl ^ Al });\n ({ Dh, Dl } = { Dh: u64.rotrSH(Dh, Dl, 16), Dl: u64.rotrSL(Dh, Dl, 16) });\n // v[c] = (v[c] + v[d]) | 0;\n ({ h: Ch, l: Cl } = u64.add(Ch, Cl, Dh, Dl));\n // v[b] = rotr(v[b] ^ v[c], 63)\n ({ Bh, Bl } = { Bh: Bh ^ Ch, Bl: Bl ^ Cl });\n ({ Bh, Bl } = { Bh: u64.rotrBH(Bh, Bl, 63), Bl: u64.rotrBL(Bh, Bl, 63) });\n (BBUF[2 * a] = Al), (BBUF[2 * a + 1] = Ah);\n (BBUF[2 * b] = Bl), (BBUF[2 * b + 1] = Bh);\n (BBUF[2 * c] = Cl), (BBUF[2 * c + 1] = Ch);\n (BBUF[2 * d] = Dl), (BBUF[2 * d + 1] = Dh);\n}\n\nfunction checkBlake2Opts(\n outputLen: number,\n opts: Blake2Opts | undefined = {},\n keyLen: number,\n saltLen: number,\n persLen: number\n) {\n anumber(keyLen);\n if (outputLen < 0 || outputLen > keyLen) throw new Error('outputLen bigger than keyLen');\n const { key, salt, personalization } = opts;\n if (key !== undefined && (key.length < 1 || key.length > keyLen))\n throw new Error('key length must be undefined or 1..' + keyLen);\n if (salt !== undefined && salt.length !== saltLen)\n throw new Error('salt must be undefined or ' + saltLen);\n if (personalization !== undefined && personalization.length !== persLen)\n throw new Error('personalization must be undefined or ' + persLen);\n}\n\n/** Class, from which others are subclassed. */\nexport abstract class BLAKE2<T extends BLAKE2<T>> extends Hash<T> {\n protected abstract compress(msg: Uint32Array, offset: number, isLast: boolean): void;\n protected abstract get(): number[];\n protected abstract set(...args: number[]): void;\n abstract destroy(): void;\n protected buffer: Uint8Array;\n protected buffer32: Uint32Array;\n protected finished = false;\n protected destroyed = false;\n protected length: number = 0;\n protected pos: number = 0;\n readonly blockLen: number;\n readonly outputLen: number;\n\n constructor(blockLen: number, outputLen: number) {\n super();\n anumber(blockLen);\n anumber(outputLen);\n this.blockLen = blockLen;\n this.outputLen = outputLen;\n this.buffer = new Uint8Array(blockLen);\n this.buffer32 = u32(this.buffer);\n }\n update(data: Input): this {\n aexists(this);\n data = toBytes(data);\n abytes(data);\n // Main difference with other hashes: there is flag for last block,\n // so we cannot process current block before we know that there\n // is the next one. This significantly complicates logic and reduces ability\n // to do zero-copy processing\n const { blockLen, buffer, buffer32 } = this;\n const len = data.length;\n const offset = data.byteOffset;\n const buf = data.buffer;\n for (let pos = 0; pos < len; ) {\n // If buffer is full and we still have input (don't process last block, same as blake2s)\n if (this.pos === blockLen) {\n swap32IfBE(buffer32);\n this.compress(buffer32, 0, false);\n swap32IfBE(buffer32);\n this.pos = 0;\n }\n const take = Math.min(blockLen - this.pos, len - pos);\n const dataOffset = offset + pos;\n // full block && aligned to 4 bytes && not last in input\n if (take === blockLen && !(dataOffset % 4) && pos + take < len) {\n const data32 = new Uint32Array(buf, dataOffset, Math.floor((len - pos) / 4));\n swap32IfBE(data32);\n for (let pos32 = 0; pos + blockLen < len; pos32 += buffer32.length, pos += blockLen) {\n this.length += blockLen;\n this.compress(data32, pos32, false);\n }\n swap32IfBE(data32);\n continue;\n }\n buffer.set(data.subarray(pos, pos + take), this.pos);\n this.pos += take;\n this.length += take;\n pos += take;\n }\n return this;\n }\n digestInto(out: Uint8Array): void {\n aexists(this);\n aoutput(out, this);\n const { pos, buffer32 } = this;\n this.finished = true;\n // Padding\n clean(this.buffer.subarray(pos));\n swap32IfBE(buffer32);\n this.compress(buffer32, 0, true);\n swap32IfBE(buffer32);\n const out32 = u32(out);\n this.get().forEach((v, i) => (out32[i] = swap8IfBE(v)));\n }\n digest(): Uint8Array {\n const { buffer, outputLen } = this;\n this.digestInto(buffer);\n const res = buffer.slice(0, outputLen);\n this.destroy();\n return res;\n }\n _cloneInto(to?: T): T {\n const { buffer, length, finished, destroyed, outputLen, pos } = this;\n to ||= new (this.constructor as any)({ dkLen: outputLen }) as T;\n to.set(...this.get());\n to.buffer.set(buffer);\n to.destroyed = destroyed;\n to.finished = finished;\n to.length = length;\n to.pos = pos;\n // @ts-ignore\n to.outputLen = outputLen;\n return to;\n }\n clone(): T {\n return this._cloneInto();\n }\n}\n\nexport class BLAKE2b extends BLAKE2<BLAKE2b> {\n // Same as SHA-512, but LE\n private v0l = B2B_IV[0] | 0;\n private v0h = B2B_IV[1] | 0;\n private v1l = B2B_IV[2] | 0;\n private v1h = B2B_IV[3] | 0;\n private v2l = B2B_IV[4] | 0;\n private v2h = B2B_IV[5] | 0;\n private v3l = B2B_IV[6] | 0;\n private v3h = B2B_IV[7] | 0;\n private v4l = B2B_IV[8] | 0;\n private v4h = B2B_IV[9] | 0;\n private v5l = B2B_IV[10] | 0;\n private v5h = B2B_IV[11] | 0;\n private v6l = B2B_IV[12] | 0;\n private v6h = B2B_IV[13] | 0;\n private v7l = B2B_IV[14] | 0;\n private v7h = B2B_IV[15] | 0;\n\n constructor(opts: Blake2Opts = {}) {\n const olen = opts.dkLen === undefined ? 64 : opts.dkLen;\n super(128, olen);\n checkBlake2Opts(olen, opts, 64, 16, 16);\n let { key, personalization, salt } = opts;\n let keyLength = 0;\n if (key !== undefined) {\n key = toBytes(key);\n keyLength = key.length;\n }\n this.v0l ^= this.outputLen | (keyLength << 8) | (0x01 << 16) | (0x01 << 24);\n if (salt !== undefined) {\n salt = toBytes(salt);\n const slt = u32(salt);\n this.v4l ^= swap8IfBE(slt[0]);\n this.v4h ^= swap8IfBE(slt[1]);\n this.v5l ^= swap8IfBE(slt[2]);\n this.v5h ^= swap8IfBE(slt[3]);\n }\n if (personalization !== undefined) {\n personalization = toBytes(personalization);\n const pers = u32(personalization);\n this.v6l ^= swap8IfBE(pers[0]);\n this.v6h ^= swap8IfBE(pers[1]);\n this.v7l ^= swap8IfBE(pers[2]);\n this.v7h ^= swap8IfBE(pers[3]);\n }\n if (key !== undefined) {\n // Pad to blockLen and update\n const tmp = new Uint8Array(this.blockLen);\n tmp.set(key);\n this.update(tmp);\n }\n }\n // prettier-ignore\n protected get(): [\n number, number, number, number, number, number, number, number,\n number, number, number, number, number, number, number, number\n ] {\n let { v0l, v0h, v1l, v1h, v2l, v2h, v3l, v3h, v4l, v4h, v5l, v5h, v6l, v6h, v7l, v7h } = this;\n return [v0l, v0h, v1l, v1h, v2l, v2h, v3l, v3h, v4l, v4h, v5l, v5h, v6l, v6h, v7l, v7h];\n }\n // prettier-ignore\n protected set(\n v0l: number, v0h: number, v1l: number, v1h: number,\n v2l: number, v2h: number, v3l: number, v3h: number,\n v4l: number, v4h: number, v5l: number, v5h: number,\n v6l: number, v6h: number, v7l: number, v7h: number\n ): void {\n this.v0l = v0l | 0;\n this.v0h = v0h | 0;\n this.v1l = v1l | 0;\n this.v1h = v1h | 0;\n this.v2l = v2l | 0;\n this.v2h = v2h | 0;\n this.v3l = v3l | 0;\n this.v3h = v3h | 0;\n this.v4l = v4l | 0;\n this.v4h = v4h | 0;\n this.v5l = v5l | 0;\n this.v5h = v5h | 0;\n this.v6l = v6l | 0;\n this.v6h = v6h | 0;\n this.v7l = v7l | 0;\n this.v7h = v7h | 0;\n }\n protected compress(msg: Uint32Array, offset: number, isLast: boolean): void {\n this.get().forEach((v, i) => (BBUF[i] = v)); // First half from state.\n BBUF.set(B2B_IV, 16); // Second half from IV.\n let { h, l } = u64.fromBig(BigInt(this.length));\n BBUF[24] = B2B_IV[8] ^ l; // Low word of the offset.\n BBUF[25] = B2B_IV[9] ^ h; // High word.\n // Invert all bits for last block\n if (isLast) {\n BBUF[28] = ~BBUF[28];\n BBUF[29] = ~BBUF[29];\n }\n let j = 0;\n const s = BSIGMA;\n for (let i = 0; i < 12; i++) {\n G1b(0, 4, 8, 12, msg, offset + 2 * s[j++]);\n G2b(0, 4, 8, 12, msg, offset + 2 * s[j++]);\n G1b(1, 5, 9, 13, msg, offset + 2 * s[j++]);\n G2b(1, 5, 9, 13, msg, offset + 2 * s[j++]);\n G1b(2, 6, 10, 14, msg, offset + 2 * s[j++]);\n G2b(2, 6, 10, 14, msg, offset + 2 * s[j++]);\n G1b(3, 7, 11, 15, msg, offset + 2 * s[j++]);\n G2b(3, 7, 11, 15, msg, offset + 2 * s[j++]);\n\n G1b(0, 5, 10, 15, msg, offset + 2 * s[j++]);\n G2b(0, 5, 10, 15, msg, offset + 2 * s[j++]);\n G1b(1, 6, 11, 12, msg, offset + 2 * s[j++]);\n G2b(1, 6, 11, 12, msg, offset + 2 * s[j++]);\n G1b(2, 7, 8, 13, msg, offset + 2 * s[j++]);\n G2b(2, 7, 8, 13, msg, offset + 2 * s[j++]);\n G1b(3, 4, 9, 14, msg, offset + 2 * s[j++]);\n G2b(3, 4, 9, 14, msg, offset + 2 * s[j++]);\n }\n this.v0l ^= BBUF[0] ^ BBUF[16];\n this.v0h ^= BBUF[1] ^ BBUF[17];\n this.v1l ^= BBUF[2] ^ BBUF[18];\n this.v1h ^= BBUF[3] ^ BBUF[19];\n this.v2l ^= BBUF[4] ^ BBUF[20];\n this.v2h ^= BBUF[5] ^ BBUF[21];\n this.v3l ^= BBUF[6] ^ BBUF[22];\n this.v3h ^= BBUF[7] ^ BBUF[23];\n this.v4l ^= BBUF[8] ^ BBUF[24];\n this.v4h ^= BBUF[9] ^ BBUF[25];\n this.v5l ^= BBUF[10] ^ BBUF[26];\n this.v5h ^= BBUF[11] ^ BBUF[27];\n this.v6l ^= BBUF[12] ^ BBUF[28];\n this.v6h ^= BBUF[13] ^ BBUF[29];\n this.v7l ^= BBUF[14] ^ BBUF[30];\n this.v7h ^= BBUF[15] ^ BBUF[31];\n clean(BBUF);\n }\n destroy(): void {\n this.destroyed = true;\n clean(this.buffer32);\n this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n\n/**\n * Blake2b hash function. 64-bit. 1.5x slower than blake2s in JS.\n * @param msg - message that would be hashed\n * @param opts - dkLen output length, key for MAC mode, salt, personalization\n */\nexport const blake2b: CHashO = /* @__PURE__ */ createOptHasher<BLAKE2b, Blake2Opts>(\n (opts) => new BLAKE2b(opts)\n);\n\n// =================\n// Blake2S\n// =================\n\n// prettier-ignore\nexport type Num16 = {\n v0: number; v1: number; v2: number; v3: number;\n v4: number; v5: number; v6: number; v7: number;\n v8: number; v9: number; v10: number; v11: number;\n v12: number; v13: number; v14: number; v15: number;\n};\n\n// prettier-ignore\nexport function compress(s: Uint8Array, offset: number, msg: Uint32Array, rounds: number,\n v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number,\n v8: number, v9: number, v10: number, v11: number, v12: number, v13: number, v14: number, v15: number,\n): Num16 {\n let j = 0;\n for (let i = 0; i < rounds; i++) {\n ({ a: v0, b: v4, c: v8, d: v12 } = G1s(v0, v4, v8, v12, msg[offset + s[j++]]));\n ({ a: v0, b: v4, c: v8, d: v12 } = G2s(v0, v4, v8, v12, msg[offset + s[j++]]));\n ({ a: v1, b: v5, c: v9, d: v13 } = G1s(v1, v5, v9, v13, msg[offset + s[j++]]));\n ({ a: v1, b: v5, c: v9, d: v13 } = G2s(v1, v5, v9, v13, msg[offset + s[j++]]));\n ({ a: v2, b: v6, c: v10, d: v14 } = G1s(v2, v6, v10, v14, msg[offset + s[j++]]));\n ({ a: v2, b: v6, c: v10, d: v14 } = G2s(v2, v6, v10, v14, msg[offset + s[j++]]));\n ({ a: v3, b: v7, c: v11, d: v15 } = G1s(v3, v7, v11, v15, msg[offset + s[j++]]));\n ({ a: v3, b: v7, c: v11, d: v15 } = G2s(v3, v7, v11, v15, msg[offset + s[j++]]));\n\n ({ a: v0, b: v5, c: v10, d: v15 } = G1s(v0, v5, v10, v15, msg[offset + s[j++]]));\n ({ a: v0, b: v5, c: v10, d: v15 } = G2s(v0, v5, v10, v15, msg[offset + s[j++]]));\n ({ a: v1, b: v6, c: v11, d: v12 } = G1s(v1, v6, v11, v12, msg[offset + s[j++]]));\n ({ a: v1, b: v6, c: v11, d: v12 } = G2s(v1, v6, v11, v12, msg[offset + s[j++]]));\n ({ a: v2, b: v7, c: v8, d: v13 } = G1s(v2, v7, v8, v13, msg[offset + s[j++]]));\n ({ a: v2, b: v7, c: v8, d: v13 } = G2s(v2, v7, v8, v13, msg[offset + s[j++]]));\n ({ a: v3, b: v4, c: v9, d: v14 } = G1s(v3, v4, v9, v14, msg[offset + s[j++]]));\n ({ a: v3, b: v4, c: v9, d: v14 } = G2s(v3, v4, v9, v14, msg[offset + s[j++]]));\n }\n return { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15 };\n}\n\nconst B2S_IV = SHA256_IV;\nexport class BLAKE2s extends BLAKE2<BLAKE2s> {\n // Internal state, same as SHA-256\n private v0 = B2S_IV[0] | 0;\n private v1 = B2S_IV[1] | 0;\n private v2 = B2S_IV[2] | 0;\n private v3 = B2S_IV[3] | 0;\n private v4 = B2S_IV[4] | 0;\n private v5 = B2S_IV[5] | 0;\n private v6 = B2S_IV[6] | 0;\n private v7 = B2S_IV[7] | 0;\n\n constructor(opts: Blake2Opts = {}) {\n const olen = opts.dkLen === undefined ? 32 : opts.dkLen;\n super(64, olen);\n checkBlake2Opts(olen, opts, 32, 8, 8);\n let { key, personalization, salt } = opts;\n let keyLength = 0;\n if (key !== undefined) {\n key = toBytes(key);\n keyLength = key.length;\n }\n this.v0 ^= this.outputLen | (keyLength << 8) | (0x01 << 16) | (0x01 << 24);\n if (salt !== undefined) {\n salt = toBytes(salt);\n const slt = u32(salt as Uint8Array);\n this.v4 ^= swap8IfBE(slt[0]);\n this.v5 ^= swap8IfBE(slt[1]);\n }\n if (personalization !== undefined) {\n personalization = toBytes(personalization);\n const pers = u32(personalization as Uint8Array);\n this.v6 ^= swap8IfBE(pers[0]);\n this.v7 ^= swap8IfBE(pers[1]);\n }\n if (key !== undefined) {\n // Pad to blockLen and update\n abytes(key);\n const tmp = new Uint8Array(this.blockLen);\n tmp.set(key);\n this.update(tmp);\n }\n }\n protected get(): [number, number, number, number, number, number, number, number] {\n const { v0, v1, v2, v3, v4, v5, v6, v7 } = this;\n return [v0, v1, v2, v3, v4, v5, v6, v7];\n }\n // prettier-ignore\n protected set(\n v0: number, v1: number, v2: number, v3: number, v4: number, v5: number, v6: number, v7: number\n ): void {\n this.v0 = v0 | 0;\n this.v1 = v1 | 0;\n this.v2 = v2 | 0;\n this.v3 = v3 | 0;\n this.v4 = v4 | 0;\n this.v5 = v5 | 0;\n this.v6 = v6 | 0;\n this.v7 = v7 | 0;\n }\n protected compress(msg: Uint32Array, offset: number, isLast: boolean): void {\n const { h, l } = u64.fromBig(BigInt(this.length));\n // prettier-ignore\n const { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15 } =\n compress(\n BSIGMA, offset, msg, 10,\n this.v0, this.v1, this.v2, this.v3, this.v4, this.v5, this.v6, this.v7,\n B2S_IV[0], B2S_IV[1], B2S_IV[2], B2S_IV[3], l ^ B2S_IV[4], h ^ B2S_IV[5], isLast ? ~B2S_IV[6] : B2S_IV[6], B2S_IV[7]\n );\n this.v0 ^= v0 ^ v8;\n this.v1 ^= v1 ^ v9;\n this.v2 ^= v2 ^ v10;\n this.v3 ^= v3 ^ v11;\n this.v4 ^= v4 ^ v12;\n this.v5 ^= v5 ^ v13;\n this.v6 ^= v6 ^ v14;\n this.v7 ^= v7 ^ v15;\n }\n destroy(): void {\n this.destroyed = true;\n clean(this.buffer32);\n this.set(0, 0, 0, 0, 0, 0, 0, 0);\n }\n}\n\n/**\n * Blake2s hash function. Focuses on 8-bit to 32-bit platforms. 1.5x faster than blake2b in JS.\n * @param msg - message that would be hashed\n * @param opts - dkLen output length, key for MAC mode, salt, personalization\n */\nexport const blake2s: CHashO = /* @__PURE__ */ createOptHasher<BLAKE2s, Blake2Opts>(\n (opts) => new BLAKE2s(opts)\n);\n", "/**\n * Blake3 fast hash is Blake2 with reduced security (round count). Can also be used as MAC & KDF.\n *\n * It is advertised as \"the fastest cryptographic hash\". However, it isn't true in JS.\n * Why is this so slow? While it should be 6x faster than blake2b, perf diff is only 20%:\n *\n * * There is only 30% reduction in number of rounds from blake2s\n * * Speed-up comes from tree structure, which is parallelized using SIMD & threading.\n * These features are not present in JS, so we only get overhead from trees.\n * * Parallelization only happens on 1024-byte chunks: there is no benefit for small inputs.\n * * It is still possible to make it faster using: a) loop unrolling b) web workers c) wasm\n * @module\n */\nimport { SHA256_IV } from './_md.ts';\nimport { fromBig } from './_u64.ts';\nimport { BLAKE2, compress } from './blake2.ts';\n// prettier-ignore\nimport {\n abytes, aexists, anumber, aoutput,\n clean, createXOFer, swap32IfBE, toBytes, u32, u8,\n type CHashXO, type HashXOF, type Input\n} from './utils.ts';\n\n// Flag bitset\nconst B3_Flags = {\n CHUNK_START: 0b1,\n CHUNK_END: 0b10,\n PARENT: 0b100,\n ROOT: 0b1000,\n KEYED_HASH: 0b10000,\n DERIVE_KEY_CONTEXT: 0b100000,\n DERIVE_KEY_MATERIAL: 0b1000000,\n} as const;\n\nconst B3_IV = SHA256_IV.slice();\n\nconst B3_SIGMA: Uint8Array = /* @__PURE__ */ (() => {\n const Id = Array.from({ length: 16 }, (_, i) => i);\n const permute = (arr: number[]) =>\n [2, 6, 3, 10, 7, 0, 4, 13, 1, 11, 12, 5, 9, 14, 15, 8].map((i) => arr[i]);\n const res: number[] = [];\n for (let i = 0, v = Id; i < 7; i++, v = permute(v)) res.push(...v);\n return Uint8Array.from(res);\n})();\n\n/**\n * Ensure to use EITHER `key` OR `context`, not both.\n *\n * * `key`: 32-byte MAC key.\n * * `context`: string for KDF. Should be hardcoded, globally unique, and application - specific.\n * A good default format for the context string is \"[application] [commit timestamp] [purpose]\".\n */\nexport type Blake3Opts = { dkLen?: number; key?: Input; context?: Input };\n\n/** Blake3 hash. Can be used as MAC and KDF. */\nexport class BLAKE3 extends BLAKE2<BLAKE3> implements HashXOF<BLAKE3> {\n private chunkPos = 0; // Position of current block in chunk\n private chunksDone = 0; // How many chunks we already have\n private flags = 0 | 0;\n private IV: Uint32Array;\n private state: Uint32Array;\n private stack: Uint32Array[] = [];\n // Output\n private posOut = 0;\n private bufferOut32 = new Uint32Array(16);\n private bufferOut: Uint8Array;\n private chunkOut = 0; // index of output chunk\n private enableXOF = true;\n\n constructor(opts: Blake3Opts = {}, flags = 0) {\n super(64, opts.dkLen === undefined ? 32 : opts.dkLen);\n const { key, context } = opts;\n const hasContext = context !== undefined;\n if (key !== undefined) {\n if (hasContext) throw new Error('Only \"key\" or \"context\" can be specified at same time');\n const k = toBytes(key).slice();\n abytes(k, 32);\n this.IV = u32(k);\n swap32IfBE(this.IV);\n this.flags = flags | B3_Flags.KEYED_HASH;\n } else if (hasContext) {\n const ctx = toBytes(context);\n const contextKey = new BLAKE3({ dkLen: 32 }, B3_Flags.DERIVE_KEY_CONTEXT)\n .update(ctx)\n .digest();\n this.IV = u32(contextKey);\n swap32IfBE(this.IV);\n this.flags = flags | B3_Flags.DERIVE_KEY_MATERIAL;\n } else {\n this.IV = B3_IV.slice();\n this.flags = flags;\n }\n this.state = this.IV.slice();\n this.bufferOut = u8(this.bufferOut32);\n }\n // Unused\n protected get(): [] {\n return [];\n }\n protected set(): void {}\n private b2Compress(counter: number, flags: number, buf: Uint32Array, bufPos: number = 0) {\n const { state: s, pos } = this;\n const { h, l } = fromBig(BigInt(counter), true);\n // prettier-ignore\n const { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15 } =\n compress(\n B3_SIGMA, bufPos, buf, 7,\n s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7],\n B3_IV[0], B3_IV[1], B3_IV[2], B3_IV[3], h, l, pos, flags\n );\n s[0] = v0 ^ v8;\n s[1] = v1 ^ v9;\n s[2] = v2 ^ v10;\n s[3] = v3 ^ v11;\n s[4] = v4 ^ v12;\n s[5] = v5 ^ v13;\n s[6] = v6 ^ v14;\n s[7] = v7 ^ v15;\n }\n protected compress(buf: Uint32Array, bufPos: number = 0, isLast: boolean = false): void {\n // Compress last block\n let flags = this.flags;\n if (!this.chunkPos) flags |= B3_Flags.CHUNK_START;\n if (this.chunkPos === 15 || isLast) flags |= B3_Flags.CHUNK_END;\n if (!isLast) this.pos = this.blockLen;\n this.b2Compress(this.chunksDone, flags, buf, bufPos);\n this.chunkPos += 1;\n // If current block is last in chunk (16 blocks), then compress chunks\n if (this.chunkPos === 16 || isLast) {\n let chunk = this.state;\n this.state = this.IV.slice();\n // If not the last one, compress only when there are trailing zeros in chunk counter\n // chunks used as binary tree where current stack is path. Zero means current leaf is finished and can be compressed.\n // 1 (001) - leaf not finished (just push current chunk to stack)\n // 2 (010) - leaf finished at depth=1 (merge with last elm on stack and push back)\n // 3 (011) - last leaf not finished\n // 4 (100) - leafs finished at depth=1 and depth=2\n for (let last, chunks = this.chunksDone + 1; isLast || !(chunks & 1); chunks >>= 1) {\n if (!(last = this.stack.pop())) break;\n this.buffer32.set(last, 0);\n this.buffer32.set(chunk, 8);\n this.pos = this.blockLen;\n this.b2Compress(0, this.flags | B3_Flags.PARENT, this.buffer32, 0);\n chunk = this.state;\n this.state = this.IV.slice();\n }\n this.chunksDone++;\n this.chunkPos = 0;\n this.stack.push(chunk);\n }\n this.pos = 0;\n }\n _cloneInto(to?: BLAKE3): BLAKE3 {\n to = super._cloneInto(to) as BLAKE3;\n const { IV, flags, state, chunkPos, posOut, chunkOut, stack, chunksDone } = this;\n to.state.set(state.slice());\n to.stack = stack.map((i) => Uint32Array.from(i));\n to.IV.set(IV);\n to.flags = flags;\n to.chunkPos = chunkPos;\n to.chunksDone = chunksDone;\n to.posOut = posOut;\n to.chunkOut = chunkOut;\n to.enableXOF = this.enableXOF;\n to.bufferOut32.set(this.bufferOut32);\n return to;\n }\n destroy(): void {\n this.destroyed = true;\n clean(this.state, this.buffer32, this.IV, this.bufferOut32);\n clean(...this.stack);\n }\n // Same as b2Compress, but doesn't modify state and returns 16 u32 array (instead of 8)\n private b2CompressOut() {\n const { state: s, pos, flags, buffer32, bufferOut32: out32 } = this;\n const { h, l } = fromBig(BigInt(this.chunkOut++));\n swap32IfBE(buffer32);\n // prettier-ignore\n const { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15 } =\n compress(\n B3_SIGMA, 0, buffer32, 7,\n s[0], s[1], s[2], s[3], s[4], s[5], s[6], s[7],\n B3_IV[0], B3_IV[1], B3_IV[2], B3_IV[3], l, h, pos, flags\n );\n out32[0] = v0 ^ v8;\n out32[1] = v1 ^ v9;\n out32[2] = v2 ^ v10;\n out32[3] = v3 ^ v11;\n out32[4] = v4 ^ v12;\n out32[5] = v5 ^ v13;\n out32[6] = v6 ^ v14;\n out32[7] = v7 ^ v15;\n out32[8] = s[0] ^ v8;\n out32[9] = s[1] ^ v9;\n out32[10] = s[2] ^ v10;\n out32[11] = s[3] ^ v11;\n out32[12] = s[4] ^ v12;\n out32[13] = s[5] ^ v13;\n out32[14] = s[6] ^ v14;\n out32[15] = s[7] ^ v15;\n swap32IfBE(buffer32);\n swap32IfBE(out32);\n this.posOut = 0;\n }\n protected finish(): void {\n if (this.finished) return;\n this.finished = true;\n // Padding\n clean(this.buffer.subarray(this.pos));\n // Process last chunk\n let flags = this.flags | B3_Flags.ROOT;\n if (this.stack.length) {\n flags |= B3_Flags.PARENT;\n swap32IfBE(this.buffer32);\n this.compress(this.buffer32, 0, true);\n swap32IfBE(this.buffer32);\n this.chunksDone = 0;\n this.pos = this.blockLen;\n } else {\n flags |= (!this.chunkPos ? B3_Flags.CHUNK_START : 0) | B3_Flags.CHUNK_END;\n }\n this.flags = flags;\n this.b2CompressOut();\n }\n private writeInto(out: Uint8Array) {\n aexists(this, false);\n abytes(out);\n this.finish();\n const { blockLen, bufferOut } = this;\n for (let pos = 0, len = out.length; pos < len; ) {\n if (this.posOut >= blockLen) this.b2CompressOut();\n const take = Math.min(blockLen - this.posOut, len - pos);\n out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n this.posOut += take;\n pos += take;\n }\n return out;\n }\n xofInto(out: Uint8Array): Uint8Array {\n if (!this.enableXOF) throw new Error('XOF is not possible after digest call');\n return this.writeInto(out);\n }\n xof(bytes: number): Uint8Array {\n anumber(bytes);\n return this.xofInto(new Uint8Array(bytes));\n }\n digestInto(out: Uint8Array): Uint8Array {\n aoutput(out, this);\n if (this.finished) throw new Error('digest() was already called');\n this.enableXOF = false;\n this.writeInto(out);\n this.destroy();\n return out;\n }\n digest(): Uint8Array {\n return this.digestInto(new Uint8Array(this.outputLen));\n }\n}\n\n/**\n * BLAKE3 hash function. Can be used as MAC and KDF.\n * @param msg - message that would be hashed\n * @param opts - `dkLen` for output length, `key` for MAC mode, `context` for KDF mode\n * @example\n * const data = new Uint8Array(32);\n * const hash = blake3(data);\n * const mac = blake3(data, { key: new Uint8Array(32) });\n * const kdf = blake3(data, { context: 'application name' });\n */\nexport const blake3: CHashXO = /* @__PURE__ */ createXOFer<BLAKE3, Blake3Opts>(\n (opts) => new BLAKE3(opts)\n);\n", "import { blake3 } from '@noble/hashes/blake3'\n\nexport const SOURCE_AUTH_MANIFEST_VERSION = 1\nexport const SOURCE_AUTH_OBJECT_ENTRY_FRAME = 1\nexport const SOURCE_AUTH_GROUP_CLOSE_FRAME = 2\nexport const SOURCE_AUTH_OBJECT_ENTRY_LENGTH = 52\nexport const SOURCE_AUTH_GROUP_CLOSE_LENGTH = 112\nexport const SOURCE_AUTH_MAX_OBJECTS_PER_GROUP = 4096\nexport const SOURCE_AUTH_MAX_TRUE_LENGTH = 16 * 1024 * 1024\nexport const SOURCE_AUTH_SCOPE_LENGTH = 32\n\nconst SIGNATURE_DOMAIN = new TextEncoder().encode('blockcast-mmt-root-v1\\0\\0\\0')\n\nexport interface SourceAuthObjectEntry {\n kind: 'object'\n groupId: bigint\n objectId: number\n trueLength: number\n digest: Uint8Array\n}\n\nexport interface SourceAuthGroupClose {\n kind: 'close'\n groupId: bigint\n objectCount: number\n root: Uint8Array\n signature: Uint8Array\n}\n\nexport type SourceAuthManifestFrame = SourceAuthObjectEntry | SourceAuthGroupClose\n\nfunction requireBytes(name: string, value: Uint8Array, length: number): void {\n if (value.byteLength !== length) {\n throw new Error(`${name} must be ${length} bytes, got ${value.byteLength}`)\n }\n}\n\nfunction requireU32(name: string, value: number): void {\n if (!Number.isInteger(value) || value < 0 || value > 0xffff_ffff) {\n throw new Error(`${name} must be an unsigned 32-bit integer`)\n }\n}\n\nfunction requireU64(name: string, value: bigint): void {\n if (value < 0n || value > 0xffff_ffff_ffff_ffffn) {\n throw new Error(`${name} must be an unsigned 64-bit integer`)\n }\n}\n\nfunction requireTrueLength(value: number): void {\n requireU32('trueLength', value)\n if (value > SOURCE_AUTH_MAX_TRUE_LENGTH) {\n throw new Error(`trueLength exceeds the ${SOURCE_AUTH_MAX_TRUE_LENGTH}-byte profile maximum`)\n }\n}\n\nexport function sourceAuthObjectDigest(object: Uint8Array): Uint8Array {\n return blake3(object)\n}\n\nexport function sourceAuthLeafHash(\n groupId: bigint,\n objectId: number,\n digest: Uint8Array,\n trueLength: number,\n): Uint8Array {\n requireU64('groupId', groupId)\n requireU32('objectId', objectId)\n requireBytes('digest', digest, 32)\n requireTrueLength(trueLength)\n const preimage = new Uint8Array(49)\n const view = new DataView(preimage.buffer)\n view.setBigUint64(1, groupId)\n view.setUint32(9, objectId)\n preimage.set(digest, 13)\n view.setUint32(45, trueLength)\n return blake3(preimage)\n}\n\nexport function sourceAuthMerkleRoot(\n entries: readonly {\n groupId: bigint\n objectId: number\n digest: Uint8Array\n trueLength: number\n }[],\n): Uint8Array {\n if (entries.length === 0) throw new Error('Merkle tree requires at least one object')\n if (entries.length > SOURCE_AUTH_MAX_OBJECTS_PER_GROUP) {\n throw new Error(`group exceeds ${SOURCE_AUTH_MAX_OBJECTS_PER_GROUP} objects`)\n }\n const groupId = entries[0]!.groupId\n const objectIds = new Set<number>()\n const ordered = [...entries].sort((left, right) => left.objectId - right.objectId)\n let level = ordered.map((entry) => {\n if (entry.groupId !== groupId) throw new Error('Merkle entries must belong to one group')\n if (objectIds.has(entry.objectId)) throw new Error(`duplicate objectId ${entry.objectId}`)\n objectIds.add(entry.objectId)\n return sourceAuthLeafHash(entry.groupId, entry.objectId, entry.digest, entry.trueLength)\n })\n while (level.length > 1) {\n const parents: Uint8Array[] = []\n for (let index = 0; index < level.length; index += 2) {\n const left = level[index]!\n const right = level[index + 1] ?? left\n const preimage = new Uint8Array(65)\n preimage[0] = 1\n preimage.set(left, 1)\n preimage.set(right, 33)\n parents.push(blake3(preimage))\n }\n level = parents\n }\n return level[0]!\n}\n\nexport function trimRecoveredSourceAuthObject(\n recoveredSymbol: Uint8Array,\n trueLength: number,\n): Uint8Array {\n requireTrueLength(trueLength)\n if (trueLength > recoveredSymbol.byteLength) {\n throw new Error(`true length ${trueLength} exceeds recovered object size ${recoveredSymbol.byteLength}`)\n }\n return recoveredSymbol.subarray(0, trueLength)\n}\n\nexport function encodeSourceAuthObjectEntry(\n entry: Omit<SourceAuthObjectEntry, 'kind'>,\n): Uint8Array {\n requireU32('objectId', entry.objectId)\n requireTrueLength(entry.trueLength)\n requireU64('groupId', entry.groupId)\n requireBytes('digest', entry.digest, 32)\n const frame = new Uint8Array(SOURCE_AUTH_OBJECT_ENTRY_LENGTH)\n const view = new DataView(frame.buffer)\n frame[0] = SOURCE_AUTH_OBJECT_ENTRY_FRAME\n frame[1] = SOURCE_AUTH_MANIFEST_VERSION\n view.setBigUint64(4, entry.groupId)\n view.setUint32(12, entry.objectId)\n view.setUint32(16, entry.trueLength)\n frame.set(entry.digest, 20)\n return frame\n}\n\nexport function encodeSourceAuthGroupClose(\n close: Omit<SourceAuthGroupClose, 'kind'>,\n): Uint8Array {\n requireU32('objectCount', close.objectCount)\n if (close.objectCount === 0 || close.objectCount > SOURCE_AUTH_MAX_OBJECTS_PER_GROUP) {\n throw new Error(`objectCount must be between 1 and ${SOURCE_AUTH_MAX_OBJECTS_PER_GROUP}`)\n }\n requireU64('groupId', close.groupId)\n requireBytes('root', close.root, 32)\n requireBytes('signature', close.signature, 64)\n const frame = new Uint8Array(SOURCE_AUTH_GROUP_CLOSE_LENGTH)\n const view = new DataView(frame.buffer)\n frame[0] = SOURCE_AUTH_GROUP_CLOSE_FRAME\n frame[1] = SOURCE_AUTH_MANIFEST_VERSION\n view.setBigUint64(4, close.groupId)\n view.setUint32(12, close.objectCount)\n frame.set(close.root, 16)\n frame.set(close.signature, 48)\n return frame\n}\n\nexport function sourceAuthSignaturePreimage(\n authScope: Uint8Array,\n groupId: bigint,\n objectCount: number,\n root: Uint8Array,\n): Uint8Array {\n requireU32('objectCount', objectCount)\n if (objectCount === 0 || objectCount > SOURCE_AUTH_MAX_OBJECTS_PER_GROUP) {\n throw new Error(`objectCount must be between 1 and ${SOURCE_AUTH_MAX_OBJECTS_PER_GROUP}`)\n }\n requireU64('groupId', groupId)\n requireBytes('authScope', authScope, SOURCE_AUTH_SCOPE_LENGTH)\n requireBytes('root', root, 32)\n const preimage = new Uint8Array(100)\n const view = new DataView(preimage.buffer)\n preimage.set(SIGNATURE_DOMAIN)\n preimage.set(authScope, 24)\n view.setBigUint64(56, groupId)\n view.setUint32(64, objectCount)\n preimage.set(root, 68)\n return preimage\n}\n\nexport function decodeSourceAuthManifestFrame(frame: Uint8Array): SourceAuthManifestFrame {\n const frameType = frame[0]\n const expectedLength = frameType === SOURCE_AUTH_OBJECT_ENTRY_FRAME\n ? SOURCE_AUTH_OBJECT_ENTRY_LENGTH\n : frameType === SOURCE_AUTH_GROUP_CLOSE_FRAME\n ? SOURCE_AUTH_GROUP_CLOSE_LENGTH\n : 0\n if (expectedLength === 0) throw new Error(`unsupported manifest frame type ${frameType}`)\n if (frame.byteLength !== expectedLength) {\n throw new Error(`manifest frame has invalid length ${frame.byteLength} for type ${frameType}`)\n }\n if (frame[1] !== SOURCE_AUTH_MANIFEST_VERSION) {\n throw new Error(`unsupported manifest version ${frame[1]}`)\n }\n if (frame[2] !== 0 || frame[3] !== 0) throw new Error('manifest reserved bits must be zero')\n\n const view = new DataView(frame.buffer, frame.byteOffset, frame.byteLength)\n const groupId = view.getBigUint64(4)\n if (frameType === SOURCE_AUTH_OBJECT_ENTRY_FRAME) {\n const entry: SourceAuthObjectEntry = {\n kind: 'object',\n groupId,\n objectId: view.getUint32(12),\n trueLength: view.getUint32(16),\n digest: frame.slice(20, 52),\n }\n requireTrueLength(entry.trueLength)\n return entry\n }\n const close: SourceAuthGroupClose = {\n kind: 'close',\n groupId,\n objectCount: view.getUint32(12),\n root: frame.slice(16, 48),\n signature: frame.slice(48, 112),\n }\n if (close.objectCount === 0 || close.objectCount > SOURCE_AUTH_MAX_OBJECTS_PER_GROUP) {\n throw new Error(`objectCount must be between 1 and ${SOURCE_AUTH_MAX_OBJECTS_PER_GROUP}`)\n }\n return close\n}\n", "import {\n sourceAuthMerkleRoot,\n sourceAuthObjectDigest,\n sourceAuthSignaturePreimage,\n trimRecoveredSourceAuthObject,\n type SourceAuthGroupClose,\n type SourceAuthObjectEntry,\n} from './source-auth.js'\n\nexport type SourceAuthAdmissionState =\n | 'pending-entry'\n | 'pending-object'\n | 'provisional'\n | 'authenticated'\n\nexport interface SourceAuthObjectAdmission {\n groupId: bigint\n objectId: number\n recovered: boolean\n state: Exclude<SourceAuthAdmissionState, 'pending-object'>\n}\n\ninterface PendingSourceAuthObject {\n bytes: Uint8Array\n recovered: boolean\n}\n\nfunction requireU64(name: string, value: bigint): void {\n if (value < 0n || value > 0xffff_ffff_ffff_ffffn) {\n throw new Error(`${name} must be an unsigned 64-bit integer`)\n }\n}\n\nfunction equalBytes(left: Uint8Array, right: Uint8Array): boolean {\n if (left.byteLength !== right.byteLength) return false\n return left.every((value, index) => value === right[index])\n}\n\n/**\n * Bounded media/manifest rendezvous for the browser player receive path.\n * Object digest admission is synchronous; only the group-close signature is deferred.\n */\nexport class SourceAuthAdmission {\n readonly #manifestAuthenticated: boolean\n readonly #entries = new Map<number, SourceAuthObjectEntry>()\n readonly #pendingObjects = new Map<number, PendingSourceAuthObject>()\n readonly #entriesAwaitingObjects = new Set<number>()\n readonly #admissions = new Map<number, SourceAuthObjectAdmission>()\n #groupId: bigint | null = null\n #closed = false\n\n constructor(options: { manifestAuthenticated: boolean }) {\n this.#manifestAuthenticated = options.manifestAuthenticated\n }\n\n admitObject(input: {\n groupId: bigint\n objectId: number\n bytes: Uint8Array\n recovered?: boolean\n }): SourceAuthObjectAdmission {\n this.#requireGroup(input.groupId)\n if (this.#closed) throw new Error('source-auth group is already closed')\n if (this.#admissions.has(input.objectId) || this.#pendingObjects.has(input.objectId)) {\n throw new Error(`duplicate source-auth object ${input.objectId}`)\n }\n const entry = this.#entries.get(input.objectId)\n if (entry) {\n this.#entriesAwaitingObjects.delete(input.objectId)\n return this.#verifyObject(entry, input.bytes, input.recovered ?? false)\n }\n if (this.#pendingObjects.size >= 1) {\n throw new Error('source-auth media exceeds one-object manifest skew')\n }\n this.#pendingObjects.set(input.objectId, {\n bytes: input.bytes,\n recovered: input.recovered ?? false,\n })\n return {\n groupId: input.groupId,\n objectId: input.objectId,\n recovered: input.recovered ?? false,\n state: 'pending-entry',\n }\n }\n\n admitEntry(entry: SourceAuthObjectEntry): SourceAuthObjectAdmission | SourceAuthAdmissionState {\n this.#requireGroup(entry.groupId)\n if (this.#closed) throw new Error('source-auth group is already closed')\n if (this.#entries.has(entry.objectId)) {\n throw new Error(`duplicate source-auth manifest entry ${entry.objectId}`)\n }\n const pending = this.#pendingObjects.get(entry.objectId)\n if (!pending && this.#entriesAwaitingObjects.size >= 1) {\n throw new Error('source-auth manifest exceeds one-object media skew')\n }\n this.#entries.set(entry.objectId, entry)\n if (!pending) {\n this.#entriesAwaitingObjects.add(entry.objectId)\n return 'pending-object'\n }\n this.#pendingObjects.delete(entry.objectId)\n return this.#verifyObject(entry, pending.bytes, pending.recovered)\n }\n\n objectState(objectId: number): SourceAuthAdmissionState | undefined {\n if (this.#pendingObjects.has(objectId)) return 'pending-entry'\n if (this.#entriesAwaitingObjects.has(objectId)) return 'pending-object'\n if (this.#closed && this.#admissions.has(objectId)) return 'authenticated'\n return this.#admissions.get(objectId)?.state\n }\n\n async verifyClose(\n close: SourceAuthGroupClose,\n authScope: Uint8Array,\n publicKey: CryptoKey,\n subtle: SubtleCrypto = globalThis.crypto.subtle,\n ): Promise<void> {\n this.#requireGroup(close.groupId)\n if (this.#closed) throw new Error('source-auth group is already closed')\n if (this.#pendingObjects.size !== 0 || this.#entriesAwaitingObjects.size !== 0) {\n throw new Error('source-auth group closed with unmatched objects or entries')\n }\n if (close.objectCount !== this.#entries.size || this.#admissions.size !== this.#entries.size) {\n throw new Error('source-auth group close object count mismatch')\n }\n const root = sourceAuthMerkleRoot([...this.#entries.values()])\n if (!equalBytes(root, close.root)) throw new Error('source-auth group root mismatch')\n const verified = await subtle.verify(\n 'Ed25519',\n publicKey,\n new Uint8Array(close.signature).buffer,\n new Uint8Array(\n sourceAuthSignaturePreimage(authScope, close.groupId, close.objectCount, root),\n ).buffer,\n )\n if (!verified) throw new Error('source-auth group close signature failed')\n for (const admission of this.#admissions.values()) admission.state = 'authenticated'\n this.#closed = true\n }\n\n #requireGroup(groupId: bigint): void {\n requireU64('groupId', groupId)\n if (this.#groupId === null) this.#groupId = groupId\n else if (this.#groupId !== groupId) throw new Error('source-auth group identity mismatch')\n }\n\n #verifyObject(\n entry: SourceAuthObjectEntry,\n bytes: Uint8Array,\n recovered: boolean,\n ): SourceAuthObjectAdmission {\n const authenticated = recovered\n ? trimRecoveredSourceAuthObject(bytes, entry.trueLength)\n : bytes\n if (!recovered && bytes.byteLength !== entry.trueLength) {\n throw new Error(`direct source-auth object length mismatch for ${entry.objectId}`)\n }\n if (!equalBytes(sourceAuthObjectDigest(authenticated), entry.digest)) {\n throw new Error(`source-auth object digest mismatch for ${entry.objectId}`)\n }\n const admission: SourceAuthObjectAdmission = {\n groupId: entry.groupId,\n objectId: entry.objectId,\n recovered,\n state: this.#manifestAuthenticated ? 'authenticated' : 'provisional',\n }\n this.#admissions.set(entry.objectId, admission)\n return admission\n }\n}\n", "import {\n decodeSourceAuthManifestFrame,\n sourceAuthMerkleRoot,\n sourceAuthObjectDigest,\n sourceAuthSignaturePreimage,\n type SourceAuthGroupClose,\n type SourceAuthObjectEntry,\n} from './source-auth.js'\n\nexport type ManifestAuthMode = 'off' | 'shadow' | 'enforce'\nexport type MissingManifestPolicy = 'stall' | 'fallback-shadow'\nexport type ManifestFailureReason =\n | 'sigInvalid'\n | 'digestMismatch'\n | 'manifestLate'\n | 'manifestAbsent'\n | 'verifierError'\n\nexport interface ManifestAuthConfig {\n mode: ManifestAuthMode\n onMissingManifest: MissingManifestPolicy\n}\n\nexport interface ManifestObjectIdentity {\n trackName: string\n /** Stable v2 auth binding. Defaults to trackName for legacy single-format callers. */\n bindingId?: string\n /** MoQ group ids are u62; values above 2^53 must be passed as bigint. */\n groupId: number | bigint\n objectId: number\n packetId?: number\n ssId?: number\n}\n\nexport interface ManifestFecBlockMapper {\n readonly d: number\n derive(groupId: number, objectId: number): { ssId: number }\n}\n\nexport interface ManifestTrackContext {\n broadcastNamespaceId: string\n trackName: string\n /** Stable v2 auth binding. Defaults to trackName for legacy single-format callers. */\n bindingId?: string\n sourceSymbolFormat?: string\n keyEpoch: number\n codec: string\n timing: string\n fecGeometry: string\n manifestFormatVersion: number\n /** Authenticated-catalog binding for the namespace, track, epoch, codec,\n * timing, FEC geometry, and manifest version fields above. */\n authScope: Uint8Array\n publicKey: Uint8Array\n /** Current key first, followed by any catalog-advertised overlap keys. */\n acceptedPublicKeys?: readonly Uint8Array[]\n bitrate: number\n groupDurationMs: number\n mapper: ManifestFecBlockMapper\n manifestChannelAuthenticated: boolean\n}\n\nexport interface ManifestVerificationStats {\n verified: number\n /** Terminal outcomes only: an object counted here will never be verified. */\n failures: Record<ManifestFailureReason, number>\n /**\n * Objects currently held in quarantine awaiting a manifest \u2014 pending, NOT\n * failed, and deliberately disjoint from `failures`. An enforce-mode stall is\n * accounted here first and moves into `failures` only once the verifier gives\n * up on it, so a reason breakdown that ignores this gauge under-reports live\n * stalls by whatever is still in flight (BLO-30007).\n */\n quarantined: number\n quarantinedBytes: number\n}\n\nexport interface ManifestFailure {\n trackName: string\n bindingId?: string\n groupId: number | bigint\n objectId: number\n reason: ManifestFailureReason\n}\n\nexport interface ManifestAdmission {\n action: 'play' | 'stall' | 'drop'\n verified: boolean\n reason?: ManifestFailureReason\n}\n\nexport type SignatureVerifier = (\n publicKey: Uint8Array,\n message: Uint8Array,\n signature: Uint8Array,\n) => boolean | Promise<boolean>\n\nexport function manifestBindingId(trackName: string, sourceSymbolFormat: string): string {\n return JSON.stringify([trackName, sourceSymbolFormat])\n}\n\nexport function createWebCryptoEd25519Verifier(\n subtle: SubtleCrypto = globalThis.crypto.subtle,\n): SignatureVerifier {\n return async (publicKey, message, signature) => {\n const keyBytes = Uint8Array.from(publicKey)\n const messageBytes = Uint8Array.from(message)\n const signatureBytes = Uint8Array.from(signature)\n const key = await subtle.importKey('raw', keyBytes.buffer, 'Ed25519', false, ['verify'])\n return subtle.verify('Ed25519', key, signatureBytes.buffer, messageBytes.buffer)\n }\n}\n\ninterface PendingObject {\n identity: ManifestObjectIdentity\n data: Uint8Array\n release: () => void\n bytes: number\n}\n\ninterface GroupState {\n entries: Map<number, SourceAuthObjectEntry>\n pending: Map<number, PendingObject>\n close?: SourceAuthGroupClose\n /** Close frame that arrived before all object entries (manifest-channel\n * reordering); retried once the entry count matches. */\n pendingClose?: SourceAuthGroupClose\n rootVerified: boolean\n signaturePending?: boolean\n failed?: ManifestFailureReason\n}\n\ninterface TrackState {\n context: ManifestTrackContext\n groups: Map<bigint, GroupState>\n quarantine: PendingObject[]\n quarantinedBytes: number\n capBytes: number\n manifestEntries: number\n maxManifestEntries: number\n maxGroups: number\n}\n\nconst FAILURE_REASONS: readonly ManifestFailureReason[] = [\n 'sigInvalid',\n 'digestMismatch',\n 'manifestLate',\n 'manifestAbsent',\n 'verifierError',\n]\n\nconst equalBytes = (left: Uint8Array, right: Uint8Array): boolean => {\n if (left.byteLength !== right.byteLength) return false\n let diff = 0\n for (let index = 0; index < left.byteLength; index++) diff |= left[index]! ^ right[index]!\n return diff === 0\n}\n\nconst isPromiseLike = (value: boolean | Promise<boolean>): value is Promise<boolean> =>\n typeof value === 'object' && value !== null && typeof value.then === 'function'\n\nexport class ManifestVerifier {\n #config: ManifestAuthConfig\n readonly #verifySignature: SignatureVerifier\n readonly #onFailure?: (failure: ManifestFailure) => void\n readonly #tracks = new Map<string, TrackState>()\n readonly #stats: Omit<ManifestVerificationStats, 'quarantined'> = {\n verified: 0,\n failures: Object.fromEntries(FAILURE_REASONS.map((reason) => [reason, 0])) as Record<ManifestFailureReason, number>,\n quarantinedBytes: 0,\n }\n #disposed = false\n\n constructor(options: {\n manifestAuth: ManifestAuthConfig\n verifySignature: SignatureVerifier\n onFailure?: (failure: ManifestFailure) => void\n }) {\n this.#config = { ...options.manifestAuth }\n this.#verifySignature = options.verifySignature\n this.#onFailure = options.onFailure\n }\n\n get config(): Readonly<ManifestAuthConfig> {\n return this.#config\n }\n\n get stats(): ManifestVerificationStats {\n let quarantined = 0\n for (const track of this.#tracks.values()) quarantined += track.quarantine.length\n return {\n verified: this.#stats.verified,\n failures: { ...this.#stats.failures },\n quarantined,\n quarantinedBytes: this.#stats.quarantinedBytes,\n }\n }\n\n setMode(mode: ManifestAuthMode): void {\n this.#config = { ...this.#config, mode }\n if (mode !== 'enforce') this.#releaseAllQuarantine(false)\n }\n\n registerTrack(context: ManifestTrackContext): void {\n const bindingId = context.bindingId ?? context.trackName\n if (this.#tracks.has(bindingId)) {\n throw new Error(`manifest binding ${bindingId} is already registered`)\n }\n if (!Number.isFinite(context.bitrate) || context.bitrate <= 0) {\n throw new Error('manifest track bitrate must be > 0')\n }\n if (!Number.isFinite(context.groupDurationMs) || context.groupDurationMs <= 0) {\n throw new Error('manifest track groupDurationMs must be > 0')\n }\n if (context.authScope.byteLength !== 32) throw new Error('manifest authScope must be 32 bytes')\n if (context.publicKey.byteLength !== 32) throw new Error('manifest publicKey must be 32 bytes')\n for (const key of context.acceptedPublicKeys ?? []) {\n if (key.byteLength !== 32) throw new Error('manifest acceptedPublicKeys must contain 32-byte keys')\n }\n for (const [name, value] of Object.entries({\n broadcastNamespaceId: context.broadcastNamespaceId,\n trackName: context.trackName,\n codec: context.codec,\n timing: context.timing,\n fecGeometry: context.fecGeometry,\n })) {\n if (value.length === 0) throw new Error(`manifest ${name} must not be empty`)\n }\n this.#tracks.set(bindingId, {\n context: { ...context, bindingId },\n groups: new Map(),\n quarantine: [],\n quarantinedBytes: 0,\n capBytes: Math.ceil((context.bitrate * context.groupDurationMs) / 8000),\n manifestEntries: 0,\n maxManifestEntries: Math.ceil((context.bitrate * context.groupDurationMs) / (8000 * 52)),\n maxGroups: context.mapper.d + 1,\n })\n }\n\n ingestManifestFrame(bindingId: string, frameBytes: Uint8Array): void {\n const track = this.#requireTrack(bindingId)\n try {\n const frame = decodeSourceAuthManifestFrame(frameBytes)\n const groupId = frame.groupId\n const group = this.#group(track, groupId)\n if (frame.kind === 'object') {\n if (group.close || group.signaturePending || group.failed) {\n this.#failure({ trackName: track.context.trackName, bindingId, groupId, objectId: frame.objectId }, 'verifierError')\n return\n }\n if (group.entries.has(frame.objectId)) {\n this.#failure({ trackName: track.context.trackName, bindingId, groupId, objectId: frame.objectId }, 'verifierError')\n return\n }\n if (group.entries.size >= 4096 || track.manifestEntries >= track.maxManifestEntries) {\n this.#failure({ trackName: track.context.trackName, bindingId, groupId, objectId: frame.objectId }, 'verifierError')\n return\n }\n group.entries.set(frame.objectId, frame)\n track.manifestEntries++\n const pending = group.pending.get(frame.objectId)\n if (pending) {\n this.#failure(pending.identity, 'manifestLate')\n this.#resolvePending(track, group, pending, frame)\n }\n if (group.pendingClose && group.entries.size === group.pendingClose.objectCount) {\n const close = group.pendingClose\n group.pendingClose = undefined\n this.#closeGroup(track, groupId, group, close)\n }\n return\n }\n this.#closeGroup(track, groupId, group, frame)\n } catch {\n this.#failure({ trackName: track.context.trackName, bindingId, groupId: 0, objectId: 0 }, 'verifierError')\n }\n }\n\n admitObject(\n identity: ManifestObjectIdentity,\n data: Uint8Array,\n release: () => void,\n ): ManifestAdmission {\n if (this.#config.mode === 'off') {\n release()\n return { action: 'play', verified: false }\n }\n const track = this.#tracks.get(identity.bindingId ?? identity.trackName)\n if (!track) {\n release()\n this.#failure(identity, 'verifierError')\n return { action: 'play', verified: false, reason: 'verifierError' }\n }\n try {\n if (!this.#validateIdentity(track, identity)) {\n return this.#rejectOrShadow(identity, release, 'digestMismatch')\n }\n const group = this.#group(track, BigInt(identity.groupId))\n if (group.failed === 'sigInvalid' || group.failed === 'digestMismatch') {\n return this.#rejectOrShadow(identity, release, group.failed)\n }\n const entry = group.entries.get(identity.objectId)\n if (entry) return this.#admitAgainstEntry(track, group, identity, data, release, entry)\n if (this.#config.mode === 'shadow' || this.#config.onMissingManifest === 'fallback-shadow') {\n release()\n this.#failure(identity, 'manifestAbsent')\n return { action: 'play', verified: false, reason: 'manifestAbsent' }\n }\n if (!this.#quarantine(track, group, { identity, data, release, bytes: data.byteLength })) {\n return { action: 'drop', verified: false }\n }\n return { action: 'stall', verified: false }\n } catch {\n release()\n this.#failure(identity, 'verifierError')\n return { action: 'play', verified: false, reason: 'verifierError' }\n }\n }\n\n dispose(): void {\n if (this.#disposed) return\n this.#disposed = true\n this.#releaseAllQuarantine(false)\n this.#tracks.clear()\n }\n\n #requireTrack(bindingId: string): TrackState {\n const track = this.#tracks.get(bindingId)\n if (!track) throw new Error(`unknown manifest binding ${bindingId}`)\n return track\n }\n\n #group(track: TrackState, groupId: bigint): GroupState {\n let group = track.groups.get(groupId)\n if (!group) {\n group = { entries: new Map(), pending: new Map(), rootVerified: false }\n track.groups.set(groupId, group)\n while (track.groups.size > track.maxGroups) {\n const oldest = track.groups.entries().next().value as [bigint, GroupState] | undefined\n if (!oldest) break\n const [oldestId, oldestGroup] = oldest\n for (const pending of [...oldestGroup.pending.values()]) {\n this.#removePending(track, oldestGroup, pending)\n pending.release()\n // The group aged out with objects still waiting on a manifest that\n // never arrived. That is an absent manifest, not a verifier fault:\n // `verifierError` is reserved for an exception/crash in the verifier\n // itself, so mislabelling here reads on the graduation dashboard as a\n // software bug and hides a benign absent-manifest stall (BLO-30007).\n this.#failure(pending.identity, 'manifestAbsent')\n }\n track.manifestEntries -= oldestGroup.entries.size\n track.groups.delete(oldestId)\n }\n }\n return group\n }\n\n #validateIdentity(track: TrackState, identity: ManifestObjectIdentity): boolean {\n const coordinates = track.context.mapper.derive(Number(identity.groupId), identity.objectId)\n return identity.ssId === undefined || coordinates.ssId === identity.ssId\n }\n\n #admitAgainstEntry(\n track: TrackState,\n group: GroupState,\n identity: ManifestObjectIdentity,\n data: Uint8Array,\n release: () => void,\n entry: SourceAuthObjectEntry,\n ): ManifestAdmission {\n if (entry.trueLength !== data.byteLength) {\n return this.#rejectOrShadow(identity, release, 'digestMismatch')\n }\n const digestMatches = equalBytes(sourceAuthObjectDigest(data.subarray(0, entry.trueLength)), entry.digest)\n if (!digestMatches) return this.#rejectOrShadow(identity, release, 'digestMismatch')\n if (!track.context.manifestChannelAuthenticated && !group.rootVerified) {\n if (this.#config.mode === 'shadow') {\n release()\n return { action: 'play', verified: false }\n }\n if (!this.#quarantine(track, group, { identity, data, release, bytes: data.byteLength })) {\n return { action: 'drop', verified: false }\n }\n return { action: 'stall', verified: false }\n }\n release()\n this.#stats.verified++\n return { action: 'play', verified: true }\n }\n\n #rejectOrShadow(\n identity: ManifestObjectIdentity,\n release: () => void,\n reason: 'digestMismatch' | 'sigInvalid',\n ): ManifestAdmission {\n this.#failure(identity, reason)\n if (this.#config.mode === 'enforce') {\n console.warn(JSON.stringify({ event: 'manifest-enforce-drop', track: identity.trackName, group: String(identity.groupId), object: identity.objectId, reason }))\n return { action: 'drop', verified: false, reason }\n }\n release()\n return { action: 'play', verified: false, reason }\n }\n\n #resolvePending(\n track: TrackState,\n group: GroupState,\n pending: PendingObject,\n entry: SourceAuthObjectEntry,\n ): void {\n this.#removePending(track, group, pending)\n this.#admitAgainstEntry(track, group, pending.identity, pending.data, pending.release, entry)\n }\n\n #closeGroup(\n track: TrackState,\n groupId: bigint,\n group: GroupState,\n close: SourceAuthGroupClose,\n ): void {\n if (group.close || group.signaturePending) return\n const entries = [...group.entries.values()]\n if (entries.length !== close.objectCount) {\n // Manifest-channel reordering: the close frame beat some object entries.\n // Stash it (latest-wins on duplicates) so the object-entry path can\n // re-attempt the close once the count matches; quarantined objects stay\n // quarantined, and manifestAbsent below is a signal, not an eviction.\n group.pendingClose = close\n const hadPending = group.pending.size > 0\n if (this.#config.onMissingManifest === 'fallback-shadow' || this.#config.mode === 'shadow') {\n for (const pending of [...group.pending.values()]) {\n this.#removePending(track, group, pending)\n pending.release()\n this.#failure(pending.identity, 'manifestAbsent')\n }\n } else {\n for (const pending of group.pending.values()) {\n this.#failure(pending.identity, 'manifestAbsent')\n }\n }\n if (!hadPending) {\n this.#failure({ trackName: track.context.trackName, groupId, objectId: 0 }, 'manifestAbsent')\n }\n return\n }\n if (!equalBytes(sourceAuthMerkleRoot(entries), close.root)) {\n group.failed = 'digestMismatch'\n this.#failGroup(track, groupId, group, 'digestMismatch')\n return\n }\n const preimage = sourceAuthSignaturePreimage(track.context.authScope, close.groupId, close.objectCount, close.root)\n let signatureValid: boolean | Promise<boolean>\n try {\n signatureValid = this.#verifyAcceptedSignature(track, preimage, close.signature)\n } catch {\n this.#failOpenGroup(track, groupId, group)\n return\n }\n if (isPromiseLike(signatureValid)) {\n group.signaturePending = true\n void signatureValid.then(\n (valid) => {\n if (this.#disposed) return\n group.signaturePending = false\n this.#finishGroupSignature(track, groupId, group, close, valid)\n },\n () => {\n if (this.#disposed) return\n group.signaturePending = false\n this.#failOpenGroup(track, groupId, group)\n },\n )\n return\n }\n this.#finishGroupSignature(track, groupId, group, close, signatureValid)\n }\n\n #finishGroupSignature(\n track: TrackState,\n groupId: bigint,\n group: GroupState,\n close: SourceAuthGroupClose,\n signatureValid: boolean,\n ): void {\n if (!signatureValid) {\n group.failed = 'sigInvalid'\n this.#failGroup(track, groupId, group, 'sigInvalid')\n return\n }\n group.failed = undefined\n group.close = close\n group.pendingClose = undefined\n group.rootVerified = true\n for (const pending of [...group.pending.values()]) {\n const entry = group.entries.get(pending.identity.objectId)\n if (entry) this.#resolvePending(track, group, pending, entry)\n else if (this.#config.onMissingManifest === 'fallback-shadow') {\n this.#removePending(track, group, pending)\n pending.release()\n this.#failure(pending.identity, 'manifestAbsent')\n }\n }\n }\n\n #verifyAcceptedSignature(\n track: TrackState,\n message: Uint8Array,\n signature: Uint8Array,\n ): boolean | Promise<boolean> {\n const keys = track.context.acceptedPublicKeys ?? [track.context.publicKey]\n const pending: Promise<boolean | 'error'>[] = []\n let hadSynchronousError = false\n for (const key of keys) {\n try {\n const result = this.#verifySignature(key, message, signature)\n if (isPromiseLike(result)) {\n pending.push(Promise.resolve(result).then((valid) => valid, () => 'error' as const))\n } else if (result) {\n return true\n }\n } catch {\n hadSynchronousError = true\n }\n }\n if (pending.length === 0) {\n if (hadSynchronousError) throw new Error('manifest signature verifier unavailable')\n return false\n }\n return Promise.all(pending).then((results) => {\n if (results.some((valid) => valid === true)) return true\n if (hadSynchronousError || results.some((valid) => valid === 'error')) {\n throw new Error('manifest signature verifier unavailable')\n }\n return false\n })\n }\n\n #failGroup(\n track: TrackState,\n groupId: bigint,\n group: GroupState,\n reason: 'digestMismatch' | 'sigInvalid',\n ): void {\n if (group.pending.size === 0) {\n this.#failure({ trackName: track.context.trackName, groupId, objectId: 0 }, reason)\n return\n }\n for (const pending of [...group.pending.values()]) {\n this.#removePending(track, group, pending)\n this.#rejectOrShadow(pending.identity, pending.release, reason)\n }\n }\n\n #removePending(track: TrackState, group: GroupState, pending: PendingObject): void {\n if (group.pending.get(pending.identity.objectId) === pending) {\n group.pending.delete(pending.identity.objectId)\n }\n const index = track.quarantine.indexOf(pending)\n if (index >= 0) track.quarantine.splice(index, 1)\n track.quarantinedBytes -= pending.bytes\n this.#stats.quarantinedBytes -= pending.bytes\n }\n\n #quarantine(track: TrackState, group: GroupState, pending: PendingObject): boolean {\n if (group.pending.has(pending.identity.objectId)) return false\n group.pending.set(pending.identity.objectId, pending)\n track.quarantine.push(pending)\n track.quarantinedBytes += pending.bytes\n this.#stats.quarantinedBytes += pending.bytes\n this.#enforceCap(track)\n return true\n }\n\n #enforceCap(track: TrackState): void {\n while (track.quarantinedBytes > track.capBytes && track.quarantine.length > 0) {\n const pending = track.quarantine.shift()!\n const group = track.groups.get(BigInt(pending.identity.groupId))\n if (group) group.pending.delete(pending.identity.objectId)\n track.quarantinedBytes -= pending.bytes\n this.#stats.quarantinedBytes -= pending.bytes\n pending.release()\n // Quarantine budget ran out while the object was still waiting on a\n // manifest. The manifest was absent when we gave up; the verifier did not\n // fault. Same reason in shadow and enforce so the dashboard reads one\n // taxonomy across modes (BLO-30007).\n this.#failure(pending.identity, 'manifestAbsent')\n console.warn(`[ManifestVerifier] quarantine cap eviction fail-open track=${pending.identity.trackName} group=${pending.identity.groupId} object=${pending.identity.objectId}`)\n }\n }\n\n #failOpenTrack(track: TrackState, reason: 'verifierError'): void {\n for (const pending of [...track.quarantine]) {\n const group = track.groups.get(BigInt(pending.identity.groupId))\n if (group) this.#removePending(track, group, pending)\n pending.release()\n this.#failure(pending.identity, reason)\n }\n }\n\n #failOpenGroup(track: TrackState, groupId: bigint, group: GroupState): void {\n const pending = [...group.pending.values()]\n if (pending.length === 0) {\n this.#failure({ trackName: track.context.trackName, groupId, objectId: 0 }, 'verifierError')\n return\n }\n for (const object of pending) {\n this.#removePending(track, group, object)\n object.release()\n this.#failure(object.identity, 'verifierError')\n }\n }\n\n #releaseAllQuarantine(countFailure: boolean): void {\n for (const track of this.#tracks.values()) {\n for (const pending of [...track.quarantine]) {\n const group = track.groups.get(BigInt(pending.identity.groupId))\n if (group) this.#removePending(track, group, pending)\n pending.release()\n if (countFailure) this.#failure(pending.identity, 'verifierError')\n }\n }\n }\n\n #failure(identity: ManifestObjectIdentity, reason: ManifestFailureReason): void {\n this.#stats.failures[reason]++\n this.#onFailure?.({\n trackName: identity.trackName,\n ...(identity.bindingId === undefined ? {} : { bindingId: identity.bindingId }),\n groupId: identity.groupId,\n objectId: identity.objectId,\n reason,\n })\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;AAeM,SAAU,QAAQ,GAAU;AAChC,SAAO,aAAa,cAAe,YAAY,OAAO,CAAC,KAAK,EAAE,YAAY,SAAS;AACrF;AAGM,SAAU,QAAQ,GAAS;AAC/B,MAAI,CAAC,OAAO,cAAc,CAAC,KAAK,IAAI;AAAG,UAAM,IAAI,MAAM,oCAAoC,CAAC;AAC9F;AAGM,SAAU,OAAO,MAA8B,SAAiB;AACpE,MAAI,CAAC,QAAQ,CAAC;AAAG,UAAM,IAAI,MAAM,qBAAqB;AACtD,MAAI,QAAQ,SAAS,KAAK,CAAC,QAAQ,SAAS,EAAE,MAAM;AAClD,UAAM,IAAI,MAAM,mCAAmC,UAAU,kBAAkB,EAAE,MAAM;AAC3F;AAWM,SAAU,QAAQ,UAAe,gBAAgB,MAAI;AACzD,MAAI,SAAS;AAAW,UAAM,IAAI,MAAM,kCAAkC;AAC1E,MAAI,iBAAiB,SAAS;AAAU,UAAM,IAAI,MAAM,uCAAuC;AACjG;AAGM,SAAU,QAAQ,KAAU,UAAa;AAC7C,SAAO,GAAG;AACV,QAAM,MAAM,SAAS;AACrB,MAAI,IAAI,SAAS,KAAK;AACpB,UAAM,IAAI,MAAM,2DAA2D,GAAG;EAChF;AACF;AAQM,SAAU,GAAG,KAAe;AAChC,SAAO,IAAI,WAAW,IAAI,QAAQ,IAAI,YAAY,IAAI,UAAU;AAClE;AAGM,SAAU,IAAI,KAAe;AACjC,SAAO,IAAI,YAAY,IAAI,QAAQ,IAAI,YAAY,KAAK,MAAM,IAAI,aAAa,CAAC,CAAC;AACnF;AAGM,SAAU,SAAS,QAAoB;AAC3C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,WAAO,CAAC,EAAE,KAAK,CAAC;EAClB;AACF;AAQM,SAAU,KAAK,MAAc,OAAa;AAC9C,SAAQ,QAAS,KAAK,QAAW,SAAS;AAC5C;AAQO,IAAM,OAAiC,uBAC5C,IAAI,WAAW,IAAI,YAAY,CAAC,SAAU,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,IAAK;AAG7D,SAAU,SAAS,MAAY;AACnC,SACI,QAAQ,KAAM,aACd,QAAQ,IAAK,WACb,SAAS,IAAK,QACd,SAAS,KAAM;AAErB;AAEO,IAAM,YAAmC,OAC5C,CAAC,MAAc,IACf,CAAC,MAAc,SAAS,CAAC;AAKvB,SAAU,WAAW,KAAgB;AACzC,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,QAAI,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC;EAC1B;AACA,SAAO;AACT;AAEO,IAAM,aAA8C,OACvD,CAAC,MAAmB,IACpB;AA6FE,SAAU,YAAY,KAAW;AACrC,MAAI,OAAO,QAAQ;AAAU,UAAM,IAAI,MAAM,iBAAiB;AAC9D,SAAO,IAAI,WAAW,IAAI,YAAW,EAAG,OAAO,GAAG,CAAC;AACrD;AAiBM,SAAU,QAAQ,MAAW;AACjC,MAAI,OAAO,SAAS;AAAU,WAAO,YAAY,IAAI;AACrD,SAAO,IAAI;AACX,SAAO;AACT;AAmDM,IAAgB,OAAhB,MAAoB;;AA4EpB,SAAU,YACd,UAAkC;AAOlC,QAAM,QAAQ,CAAC,KAAY,SAAyB,SAAS,IAAI,EAAE,OAAO,QAAQ,GAAG,CAAC,EAAE,OAAM;AAC9F,QAAM,MAAM,SAAS,CAAA,CAAO;AAC5B,QAAM,YAAY,IAAI;AACtB,QAAM,WAAW,IAAI;AACrB,QAAM,SAAS,CAAC,SAAa,SAAS,IAAI;AAC1C,SAAO;AACT;;;AC/NO,IAAM,YAAyC,4BAAY,KAAK;EACrE;EAAY;EAAY;EAAY;EAAY;EAAY;EAAY;EAAY;CACrF;;;ACzJD,IAAM,aAA6B,uBAAO,KAAK,KAAK,CAAC;AACrD,IAAM,OAAuB,uBAAO,EAAE;AAEtC,SAAS,QACP,GACA,KAAK,OAAK;AAKV,MAAI;AAAI,WAAO,EAAE,GAAG,OAAO,IAAI,UAAU,GAAG,GAAG,OAAQ,KAAK,OAAQ,UAAU,EAAC;AAC/E,SAAO,EAAE,GAAG,OAAQ,KAAK,OAAQ,UAAU,IAAI,GAAG,GAAG,OAAO,IAAI,UAAU,IAAI,EAAC;AACjF;;;ACkBM,SAAU,IAAI,GAAW,GAAW,GAAW,GAAW,GAAS;AACvE,MAAK,IAAI,IAAI,IAAK;AAClB,MAAI,KAAK,IAAI,GAAG,EAAE;AAClB,MAAK,IAAI,IAAK;AACd,MAAI,KAAK,IAAI,GAAG,EAAE;AAClB,SAAO,EAAE,GAAG,GAAG,GAAG,EAAC;AACrB;AAEM,SAAU,IAAI,GAAW,GAAW,GAAW,GAAW,GAAS;AACvE,MAAK,IAAI,IAAI,IAAK;AAClB,MAAI,KAAK,IAAI,GAAG,CAAC;AACjB,MAAK,IAAI,IAAK;AACd,MAAI,KAAK,IAAI,GAAG,CAAC;AACjB,SAAO,EAAE,GAAG,GAAG,GAAG,EAAC;AACrB;;;ACoDM,IAAgB,SAAhB,cAAoD,KAAO;EAc/D,YAAY,UAAkB,WAAiB;AAC7C,UAAK;AARG,SAAA,WAAW;AACX,SAAA,YAAY;AACZ,SAAA,SAAiB;AACjB,SAAA,MAAc;AAMtB,YAAQ,QAAQ;AAChB,YAAQ,SAAS;AACjB,SAAK,WAAW;AAChB,SAAK,YAAY;AACjB,SAAK,SAAS,IAAI,WAAW,QAAQ;AACrC,SAAK,WAAW,IAAI,KAAK,MAAM;EACjC;EACA,OAAO,MAAW;AAChB,YAAQ,IAAI;AACZ,WAAO,QAAQ,IAAI;AACnB,WAAO,IAAI;AAKX,UAAM,EAAE,UAAU,QAAQ,SAAQ,IAAK;AACvC,UAAM,MAAM,KAAK;AACjB,UAAM,SAAS,KAAK;AACpB,UAAM,MAAM,KAAK;AACjB,aAAS,MAAM,GAAG,MAAM,OAAO;AAE7B,UAAI,KAAK,QAAQ,UAAU;AACzB,mBAAW,QAAQ;AACnB,aAAK,SAAS,UAAU,GAAG,KAAK;AAChC,mBAAW,QAAQ;AACnB,aAAK,MAAM;MACb;AACA,YAAM,OAAO,KAAK,IAAI,WAAW,KAAK,KAAK,MAAM,GAAG;AACpD,YAAM,aAAa,SAAS;AAE5B,UAAI,SAAS,YAAY,EAAE,aAAa,MAAM,MAAM,OAAO,KAAK;AAC9D,cAAM,SAAS,IAAI,YAAY,KAAK,YAAY,KAAK,OAAO,MAAM,OAAO,CAAC,CAAC;AAC3E,mBAAW,MAAM;AACjB,iBAAS,QAAQ,GAAG,MAAM,WAAW,KAAK,SAAS,SAAS,QAAQ,OAAO,UAAU;AACnF,eAAK,UAAU;AACf,eAAK,SAAS,QAAQ,OAAO,KAAK;QACpC;AACA,mBAAW,MAAM;AACjB;MACF;AACA,aAAO,IAAI,KAAK,SAAS,KAAK,MAAM,IAAI,GAAG,KAAK,GAAG;AACnD,WAAK,OAAO;AACZ,WAAK,UAAU;AACf,aAAO;IACT;AACA,WAAO;EACT;EACA,WAAW,KAAe;AACxB,YAAQ,IAAI;AACZ,YAAQ,KAAK,IAAI;AACjB,UAAM,EAAE,KAAK,SAAQ,IAAK;AAC1B,SAAK,WAAW;AAEhB,UAAM,KAAK,OAAO,SAAS,GAAG,CAAC;AAC/B,eAAW,QAAQ;AACnB,SAAK,SAAS,UAAU,GAAG,IAAI;AAC/B,eAAW,QAAQ;AACnB,UAAM,QAAQ,IAAI,GAAG;AACrB,SAAK,IAAG,EAAG,QAAQ,CAAC,GAAG,MAAO,MAAM,CAAC,IAAI,UAAU,CAAC,CAAE;EACxD;EACA,SAAM;AACJ,UAAM,EAAE,QAAQ,UAAS,IAAK;AAC9B,SAAK,WAAW,MAAM;AACtB,UAAM,MAAM,OAAO,MAAM,GAAG,SAAS;AACrC,SAAK,QAAO;AACZ,WAAO;EACT;EACA,WAAW,IAAM;AACf,UAAM,EAAE,QAAQ,QAAQ,UAAU,WAAW,WAAW,IAAG,IAAK;AAChE,WAAA,KAAO,IAAK,KAAK,YAAoB,EAAE,OAAO,UAAS,CAAE;AACzD,OAAG,IAAI,GAAG,KAAK,IAAG,CAAE;AACpB,OAAG,OAAO,IAAI,MAAM;AACpB,OAAG,YAAY;AACf,OAAG,WAAW;AACd,OAAG,SAAS;AACZ,OAAG,MAAM;AAET,OAAG,YAAY;AACf,WAAO;EACT;EACA,QAAK;AACH,WAAO,KAAK,WAAU;EACxB;;AAuKI,SAAU,SAAS,GAAe,QAAgB,KAAkB,QACxE,IAAY,IAAY,IAAY,IAAY,IAAY,IAAY,IAAY,IACpF,IAAY,IAAY,KAAa,KAAa,KAAa,KAAa,KAAa,KAAW;AAEpG,MAAI,IAAI;AACR,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAC5E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAC5E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAC5E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAC5E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAC9E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAC9E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAC9E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAE9E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAC9E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAC9E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAC9E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,KAAK,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAC9E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAC5E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAC5E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;AAC5E,KAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAG,IAAK,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,SAAS,EAAE,GAAG,CAAC,CAAC;EAC9E;AACA,SAAO,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAG;AAC/E;;;AC/WA,IAAM,WAAW;EACf,aAAa;EACb,WAAW;EACX,QAAQ;EACR,MAAM;EACN,YAAY;EACZ,oBAAoB;EACpB,qBAAqB;;AAGvB,IAAM,QAAQ,UAAU,MAAK;AAE7B,IAAM,WAAwC,uBAAK;AACjD,QAAM,KAAK,MAAM,KAAK,EAAE,QAAQ,GAAE,GAAI,CAAC,GAAG,MAAM,CAAC;AACjD,QAAM,UAAU,CAAC,QACf,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;AAC1E,QAAM,MAAgB,CAAA;AACtB,WAAS,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,IAAI,QAAQ,CAAC;AAAG,QAAI,KAAK,GAAG,CAAC;AACjE,SAAO,WAAW,KAAK,GAAG;AAC5B,GAAE;AAYI,IAAO,SAAP,MAAO,gBAAe,OAAc;EAcxC,YAAY,OAAmB,CAAA,GAAI,QAAQ,GAAC;AAC1C,UAAM,IAAI,KAAK,UAAU,SAAY,KAAK,KAAK,KAAK;AAd9C,SAAA,WAAW;AACX,SAAA,aAAa;AACb,SAAA,QAAQ,IAAI;AAGZ,SAAA,QAAuB,CAAA;AAEvB,SAAA,SAAS;AACT,SAAA,cAAc,IAAI,YAAY,EAAE;AAEhC,SAAA,WAAW;AACX,SAAA,YAAY;AAIlB,UAAM,EAAE,KAAK,QAAO,IAAK;AACzB,UAAM,aAAa,YAAY;AAC/B,QAAI,QAAQ,QAAW;AACrB,UAAI;AAAY,cAAM,IAAI,MAAM,uDAAuD;AACvF,YAAM,IAAI,QAAQ,GAAG,EAAE,MAAK;AAC5B,aAAO,GAAG,EAAE;AACZ,WAAK,KAAK,IAAI,CAAC;AACf,iBAAW,KAAK,EAAE;AAClB,WAAK,QAAQ,QAAQ,SAAS;IAChC,WAAW,YAAY;AACrB,YAAM,MAAM,QAAQ,OAAO;AAC3B,YAAM,aAAa,IAAI,QAAO,EAAE,OAAO,GAAE,GAAI,SAAS,kBAAkB,EACrE,OAAO,GAAG,EACV,OAAM;AACT,WAAK,KAAK,IAAI,UAAU;AACxB,iBAAW,KAAK,EAAE;AAClB,WAAK,QAAQ,QAAQ,SAAS;IAChC,OAAO;AACL,WAAK,KAAK,MAAM,MAAK;AACrB,WAAK,QAAQ;IACf;AACA,SAAK,QAAQ,KAAK,GAAG,MAAK;AAC1B,SAAK,YAAY,GAAG,KAAK,WAAW;EACtC;;EAEU,MAAG;AACX,WAAO,CAAA;EACT;EACU,MAAG;EAAU;EACf,WAAW,SAAiB,OAAe,KAAkB,SAAiB,GAAC;AACrF,UAAM,EAAE,OAAO,GAAG,IAAG,IAAK;AAC1B,UAAM,EAAE,GAAG,EAAC,IAAK,QAAQ,OAAO,OAAO,GAAG,IAAI;AAE9C,UAAM,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAG,IAC1E,SACE,UAAU,QAAQ,KAAK,GACvB,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,KAAK,KAAK;AAE5D,MAAE,CAAC,IAAI,KAAK;AACZ,MAAE,CAAC,IAAI,KAAK;AACZ,MAAE,CAAC,IAAI,KAAK;AACZ,MAAE,CAAC,IAAI,KAAK;AACZ,MAAE,CAAC,IAAI,KAAK;AACZ,MAAE,CAAC,IAAI,KAAK;AACZ,MAAE,CAAC,IAAI,KAAK;AACZ,MAAE,CAAC,IAAI,KAAK;EACd;EACU,SAAS,KAAkB,SAAiB,GAAG,SAAkB,OAAK;AAE9E,QAAI,QAAQ,KAAK;AACjB,QAAI,CAAC,KAAK;AAAU,eAAS,SAAS;AACtC,QAAI,KAAK,aAAa,MAAM;AAAQ,eAAS,SAAS;AACtD,QAAI,CAAC;AAAQ,WAAK,MAAM,KAAK;AAC7B,SAAK,WAAW,KAAK,YAAY,OAAO,KAAK,MAAM;AACnD,SAAK,YAAY;AAEjB,QAAI,KAAK,aAAa,MAAM,QAAQ;AAClC,UAAI,QAAQ,KAAK;AACjB,WAAK,QAAQ,KAAK,GAAG,MAAK;AAO1B,eAAS,MAAM,SAAS,KAAK,aAAa,GAAG,UAAU,EAAE,SAAS,IAAI,WAAW,GAAG;AAClF,YAAI,EAAE,OAAO,KAAK,MAAM,IAAG;AAAK;AAChC,aAAK,SAAS,IAAI,MAAM,CAAC;AACzB,aAAK,SAAS,IAAI,OAAO,CAAC;AAC1B,aAAK,MAAM,KAAK;AAChB,aAAK,WAAW,GAAG,KAAK,QAAQ,SAAS,QAAQ,KAAK,UAAU,CAAC;AACjE,gBAAQ,KAAK;AACb,aAAK,QAAQ,KAAK,GAAG,MAAK;MAC5B;AACA,WAAK;AACL,WAAK,WAAW;AAChB,WAAK,MAAM,KAAK,KAAK;IACvB;AACA,SAAK,MAAM;EACb;EACA,WAAW,IAAW;AACpB,SAAK,MAAM,WAAW,EAAE;AACxB,UAAM,EAAE,IAAI,OAAO,OAAO,UAAU,QAAQ,UAAU,OAAO,WAAU,IAAK;AAC5E,OAAG,MAAM,IAAI,MAAM,MAAK,CAAE;AAC1B,OAAG,QAAQ,MAAM,IAAI,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC;AAC/C,OAAG,GAAG,IAAI,EAAE;AACZ,OAAG,QAAQ;AACX,OAAG,WAAW;AACd,OAAG,aAAa;AAChB,OAAG,SAAS;AACZ,OAAG,WAAW;AACd,OAAG,YAAY,KAAK;AACpB,OAAG,YAAY,IAAI,KAAK,WAAW;AACnC,WAAO;EACT;EACA,UAAO;AACL,SAAK,YAAY;AACjB,UAAM,KAAK,OAAO,KAAK,UAAU,KAAK,IAAI,KAAK,WAAW;AAC1D,UAAM,GAAG,KAAK,KAAK;EACrB;;EAEQ,gBAAa;AACnB,UAAM,EAAE,OAAO,GAAG,KAAK,OAAO,UAAU,aAAa,MAAK,IAAK;AAC/D,UAAM,EAAE,GAAG,EAAC,IAAK,QAAQ,OAAO,KAAK,UAAU,CAAC;AAChD,eAAW,QAAQ;AAEnB,UAAM,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,IAAG,IAC1E,SACE,UAAU,GAAG,UAAU,GACvB,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,GAC7C,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,GAAG,GAAG,KAAK,KAAK;AAE5D,UAAM,CAAC,IAAI,KAAK;AAChB,UAAM,CAAC,IAAI,KAAK;AAChB,UAAM,CAAC,IAAI,KAAK;AAChB,UAAM,CAAC,IAAI,KAAK;AAChB,UAAM,CAAC,IAAI,KAAK;AAChB,UAAM,CAAC,IAAI,KAAK;AAChB,UAAM,CAAC,IAAI,KAAK;AAChB,UAAM,CAAC,IAAI,KAAK;AAChB,UAAM,CAAC,IAAI,EAAE,CAAC,IAAI;AAClB,UAAM,CAAC,IAAI,EAAE,CAAC,IAAI;AAClB,UAAM,EAAE,IAAI,EAAE,CAAC,IAAI;AACnB,UAAM,EAAE,IAAI,EAAE,CAAC,IAAI;AACnB,UAAM,EAAE,IAAI,EAAE,CAAC,IAAI;AACnB,UAAM,EAAE,IAAI,EAAE,CAAC,IAAI;AACnB,UAAM,EAAE,IAAI,EAAE,CAAC,IAAI;AACnB,UAAM,EAAE,IAAI,EAAE,CAAC,IAAI;AACnB,eAAW,QAAQ;AACnB,eAAW,KAAK;AAChB,SAAK,SAAS;EAChB;EACU,SAAM;AACd,QAAI,KAAK;AAAU;AACnB,SAAK,WAAW;AAEhB,UAAM,KAAK,OAAO,SAAS,KAAK,GAAG,CAAC;AAEpC,QAAI,QAAQ,KAAK,QAAQ,SAAS;AAClC,QAAI,KAAK,MAAM,QAAQ;AACrB,eAAS,SAAS;AAClB,iBAAW,KAAK,QAAQ;AACxB,WAAK,SAAS,KAAK,UAAU,GAAG,IAAI;AACpC,iBAAW,KAAK,QAAQ;AACxB,WAAK,aAAa;AAClB,WAAK,MAAM,KAAK;IAClB,OAAO;AACL,gBAAU,CAAC,KAAK,WAAW,SAAS,cAAc,KAAK,SAAS;IAClE;AACA,SAAK,QAAQ;AACb,SAAK,cAAa;EACpB;EACQ,UAAU,KAAe;AAC/B,YAAQ,MAAM,KAAK;AACnB,WAAO,GAAG;AACV,SAAK,OAAM;AACX,UAAM,EAAE,UAAU,UAAS,IAAK;AAChC,aAAS,MAAM,GAAG,MAAM,IAAI,QAAQ,MAAM,OAAO;AAC/C,UAAI,KAAK,UAAU;AAAU,aAAK,cAAa;AAC/C,YAAM,OAAO,KAAK,IAAI,WAAW,KAAK,QAAQ,MAAM,GAAG;AACvD,UAAI,IAAI,UAAU,SAAS,KAAK,QAAQ,KAAK,SAAS,IAAI,GAAG,GAAG;AAChE,WAAK,UAAU;AACf,aAAO;IACT;AACA,WAAO;EACT;EACA,QAAQ,KAAe;AACrB,QAAI,CAAC,KAAK;AAAW,YAAM,IAAI,MAAM,uCAAuC;AAC5E,WAAO,KAAK,UAAU,GAAG;EAC3B;EACA,IAAI,OAAa;AACf,YAAQ,KAAK;AACb,WAAO,KAAK,QAAQ,IAAI,WAAW,KAAK,CAAC;EAC3C;EACA,WAAW,KAAe;AACxB,YAAQ,KAAK,IAAI;AACjB,QAAI,KAAK;AAAU,YAAM,IAAI,MAAM,6BAA6B;AAChE,SAAK,YAAY;AACjB,SAAK,UAAU,GAAG;AAClB,SAAK,QAAO;AACZ,WAAO;EACT;EACA,SAAM;AACJ,WAAO,KAAK,WAAW,IAAI,WAAW,KAAK,SAAS,CAAC;EACvD;;AAaK,IAAM,SAAkC,4BAC7C,CAAC,SAAS,IAAI,OAAO,IAAI,CAAC;;;AC5QrB,IAAM,+BAA+B;AACrC,IAAM,iCAAiC;AACvC,IAAM,gCAAgC;AACtC,IAAM,kCAAkC;AACxC,IAAM,iCAAiC;AACvC,IAAM,oCAAoC;AAC1C,IAAM,8BAA8B,KAAK,OAAO;AAChD,IAAM,2BAA2B;AAExC,IAAM,mBAAmB,IAAI,YAAW,EAAG,OAAO,6BAA6B;AAoB/E,SAAS,aAAa,MAAc,OAAmB,QAAc;AACnE,MAAI,MAAM,eAAe,QAAQ;AAC/B,UAAM,IAAI,MAAM,GAAG,IAAI,YAAY,MAAM,eAAe,MAAM,UAAU,EAAE;EAC5E;AACF;AAEA,SAAS,WAAW,MAAc,OAAa;AAC7C,MAAI,CAAC,OAAO,UAAU,KAAK,KAAK,QAAQ,KAAK,QAAQ,YAAa;AAChE,UAAM,IAAI,MAAM,GAAG,IAAI,qCAAqC;EAC9D;AACF;AAEA,SAAS,WAAW,MAAc,OAAa;AAC7C,MAAI,QAAQ,MAAM,QAAQ,qBAAwB;AAChD,UAAM,IAAI,MAAM,GAAG,IAAI,qCAAqC;EAC9D;AACF;AAEA,SAAS,kBAAkB,OAAa;AACtC,aAAW,cAAc,KAAK;AAC9B,MAAI,QAAQ,6BAA6B;AACvC,UAAM,IAAI,MAAM,0BAA0B,2BAA2B,uBAAuB;EAC9F;AACF;AAEM,SAAU,uBAAuB,QAAkB;AACvD,SAAO,OAAO,MAAM;AACtB;AAEM,SAAU,mBACd,SACA,UACA,QACA,YAAkB;AAElB,aAAW,WAAW,OAAO;AAC7B,aAAW,YAAY,QAAQ;AAC/B,eAAa,UAAU,QAAQ,EAAE;AACjC,oBAAkB,UAAU;AAC5B,QAAM,WAAW,IAAI,WAAW,EAAE;AAClC,QAAM,OAAO,IAAI,SAAS,SAAS,MAAM;AACzC,OAAK,aAAa,GAAG,OAAO;AAC5B,OAAK,UAAU,GAAG,QAAQ;AAC1B,WAAS,IAAI,QAAQ,EAAE;AACvB,OAAK,UAAU,IAAI,UAAU;AAC7B,SAAO,OAAO,QAAQ;AACxB;AAEM,SAAU,qBACd,SAKG;AAEH,MAAI,QAAQ,WAAW;AAAG,UAAM,IAAI,MAAM,0CAA0C;AACpF,MAAI,QAAQ,SAAS,mCAAmC;AACtD,UAAM,IAAI,MAAM,iBAAiB,iCAAiC,UAAU;EAC9E;AACA,QAAM,UAAU,QAAQ,CAAC,EAAG;AAC5B,QAAM,YAAY,oBAAI,IAAG;AACzB,QAAM,UAAU,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,WAAW,MAAM,QAAQ;AACjF,MAAI,QAAQ,QAAQ,IAAI,CAAC,UAAS;AAChC,QAAI,MAAM,YAAY;AAAS,YAAM,IAAI,MAAM,yCAAyC;AACxF,QAAI,UAAU,IAAI,MAAM,QAAQ;AAAG,YAAM,IAAI,MAAM,sBAAsB,MAAM,QAAQ,EAAE;AACzF,cAAU,IAAI,MAAM,QAAQ;AAC5B,WAAO,mBAAmB,MAAM,SAAS,MAAM,UAAU,MAAM,QAAQ,MAAM,UAAU;EACzF,CAAC;AACD,SAAO,MAAM,SAAS,GAAG;AACvB,UAAM,UAAwB,CAAA;AAC9B,aAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,YAAM,OAAO,MAAM,KAAK;AACxB,YAAM,QAAQ,MAAM,QAAQ,CAAC,KAAK;AAClC,YAAM,WAAW,IAAI,WAAW,EAAE;AAClC,eAAS,CAAC,IAAI;AACd,eAAS,IAAI,MAAM,CAAC;AACpB,eAAS,IAAI,OAAO,EAAE;AACtB,cAAQ,KAAK,OAAO,QAAQ,CAAC;IAC/B;AACA,YAAQ;EACV;AACA,SAAO,MAAM,CAAC;AAChB;AAEM,SAAU,8BACd,iBACA,YAAkB;AAElB,oBAAkB,UAAU;AAC5B,MAAI,aAAa,gBAAgB,YAAY;AAC3C,UAAM,IAAI,MAAM,eAAe,UAAU,kCAAkC,gBAAgB,UAAU,EAAE;EACzG;AACA,SAAO,gBAAgB,SAAS,GAAG,UAAU;AAC/C;AAEM,SAAU,4BACd,OAA0C;AAE1C,aAAW,YAAY,MAAM,QAAQ;AACrC,oBAAkB,MAAM,UAAU;AAClC,aAAW,WAAW,MAAM,OAAO;AACnC,eAAa,UAAU,MAAM,QAAQ,EAAE;AACvC,QAAM,QAAQ,IAAI,WAAW,+BAA+B;AAC5D,QAAM,OAAO,IAAI,SAAS,MAAM,MAAM;AACtC,QAAM,CAAC,IAAI;AACX,QAAM,CAAC,IAAI;AACX,OAAK,aAAa,GAAG,MAAM,OAAO;AAClC,OAAK,UAAU,IAAI,MAAM,QAAQ;AACjC,OAAK,UAAU,IAAI,MAAM,UAAU;AACnC,QAAM,IAAI,MAAM,QAAQ,EAAE;AAC1B,SAAO;AACT;AAEM,SAAU,2BACd,OAAyC;AAEzC,aAAW,eAAe,MAAM,WAAW;AAC3C,MAAI,MAAM,gBAAgB,KAAK,MAAM,cAAc,mCAAmC;AACpF,UAAM,IAAI,MAAM,qCAAqC,iCAAiC,EAAE;EAC1F;AACA,aAAW,WAAW,MAAM,OAAO;AACnC,eAAa,QAAQ,MAAM,MAAM,EAAE;AACnC,eAAa,aAAa,MAAM,WAAW,EAAE;AAC7C,QAAM,QAAQ,IAAI,WAAW,8BAA8B;AAC3D,QAAM,OAAO,IAAI,SAAS,MAAM,MAAM;AACtC,QAAM,CAAC,IAAI;AACX,QAAM,CAAC,IAAI;AACX,OAAK,aAAa,GAAG,MAAM,OAAO;AAClC,OAAK,UAAU,IAAI,MAAM,WAAW;AACpC,QAAM,IAAI,MAAM,MAAM,EAAE;AACxB,QAAM,IAAI,MAAM,WAAW,EAAE;AAC7B,SAAO;AACT;AAEM,SAAU,4BACd,WACA,SACA,aACA,MAAgB;AAEhB,aAAW,eAAe,WAAW;AACrC,MAAI,gBAAgB,KAAK,cAAc,mCAAmC;AACxE,UAAM,IAAI,MAAM,qCAAqC,iCAAiC,EAAE;EAC1F;AACA,aAAW,WAAW,OAAO;AAC7B,eAAa,aAAa,WAAW,wBAAwB;AAC7D,eAAa,QAAQ,MAAM,EAAE;AAC7B,QAAM,WAAW,IAAI,WAAW,GAAG;AACnC,QAAM,OAAO,IAAI,SAAS,SAAS,MAAM;AACzC,WAAS,IAAI,gBAAgB;AAC7B,WAAS,IAAI,WAAW,EAAE;AAC1B,OAAK,aAAa,IAAI,OAAO;AAC7B,OAAK,UAAU,IAAI,WAAW;AAC9B,WAAS,IAAI,MAAM,EAAE;AACrB,SAAO;AACT;AAEM,SAAU,8BAA8B,OAAiB;AAC7D,QAAM,YAAY,MAAM,CAAC;AACzB,QAAM,iBAAiB,cAAc,iCACjC,kCACA,cAAc,gCACZ,iCACA;AACN,MAAI,mBAAmB;AAAG,UAAM,IAAI,MAAM,mCAAmC,SAAS,EAAE;AACxF,MAAI,MAAM,eAAe,gBAAgB;AACvC,UAAM,IAAI,MAAM,qCAAqC,MAAM,UAAU,aAAa,SAAS,EAAE;EAC/F;AACA,MAAI,MAAM,CAAC,MAAM,8BAA8B;AAC7C,UAAM,IAAI,MAAM,gCAAgC,MAAM,CAAC,CAAC,EAAE;EAC5D;AACA,MAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;AAAG,UAAM,IAAI,MAAM,qCAAqC;AAE3F,QAAM,OAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAC1E,QAAM,UAAU,KAAK,aAAa,CAAC;AACnC,MAAI,cAAc,gCAAgC;AAChD,UAAM,QAA+B;MACnC,MAAM;MACN;MACA,UAAU,KAAK,UAAU,EAAE;MAC3B,YAAY,KAAK,UAAU,EAAE;MAC7B,QAAQ,MAAM,MAAM,IAAI,EAAE;;AAE5B,sBAAkB,MAAM,UAAU;AAClC,WAAO;EACT;AACA,QAAM,QAA8B;IAClC,MAAM;IACN;IACA,aAAa,KAAK,UAAU,EAAE;IAC9B,MAAM,MAAM,MAAM,IAAI,EAAE;IACxB,WAAW,MAAM,MAAM,IAAI,GAAG;;AAEhC,MAAI,MAAM,gBAAgB,KAAK,MAAM,cAAc,mCAAmC;AACpF,UAAM,IAAI,MAAM,qCAAqC,iCAAiC,EAAE;EAC1F;AACA,SAAO;AACT;;;AC1MA,SAASA,YAAW,MAAc,OAAa;AAC7C,MAAI,QAAQ,MAAM,QAAQ,qBAAwB;AAChD,UAAM,IAAI,MAAM,GAAG,IAAI,qCAAqC;EAC9D;AACF;AAEA,SAAS,WAAW,MAAkB,OAAiB;AACrD,MAAI,KAAK,eAAe,MAAM;AAAY,WAAO;AACjD,SAAO,KAAK,MAAM,CAAC,OAAO,UAAU,UAAU,MAAM,KAAK,CAAC;AAC5D;AApCA;AA0CM,IAAO,sBAAP,MAA0B;EAS9B,YAAY,SAA2C;AATnD;AACK;AACA,iCAAW,oBAAI,IAAG;AAClB,wCAAkB,oBAAI,IAAG;AACzB,gDAA0B,oBAAI,IAAG;AACjC,oCAAc,oBAAI,IAAG;AAC9B,iCAA0B;AAC1B,gCAAU;AAGR,uBAAK,wBAAyB,QAAQ;EACxC;EAEA,YAAY,OAKX;AACC,0BAAK,iDAAL,WAAmB,MAAM;AACzB,QAAI,mBAAK;AAAS,YAAM,IAAI,MAAM,qCAAqC;AACvE,QAAI,mBAAK,aAAY,IAAI,MAAM,QAAQ,KAAK,mBAAK,iBAAgB,IAAI,MAAM,QAAQ,GAAG;AACpF,YAAM,IAAI,MAAM,gCAAgC,MAAM,QAAQ,EAAE;IAClE;AACA,UAAM,QAAQ,mBAAK,UAAS,IAAI,MAAM,QAAQ;AAC9C,QAAI,OAAO;AACT,yBAAK,yBAAwB,OAAO,MAAM,QAAQ;AAClD,aAAO,sBAAK,iDAAL,WAAmB,OAAO,MAAM,OAAO,MAAM,aAAa;IACnE;AACA,QAAI,mBAAK,iBAAgB,QAAQ,GAAG;AAClC,YAAM,IAAI,MAAM,oDAAoD;IACtE;AACA,uBAAK,iBAAgB,IAAI,MAAM,UAAU;MACvC,OAAO,MAAM;MACb,WAAW,MAAM,aAAa;KAC/B;AACD,WAAO;MACL,SAAS,MAAM;MACf,UAAU,MAAM;MAChB,WAAW,MAAM,aAAa;MAC9B,OAAO;;EAEX;EAEA,WAAW,OAA4B;AACrC,0BAAK,iDAAL,WAAmB,MAAM;AACzB,QAAI,mBAAK;AAAS,YAAM,IAAI,MAAM,qCAAqC;AACvE,QAAI,mBAAK,UAAS,IAAI,MAAM,QAAQ,GAAG;AACrC,YAAM,IAAI,MAAM,wCAAwC,MAAM,QAAQ,EAAE;IAC1E;AACA,UAAM,UAAU,mBAAK,iBAAgB,IAAI,MAAM,QAAQ;AACvD,QAAI,CAAC,WAAW,mBAAK,yBAAwB,QAAQ,GAAG;AACtD,YAAM,IAAI,MAAM,oDAAoD;IACtE;AACA,uBAAK,UAAS,IAAI,MAAM,UAAU,KAAK;AACvC,QAAI,CAAC,SAAS;AACZ,yBAAK,yBAAwB,IAAI,MAAM,QAAQ;AAC/C,aAAO;IACT;AACA,uBAAK,iBAAgB,OAAO,MAAM,QAAQ;AAC1C,WAAO,sBAAK,iDAAL,WAAmB,OAAO,QAAQ,OAAO,QAAQ;EAC1D;EAEA,YAAY,UAAgB;AAC1B,QAAI,mBAAK,iBAAgB,IAAI,QAAQ;AAAG,aAAO;AAC/C,QAAI,mBAAK,yBAAwB,IAAI,QAAQ;AAAG,aAAO;AACvD,QAAI,mBAAK,YAAW,mBAAK,aAAY,IAAI,QAAQ;AAAG,aAAO;AAC3D,WAAO,mBAAK,aAAY,IAAI,QAAQ,GAAG;EACzC;EAEA,MAAM,YACJ,OACA,WACA,WACA,SAAuB,WAAW,OAAO,QAAM;AAE/C,0BAAK,iDAAL,WAAmB,MAAM;AACzB,QAAI,mBAAK;AAAS,YAAM,IAAI,MAAM,qCAAqC;AACvE,QAAI,mBAAK,iBAAgB,SAAS,KAAK,mBAAK,yBAAwB,SAAS,GAAG;AAC9E,YAAM,IAAI,MAAM,4DAA4D;IAC9E;AACA,QAAI,MAAM,gBAAgB,mBAAK,UAAS,QAAQ,mBAAK,aAAY,SAAS,mBAAK,UAAS,MAAM;AAC5F,YAAM,IAAI,MAAM,+CAA+C;IACjE;AACA,UAAM,OAAO,qBAAqB,CAAC,GAAG,mBAAK,UAAS,OAAM,CAAE,CAAC;AAC7D,QAAI,CAAC,WAAW,MAAM,MAAM,IAAI;AAAG,YAAM,IAAI,MAAM,iCAAiC;AACpF,UAAM,WAAW,MAAM,OAAO,OAC5B,WACA,WACA,IAAI,WAAW,MAAM,SAAS,EAAE,QAChC,IAAI,WACF,4BAA4B,WAAW,MAAM,SAAS,MAAM,aAAa,IAAI,CAAC,EAC9E,MAAM;AAEV,QAAI,CAAC;AAAU,YAAM,IAAI,MAAM,0CAA0C;AACzE,eAAW,aAAa,mBAAK,aAAY,OAAM;AAAI,gBAAU,QAAQ;AACrE,uBAAK,SAAU;EACjB;;AAhGS;AACA;AACA;AACA;AACA;AACT;AACA;AAPI;AAmGJ,kBAAa,SAAC,SAAe;AAC3B,EAAAA,YAAW,WAAW,OAAO;AAC7B,MAAI,mBAAK,cAAa;AAAM,uBAAK,UAAW;WACnC,mBAAK,cAAa;AAAS,UAAM,IAAI,MAAM,qCAAqC;AAC3F;AAEA,kBAAa,SACX,OACA,OACA,WAAkB;AAElB,QAAM,gBAAgB,YAClB,8BAA8B,OAAO,MAAM,UAAU,IACrD;AACJ,MAAI,CAAC,aAAa,MAAM,eAAe,MAAM,YAAY;AACvD,UAAM,IAAI,MAAM,iDAAiD,MAAM,QAAQ,EAAE;EACnF;AACA,MAAI,CAAC,WAAW,uBAAuB,aAAa,GAAG,MAAM,MAAM,GAAG;AACpE,UAAM,IAAI,MAAM,0CAA0C,MAAM,QAAQ,EAAE;EAC5E;AACA,QAAM,YAAuC;IAC3C,SAAS,MAAM;IACf,UAAU,MAAM;IAChB;IACA,OAAO,mBAAK,0BAAyB,kBAAkB;;AAEzD,qBAAK,aAAY,IAAI,MAAM,UAAU,SAAS;AAC9C,SAAO;AACT;;;ACxEI,SAAU,kBAAkB,WAAmB,oBAA0B;AAC7E,SAAO,KAAK,UAAU,CAAC,WAAW,kBAAkB,CAAC;AACvD;AAEM,SAAU,+BACd,SAAuB,WAAW,OAAO,QAAM;AAE/C,SAAO,OAAO,WAAW,SAAS,cAAa;AAC7C,UAAM,WAAW,WAAW,KAAK,SAAS;AAC1C,UAAM,eAAe,WAAW,KAAK,OAAO;AAC5C,UAAM,iBAAiB,WAAW,KAAK,SAAS;AAChD,UAAM,MAAM,MAAM,OAAO,UAAU,OAAO,SAAS,QAAQ,WAAW,OAAO,CAAC,QAAQ,CAAC;AACvF,WAAO,OAAO,OAAO,WAAW,KAAK,eAAe,QAAQ,aAAa,MAAM;EACjF;AACF;AAgCA,IAAM,kBAAoD;EACxD;EACA;EACA;EACA;EACA;;AAGF,IAAMC,cAAa,CAAC,MAAkB,UAA8B;AAClE,MAAI,KAAK,eAAe,MAAM;AAAY,WAAO;AACjD,MAAI,OAAO;AACX,WAAS,QAAQ,GAAG,QAAQ,KAAK,YAAY;AAAS,YAAQ,KAAK,KAAK,IAAK,MAAM,KAAK;AACxF,SAAO,SAAS;AAClB;AAEA,IAAM,gBAAgB,CAAC,UACrB,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAO,MAAM,SAAS;AA/JvE;AAiKM,IAAO,mBAAP,MAAuB;EAY3B,YAAY,SAIX;AAhBG;AACJ;AACS;AACA;AACA,gCAAU,oBAAI,IAAG;AACjB,+BAAyD;MAChE,UAAU;MACV,UAAU,OAAO,YAAY,gBAAgB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;MACzE,kBAAkB;;AAEpB,kCAAY;AAOV,uBAAK,SAAU,EAAE,GAAG,QAAQ,aAAY;AACxC,uBAAK,kBAAmB,QAAQ;AAChC,uBAAK,YAAa,QAAQ;EAC5B;EAEA,IAAI,SAAM;AACR,WAAO,mBAAK;EACd;EAEA,IAAI,QAAK;AACP,QAAI,cAAc;AAClB,eAAW,SAAS,mBAAK,SAAQ,OAAM;AAAI,qBAAe,MAAM,WAAW;AAC3E,WAAO;MACL,UAAU,mBAAK,QAAO;MACtB,UAAU,EAAE,GAAG,mBAAK,QAAO,SAAQ;MACnC;MACA,kBAAkB,mBAAK,QAAO;;EAElC;EAEA,QAAQ,MAAsB;AAC5B,uBAAK,SAAU,EAAE,GAAG,mBAAK,UAAS,KAAI;AACtC,QAAI,SAAS;AAAW,4BAAK,sDAAL,WAA2B;EACrD;EAEA,cAAc,SAA6B;AACzC,UAAM,YAAY,QAAQ,aAAa,QAAQ;AAC/C,QAAI,mBAAK,SAAQ,IAAI,SAAS,GAAG;AAC/B,YAAM,IAAI,MAAM,oBAAoB,SAAS,wBAAwB;IACvE;AACA,QAAI,CAAC,OAAO,SAAS,QAAQ,OAAO,KAAK,QAAQ,WAAW,GAAG;AAC7D,YAAM,IAAI,MAAM,oCAAoC;IACtD;AACA,QAAI,CAAC,OAAO,SAAS,QAAQ,eAAe,KAAK,QAAQ,mBAAmB,GAAG;AAC7E,YAAM,IAAI,MAAM,4CAA4C;IAC9D;AACA,QAAI,QAAQ,UAAU,eAAe;AAAI,YAAM,IAAI,MAAM,qCAAqC;AAC9F,QAAI,QAAQ,UAAU,eAAe;AAAI,YAAM,IAAI,MAAM,qCAAqC;AAC9F,eAAW,OAAO,QAAQ,sBAAsB,CAAA,GAAI;AAClD,UAAI,IAAI,eAAe;AAAI,cAAM,IAAI,MAAM,uDAAuD;IACpG;AACA,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ;MACzC,sBAAsB,QAAQ;MAC9B,WAAW,QAAQ;MACnB,OAAO,QAAQ;MACf,QAAQ,QAAQ;MAChB,aAAa,QAAQ;KACtB,GAAG;AACF,UAAI,MAAM,WAAW;AAAG,cAAM,IAAI,MAAM,YAAY,IAAI,oBAAoB;IAC9E;AACA,uBAAK,SAAQ,IAAI,WAAW;MAC1B,SAAS,EAAE,GAAG,SAAS,UAAS;MAChC,QAAQ,oBAAI,IAAG;MACf,YAAY,CAAA;MACZ,kBAAkB;MAClB,UAAU,KAAK,KAAM,QAAQ,UAAU,QAAQ,kBAAmB,GAAI;MACtE,iBAAiB;MACjB,oBAAoB,KAAK,KAAM,QAAQ,UAAU,QAAQ,mBAAoB,MAAO,GAAG;MACvF,WAAW,QAAQ,OAAO,IAAI;KAC/B;EACH;EAEA,oBAAoB,WAAmB,YAAsB;AAC3D,UAAM,QAAQ,sBAAK,8CAAL,WAAmB;AACjC,QAAI;AACF,YAAM,QAAQ,8BAA8B,UAAU;AACtD,YAAM,UAAU,MAAM;AACtB,YAAM,QAAQ,sBAAK,uCAAL,WAAY,OAAO;AACjC,UAAI,MAAM,SAAS,UAAU;AAC3B,YAAI,MAAM,SAAS,MAAM,oBAAoB,MAAM,QAAQ;AACzD,gCAAK,yCAAL,WAAc,EAAE,WAAW,MAAM,QAAQ,WAAW,WAAW,SAAS,UAAU,MAAM,SAAQ,GAAI;AACpG;QACF;AACA,YAAI,MAAM,QAAQ,IAAI,MAAM,QAAQ,GAAG;AACrC,gCAAK,yCAAL,WAAc,EAAE,WAAW,MAAM,QAAQ,WAAW,WAAW,SAAS,UAAU,MAAM,SAAQ,GAAI;AACpG;QACF;AACA,YAAI,MAAM,QAAQ,QAAQ,QAAQ,MAAM,mBAAmB,MAAM,oBAAoB;AACnF,gCAAK,yCAAL,WAAc,EAAE,WAAW,MAAM,QAAQ,WAAW,WAAW,SAAS,UAAU,MAAM,SAAQ,GAAI;AACpG;QACF;AACA,cAAM,QAAQ,IAAI,MAAM,UAAU,KAAK;AACvC,cAAM;AACN,cAAM,UAAU,MAAM,QAAQ,IAAI,MAAM,QAAQ;AAChD,YAAI,SAAS;AACX,gCAAK,yCAAL,WAAc,QAAQ,UAAU;AAChC,gCAAK,gDAAL,WAAqB,OAAO,OAAO,SAAS;QAC9C;AACA,YAAI,MAAM,gBAAgB,MAAM,QAAQ,SAAS,MAAM,aAAa,aAAa;AAC/E,gBAAM,QAAQ,MAAM;AACpB,gBAAM,eAAe;AACrB,gCAAK,4CAAL,WAAiB,OAAO,SAAS,OAAO;QAC1C;AACA;MACF;AACA,4BAAK,4CAAL,WAAiB,OAAO,SAAS,OAAO;IAC1C,QAAQ;AACN,4BAAK,yCAAL,WAAc,EAAE,WAAW,MAAM,QAAQ,WAAW,WAAW,SAAS,GAAG,UAAU,EAAC,GAAI;IAC5F;EACF;EAEA,YACE,UACA,MACA,SAAmB;AAEnB,QAAI,mBAAK,SAAQ,SAAS,OAAO;AAC/B,cAAO;AACP,aAAO,EAAE,QAAQ,QAAQ,UAAU,MAAK;IAC1C;AACA,UAAM,QAAQ,mBAAK,SAAQ,IAAI,SAAS,aAAa,SAAS,SAAS;AACvE,QAAI,CAAC,OAAO;AACV,cAAO;AACP,4BAAK,yCAAL,WAAc,UAAU;AACxB,aAAO,EAAE,QAAQ,QAAQ,UAAU,OAAO,QAAQ,gBAAe;IACnE;AACA,QAAI;AACF,UAAI,CAAC,sBAAK,kDAAL,WAAuB,OAAO,WAAW;AAC5C,eAAO,sBAAK,gDAAL,WAAqB,UAAU,SAAS;MACjD;AACA,YAAM,QAAQ,sBAAK,uCAAL,WAAY,OAAO,OAAO,SAAS,OAAO;AACxD,UAAI,MAAM,WAAW,gBAAgB,MAAM,WAAW,kBAAkB;AACtE,eAAO,sBAAK,gDAAL,WAAqB,UAAU,SAAS,MAAM;MACvD;AACA,YAAM,QAAQ,MAAM,QAAQ,IAAI,SAAS,QAAQ;AACjD,UAAI;AAAO,eAAO,sBAAK,mDAAL,WAAwB,OAAO,OAAO,UAAU,MAAM,SAAS;AACjF,UAAI,mBAAK,SAAQ,SAAS,YAAY,mBAAK,SAAQ,sBAAsB,mBAAmB;AAC1F,gBAAO;AACP,8BAAK,yCAAL,WAAc,UAAU;AACxB,eAAO,EAAE,QAAQ,QAAQ,UAAU,OAAO,QAAQ,iBAAgB;MACpE;AACA,UAAI,CAAC,sBAAK,4CAAL,WAAiB,OAAO,OAAO,EAAE,UAAU,MAAM,SAAS,OAAO,KAAK,WAAU,IAAK;AACxF,eAAO,EAAE,QAAQ,QAAQ,UAAU,MAAK;MAC1C;AACA,aAAO,EAAE,QAAQ,SAAS,UAAU,MAAK;IAC3C,QAAQ;AACN,cAAO;AACP,4BAAK,yCAAL,WAAc,UAAU;AACxB,aAAO,EAAE,QAAQ,QAAQ,UAAU,OAAO,QAAQ,gBAAe;IACnE;EACF;EAEA,UAAO;AACL,QAAI,mBAAK;AAAW;AACpB,uBAAK,WAAY;AACjB,0BAAK,sDAAL,WAA2B;AAC3B,uBAAK,SAAQ,MAAK;EACpB;;AAnKA;AACS;AACA;AACA;AACA;AAKT;AAVI;AAsKJ,kBAAa,SAAC,WAAiB;AAC7B,QAAM,QAAQ,mBAAK,SAAQ,IAAI,SAAS;AACxC,MAAI,CAAC;AAAO,UAAM,IAAI,MAAM,4BAA4B,SAAS,EAAE;AACnE,SAAO;AACT;AAEA,WAAM,SAAC,OAAmB,SAAe;AACvC,MAAI,QAAQ,MAAM,OAAO,IAAI,OAAO;AACpC,MAAI,CAAC,OAAO;AACV,YAAQ,EAAE,SAAS,oBAAI,IAAG,GAAI,SAAS,oBAAI,IAAG,GAAI,cAAc,MAAK;AACrE,UAAM,OAAO,IAAI,SAAS,KAAK;AAC/B,WAAO,MAAM,OAAO,OAAO,MAAM,WAAW;AAC1C,YAAM,SAAS,MAAM,OAAO,QAAO,EAAG,KAAI,EAAG;AAC7C,UAAI,CAAC;AAAQ;AACb,YAAM,CAAC,UAAU,WAAW,IAAI;AAChC,iBAAW,WAAW,CAAC,GAAG,YAAY,QAAQ,OAAM,CAAE,GAAG;AACvD,8BAAK,+CAAL,WAAoB,OAAO,aAAa;AACxC,gBAAQ,QAAO;AAMf,8BAAK,yCAAL,WAAc,QAAQ,UAAU;MAClC;AACA,YAAM,mBAAmB,YAAY,QAAQ;AAC7C,YAAM,OAAO,OAAO,QAAQ;IAC9B;EACF;AACA,SAAO;AACT;AAEA,sBAAiB,SAAC,OAAmB,UAAgC;AACnE,QAAM,cAAc,MAAM,QAAQ,OAAO,OAAO,OAAO,SAAS,OAAO,GAAG,SAAS,QAAQ;AAC3F,SAAO,SAAS,SAAS,UAAa,YAAY,SAAS,SAAS;AACtE;AAEA,uBAAkB,SAChB,OACA,OACA,UACA,MACA,SACA,OAA4B;AAE5B,MAAI,MAAM,eAAe,KAAK,YAAY;AACxC,WAAO,sBAAK,gDAAL,WAAqB,UAAU,SAAS;EACjD;AACA,QAAM,gBAAgBA,YAAW,uBAAuB,KAAK,SAAS,GAAG,MAAM,UAAU,CAAC,GAAG,MAAM,MAAM;AACzG,MAAI,CAAC;AAAe,WAAO,sBAAK,gDAAL,WAAqB,UAAU,SAAS;AACnE,MAAI,CAAC,MAAM,QAAQ,gCAAgC,CAAC,MAAM,cAAc;AACtE,QAAI,mBAAK,SAAQ,SAAS,UAAU;AAClC,cAAO;AACP,aAAO,EAAE,QAAQ,QAAQ,UAAU,MAAK;IAC1C;AACA,QAAI,CAAC,sBAAK,4CAAL,WAAiB,OAAO,OAAO,EAAE,UAAU,MAAM,SAAS,OAAO,KAAK,WAAU,IAAK;AACxF,aAAO,EAAE,QAAQ,QAAQ,UAAU,MAAK;IAC1C;AACA,WAAO,EAAE,QAAQ,SAAS,UAAU,MAAK;EAC3C;AACA,UAAO;AACP,qBAAK,QAAO;AACZ,SAAO,EAAE,QAAQ,QAAQ,UAAU,KAAI;AACzC;AAEA,oBAAe,SACb,UACA,SACA,QAAuC;AAEvC,wBAAK,yCAAL,WAAc,UAAU;AACxB,MAAI,mBAAK,SAAQ,SAAS,WAAW;AACnC,YAAQ,KAAK,KAAK,UAAU,EAAE,OAAO,yBAAyB,OAAO,SAAS,WAAW,OAAO,OAAO,SAAS,OAAO,GAAG,QAAQ,SAAS,UAAU,OAAM,CAAE,CAAC;AAC9J,WAAO,EAAE,QAAQ,QAAQ,UAAU,OAAO,OAAM;EAClD;AACA,UAAO;AACP,SAAO,EAAE,QAAQ,QAAQ,UAAU,OAAO,OAAM;AAClD;AAEA,oBAAe,SACb,OACA,OACA,SACA,OAA4B;AAE5B,wBAAK,+CAAL,WAAoB,OAAO,OAAO;AAClC,wBAAK,mDAAL,WAAwB,OAAO,OAAO,QAAQ,UAAU,QAAQ,MAAM,QAAQ,SAAS;AACzF;AAEA,gBAAW,SACT,OACA,SACA,OACA,OAA2B;AAE3B,MAAI,MAAM,SAAS,MAAM;AAAkB;AAC3C,QAAM,UAAU,CAAC,GAAG,MAAM,QAAQ,OAAM,CAAE;AAC1C,MAAI,QAAQ,WAAW,MAAM,aAAa;AAKxC,UAAM,eAAe;AACrB,UAAM,aAAa,MAAM,QAAQ,OAAO;AACxC,QAAI,mBAAK,SAAQ,sBAAsB,qBAAqB,mBAAK,SAAQ,SAAS,UAAU;AAC1F,iBAAW,WAAW,CAAC,GAAG,MAAM,QAAQ,OAAM,CAAE,GAAG;AACjD,8BAAK,+CAAL,WAAoB,OAAO,OAAO;AAClC,gBAAQ,QAAO;AACf,8BAAK,yCAAL,WAAc,QAAQ,UAAU;MAClC;IACF,OAAO;AACL,iBAAW,WAAW,MAAM,QAAQ,OAAM,GAAI;AAC5C,8BAAK,yCAAL,WAAc,QAAQ,UAAU;MAClC;IACF;AACA,QAAI,CAAC,YAAY;AACf,4BAAK,yCAAL,WAAc,EAAE,WAAW,MAAM,QAAQ,WAAW,SAAS,UAAU,EAAC,GAAI;IAC9E;AACA;EACF;AACA,MAAI,CAACA,YAAW,qBAAqB,OAAO,GAAG,MAAM,IAAI,GAAG;AAC1D,UAAM,SAAS;AACf,0BAAK,2CAAL,WAAgB,OAAO,SAAS,OAAO;AACvC;EACF;AACA,QAAM,WAAW,4BAA4B,MAAM,QAAQ,WAAW,MAAM,SAAS,MAAM,aAAa,MAAM,IAAI;AAClH,MAAI;AACJ,MAAI;AACF,qBAAiB,sBAAK,yDAAL,WAA8B,OAAO,UAAU,MAAM;EACxE,QAAQ;AACN,0BAAK,+CAAL,WAAoB,OAAO,SAAS;AACpC;EACF;AACA,MAAI,cAAc,cAAc,GAAG;AACjC,UAAM,mBAAmB;AACzB,SAAK,eAAe,KAClB,CAAC,UAAS;AACR,UAAI,mBAAK;AAAW;AACpB,YAAM,mBAAmB;AACzB,4BAAK,sDAAL,WAA2B,OAAO,SAAS,OAAO,OAAO;IAC3D,GACA,MAAK;AACH,UAAI,mBAAK;AAAW;AACpB,YAAM,mBAAmB;AACzB,4BAAK,+CAAL,WAAoB,OAAO,SAAS;IACtC,CAAC;AAEH;EACF;AACA,wBAAK,sDAAL,WAA2B,OAAO,SAAS,OAAO,OAAO;AAC3D;AAEA,0BAAqB,SACnB,OACA,SACA,OACA,OACA,gBAAuB;AAEvB,MAAI,CAAC,gBAAgB;AACnB,UAAM,SAAS;AACf,0BAAK,2CAAL,WAAgB,OAAO,SAAS,OAAO;AACvC;EACF;AACA,QAAM,SAAS;AACf,QAAM,QAAQ;AACd,QAAM,eAAe;AACrB,QAAM,eAAe;AACrB,aAAW,WAAW,CAAC,GAAG,MAAM,QAAQ,OAAM,CAAE,GAAG;AACjD,UAAM,QAAQ,MAAM,QAAQ,IAAI,QAAQ,SAAS,QAAQ;AACzD,QAAI;AAAO,4BAAK,gDAAL,WAAqB,OAAO,OAAO,SAAS;aAC9C,mBAAK,SAAQ,sBAAsB,mBAAmB;AAC7D,4BAAK,+CAAL,WAAoB,OAAO,OAAO;AAClC,cAAQ,QAAO;AACf,4BAAK,yCAAL,WAAc,QAAQ,UAAU;IAClC;EACF;AACF;AAEA,6BAAwB,SACtB,OACA,SACA,WAAqB;AAErB,QAAM,OAAO,MAAM,QAAQ,sBAAsB,CAAC,MAAM,QAAQ,SAAS;AACzE,QAAM,UAAwC,CAAA;AAC9C,MAAI,sBAAsB;AAC1B,aAAW,OAAO,MAAM;AACtB,QAAI;AACF,YAAM,SAAS,mBAAK,kBAAL,WAAsB,KAAK,SAAS;AACnD,UAAI,cAAc,MAAM,GAAG;AACzB,gBAAQ,KAAK,QAAQ,QAAQ,MAAM,EAAE,KAAK,CAAC,UAAU,OAAO,MAAM,OAAgB,CAAC;MACrF,WAAW,QAAQ;AACjB,eAAO;MACT;IACF,QAAQ;AACN,4BAAsB;IACxB;EACF;AACA,MAAI,QAAQ,WAAW,GAAG;AACxB,QAAI;AAAqB,YAAM,IAAI,MAAM,yCAAyC;AAClF,WAAO;EACT;AACA,SAAO,QAAQ,IAAI,OAAO,EAAE,KAAK,CAAC,YAAW;AAC3C,QAAI,QAAQ,KAAK,CAAC,UAAU,UAAU,IAAI;AAAG,aAAO;AACpD,QAAI,uBAAuB,QAAQ,KAAK,CAAC,UAAU,UAAU,OAAO,GAAG;AACrE,YAAM,IAAI,MAAM,yCAAyC;IAC3D;AACA,WAAO;EACT,CAAC;AACH;AAEA,eAAU,SACR,OACA,SACA,OACA,QAAuC;AAEvC,MAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,0BAAK,yCAAL,WAAc,EAAE,WAAW,MAAM,QAAQ,WAAW,SAAS,UAAU,EAAC,GAAI;AAC5E;EACF;AACA,aAAW,WAAW,CAAC,GAAG,MAAM,QAAQ,OAAM,CAAE,GAAG;AACjD,0BAAK,+CAAL,WAAoB,OAAO,OAAO;AAClC,0BAAK,gDAAL,WAAqB,QAAQ,UAAU,QAAQ,SAAS;EAC1D;AACF;AAEA,mBAAc,SAAC,OAAmB,OAAmB,SAAsB;AACzE,MAAI,MAAM,QAAQ,IAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS;AAC5D,UAAM,QAAQ,OAAO,QAAQ,SAAS,QAAQ;EAChD;AACA,QAAM,QAAQ,MAAM,WAAW,QAAQ,OAAO;AAC9C,MAAI,SAAS;AAAG,UAAM,WAAW,OAAO,OAAO,CAAC;AAChD,QAAM,oBAAoB,QAAQ;AAClC,qBAAK,QAAO,oBAAoB,QAAQ;AAC1C;AAEA,gBAAW,SAAC,OAAmB,OAAmB,SAAsB;AACtE,MAAI,MAAM,QAAQ,IAAI,QAAQ,SAAS,QAAQ;AAAG,WAAO;AACzD,QAAM,QAAQ,IAAI,QAAQ,SAAS,UAAU,OAAO;AACpD,QAAM,WAAW,KAAK,OAAO;AAC7B,QAAM,oBAAoB,QAAQ;AAClC,qBAAK,QAAO,oBAAoB,QAAQ;AACxC,wBAAK,4CAAL,WAAiB;AACjB,SAAO;AACT;AAEA,gBAAW,SAAC,OAAiB;AAC3B,SAAO,MAAM,mBAAmB,MAAM,YAAY,MAAM,WAAW,SAAS,GAAG;AAC7E,UAAM,UAAU,MAAM,WAAW,MAAK;AACtC,UAAM,QAAQ,MAAM,OAAO,IAAI,OAAO,QAAQ,SAAS,OAAO,CAAC;AAC/D,QAAI;AAAO,YAAM,QAAQ,OAAO,QAAQ,SAAS,QAAQ;AACzD,UAAM,oBAAoB,QAAQ;AAClC,uBAAK,QAAO,oBAAoB,QAAQ;AACxC,YAAQ,QAAO;AAKf,0BAAK,yCAAL,WAAc,QAAQ,UAAU;AAChC,YAAQ,KAAK,8DAA8D,QAAQ,SAAS,SAAS,UAAU,QAAQ,SAAS,OAAO,WAAW,QAAQ,SAAS,QAAQ,EAAE;EAC/K;AACF;AAEA,mBAAc,SAAC,OAAmB,QAAuB;AACvD,aAAW,WAAW,CAAC,GAAG,MAAM,UAAU,GAAG;AAC3C,UAAM,QAAQ,MAAM,OAAO,IAAI,OAAO,QAAQ,SAAS,OAAO,CAAC;AAC/D,QAAI;AAAO,4BAAK,+CAAL,WAAoB,OAAO,OAAO;AAC7C,YAAQ,QAAO;AACf,0BAAK,yCAAL,WAAc,QAAQ,UAAU;EAClC;AACF;AAEA,mBAAc,SAAC,OAAmB,SAAiB,OAAiB;AAClE,QAAM,UAAU,CAAC,GAAG,MAAM,QAAQ,OAAM,CAAE;AAC1C,MAAI,QAAQ,WAAW,GAAG;AACxB,0BAAK,yCAAL,WAAc,EAAE,WAAW,MAAM,QAAQ,WAAW,SAAS,UAAU,EAAC,GAAI;AAC5E;EACF;AACA,aAAW,UAAU,SAAS;AAC5B,0BAAK,+CAAL,WAAoB,OAAO,OAAO;AAClC,WAAO,QAAO;AACd,0BAAK,yCAAL,WAAc,OAAO,UAAU;EACjC;AACF;AAEA,0BAAqB,SAAC,cAAqB;AACzC,aAAW,SAAS,mBAAK,SAAQ,OAAM,GAAI;AACzC,eAAW,WAAW,CAAC,GAAG,MAAM,UAAU,GAAG;AAC3C,YAAM,QAAQ,MAAM,OAAO,IAAI,OAAO,QAAQ,SAAS,OAAO,CAAC;AAC/D,UAAI;AAAO,8BAAK,+CAAL,WAAoB,OAAO,OAAO;AAC7C,cAAQ,QAAO;AACf,UAAI;AAAc,8BAAK,yCAAL,WAAc,QAAQ,UAAU;IACpD;EACF;AACF;AAEA,aAAQ,SAAC,UAAkC,QAA6B;AAjnB1E;AAknBI,qBAAK,QAAO,SAAS,MAAM;AAC3B,2BAAK,gBAAL,8BAAkB;IAChB,WAAW,SAAS;IACpB,GAAI,SAAS,cAAc,SAAY,CAAA,IAAK,EAAE,WAAW,SAAS,UAAS;IAC3E,SAAS,SAAS;IAClB,UAAU,SAAS;IACnB;;AAEJ;",
|
|
6
|
+
"names": ["requireU64", "equalBytes"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SwitchingSetMonitor — subscriber-side per-group alignment check between
|
|
3
|
+
* /base and /delta tracks in a CMAF switching set.
|
|
4
|
+
*
|
|
5
|
+
* Phase 14 D-15: log-only on drift (does NOT reject stream, does NOT throw).
|
|
6
|
+
* Phase 14 D-16: tolerance = Math.floor(1_000_000 / framerate / 2) microseconds.
|
|
7
|
+
* Hardcoded tolerance is FORBIDDEN — derives from framerate only.
|
|
8
|
+
* Phase 14 D-17: altGroup groups base+delta+repair into one switching set.
|
|
9
|
+
* Phase 14 T-14-03 mitigation: at most ONE misalignment emit per groupId pair.
|
|
10
|
+
*/
|
|
11
|
+
export interface SwitchingSetMonitorOptions {
|
|
12
|
+
/** REQUIRED — throws if missing or ≤ 0 (error on bad init, CLAUDE.md). */
|
|
13
|
+
framerate: number;
|
|
14
|
+
/** Fired when base and delta timestamps for the same groupId differ by more than toleranceUs. */
|
|
15
|
+
onMisaligned?: (evt: {
|
|
16
|
+
groupId: number;
|
|
17
|
+
driftUs: number;
|
|
18
|
+
}) => void;
|
|
19
|
+
/** Fired when base and delta are at different group numbers simultaneously (via reportGroupMismatch). */
|
|
20
|
+
onGroupNumberMismatch?: (evt: {
|
|
21
|
+
baseGroupId: number;
|
|
22
|
+
deltaGroupId: number;
|
|
23
|
+
}) => void;
|
|
24
|
+
}
|
|
25
|
+
export declare class SwitchingSetMonitor {
|
|
26
|
+
#private;
|
|
27
|
+
/**
|
|
28
|
+
* Half-frame-duration tolerance in microseconds.
|
|
29
|
+
* Derivation: Math.floor(1_000_000 / framerate / 2)
|
|
30
|
+
* D-16: no hardcoded tolerance — framerate is the only input.
|
|
31
|
+
*/
|
|
32
|
+
readonly toleranceUs: number;
|
|
33
|
+
constructor(opts: SwitchingSetMonitorOptions);
|
|
34
|
+
/**
|
|
35
|
+
* Notify the monitor that a group's first frame has arrived on a given role's track.
|
|
36
|
+
*
|
|
37
|
+
* When both base and delta have been seen for the same groupId, the timestamps are
|
|
38
|
+
* compared. If the absolute drift exceeds toleranceUs, onMisaligned fires.
|
|
39
|
+
*
|
|
40
|
+
* T-14-03: at most one emit per groupId pair (first-call-wins coalescing).
|
|
41
|
+
* D-15: no throw on misalignment — log-only semantics.
|
|
42
|
+
*/
|
|
43
|
+
notifyGroup(role: 'base' | 'delta', groupId: number, firstFrameTimestampUs: number): void;
|
|
44
|
+
/**
|
|
45
|
+
* Report a group-number mismatch observed at the caller level.
|
|
46
|
+
*
|
|
47
|
+
* Called when the caller observes that base's current group ID differs from
|
|
48
|
+
* delta's at the same wall-clock moment. This is a distinct concern from
|
|
49
|
+
* timestamp drift within a matched group — handled by a separate callback
|
|
50
|
+
* path (onGroupNumberMismatch) to keep each method single-purpose.
|
|
51
|
+
*
|
|
52
|
+
* Plan 03 wires this from player subscribe callbacks.
|
|
53
|
+
*/
|
|
54
|
+
reportGroupMismatch(baseGroupId: number, deltaGroupId: number): void;
|
|
55
|
+
/**
|
|
56
|
+
* Dispose the monitor and clear all buffered pending groups.
|
|
57
|
+
* After dispose(), subsequent notifyGroup/reportGroupMismatch calls are no-ops.
|
|
58
|
+
*/
|
|
59
|
+
dispose(): void;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=switching-set-alignment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"switching-set-alignment.d.ts","sourceRoot":"","sources":["../src/switching-set-alignment.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,0BAA0B;IACzC,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAA;IACjB,iGAAiG;IACjG,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAClE,yGAAyG;IACzG,qBAAqB,CAAC,EAAE,CAAC,GAAG,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;CACrF;AAKD,qBAAa,mBAAmB;;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;gBAOhB,IAAI,EAAE,0BAA0B;IAe5C;;;;;;;;OAQG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,GAAG,IAAI;IAyBzF;;;;;;;;;OASG;IACH,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAKpE;;;OAGG;IACH,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
var __typeError = (msg) => {
|
|
2
|
+
throw TypeError(msg);
|
|
3
|
+
};
|
|
4
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
5
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
6
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
7
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
8
|
+
|
|
9
|
+
// src/switching-set-alignment.ts
|
|
10
|
+
var _pending, _onMisaligned, _onGroupNumberMismatch, _disposed;
|
|
11
|
+
var SwitchingSetMonitor = class {
|
|
12
|
+
constructor(opts) {
|
|
13
|
+
__privateAdd(this, _pending, /* @__PURE__ */ new Map());
|
|
14
|
+
__privateAdd(this, _onMisaligned);
|
|
15
|
+
__privateAdd(this, _onGroupNumberMismatch);
|
|
16
|
+
__privateAdd(this, _disposed, false);
|
|
17
|
+
if (!opts || typeof opts.framerate !== "number" || !Number.isFinite(opts.framerate) || opts.framerate <= 0) {
|
|
18
|
+
throw new Error("[SwitchingSetMonitor] framerate required and must be > 0");
|
|
19
|
+
}
|
|
20
|
+
this.toleranceUs = Math.floor(1e6 / opts.framerate / 2);
|
|
21
|
+
__privateSet(this, _onMisaligned, opts.onMisaligned);
|
|
22
|
+
__privateSet(this, _onGroupNumberMismatch, opts.onGroupNumberMismatch);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Notify the monitor that a group's first frame has arrived on a given role's track.
|
|
26
|
+
*
|
|
27
|
+
* When both base and delta have been seen for the same groupId, the timestamps are
|
|
28
|
+
* compared. If the absolute drift exceeds toleranceUs, onMisaligned fires.
|
|
29
|
+
*
|
|
30
|
+
* T-14-03: at most one emit per groupId pair (first-call-wins coalescing).
|
|
31
|
+
* D-15: no throw on misalignment — log-only semantics.
|
|
32
|
+
*/
|
|
33
|
+
notifyGroup(role, groupId, firstFrameTimestampUs) {
|
|
34
|
+
var _a;
|
|
35
|
+
if (__privateGet(this, _disposed)) return;
|
|
36
|
+
let entry = __privateGet(this, _pending).get(groupId);
|
|
37
|
+
if (!entry) {
|
|
38
|
+
entry = { emitted: false };
|
|
39
|
+
__privateGet(this, _pending).set(groupId, entry);
|
|
40
|
+
}
|
|
41
|
+
if (role === "base") {
|
|
42
|
+
entry.baseTs = firstFrameTimestampUs;
|
|
43
|
+
} else {
|
|
44
|
+
entry.deltaTs = firstFrameTimestampUs;
|
|
45
|
+
}
|
|
46
|
+
if (entry.baseTs !== void 0 && entry.deltaTs !== void 0 && !entry.emitted) {
|
|
47
|
+
const driftUs = Math.abs(entry.baseTs - entry.deltaTs);
|
|
48
|
+
if (driftUs > this.toleranceUs) {
|
|
49
|
+
entry.emitted = true;
|
|
50
|
+
(_a = __privateGet(this, _onMisaligned)) == null ? void 0 : _a.call(this, { groupId, driftUs });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Report a group-number mismatch observed at the caller level.
|
|
56
|
+
*
|
|
57
|
+
* Called when the caller observes that base's current group ID differs from
|
|
58
|
+
* delta's at the same wall-clock moment. This is a distinct concern from
|
|
59
|
+
* timestamp drift within a matched group — handled by a separate callback
|
|
60
|
+
* path (onGroupNumberMismatch) to keep each method single-purpose.
|
|
61
|
+
*
|
|
62
|
+
* Plan 03 wires this from player subscribe callbacks.
|
|
63
|
+
*/
|
|
64
|
+
reportGroupMismatch(baseGroupId, deltaGroupId) {
|
|
65
|
+
var _a;
|
|
66
|
+
if (__privateGet(this, _disposed)) return;
|
|
67
|
+
(_a = __privateGet(this, _onGroupNumberMismatch)) == null ? void 0 : _a.call(this, { baseGroupId, deltaGroupId });
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Dispose the monitor and clear all buffered pending groups.
|
|
71
|
+
* After dispose(), subsequent notifyGroup/reportGroupMismatch calls are no-ops.
|
|
72
|
+
*/
|
|
73
|
+
dispose() {
|
|
74
|
+
__privateSet(this, _disposed, true);
|
|
75
|
+
__privateGet(this, _pending).clear();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
_pending = new WeakMap();
|
|
79
|
+
_onMisaligned = new WeakMap();
|
|
80
|
+
_onGroupNumberMismatch = new WeakMap();
|
|
81
|
+
_disposed = new WeakMap();
|
|
82
|
+
export {
|
|
83
|
+
SwitchingSetMonitor
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=switching-set-alignment.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/switching-set-alignment.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * SwitchingSetMonitor \u2014 subscriber-side per-group alignment check between\n * /base and /delta tracks in a CMAF switching set.\n *\n * Phase 14 D-15: log-only on drift (does NOT reject stream, does NOT throw).\n * Phase 14 D-16: tolerance = Math.floor(1_000_000 / framerate / 2) microseconds.\n * Hardcoded tolerance is FORBIDDEN \u2014 derives from framerate only.\n * Phase 14 D-17: altGroup groups base+delta+repair into one switching set.\n * Phase 14 T-14-03 mitigation: at most ONE misalignment emit per groupId pair.\n */\n\nexport interface SwitchingSetMonitorOptions {\n /** REQUIRED \u2014 throws if missing or \u2264 0 (error on bad init, CLAUDE.md). */\n framerate: number\n /** Fired when base and delta timestamps for the same groupId differ by more than toleranceUs. */\n onMisaligned?: (evt: { groupId: number; driftUs: number }) => void\n /** Fired when base and delta are at different group numbers simultaneously (via reportGroupMismatch). */\n onGroupNumberMismatch?: (evt: { baseGroupId: number; deltaGroupId: number }) => void\n}\n\n/** Internal state for a pending base+delta group pair. */\ntype PendingGroup = { baseTs?: number; deltaTs?: number; emitted: boolean }\n\nexport class SwitchingSetMonitor {\n /**\n * Half-frame-duration tolerance in microseconds.\n * Derivation: Math.floor(1_000_000 / framerate / 2)\n * D-16: no hardcoded tolerance \u2014 framerate is the only input.\n */\n readonly toleranceUs: number\n\n #pending: Map<number, PendingGroup> = new Map()\n #onMisaligned: ((evt: { groupId: number; driftUs: number }) => void) | undefined\n #onGroupNumberMismatch: ((evt: { baseGroupId: number; deltaGroupId: number }) => void) | undefined\n #disposed = false\n\n constructor(opts: SwitchingSetMonitorOptions) {\n if (\n !opts ||\n typeof opts.framerate !== 'number' ||\n !Number.isFinite(opts.framerate) ||\n opts.framerate <= 0\n ) {\n throw new Error('[SwitchingSetMonitor] framerate required and must be > 0')\n }\n // D-16: derive from framerate \u2014 no hardcoded literal tolerance.\n this.toleranceUs = Math.floor(1_000_000 / opts.framerate / 2)\n this.#onMisaligned = opts.onMisaligned\n this.#onGroupNumberMismatch = opts.onGroupNumberMismatch\n }\n\n /**\n * Notify the monitor that a group's first frame has arrived on a given role's track.\n *\n * When both base and delta have been seen for the same groupId, the timestamps are\n * compared. If the absolute drift exceeds toleranceUs, onMisaligned fires.\n *\n * T-14-03: at most one emit per groupId pair (first-call-wins coalescing).\n * D-15: no throw on misalignment \u2014 log-only semantics.\n */\n notifyGroup(role: 'base' | 'delta', groupId: number, firstFrameTimestampUs: number): void {\n if (this.#disposed) return\n\n let entry = this.#pending.get(groupId)\n if (!entry) {\n entry = { emitted: false }\n this.#pending.set(groupId, entry)\n }\n\n if (role === 'base') {\n entry.baseTs = firstFrameTimestampUs\n } else {\n entry.deltaTs = firstFrameTimestampUs\n }\n\n // Only evaluate when both sides have been received AND not yet emitted.\n if (entry.baseTs !== undefined && entry.deltaTs !== undefined && !entry.emitted) {\n const driftUs = Math.abs(entry.baseTs - entry.deltaTs)\n if (driftUs > this.toleranceUs) {\n entry.emitted = true // T-14-03: coalesce \u2014 one emit per groupId pair\n this.#onMisaligned?.({ groupId, driftUs })\n }\n }\n }\n\n /**\n * Report a group-number mismatch observed at the caller level.\n *\n * Called when the caller observes that base's current group ID differs from\n * delta's at the same wall-clock moment. This is a distinct concern from\n * timestamp drift within a matched group \u2014 handled by a separate callback\n * path (onGroupNumberMismatch) to keep each method single-purpose.\n *\n * Plan 03 wires this from player subscribe callbacks.\n */\n reportGroupMismatch(baseGroupId: number, deltaGroupId: number): void {\n if (this.#disposed) return\n this.#onGroupNumberMismatch?.({ baseGroupId, deltaGroupId })\n }\n\n /**\n * Dispose the monitor and clear all buffered pending groups.\n * After dispose(), subsequent notifyGroup/reportGroupMismatch calls are no-ops.\n */\n dispose(): void {\n this.#disposed = true\n this.#pending.clear()\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;AAAA;AAuBO,IAAM,sBAAN,MAA0B;AAAA,EAa/B,YAAY,MAAkC;AAL9C,iCAAsC,oBAAI,IAAI;AAC9C;AACA;AACA,kCAAY;AAGV,QACE,CAAC,QACD,OAAO,KAAK,cAAc,YAC1B,CAAC,OAAO,SAAS,KAAK,SAAS,KAC/B,KAAK,aAAa,GAClB;AACA,YAAM,IAAI,MAAM,0DAA0D;AAAA,IAC5E;AAEA,SAAK,cAAc,KAAK,MAAM,MAAY,KAAK,YAAY,CAAC;AAC5D,uBAAK,eAAgB,KAAK;AAC1B,uBAAK,wBAAyB,KAAK;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,YAAY,MAAwB,SAAiB,uBAAqC;AA5D5F;AA6DI,QAAI,mBAAK,WAAW;AAEpB,QAAI,QAAQ,mBAAK,UAAS,IAAI,OAAO;AACrC,QAAI,CAAC,OAAO;AACV,cAAQ,EAAE,SAAS,MAAM;AACzB,yBAAK,UAAS,IAAI,SAAS,KAAK;AAAA,IAClC;AAEA,QAAI,SAAS,QAAQ;AACnB,YAAM,SAAS;AAAA,IACjB,OAAO;AACL,YAAM,UAAU;AAAA,IAClB;AAGA,QAAI,MAAM,WAAW,UAAa,MAAM,YAAY,UAAa,CAAC,MAAM,SAAS;AAC/E,YAAM,UAAU,KAAK,IAAI,MAAM,SAAS,MAAM,OAAO;AACrD,UAAI,UAAU,KAAK,aAAa;AAC9B,cAAM,UAAU;AAChB,iCAAK,mBAAL,8BAAqB,EAAE,SAAS,QAAQ;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYA,oBAAoB,aAAqB,cAA4B;AA/FvE;AAgGI,QAAI,mBAAK,WAAW;AACpB,6BAAK,4BAAL,8BAA8B,EAAE,aAAa,aAAa;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAgB;AACd,uBAAK,WAAY;AACjB,uBAAK,UAAS,MAAM;AAAA,EACtB;AACF;AA7EE;AACA;AACA;AACA;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export type ContainerFormat = "legacy" | "raw" | "mmtp" | "mmtp-fec" | "loc" | "fmp4";
|
|
2
|
+
/** Encodes a timestamp in microseconds according to the specified container format. */
|
|
3
|
+
export declare function encodeTimestamp(timestamp: number, container?: ContainerFormat): Uint8Array;
|
|
4
|
+
/**
|
|
5
|
+
* Decodes a timestamp from a buffer according to the specified container format.
|
|
6
|
+
* @returns [timestamp in microseconds, remaining buffer after timestamp]
|
|
7
|
+
*/
|
|
8
|
+
export declare function decodeTimestamp(buffer: Uint8Array, container?: ContainerFormat): [number, Uint8Array];
|
|
9
|
+
/** Gets the size in bytes of an encoded timestamp for the given container format. */
|
|
10
|
+
export declare function getTimestampSize(container?: ContainerFormat): number;
|
|
11
|
+
/** Decode a LOC frame header.
|
|
12
|
+
* Returns [timestamp in microseconds, remaining payload]. */
|
|
13
|
+
export declare function decodeLocTimestamp(buffer: Uint8Array): [number, Uint8Array];
|
|
14
|
+
/** Parsed LOC extension header (CaptureTimestamp + VideoFrameMarking). */
|
|
15
|
+
export interface LocHeader {
|
|
16
|
+
/** Capture timestamp in microseconds (extension ID 2). */
|
|
17
|
+
timestamp: number;
|
|
18
|
+
/** Keyframe flag (extension ID 4, bit 0). */
|
|
19
|
+
keyframe?: boolean;
|
|
20
|
+
/** Payload after the extension header (raw codec bitstream). */
|
|
21
|
+
payload: Uint8Array;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Decode the fixed LOC extension header:
|
|
25
|
+
* `[ExtID=2][timestamp_us][ExtID=4][keyframe][payload]`.
|
|
26
|
+
*
|
|
27
|
+
* Throws if the header is not the two pairs the producer emits — a truncated or
|
|
28
|
+
* mis-framed buffer is a contract break, and returning a plausible-looking
|
|
29
|
+
* payload from it just relocates the failure into the decoder.
|
|
30
|
+
*/
|
|
31
|
+
export declare function decodeLocHeader(buffer: Uint8Array): LocHeader;
|
|
32
|
+
/** Encode a LOC frame header: `[ExtID=2][timestamp_us][ExtID=4][keyframe]`. */
|
|
33
|
+
export declare function encodeLocTimestamp(timestamp: number, keyframe?: boolean): Uint8Array;
|
|
34
|
+
//# sourceMappingURL=timestamp-codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timestamp-codec.d.ts","sourceRoot":"","sources":["../src/timestamp-codec.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,MAAM,CAAC;AAItF,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,GAAE,eAAmC,GAAG,UAAU,CAc7G;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,SAAS,GAAE,eAAmC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAuBxH;AAED,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,SAAS,GAAE,eAAmC,GAAG,MAAM,CAgBvF;AAgGD;8DAC8D;AAC9D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAG3E;AAID,0EAA0E;AAC1E,MAAM,WAAW,SAAS;IACzB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gEAAgE;IAChE,OAAO,EAAE,UAAU,CAAC;CACpB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CA4C7D;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,UAAQ,GAAG,UAAU,CAelF"}
|