diff --git a/.github/workflows/android-browserstack.yml b/.github/workflows/android-browserstack.yml index f94af901..2db9d452 100644 --- a/.github/workflows/android-browserstack.yml +++ b/.github/workflows/android-browserstack.yml @@ -48,6 +48,9 @@ jobs: - name: Inject AccessKey run: echo pvTestingAccessKey="${{secrets.PV_VALID_ACCESS_KEY}}" >> local.properties + - name: Inject Device + run: echo pvTestingDevice="best" >> local.properties + - name: Inject Android keystore variables run: | echo storePassword="${{secrets.ANDROID_RELEASE_KEYSTORE_PASSWORD}}" >> local.properties @@ -103,6 +106,9 @@ jobs: - name: Inject AccessKey run: echo pvTestingAccessKey="${{secrets.PV_VALID_ACCESS_KEY}}" >> local.properties + - name: Inject Device + run: echo pvTestingDevice="best" >> local.properties + - name: Inject Android keystore variables run: | echo storePassword="${{secrets.ANDROID_RELEASE_KEYSTORE_PASSWORD}}" >> local.properties diff --git a/.github/workflows/android-perf.yml b/.github/workflows/android-perf.yml index e8ad84d2..8ce66c63 100644 --- a/.github/workflows/android-perf.yml +++ b/.github/workflows/android-perf.yml @@ -55,6 +55,9 @@ jobs: - name: Inject AccessKey run: echo pvTestingAccessKey="${{secrets.PV_VALID_ACCESS_KEY}}" >> local.properties + - name: Inject Device + run: echo pvTestingDevice="best" >> local.properties + - name: Inject Number of Iterations run: echo numTestIterations="30" >> local.properties diff --git a/.github/workflows/c-demos.yml b/.github/workflows/c-demos.yml index da9d0c93..c0ee7a98 100644 --- a/.github/workflows/c-demos.yml +++ b/.github/workflows/c-demos.yml @@ -35,6 +35,7 @@ jobs: strategy: matrix: + device: [ cpu, cpu:1 ] os: [ ubuntu-latest, windows-latest, macos-latest ] include: - os: ubuntu-latest @@ -69,35 +70,69 @@ jobs: cmake --build ./build --target orca_demo_streaming - name: Test - run: python3 test/test_orca_c.py ${{secrets.PV_VALID_ACCESS_KEY}} ${{ matrix.platform }} ${{ matrix.arch }} + run: python3 test/test_orca_c.py ${{secrets.PV_VALID_ACCESS_KEY}} ${{ matrix.device }} ${{ matrix.platform }} ${{ matrix.arch }} build-demo-self-hosted: runs-on: ${{ matrix.machine }} strategy: matrix: - machine: [ rpi3-32, rpi3-64, rpi4-32, rpi4-64, rpi5-64 ] - make_file: ["Unix Makefiles"] + machine: [ rpi3-32, rpi3-64, rpi4-32, rpi4-64, rpi5-64, pv-linux, pv-ios, pv-windows ] include: - machine: rpi3-32 platform: raspberry-pi arch: cortex-a53 + make_file: "Unix Makefiles" + pv_recorder_platform: "raspberry-pi3" + device: best - machine: rpi3-64 platform: raspberry-pi arch: cortex-a53-aarch64 + make_file: "Unix Makefiles" + pv_recorder_platform: "raspberry-pi3-64" + device: best - machine: rpi4-32 platform: raspberry-pi arch: cortex-a72 + make_file: "Unix Makefiles" + pv_recorder_platform: "raspberry-pi4" + device: best - machine: rpi4-64 platform: raspberry-pi arch: cortex-a72-aarch64 + make_file: "Unix Makefiles" + pv_recorder_platform: "raspberry-pi4-64" + device: best - machine: rpi5-64 platform: raspberry-pi arch: cortex-a76-aarch64 + make_file: "Unix Makefiles" + pv_recorder_platform: "raspberry-pi5-64" + device: best - machine: pv-windows-arm64 platform: windows arch: arm64 make_file: "MinGW Makefiles" + pv_recorder_platform: "windows-arm64" + device: best + - machine: pv-linux + platform: linux + arch: x86_64 + make_file: "Unix Makefiles" + pv_recorder_platform: "linux" + device: gpu + - machine: pv-ios + platform: mac + arch: arm64 + make_file: "Unix Makefiles" + pv_recorder_platform: "mac-arm64" + device: gpu + - machine: pv-windows + platform: windows + arch: amd64 + make_file: "MinGW Makefiles" + pv_recorder_platform: "windows-amd64" + device: gpu steps: - uses: actions/checkout@v3 @@ -113,4 +148,4 @@ jobs: cmake --build ./build --target orca_demo_streaming - name: Test - run: python3 test/test_orca_c.py ${{secrets.PV_VALID_ACCESS_KEY}} ${{ matrix.platform }} ${{ matrix.arch }} + run: python3 test/test_orca_c.py ${{secrets.PV_VALID_ACCESS_KEY}} ${{ matrix.device }} ${{ matrix.platform }} ${{ matrix.arch }} diff --git a/.github/workflows/dotnet-demos.yml b/.github/workflows/dotnet-demos.yml index 8f930ecd..ddcb5460 100644 --- a/.github/workflows/dotnet-demos.yml +++ b/.github/workflows/dotnet-demos.yml @@ -25,6 +25,7 @@ jobs: strategy: matrix: + device: [cpu, cpu:1] os: [ ubuntu-latest, windows-latest, macos-latest ] steps: @@ -52,6 +53,7 @@ jobs: --gender female --text "Hello, I am Orca!" --output_path ./tmp.wav + --device ${{ matrix.device }} - name: Run .NET streaming demo run: > @@ -60,13 +62,22 @@ jobs: --language en --gender female --text_to_stream "Hello, I am Orca!" + --device ${{ matrix.device }} build-self-hosted: runs-on: ${{ matrix.machine }} strategy: matrix: + device: [best] machine: [ rpi3-32, rpi3-64, rpi4-32, rpi4-64, rpi5-64, pv-windows-arm64 ] + include: + - device: gpu + machine: pv-linux + - device: gpu + machine: pv-windows + - device: gpu + machine: pv-ios steps: - uses: actions/checkout@v3 @@ -88,6 +99,7 @@ jobs: --gender female --text "Hello, I am Orca!" --output_path ./tmp.wav + --device ${{ matrix.device }} - name: Run .NET streaming demo run: > @@ -96,3 +108,4 @@ jobs: --language en --gender female --text_to_stream "Hello, I am Orca!" + --device ${{ matrix.device }} diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 12ac1d2c..eed22e64 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -39,48 +39,29 @@ jobs: strategy: matrix: - os: [ubuntu-latest, macos-13, macos-latest, windows-latest] - dotnet-version: [2.1.818, 3.0.103, 3.1.426, 5.0.408, 6.0.x, 8.0.x] + os: [ubuntu-latest, macos-latest, macos-15-intel, windows-latest] + device: [cpu, cpu:1] + dotnet-version: [2.1.x, 3.1.x, 6.0.x, 8.0.x, 10.0.x] include: - - dotnet-version: 2.1.818 - binding-framework: netstandard2.0 + - dotnet-version: 2.1.x test-framework: netcoreapp2.1 - - dotnet-version: 3.0.103 - binding-framework: netcoreapp3.0 - test-framework: netcoreapp3.0 - - dotnet-version: 3.1.426 - binding-framework: netcoreapp3.0 + - dotnet-version: 3.1.x test-framework: netcoreapp3.1 - - dotnet-version: 5.0.408 - binding-framework: netcoreapp3.0 - test-framework: net5.0 - dotnet-version: 6.0.x - binding-framework: net6.0 test-framework: net6.0 - dotnet-version: 8.0.x - binding-framework: net8.0 test-framework: net8.0 + - dotnet-version: 10.0.x + test-framework: net10.0 exclude: - os: ubuntu-latest - dotnet-version: 2.1.818 + dotnet-version: 2.1.x - os: ubuntu-latest - dotnet-version: 3.0.103 - - os: ubuntu-latest - dotnet-version: 3.1.426 - - os: ubuntu-latest - dotnet-version: 5.0.408 - - os: macos-latest - dotnet-version: 2.1.818 - - os: macos-latest - dotnet-version: 3.0.103 + dotnet-version: 3.1.x - os: macos-latest - dotnet-version: 3.1.426 + dotnet-version: 2.1.x - os: macos-latest - dotnet-version: 5.0.408 - - os: macos-13 - dotnet-version: 6.0.x - - os: macos-13 - dotnet-version: 8.0.x + dotnet-version: 3.1.x steps: - uses: actions/checkout@v3 @@ -97,10 +78,24 @@ jobs: dotnet-version: 8.0.x - name: Build binding - run: dotnet build Orca/Orca.csproj --framework ${{ matrix.binding-framework }} + run: dotnet build Orca/Orca.csproj + + - name: Set test framework version (linux) + if: ${{ matrix.os == 'ubuntu-latest' }} + run: sed -i 's/net6.0/${{matrix.test-framework}}/g' OrcaTest/OrcaTest.csproj + + - name: Set test framework version (macos) + if: ${{ matrix.os == 'macos-latest' || matrix.os == 'macos-15-intel' }} + run: sed -i '.bak' 's/net6.0/${{matrix.test-framework}}/g' OrcaTest/OrcaTest.csproj + + - name: Set test framework version (windows) + if: ${{ matrix.os == 'windows-latest' }} + run: (Get-Content -Path "OrcaTest/OrcaTest.csproj") -replace "net6.0", "${{matrix.test-framework}}" | Set-Content -Path "OrcaTest/OrcaTest.csproj" - name: Test - run: dotnet test --framework ${{ matrix.test-framework }} -v n + run: dotnet test -v n + env: + DEVICE: ${{ matrix.device }} build-self-hosted: runs-on: ${{ matrix.machine }} @@ -110,12 +105,23 @@ jobs: strategy: matrix: machine: [rpi3-32, rpi3-64, rpi4-32, rpi4-64, rpi5-64, pv-windows-arm64] + device: [best] + include: + - device: gpu + machine: pv-linux + - device: gpu + machine: pv-windows + - device: gpu + machine: pv-ios steps: - uses: actions/checkout@v3 - name: Build binding - run: dotnet build Orca/Orca.csproj --framework net8.0 + run: dotnet build Orca/Orca.csproj - name: Test - run: dotnet test --framework net8.0 -v n + run: dotnet test -v n + env: + DEVICE: ${{ matrix.device }} + DOTNET_ROLL_FORWARD: LatestMajor diff --git a/.github/workflows/ios-browserstack.yml b/.github/workflows/ios-browserstack.yml index 32ecd694..78015a83 100644 --- a/.github/workflows/ios-browserstack.yml +++ b/.github/workflows/ios-browserstack.yml @@ -50,6 +50,10 @@ jobs: run: sed -i '.bak' 's:{TESTING_ACCESS_KEY_HERE}:${{secrets.PV_VALID_ACCESS_KEY}}:' OrcaAppTestUITests/BaseTest.swift + - name: Inject Device + run: sed -i '.bak' 's:{TESTING_DEVICE_HERE}:best:' + OrcaAppTestUITests/BaseTest.swift + - name: XCode Build run: xcrun xcodebuild build-for-testing -configuration Debug diff --git a/.github/workflows/ios-perf.yml b/.github/workflows/ios-perf.yml index 2f77e57b..e03c5197 100644 --- a/.github/workflows/ios-perf.yml +++ b/.github/workflows/ios-perf.yml @@ -52,6 +52,10 @@ jobs: run: sed -i '.bak' 's:{TESTING_ACCESS_KEY_HERE}:${{secrets.PV_VALID_ACCESS_KEY}}:' OrcaAppTestUITests/BaseTest.swift + - name: Inject Device + run: sed -i '.bak' 's:{TESTING_DEVICE_HERE}:best:' + OrcaAppTestUITests/BaseTest.swift + - name: Inject Number of Iterations run: sed -i '.bak' 's:{NUM_TEST_ITERATIONS}:30:' PerformanceTest/PerformanceTest.swift diff --git a/.github/workflows/nodejs-codestyle.yml b/.github/workflows/nodejs-codestyle.yml index 71eaa617..730fd0da 100644 --- a/.github/workflows/nodejs-codestyle.yml +++ b/.github/workflows/nodejs-codestyle.yml @@ -27,9 +27,6 @@ jobs: with: node-version: lts/* - - name: Pre-build dependencies - run: npm install yarn - - name: Run Binding Linter run: yarn && yarn lint working-directory: binding/nodejs diff --git a/.github/workflows/nodejs-demos.yml b/.github/workflows/nodejs-demos.yml index 6c0e10c2..2cd3e1fe 100644 --- a/.github/workflows/nodejs-demos.yml +++ b/.github/workflows/nodejs-demos.yml @@ -29,7 +29,8 @@ jobs: strategy: matrix: os: [ ubuntu-latest, windows-latest, macos-latest ] - node-version: [18.x, 20.x, 22.x] + device: [cpu:1, cpu] + node-version: [18.x, 20.x, 22.x, 24.x] include: - os: ubuntu-latest install-dep: sudo apt install libasound2-dev -y @@ -49,17 +50,25 @@ jobs: yarn install - name: Test streaming - run: yarn streaming -a ${{secrets.PV_VALID_ACCESS_KEY}} -m ../../lib/common/orca_params_en_female.pv -t "Hello, I am Orca!" + run: yarn streaming -a ${{secrets.PV_VALID_ACCESS_KEY}} -m ../../lib/common/orca_params_en_female.pv -y ${{ matrix.device }} -t "Hello, I am Orca!" - name: Test file - run: yarn file -a ${{secrets.PV_VALID_ACCESS_KEY}} -m ../../lib/common/orca_params_en_female.pv -t "Hello, I am Orca!" -o "./tmp.wav" + run: yarn file -a ${{secrets.PV_VALID_ACCESS_KEY}} -m ../../lib/common/orca_params_en_female.pv -y ${{ matrix.device }} -t "Hello, I am Orca!" -o "./tmp.wav" build-self-hosted: runs-on: ${{ matrix.machine }} strategy: matrix: + device: [best] machine: [ rpi3-32, rpi3-64, rpi4-32, rpi4-64, rpi5-64, pv-windows-arm64 ] + include: + - device: gpu + machine: pv-linux + - device: gpu + machine: pv-windows + - device: gpu + machine: pv-ios steps: - uses: actions/checkout@v3 @@ -68,7 +77,7 @@ jobs: run: yarn install - name: Test streaming - run: yarn streaming -a ${{secrets.PV_VALID_ACCESS_KEY}} -m ../../lib/common/orca_params_en_female.pv -t "Hello, I am Orca!" + run: yarn streaming -a ${{secrets.PV_VALID_ACCESS_KEY}} -m ../../lib/common/orca_params_en_female.pv -y ${{ matrix.device }} -t "Hello, I am Orca!" - name: Test file - run: yarn file -a ${{secrets.PV_VALID_ACCESS_KEY}} -m ../../lib/common/orca_params_en_female.pv -t "Hello, I am Orca!" -o "./tmp.wav" + run: yarn file -a ${{secrets.PV_VALID_ACCESS_KEY}} -m ../../lib/common/orca_params_en_female.pv -y ${{ matrix.device }} -t "Hello, I am Orca!" -o "./tmp.wav" diff --git a/.github/workflows/nodejs-perf.yml b/.github/workflows/nodejs-perf.yml index ea8c6c3a..7132dc7b 100644 --- a/.github/workflows/nodejs-perf.yml +++ b/.github/workflows/nodejs-perf.yml @@ -50,7 +50,7 @@ jobs: run: yarn install - name: Test - run: yarn test test/perf.test.ts --access_key=${{secrets.PV_VALID_ACCESS_KEY}} --num_test_iterations=50 --proc_performance_threshold_sec=${{matrix.proc_performance_threshold_sec}} + run: yarn test test/perf.test.ts --access_key=${{secrets.PV_VALID_ACCESS_KEY}} --device=cpu:1 --num_test_iterations=50 --proc_performance_threshold_sec=${{matrix.proc_performance_threshold_sec}} perf-self-hosted: runs-on: ${{ matrix.machine }} @@ -82,7 +82,7 @@ jobs: run: bash machine-state.sh - name: Test - run: yarn test test/perf.test.ts --access_key=${{secrets.PV_VALID_ACCESS_KEY}} --num_test_iterations=20 --proc_performance_threshold_sec=${{matrix.proc_performance_threshold_sec}} + run: yarn test test/perf.test.ts --access_key=${{secrets.PV_VALID_ACCESS_KEY}} --device=cpu:1 --num_test_iterations=20 --proc_performance_threshold_sec=${{matrix.proc_performance_threshold_sec}} - name: Machine state after working-directory: resources/.scripts @@ -106,4 +106,4 @@ jobs: run: yarn install - name: Test - run: yarn test test/perf.test.ts --access_key=${{secrets.PV_VALID_ACCESS_KEY}} --num_test_iterations=50 --proc_performance_threshold_sec=${{matrix.proc_performance_threshold_sec}} + run: yarn test test/perf.test.ts --access_key=${{secrets.PV_VALID_ACCESS_KEY}} --device=cpu:1 --num_test_iterations=50 --proc_performance_threshold_sec=${{matrix.proc_performance_threshold_sec}} diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 72aa12fd..50a8b425 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -33,7 +33,8 @@ jobs: strategy: matrix: os: [ ubuntu-latest, windows-latest, macos-latest ] - node-version: [18.x, 20.x, 22.x] + device: [cpu:1, cpu] + node-version: [18.x, 20.x, 22.x, 24.x] steps: - uses: actions/checkout@v3 @@ -47,14 +48,22 @@ jobs: run: yarn install - name: Test - run: yarn test test/index.test.ts --access_key=${{secrets.PV_VALID_ACCESS_KEY}} + run: yarn test test/index.test.ts --access_key=${{secrets.PV_VALID_ACCESS_KEY}} --device=${{ matrix.device }} build-self-hosted: runs-on: ${{ matrix.machine }} strategy: matrix: + device: [best] machine: [ rpi3-32, rpi3-64, rpi4-32, rpi4-64, rpi5-64, pv-windows-arm64 ] + include: + - device: gpu + machine: pv-linux + - device: gpu + machine: pv-windows + - device: gpu + machine: pv-ios steps: - uses: actions/checkout@v3 @@ -63,4 +72,4 @@ jobs: run: yarn install - name: Test - run: yarn test test/index.test.ts --access_key=${{secrets.PV_VALID_ACCESS_KEY}} + run: yarn test test/index.test.ts --access_key=${{secrets.PV_VALID_ACCESS_KEY}} --device=${{ matrix.device }} diff --git a/.github/workflows/python-demo.yml b/.github/workflows/python-demo.yml index 38f26544..4feb4949 100644 --- a/.github/workflows/python-demo.yml +++ b/.github/workflows/python-demo.yml @@ -26,6 +26,7 @@ jobs: strategy: matrix: os: [ ubuntu-latest, windows-latest, macos-latest ] + device: [ cpu:1, cpu ] python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13' ] include: - os: ubuntu-latest @@ -55,6 +56,7 @@ jobs: --access_key ${{secrets.PV_VALID_ACCESS_KEY}} --text_to_stream "Hello, I am Orca!" --model_path ../../lib/common/orca_params_en_female.pv + --device ${{ matrix.device }} - name: Test single run: > @@ -63,13 +65,22 @@ jobs: --text "Hello, I am Orca!" --output_path ./tmp.wav --model_path ../../lib/common/orca_params_en_female.pv + --device ${{ matrix.device }} build-self-hosted: runs-on: ${{ matrix.machine }} strategy: matrix: + device: [ best ] machine: [ rpi3-32, rpi3-64, rpi4-32, rpi4-64, rpi5-64, pv-windows-arm64 ] + include: + - device: gpu + machine: pv-linux + - device: gpu + machine: pv-windows + - device: gpu + machine: pv-ios steps: - uses: actions/checkout@v3 @@ -83,6 +94,7 @@ jobs: --access_key ${{secrets.PV_VALID_ACCESS_KEY}} --text_to_stream "Hello, I am Orca!" --model_path ../../lib/common/orca_params_en_female.pv + --device ${{ matrix.device }} - name: Test single run: > @@ -91,3 +103,4 @@ jobs: --text "Hello, I am Orca!" --output_path ./tmp.wav --model_path ../../lib/common/orca_params_en_female.pv + --device ${{ matrix.device }} diff --git a/.github/workflows/python-perf.yml b/.github/workflows/python-perf.yml index cb516b72..1ba9c553 100644 --- a/.github/workflows/python-perf.yml +++ b/.github/workflows/python-perf.yml @@ -67,6 +67,7 @@ jobs: run: > python3 test_orca_perf.py --access-key ${{secrets.PV_VALID_ACCESS_KEY}} + --device cpu:1 --num-test-iterations 10 --proc-performance-threshold-rtf ${{matrix.proc_performance_threshold_rtf}} @@ -103,6 +104,7 @@ jobs: run: > python3 test_orca_perf.py --access-key ${{secrets.PV_VALID_ACCESS_KEY}} + --device cpu:1 --num-test-iterations 10 --proc-performance-threshold-rtf ${{matrix.proc_performance_threshold_rtf}} @@ -131,5 +133,6 @@ jobs: run: > python3 test_orca_perf.py --access-key ${{secrets.PV_VALID_ACCESS_KEY}} + --device cpu:1 --num-test-iterations 10 --proc-performance-threshold-rtf ${{matrix.proc_performance_threshold_rtf}} diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index 82632b42..451718b0 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -37,8 +37,9 @@ jobs: strategy: matrix: + device: [ cpu:1, cpu ] os: [ ubuntu-latest, windows-latest, macos-latest ] - python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13' ] + python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13', '3.14' ] steps: - uses: actions/checkout@v3 @@ -55,14 +56,22 @@ jobs: run: pip install -r requirements.txt - name: Test - run: python3 test_orca.py --access-key ${{secrets.PV_VALID_ACCESS_KEY}} + run: python3 test_orca.py --access-key ${{secrets.PV_VALID_ACCESS_KEY}} --device ${{ matrix.device }} build-self-hosted: runs-on: ${{ matrix.machine }} strategy: matrix: + device: [ best ] machine: [ rpi3-32, rpi3-64, rpi4-32, rpi4-64, rpi5-64, pv-windows-arm64 ] + include: + - device: gpu + machine: pv-linux + - device: gpu + machine: pv-windows + - device: gpu + machine: pv-ios steps: - uses: actions/checkout@v3 @@ -74,4 +83,4 @@ jobs: run: pip install -r requirements.txt - name: Test - run: python3 test_orca.py --access-key ${{secrets.PV_VALID_ACCESS_KEY}} + run: python3 test_orca.py --access-key ${{secrets.PV_VALID_ACCESS_KEY}} --device ${{ matrix.device }} diff --git a/.github/workflows/web-codestyle.yml b/.github/workflows/web-codestyle.yml index 3a8e9582..69e085b1 100644 --- a/.github/workflows/web-codestyle.yml +++ b/.github/workflows/web-codestyle.yml @@ -27,9 +27,6 @@ jobs: with: node-version: lts/* - - name: Pre-build dependencies - run: npm install yarn - - name: Run Binding Linter run: yarn && yarn lint working-directory: binding/web diff --git a/.github/workflows/web-demos.yml b/.github/workflows/web-demos.yml index 496f2ca9..96c60eb4 100644 --- a/.github/workflows/web-demos.yml +++ b/.github/workflows/web-demos.yml @@ -25,7 +25,7 @@ jobs: strategy: matrix: - node-version: [ 18.x, 20.x, 22.x ] + node-version: [ 18.x, 20.x, 22.x, 24.x ] steps: - uses: actions/checkout@v3 @@ -35,8 +35,5 @@ jobs: with: node-version: ${{ matrix.node-version }} - - name: Pre-build dependencies - run: npm install yarn - - name: Install dependencies run: yarn install diff --git a/.github/workflows/web-perf.yml b/.github/workflows/web-perf.yml index 55a00d14..e794372c 100644 --- a/.github/workflows/web-perf.yml +++ b/.github/workflows/web-perf.yml @@ -26,6 +26,7 @@ jobs: strategy: matrix: node-version: [ lts/* ] + device: [ cpu:1 ] include: - node-version: lts/* num_test_iterations: 10 @@ -39,9 +40,6 @@ jobs: with: node-version: lts/* - - name: Pre-build dependencies - run: npm install yarn - - name: Install dependencies run: yarn install @@ -55,4 +53,4 @@ jobs: run: yarn setup-test - name: Test - run: yarn test-perf --env ACCESS_KEY=${{secrets.PV_VALID_ACCESS_KEY}},NUM_TEST_ITERATIONS=${{matrix.num_test_iterations}},PROC_PERFORMANCE_THRESHOLD_SEC=${{matrix.proc_performance_threshold_sec}} + run: yarn test-perf --env ACCESS_KEY=${{secrets.PV_VALID_ACCESS_KEY}},DEVICE=${{matrix.device}},NUM_TEST_ITERATIONS=${{matrix.num_test_iterations}},PROC_PERFORMANCE_THRESHOLD_SEC=${{matrix.proc_performance_threshold_sec}} diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index 007beda6..77c51371 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -29,7 +29,8 @@ jobs: strategy: matrix: - node-version: [ 18.x, 20.x, 22.x ] + device: [ cpu, cpu:1 ] + node-version: [ 18.x, 20.x, 22.x, 24.x ] steps: - uses: actions/checkout@v3 @@ -39,9 +40,6 @@ jobs: with: node-version: ${{ matrix.node-version }} - - name: Pre-build dependencies - run: npm install yarn - - name: Install dependencies run: yarn install @@ -55,4 +53,4 @@ jobs: run: yarn setup-test - name: Test - run: yarn test --env ACCESS_KEY=${{secrets.PV_VALID_ACCESS_KEY}} + run: yarn test --env ACCESS_KEY=${{secrets.PV_VALID_ACCESS_KEY}},DEVICE=${{matrix.device}} diff --git a/Package.swift b/Package.swift index c31450cc..5817306b 100644 --- a/Package.swift +++ b/Package.swift @@ -1,9 +1,9 @@ -// swift-tools-version:5.3 +// swift-tools-version:5.7 import PackageDescription let package = Package( name: "Orca-iOS", platforms: [ - .iOS(.v13) + .iOS(.v16) ], products: [ .library( diff --git a/README.md b/README.md index cd1fef14..c37dd495 100644 --- a/README.md +++ b/README.md @@ -472,8 +472,15 @@ Build an instance of the object: ```c pv_orca_t *orca = NULL; +const char *access_key = "${ACCESS_KEY}"; const char *model_path = "${MODEL_PATH}"; -pv_status_t status = pv_orca_init("${ACCESS_KEY}", model_path, &orca); +const char *device = "best"; + +pv_status_t status = pv_orca_init( + access_key, + model_path, + device, + &orca); if (status != PV_STATUS_SUCCESS) { // error handling logic } diff --git a/binding/android/Orca/orca/build.gradle b/binding/android/Orca/orca/build.gradle index 78f799d4..e3a5f766 100644 --- a/binding/android/Orca/orca/build.gradle +++ b/binding/android/Orca/orca/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' ext { PUBLISH_GROUP_ID = 'ai.picovoice' - PUBLISH_VERSION = '1.2.0' + PUBLISH_VERSION = '2.0.0' PUBLISH_ARTIFACT_ID = 'orca-android' } diff --git a/binding/android/Orca/orca/src/main/java/ai/picovoice/orca/Orca.java b/binding/android/Orca/orca/src/main/java/ai/picovoice/orca/Orca.java index 2493f1e1..aedce03e 100644 --- a/binding/android/Orca/orca/src/main/java/ai/picovoice/orca/Orca.java +++ b/binding/android/Orca/orca/src/main/java/ai/picovoice/orca/Orca.java @@ -1,5 +1,5 @@ /* - Copyright 2024 Picovoice Inc. + Copyright 2024-2025 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -125,13 +125,21 @@ public void close() { * * @param accessKey AccessKey obtained from Picovoice Console (https://console.picovoice.ai/) * @param modelPath Absolute path to the file containing Orca model parameters. + * @param device String representation of the device (e.g., CPU or GPU) to use for inference. + * If set to `best`, the most suitable device is selected automatically. If set to `gpu`, + * the engine uses the first available GPU device. To select a specific GPU device, set this + * argument to `gpu:${GPU_INDEX}`, where `${GPU_INDEX}` is the index of the target GPU. If + * set to `cpu`, the engine will run on the CPU with the default number of threads. To specify + * the number of threads, set this argument to `cpu:${NUM_THREADS}`, where `${NUM_THREADS}` + * is the desired number of threads. * @throws OrcaException if there is an error while initializing Orca. */ - private Orca(String accessKey, String modelPath) throws OrcaException { + private Orca(String accessKey, String modelPath, String device) throws OrcaException { OrcaNative.setSdk(Orca._sdk); handle = OrcaNative.init( accessKey, - modelPath); + modelPath, + device); maxCharacterLimit = OrcaNative.getMaxCharacterLimit(handle); sampleRate = OrcaNative.getSampleRate(handle); validCharacters = OrcaNative.getValidCharacters(handle); @@ -141,6 +149,17 @@ public static void setSdk(String sdk) { Orca._sdk = sdk; } + /** + * Lists all available devices that Orca can use for inference. + * Each entry in the list can be used as the `device` argument when initializing Orca. + * + * @return Array of all available devices that Orca can be used for inference. + * @throws OrcaException if getting available devices fails. + */ + public static String[] getAvailableDevices() throws OrcaException { + return OrcaNative.listHardwareDevices(); + } + private static String extractResource(Context context, InputStream srcFileStream, String dstFilename) throws IOException { InputStream is = new BufferedInputStream( srcFileStream, @@ -297,6 +316,7 @@ public static class Builder { private String accessKey = null; private String modelPath = null; + private String device = null; /** * Sets the AccessKey. @@ -320,6 +340,23 @@ public Builder setModelPath(String modelPath) { return this; } + /** + * Sets the device to use for inference. + * + * @param device String representation of the device (e.g., CPU or GPU) to use for inference. + * If set to `best`, the most suitable device is selected automatically. If set to `gpu`, + * the engine uses the first available GPU device. To select a specific GPU device, set this + * argument to `gpu:${GPU_INDEX}`, where `${GPU_INDEX}` is the index of the target GPU. If + * set to `cpu`, the engine will run on the CPU with the default number of threads. To specify + * the number of threads, set this argument to `cpu:${NUM_THREADS}`, where `${NUM_THREADS}` + * is the desired number of threads. + * @return Modified builder object. + */ + public Builder setDevice(String device) { + this.device = device; + return this; + } + /** * Validates properties and creates an instance of the Orca Text-to-Speech engine. * @@ -348,9 +385,14 @@ public Orca build(Context context) throws OrcaException { } } + if (device == null) { + device = "best"; + } + return new Orca( accessKey, - modelPath); + modelPath, + device); } } diff --git a/binding/android/Orca/orca/src/main/java/ai/picovoice/orca/OrcaNative.java b/binding/android/Orca/orca/src/main/java/ai/picovoice/orca/OrcaNative.java index 6a57cbdc..3c9796fa 100644 --- a/binding/android/Orca/orca/src/main/java/ai/picovoice/orca/OrcaNative.java +++ b/binding/android/Orca/orca/src/main/java/ai/picovoice/orca/OrcaNative.java @@ -1,5 +1,5 @@ /* - Copyright 2024 Picovoice Inc. + Copyright 2024-2025 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -18,7 +18,10 @@ class OrcaNative { static native void setSdk(String sdk); - static native long init(String accessKey, String modelPath) throws OrcaException; + static native long init( + String accessKey, + String modelPath, + String device) throws OrcaException; static native void delete(long object); @@ -28,6 +31,8 @@ class OrcaNative { static native int getMaxCharacterLimit(long object) throws OrcaException; + static native String[] listHardwareDevices() throws OrcaException; + static native OrcaAudio synthesize( long object, String text, diff --git a/binding/android/OrcaTestApp/orca-test-app/build.gradle b/binding/android/OrcaTestApp/orca-test-app/build.gradle index a5797889..c11d79ba 100644 --- a/binding/android/OrcaTestApp/orca-test-app/build.gradle +++ b/binding/android/OrcaTestApp/orca-test-app/build.gradle @@ -7,6 +7,9 @@ if (rootProject.file("local.properties").exists()) { if (project.hasProperty("pvTestingAccessKey")) { properties.put("pvTestingAccessKey", project.getProperty("pvTestingAccessKey")) } + if (project.hasProperty("pvTestingDevice")) { + properties.put("pvTestingDevice", project.getProperty("pvTestingDevice")) + } if (project.hasProperty("numTestIterations")) { properties.put("numTestIterations", project.getProperty("numTestIterations")) } @@ -36,11 +39,12 @@ android { minSdkVersion 21 targetSdkVersion defaultTargetSdkVersion versionCode 1 - versionName "1.0" + versionName "2.0.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue 'string', 'pvTestingAccessKey', properties.getProperty("pvTestingAccessKey", "") + resValue 'string', 'pvTestingDevice', properties.getProperty("pvTestingDevice", "") resValue 'string', 'numTestIterations', properties.getProperty("numTestIterations", "") resValue 'string', 'procPerformanceThresholdSec', properties.getProperty("procPerformanceThresholdSec", "") } @@ -111,7 +115,7 @@ dependencies { implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation 'com.google.code.gson:gson:2.10' implementation 'com.google.errorprone:error_prone_annotations:2.36.0' - implementation 'ai.picovoice:orca-android:1.2.0' + implementation 'ai.picovoice:orca-android:2.0.0' // Espresso UI Testing androidTestImplementation 'androidx.test.ext:junit:1.1.5' @@ -119,7 +123,6 @@ dependencies { exclude group: 'com.android.support', module: 'support-annotations' }) androidTestImplementation('androidx.test.espresso:espresso-intents:3.5.1') - androidTestImplementation('ai.picovoice:orca-android:1.2.0') } afterEvaluate { diff --git a/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/AlignmentTests.java b/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/AlignmentTests.java index 310feb07..4f783e93 100644 --- a/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/AlignmentTests.java +++ b/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/AlignmentTests.java @@ -85,6 +85,7 @@ public static Collection initParameters() throws IOException { public void Setup() throws Exception { orca = new Orca.Builder() .setAccessKey(accessKey) + .setDevice(device) .setModelPath(getModelFilepath(modelFilename)) .build(appContext); } diff --git a/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/BaseTest.java b/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/BaseTest.java index dec07032..19e40174 100644 --- a/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/BaseTest.java +++ b/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/BaseTest.java @@ -13,6 +13,7 @@ package ai.picovoice.orca.testapp; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import android.content.Context; import android.content.res.AssetManager; @@ -51,7 +52,12 @@ public class BaseTest { static AssetManager assetManager; static String testResourcesPath; static JsonObject testJson; + static String accessKey; + static String device; + + private static final int PCM_OUTLIER_THRESHOLD = 400; + private static final double PCM_OUTLIER_COUNT_THRESHOLD = 0.05; @BeforeClass public static void setup() throws Exception { @@ -72,6 +78,7 @@ public static void setup() throws Exception { reader.close(); accessKey = appContext.getString(R.string.pvTestingAccessKey); + device = appContext.getString(R.string.pvTestingDevice); } public static String getTestDataString() throws IOException { @@ -110,13 +117,19 @@ public static String getAudioFilepath(String modelFilename, String synthesisType return new File(resPath, String.format("wav/%s", audioFilename)).getAbsolutePath(); } - protected static boolean compareArrays(short[] arr1, short[] arr2, int step) { - for (int i = 0; i < arr1.length - step; i += step) { - if (!(Math.abs(arr1[i] - arr2[i]) <= 500)) { - return false; + protected static void validatePcm(short[] synthesizedPcm, short[] groundTruth) { + assertEquals(groundTruth.length, synthesizedPcm.length); + + int outlierCount = 0; + for (int i = 0; i < synthesizedPcm.length; i++) { + int diff = Math.abs(synthesizedPcm[i] - groundTruth[i]); + if (diff > PCM_OUTLIER_THRESHOLD) { + outlierCount++; } } - return true; + + double diffOutliers = (double) outlierCount / synthesizedPcm.length; + assertTrue(diffOutliers <= PCM_OUTLIER_COUNT_THRESHOLD); } protected static short[] concatArrays(short[] existingArray, short[] arrayToAdd) { diff --git a/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/PerformanceTest.java b/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/PerformanceTest.java index c81e27b3..aafc6a11 100644 --- a/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/PerformanceTest.java +++ b/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/PerformanceTest.java @@ -82,6 +82,7 @@ public void testProcPerformance() throws Exception { final double procPerformanceThresholdSec = Double.parseDouble(procThresholdString); final Orca orca = new Orca.Builder() .setAccessKey(accessKey) + .setDevice(device) .setModelPath(getModelFilepath(modelFile)) .build(appContext); diff --git a/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/SentenceTests.java b/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/SentenceTests.java index 0c83f6b0..780b5f80 100644 --- a/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/SentenceTests.java +++ b/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/SentenceTests.java @@ -96,6 +96,7 @@ public static Collection initParameters() throws IOException { public void Setup() throws Exception { orca = new Orca.Builder() .setAccessKey(accessKey) + .setDevice(device) .setModelPath(getModelFilepath(modelFilename)) .build(appContext); } @@ -154,7 +155,7 @@ public void testStreaming() throws Exception { orcaStream.close(); short[] testFilePcm = readAudioFile(getAudioFilepath(modelFilename, "stream")); - compareArrays(fullPcm, testFilePcm, 1); + validatePcm(fullPcm, testFilePcm); } @Test @@ -167,7 +168,7 @@ public void testSynthesize() throws Exception { short[] testFilePcm = readAudioFile(getAudioFilepath(modelFilename, "single")); - compareArrays(pcm.getPcm(), testFilePcm, 1); + validatePcm(pcm.getPcm(), testFilePcm); } @Test @@ -185,7 +186,7 @@ public void testSynthesizeToFile() throws Exception { short[] outputFilePcm = readAudioFile(outputFile.getAbsolutePath()); short[] testFilePcm = readAudioFile(getAudioFilepath(modelFilename, "single")); - compareArrays(outputFilePcm, testFilePcm, 1); + validatePcm(outputFilePcm, testFilePcm); outputFile.delete(); } diff --git a/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/StandardTests.java b/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/StandardTests.java index d1ce8b27..ec971085 100644 --- a/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/StandardTests.java +++ b/binding/android/OrcaTestApp/orca-test-app/src/androidTest/java/ai/picovoice/orca/testapp/StandardTests.java @@ -45,12 +45,22 @@ public void Setup() throws Exception { modelFile = getModelFilepath(modelFilename); } + @Test + public void testGetAvailableDevices() throws OrcaException { + String[] availableDevices = Orca.getAvailableDevices(); + assertTrue(availableDevices.length > 0); + for (String d : availableDevices) { + assertTrue(d != null && d.length() > 0); + } + } + @Test public void testErrorStack() { String[] error = {}; try { new Orca.Builder() .setAccessKey("invalid") + .setDevice(device) .setModelPath(modelFile) .build(appContext); } catch (OrcaException e) { @@ -63,6 +73,7 @@ public void testErrorStack() { try { new Orca.Builder() .setAccessKey("invalid") + .setDevice(device) .setModelPath(modelFile) .build(appContext); } catch (OrcaException e) { diff --git a/binding/dotnet/Orca/Orca.cs b/binding/dotnet/Orca/Orca.cs index a6e065a7..7d356590 100644 --- a/binding/dotnet/Orca/Orca.cs +++ b/binding/dotnet/Orca/Orca.cs @@ -157,7 +157,7 @@ public class Orca : IDisposable static Orca() { -#if NETCOREAPP3_0_OR_GREATER +#if NET6_0_OR_GREATER NativeLibrary.SetDllImportResolver(typeof(Orca).Assembly, ImportResolver); @@ -167,7 +167,7 @@ static Orca() } -#if NETCOREAPP3_0_OR_GREATER +#if NET6_0_OR_GREATER private static IntPtr ImportResolver(string libraryName, Assembly assembly, DllImportSearchPath? searchPath) { @@ -189,6 +189,7 @@ private static IntPtr ImportResolver(string libraryName, Assembly assembly, DllI private static extern PvStatus pv_orca_init( IntPtr accessKey, IntPtr modelPath, + IntPtr device, out IntPtr handle); [DllImport(LIBRARY, CallingConvention = CallingConvention.Cdecl)] @@ -290,6 +291,16 @@ private static extern void pv_orca_word_alignments_delete( [DllImport(LIBRARY, CallingConvention = CallingConvention.Cdecl)] private static extern void pv_free_error_stack(IntPtr messageStack); + [DllImport(LIBRARY, CallingConvention = CallingConvention.Cdecl)] + private static extern PvStatus pv_orca_list_hardware_devices( + out IntPtr hardwareDevices, + out int numHardwareDevices); + + [DllImport(LIBRARY, CallingConvention = CallingConvention.Cdecl)] + private static extern void pv_orca_free_hardware_devices( + IntPtr hardwareDevices, + int numHardwareDevices); + /// /// C Struct for storing phoneme alignment metadata /// @@ -479,13 +490,22 @@ public void Dispose() /// Absolute path to the file containing model parameters (`.pv`). If not set it will be set to the /// default location. /// + /// + /// String representation of the device (e.g., CPU or GPU) to use. If set to `best`, the most + /// suitable device is selected automatically. If set to `gpu`, the engine uses the first available GPU device. To select a specific + /// GPU device, set this argument to `gpu:${GPU_INDEX}`, where `${GPU_INDEX}` is the index of the target GPU. If set to + /// `cpu`, the engine will run on the CPU with the default number of threads. To specify the number of threads, set this + /// argument to `cpu:${NUM_THREADS}`, where `${NUM_THREADS}` is the desired number of threads. + /// public static Orca Create( string accessKey, - string modelPath = null) + string modelPath = null, + string device = null) { return new Orca( accessKey, - modelPath ?? DEFAULT_MODEL_PATH); + modelPath ?? DEFAULT_MODEL_PATH, + device ?? "best"); } /// @@ -496,9 +516,17 @@ public static Orca Create( /// Absolute path to the file containing model parameters (`.pv`). If not set it will be set to the /// default location. /// + /// + /// String representation of the device (e.g., CPU or GPU) to use. If set to `best`, the most + /// suitable device is selected automatically. If set to `gpu`, the engine uses the first available GPU device. To select a specific + /// GPU device, set this argument to `gpu:${GPU_INDEX}`, where `${GPU_INDEX}` is the index of the target GPU. If set to + /// `cpu`, the engine will run on the CPU with the default number of threads. To specify the number of threads, set this + /// argument to `cpu:${NUM_THREADS}`, where `${NUM_THREADS}` is the desired number of threads. + /// private Orca( string accessKey, - string modelPath) + string modelPath, + string device) { if (string.IsNullOrEmpty(accessKey)) { @@ -512,16 +540,19 @@ private Orca( IntPtr accessKeyPtr = Utils.GetPtrFromUtf8String(accessKey); IntPtr modelPathPtr = Utils.GetPtrFromUtf8String(modelPath); + IntPtr devicePtr = Utils.GetPtrFromUtf8String(device); pv_set_sdk("dotnet"); PvStatus status = pv_orca_init( accessKeyPtr, modelPathPtr, + devicePtr, out _libraryPointer); Marshal.FreeHGlobal(accessKeyPtr); Marshal.FreeHGlobal(modelPathPtr); + Marshal.FreeHGlobal(devicePtr); if (status != PvStatus.SUCCESS) { @@ -863,5 +894,37 @@ private static string[] GetMessageStack() return messageStack; } + + /// + /// Retrieves a list of devices that Orca can use for inference. Each entry in the list can be used as + /// the `device` argument when creating an instance of Orca. + /// + /// List of all available devices that Orca can use for inference. + /// Thrown when an error occurs while retrieving the devices. + public static string[] GetAvailableDevices() + { + IntPtr hardwareDevicesPtr; + int numDevices; + PvStatus status = pv_orca_list_hardware_devices( + out hardwareDevicesPtr, + out numDevices); + if (status != PvStatus.SUCCESS) + { + throw PvStatusToException( + status, + "Get available devices failed", + GetMessageStack()); + } + + string[] devices = new string[numDevices]; + int elementSize = Marshal.SizeOf(typeof(IntPtr)); + for (int i = 0; i < numDevices; i++) + { + devices[i] = Utils.GetUtf8StringFromPtr(Marshal.ReadIntPtr(hardwareDevicesPtr, i * elementSize)); + } + + pv_orca_free_hardware_devices(hardwareDevicesPtr, numDevices); + return devices; + } } } \ No newline at end of file diff --git a/binding/dotnet/Orca/Orca.csproj b/binding/dotnet/Orca/Orca.csproj index feb0273d..a1f1568f 100644 --- a/binding/dotnet/Orca/Orca.csproj +++ b/binding/dotnet/Orca/Orca.csproj @@ -1,7 +1,7 @@  - net8.0;net6.0;netcoreapp3.0;netstandard2.0 - 1.2.1 + net6.0;netstandard2.0 + 2.0.0 Picovoice Orca Streaming Text-to-Speech Engine @@ -29,30 +29,24 @@ - buildTransitive/netcoreapp3.0; buildTransitive/net6.0; - buildTransitive/net8.0; PreserveNewest - + - buildTransitive/netstandard2.0/libpv_orca.dll; - buildTransitive/netcoreapp3.0/lib/windows/amd64/libpv_orca.dll; - buildTransitive/net6.0/lib/windows/amd64/libpv_orca.dll; - buildTransitive/net8.0/lib/windows/amd64/libpv_orca.dll; + buildTransitive\netstandard2.0; + buildTransitive\net6.0\lib\windows\amd64; PreserveNewest - lib\windows\amd64\libpv_orca.dll + lib\windows\amd64\%(Filename)%(Extension) false buildTransitive/netstandard2.0/libpv_orca.dylib; - buildTransitive/netcoreapp3.0/lib/mac/x86_64/libpv_orca.dylib; buildTransitive/net6.0/lib/mac/x86_64/libpv_orca.dylib; - buildTransitive/net8.0/lib/mac/x86_64/libpv_orca.dylib; PreserveNewest lib\mac\x86_64\libpv_orca.dylib @@ -65,7 +59,6 @@ buildTransitive/net6.0/lib/raspberry-pi; - buildTransitive/net8.0/lib/raspberry-pi; PreserveNewest lib\raspberry-pi\%(RecursiveDir)%(Filename)%(Extension) @@ -74,7 +67,6 @@ buildTransitive/net6.0/lib/linux/x86_64/libpv_orca.so; - buildTransitive/net8.0/lib/linux/x86_64/libpv_orca.so; PreserveNewest lib\linux\x86_64\libpv_orca.so @@ -83,7 +75,6 @@ buildTransitive/net6.0/lib/mac/arm64/libpv_orca.dylib; - buildTransitive/net8.0/lib/mac/arm64/libpv_orca.dylib; PreserveNewest lib\mac\arm64\libpv_orca.dylib @@ -92,7 +83,6 @@ buildTransitive/net6.0/lib/windows/arm64/libpv_orca.dll; - buildTransitive/net8.0/lib/windows/arm64/libpv_orca.dll; PreserveNewest lib\windows\arm64\libpv_orca.dll diff --git a/binding/dotnet/Orca/Picovoice.Orca.netstandard2.0.targets b/binding/dotnet/Orca/Picovoice.Orca.netstandard2.0.targets index 1bbdae93..74f64f50 100644 --- a/binding/dotnet/Orca/Picovoice.Orca.netstandard2.0.targets +++ b/binding/dotnet/Orca/Picovoice.Orca.netstandard2.0.targets @@ -10,6 +10,11 @@ PreserveNewest false + + pv_ypu_impl_cuda.dll + PreserveNewest + false + libpv_orca.dylib PreserveNewest diff --git a/binding/dotnet/OrcaTest/MainTest.cs b/binding/dotnet/OrcaTest/MainTest.cs index e58eb96f..8b3b9d01 100644 --- a/binding/dotnet/OrcaTest/MainTest.cs +++ b/binding/dotnet/OrcaTest/MainTest.cs @@ -30,12 +30,17 @@ public class MainTest AppContext.BaseDirectory, "../../../../../.."); + private static readonly int PCM_OUTLIER_THRESHOLD = 400; + private static readonly double PCM_OUTLIER_COUNT_THRESHOLD = 0.05; + private static string _accessKey; + private static string _device; [ClassInitialize] public static void ClassInitialize(TestContext _) { _accessKey = Environment.GetEnvironmentVariable("ACCESS_KEY"); + _device = Environment.GetEnvironmentVariable("DEVICE"); } [Serializable] @@ -165,13 +170,12 @@ private static IEnumerable InvalidTestParameters } } - private static void ValidateAudio(short[] synthesizedPcm, short[] testPcm) + private static void ValidateAudio(List synthesizedPcm, List testPcm) { - Assert.AreEqual(synthesizedPcm.Length, testPcm.Length); - for (int i = 0; i < synthesizedPcm.Length; i++) - { - Assert.AreEqual(synthesizedPcm[i], testPcm[i], 8000); - } + Assert.AreEqual(synthesizedPcm.Count(), testPcm.Count()); + List diffPcm = synthesizedPcm.Zip(testPcm, (a, b) => (short)Math.Abs(a - b)).ToList(); + double diffOutliers = diffPcm.Count(d => d > PCM_OUTLIER_THRESHOLD) / (double)diffPcm.Count; + Assert.IsTrue(diffOutliers <= PCM_OUTLIER_COUNT_THRESHOLD); } public void ValidatePhonemes(OrcaPhoneme[] phonemes) @@ -237,7 +241,7 @@ public void TestInit( string text_no_punctuation, string text_custom_pronunciation) { - using (Orca orca = Orca.Create(_accessKey, GetModelPath(model))) + using (Orca orca = Orca.Create(_accessKey, GetModelPath(model), _device)) { Assert.IsFalse(string.IsNullOrWhiteSpace(orca?.Version), "Orca did not return a valid version string."); Assert.IsTrue(orca.SampleRate > 0, "Orca did not return a valid sample rate."); @@ -257,13 +261,13 @@ public void TestSynthesize( string text_no_punctuation, string text_custom_pronunciation) { - using (Orca orca = Orca.Create(_accessKey, GetModelPath(model))) + using (Orca orca = Orca.Create(_accessKey, GetModelPath(model), _device)) { OrcaAudio res = orca.Synthesize( text, randomState: random_state); List expectedPcm = GetTestAudio(model); - ValidateAudio(res.Pcm, expectedPcm.ToArray()); + ValidateAudio(res.Pcm.ToList(), expectedPcm); ValidateAlignments(res.Words); } } @@ -278,7 +282,7 @@ public void TestSynthesizeNoPunctuation( string text_no_punctuation, string text_custom_pronunciation) { - using (Orca orca = Orca.Create(_accessKey, GetModelPath(model))) + using (Orca orca = Orca.Create(_accessKey, GetModelPath(model), _device)) { OrcaAudio res = orca.Synthesize( text_no_punctuation, @@ -298,7 +302,7 @@ public void TestSynthesizeWithCustomPronunciation( string text_no_punctuation, string text_custom_pronunciation) { - using (Orca orca = Orca.Create(_accessKey, GetModelPath(model))) + using (Orca orca = Orca.Create(_accessKey, GetModelPath(model), _device)) { OrcaAudio res = orca.Synthesize( text_custom_pronunciation, @@ -318,7 +322,7 @@ public void TestSynthesizeToFile( string text_no_punctuation, string text_custom_pronunciation) { - using (Orca orca = Orca.Create(_accessKey, GetModelPath(model))) + using (Orca orca = Orca.Create(_accessKey, GetModelPath(model), _device)) { string outputPath = "orca-temp.wav"; OrcaWord[] res = orca.SynthesizeToFile( @@ -327,7 +331,7 @@ public void TestSynthesizeToFile( randomState: random_state); List expectedPcm = GetTestAudio(model); List synthesizedPcm = GetPcmFromFile(outputPath); - ValidateAudio(synthesizedPcm.ToArray(), expectedPcm.ToArray()); + ValidateAudio(synthesizedPcm, expectedPcm); ValidateAlignments(res); } } @@ -341,7 +345,7 @@ public void TestSynthesizeAlignments( string text_alignment, TestWordAlignmentsJson[] alignments) { - using (Orca orca = Orca.Create(_accessKey, GetModelPath(model))) + using (Orca orca = Orca.Create(_accessKey, GetModelPath(model), _device)) { OrcaAudio res = orca.Synthesize( text_alignment, @@ -362,7 +366,7 @@ public void TestStreamingSynthesize( string text_custom_pronunciation) { List fullPcm = new List(); - using (Orca orca = Orca.Create(_accessKey, GetModelPath(model))) + using (Orca orca = Orca.Create(_accessKey, GetModelPath(model), _device)) { using (Orca.OrcaStream orcaStream = orca.StreamOpen(randomState: random_state)) { @@ -383,7 +387,7 @@ public void TestStreamingSynthesize( } Assert.IsTrue(fullPcm.Count > 0); List expectedPcm = GetTestAudio(model, "stream"); - ValidateAudio(fullPcm.ToArray(), expectedPcm.ToArray()); + ValidateAudio(fullPcm, expectedPcm); } [TestMethod] @@ -396,7 +400,7 @@ public void TestSpeechRate( string text_no_punctuation, string text_custom_pronunciation) { - using (Orca orca = Orca.Create(_accessKey, GetModelPath(model))) + using (Orca orca = Orca.Create(_accessKey, GetModelPath(model), _device)) { OrcaAudio resSlow = orca.Synthesize( text, @@ -419,7 +423,7 @@ public void TestInvalidInput( string model, string[] text_invalid) { - using (Orca orca = Orca.Create(_accessKey, GetModelPath(model))) + using (Orca orca = Orca.Create(_accessKey, GetModelPath(model), _device)) { foreach (string invalidText in text_invalid) { @@ -429,6 +433,25 @@ public void TestInvalidInput( } } + [TestMethod] + public void TestInvalidDevice() + { + Assert.ThrowsException( + () => Orca.Create(_accessKey, device: "cloud:9") + ); + } + + [TestMethod] + public void TestGetAvailableDevices() + { + string[] devices = Orca.GetAvailableDevices(); + Assert.IsTrue(devices.Length > 0); + foreach (string device in devices) + { + Assert.IsFalse(string.IsNullOrEmpty(device)); + } + } + [TestMethod] public void TestMessageStack() { @@ -467,7 +490,7 @@ public void TestMessageStack() [TestMethod] public void TestSynthesizeMessageStack() { - using (Orca o = Orca.Create(_accessKey)) + using (Orca o = Orca.Create(_accessKey, device: _device)) { var obj = typeof(Orca).GetField("_libraryPointer", BindingFlags.NonPublic | BindingFlags.Instance); IntPtr address = (IntPtr)obj.GetValue(o); diff --git a/binding/dotnet/OrcaTest/OrcaTest.csproj b/binding/dotnet/OrcaTest/OrcaTest.csproj index b77c40e3..b466e583 100644 --- a/binding/dotnet/OrcaTest/OrcaTest.csproj +++ b/binding/dotnet/OrcaTest/OrcaTest.csproj @@ -1,7 +1,7 @@  - net8.0;net6.0;net5.0;netcoreapp3.1;netcoreapp3.0;netcoreapp2.1; + net6.0; false @@ -24,9 +24,9 @@ - + PreserveNewest - libpv_orca.dll + %(Filename)%(Extension) false diff --git a/binding/dotnet/README.md b/binding/dotnet/README.md index 679d1629..a84af3ba 100644 --- a/binding/dotnet/README.md +++ b/binding/dotnet/README.md @@ -14,28 +14,24 @@ voice assistants. Orca is: ## Requirements -- .NET 8.0 +- .NET 6.0 ## Compatibility -Platform compatible with .NET Framework 4.6.1+: - -- Windows (x86_64) - -Platforms compatible with .NET Core 2.0+: +Platforms compatible with .NET Standard 2.0+: - macOS (x86_64) - Windows (x86_64) -Platform compatible with .NET 6.0+: +Platforms compatible with .NET 6.0+: +- Linux (x86_64) +- macOS (x86_64, arm64) +- Windows (x86_64, arm64) - Raspberry Pi: - 3 (32 and 64 bit) - 4 (32 and 64 bit) - 5 (32 and 64 bit) -- Linux (x86_64) -- macOS (arm64) -- Windows (arm64) ## Installation diff --git a/binding/ios/Orca-iOS.podspec b/binding/ios/Orca-iOS.podspec index bbfef261..23b64c00 100644 --- a/binding/ios/Orca-iOS.podspec +++ b/binding/ios/Orca-iOS.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = 'Orca-iOS' s.module_name = 'Orca' - s.version = '1.2.0' + s.version = '2.0.0' s.license = {:type => 'Apache 2.0'} s.summary = 'iOS binding for Picovoice\'s Orca Text-to-Speech Engine.' s.description = @@ -19,7 +19,7 @@ Pod::Spec.new do |s| s.homepage = 'https://github.com/Picovoice/orca/tree/main/binding/ios' s.author = { 'Picovoice' => 'hello@picovoice.ai' } s.source = { :git => "https://github.com/Picovoice/orca.git", :tag => s.version.to_s } - s.ios.deployment_target = '13.0' + s.ios.deployment_target = '16.0' s.swift_version = '5.0' s.vendored_frameworks = 'lib/ios/PvOrca.xcframework' s.source_files = 'binding/ios/*.{swift}' diff --git a/binding/ios/Orca.swift b/binding/ios/Orca.swift index 2f9d6e8c..6accd304 100644 --- a/binding/ios/Orca.swift +++ b/binding/ios/Orca.swift @@ -1,5 +1,5 @@ // -// Copyright 2024 Picovoice Inc. +// Copyright 2024-2025 Picovoice Inc. // You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" // file accompanying this source. // Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on @@ -135,8 +135,8 @@ public class Orca { &cNumSamples, &cPcm) if status != PV_STATUS_SUCCESS { - let messageStack = try orca.getMessageStack() - throw orca.pvStatusToOrcaError(status, "Unable to synthesize streaming speech", messageStack) + let messageStack = try Orca.getMessageStack() + throw Orca.pvStatusToOrcaError(status, "Unable to synthesize streaming speech", messageStack) } let buffer = UnsafeBufferPointer(start: cPcm, count: Int(cNumSamples)) @@ -166,8 +166,8 @@ public class Orca { &cNumSamples, &cPcm) if status != PV_STATUS_SUCCESS { - let messageStack = try orca.getMessageStack() - throw orca.pvStatusToOrcaError(status, "Unable to flush streaming speech", messageStack) + let messageStack = try Orca.getMessageStack() + throw Orca.pvStatusToOrcaError(status, "Unable to flush streaming speech", messageStack) } let buffer = UnsafeBufferPointer(start: cPcm, count: Int(cNumSamples)) @@ -196,6 +196,30 @@ public class Orca { self.sdk = sdk } + /// Lists all available devices that Orca can use for inference. + /// Entries in the list can be used as the `device` argument when initializing Orca. + /// + /// - Throws: OrcaError + /// - Returns: Array of available devices that Orca can be used for inference. + public static func getAvailableDevices() throws -> [String] { + var cHardwareDevices: UnsafeMutablePointer?>? + var numHardwareDevices: Int32 = 0 + let status = pv_orca_list_hardware_devices(&cHardwareDevices, &numHardwareDevices) + if status != PV_STATUS_SUCCESS { + let messageStack = try Orca.getMessageStack() + throw Orca.pvStatusToOrcaError(status, "Orca getAvailableDevices failed", messageStack) + } + + var hardwareDevices: [String] = [] + for i in 0..? { return self._validCharacters @@ -216,30 +240,46 @@ public class Orca { /// - Parameters: /// - accessKey: AccessKey obtained from the Picovoice Console (https://console.picovoice.ai/) /// - modelPath: Absolute path to file containing model parameters. + /// - device: String representation of the device (e.g., CPU or GPU) to use. If set to `best`, the most + /// suitable device is selected automatically. If set to `gpu`, the engine uses the first available GPU + /// device. To select a specific GPU device, set this argument to `gpu:${GPU_INDEX}`, where `${GPU_INDEX}` + /// is the index of the target GPU. If set to `cpu`, the engine will run on the CPU with the default + /// number of threads. To specify the number of threads, set this argument to `cpu:${NUM_THREADS}`, + /// where `${NUM_THREADS}` is the desired number of threads. /// - Throws: OrcaError public init( accessKey: String, - modelPath: String) throws { + modelPath: String, + device: String? = nil) throws { var modelPathArg = modelPath if !FileManager().fileExists(atPath: modelPathArg) { modelPathArg = try getResourcePath(modelPathArg) } + var deviceArg = device + if device == nil { + deviceArg = "best" + } + pv_set_sdk(Orca.sdk) - let initStatus = pv_orca_init(accessKey, modelPathArg, &handle) + let initStatus = pv_orca_init( + accessKey, + modelPathArg, + deviceArg, + &handle) if initStatus != PV_STATUS_SUCCESS { - let messageStack = try getMessageStack() - throw pvStatusToOrcaError(initStatus, "Orca init failed", messageStack) + let messageStack = try Orca.getMessageStack() + throw Orca.pvStatusToOrcaError(initStatus, "Orca init failed", messageStack) } var cNumCharacters: Int32 = 0 var cCharacters: UnsafePointer?>? let validCharactersStatus = pv_orca_valid_characters(handle, &cNumCharacters, &cCharacters) if validCharactersStatus != PV_STATUS_SUCCESS { - let messageStack = try getMessageStack() - throw pvStatusToOrcaError(validCharactersStatus, "Unable to get Orca valid characters", messageStack) + let messageStack = try Orca.getMessageStack() + throw Orca.pvStatusToOrcaError(validCharactersStatus, "Unable to get Orca valid characters", messageStack) } var validCharacters: Set = ["‘", "’", "“", "”"] for i in 0.. OrcaError { @@ -591,12 +642,12 @@ public class Orca { } } - private func getMessageStack() throws -> [String] { + private static func getMessageStack() throws -> [String] { var messageStackRef: UnsafeMutablePointer?>? var messageStackDepth: Int32 = 0 let status = pv_get_error_stack(&messageStackRef, &messageStackDepth) if status != PV_STATUS_SUCCESS { - throw pvStatusToOrcaError(status, "Unable to get Orca error state") + throw Orca.pvStatusToOrcaError(status, "Unable to get Orca error state") } var messageStack: [String] = [] diff --git a/binding/ios/OrcaAppTest/OrcaAppTest.xcodeproj/project.pbxproj b/binding/ios/OrcaAppTest/OrcaAppTest.xcodeproj/project.pbxproj index 471cae58..26933406 100644 --- a/binding/ios/OrcaAppTest/OrcaAppTest.xcodeproj/project.pbxproj +++ b/binding/ios/OrcaAppTest/OrcaAppTest.xcodeproj/project.pbxproj @@ -394,7 +394,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -448,7 +448,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 13.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; @@ -662,7 +662,7 @@ repositoryURL = "https://github.com/Picovoice/orca"; requirement = { kind = exactVersion; - version = 1.2.0; + version = 2.0.0; }; }; /* End XCRemoteSwiftPackageReference section */ diff --git a/binding/ios/OrcaAppTest/OrcaAppTestUITests/BaseTest.swift b/binding/ios/OrcaAppTest/OrcaAppTestUITests/BaseTest.swift index 4f57721b..48118acc 100644 --- a/binding/ios/OrcaAppTest/OrcaAppTestUITests/BaseTest.swift +++ b/binding/ios/OrcaAppTest/OrcaAppTestUITests/BaseTest.swift @@ -67,7 +67,9 @@ extension String { class BaseTest: XCTestCase { - let accessKey = "{TESTING_ACCESS_KEY_HERE}" + let accessKey: String = "{TESTING_ACCESS_KEY_HERE}" + let device: String = "{TESTING_DEVICE_HERE}" + var testData: TestData? override func setUp() async throws { diff --git a/binding/ios/OrcaAppTest/OrcaAppTestUITests/OrcaAppTestUITests.swift b/binding/ios/OrcaAppTest/OrcaAppTestUITests/OrcaAppTestUITests.swift index 7d932a05..25c80201 100644 --- a/binding/ios/OrcaAppTest/OrcaAppTestUITests/OrcaAppTestUITests.swift +++ b/binding/ios/OrcaAppTest/OrcaAppTestUITests/OrcaAppTestUITests.swift @@ -30,7 +30,10 @@ class OrcaAppTestUITests: BaseTest { for testCase in self.testData!.tests.sentence_tests { for model in testCase.models { try XCTContext.runActivity(named: "(\(testCase.language) \(model))") { _ in - let orca = try Orca.init(accessKey: self.accessKey, modelPath: self.getModelPath(model: model)) + let orca = try Orca.init( + accessKey: self.accessKey, + modelPath: self.getModelPath(model: model), + device: device) try runTestSynthesize(orca: orca, model: model, testCase: testCase) @@ -69,7 +72,10 @@ class OrcaAppTestUITests: BaseTest { for testCase in self.testData!.tests.sentence_tests { for model in testCase.models { try XCTContext.runActivity(named: "(\(testCase.language) \(model))") { _ in - let orca = try Orca.init(accessKey: self.accessKey, modelPath: self.getModelPath(model: model)) + let orca = try Orca.init( + accessKey: self.accessKey, + modelPath: self.getModelPath(model: model), + device: device) try runTestStreaming(orca: orca, model: model, testCase: testCase) @@ -87,7 +93,10 @@ class OrcaAppTestUITests: BaseTest { for testCase in self.testData!.tests.sentence_tests { for model in testCase.models { try XCTContext.runActivity(named: "(\(testCase.language) \(model))") { _ in - let orca = try Orca.init(accessKey: self.accessKey, modelPath: self.getModelPath(model: model)) + let orca = try Orca.init( + accessKey: self.accessKey, + modelPath: self.getModelPath(model: model), + device: device) try runTestMaxCharacterLimit(orca: orca, model: model, testCase: testCase) @@ -105,7 +114,10 @@ class OrcaAppTestUITests: BaseTest { for testCase in self.testData!.tests.sentence_tests { for model in testCase.models { try XCTContext.runActivity(named: "(\(testCase.language) \(model))") { _ in - let orca = try Orca.init(accessKey: self.accessKey, modelPath: self.getModelPath(model: model)) + let orca = try Orca.init( + accessKey: self.accessKey, + modelPath: self.getModelPath(model: model), + device: device) try runTestSampleRate(orca: orca, model: model, testCase: testCase) @@ -123,7 +135,10 @@ class OrcaAppTestUITests: BaseTest { for testCase in self.testData!.tests.sentence_tests { for model in testCase.models { try XCTContext.runActivity(named: "(\(testCase.language) \(model))") { _ in - let orca = try Orca.init(accessKey: self.accessKey, modelPath: self.getModelPath(model: model)) + let orca = try Orca.init( + accessKey: self.accessKey, + modelPath: self.getModelPath(model: model), + device: device) try runTestValidCharacters(orca: orca, model: model, testCase: testCase) @@ -143,7 +158,10 @@ class OrcaAppTestUITests: BaseTest { for testCase in self.testData!.tests.sentence_tests { for model in testCase.models { try XCTContext.runActivity(named: "(\(testCase.language) \(model))") { _ in - let orca = try Orca.init(accessKey: self.accessKey, modelPath: self.getModelPath(model: model)) + let orca = try Orca.init( + accessKey: self.accessKey, + modelPath: self.getModelPath(model: model), + device: device) try runTestSynthesizeCustomPron(orca: orca, model: model, testCase: testCase) @@ -171,7 +189,10 @@ class OrcaAppTestUITests: BaseTest { for testCase in self.testData!.tests.sentence_tests { for model in testCase.models { try XCTContext.runActivity(named: "(\(testCase.language) \(model))") { _ in - let orca = try Orca.init(accessKey: self.accessKey, modelPath: self.getModelPath(model: model)) + let orca = try Orca.init( + accessKey: self.accessKey, + modelPath: self.getModelPath(model: model), + device: device) try runTestSynthesizeSpeechRate(orca: orca, model: model, testCase: testCase) @@ -197,7 +218,10 @@ class OrcaAppTestUITests: BaseTest { for testCase in self.testData!.tests.sentence_tests { for model in testCase.models { try XCTContext.runActivity(named: "(\(testCase.language) \(model))") { _ in - let orca = try Orca.init(accessKey: self.accessKey, modelPath: self.getModelPath(model: model)) + let orca = try Orca.init( + accessKey: self.accessKey, + modelPath: self.getModelPath(model: model), + device: device) try runTestSynthesizeRandomState(orca: orca, model: model, testCase: testCase) @@ -230,7 +254,10 @@ class OrcaAppTestUITests: BaseTest { for testCase in self.testData!.tests.sentence_tests { for model in testCase.models { try XCTContext.runActivity(named: "(\(testCase.language) \(model))") { _ in - let orca = try Orca.init(accessKey: self.accessKey, modelPath: self.getModelPath(model: model)) + let orca = try Orca.init( + accessKey: self.accessKey, + modelPath: self.getModelPath(model: model), + device: device) try runTestSynthesizeToFile(orca: orca, model: model, testCase: testCase) @@ -252,7 +279,10 @@ class OrcaAppTestUITests: BaseTest { for testCase in self.testData!.tests.sentence_tests { for model in testCase.models { try XCTContext.runActivity(named: "(\(testCase.language) \(model))") { _ in - let orca = try Orca.init(accessKey: self.accessKey, modelPath: self.getModelPath(model: model)) + let orca = try Orca.init( + accessKey: self.accessKey, + modelPath: self.getModelPath(model: model), + device: device) try runTestSynthesizeQuotes(orca: orca, model: model, testCase: testCase) @@ -285,7 +315,10 @@ class OrcaAppTestUITests: BaseTest { for testCase in self.testData!.tests.sentence_tests { for model in testCase.models { try XCTContext.runActivity(named: "(\(testCase.language) \(model))") { _ in - let orca = try Orca.init(accessKey: self.accessKey, modelPath: self.getModelPath(model: model)) + let orca = try Orca.init( + accessKey: self.accessKey, + modelPath: self.getModelPath(model: model), + device: device) try runTestStreamingQuotes(orca: orca, model: model, testCase: testCase) @@ -318,7 +351,10 @@ class OrcaAppTestUITests: BaseTest { for testCase in self.testData!.tests.sentence_tests { for model in testCase.models { try XCTContext.runActivity(named: "(\(testCase.language) \(model))") { _ in - let orca = try Orca.init(accessKey: self.accessKey, modelPath: self.getModelPath(model: model)) + let orca = try Orca.init( + accessKey: self.accessKey, + modelPath: self.getModelPath(model: model), + device: device) try runTestSynthesizeToFileQuotes(orca: orca, model: model, testCase: testCase) @@ -344,7 +380,10 @@ class OrcaAppTestUITests: BaseTest { for testCase in self.testData!.tests.invalid_tests { for model in testCase.models { try XCTContext.runActivity(named: "(\(testCase.language) \(model))") { _ in - let orca = try Orca.init(accessKey: self.accessKey, modelPath: self.getModelPath(model: model)) + let orca = try Orca.init( + accessKey: self.accessKey, + modelPath: self.getModelPath(model: model), + device: device) try runTestInvalidText(orca: orca, model: model, testCase: testCase) @@ -396,7 +435,10 @@ class OrcaAppTestUITests: BaseTest { func testAlignments() throws { for testCase in self.testData!.tests.alignment_tests { try XCTContext.runActivity(named: "(\(testCase.language) \(testCase.model))") { _ in - let orca = try Orca.init(accessKey: self.accessKey, modelPath: self.getModelPath(model: testCase.model)) + let orca = try Orca.init( + accessKey: self.accessKey, + modelPath: self.getModelPath(model: testCase.model), + device: device) try runTestAlignments(orca: orca, model: testCase.model, testCase: testCase) @@ -409,6 +451,14 @@ class OrcaAppTestUITests: BaseTest { XCTAssertGreaterThan(Orca.version.count, 0) } + func testGetAvailableDevices() throws { + let devices = try Orca.getAvailableDevices() + XCTAssert(!devices.isEmpty) + for device in devices { + XCTAssert(!device.isEmpty) + } + } + func testMessageStack() throws { let bundle = Bundle(for: type(of: self)) let modelPath: String = bundle.path( @@ -418,7 +468,7 @@ class OrcaAppTestUITests: BaseTest { var first_error: String = "" do { - let orca: Orca = try Orca(accessKey: "invalid", modelPath: modelPath) + let orca: Orca = try Orca(accessKey: "invalid", modelPath: modelPath, device: device) XCTAssertNil(orca) } catch { first_error = "\(error.localizedDescription)" @@ -426,7 +476,7 @@ class OrcaAppTestUITests: BaseTest { } do { - let orca: Orca = try Orca(accessKey: "invalid", modelPath: modelPath) + let orca: Orca = try Orca(accessKey: "invalid", modelPath: modelPath, device: device) XCTAssertNil(orca) } catch { XCTAssert("\(error.localizedDescription)".count == first_error.count) @@ -440,7 +490,7 @@ class OrcaAppTestUITests: BaseTest { ofType: "pv", inDirectory: "test_resources/model_files")! - let orca: Orca = try Orca(accessKey: accessKey, modelPath: modelPath) + let orca: Orca = try Orca(accessKey: accessKey, modelPath: modelPath, device: device) orca.delete() do { diff --git a/binding/ios/OrcaAppTest/PerformanceTest/PerformanceTest.swift b/binding/ios/OrcaAppTest/PerformanceTest/PerformanceTest.swift index b5b8d811..b9fdc8a3 100644 --- a/binding/ios/OrcaAppTest/PerformanceTest/PerformanceTest.swift +++ b/binding/ios/OrcaAppTest/PerformanceTest/PerformanceTest.swift @@ -39,7 +39,7 @@ class PerformanceTest: BaseTest { for i in 0...numTestIterations { var totalNSec = 0.0 - let orca = try Orca(accessKey: accessKey, modelPath: modelPath) + let orca = try Orca(accessKey: accessKey, modelPath: modelPath, device: device) let before = CFAbsoluteTimeGetCurrent() let (pcm, wordArray) = try orca.synthesize(text: testCase.text) diff --git a/binding/ios/README.md b/binding/ios/README.md index ba57d0b1..6dbc934c 100644 --- a/binding/ios/README.md +++ b/binding/ios/README.md @@ -14,7 +14,7 @@ assistants. Orca is: ## Compatibility -- iOS 13.0 or higher +- iOS 16.0 or higher ## Installation diff --git a/binding/nodejs/README.md b/binding/nodejs/README.md index bb7e59cc..7edc5d7a 100644 --- a/binding/nodejs/README.md +++ b/binding/nodejs/README.md @@ -16,7 +16,7 @@ voice assistants. Orca is: ## Compatibility -- Node.js 16+ +- Node.js 18+ - Runs on Linux (x86_64), macOS (x86_64, arm64), Windows (x86_64, arm64), and Raspberry Pi (3, 4, 5). ## Installation diff --git a/binding/nodejs/package.json b/binding/nodejs/package.json index 7ef80633..3808e7d7 100644 --- a/binding/nodejs/package.json +++ b/binding/nodejs/package.json @@ -1,6 +1,6 @@ { "name": "@picovoice/orca-node", - "version": "1.2.0", + "version": "2.0.0", "description": "Picovoice Orca Node.js binding", "main": "dist/index.js", "types": "dist/types/index.d.ts", diff --git a/binding/nodejs/src/index.ts b/binding/nodejs/src/index.ts index 8063d9d8..244ede69 100644 --- a/binding/nodejs/src/index.ts +++ b/binding/nodejs/src/index.ts @@ -1,5 +1,5 @@ // -// Copyright 2024 Picovoice Inc. +// Copyright 2024-2025 Picovoice Inc. // // You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" // file accompanying this source. @@ -34,6 +34,7 @@ import { OrcaSynthesizeResult, OrcaSynthesizeToFileResult, OrcaStreamSynthesizeResult, + OrcaInputOptions, OrcaOptions, } from './types'; @@ -46,6 +47,7 @@ export { OrcaSynthesizeResult, OrcaSynthesizeToFileResult, OrcaStreamSynthesizeResult, + OrcaInputOptions, OrcaOptions, OrcaActivationError, OrcaActivationLimitReachedError, diff --git a/binding/nodejs/src/orca.ts b/binding/nodejs/src/orca.ts index 7d0fc8a5..37f73b1b 100644 --- a/binding/nodejs/src/orca.ts +++ b/binding/nodejs/src/orca.ts @@ -20,6 +20,7 @@ import { } from './errors'; import { + OrcaInputOptions, OrcaOptions, OrcaSynthesizeParams, OrcaSynthesizeResult, @@ -39,6 +40,10 @@ type OrcaStreamResult = { status: PvStatus; pcm: Int16Array; }; +type OrcaHardwareDevicesResult = { + hardware_devices: string[]; + status: PvStatus; +}; class Stream { private readonly _stream: any; @@ -155,6 +160,12 @@ export class Orca { * @param {string} accessKey AccessKey obtained from Picovoice Console (https://console.picovoice.ai/). * @param {OrcaOptions} options Optional configuration arguments. * @param {string} options.modelPath The path to save and use the model from (.pv extension) + * @param {string} options.device String representation of the device (e.g., CPU or GPU) to use for inference. + * If set to `best`, the most suitable device is selected automatically. If set to `gpu`, the engine uses the + * first available GPU device. To select a specific GPU device, set this argument to `gpu:${GPU_INDEX}`, where + * `${GPU_INDEX}` is the index of the target GPU. If set to `cpu`, the engine will run on the CPU with the + * default number of threads. To specify the number of threads, set this argument to `cpu:${NUM_THREADS}`, + * where `${NUM_THREADS}` is the desired number of threads. * @param {string} options.libraryPath the path to the Orca dynamic library (.node extension) */ constructor(accessKey: string, options: OrcaOptions = {}) { @@ -168,6 +179,7 @@ export class Orca { const { modelPath = path.resolve(__dirname, DEFAULT_MODEL_PATH), + device = 'best', libraryPath = getSystemLibraryPath(), } = options; @@ -190,7 +202,7 @@ export class Orca { try { pvOrca.set_sdk('nodejs'); - orcaHandleAndStatus = pvOrca.init(accessKey, modelPath); + orcaHandleAndStatus = pvOrca.init(accessKey, modelPath, device); } catch (err: any) { pvStatusToException(err.code, err); } @@ -465,6 +477,41 @@ export class Orca { } } + /** + * Lists all available devices that Orca can use for inference. Each entry in the list can be used + * as the `device` argument when creating an instance of Orca. + * @param {OrcaInputOptions} options Optional configuration arguments. + * @param {string} options.libraryPath the path to the Orca dynamic library (.node extension) + * + * @returns List of all available devices that Orca can use for inference. + */ + static listAvailableDevices(options: OrcaInputOptions = {}): string[] { + const { + libraryPath = getSystemLibraryPath(), + } = options; + + const pvOrca = require(libraryPath); // eslint-disable-line + + let orcaHardwareDevicesResult: OrcaHardwareDevicesResult | null = null; + try { + orcaHardwareDevicesResult = pvOrca.list_hardware_devices(); + } catch (err: any) { + pvStatusToException(err.code, err); + } + + const status = orcaHardwareDevicesResult!.status; + if (status !== PvStatus.SUCCESS) { + const errorObject = pvOrca.get_error_stack(); + if (errorObject.status === PvStatus.SUCCESS) { + pvStatusToException(status, 'Orca failed to get available devices', errorObject.message_stack); + } else { + pvStatusToException(status, 'Unable to get Orca error state'); + } + } + + return orcaHardwareDevicesResult!.hardware_devices; + } + private handlePvStatus(status: PvStatus, message: string): void { const errorObject = this._pvOrca.get_error_stack(); if (errorObject.status === PvStatus.SUCCESS) { diff --git a/binding/nodejs/src/types.ts b/binding/nodejs/src/types.ts index ea71458f..93fa2312 100644 --- a/binding/nodejs/src/types.ts +++ b/binding/nodejs/src/types.ts @@ -1,5 +1,5 @@ /* - Copyright 2024 Picovoice Inc. + Copyright 2024-2025 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on @@ -34,7 +34,13 @@ export type OrcaSynthesizeToFileResult = OrcaAlignment[] export type OrcaStreamSynthesizeResult = Int16Array | null -export type OrcaOptions = { +export type OrcaInitOptions = { modelPath?: string; + device?: string; +}; + +export type OrcaInputOptions = { libraryPath?: string; }; + +export type OrcaOptions = OrcaInitOptions & OrcaInputOptions; diff --git a/binding/nodejs/test/index.test.ts b/binding/nodejs/test/index.test.ts index 5a7a2c20..ad1bc447 100644 --- a/binding/nodejs/test/index.test.ts +++ b/binding/nodejs/test/index.test.ts @@ -20,10 +20,17 @@ import { getAudioFile, getTestData, getModelPath } from './test_utils'; const ACCESS_KEY = process.argv .filter(x => x.startsWith('--access_key='))[0] .split('--access_key=')[1]; +const DEVICE = process.argv + .filter(x => x.startsWith('--device='))[0] + .split('--device=')[1] ?? 'best'; + +const PCM_OUTLIER_THRESHOLD = 400 +const PCM_OUTLIER_COUNT_THRESHOLD = 0.05 const testData = getTestData(); -const getAudioFileName = (model: string, synthesis_type: string): string => model.replace(".pv", `_${synthesis_type}.wav`); +const getAudioFileName = (model: string, synthesis_type: string): string => + model.replace(".pv", `_${synthesis_type}.wav`); const loadPcm = (audioFile: string): any => { const waveFilePath = getAudioFile(audioFile); @@ -36,9 +43,9 @@ const loadPcm = (audioFile: string): any => { const validatePcm = (pcm: Int16Array, groundTruth: Int16Array) => { expect(pcm.length).toBeGreaterThan(0); expect(pcm.length).toEqual(groundTruth.length); - for (let i = 0; i < pcm.length; i++) { - expect(Math.abs(pcm[i] - groundTruth[i])).toBeLessThanOrEqual(8000); - } + const diffPcm = pcm.map((a, i) => Math.abs(a - groundTruth[i])); + const diffOutliers = diffPcm.filter(d => d > PCM_OUTLIER_THRESHOLD).length / diffPcm.length; + expect(diffOutliers).toBeLessThanOrEqual(PCM_OUTLIER_COUNT_THRESHOLD); }; const validatePhonemes = (phonemes: OrcaPhoneme[]) => { @@ -84,14 +91,14 @@ describe('properties', () => { describe.each(testData.tests.sentence_tests)('$language', ({ language, models }) => { describe.each(models)('%s', model => { it('version', () => { - const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model) }); + const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model), device: DEVICE }); expect(typeof orcaEngine.version).toEqual('string'); expect(orcaEngine.version.length).toBeGreaterThan(0); orcaEngine.release(); }); it('sample rate', () => { - const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model) }); + const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model), device: DEVICE }); expect(orcaEngine.sampleRate).toBeGreaterThan(0); orcaEngine.release(); }); @@ -105,7 +112,7 @@ describe('properties', () => { }); it('max character limit', () => { - const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model) }); + const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model), device: DEVICE }); expect(orcaEngine.maxCharacterLimit).toBeGreaterThan(0); orcaEngine.release(); }); @@ -117,7 +124,7 @@ describe('sentences', () => { describe.each(testData.tests.sentence_tests)('$language', ({ language, models, random_state, text, text_no_punctuation, text_custom_pronunciation }) => { describe.each(models)('%s', model => { it('synthesize', () => { - const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model) }); + const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model), device: DEVICE }); const { pcm, alignments } = orcaEngine.synthesize( text, { speechRate: 1, randomState: random_state }, @@ -129,7 +136,7 @@ describe('sentences', () => { }); it('synthesize with no punctuation', () => { - const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model) }); + const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model), device: DEVICE }); try { const { pcm, alignments } = orcaEngine.synthesize(text_no_punctuation); @@ -143,7 +150,7 @@ describe('sentences', () => { }); it('synthesize with custom punctuation', () => { - const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model) }); + const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model), device: DEVICE }); try { const { pcm, alignments } = orcaEngine.synthesize(text_custom_pronunciation); @@ -157,7 +164,7 @@ describe('sentences', () => { }); it('synthesize to file', () => { - const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model) }); + const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model), device: DEVICE }); const filePath = './orca-temp.wav'; const alignments = orcaEngine.synthesizeToFile(text, filePath); validateAlignments(alignments); @@ -166,7 +173,7 @@ describe('sentences', () => { }); it('streaming synthesis', () => { - const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model) }); + const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model), device: DEVICE }); const orcaStream = orcaEngine.streamOpen({ randomState: random_state }); const fullPcm: number[] = []; for (const char of text) { @@ -187,7 +194,7 @@ describe('sentences', () => { }); it('speech rate', () => { - const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model) }); + const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model), device: DEVICE }); const { pcm: pcmSlow } = orcaEngine.synthesize(text, { speechRate: 0.7 }); const { pcm: pcmFast } = orcaEngine.synthesize(text, { speechRate: 1.3 }); expect(pcmSlow.length).toBeGreaterThan(0); @@ -202,7 +209,7 @@ describe('sentences', () => { describe('alignments', () => { describe.each(testData.tests.alignment_tests)('$language $model', ({ language, model, random_state, text_alignment, alignments: expectedAlignments }) => { it('synthesize alignment', () => { - const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model) }); + const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model), device: DEVICE }); const { pcm, alignments } = orcaEngine.synthesize(text_alignment, { randomState: random_state }); expect(pcm.length).toBeGreaterThan(0); validateAlignmentsExact(alignments, expectedAlignments); @@ -215,7 +222,7 @@ describe('invalids', () => { describe.each(testData.tests.invalid_tests)('$language', ({ language, models, text_invalid }) => { describe.each(models)('%s', model => { it('invalid input', () => { - const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model) }); + const orcaEngine = new Orca(ACCESS_KEY, { modelPath: getModelPath(model), device: DEVICE }); text_invalid.forEach((sentence: string) => { try { @@ -232,12 +239,17 @@ describe('invalids', () => { }); -describe('Defaults', () => { +describe('basic parameter validation', () => { test('Empty AccessKey', () => { expect(() => { new Orca(''); }).toThrow(OrcaInvalidArgumentError); }); + test('Invalid device', () => { + expect(() => { + new Orca(ACCESS_KEY, { device: "cloud:9" }); + }).toThrow(OrcaInvalidArgumentError); + }); }); describe('manual paths', () => { @@ -246,7 +258,7 @@ describe('manual paths', () => { let orcaEngine = new Orca( ACCESS_KEY, - { libraryPath }, + { libraryPath, device: DEVICE }, ); let { pcm, alignments } = orcaEngine.synthesize( @@ -261,8 +273,8 @@ describe('manual paths', () => { }); }); -describe('error message stack', () => { - test('message stack cleared after read', () => { +describe('static functions', () => { + test('error message stack cleared after read', () => { let error: string[] = []; try { new Orca('invalid'); @@ -281,4 +293,9 @@ describe('error message stack', () => { } } }); + test('list hardware devices', () => { + const hardwareDevices: string[] = Orca.listAvailableDevices(); + expect(Array.isArray(hardwareDevices)).toBeTruthy(); + expect(hardwareDevices.length).toBeGreaterThan(0); + }); }); diff --git a/binding/nodejs/test/perf.test.ts b/binding/nodejs/test/perf.test.ts index 69a6b8f3..b557f9bf 100644 --- a/binding/nodejs/test/perf.test.ts +++ b/binding/nodejs/test/perf.test.ts @@ -18,7 +18,10 @@ import { getTestData } from './test_utils'; const ACCESS_KEY = process.argv .filter(x => x.startsWith('--access_key='))[0] - ?.split('--access_key=')[1] ?? ''; + ?.split('--access_key=')[1]; +const DEVICE = process.argv + .filter(x => x.startsWith('--device='))[0] + .split('--device=')[1] ?? 'best'; const NUM_TEST_ITERATIONS = Number( process.argv .filter(x => x.startsWith('--num_test_iterations='))[0] @@ -32,7 +35,7 @@ const PROC_PERFORMANCE_THRESHOLD_SEC = Number( describe('Performance', () => { test('synthesize', () => { - let orcaEngine = new Orca(ACCESS_KEY); + let orcaEngine = new Orca(ACCESS_KEY, { device: DEVICE }); let perfResults: number[] = []; for (let i = 0; i < NUM_TEST_ITERATIONS; i++) { diff --git a/binding/python/_factory.py b/binding/python/_factory.py index c5c5a9ff..850becde 100644 --- a/binding/python/_factory.py +++ b/binding/python/_factory.py @@ -1,5 +1,5 @@ # -# Copyright 2024 Picovoice Inc. +# Copyright 2024-2025 Picovoice Inc. # # You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" # file accompanying this source. @@ -9,15 +9,25 @@ # specific language governing permissions and limitations under the License. # -from typing import Optional +from typing import ( + Optional, + Sequence +) -from ._orca import Orca -from ._util import default_library_path, default_model_path +from ._orca import ( + list_hardware_devices, + Orca +) +from ._util import ( + default_library_path, + default_model_path +) def create( access_key: str, model_path: Optional[str] = None, + device: Optional[str] = None, library_path: Optional[str] = None) -> Orca: """ Factory method for Orca text-to-speech engine. @@ -25,21 +35,47 @@ def create( :param access_key: AccessKey obtained from Picovoice Console (https://console.picovoice.ai/) :param model_path: Absolute path to the file containing model parameters. If not set it will be set to the default location. + :param device: String representation of the device (e.g., CPU or GPU) to use. If set to `best`, the most + suitable device is selected automatically. If set to `gpu`, the engine uses the first available GPU device. + To select a specific GPU device, set this argument to `gpu:${GPU_INDEX}`, where `${GPU_INDEX}` is the index + of the target GPU. If set to`cpu`, the engine will run on the CPU with the default number of threads. To + specify the number of threads, set this argument to `cpu:${NUM_THREADS}`, where `${NUM_THREADS}` is the + desired number of threads. :param library_path: Absolute path to Orca's dynamic library. If not set it will be set to the default location. """ if model_path is None: model_path = default_model_path() + if device is None: + device = "best" + if library_path is None: library_path = default_library_path() return Orca( access_key=access_key, model_path=model_path, + device=device, library_path=library_path) +def available_devices(library_path: Optional[str] = None) -> Sequence[str]: + """ + Lists all available devices that Orca can use for inference. Each entry in the list can be the `device` + argument of `.create` factory method or `Orca` constructor. + :param library_path: Absolute path to Orca's dynamic library. + If not set it will be set to the default location. + :return: List of all available devices that Orca can use for inference. + """ + + if library_path is None: + library_path = default_library_path() + + return list_hardware_devices(library_path=library_path) + + __all__ = [ + 'available_devices', "create", ] diff --git a/binding/python/_orca.py b/binding/python/_orca.py index 15c37aa1..75bef894 100644 --- a/binding/python/_orca.py +++ b/binding/python/_orca.py @@ -1,3 +1,14 @@ +# +# Copyright 2024-2025 Picovoice Inc. +# +# You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" +# file accompanying this source. +# +# Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +# an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +# specific language governing permissions and limitations under the License. +# + import os from collections import namedtuple from ctypes import * @@ -223,12 +234,23 @@ def close(self) -> None: self._orca._stream_close_func(self._handle) - def __init__(self, access_key: str, model_path: str, library_path: str) -> None: + def __init__( + self, + access_key: str, + model_path: str, + device: str, + library_path: str) -> None: """ Constructor. :param access_key: AccessKey obtained from Picovoice Console (https://console.picovoice.ai/) :param model_path: Absolute path to the file containing model parameters. + :param device: String representation of the device (e.g., CPU or GPU) to use. If set to `best`, the most + suitable device is selected automatically. If set to `gpu`, the engine uses the first available GPU device. + To select a specific GPU device, set this argument to `gpu:${GPU_INDEX}`, where `${GPU_INDEX}` is the index + of the target GPU. If set to`cpu`, the engine will run on the CPU with the default number of threads. To + specify the number of threads, set this argument to `cpu:${NUM_THREADS}`, where `${NUM_THREADS}` is the + desired number of threads. :param library_path: Absolute path to Orca's dynamic library. """ @@ -238,6 +260,9 @@ def __init__(self, access_key: str, model_path: str, library_path: str) -> None: if not os.path.exists(model_path): raise OrcaIOError("Could not find model file at `%s`." % model_path) + if not isinstance(device, str) or len(device) == 0: + raise ValueError("`device` should be a non-empty string.") + if not os.path.exists(library_path): raise OrcaIOError("Could not find Orca's dynamic library at `%s`." % library_path) @@ -258,11 +283,19 @@ def __init__(self, access_key: str, model_path: str, library_path: str) -> None: self._free_error_stack_func.restype = None init_func = library.pv_orca_init - init_func.argtypes = [c_char_p, c_char_p, POINTER(POINTER(self.COrca))] + init_func.argtypes = [ + c_char_p, + c_char_p, + c_char_p, + POINTER(POINTER(self.COrca))] init_func.restype = PicovoiceStatuses self._handle = POINTER(self.COrca)() - status = init_func(access_key.encode(), model_path.encode(), byref(self._handle)) + status = init_func( + access_key.encode(), + model_path.encode(), + device.encode(), + byref(self._handle)) if status is not PicovoiceStatuses.SUCCESS: raise _PICOVOICE_STATUS_TO_EXCEPTION[status]( message='Initialization failed', @@ -633,7 +666,36 @@ def _get_error_stack(self) -> Sequence[str]: return message_stack +def list_hardware_devices(library_path: str) -> Sequence[str]: + dll_dir_obj = None + if hasattr(os, "add_dll_directory"): + dll_dir_obj = os.add_dll_directory(os.path.dirname(library_path)) + + library = cdll.LoadLibrary(library_path) + + if dll_dir_obj is not None: + dll_dir_obj.close() + + list_hardware_devices_func = library.pv_orca_list_hardware_devices + list_hardware_devices_func.argtypes = [POINTER(POINTER(c_char_p)), POINTER(c_int32)] + list_hardware_devices_func.restype = PicovoiceStatuses + c_hardware_devices = POINTER(c_char_p)() + c_num_hardware_devices = c_int32() + status = list_hardware_devices_func(byref(c_hardware_devices), byref(c_num_hardware_devices)) + if status is not PicovoiceStatuses.SUCCESS: + raise _PICOVOICE_STATUS_TO_EXCEPTION[status](message='`pv_orca_list_hardware_devices` failed.') + res = [c_hardware_devices[i].decode() for i in range(c_num_hardware_devices.value)] + + free_hardware_devices_func = library.pv_orca_free_hardware_devices + free_hardware_devices_func.argtypes = [POINTER(c_char_p), c_int32] + free_hardware_devices_func.restype = None + free_hardware_devices_func(c_hardware_devices, c_num_hardware_devices.value) + + return res + + __all__ = [ + "list_hardware_devices", "Orca", "OrcaActivationError", "OrcaActivationLimitError", diff --git a/binding/python/setup.py b/binding/python/setup.py index 3a2d52b9..54435475 100644 --- a/binding/python/setup.py +++ b/binding/python/setup.py @@ -49,7 +49,7 @@ setuptools.setup( name="pvorca", - version="1.2.0", + version="2.0.0", author="Picovoice", author_email="hello@picovoice.ai", description="Orca Streaming Text-to-Speech Engine", diff --git a/binding/python/test_orca.py b/binding/python/test_orca.py index 7ef9cece..dd096592 100644 --- a/binding/python/test_orca.py +++ b/binding/python/test_orca.py @@ -25,9 +25,12 @@ test_data = get_test_data() +PCM_OUTLIER_THRESHOLD = 400 +PCM_OUTLIER_COUNT_THRESHOLD = 0.05 class OrcaTestCase(unittest.TestCase): access_key: str + device: str orcas: List[Orca] model_paths: List[str] @@ -51,8 +54,10 @@ def _test_word_equal(self, word: Orca.WordAlignment, word_truth: Orca.WordAlignm def _test_audio(self, pcm: Sequence[int], ground_truth: Sequence[int]) -> None: pcm = pcm[:len(ground_truth)] # compensate for discrepancies due to wav header self.assertEqual(len(pcm), len(ground_truth)) - for i in range(len(pcm)): - self.assertAlmostEqual(pcm[i], ground_truth[i], delta=12000) + diff_pcm = [abs(a - b) for a, b in zip(pcm, ground_truth)] + diff_outliers = sum(1 for d in diff_pcm if d > PCM_OUTLIER_THRESHOLD) / len(diff_pcm) + self.assertLessEqual(diff_outliers, PCM_OUTLIER_COUNT_THRESHOLD) + @staticmethod def _get_pcm(model: str, audio_data_folder: str, synthesis_type: str = "single") -> Sequence[int]: @@ -69,6 +74,7 @@ def _orca_iter(cls, models): orca = Orca( access_key=cls.access_key, model_path=get_model_path(model), + device=cls.device, library_path=default_library_path('../..')) yield orca, model @@ -265,6 +271,7 @@ def test_message_stack(self): orca = Orca( access_key='invalid', model_path=default_model_path(relative_path), + device=self.device, library_path=default_library_path(relative_path)) self.assertIsNone(orca) except OrcaError as e: @@ -277,6 +284,7 @@ def test_message_stack(self): orca = Orca( access_key='invalid', model_path=default_model_path(relative_path), + device=self.device, library_path=default_library_path(relative_path)) self.assertIsNone(orca) except OrcaError as e: @@ -289,6 +297,7 @@ def test_process_message_stack(self): orca = Orca( access_key=self.access_key, model_path=default_model_path(relative_path), + device=self.device, library_path=default_library_path(relative_path)) address = orca._handle @@ -308,7 +317,9 @@ def test_process_message_stack(self): if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--access-key', required=True) + parser.add_argument('--device', required=True) args = parser.parse_args() OrcaTestCase.access_key = args.access_key + OrcaTestCase.device = args.device unittest.main(argv=sys.argv[:1]) diff --git a/binding/python/test_orca_perf.py b/binding/python/test_orca_perf.py index 57305f02..c34365da 100644 --- a/binding/python/test_orca_perf.py +++ b/binding/python/test_orca_perf.py @@ -27,6 +27,7 @@ class OrcaPerformanceTestCase(unittest.TestCase): access_key: str + device: str num_test_iterations: int proc_performance_threshold_rtf: float @@ -37,8 +38,9 @@ def test_performance_proc(self) -> None: for model in td.models: orca = Orca( access_key=self.access_key, - library_path=default_library_path('../..'), - model_path=get_model_path(model)) + model_path=get_model_path(model), + device=self.device, + library_path=default_library_path('../..')) num_audio_seconds = 0 num_proc_seconds = 0 @@ -59,11 +61,13 @@ def test_performance_proc(self) -> None: if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--access-key', required=True) + parser.add_argument('--device', required=True) parser.add_argument('--num-test-iterations', type=int, required=True) parser.add_argument('--proc-performance-threshold-rtf', type=float, required=True) args = parser.parse_args() OrcaPerformanceTestCase.access_key = args.access_key + OrcaPerformanceTestCase.device = args.device OrcaPerformanceTestCase.num_test_iterations = args.num_test_iterations OrcaPerformanceTestCase.proc_performance_threshold_rtf = args.proc_performance_threshold_rtf diff --git a/binding/python/test_util.py b/binding/python/test_util.py index cf4dd51b..efcd07df 100644 --- a/binding/python/test_util.py +++ b/binding/python/test_util.py @@ -60,7 +60,7 @@ def read_wav_file(path: str) -> Sequence[int]: return struct.unpack(f"{f.getnframes() - 4}h", buffer) -def get_model_path(model_name) -> List[str]: +def get_model_path(model_name) -> str: return os.path.join(os.path.dirname(__file__), "../../lib/common", model_name) diff --git a/binding/web/README.md b/binding/web/README.md index 0497cf67..f9467e37 100644 --- a/binding/web/README.md +++ b/binding/web/README.md @@ -20,11 +20,30 @@ voice assistants. Orca is: - Firefox - Safari +## Requirements + +Orca Web Binding uses [SharedArrayBuffer](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer) +for processing speaker diarization. + +Include the following headers in the response to enable the use of `SharedArrayBuffers`: + +``` +Cross-Origin-Opener-Policy: same-origin +Cross-Origin-Embedder-Policy: require-corp +``` + +Refer to our [Web demo](../../demo/web) for an example on creating a server with the corresponding response headers. + +Browsers that lack support for `SharedArrayBuffers` or required headers will fall back to using standard `ArrayBuffers`, +which disables multithreaded performance. + ### Restrictions IndexedDB is required to use `Orca` in a worker thread. Browsers without IndexedDB support (i.e. Firefox Incognito Mode) should use `Orca` in the main thread. +Multi-threading is only enabled for `Orca` when using on a web worker. + ## Installation ### Package diff --git a/binding/web/cypress.config.ts b/binding/web/cypress.config.ts index fe3f2682..b6f479a1 100644 --- a/binding/web/cypress.config.ts +++ b/binding/web/cypress.config.ts @@ -12,4 +12,12 @@ export default defineConfig({ video: false, screenshotOnRunFailure: false, }, + setupNodeEvents(on) { + on('before:browser:launch', (browser, launchOptions) => { + if (browser.name === 'chrome') { + launchOptions.args.push('--enable-features=SharedArrayBuffer'); + } + return launchOptions; + }); + }, }); diff --git a/binding/web/package.json b/binding/web/package.json index 4b7c8297..3163bc40 100644 --- a/binding/web/package.json +++ b/binding/web/package.json @@ -3,7 +3,7 @@ "description": "Orca Text-to-Speech engine for web browsers (via WebAssembly)", "author": "Picovoice Inc", "license": "Apache-2.0", - "version": "1.2.1", + "version": "2.0.0", "keywords": [ "orca", "web", @@ -29,8 +29,8 @@ "format": "prettier --write \"**/*.{js,ts,json}\"", "copywasm": "node scripts/copy_wasm.js", "setup-test": "node scripts/setup_test.js && npx pvbase64 -i ./test/orca_params_en_male.pv -o ./test/orca_params_en_male.js && npx pvbase64 -i ./test/orca_params_en_female.pv -o ./test/orca_params_en_female.js", - "test": "cypress run --spec test/orca.test.ts", - "test-perf": "cypress run --spec test/orca_perf.test.ts" + "test": "cypress run --spec test/orca.test.ts --browser chrome", + "test-perf": "cypress run --spec test/orca_perf.test.ts --browser chrome" }, "dependencies": { "@picovoice/web-utils": "=1.4.3" diff --git a/binding/web/rollup.config.js b/binding/web/rollup.config.js index ba9a2076..5bcf1390 100644 --- a/binding/web/rollup.config.js +++ b/binding/web/rollup.config.js @@ -69,7 +69,7 @@ export default { exclude: '**/node_modules/**', }), base64({ - include: ['./**/*.wasm', './**/*.txt'], + include: ['./src/lib/*.wasm', './src/lib/*.txt'], }) ], }; diff --git a/binding/web/scripts/copy_wasm.js b/binding/web/scripts/copy_wasm.js index 2d022815..083ec34f 100644 --- a/binding/web/scripts/copy_wasm.js +++ b/binding/web/scripts/copy_wasm.js @@ -2,10 +2,10 @@ const fs = require("fs"); const { join, extname } = require("path"); const wasmFiles = [ - "pv_orca.wasm", - "pv_orca.js", "pv_orca_simd.wasm", "pv_orca_simd.js", + "pv_orca_pthread.wasm", + "pv_orca_pthread.js", ] console.log("Copying the WASM model..."); diff --git a/binding/web/src/index.ts b/binding/web/src/index.ts index 01f5630f..b2131505 100644 --- a/binding/web/src/index.ts +++ b/binding/web/src/index.ts @@ -2,6 +2,7 @@ import { Orca, OrcaStream } from './orca'; import { OrcaWorker, OrcaStreamWorker } from './orca_worker'; import { + OrcaOptions, OrcaModel, OrcaSynthesizeParams, OrcaPhoneme, @@ -20,24 +21,25 @@ import { import * as OrcaErrors from './orca_errors'; -import orcaWasm from './lib/pv_orca.wasm'; -import orcaWasmLib from './lib/pv_orca.txt'; import orcaWasmSimd from './lib/pv_orca_simd.wasm'; import orcaWasmSimdLib from './lib/pv_orca_simd.txt'; +import orcaWasmPThread from './lib/pv_orca_pthread.wasm'; +import orcaWasmPThreadLib from './lib/pv_orca_pthread.txt'; -Orca.setWasm(orcaWasm); -Orca.setWasmLib(orcaWasmLib); Orca.setWasmSimd(orcaWasmSimd); Orca.setWasmSimdLib(orcaWasmSimdLib); -OrcaWorker.setWasm(orcaWasm); -OrcaWorker.setWasmLib(orcaWasmLib); +Orca.setWasmPThread(orcaWasmPThread); +Orca.setWasmPThreadLib(orcaWasmPThreadLib); OrcaWorker.setWasmSimd(orcaWasmSimd); OrcaWorker.setWasmSimdLib(orcaWasmSimdLib); +OrcaWorker.setWasmPThread(orcaWasmPThread); +OrcaWorker.setWasmPThreadLib(orcaWasmPThreadLib); export { Orca, OrcaStream, OrcaErrors, + OrcaOptions, OrcaModel, OrcaSynthesizeParams, OrcaPhoneme, diff --git a/binding/web/src/orca.ts b/binding/web/src/orca.ts index c89e87c5..2614f915 100644 --- a/binding/web/src/orca.ts +++ b/binding/web/src/orca.ts @@ -22,11 +22,12 @@ import { loadModel, } from '@picovoice/web-utils'; -import createModule from "./lib/pv_orca"; import createModuleSimd from "./lib/pv_orca_simd"; +import createModulePThread from "./lib/pv_orca_pthread"; import { OrcaAlignment, + OrcaOptions, OrcaModel, OrcaPhoneme, OrcaStreamSynthesizeResult, @@ -44,6 +45,7 @@ import { pvStatusToException } from './orca_errors'; type pv_orca_init_type = ( accessKey: number, modelPath: number, + device: number, object: number ) => Promise; type pv_orca_delete_type = (object: number) => void; @@ -91,6 +93,8 @@ type pv_orca_version_type = () => number; type pv_set_sdk_type = (sdk: number) => void; type pv_get_error_stack_type = (messageStack: number, messageStackDepth: number) => number; type pv_free_error_stack_type = (messageStack: number) => void; +type pv_orca_list_hardware_devices_type = (hardwareDevices: number, numHardwareDevices: number) => number; +type pv_orca_free_hardware_devices_type = (hardwareDevices: number, numHardwareDevices: number) => number; type OrcaModule = EmscriptenModule & { _pv_free: (address: number) => void; @@ -113,6 +117,8 @@ type OrcaModule = EmscriptenModule & { _pv_set_sdk: pv_set_sdk_type; _pv_get_error_stack: pv_get_error_stack_type; _pv_free_error_stack: pv_free_error_stack_type; + _pv_orca_list_hardware_devices: pv_orca_list_hardware_devices_type; + _pv_orca_free_hardware_devices: pv_orca_free_hardware_devices_type; // em default functions addFunction: typeof addFunction; @@ -138,6 +144,12 @@ type OrcaWasmOutput = { streamPcmAddressAddress: number; }; +export interface OrcaStream { + synthesize(text: string): Promise + flush(): Promise; + close(): Promise +} + /** * OrcaStream object that converts a stream of text to a stream of audio. */ @@ -335,12 +347,6 @@ class Stream implements OrcaStream { } } -export interface OrcaStream { - synthesize(text: string): Promise - flush(): Promise; - close(): Promise -} - /** * JavaScript/WebAssembly Binding for Orca */ @@ -363,10 +369,11 @@ export class Orca { private readonly _messageStackDepthAddress: number; private readonly _streamPcmAddressAddress: number; - private static _wasm: string; - private static _wasmLib: string; private static _wasmSimd: string; private static _wasmSimdLib: string; + private static _wasmPThread: string; + private static _wasmPThreadLib: string; + private static _sdk: string = 'web'; private static _orcaMutex = new Mutex(); @@ -419,26 +426,6 @@ export class Orca { return this._maxCharacterLimit; } - /** - * Set base64 wasm file. - * @param wasm Base64'd wasm file to use to initialize wasm. - */ - public static setWasm(wasm: string): void { - if (this._wasm === undefined) { - this._wasm = wasm; - } - } - - /** - * Set base64 wasm file in text format. - * @param wasmLib Base64'd wasm file in text format. - */ - public static setWasmLib(wasmLib: string): void { - if (this._wasmLib === undefined) { - this._wasmLib = wasmLib; - } - } - /** * Set base64 wasm file with SIMD feature. * @param wasmSimd Base64'd wasm file to use to initialize wasm. @@ -459,6 +446,26 @@ export class Orca { } } + /** + * Set base64 wasm file with SIMD and pthread feature. + * @param wasmPThread Base64'd wasm file to use to initialize wasm. + */ + public static setWasmPThread(wasmPThread: string): void { + if (this._wasmPThread === undefined) { + this._wasmPThread = wasmPThread; + } + } + + /** + * Set base64 SIMD and thread wasm file in text format. + * @param wasmPThreadLib Base64'd wasm file in text format. + */ + public static setWasmPThreadLib(wasmPThreadLib: string): void { + if (this._wasmPThreadLib === undefined) { + this._wasmPThreadLib = wasmPThreadLib; + } + } + public static setSdk(sdk: string): void { Orca._sdk = sdk; } @@ -476,37 +483,66 @@ export class Orca { * Set to a different name to use multiple models across `orca` instances. * @param model.forceWrite Flag to overwrite the model in storage even if it exists. * @param model.version Version of the model file. Increment to update the model file in storage. + * @param options Optional configuration arguments. + * @param options.device String representation of the device (e.g., CPU or GPU) to use. If set to `best`, the most + * suitable device is selected automatically. If set to `gpu`, the engine uses the first available GPU device. To + * select a specific GPU device, set this argument to `gpu:${GPU_INDEX}`, where `${GPU_INDEX}` is the index of the + * target GPU. If set to `cpu`, the engine will run on the CPU with the default number of threads. To specify the + * number of threads, set this argument to `cpu:${NUM_THREADS}`, where `${NUM_THREADS}` is the desired number of + * threads. * * @returns An instance of the Orca engine. */ public static async create( accessKey: string, model: OrcaModel, + options: OrcaOptions = {} ): Promise { const customWritePath = (model.customWritePath) ? model.customWritePath : 'orca_model'; const modelPath = await loadModel({ ...model, customWritePath }); - return Orca._init(accessKey, modelPath); + return Orca._init(accessKey, modelPath, options); } public static async _init( accessKey: string, modelPath: string, + options: OrcaOptions = {} ): Promise { if (!isAccessKeyValid(accessKey)) { throw new OrcaErrors.OrcaInvalidArgumentError('Invalid AccessKey'); } + let { device = 'best' } = options; + + const isSimd = await simd(); + if (!isSimd) { + throw new OrcaErrors.OrcaRuntimeError('Browser not supported.'); + } + + const isWorkerScope = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope; + if ( + !isWorkerScope && + (device === 'best' || (device.startsWith('cpu') && device !== 'cpu:1')) + ) { + // eslint-disable-next-line no-console + console.warn('Multi-threading is not supported on main thread.'); + device = 'cpu:1'; + } + + const sabDefined = typeof SharedArrayBuffer !== 'undefined' + && (device !== "cpu:1"); + return new Promise((resolve, reject) => { Orca._orcaMutex .runExclusive(async () => { - const isSimd = await simd(); const wasmOutput = await Orca.initWasm( accessKey.trim(), modelPath.trim(), - (isSimd) ? this._wasmSimd : this._wasm, - (isSimd) ? this._wasmSimdLib : this._wasmLib, - (isSimd) ? createModuleSimd : createModule); + device.trim(), + (sabDefined) ? this._wasmPThread : this._wasmSimd, + (sabDefined) ? this._wasmPThreadLib : this._wasmSimdLib, + (sabDefined) ? createModulePThread : createModuleSimd); return new Orca(wasmOutput); }) .then((result: Orca) => { @@ -897,6 +933,7 @@ export class Orca { private static async initWasm( accessKey: string, modelPath: string, + device: string, wasmBase64: string, wasmLibBase64: string, createModuleFunc: any @@ -913,7 +950,7 @@ export class Orca { const pv_orca_init: pv_orca_init_type = this.wrapAsyncFunction( module, "pv_orca_init", - 3); + 4); const pv_orca_synthesize: pv_orca_synthesize_type = this.wrapAsyncFunction( module, "pv_orca_synthesize", @@ -949,6 +986,16 @@ export class Orca { module.HEAPU8.set(modelPathEncoded, modelPathAddress); module.HEAPU8[modelPathAddress + modelPathEncoded.length] = 0; + const deviceEncoded = new TextEncoder().encode(device); + const deviceAddress = module._malloc((device.length + 1) * Uint8Array.BYTES_PER_ELEMENT); + if (deviceAddress === 0) { + throw new OrcaErrors.OrcaOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); + } + module.HEAP8.set(deviceEncoded, deviceAddress); + module.HEAPU8[deviceAddress + device.length] = 0; + const sdkEncoded = new TextEncoder().encode(this._sdk); const sdkAddress = module._malloc((sdkEncoded.length + 1) * Uint8Array.BYTES_PER_ELEMENT); if (!sdkAddress) { @@ -972,9 +1019,11 @@ export class Orca { const initStatus = await pv_orca_init( accessKeyAddress, modelPathAddress, + deviceAddress, objectAddressAddress); module._pv_free(accessKeyAddress); module._pv_free(modelPathAddress); + module._pv_free(deviceAddress); if (initStatus !== PvStatus.SUCCESS) { const messageStack = Orca.getMessageStack( @@ -1142,6 +1191,111 @@ export class Orca { return messageStack; } + /** + * Lists all available devices that Orca can use for inference. + * Each entry in the list can be the used as the `device` argument when calling the `.create` method. + * + * @returns List of all available devices that Orca can use for inference. + */ + public static async listAvailableDevices(): Promise { + return new Promise((resolve, reject) => { + Orca._orcaMutex + .runExclusive(async () => { + const isSimd = await simd(); + if (!isSimd) { + throw new OrcaErrors.OrcaRuntimeError('Unsupported Browser'); + } + + const blob = new Blob( + [base64ToUint8Array(this._wasmSimdLib)], + { type: 'application/javascript' } + ); + const module: OrcaModule = await createModuleSimd({ + mainScriptUrlOrBlob: blob, + wasmBinary: base64ToUint8Array(this._wasmSimd), + }); + + const hardwareDevicesAddressAddress = module._malloc(Int32Array.BYTES_PER_ELEMENT); + if (hardwareDevicesAddressAddress === 0) { + throw new OrcaErrors.OrcaOutOfMemoryError( + 'malloc failed: Cannot allocate memory for hardwareDevices' + ); + } + + const numHardwareDevicesAddress = module._malloc(Int32Array.BYTES_PER_ELEMENT); + if (numHardwareDevicesAddress === 0) { + throw new OrcaErrors.OrcaOutOfMemoryError( + 'malloc failed: Cannot allocate memory for numHardwareDevices' + ); + } + + const status: PvStatus = module._pv_orca_list_hardware_devices( + hardwareDevicesAddressAddress, + numHardwareDevicesAddress + ); + + const messageStackDepthAddress = module._malloc(Int32Array.BYTES_PER_ELEMENT); + if (!messageStackDepthAddress) { + throw new OrcaErrors.OrcaOutOfMemoryError( + 'malloc failed: Cannot allocate memory for messageStackDepth' + ); + } + + const messageStackAddressAddressAddress = module._malloc(Int32Array.BYTES_PER_ELEMENT); + if (!messageStackAddressAddressAddress) { + throw new OrcaErrors.OrcaOutOfMemoryError( + 'malloc failed: Cannot allocate memory messageStack' + ); + } + + if (status !== PvStatus.SUCCESS) { + const messageStack = Orca.getMessageStack( + module._pv_get_error_stack, + module._pv_free_error_stack, + messageStackAddressAddressAddress, + messageStackDepthAddress, + module.HEAP32, + module.HEAPU8, + ); + module._pv_free(messageStackAddressAddressAddress); + module._pv_free(messageStackDepthAddress); + + throw pvStatusToException( + status, + 'List devices failed', + messageStack + ); + } + module._pv_free(messageStackAddressAddressAddress); + module._pv_free(messageStackDepthAddress); + + const numHardwareDevices: number = module.HEAP32[numHardwareDevicesAddress / Int32Array.BYTES_PER_ELEMENT]; + module._pv_free(numHardwareDevicesAddress); + + const hardwareDevicesAddress = module.HEAP32[hardwareDevicesAddressAddress / Int32Array.BYTES_PER_ELEMENT]; + + const hardwareDevices: string[] = []; + for (let i = 0; i < numHardwareDevices; i++) { + const deviceAddress = module.HEAP32[hardwareDevicesAddress / Int32Array.BYTES_PER_ELEMENT + i]; + hardwareDevices.push(arrayBufferToStringAtIndex(module.HEAPU8, deviceAddress)); + } + module._pv_orca_free_hardware_devices( + hardwareDevicesAddress, + numHardwareDevices + ); + module._pv_free(hardwareDevicesAddressAddress); + + return hardwareDevices; + }) + .then((result: string[]) => { + resolve(result); + }) + .catch((error: any) => { + reject(error); + }); + }); + } + private static wrapAsyncFunction(module: OrcaModule, functionName: string, numArgs: number): (...args: any[]) => any { // @ts-ignore return module.cwrap( diff --git a/binding/web/src/orca_worker.ts b/binding/web/src/orca_worker.ts index 204f7b23..19fe7ab7 100644 --- a/binding/web/src/orca_worker.ts +++ b/binding/web/src/orca_worker.ts @@ -12,6 +12,7 @@ import PvWorker from 'web-worker:./orca_worker_handler.ts'; import { + OrcaOptions, OrcaModel, OrcaSynthesizeParams, OrcaSynthesizeResult, @@ -185,10 +186,11 @@ export class OrcaWorker { private readonly _maxCharacterLimit: number; private readonly _validCharacters: string[]; - private static _wasm: string; - private static _wasmLib: string; private static _wasmSimd: string; private static _wasmSimdLib: string; + private static _wasmPThread: string; + private static _wasmPThreadLib: string; + private static _sdk: string = 'web'; private constructor( @@ -240,26 +242,6 @@ export class OrcaWorker { return this._worker; } - /** - * Set base64 wasm file. - * @param wasm Base64'd wasm file to use to initialize wasm. - */ - public static setWasm(wasm: string): void { - if (this._wasm === undefined) { - this._wasm = wasm; - } - } - - /** - * Set base64 wasm lib file in text format. - * @param wasmLib Base64'd wasm lib file in text format. - */ - public static setWasmLib(wasmLib: string): void { - if (this._wasmLib === undefined) { - this._wasmLib = wasmLib; - } - } - /** * Set base64 wasm file with SIMD feature. * @param wasmSimd Base64'd wasm SIMD file to use to initialize wasm. @@ -280,6 +262,26 @@ export class OrcaWorker { } } + /** + * Set base64 wasm file with SIMD and pthread feature. + * @param wasmPThread Base64'd wasm file to use to initialize wasm. + */ + public static setWasmPThread(wasmPThread: string): void { + if (this._wasmPThread === undefined) { + this._wasmPThread = wasmPThread; + } + } + + /** + * Set base64 SIMD and thread wasm file in text format. + * @param wasmPThreadLib Base64'd wasm file in text format. + */ + public static setWasmPThreadLib(wasmPThreadLib: string): void { + if (this._wasmPThreadLib === undefined) { + this._wasmPThreadLib = wasmPThreadLib; + } + } + public static setSdk(sdk: string): void { OrcaWorker._sdk = sdk; } @@ -297,12 +299,19 @@ export class OrcaWorker { * Set to a different name to use multiple models across `orca` instances. * @param model.forceWrite Flag to overwrite the model in storage even if it exists. * @param model.version Version of the model file. Increment to update the model file in storage. - * + * @param options Optional configuration arguments. + * @param options.device String representation of the device (e.g., CPU or GPU) to use. If set to `best`, the most + * suitable device is selected automatically. If set to `gpu`, the engine uses the first available GPU device. To + * select a specific GPU device, set this argument to `gpu:${GPU_INDEX}`, where `${GPU_INDEX}` is the index of the + * target GPU. If set to `cpu`, the engine will run on the CPU with the default number of threads. To specify the + * number of threads, set this argument to `cpu:${NUM_THREADS}`, where `${NUM_THREADS}` is the desired number of + * threads. * @returns An instance of OrcaWorker. */ public static async create( accessKey: string, model: OrcaModel, + options: OrcaOptions ): Promise { const customWritePath = model.customWritePath ? model.customWritePath @@ -354,11 +363,12 @@ export class OrcaWorker { command: 'init', accessKey: accessKey, modelPath: modelPath, - wasm: this._wasm, - wasmLib: this._wasmLib, wasmSimd: this._wasmSimd, wasmSimdLib: this._wasmSimdLib, + wasmPThread: this._wasmPThread, + wasmPThreadLib: this._wasmPThreadLib, sdk: this._sdk, + options: options }); return returnPromise; diff --git a/binding/web/src/orca_worker_handler.ts b/binding/web/src/orca_worker_handler.ts index 347fde12..8e197a8b 100644 --- a/binding/web/src/orca_worker_handler.ts +++ b/binding/web/src/orca_worker_handler.ts @@ -36,13 +36,16 @@ self.onmessage = async function( return; } try { - Orca.setWasm(event.data.wasm); Orca.setWasmSimd(event.data.wasmSimd); - Orca.setWasmLib(event.data.wasmLib); Orca.setWasmSimdLib(event.data.wasmSimdLib); + Orca.setWasmPThread(event.data.wasmPThread); + Orca.setWasmPThreadLib(event.data.wasmPThreadLib); + Orca.setSdk(event.data.sdk); + orca = await Orca._init( event.data.accessKey, event.data.modelPath, + event.data.options ); self.postMessage({ command: 'ok', diff --git a/binding/web/src/types.ts b/binding/web/src/types.ts index 41b6ff55..96b2afce 100644 --- a/binding/web/src/types.ts +++ b/binding/web/src/types.ts @@ -1,5 +1,5 @@ /* - Copyright 2024 Picovoice Inc. + Copyright 2024-2025 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -57,15 +57,21 @@ export type OrcaSynthesizeResult = { export type OrcaStreamSynthesizeResult = Int16Array | null +export type OrcaOptions = { + /** @defaultValue 'best' */ + device?: string; +}; + export type OrcaWorkerInitRequest = { command: 'init'; accessKey: string; modelPath: string; - wasm: string; - wasmLib: string; wasmSimd: string; wasmSimdLib: string; + wasmPThread: string; + wasmPThreadLib: string; sdk: string; + options: OrcaOptions; }; export type OrcaWorkerSynthesizeRequest = { diff --git a/binding/web/test/orca.test.ts b/binding/web/test/orca.test.ts index b08ad742..43be80f7 100644 --- a/binding/web/test/orca.test.ts +++ b/binding/web/test/orca.test.ts @@ -25,17 +25,22 @@ import orcaParamsFemale from './orca_params_en_female'; import testData from '../cypress/fixtures/resources/.test/test_data.json'; const ACCESS_KEY = Cypress.env('ACCESS_KEY'); +const DEVICE: string = Cypress.env('DEVICE'); const EXPECTED_MAX_CHARACTER_LIMIT = 2000; const EXPECTED_SAMPLE_RATE = 22050; const getAudioFileName = (model: string, synthesis_type: string): string => model.replace(".pv", `_${synthesis_type}.wav`); -const compareArrays = (arr1: Int16Array, arr2: Int16Array, step: number) => { - expect(arr1.length).eq(arr2.length); - for (let i = 0; i < arr1.length - step; i += step) { - expect(arr1[i]).closeTo(arr2[i], 1); - } +const PCM_OUTLIER_THRESHOLD = 400; +const PCM_OUTLIER_COUNT_THRESHOLD = 0.05; + +const validatePcm = (pcm: Int16Array, groundTruth: Int16Array) => { + expect(pcm.length).gt(0); + expect(pcm.length).eq(groundTruth.length); + const diffPcm = pcm.map((a, i) => Math.abs(a - groundTruth[i])); + const diffOutliers = diffPcm.filter(d => d > PCM_OUTLIER_THRESHOLD).length / diffPcm.length; + expect(diffOutliers).lte(PCM_OUTLIER_COUNT_THRESHOLD); }; const runInitTest = async ( @@ -43,12 +48,14 @@ const runInitTest = async ( params: { accessKey?: string; model?: PvModel; + device?: string; expectFailure?: boolean; } = {}, ) => { const { accessKey = ACCESS_KEY, model = { publicPath: `/test/orca_params_en_male.pv`, forceWrite: true }, + device = DEVICE, expectFailure = false, } = params; @@ -56,7 +63,7 @@ const runInitTest = async ( let isFailed = false; try { - orca = await instance.create(accessKey, model); + orca = await instance.create(accessKey, model, { device }); expect(typeof orca.version).eq('string'); expect(orca.version.length).gt(0); expect(orca.maxCharacterLimit).eq(EXPECTED_MAX_CHARACTER_LIMIT); @@ -111,6 +118,13 @@ describe('Orca Binding', function() { }); }); + it(`should be able to handle invalid device (${testCaseString})`, async () => { + await runInitTest(instance, { + device: "cloud:9", + expectFailure: true, + }); + }); + it(`should be able to init with public path (${testCaseString})`, async () => { await runInitTest(instance, { model: { publicPath, forceWrite: true }, @@ -133,6 +147,7 @@ describe('Orca Binding', function() { const orca = await Orca.create( ACCESS_KEY, { publicPath: publicPath, forceWrite: true }, + { device: DEVICE } ); // @ts-ignore @@ -166,7 +181,8 @@ describe('Orca Binding', function() { const orca = await instance.create('invalidAccessKey', { publicPath, forceWrite: true, - }); + }, + { device: DEVICE }); expect(orca).to.be.undefined; } catch (e: any) { messageStack = e.messageStack; @@ -179,12 +195,18 @@ describe('Orca Binding', function() { const orca = await instance.create('invalidAccessKey', { publicPath, forceWrite: true, - }); + }, + { device: DEVICE }); expect(orca).to.be.undefined; } catch (e: any) { expect(messageStack.length).to.be.eq(e.messageStack.length); } }); + it('List hardware devices', async () => { + const hardwareDevices: string[] = await Orca.listAvailableDevices(); + expect(Array.isArray(hardwareDevices)).to.be.true; + expect(hardwareDevices).length.to.be.greaterThan(0); + }); } }); @@ -204,6 +226,7 @@ describe('Sentence Tests', function() { const orca = await instance.create( ACCESS_KEY, { publicPath, forceWrite: true }, + { device: DEVICE } ); try { @@ -222,7 +245,7 @@ describe('Sentence Tests', function() { streamPcm.push(...endPcm); } - compareArrays(new Int16Array(streamPcm), rawPcm, 500); + validatePcm(new Int16Array(streamPcm), rawPcm); await orcaStream.close(); } catch (e) { expect(e).to.be.undefined; @@ -245,6 +268,7 @@ describe('Sentence Tests', function() { const orca = await instance.create( ACCESS_KEY, { publicPath, forceWrite: true }, + { device: DEVICE } ); const { pcm } = await orca.synthesize(testCase.text_no_punctuation); @@ -267,13 +291,14 @@ describe('Sentence Tests', function() { const orca = await instance.create( ACCESS_KEY, { publicPath, forceWrite: true }, + { device: DEVICE } ); const { pcm } = await orca.synthesize( testCase.text, { speechRate: 1, randomState: testCase.random_state }, ); - compareArrays(pcm, rawPcm, 500); + validatePcm(pcm, rawPcm); if (orca instanceof OrcaWorker) { orca.terminate(); @@ -292,6 +317,7 @@ describe('Sentence Tests', function() { const orca = await instance.create( ACCESS_KEY, { publicPath, forceWrite: true }, + { device: DEVICE } ); const { pcm } = await orca.synthesize(testCase.text_custom_pronunciation); @@ -312,6 +338,7 @@ describe('Sentence Tests', function() { const orca = await instance.create( ACCESS_KEY, { publicPath, forceWrite: true }, + { device: DEVICE } ); const { pcm: pcmSlow } = await orca.synthesize(testCase.text, { speechRate: 0.7 }); @@ -342,9 +369,15 @@ describe('Sentence Tests', function() { const orca = await instance.create( ACCESS_KEY, { publicPath, forceWrite: true }, + { device: DEVICE } ); - const maxNumChars = orca.maxCharacterLimit; + let maxNumChars = orca.maxCharacterLimit; + if (model === "orca_params_ko_female.pv") { + maxNumChars /= 2; + return; + } + const { pcm } = await orca.synthesize('a'.repeat(maxNumChars)); expect(pcm.length).gt(0); @@ -375,6 +408,7 @@ describe('Alignment Tests', function() { const orca = await instance.create( ACCESS_KEY, { publicPath, forceWrite: true }, + { device: DEVICE } ); const { @@ -422,6 +456,7 @@ describe('Invalid Tests', function() { const orca = await instance.create( ACCESS_KEY, { publicPath, forceWrite: true }, + { device: DEVICE } ); for (const failureCase of testCase.text_invalid) { diff --git a/binding/web/test/orca_perf.test.ts b/binding/web/test/orca_perf.test.ts index 9393fc1f..4dee77a1 100644 --- a/binding/web/test/orca_perf.test.ts +++ b/binding/web/test/orca_perf.test.ts @@ -14,6 +14,7 @@ import { Orca, OrcaWorker } from '../'; import testData from '../cypress/fixtures/resources/.test/test_data.json'; const ACCESS_KEY = Cypress.env('ACCESS_KEY'); +const DEVICE = Cypress.env('DEVICE'); const NUM_TEST_ITERATIONS = Number(Cypress.env('NUM_TEST_ITERATIONS')); const PROC_PERFORMANCE_THRESHOLD_SEC = Number(Cypress.env('PROC_PERFORMANCE_THRESHOLD_SEC')); @@ -28,6 +29,7 @@ async function testPerformance( const orca = await instance.create( ACCESS_KEY, { publicPath: publicPath, forceWrite: true }, + { device: DEVICE } ); let start = Date.now(); diff --git a/demo/android/OrcaDemo/orca-demo-app/build.gradle b/demo/android/OrcaDemo/orca-demo-app/build.gradle index ed18f90b..8f74c666 100644 --- a/demo/android/OrcaDemo/orca-demo-app/build.gradle +++ b/demo/android/OrcaDemo/orca-demo-app/build.gradle @@ -113,7 +113,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.4.2' implementation 'com.google.android.material:material:1.6.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'ai.picovoice:orca-android:1.2.0' + implementation 'ai.picovoice:orca-android:2.0.0' } afterEvaluate { diff --git a/demo/c/orca_demo.c b/demo/c/orca_demo.c index 35a0c62c..69f2753c 100644 --- a/demo/c/orca_demo.c +++ b/demo/c/orca_demo.c @@ -1,5 +1,5 @@ /* -Copyright 2024 Picovoice Inc. +Copyright 2024-2025 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -18,6 +18,7 @@ the License. #endif #include +#include #include #include #include @@ -83,17 +84,21 @@ static void print_dl_error(const char *message) { } static struct option long_options[] = { - {"access_key", required_argument, NULL, 'a'}, - {"library_path", required_argument, NULL, 'l'}, - {"model_path", required_argument, NULL, 'm'}, - {"text", required_argument, NULL, 't'}, - {"output_path", required_argument, NULL, 'o'}, + {"access_key", required_argument, NULL, 'a'}, + {"library_path", required_argument, NULL, 'l'}, + {"model_path", required_argument, NULL, 'm'}, + {"device", required_argument, NULL, 'y'}, + {"show_inference_devices", no_argument, NULL, 'i'}, + {"text", required_argument, NULL, 't'}, + {"output_path", required_argument, NULL, 'o'}, }; static void print_usage(const char *program_name) { fprintf( stdout, - "Usage: %s [-l LIBRARY_PATH -m MODEL_PATH -a ACCESS_KEY -t TEXT -o OUTPUT_PATH]\n", + "Usage: %s [-l LIBRARY_PATH -m MODEL_PATH -y DEVICE -a ACCESS_KEY -t TEXT -o OUTPUT_PATH]\n" + " %s [-i, --show_inference_devices] -l LIBRARY_PATH\n", + program_name, program_name); } @@ -103,15 +108,94 @@ void print_error_message(char **message_stack, int32_t message_stack_depth) { } } +void print_inference_devices(const char *library_path) { + void *dl_handle = open_dl(library_path); + if (!dl_handle) { + fprintf(stderr, "Failed to open library at '%s'.\n", library_path); + exit(EXIT_FAILURE); + } + + const char *(*pv_status_to_string_func)(pv_status_t) = load_symbol(dl_handle, "pv_status_to_string"); + if (!pv_status_to_string_func) { + print_dl_error("Failed to load 'pv_status_to_string'"); + exit(EXIT_FAILURE); + } + + pv_status_t (*pv_orca_list_hardware_devices_func)(char ***, int32_t *) = + load_symbol(dl_handle, "pv_orca_list_hardware_devices"); + if (!pv_orca_list_hardware_devices_func) { + print_dl_error("failed to load `pv_orca_list_hardware_devices`"); + exit(EXIT_FAILURE); + } + + pv_status_t (*pv_orca_free_hardware_devices_func)(char **, int32_t) = + load_symbol(dl_handle, "pv_orca_free_hardware_devices"); + if (!pv_orca_free_hardware_devices_func) { + print_dl_error("failed to load `pv_orca_free_hardware_devices`"); + exit(EXIT_FAILURE); + } + + pv_status_t (*pv_get_error_stack_func)(char ***, int32_t *) = + load_symbol(dl_handle, "pv_get_error_stack"); + if (!pv_get_error_stack_func) { + print_dl_error("failed to load 'pv_get_error_stack_func'"); + exit(EXIT_FAILURE); + } + + void (*pv_free_error_stack_func)(char **) = + load_symbol(dl_handle, "pv_free_error_stack"); + if (!pv_free_error_stack_func) { + print_dl_error("failed to load 'pv_free_error_stack_func'"); + exit(EXIT_FAILURE); + } + + char **message_stack = NULL; + int32_t message_stack_depth = 0; + pv_status_t error_status = PV_STATUS_RUNTIME_ERROR; + + char **hardware_devices = NULL; + int32_t num_hardware_devices = 0; + pv_status_t status = pv_orca_list_hardware_devices_func(&hardware_devices, &num_hardware_devices); + if (status != PV_STATUS_SUCCESS) { + fprintf( + stderr, + "Failed to list hardware devices with `%s`.\n", + pv_status_to_string_func(status)); + error_status = pv_get_error_stack_func(&message_stack, &message_stack_depth); + if (error_status != PV_STATUS_SUCCESS) { + fprintf( + stderr, + ".\nUnable to get orca error state with '%s'.\n", + pv_status_to_string_func(error_status)); + exit(EXIT_FAILURE); + } + + if (message_stack_depth > 0) { + fprintf(stderr, ":\n"); + print_error_message(message_stack, message_stack_depth); + pv_free_error_stack_func(message_stack); + } + exit(EXIT_FAILURE); + } + + for (int32_t i = 0; i < num_hardware_devices; i++) { + fprintf(stdout, "%s\n", hardware_devices[i]); + } + pv_orca_free_hardware_devices_func(hardware_devices, num_hardware_devices); + close_dl(dl_handle); +} + int picovoice_main(int argc, char **argv) { const char *library_path = NULL; const char *model_path = NULL; + const char *device = "best"; + bool show_inference_devices = false; const char *access_key = NULL; const char *text = NULL; const char *output_path = NULL; int c; - while ((c = getopt_long(argc, argv, "l:m:a:t:o:", long_options, NULL)) != -1) { + while ((c = getopt_long(argc, argv, "l:m:y:ia:t:o:", long_options, NULL)) != -1) { switch (c) { case 'l': library_path = optarg; @@ -119,6 +203,12 @@ int picovoice_main(int argc, char **argv) { case 'm': model_path = optarg; break; + case 'y': + device = optarg; + break; + case 'i': + show_inference_devices = true; + break; case 'a': access_key = optarg; break; @@ -133,6 +223,17 @@ int picovoice_main(int argc, char **argv) { } } + if (show_inference_devices) { + if (!library_path) { + fprintf(stderr, "`library_path` is required to view available inference devices.\n"); + print_usage(argv[0]); + exit(EXIT_FAILURE); + } + + print_inference_devices(library_path); + return EXIT_SUCCESS; + } + if (!library_path || !model_path || !access_key || !text || !output_path) { print_usage(argv[0]); exit(EXIT_FAILURE); @@ -151,7 +252,7 @@ int picovoice_main(int argc, char **argv) { exit(EXIT_FAILURE); } - pv_status_t (*pv_orca_init_func)(const char *, const char *, pv_orca_t **) = + pv_status_t (*pv_orca_init_func)(const char *, const char *, const char *, pv_orca_t **) = load_symbol(orca_library, "pv_orca_init"); if (!pv_orca_init_func) { print_dl_error("Failed to load 'pv_orca_init'"); @@ -232,7 +333,11 @@ int picovoice_main(int argc, char **argv) { pv_status_t error_status; pv_orca_t *orca = NULL; - pv_status_t orca_status = pv_orca_init_func(access_key, model_path, &orca); + pv_status_t orca_status = pv_orca_init_func( + access_key, + model_path, + device, + &orca); if (orca_status != PV_STATUS_SUCCESS) { fprintf(stderr, "Failed to create an instance of Orca with `%s`", pv_status_to_string_func(orca_status)); error_status = pv_get_error_stack_func(&message_stack, &message_stack_depth); diff --git a/demo/c/orca_demo_streaming.c b/demo/c/orca_demo_streaming.c index eb257acc..b553a84e 100644 --- a/demo/c/orca_demo_streaming.c +++ b/demo/c/orca_demo_streaming.c @@ -12,6 +12,7 @@ the License. */ #include +#include #include #include #include @@ -92,11 +93,13 @@ static void print_dl_error(const char *message) { } static struct option long_options[] = { - {"access_key", required_argument, NULL, 'a'}, - {"library_path", required_argument, NULL, 'l'}, - {"model_path", required_argument, NULL, 'm'}, - {"text", required_argument, NULL, 't'}, - {"output_path", required_argument, NULL, 'o'}, + {"access_key", required_argument, NULL, 'a'}, + {"library_path", required_argument, NULL, 'l'}, + {"model_path", required_argument, NULL, 'm'}, + {"device", required_argument, NULL, 'y'}, + {"show_inference_devices", no_argument, NULL, 'i'}, + {"text", required_argument, NULL, 't'}, + {"output_path", required_argument, NULL, 'o'}, }; static pv_status_t num_bytes_character(unsigned char c, int32_t *num_bytes) { @@ -129,7 +132,9 @@ static double get_time() { static void print_usage(const char *program_name) { fprintf( stdout, - "Usage: %s [-l LIBRARY_PATH -m MODEL_PATH -a ACCESS_KEY -t TEXT -o OUTPUT_PATH]\n", + "Usage: %s [-l LIBRARY_PATH -m MODEL_PATH -y DEVICE -a ACCESS_KEY -t TEXT -o OUTPUT_PATH]\n" + " %s [-i, --show_inference_devices] -l LIBRARY_PATH\n", + program_name, program_name); } @@ -175,6 +180,83 @@ void print_error_message(char **message_stack, int32_t message_stack_depth) { } } +void print_inference_devices(const char *library_path) { + void *dl_handle = open_dl(library_path); + if (!dl_handle) { + fprintf(stderr, "Failed to open library at '%s'.\n", library_path); + exit(EXIT_FAILURE); + } + + const char *(*pv_status_to_string_func)(pv_status_t) = load_symbol(dl_handle, "pv_status_to_string"); + if (!pv_status_to_string_func) { + print_dl_error("Failed to load 'pv_status_to_string'"); + exit(EXIT_FAILURE); + } + + pv_status_t (*pv_orca_list_hardware_devices_func)(char ***, int32_t *) = + load_symbol(dl_handle, "pv_orca_list_hardware_devices"); + if (!pv_orca_list_hardware_devices_func) { + print_dl_error("failed to load `pv_orca_list_hardware_devices`"); + exit(EXIT_FAILURE); + } + + pv_status_t (*pv_orca_free_hardware_devices_func)(char **, int32_t) = + load_symbol(dl_handle, "pv_orca_free_hardware_devices"); + if (!pv_orca_free_hardware_devices_func) { + print_dl_error("failed to load `pv_orca_free_hardware_devices`"); + exit(EXIT_FAILURE); + } + + pv_status_t (*pv_get_error_stack_func)(char ***, int32_t *) = + load_symbol(dl_handle, "pv_get_error_stack"); + if (!pv_get_error_stack_func) { + print_dl_error("failed to load 'pv_get_error_stack_func'"); + exit(EXIT_FAILURE); + } + + void (*pv_free_error_stack_func)(char **) = + load_symbol(dl_handle, "pv_free_error_stack"); + if (!pv_free_error_stack_func) { + print_dl_error("failed to load 'pv_free_error_stack_func'"); + exit(EXIT_FAILURE); + } + + char **message_stack = NULL; + int32_t message_stack_depth = 0; + pv_status_t error_status = PV_STATUS_RUNTIME_ERROR; + + char **hardware_devices = NULL; + int32_t num_hardware_devices = 0; + pv_status_t status = pv_orca_list_hardware_devices_func(&hardware_devices, &num_hardware_devices); + if (status != PV_STATUS_SUCCESS) { + fprintf( + stderr, + "Failed to list hardware devices with `%s`.\n", + pv_status_to_string_func(status)); + error_status = pv_get_error_stack_func(&message_stack, &message_stack_depth); + if (error_status != PV_STATUS_SUCCESS) { + fprintf( + stderr, + ".\nUnable to get orca error state with '%s'.\n", + pv_status_to_string_func(error_status)); + exit(EXIT_FAILURE); + } + + if (message_stack_depth > 0) { + fprintf(stderr, ":\n"); + print_error_message(message_stack, message_stack_depth); + pv_free_error_stack_func(message_stack); + } + exit(EXIT_FAILURE); + } + + for (int32_t i = 0; i < num_hardware_devices; i++) { + fprintf(stdout, "%s\n", hardware_devices[i]); + } + pv_orca_free_hardware_devices_func(hardware_devices, num_hardware_devices); + close_dl(dl_handle); +} + void handle_error( char **message_stack, int32_t message_stack_depth, @@ -201,12 +283,14 @@ void handle_error( int32_t picovoice_main(int32_t argc, char **argv) { const char *library_path = NULL; const char *model_path = NULL; + const char *device = "best"; + bool show_inference_devices = false; const char *access_key = NULL; const char *text = NULL; const char *output_path = NULL; int32_t c; - while ((c = getopt_long(argc, argv, "l:m:a:t:o:", long_options, NULL)) != -1) { + while ((c = getopt_long(argc, argv, "l:m:y:ia:t:o:", long_options, NULL)) != -1) { switch (c) { case 'l': library_path = optarg; @@ -214,6 +298,12 @@ int32_t picovoice_main(int32_t argc, char **argv) { case 'm': model_path = optarg; break; + case 'y': + device = optarg; + break; + case 'i': + show_inference_devices = true; + break; case 'a': access_key = optarg; break; @@ -228,6 +318,17 @@ int32_t picovoice_main(int32_t argc, char **argv) { } } + if (show_inference_devices) { + if (!library_path) { + fprintf(stderr, "`library_path` is required to view available inference devices.\n"); + print_usage(argv[0]); + exit(EXIT_FAILURE); + } + + print_inference_devices(library_path); + return EXIT_SUCCESS; + } + if (!library_path || !model_path || !access_key || !text || !output_path) { print_usage(argv[0]); exit(EXIT_FAILURE); @@ -246,7 +347,7 @@ int32_t picovoice_main(int32_t argc, char **argv) { exit(EXIT_FAILURE); } - pv_status_t (*pv_orca_init_func)(const char *, const char *, pv_orca_t **) = + pv_status_t (*pv_orca_init_func)(const char *, const char *, const char *, pv_orca_t **) = load_symbol(orca_library, "pv_orca_init"); if (!pv_orca_init_func) { print_dl_error("Failed to load 'pv_orca_init'"); @@ -346,7 +447,11 @@ int32_t picovoice_main(int32_t argc, char **argv) { double time_before_init = get_time(); pv_orca_t *orca = NULL; - pv_status_t orca_status = pv_orca_init_func(access_key, model_path, &orca); + pv_status_t orca_status = pv_orca_init_func( + access_key, + model_path, + device, + &orca); if (orca_status != PV_STATUS_SUCCESS) { fprintf(stderr, "Failed to create an instance of Orca with `%s`", pv_status_to_string_func(orca_status)); handle_error( diff --git a/demo/c/test/test_orca_c.py b/demo/c/test/test_orca_c.py index 08f129be..1f2d2e61 100644 --- a/demo/c/test/test_orca_c.py +++ b/demo/c/test/test_orca_c.py @@ -24,14 +24,15 @@ class OrcaCTestCase(unittest.TestCase): @classmethod def setUpClass(cls): cls._access_key = sys.argv[1] - platform = sys.argv[2] + cls._device = sys.argv[2] + platform = sys.argv[3] if platform == "mac": if pltf.machine() == "x86_64": cls._arch = "x86_64" elif pltf.machine() == "arm64": cls._arch = "arm64" else: - cls._arch = "" if len(sys.argv) != 4 else sys.argv[3] + cls._arch = "" if len(sys.argv) != 5 else sys.argv[4] cls._platform = platform cls._root_dir = os.path.join(os.path.dirname(__file__), "../../..") @@ -45,6 +46,10 @@ def _get_lib_ext(platform: str) -> str: return "so" def _get_library_file(self) -> str: + if self._platform == "windows": + if self._arch == "amd64": + os.environ["PATH"] += os.pathsep + os.path.join(self._root_dir, "lib", "windows", "amd64") + return os.path.join( self._root_dir, "lib", @@ -60,6 +65,7 @@ def run_orca(self, model_path: str) -> None: "-a", self._access_key, "-l", self._get_library_file(), "-m", model_path, + "-y", self._device, "-t", test_data.text, "-o", output_path, ] @@ -103,7 +109,7 @@ def test_orca(self) -> None: if __name__ == '__main__': - if len(sys.argv) < 3 or len(sys.argv) > 4: - print("Usage: test_orca_c.py ${AccessKey} ${Platform} [${Arch}]") + if len(sys.argv) < 4 or len(sys.argv) > 5: + print("Usage: test_orca_c.py ${AccessKey} ${Device} ${Platform} [${Arch}]") exit(1) unittest.main(argv=sys.argv[:1]) \ No newline at end of file diff --git a/demo/dotnet/OrcaDemo/FileDemo.cs b/demo/dotnet/OrcaDemo/FileDemo.cs index eafba28c..057792be 100644 --- a/demo/dotnet/OrcaDemo/FileDemo.cs +++ b/demo/dotnet/OrcaDemo/FileDemo.cs @@ -34,6 +34,7 @@ public static void RunDemo( string text, string outputPath, string modelPath, + string device, bool verbose) { if (string.IsNullOrEmpty(modelPath)) @@ -41,7 +42,7 @@ public static void RunDemo( modelPath = ModelUtils.GetModelPath(language, gender); } - using (Orca orca = Orca.Create(accessKey, modelPath)) + using (Orca orca = Orca.Create(accessKey, modelPath, device)) { Console.WriteLine($"Orca version: {orca.Version}\n"); @@ -156,6 +157,8 @@ public static void Main(string[] args) string text = null; string outputPath = null; string modelPath = null; + string device = null; + bool showInferenceDevices = false; bool verbose = false; int argIndex = 0; @@ -196,6 +199,13 @@ public static void Main(string[] args) modelPath = args[argIndex++]; } } + else if (args[argIndex] == "--device") + { + if (++argIndex < args.Length) + { + device = args[argIndex++]; + } + } else if (args[argIndex] == "--output_path") { if (++argIndex < args.Length) @@ -203,6 +213,11 @@ public static void Main(string[] args) outputPath = args[argIndex++]; } } + else if (args[argIndex] == "--show_inference_devices") + { + showInferenceDevices = true; + argIndex++; + } else if (args[argIndex] == "--verbose") { verbose = true; @@ -219,6 +234,12 @@ public static void Main(string[] args) } } + if (showInferenceDevices) + { + Console.WriteLine(string.Join(Environment.NewLine, Orca.GetAvailableDevices())); + return; + } + if (string.IsNullOrEmpty(accessKey)) { throw new ArgumentNullException("access_key"); @@ -264,6 +285,7 @@ public static void Main(string[] args) text, outputPath, modelPath, + device, verbose); } @@ -274,13 +296,16 @@ private static void OnUnhandledException(object sender, UnhandledExceptionEventA } private static readonly string HELP_STR = "Available options: \n " + - $"\t--access_key (required): AccessKey obtained from Picovoice Console (https://console.picovoice.ai/)\n" + - $"\t--text (required): Text to be synthesized\n" + - $"\t--output_path (required): Absolute path to .wav file where the generated audio will be stored\n" + + $"\t--access_key: AccessKey obtained from Picovoice Console (https://console.picovoice.ai/)\n" + + $"\t--text: Text to be synthesized\n" + + $"\t--output_path: Absolute path to .wav file where the generated audio will be stored\n" + $"\t--language: The language you would like to run the demo in. " + $"Available languages are {string.Join(", ", languages)}\n" + $"\t--gender: The gender of the synthesized voice. " + $"Available genders are {string.Join(", ", genders)}\n" + - $"\t--model_path: Absolute path to Orca voice model (`.pv`).\n"; + $"\t--model_path: Absolute path to Orca voice model (`.pv`).\n" + + "\t--device: Device to run inference on (`best`, `cpu:{num_threads}` or `gpu:{gpu_index}`). " + + "Default: automatically selects best device.\n" + + "\t--show_inference_devices: Print devices that are available to run Orca inference.\n"; } } \ No newline at end of file diff --git a/demo/dotnet/OrcaDemo/OrcaDemo.csproj b/demo/dotnet/OrcaDemo/OrcaDemo.csproj index d894e39b..8a7b17aa 100644 --- a/demo/dotnet/OrcaDemo/OrcaDemo.csproj +++ b/demo/dotnet/OrcaDemo/OrcaDemo.csproj @@ -18,7 +18,7 @@ - + diff --git a/demo/dotnet/OrcaDemo/StreamingDemo.cs b/demo/dotnet/OrcaDemo/StreamingDemo.cs index 7e836026..cfc46d1e 100644 --- a/demo/dotnet/OrcaDemo/StreamingDemo.cs +++ b/demo/dotnet/OrcaDemo/StreamingDemo.cs @@ -34,6 +34,7 @@ public static void RunDemo( string gender, string text, string modelPath, + string device, int tokensPerSecond, int? audioWaitChunks, int bufferSizeSecs, @@ -44,7 +45,7 @@ public static void RunDemo( modelPath = ModelUtils.GetModelPath(language, gender); } - Orca orca = Orca.Create(accessKey, modelPath); + Orca orca = Orca.Create(accessKey, modelPath, device); PvSpeaker speaker = null; try @@ -159,7 +160,7 @@ static IEnumerable TokenizeText(string text, string language) foreach (Match m in Regex.Matches(text, CustomPronPattern)) { customPronunciations.Add("{" + m.Groups[1].Value + "}"); - }; + } List tokensRaw = new List(); @@ -243,6 +244,8 @@ public static void Main(string[] args) string gender = null; string text = null; string modelPath = null; + string device = null; + bool showInferenceDevices = false; int tokensPerSecond = 15; int? audioWaitChunks = null; int bufferSizeSecs = 20; @@ -286,6 +289,13 @@ public static void Main(string[] args) modelPath = args[argIndex++]; } } + else if (args[argIndex] == "--device") + { + if (++argIndex < args.Length) + { + device = args[argIndex++]; + } + } else if (args[argIndex] == "--tokens_per_second") { if (++argIndex < args.Length && int.TryParse(args[argIndex], out int tps)) @@ -323,6 +333,11 @@ public static void Main(string[] args) ShowAudioDevices(); return; } + else if (args[argIndex] == "--show_inference_devices") + { + showInferenceDevices = true; + argIndex++; + } else if (args[argIndex] == "-h" || args[argIndex] == "--help") { Console.WriteLine(HELP_STR); @@ -334,6 +349,12 @@ public static void Main(string[] args) } } + if (showInferenceDevices) + { + Console.WriteLine(string.Join(Environment.NewLine, Orca.GetAvailableDevices())); + return; + } + if (string.IsNullOrEmpty(accessKey)) { throw new ArgumentNullException("access_key"); @@ -370,6 +391,7 @@ public static void Main(string[] args) gender, text, modelPath, + device, tokensPerSecond, audioWaitChunks, bufferSizeSecs, @@ -383,17 +405,20 @@ private static void OnUnhandledException(object sender, UnhandledExceptionEventA } private static readonly string HELP_STR = "Available options: \n " + - "\t--access_key (required): AccessKey obtained from Picovoice Console (https://console.picovoice.ai/)\n" + - "\t--text_to_stream (required): Text to be streamed to Orca\n" + + "\t--access_key: AccessKey obtained from Picovoice Console (https://console.picovoice.ai/)\n" + + "\t--text_to_stream: Text to be streamed to Orca\n" + "\t--language: The language you would like to run the demo in. " + $"Available languages are {string.Join(", ", languages)}\n" + "\t--gender: The gender of the synthesized voice. " + $"Available genders are {string.Join(", ", genders)}\n" + "\t--model_path: Absolute path to Orca voice model (`.pv`).\n" + + "\t--device: Device to run inference on (`best`, `cpu:{num_threads}` or `gpu:{gpu_index}`). " + + "Default: automatically selects best device.\n" + "\t--tokens_per_second: Number of tokens per second to be streamed to Orca, simulating an LLM response\n" + "\t--audio_wait_chunks: Number of PCM chunks to wait before starting to play audio. Default: system-dependent\n" + "\t--buffer_size_secs: The size in seconds of the internal buffer used by pvspeaker to play audio\n" + "\t--audio_device_index: Index of input audio device.\n" + - "\t--show_audio_devices: Print available recording devices.\n"; + "\t--show_audio_devices: Print available recording devices.\n" + + "\t--show_inference_devices: Print devices that are available to run Orca inference.\n"; } } \ No newline at end of file diff --git a/demo/dotnet/README.md b/demo/dotnet/README.md index 087277c5..e97934ee 100644 --- a/demo/dotnet/README.md +++ b/demo/dotnet/README.md @@ -9,7 +9,7 @@ voice assistants. Orca is: - Private; All speech synthesis runs locally. - Cross-Platform: - - Linux (x86_64), macOS (x86_64, arm64), Windows (x86_64) + - Linux (x86_64), macOS (x86_64, arm64), Windows (x86_64, arm64) - Android and iOS - Chrome, Safari, Firefox, and Edge - Raspberry Pi (3, 4, 5) @@ -22,7 +22,7 @@ voice assistants. Orca is: - Linux (x86_64) - macOS (x86_64, arm64) -- Windows (x86_64) +- Windows (x86_64, arm64) - Raspberry Pi: - 3 (32 and 64 bit) - 4 (32 and 64 bit) diff --git a/demo/ios/OrcaDemo/OrcaDemo.xcodeproj/project.pbxproj b/demo/ios/OrcaDemo/OrcaDemo.xcodeproj/project.pbxproj index f4de61bf..ecfe0e5e 100644 --- a/demo/ios/OrcaDemo/OrcaDemo.xcodeproj/project.pbxproj +++ b/demo/ios/OrcaDemo/OrcaDemo.xcodeproj/project.pbxproj @@ -294,7 +294,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.5; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; @@ -349,7 +349,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 14.5; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; SDKROOT = iphoneos; @@ -369,7 +369,7 @@ DEVELOPMENT_TEAM = 65723695GD; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = OrcaDemo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -391,7 +391,7 @@ DEVELOPMENT_TEAM = 65723695GD; ENABLE_PREVIEWS = YES; INFOPLIST_FILE = OrcaDemo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -426,31 +426,23 @@ }; /* End XCConfigurationList section */ +/* Begin XCLocalSwiftPackageReference section */ + E109D19B2CFE4DA30014F5AA /* XCLocalSwiftPackageReference "../../../../orca" */ = { + isa = XCLocalSwiftPackageReference; + relativePath = ../../../../orca; + }; +/* End XCLocalSwiftPackageReference section */ + /* Begin XCRemoteSwiftPackageReference section */ 02B588CA2DFBA7AD007E7026 /* XCRemoteSwiftPackageReference "orca" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/Picovoice/orca"; requirement = { kind = exactVersion; - version = 1.2.0; - }; - }; - 07F723572D6D594B0002D88F /* XCRemoteSwiftPackageReference "orca" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/Picovoice/orca"; - requirement = { - kind = exactVersion; - version = 1.1.2; - }; - }; - E1F352FE2D00ED5C0069B0E6 /* XCRemoteSwiftPackageReference "orca" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/Picovoice/orca"; - requirement = { - kind = exactVersion; - version = 1.0.1; + version = 2.0.0; }; }; + /* End XCRemoteSwiftPackageReference section */ /* Begin XCSwiftPackageProductDependency section */ @@ -463,29 +455,21 @@ package = 02B588CA2DFBA7AD007E7026 /* XCRemoteSwiftPackageReference "orca" */; productName = Orca; }; - 0751D6632D6D46AA001EB29D /* Orca */ = { - isa = XCSwiftPackageProductDependency; - productName = Orca; - }; - 07F723582D6D594B0002D88F /* Orca */ = { + E109D19D2CFE4DBC0014F5AA /* Orca */ = { isa = XCSwiftPackageProductDependency; - package = 07F723572D6D594B0002D88F /* XCRemoteSwiftPackageReference "orca" */; + package = E109D19B2CFE4DA30014F5AA /* XCLocalSwiftPackageReference "../../../../orca" */; productName = Orca; }; - 1E7C0A412D84DA0700A5350A /* Orca */ = { + 0751D6632D6D46AA001EB29D /* Orca */ = { isa = XCSwiftPackageProductDependency; - package = 07F723572D6D594B0002D88F /* XCRemoteSwiftPackageReference "orca" */; productName = Orca; }; + E109D1A22CFE4F380014F5AA /* Orca */ = { isa = XCSwiftPackageProductDependency; productName = Orca; }; - E1F352FF2D00ED5C0069B0E6 /* Orca */ = { - isa = XCSwiftPackageProductDependency; - package = E1F352FE2D00ED5C0069B0E6 /* XCRemoteSwiftPackageReference "orca" */; - productName = Orca; - }; + /* End XCSwiftPackageProductDependency section */ }; rootObject = 02A1193D268D39A700A2AC99 /* Project object */; diff --git a/demo/nodejs/file.js b/demo/nodejs/file.js index e14d07c3..cabf84db 100755 --- a/demo/nodejs/file.js +++ b/demo/nodejs/file.js @@ -18,22 +18,26 @@ const { WaveFile } = require('wavefile'); const { Orca, OrcaActivationLimitReachedError } = require('@picovoice/orca-node'); program - .requiredOption( + .option( '-a, --access_key ', 'AccessKey obtain from the Picovoice Console (https://console.picovoice.ai/)', ) - .requiredOption( + .option( '-t, --text ', 'Text to be synthesized', ) - .requiredOption( + .option( '-o, --output_path ', 'Absolute path to .wav file where the generated audio will be stored', ) - .requiredOption( + .option( '-m, --model_file_path ', 'Absolute path to Orca model', ) + .option( + "-y, --device ", + "Device to run inference on (`best`, `cpu:{num_threads}` or `gpu:{gpu_index}`). Default: selects best device" + ) .option( '-l, --library_file_path ', 'Absolute path to dynamic library', @@ -41,6 +45,11 @@ program .option( '-v, --verbose', 'Verbose mode, prints metadata', + ) + .option( + "-z, --show_inference_devices", + "Print devices that are available to run Orca inference.", + false ); if (process.argv.length < 4) { @@ -48,19 +57,33 @@ if (process.argv.length < 4) { } program.parse(process.argv); +const showInferenceDevices = program["show_inference_devices"]; +if (showInferenceDevices) { + console.log(Orca.listAvailableDevices().join('\n')); + process.exit(); +} + function fileDemo() { let accessKey = program['access_key']; let text = program['text']; let outputPath = program['output_path']; let libraryFilePath = program['library_file_path']; let modelFilePath = program['model_file_path']; + let device = program["device"]; let verbose = program['verbose']; + if (accessKey === undefined || text === undefined || outputPath === undefined || modelFilePath === undefined) { + console.error( + "`--access_key` `output_path`, `model_file_path`, and `--text` are required arguments" + ); + return; + } let orca = new Orca( accessKey, { - 'modelPath': modelFilePath, - 'libraryPath': libraryFilePath, + modelPath: modelFilePath, + device: device, + libraryPath: libraryFilePath, }, ); diff --git a/demo/nodejs/package.json b/demo/nodejs/package.json index 18418df5..4be858d7 100644 --- a/demo/nodejs/package.json +++ b/demo/nodejs/package.json @@ -1,6 +1,6 @@ { "name": "@picovoice/orca-node-demo", - "version": "1.2.0", + "version": "2.0.0", "description": "Picovoice Orca Node.js file-based and streaming demos", "scripts": { "file": "node file.js", @@ -21,7 +21,7 @@ "author": "Picovoice Inc.", "license": "Apache-2.0", "dependencies": { - "@picovoice/orca-node": "=1.2.0", + "@picovoice/orca-node": "2.0.0", "@picovoice/pvspeaker-node": "^1.0.3", "commander": "^6.1.0", "prettier": "^2.6.2", diff --git a/demo/nodejs/streaming.js b/demo/nodejs/streaming.js index 44dc62f0..6e6f69a5 100644 --- a/demo/nodejs/streaming.js +++ b/demo/nodejs/streaming.js @@ -21,18 +21,22 @@ const { PvSpeaker } = require('@picovoice/pvspeaker-node'); const { Orca, OrcaActivationLimitReachedError } = require('@picovoice/orca-node'); program - .requiredOption( + .option( '-a, --access_key ', 'AccessKey obtain from the Picovoice Console (https://console.picovoice.ai/)', ) - .requiredOption( + .option( '-t, --text_to_stream ', 'Text to be streamed to Orca', ) - .requiredOption( + .option( '-m, --model_file_path ', 'Absolute path to Orca model', ) + .option( + "-y, --device ", + "Device to run inference on (`best`, `cpu:{num_threads}` or `gpu:{gpu_index}`). Default: selects best device" + ) .option( '-l, --library_file_path ', 'Absolute path to dynamic library', @@ -59,13 +63,18 @@ program .option( '--show_audio_devices', 'Only list available audio output devices and exit', + ) + .option( + "-z, --show_inference_devices", + "Print devices that are available to run Orca inference.", + false ); if (process.argv.length < 3) { program.help(); } program.parse(process.argv); - + function splitText(text, language) { // TODO: Update once Orca supports passing in partial bytes if (language === "ko" || language === "ja") { @@ -172,18 +181,22 @@ function sleepSecs(ms) { async function streamingDemo() { let accessKey = program['access_key']; let modelFilePath = program['model_file_path']; + let device = program["device"]; let libraryFilePath = program['library_file_path']; let text = program['text_to_stream']; let tokensPerSeconds = program['tokens_per_second']; let audioWaitChunks = program['audio_wait_chunks']; let bufferSizeSecs = Number(program['buffer_size_secs']); let deviceIndex = Number(program['audio_device_index']); - let showAudioDevices = program['show_audio_devices']; - const modelFilePrefix = "orca_params_"; - const langCodeIdx = modelFilePath.indexOf(modelFilePrefix) + modelFilePrefix.length; - const language = modelFilePath.substring(langCodeIdx, langCodeIdx + 2); + const showInferenceDevices = program["show_inference_devices"]; + if (showInferenceDevices) { + console.log(Orca.listAvailableDevices().join('\n')); + process.exit(); + } + + const showAudioDevices = program['show_audio_devices']; if (showAudioDevices) { const devices = PvSpeaker.getAvailableDevices(); for (let i = 0; i < devices.length; i++) { @@ -192,6 +205,17 @@ async function streamingDemo() { return; } + const modelFilePrefix = "orca_params_"; + const langCodeIdx = modelFilePath.indexOf(modelFilePrefix) + modelFilePrefix.length; + const language = modelFilePath.substring(langCodeIdx, langCodeIdx + 2); + + if (accessKey === undefined || text === undefined || modelFilePath === undefined) { + console.error( + "`--access_key` `text_to_stream`, and `model_file_path` are required arguments" + ); + return; + } + if (audioWaitChunks === undefined || audioWaitChunks === null) { audioWaitChunks = 0; if (os.platform() === 'linux') { @@ -206,8 +230,9 @@ async function streamingDemo() { const orca = new Orca( accessKey, { - 'modelPath': modelFilePath, - 'libraryPath': libraryFilePath, + modelPath: modelFilePath, + device: device, + libraryPath: libraryFilePath, }, ); console.log(`\nOrca version: ${orca.version}`); diff --git a/demo/nodejs/yarn.lock b/demo/nodejs/yarn.lock index 584898a5..8f7a26cf 100644 --- a/demo/nodejs/yarn.lock +++ b/demo/nodejs/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@picovoice/orca-node@=1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@picovoice/orca-node/-/orca-node-1.2.0.tgz#0307ff2e5fab6659fa8bdf89ccd7d7088de3bae3" - integrity sha512-KQOAgMhy7XTjgYyyPsB2X+BlaMUrVCh/M8Rt9uEwuYoAx5gkj1kc8e2yhLqsBHM9XPPO8Spn+f7X5EAtP7Le4w== +"@picovoice/orca-node@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@picovoice/orca-node/-/orca-node-2.0.0.tgz#8243c7d126071ebf1247be4d39337d6dc6981e7d" + integrity sha512-Ti2HOCJeTTZDw5dP49lJ5ZaULfmLShGQVmOPQiEjwV91ybr67OGaPIbw6rjEA3E4Rk6NeznNNeyV54jSp/h7lw== "@picovoice/pvspeaker-node@^1.0.3": version "1.0.3" diff --git a/demo/python/orca_demo.py b/demo/python/orca_demo.py index fa171d80..49b246e6 100644 --- a/demo/python/orca_demo.py +++ b/demo/python/orca_demo.py @@ -16,8 +16,7 @@ import time import wave -from pvorca import create, OrcaActivationLimitError -from typing import List +import pvorca def main() -> None: @@ -25,39 +24,55 @@ def main() -> None: parser.add_argument( '--access_key', '-a', - required=True, help='AccessKey obtained from Picovoice Console (https://console.picovoice.ai/)') parser.add_argument( '--text', '-t', - required=True, help='Text to be synthesized') parser.add_argument( '--output_path', '-o', - required=True, help='Absolute path to .wav file where the generated audio will be stored') parser.add_argument( "--model_path", "-m", - required=True, help="Absolute path to Orca model") + parser.add_argument( + '--device', + help='Device to run inference on (`best`, `cpu:{num_threads}` or `gpu:{gpu_index}`). ' + 'Default: automatically selects best device') parser.add_argument( '--library_path', '-l', help='Absolute path to dynamic library. Default: using the library provided by `pvorca`') + parser.add_argument( + '--show_inference_devices', + action='store_true', + help='Print devices that are available to run Orca inference') args = parser.parse_args() + if args.show_inference_devices: + print('\n'.join(pvorca.available_devices(library_path=args.library_path))) + return + access_key = args.access_key model_path = args.model_path + device = args.device library_path = args.library_path output_path = args.output_path text = args.text + if access_key is None or text is None or output_path is None or model_path is None: + raise ValueError("Arguments --access_key, --text, --output_path and --model_path are required.") + if not output_path.lower().endswith('.wav'): raise ValueError('Given argument --output_path must have WAV file extension') - orca = create(access_key=access_key, model_path=model_path, library_path=library_path) + orca = pvorca.create( + access_key=access_key, + model_path=model_path, + device=device, + library_path=library_path) try: print(f"Orca version: {orca.version}") diff --git a/demo/python/orca_demo_streaming.py b/demo/python/orca_demo_streaming.py index 4abbfbe4..8b8c4ee3 100644 --- a/demo/python/orca_demo_streaming.py +++ b/demo/python/orca_demo_streaming.py @@ -185,7 +185,7 @@ def tokenize_text(text: str, language: str) -> Sequence[str]: tokens_raw = [encoder.decode([i]) for i in encoder.encode(text)] except: ALPHA_NUMERIC = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 ' - PUNCTUATION = '!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~ ' + PUNCTUATION = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ ' tokens_raw = [text[0]] for ch in text[1:]: if (ch in ALPHA_NUMERIC and tokens_raw[-1][-1] not in ALPHA_NUMERIC) or ch in PUNCTUATION: @@ -218,13 +218,15 @@ def main() -> None: parser.add_argument( "--access_key", "-a", - required=True, help="AccessKey obtained from Picovoice Console (https://console.picovoice.ai/)") parser.add_argument( "--model_path", "-m", - required=True, help="Absolute path to Orca model") + parser.add_argument( + '--device', + help='Device to run inference on (`best`, `cpu:{num_threads}` or `gpu:{gpu_index}`). ' + 'Default: automatically selects best device') parser.add_argument( "--library_path", "-l", @@ -232,7 +234,6 @@ def main() -> None: parser.add_argument( "--text_to_stream", "-t", - required=True, help="Text to be streamed to Orca") parser.add_argument( "--tokens_per_second", @@ -253,6 +254,10 @@ def main() -> None: "--show_audio_devices", action="store_true", help="Only list available audio output devices and exit") + parser.add_argument( + '--show_inference_devices', + action='store_true', + help='Print devices that are available to run Orca inference') parser.add_argument( '--audio-device-index', type=int, @@ -266,8 +271,13 @@ def main() -> None: print("index: %d, device name: %s" % (i, devices[i])) exit(0) + if args.show_inference_devices: + print('\n'.join(pvorca.available_devices(library_path=args.library_path))) + exit(0) + access_key = args.access_key model_path = args.model_path + device = args.device library_path = args.library_path text = args.text_to_stream tokens_per_second = args.tokens_per_second @@ -275,11 +285,18 @@ def main() -> None: buffer_size_secs = args.buffer_size_secs audio_device_index = args.audio_device_index + if access_key is None or text is None or model_path is None: + raise ValueError("Arguments --access_key, --text, --output_path and --model_path are required.") + model_file_prefix = "orca_params_" lang_code_idx = model_path.find(model_file_prefix) + len(model_file_prefix) language = model_path[lang_code_idx:lang_code_idx + 2] - orca = pvorca.create(access_key=access_key, model_path=model_path, library_path=library_path) + orca = pvorca.create( + access_key=access_key, + model_path=model_path, + device=device, + library_path=library_path) speaker = None try: diff --git a/demo/python/requirements.txt b/demo/python/requirements.txt index 1b645bbb..05935815 100644 --- a/demo/python/requirements.txt +++ b/demo/python/requirements.txt @@ -1,4 +1,4 @@ numpy>=1.24.0; sys_platform != 'win32' or platform_machine != 'ARM64' -pvorca==1.2.0 +pvorca==2.0.0 pvspeaker==1.0.5 tiktoken==0.8.0; sys_platform != 'win32' or platform_machine != 'ARM64' diff --git a/demo/python/setup.py b/demo/python/setup.py index 82821d80..9a12aae6 100644 --- a/demo/python/setup.py +++ b/demo/python/setup.py @@ -26,14 +26,14 @@ long_description = f.read() if platform.platform() != 'win32' or platform.machine() != 'ARM64': - dependencies = ["numpy>=1.24.0", "pvorca==1.2.0", "pvspeaker==1.0.5", "tiktoken==0.6.0"] + dependencies = ["numpy>=1.24.0", "pvorca==2.0.0", "pvspeaker==1.0.5", "tiktoken==0.8.0"] else: - dependencies = ["pvorca==1.2.0", "pvspeaker==1.0.5"] + dependencies = ["pvorca==2.0.0", "pvspeaker==1.0.5"] setuptools.setup( name="pvorcademo", - version="1.2.0", + version="2.0.0", author="Picovoice", author_email="hello@picovoice.ai", description="Orca Streaming Text-to-Speech Engine demos", diff --git a/demo/web/package.json b/demo/web/package.json index 5a04f300..6c4d7e75 100644 --- a/demo/web/package.json +++ b/demo/web/package.json @@ -1,6 +1,6 @@ { "name": "orca-web-demo", - "version": "1.2.1", + "version": "2.0.0", "description": "A basic demo to show how to use Orca for web browsers, using the IIFE version of the library", "main": "index.js", "private": true, @@ -17,7 +17,8 @@ "author": "Picovoice Inc", "license": "Apache-2.0", "dependencies": { - "@picovoice/orca-web": "1.2.1" + "@picovoice/orca-web": "2.0.0", + "mime-types": "^2.1.35" }, "devDependencies": { "@eslint/js": "^9.22.0", diff --git a/demo/web/scripts/run_demo.js b/demo/web/scripts/run_demo.js index fecbdf17..cd897b28 100644 --- a/demo/web/scripts/run_demo.js +++ b/demo/web/scripts/run_demo.js @@ -96,9 +96,7 @@ fs.writeFileSync( })();`, ); -const command = process.platform === "win32" ? "npx.cmd" : "npx"; - -child_process.execSync(`${command} http-server -c-1 -a localhost -p 5000`, { +child_process.execSync(`node server.js -a localhost -p 5000`, { shell: true, stdio: "inherit", }); diff --git a/demo/web/server.js b/demo/web/server.js new file mode 100644 index 00000000..9c81bd87 --- /dev/null +++ b/demo/web/server.js @@ -0,0 +1,42 @@ +const http = require('http'); +const fs = require('fs'); +const path = require('path'); +const mime = require('mime-types'); + +const PORT = process.env.PORT || 5000; +const HOST = '127.0.0.1'; // Listen on localhost +const publicDir = path.join(__dirname); + +const server = http.createServer((req, res) => { + const urlPath = req.url.split('?')[0]; + const url = (urlPath === '/') ? '/index.html' : urlPath; + const filePath = path.join(publicDir, url); + const contentType = mime.lookup(filePath) || 'application/octet-stream'; + + fs.readFile(filePath, (err, content) => { + if (err) { + if (err.code === 'ENOENT') { + // File not found + res.writeHead(404, { 'Content-Type': 'text/plain' }); + res.end('404 Not Found'); + } else { + // Server error + res.writeHead(500, { 'Content-Type': 'text/plain' }); + res.end(`500 Internal Server Error: ${err.code}`); + } + } else { + // Success + res.writeHead(200, { + 'Content-Type': contentType, + 'Content-Length': content.length, + 'Cross-Origin-Opener-Policy': 'same-origin', + 'Cross-Origin-Embedder-Policy': 'require-corp' + }); + res.end(content); + } + }); +}); + +server.listen(PORT, HOST, () => { + console.log(`Server is running on http://${HOST}:${PORT}`); +}); \ No newline at end of file diff --git a/demo/web/yarn.lock b/demo/web/yarn.lock index 27ce2bba..3d0bed5b 100644 --- a/demo/web/yarn.lock +++ b/demo/web/yarn.lock @@ -96,10 +96,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.2.tgz#1860473de7dfa1546767448f333db80cb0ff2161" integrity sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ== -"@picovoice/orca-web@1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@picovoice/orca-web/-/orca-web-1.2.1.tgz#cea3e78c9d3e17623d838c7ecf62518c408764fb" - integrity sha512-RGlhLAWeP/OmG9RHC9gfRMCnuV6XDDJGPhMMXaUC34oWnlIH//jVtjk4Fr0SKQARY532D9Mw18pPWGUPmnzBGQ== +"@picovoice/orca-web@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@picovoice/orca-web/-/orca-web-2.0.0.tgz#03431127d8942827ae49c3cc4f2777e7adcf82eb" + integrity sha512-GntE2vTni6ZT7zhl3uqPKmiljPcP6VPFqJficiiZ068oKP3nyYL/Vwx4RgOCqtOaRi51Pgp1l22pzNmBQks2hA== dependencies: "@picovoice/web-utils" "=1.4.3" @@ -648,6 +648,18 @@ math-intrinsics@^1.1.0: resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.35: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + mime@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" diff --git a/include/picovoice.h b/include/picovoice.h index 31a8127f..91931ecf 100644 --- a/include/picovoice.h +++ b/include/picovoice.h @@ -1,5 +1,5 @@ /* - Copyright 2018-2023 Picovoice Inc. + Copyright 2018-2025 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -20,8 +20,16 @@ extern "C" { #endif +#ifdef _MSC_VER + +#define PV_API __declspec(dllexport) + +#else + #define PV_API __attribute__((visibility("default"))) +#endif + /** * Status codes. */ @@ -73,6 +81,7 @@ PV_API pv_status_t pv_get_error_stack( PV_API void pv_free_error_stack(char **message_stack); #ifdef __cplusplus + } #endif diff --git a/include/pv_orca.h b/include/pv_orca.h index d579b4b1..203a6656 100644 --- a/include/pv_orca.h +++ b/include/pv_orca.h @@ -1,5 +1,5 @@ /* - Copyright 2024 Picovoice Inc. + Copyright 2024-2025 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -42,6 +42,12 @@ typedef struct pv_orca pv_orca_t; * * @param access_key AccessKey obtained from Picovoice Console (https://console.picovoice.ai/) * @param model_path Absolute path to the file containing Orca's model parameters. + * @param device String representation of the device (e.g., CPU or GPU) to use. If set to `best`, the most + * suitable device is selected automatically. If set to `gpu`, the engine uses the first available GPU device. + * To select a specific GPU device, set this argument to `gpu:${GPU_INDEX}`, where `${GPU_INDEX}` is the index + * of the target GPU. If set to `cpu`, the engine will run on the CPU with the default number of threads. + * To specify the number of threads, set this argument to `cpu:${NUM_THREADS}`, where `${NUM_THREADS}` is the + * desired number of threads. * @param[out] object Constructed instance of Orca. * @return Status code. Returns `PV_STATUS_OUT_OF_MEMORY`, `PV_STATUS_IO_ERROR`, `PV_STATUS_INVALID_ARGUMENT`, * `PV_STATUS_RUNTIME_ERROR`, `PV_STATUS_ACTIVATION_ERROR`, `PV_STATUS_ACTIVATION_LIMIT_REACHED`, @@ -50,6 +56,7 @@ typedef struct pv_orca pv_orca_t; PV_API pv_status_t pv_orca_init( const char *access_key, const char *model_path, + const char *device, pv_orca_t **object); /** @@ -70,14 +77,14 @@ PV_API void pv_orca_delete(pv_orca_t *object); PV_API pv_status_t pv_orca_valid_characters( const pv_orca_t *object, int32_t *num_characters, - const char ***characters); + const char *const **characters); /** * Deletes the characters previously created by `pv_orca_valid_characters()`. * * @param characters The characters returned from `pv_orca_valid_characters()`. */ -PV_API void pv_orca_valid_characters_delete(const char **characters); +PV_API void pv_orca_valid_characters_delete(const char *const *characters); /** * Gets the sampling rate of the audio produced by Orca. @@ -107,7 +114,7 @@ typedef struct pv_orca_synthesize_params pv_orca_synthesize_params_t; /** * Constructor for the pv_orca_synthesize_params object. - * + * * @param[out] object Constructed instance of pv_orca_synthesize_params. * @return Status code. Returns `PV_STATUS_INVALID_ARGUMENT` or `PV_STATUS_OUT_OF_MEMORY` on failure. */ @@ -115,14 +122,14 @@ PV_API pv_status_t pv_orca_synthesize_params_init(pv_orca_synthesize_params_t ** /** * Destructor for the pv_orca_synthesize_params object. - * + * * @param object The pv_orca_synthesize_params object. */ PV_API void pv_orca_synthesize_params_delete(pv_orca_synthesize_params_t *object); /** * Setter for the speech rate. - * + * * @param object Constructed instance of pv_orca_synthesize_params. * @param speech_rate The pace of the speech. Valid values are within [0.7, 1.3]. * @return Returns `PV_STATUS_INVALID_ARGUMENT` on failure. @@ -133,7 +140,7 @@ PV_API pv_status_t pv_orca_synthesize_params_set_speech_rate( /** * Getter for the speech rate. - * + * * @param object Constructed instance of pv_orca_synthesize_params. * @param[out] speech_rate The pace of the speech. * @return Returns `PV_STATUS_INVALID_ARGUMENT` on failure. @@ -339,6 +346,30 @@ PV_API pv_status_t pv_orca_word_alignments_delete( */ PV_API const char *pv_orca_version(void); +/** +* Gets a list of hardware devices that can be specified when calling `pv_orca_init` +* +* @param[out] hardware_devices Array of available hardware devices. Devices are NULL terminated strings. +* The array must be freed using `pv_orca_free_hardware_devices`. +* @param[out] num_hardware_devices The number of devices in the `hardware_devices` array. +* @return Status code. Returns `PV_STATUS_OUT_OF_MEMORY`, `PV_STATUS_INVALID_ARGUMENT`, `PV_STATUS_INVALID_STATE`, +* `PV_STATUS_RUNTIME_ERROR`, `PV_STATUS_ACTIVATION_ERROR`, `PV_STATUS_ACTIVATION_LIMIT_REACHED`, +* `PV_STATUS_ACTIVATION_THROTTLED`, or `PV_STATUS_ACTIVATION_REFUSED` on failure. +*/ +PV_API pv_status_t pv_orca_list_hardware_devices( + char ***hardware_devices, + int32_t *num_hardware_devices); + +/** +* Frees memory allocated by `pv_orca_list_hardware_devices`. +* +* @param[out] hardware_devices Array of available hardware devices allocated by `pv_orca_list_hardware_devices`. +* @param[out] num_hardware_devices The number of devices in the `hardware_devices` array. +*/ +PV_API void pv_orca_free_hardware_devices( + char **hardware_devices, + int32_t num_hardware_devices); + #ifdef __cplusplus } diff --git a/lib/android/arm64-v8a/libpv_orca.so b/lib/android/arm64-v8a/libpv_orca.so index f87ee77e..29d1753d 100755 Binary files a/lib/android/arm64-v8a/libpv_orca.so and b/lib/android/arm64-v8a/libpv_orca.so differ diff --git a/lib/android/armeabi-v7a/libpv_orca.so b/lib/android/armeabi-v7a/libpv_orca.so index b31885e0..96510ba2 100755 Binary files a/lib/android/armeabi-v7a/libpv_orca.so and b/lib/android/armeabi-v7a/libpv_orca.so differ diff --git a/lib/android/x86/libpv_orca.so b/lib/android/x86/libpv_orca.so index 44316200..c8acde3c 100755 Binary files a/lib/android/x86/libpv_orca.so and b/lib/android/x86/libpv_orca.so differ diff --git a/lib/android/x86_64/libpv_orca.so b/lib/android/x86_64/libpv_orca.so index bd0feb37..bd50ccde 100755 Binary files a/lib/android/x86_64/libpv_orca.so and b/lib/android/x86_64/libpv_orca.so differ diff --git a/lib/common/orca_params_de_female.pv b/lib/common/orca_params_de_female.pv index 8a2ee5c6..4c62562e 100644 Binary files a/lib/common/orca_params_de_female.pv and b/lib/common/orca_params_de_female.pv differ diff --git a/lib/common/orca_params_de_male.pv b/lib/common/orca_params_de_male.pv index c5ca8de4..5324657e 100644 Binary files a/lib/common/orca_params_de_male.pv and b/lib/common/orca_params_de_male.pv differ diff --git a/lib/common/orca_params_en_female.pv b/lib/common/orca_params_en_female.pv index efebbbd9..8cf47008 100644 Binary files a/lib/common/orca_params_en_female.pv and b/lib/common/orca_params_en_female.pv differ diff --git a/lib/common/orca_params_en_male.pv b/lib/common/orca_params_en_male.pv index 1bd08483..e6b5a33f 100644 Binary files a/lib/common/orca_params_en_male.pv and b/lib/common/orca_params_en_male.pv differ diff --git a/lib/common/orca_params_es_female.pv b/lib/common/orca_params_es_female.pv index 4e0f29c8..96ae8e6e 100644 Binary files a/lib/common/orca_params_es_female.pv and b/lib/common/orca_params_es_female.pv differ diff --git a/lib/common/orca_params_es_male.pv b/lib/common/orca_params_es_male.pv index e380d8a6..7d027d8c 100644 Binary files a/lib/common/orca_params_es_male.pv and b/lib/common/orca_params_es_male.pv differ diff --git a/lib/common/orca_params_fr_female.pv b/lib/common/orca_params_fr_female.pv index 3d7278c9..3d0aa64c 100644 Binary files a/lib/common/orca_params_fr_female.pv and b/lib/common/orca_params_fr_female.pv differ diff --git a/lib/common/orca_params_fr_male.pv b/lib/common/orca_params_fr_male.pv index b6edca07..9fa8bb83 100644 Binary files a/lib/common/orca_params_fr_male.pv and b/lib/common/orca_params_fr_male.pv differ diff --git a/lib/common/orca_params_it_female.pv b/lib/common/orca_params_it_female.pv index 10308c3b..4549df19 100644 Binary files a/lib/common/orca_params_it_female.pv and b/lib/common/orca_params_it_female.pv differ diff --git a/lib/common/orca_params_it_male.pv b/lib/common/orca_params_it_male.pv index 88ffc0fd..1a1997d9 100644 Binary files a/lib/common/orca_params_it_male.pv and b/lib/common/orca_params_it_male.pv differ diff --git a/lib/common/orca_params_ja_female.pv b/lib/common/orca_params_ja_female.pv index f1e845c8..3b324420 100644 Binary files a/lib/common/orca_params_ja_female.pv and b/lib/common/orca_params_ja_female.pv differ diff --git a/lib/common/orca_params_ja_male.pv b/lib/common/orca_params_ja_male.pv index e21eb823..69dc0d41 100644 Binary files a/lib/common/orca_params_ja_male.pv and b/lib/common/orca_params_ja_male.pv differ diff --git a/lib/common/orca_params_ko_female.pv b/lib/common/orca_params_ko_female.pv index f2455376..252a76b6 100644 Binary files a/lib/common/orca_params_ko_female.pv and b/lib/common/orca_params_ko_female.pv differ diff --git a/lib/common/orca_params_pt_female.pv b/lib/common/orca_params_pt_female.pv index 8ea17e53..f1739c28 100644 Binary files a/lib/common/orca_params_pt_female.pv and b/lib/common/orca_params_pt_female.pv differ diff --git a/lib/common/orca_params_pt_male.pv b/lib/common/orca_params_pt_male.pv index 48a114dd..b4054732 100644 Binary files a/lib/common/orca_params_pt_male.pv and b/lib/common/orca_params_pt_male.pv differ diff --git a/lib/ios/PvOrca.xcframework/Info.plist b/lib/ios/PvOrca.xcframework/Info.plist index 34d8512a..11d0a439 100644 --- a/lib/ios/PvOrca.xcframework/Info.plist +++ b/lib/ios/PvOrca.xcframework/Info.plist @@ -8,32 +8,32 @@ BinaryPath PvOrca.framework/PvOrca LibraryIdentifier - ios-arm64 + ios-arm64_x86_64-simulator LibraryPath PvOrca.framework SupportedArchitectures arm64 + x86_64 SupportedPlatform ios + SupportedPlatformVariant + simulator BinaryPath PvOrca.framework/PvOrca LibraryIdentifier - ios-arm64_x86_64-simulator + ios-arm64 LibraryPath PvOrca.framework SupportedArchitectures arm64 - x86_64 SupportedPlatform ios - SupportedPlatformVariant - simulator CFBundlePackageType diff --git a/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/Headers/picovoice.h b/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/Headers/picovoice.h index 969bd7c5..5dd48f9d 100644 --- a/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/Headers/picovoice.h +++ b/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/Headers/picovoice.h @@ -1,5 +1,5 @@ /* - Copyright 2018-2023 Picovoice Inc. + Copyright 2018-2025 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -79,10 +79,6 @@ PV_API void pv_free_error_stack(char **message_stack); PV_API void pv_set_sdk(const char *sdk); -PV_API const char *pv_get_sdk(void); - -PV_API void pv_free(void *p); - #ifdef __cplusplus } diff --git a/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/Headers/pv_orca.h b/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/Headers/pv_orca.h index 0f247f4c..4ce9bae6 100644 --- a/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/Headers/pv_orca.h +++ b/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/Headers/pv_orca.h @@ -1,5 +1,5 @@ /* - Copyright 2024 Picovoice Inc. + Copyright 2024-2025 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -42,6 +42,12 @@ typedef struct pv_orca pv_orca_t; * * @param access_key AccessKey obtained from Picovoice Console (https://console.picovoice.ai/) * @param model_path Absolute path to the file containing Orca's model parameters. + * @param device String representation of the device (e.g., CPU or GPU) to use. If set to `best`, the most + * suitable device is selected automatically. If set to `gpu`, the engine uses the first available GPU device. + * To select a specific GPU device, set this argument to `gpu:${GPU_INDEX}`, where `${GPU_INDEX}` is the index + * of the target GPU. If set to `cpu`, the engine will run on the CPU with the default number of threads. + * To specify the number of threads, set this argument to `cpu:${NUM_THREADS}`, where `${NUM_THREADS}` is the + * desired number of threads. * @param[out] object Constructed instance of Orca. * @return Status code. Returns `PV_STATUS_OUT_OF_MEMORY`, `PV_STATUS_IO_ERROR`, `PV_STATUS_INVALID_ARGUMENT`, * `PV_STATUS_RUNTIME_ERROR`, `PV_STATUS_ACTIVATION_ERROR`, `PV_STATUS_ACTIVATION_LIMIT_REACHED`, @@ -50,6 +56,7 @@ typedef struct pv_orca pv_orca_t; PV_API pv_status_t pv_orca_init( const char *access_key, const char *model_path, + const char *device, pv_orca_t **object); /** @@ -107,7 +114,7 @@ typedef struct pv_orca_synthesize_params pv_orca_synthesize_params_t; /** * Constructor for the pv_orca_synthesize_params object. - * + * * @param[out] object Constructed instance of pv_orca_synthesize_params. * @return Status code. Returns `PV_STATUS_INVALID_ARGUMENT` or `PV_STATUS_OUT_OF_MEMORY` on failure. */ @@ -115,14 +122,14 @@ PV_API pv_status_t pv_orca_synthesize_params_init(pv_orca_synthesize_params_t ** /** * Destructor for the pv_orca_synthesize_params object. - * + * * @param object The pv_orca_synthesize_params object. */ PV_API void pv_orca_synthesize_params_delete(pv_orca_synthesize_params_t *object); /** * Setter for the speech rate. - * + * * @param object Constructed instance of pv_orca_synthesize_params. * @param speech_rate The pace of the speech. Valid values are within [0.7, 1.3]. * @return Returns `PV_STATUS_INVALID_ARGUMENT` on failure. @@ -133,7 +140,7 @@ PV_API pv_status_t pv_orca_synthesize_params_set_speech_rate( /** * Getter for the speech rate. - * + * * @param object Constructed instance of pv_orca_synthesize_params. * @param[out] speech_rate The pace of the speech. * @return Returns `PV_STATUS_INVALID_ARGUMENT` on failure. @@ -339,6 +346,30 @@ PV_API pv_status_t pv_orca_word_alignments_delete( */ PV_API const char *pv_orca_version(void); +/** +* Gets a list of hardware devices that can be specified when calling `pv_orca_init` +* +* @param[out] hardware_devices Array of available hardware devices. Devices are NULL terminated strings. +* The array must be freed using `pv_orca_free_hardware_devices`. +* @param[out] num_hardware_devices The number of devices in the `hardware_devices` array. +* @return Status code. Returns `PV_STATUS_OUT_OF_MEMORY`, `PV_STATUS_INVALID_ARGUMENT`, `PV_STATUS_INVALID_STATE`, +* `PV_STATUS_RUNTIME_ERROR`, `PV_STATUS_ACTIVATION_ERROR`, `PV_STATUS_ACTIVATION_LIMIT_REACHED`, +* `PV_STATUS_ACTIVATION_THROTTLED`, or `PV_STATUS_ACTIVATION_REFUSED` on failure. +*/ +PV_API pv_status_t pv_orca_list_hardware_devices( + char ***hardware_devices, + int32_t *num_hardware_devices); + +/** +* Frees memory allocated by `pv_orca_list_hardware_devices`. +* +* @param[out] hardware_devices Array of available hardware devices allocated by `pv_orca_list_hardware_devices`. +* @param[out] num_hardware_devices The number of devices in the `hardware_devices` array. +*/ +PV_API void pv_orca_free_hardware_devices( + char **hardware_devices, + int32_t num_hardware_devices); + #ifdef __cplusplus } diff --git a/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/Info.plist b/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/Info.plist index e3b3d731..9e221d8c 100644 Binary files a/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/Info.plist and b/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/Info.plist differ diff --git a/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/PvOrca b/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/PvOrca index ce0db3e2..3cba52ed 100755 Binary files a/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/PvOrca and b/lib/ios/PvOrca.xcframework/ios-arm64/PvOrca.framework/PvOrca differ diff --git a/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/Headers/picovoice.h b/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/Headers/picovoice.h index 969bd7c5..5dd48f9d 100644 --- a/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/Headers/picovoice.h +++ b/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/Headers/picovoice.h @@ -1,5 +1,5 @@ /* - Copyright 2018-2023 Picovoice Inc. + Copyright 2018-2025 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -79,10 +79,6 @@ PV_API void pv_free_error_stack(char **message_stack); PV_API void pv_set_sdk(const char *sdk); -PV_API const char *pv_get_sdk(void); - -PV_API void pv_free(void *p); - #ifdef __cplusplus } diff --git a/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/Headers/pv_orca.h b/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/Headers/pv_orca.h index 0f247f4c..4ce9bae6 100644 --- a/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/Headers/pv_orca.h +++ b/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/Headers/pv_orca.h @@ -1,5 +1,5 @@ /* - Copyright 2024 Picovoice Inc. + Copyright 2024-2025 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -42,6 +42,12 @@ typedef struct pv_orca pv_orca_t; * * @param access_key AccessKey obtained from Picovoice Console (https://console.picovoice.ai/) * @param model_path Absolute path to the file containing Orca's model parameters. + * @param device String representation of the device (e.g., CPU or GPU) to use. If set to `best`, the most + * suitable device is selected automatically. If set to `gpu`, the engine uses the first available GPU device. + * To select a specific GPU device, set this argument to `gpu:${GPU_INDEX}`, where `${GPU_INDEX}` is the index + * of the target GPU. If set to `cpu`, the engine will run on the CPU with the default number of threads. + * To specify the number of threads, set this argument to `cpu:${NUM_THREADS}`, where `${NUM_THREADS}` is the + * desired number of threads. * @param[out] object Constructed instance of Orca. * @return Status code. Returns `PV_STATUS_OUT_OF_MEMORY`, `PV_STATUS_IO_ERROR`, `PV_STATUS_INVALID_ARGUMENT`, * `PV_STATUS_RUNTIME_ERROR`, `PV_STATUS_ACTIVATION_ERROR`, `PV_STATUS_ACTIVATION_LIMIT_REACHED`, @@ -50,6 +56,7 @@ typedef struct pv_orca pv_orca_t; PV_API pv_status_t pv_orca_init( const char *access_key, const char *model_path, + const char *device, pv_orca_t **object); /** @@ -107,7 +114,7 @@ typedef struct pv_orca_synthesize_params pv_orca_synthesize_params_t; /** * Constructor for the pv_orca_synthesize_params object. - * + * * @param[out] object Constructed instance of pv_orca_synthesize_params. * @return Status code. Returns `PV_STATUS_INVALID_ARGUMENT` or `PV_STATUS_OUT_OF_MEMORY` on failure. */ @@ -115,14 +122,14 @@ PV_API pv_status_t pv_orca_synthesize_params_init(pv_orca_synthesize_params_t ** /** * Destructor for the pv_orca_synthesize_params object. - * + * * @param object The pv_orca_synthesize_params object. */ PV_API void pv_orca_synthesize_params_delete(pv_orca_synthesize_params_t *object); /** * Setter for the speech rate. - * + * * @param object Constructed instance of pv_orca_synthesize_params. * @param speech_rate The pace of the speech. Valid values are within [0.7, 1.3]. * @return Returns `PV_STATUS_INVALID_ARGUMENT` on failure. @@ -133,7 +140,7 @@ PV_API pv_status_t pv_orca_synthesize_params_set_speech_rate( /** * Getter for the speech rate. - * + * * @param object Constructed instance of pv_orca_synthesize_params. * @param[out] speech_rate The pace of the speech. * @return Returns `PV_STATUS_INVALID_ARGUMENT` on failure. @@ -339,6 +346,30 @@ PV_API pv_status_t pv_orca_word_alignments_delete( */ PV_API const char *pv_orca_version(void); +/** +* Gets a list of hardware devices that can be specified when calling `pv_orca_init` +* +* @param[out] hardware_devices Array of available hardware devices. Devices are NULL terminated strings. +* The array must be freed using `pv_orca_free_hardware_devices`. +* @param[out] num_hardware_devices The number of devices in the `hardware_devices` array. +* @return Status code. Returns `PV_STATUS_OUT_OF_MEMORY`, `PV_STATUS_INVALID_ARGUMENT`, `PV_STATUS_INVALID_STATE`, +* `PV_STATUS_RUNTIME_ERROR`, `PV_STATUS_ACTIVATION_ERROR`, `PV_STATUS_ACTIVATION_LIMIT_REACHED`, +* `PV_STATUS_ACTIVATION_THROTTLED`, or `PV_STATUS_ACTIVATION_REFUSED` on failure. +*/ +PV_API pv_status_t pv_orca_list_hardware_devices( + char ***hardware_devices, + int32_t *num_hardware_devices); + +/** +* Frees memory allocated by `pv_orca_list_hardware_devices`. +* +* @param[out] hardware_devices Array of available hardware devices allocated by `pv_orca_list_hardware_devices`. +* @param[out] num_hardware_devices The number of devices in the `hardware_devices` array. +*/ +PV_API void pv_orca_free_hardware_devices( + char **hardware_devices, + int32_t num_hardware_devices); + #ifdef __cplusplus } diff --git a/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/Info.plist b/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/Info.plist index f687cf9b..86c19f0f 100644 Binary files a/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/Info.plist and b/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/Info.plist differ diff --git a/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/PvOrca b/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/PvOrca index aa22a832..926fc960 100755 Binary files a/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/PvOrca and b/lib/ios/PvOrca.xcframework/ios-arm64_x86_64-simulator/PvOrca.framework/PvOrca differ diff --git a/lib/linux/x86_64/libpv_orca.so b/lib/linux/x86_64/libpv_orca.so index 9dbfb8f0..79783517 100755 Binary files a/lib/linux/x86_64/libpv_orca.so and b/lib/linux/x86_64/libpv_orca.so differ diff --git a/lib/mac/arm64/libpv_orca.dylib b/lib/mac/arm64/libpv_orca.dylib index 643a7c79..0fa5402f 100755 Binary files a/lib/mac/arm64/libpv_orca.dylib and b/lib/mac/arm64/libpv_orca.dylib differ diff --git a/lib/mac/x86_64/libpv_orca.dylib b/lib/mac/x86_64/libpv_orca.dylib index 6d7c543f..6660dd27 100755 Binary files a/lib/mac/x86_64/libpv_orca.dylib and b/lib/mac/x86_64/libpv_orca.dylib differ diff --git a/lib/node/linux/x86_64/pv_orca.node b/lib/node/linux/x86_64/pv_orca.node index 8a1c7399..a5e4ae85 100755 Binary files a/lib/node/linux/x86_64/pv_orca.node and b/lib/node/linux/x86_64/pv_orca.node differ diff --git a/lib/node/mac/arm64/pv_orca.node b/lib/node/mac/arm64/pv_orca.node index 093feff8..030c3707 100755 Binary files a/lib/node/mac/arm64/pv_orca.node and b/lib/node/mac/arm64/pv_orca.node differ diff --git a/lib/node/mac/x86_64/pv_orca.node b/lib/node/mac/x86_64/pv_orca.node index 00c92e55..38927dbe 100755 Binary files a/lib/node/mac/x86_64/pv_orca.node and b/lib/node/mac/x86_64/pv_orca.node differ diff --git a/lib/node/raspberry-pi/cortex-a53-aarch64/pv_orca.node b/lib/node/raspberry-pi/cortex-a53-aarch64/pv_orca.node index bd9f3c39..3da6971d 100755 Binary files a/lib/node/raspberry-pi/cortex-a53-aarch64/pv_orca.node and b/lib/node/raspberry-pi/cortex-a53-aarch64/pv_orca.node differ diff --git a/lib/node/raspberry-pi/cortex-a53/pv_orca.node b/lib/node/raspberry-pi/cortex-a53/pv_orca.node index b8279785..0a19781c 100755 Binary files a/lib/node/raspberry-pi/cortex-a53/pv_orca.node and b/lib/node/raspberry-pi/cortex-a53/pv_orca.node differ diff --git a/lib/node/raspberry-pi/cortex-a72-aarch64/pv_orca.node b/lib/node/raspberry-pi/cortex-a72-aarch64/pv_orca.node index 2e5fd6cb..2c0cebc1 100755 Binary files a/lib/node/raspberry-pi/cortex-a72-aarch64/pv_orca.node and b/lib/node/raspberry-pi/cortex-a72-aarch64/pv_orca.node differ diff --git a/lib/node/raspberry-pi/cortex-a72/pv_orca.node b/lib/node/raspberry-pi/cortex-a72/pv_orca.node index b58aedbe..53461638 100755 Binary files a/lib/node/raspberry-pi/cortex-a72/pv_orca.node and b/lib/node/raspberry-pi/cortex-a72/pv_orca.node differ diff --git a/lib/node/raspberry-pi/cortex-a76-aarch64/pv_orca.node b/lib/node/raspberry-pi/cortex-a76-aarch64/pv_orca.node index c20bbb46..37cfb6fc 100755 Binary files a/lib/node/raspberry-pi/cortex-a76-aarch64/pv_orca.node and b/lib/node/raspberry-pi/cortex-a76-aarch64/pv_orca.node differ diff --git a/lib/node/raspberry-pi/cortex-a76/pv_orca.node b/lib/node/raspberry-pi/cortex-a76/pv_orca.node index e3abca56..6c05469e 100755 Binary files a/lib/node/raspberry-pi/cortex-a76/pv_orca.node and b/lib/node/raspberry-pi/cortex-a76/pv_orca.node differ diff --git a/lib/node/windows/amd64/pv_orca.node b/lib/node/windows/amd64/pv_orca.node index 9337982e..1af23790 100644 Binary files a/lib/node/windows/amd64/pv_orca.node and b/lib/node/windows/amd64/pv_orca.node differ diff --git a/lib/node/windows/amd64/pv_ypu_impl_cuda.dll b/lib/node/windows/amd64/pv_ypu_impl_cuda.dll new file mode 100644 index 00000000..2c6bc9ef Binary files /dev/null and b/lib/node/windows/amd64/pv_ypu_impl_cuda.dll differ diff --git a/lib/node/windows/arm64/pv_orca.node b/lib/node/windows/arm64/pv_orca.node index e969b61a..c8cea5eb 100644 Binary files a/lib/node/windows/arm64/pv_orca.node and b/lib/node/windows/arm64/pv_orca.node differ diff --git a/lib/raspberry-pi/cortex-a53-aarch64/libpv_orca.so b/lib/raspberry-pi/cortex-a53-aarch64/libpv_orca.so index 5bf7bb72..4be8b17f 100755 Binary files a/lib/raspberry-pi/cortex-a53-aarch64/libpv_orca.so and b/lib/raspberry-pi/cortex-a53-aarch64/libpv_orca.so differ diff --git a/lib/raspberry-pi/cortex-a53/libpv_orca.so b/lib/raspberry-pi/cortex-a53/libpv_orca.so index b8c711db..7b3dcb19 100755 Binary files a/lib/raspberry-pi/cortex-a53/libpv_orca.so and b/lib/raspberry-pi/cortex-a53/libpv_orca.so differ diff --git a/lib/raspberry-pi/cortex-a72-aarch64/libpv_orca.so b/lib/raspberry-pi/cortex-a72-aarch64/libpv_orca.so index 7b1dffb3..7cf8715d 100755 Binary files a/lib/raspberry-pi/cortex-a72-aarch64/libpv_orca.so and b/lib/raspberry-pi/cortex-a72-aarch64/libpv_orca.so differ diff --git a/lib/raspberry-pi/cortex-a72/libpv_orca.so b/lib/raspberry-pi/cortex-a72/libpv_orca.so index 50fe9556..88bce152 100755 Binary files a/lib/raspberry-pi/cortex-a72/libpv_orca.so and b/lib/raspberry-pi/cortex-a72/libpv_orca.so differ diff --git a/lib/raspberry-pi/cortex-a76-aarch64/libpv_orca.so b/lib/raspberry-pi/cortex-a76-aarch64/libpv_orca.so index 70886f78..41bf88d9 100755 Binary files a/lib/raspberry-pi/cortex-a76-aarch64/libpv_orca.so and b/lib/raspberry-pi/cortex-a76-aarch64/libpv_orca.so differ diff --git a/lib/raspberry-pi/cortex-a76/libpv_orca.so b/lib/raspberry-pi/cortex-a76/libpv_orca.so index 9031945a..f48f27f1 100755 Binary files a/lib/raspberry-pi/cortex-a76/libpv_orca.so and b/lib/raspberry-pi/cortex-a76/libpv_orca.so differ diff --git a/lib/wasm/pv_orca.js b/lib/wasm/pv_orca.js deleted file mode 100644 index d8797e4c..00000000 --- a/lib/wasm/pv_orca.js +++ /dev/null @@ -1,16 +0,0 @@ - -var pv_orca = (() => { - var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined; - - return ( -function(moduleArg = {}) { - var moduleRtn; - -var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";function _typeof$2(o){null;return _typeof$2="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof$2(o)}function toPrimitive(t,r){if("object"!=_typeof$2(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof$2(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}function toPropertyKey(t){var i=toPrimitive(t,"string");return"symbol"==_typeof$2(i)?i:i+""}function _defineProperty(e,r,t){return(r=toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function asyncGeneratorStep(n,t,e,r,o,a,c){try{var i=n[a](c),u=i.value}catch(n){return void e(n)}i.done?t(u):Promise.resolve(u).then(r,o)}function _asyncToGenerator(n){return function(){var t=this,e=arguments;return new Promise(function(r,o){var a=n.apply(t,e);function _next(n){asyncGeneratorStep(a,r,o,_next,_throw,"next",n)}function _throw(n){asyncGeneratorStep(a,r,o,_next,_throw,"throw",n)}_next(void 0)})}}function getDefaultExportFromCjs(x){return x&&x.__esModule&&Object.prototype.hasOwnProperty.call(x,"default")?x["default"]:x}var regeneratorRuntime$3={exports:{}};var _typeof$1={exports:{}};var _typeof_1=_typeof$1.exports;(function(module){function _typeof(o){null;return module.exports=_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},module.exports.__esModule=true,module.exports["default"]=module.exports,_typeof(o)}module.exports=_typeof,module.exports.__esModule=true,module.exports["default"]=module.exports})(_typeof$1);var _typeofExports=_typeof$1.exports;var _typeof=getDefaultExportFromCjs(_typeofExports);var regeneratorRuntime$1=regeneratorRuntime$3.exports;(function(module){var _typeof=_typeofExports["default"];function _regeneratorRuntime(){"use strict";module.exports=_regeneratorRuntime=function _regeneratorRuntime(){return e},module.exports.__esModule=true,module.exports["default"]=module.exports;var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",c=i.asyncIterator||"@@asyncIterator",u=i.toStringTag||"@@toStringTag";function define(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{define({},"")}catch(t){define=function define(t,e,r){return t[e]=r}}function wrap(t,e,r,n){var i=e&&e.prototype instanceof Generator?e:Generator,a=Object.create(i.prototype),c=new Context(n||[]);return o(a,"_invoke",{value:makeInvokeMethod(t,r,c)}),a}function tryCatch(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=wrap;var h="suspendedStart",l="suspendedYield",f="executing",s="completed",y={};function Generator(){}function GeneratorFunction(){}function GeneratorFunctionPrototype(){}var p={};define(p,a,function(){return this});var d=Object.getPrototypeOf,v=d&&d(d(values([])));v&&v!==r&&n.call(v,a)&&(p=v);var g=GeneratorFunctionPrototype.prototype=Generator.prototype=Object.create(p);function defineIteratorMethods(t){["next","throw","return"].forEach(function(e){define(t,e,function(t){return this._invoke(e,t)})})}function AsyncIterator(t,e){function invoke(r,o,i,a){var c=tryCatch(t[r],t,o);if("throw"!==c.type){var u=c.arg,h=u.value;return h&&"object"==_typeof(h)&&n.call(h,"__await")?e.resolve(h.__await).then(function(t){invoke("next",t,i,a)},function(t){invoke("throw",t,i,a)}):e.resolve(h).then(function(t){u.value=t,i(u)},function(t){return invoke("throw",t,i,a)})}a(c.arg)}var r;o(this,"_invoke",{value:function value(t,n){function callInvokeWithMethodAndArg(){return new e(function(e,r){invoke(t,n,e,r)})}return r=r?r.then(callInvokeWithMethodAndArg,callInvokeWithMethodAndArg):callInvokeWithMethodAndArg()}})}function makeInvokeMethod(e,r,n){var o=h;return function(i,a){if(o===f)throw Error("Generator is already running");if(o===s){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var c=n.delegate;if(c){var u=maybeInvokeDelegate(c,n);if(u){if(u===y)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===h)throw o=s,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=f;var p=tryCatch(e,r,n);if("normal"===p.type){if(o=n.done?s:l,p.arg===y)continue;return{value:p.arg,done:n.done}}"throw"===p.type&&(o=s,n.method="throw",n.arg=p.arg)}}}function maybeInvokeDelegate(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator["return"]&&(r.method="return",r.arg=t,maybeInvokeDelegate(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),y;var i=tryCatch(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,y;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,y):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,y)}function pushTryEntry(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function resetTryEntry(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function Context(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(pushTryEntry,this),this.reset(!0)}function values(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function next(){for(;++o=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return handle("end");if(i.tryLoc<=this.prev){var c=n.call(i,"catchLoc"),u=n.call(i,"finallyLoc");if(c&&u){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),resetTryEntry(r),y}},catch:function _catch(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;resetTryEntry(r)}return o}}throw Error("illegal catch attempt")},delegateYield:function delegateYield(e,r,n){return this.delegate={iterator:values(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),y}},e}module.exports=_regeneratorRuntime,module.exports.__esModule=true,module.exports["default"]=module.exports})(regeneratorRuntime$3);var regeneratorRuntimeExports=regeneratorRuntime$3.exports;var regeneratorRuntime$2=getDefaultExportFromCjs(regeneratorRuntimeExports);var runtime=regeneratorRuntimeExports();var regenerator=runtime;try{regeneratorRuntime=runtime}catch(accidentalStrictMode){if(typeof globalThis==="object"){globalThis.regeneratorRuntime=runtime}else{Function("r","regeneratorRuntime = r")(runtime)}}var _regeneratorRuntime=getDefaultExportFromCjs(regenerator);const BROWSER_ALIASES_MAP={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"};const BROWSER_MAP={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"};const PLATFORMS_MAP={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"};const OS_MAP={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"};const ENGINE_MAP={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};class Utils{static getFirstMatch(regexp,ua){const match=ua.match(regexp);return match&&match.length>0&&match[1]||""}static getSecondMatch(regexp,ua){const match=ua.match(regexp);return match&&match.length>1&&match[2]||""}static matchAndReturnConst(regexp,ua,_const){if(regexp.test(ua)){return _const}return void 0}static getWindowsVersionName(version){switch(version){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return undefined}}static getMacOSVersionName(version){const v=version.split(".").splice(0,2).map(s=>parseInt(s,10)||0);v.push(0);if(v[0]!==10)return undefined;switch(v[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return undefined}}static getAndroidVersionName(version){const v=version.split(".").splice(0,2).map(s=>parseInt(s,10)||0);v.push(0);if(v[0]===1&&v[1]<5)return undefined;if(v[0]===1&&v[1]<6)return"Cupcake";if(v[0]===1&&v[1]>=6)return"Donut";if(v[0]===2&&v[1]<2)return"Eclair";if(v[0]===2&&v[1]===2)return"Froyo";if(v[0]===2&&v[1]>2)return"Gingerbread";if(v[0]===3)return"Honeycomb";if(v[0]===4&&v[1]<1)return"Ice Cream Sandwich";if(v[0]===4&&v[1]<4)return"Jelly Bean";if(v[0]===4&&v[1]>=4)return"KitKat";if(v[0]===5)return"Lollipop";if(v[0]===6)return"Marshmallow";if(v[0]===7)return"Nougat";if(v[0]===8)return"Oreo";if(v[0]===9)return"Pie";return undefined}static getVersionPrecision(version){return version.split(".").length}static compareVersions(versionA,versionB,isLoose=false){const versionAPrecision=Utils.getVersionPrecision(versionA);const versionBPrecision=Utils.getVersionPrecision(versionB);let precision=Math.max(versionAPrecision,versionBPrecision);let lastPrecision=0;const chunks=Utils.map([versionA,versionB],version=>{const delta=precision-Utils.getVersionPrecision(version);const _version=version+new Array(delta+1).join(".0");return Utils.map(_version.split("."),chunk=>new Array(20-chunk.length).join("0")+chunk).reverse()});if(isLoose){lastPrecision=precision-Math.min(versionAPrecision,versionBPrecision)}precision-=1;while(precision>=lastPrecision){if(chunks[0][precision]>chunks[1][precision]){return 1}if(chunks[0][precision]===chunks[1][precision]){if(precision===lastPrecision){return 0}precision-=1}else if(chunks[0][precision]{result[key]=assigner[key]})}}return obj}static getBrowserAlias(browserName){return BROWSER_ALIASES_MAP[browserName]}static getBrowserTypeByAlias(browserAlias){return BROWSER_MAP[browserAlias]||""}}const commonVersionIdentifier=/version\/(\d+(\.?_?\d+)+)/i;const browsersList=[{test:[/googlebot/i],describe(ua){const browser={name:"Googlebot"};const version=Utils.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/opera/i],describe(ua){const browser={name:"Opera"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/opr\/|opios/i],describe(ua){const browser={name:"Opera"};const version=Utils.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/SamsungBrowser/i],describe(ua){const browser={name:"Samsung Internet for Android"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/Whale/i],describe(ua){const browser={name:"NAVER Whale Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/MZBrowser/i],describe(ua){const browser={name:"MZ Browser"};const version=Utils.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/focus/i],describe(ua){const browser={name:"Focus"};const version=Utils.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/swing/i],describe(ua){const browser={name:"Swing"};const version=Utils.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/coast/i],describe(ua){const browser={name:"Opera Coast"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(ua){const browser={name:"Opera Touch"};const version=Utils.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/yabrowser/i],describe(ua){const browser={name:"Yandex Browser"};const version=Utils.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/ucbrowser/i],describe(ua){const browser={name:"UC Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/Maxthon|mxios/i],describe(ua){const browser={name:"Maxthon"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/epiphany/i],describe(ua){const browser={name:"Epiphany"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/puffin/i],describe(ua){const browser={name:"Puffin"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/sleipnir/i],describe(ua){const browser={name:"Sleipnir"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/k-meleon/i],describe(ua){const browser={name:"K-Meleon"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/micromessenger/i],describe(ua){const browser={name:"WeChat"};const version=Utils.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/qqbrowser/i],describe(ua){const browser={name:/qqbrowserlite/i.test(ua)?"QQ Browser Lite":"QQ Browser"};const version=Utils.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/msie|trident/i],describe(ua){const browser={name:"Internet Explorer"};const version=Utils.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/\sedg\//i],describe(ua){const browser={name:"Microsoft Edge"};const version=Utils.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/edg([ea]|ios)/i],describe(ua){const browser={name:"Microsoft Edge"};const version=Utils.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/vivaldi/i],describe(ua){const browser={name:"Vivaldi"};const version=Utils.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/seamonkey/i],describe(ua){const browser={name:"SeaMonkey"};const version=Utils.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/sailfish/i],describe(ua){const browser={name:"Sailfish"};const version=Utils.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,ua);if(version){browser.version=version}return browser}},{test:[/silk/i],describe(ua){const browser={name:"Amazon Silk"};const version=Utils.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/phantom/i],describe(ua){const browser={name:"PhantomJS"};const version=Utils.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/slimerjs/i],describe(ua){const browser={name:"SlimerJS"};const version=Utils.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(ua){const browser={name:"BlackBerry"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/(web|hpw)[o0]s/i],describe(ua){const browser={name:"WebOS Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/bada/i],describe(ua){const browser={name:"Bada"};const version=Utils.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/tizen/i],describe(ua){const browser={name:"Tizen"};const version=Utils.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/qupzilla/i],describe(ua){const browser={name:"QupZilla"};const version=Utils.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/firefox|iceweasel|fxios/i],describe(ua){const browser={name:"Firefox"};const version=Utils.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/electron/i],describe(ua){const browser={name:"Electron"};const version=Utils.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/MiuiBrowser/i],describe(ua){const browser={name:"Miui"};const version=Utils.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/chromium/i],describe(ua){const browser={name:"Chromium"};const version=Utils.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/chrome|crios|crmo/i],describe(ua){const browser={name:"Chrome"};const version=Utils.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/GSA/i],describe(ua){const browser={name:"Google Search"};const version=Utils.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test(parser){const notLikeAndroid=!parser.test(/like android/i);const butAndroid=parser.test(/android/i);return notLikeAndroid&&butAndroid},describe(ua){const browser={name:"Android Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/playstation 4/i],describe(ua){const browser={name:"PlayStation 4"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/safari|applewebkit/i],describe(ua){const browser={name:"Safari"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/.*/i],describe(ua){const regexpWithoutDeviceSpec=/^(.*)\/(.*) /;const regexpWithDeviceSpec=/^(.*)\/(.*)[ \t]\((.*)/;const hasDeviceSpec=ua.search("\\(")!==-1;const regexp=hasDeviceSpec?regexpWithDeviceSpec:regexpWithoutDeviceSpec;return{name:Utils.getFirstMatch(regexp,ua),version:Utils.getSecondMatch(regexp,ua)}}}];var osParsersList=[{test:[/Roku\/DVP/],describe(ua){const version=Utils.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,ua);return{name:OS_MAP.Roku,version:version}}},{test:[/windows phone/i],describe(ua){const version=Utils.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,ua);return{name:OS_MAP.WindowsPhone,version:version}}},{test:[/windows /i],describe(ua){const version=Utils.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,ua);const versionName=Utils.getWindowsVersionName(version);return{name:OS_MAP.Windows,version:version,versionName:versionName}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(ua){const result={name:OS_MAP.iOS};const version=Utils.getSecondMatch(/(Version\/)(\d[\d.]+)/,ua);if(version){result.version=version}return result}},{test:[/macintosh/i],describe(ua){const version=Utils.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,ua).replace(/[_\s]/g,".");const versionName=Utils.getMacOSVersionName(version);const os={name:OS_MAP.MacOS,version:version};if(versionName){os.versionName=versionName}return os}},{test:[/(ipod|iphone|ipad)/i],describe(ua){const version=Utils.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,ua).replace(/[_\s]/g,".");return{name:OS_MAP.iOS,version:version}}},{test(parser){const notLikeAndroid=!parser.test(/like android/i);const butAndroid=parser.test(/android/i);return notLikeAndroid&&butAndroid},describe(ua){const version=Utils.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,ua);const versionName=Utils.getAndroidVersionName(version);const os={name:OS_MAP.Android,version:version};if(versionName){os.versionName=versionName}return os}},{test:[/(web|hpw)[o0]s/i],describe(ua){const version=Utils.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,ua);const os={name:OS_MAP.WebOS};if(version&&version.length){os.version=version}return os}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(ua){const version=Utils.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,ua)||Utils.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,ua)||Utils.getFirstMatch(/\bbb(\d+)/i,ua);return{name:OS_MAP.BlackBerry,version:version}}},{test:[/bada/i],describe(ua){const version=Utils.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,ua);return{name:OS_MAP.Bada,version:version}}},{test:[/tizen/i],describe(ua){const version=Utils.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,ua);return{name:OS_MAP.Tizen,version:version}}},{test:[/linux/i],describe(){return{name:OS_MAP.Linux}}},{test:[/CrOS/],describe(){return{name:OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe(ua){const version=Utils.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,ua);return{name:OS_MAP.PlayStation4,version:version}}}];var platformParsersList=[{test:[/googlebot/i],describe(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe(ua){const model=Utils.getFirstMatch(/(can-l01)/i,ua)&&"Nova";const platform={type:PLATFORMS_MAP.mobile,vendor:"Huawei"};if(model){platform.model=model}return platform}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe(){return{type:PLATFORMS_MAP.tablet}}},{test(parser){const iDevice=parser.test(/ipod|iphone/i);const likeIDevice=parser.test(/like (ipod|iphone)/i);return iDevice&&!likeIDevice},describe(ua){const model=Utils.getFirstMatch(/(ipod|iphone)/i,ua);return{type:PLATFORMS_MAP.mobile,vendor:"Apple",model:model}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe(){return{type:PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe(){return{type:PLATFORMS_MAP.mobile}}},{test(parser){return parser.getBrowserName(true)==="blackberry"},describe(){return{type:PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test(parser){return parser.getBrowserName(true)==="bada"},describe(){return{type:PLATFORMS_MAP.mobile}}},{test(parser){return parser.getBrowserName()==="windows phone"},describe(){return{type:PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test(parser){const osMajorVersion=Number(String(parser.getOSVersion()).split(".")[0]);return parser.getOSName(true)==="android"&&osMajorVersion>=3},describe(){return{type:PLATFORMS_MAP.tablet}}},{test(parser){return parser.getOSName(true)==="android"},describe(){return{type:PLATFORMS_MAP.mobile}}},{test(parser){return parser.getOSName(true)==="macos"},describe(){return{type:PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test(parser){return parser.getOSName(true)==="windows"},describe(){return{type:PLATFORMS_MAP.desktop}}},{test(parser){return parser.getOSName(true)==="linux"},describe(){return{type:PLATFORMS_MAP.desktop}}},{test(parser){return parser.getOSName(true)==="playstation 4"},describe(){return{type:PLATFORMS_MAP.tv}}},{test(parser){return parser.getOSName(true)==="roku"},describe(){return{type:PLATFORMS_MAP.tv}}}];var enginesParsersList=[{test(parser){return parser.getBrowserName(true)==="microsoft edge"},describe(ua){const isBlinkBased=/\sedg\//i.test(ua);if(isBlinkBased){return{name:ENGINE_MAP.Blink}}const version=Utils.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,ua);return{name:ENGINE_MAP.EdgeHTML,version:version}}},{test:[/trident/i],describe(ua){const engine={name:ENGINE_MAP.Trident};const version=Utils.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}},{test(parser){return parser.test(/presto/i)},describe(ua){const engine={name:ENGINE_MAP.Presto};const version=Utils.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}},{test(parser){const isGecko=parser.test(/gecko/i);const likeGecko=parser.test(/like gecko/i);return isGecko&&!likeGecko},describe(ua){const engine={name:ENGINE_MAP.Gecko};const version=Utils.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}},{test:[/(apple)?webkit\/537\.36/i],describe(){return{name:ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe(ua){const engine={name:ENGINE_MAP.WebKit};const version=Utils.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}}];class Parser{constructor(UA,skipParsing=false){if(UA===void 0||UA===null||UA===""){throw new Error("UserAgent parameter can't be empty")}this._ua=UA;this.parsedResult={};if(skipParsing!==true){this.parse()}}getUA(){return this._ua}test(regex){return regex.test(this._ua)}parseBrowser(){this.parsedResult.browser={};const browserDescriptor=Utils.find(browsersList,_browser=>{if(typeof _browser.test==="function"){return _browser.test(this)}if(_browser.test instanceof Array){return _browser.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(browserDescriptor){this.parsedResult.browser=browserDescriptor.describe(this.getUA())}return this.parsedResult.browser}getBrowser(){if(this.parsedResult.browser){return this.parsedResult.browser}return this.parseBrowser()}getBrowserName(toLowerCase){if(toLowerCase){return String(this.getBrowser().name).toLowerCase()||""}return this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){if(this.parsedResult.os){return this.parsedResult.os}return this.parseOS()}parseOS(){this.parsedResult.os={};const os=Utils.find(osParsersList,_os=>{if(typeof _os.test==="function"){return _os.test(this)}if(_os.test instanceof Array){return _os.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(os){this.parsedResult.os=os.describe(this.getUA())}return this.parsedResult.os}getOSName(toLowerCase){const{name:name}=this.getOS();if(toLowerCase){return String(name).toLowerCase()||""}return name||""}getOSVersion(){return this.getOS().version}getPlatform(){if(this.parsedResult.platform){return this.parsedResult.platform}return this.parsePlatform()}getPlatformType(toLowerCase=false){const{type:type}=this.getPlatform();if(toLowerCase){return String(type).toLowerCase()||""}return type||""}parsePlatform(){this.parsedResult.platform={};const platform=Utils.find(platformParsersList,_platform=>{if(typeof _platform.test==="function"){return _platform.test(this)}if(_platform.test instanceof Array){return _platform.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(platform){this.parsedResult.platform=platform.describe(this.getUA())}return this.parsedResult.platform}getEngine(){if(this.parsedResult.engine){return this.parsedResult.engine}return this.parseEngine()}getEngineName(toLowerCase){if(toLowerCase){return String(this.getEngine().name).toLowerCase()||""}return this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};const engine=Utils.find(enginesParsersList,_engine=>{if(typeof _engine.test==="function"){return _engine.test(this)}if(_engine.test instanceof Array){return _engine.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(engine){this.parsedResult.engine=engine.describe(this.getUA())}return this.parsedResult.engine}parse(){this.parseBrowser();this.parseOS();this.parsePlatform();this.parseEngine();return this}getResult(){return Utils.assign({},this.parsedResult)}satisfies(checkTree){const platformsAndOSes={};let platformsAndOSCounter=0;const browsers={};let browsersCounter=0;const allDefinitions=Object.keys(checkTree);allDefinitions.forEach(key=>{const currentDefinition=checkTree[key];if(typeof currentDefinition==="string"){browsers[key]=currentDefinition;browsersCounter+=1}else if(typeof currentDefinition==="object"){platformsAndOSes[key]=currentDefinition;platformsAndOSCounter+=1}});if(platformsAndOSCounter>0){const platformsAndOSNames=Object.keys(platformsAndOSes);const OSMatchingDefinition=Utils.find(platformsAndOSNames,name=>this.isOS(name));if(OSMatchingDefinition){const osResult=this.satisfies(platformsAndOSes[OSMatchingDefinition]);if(osResult!==void 0){return osResult}}const platformMatchingDefinition=Utils.find(platformsAndOSNames,name=>this.isPlatform(name));if(platformMatchingDefinition){const platformResult=this.satisfies(platformsAndOSes[platformMatchingDefinition]);if(platformResult!==void 0){return platformResult}}}if(browsersCounter>0){const browserNames=Object.keys(browsers);const matchingDefinition=Utils.find(browserNames,name=>this.isBrowser(name,true));if(matchingDefinition!==void 0){return this.compareVersion(browsers[matchingDefinition])}}return undefined}isBrowser(browserName,includingAlias=false){const defaultBrowserName=this.getBrowserName().toLowerCase();let browserNameLower=browserName.toLowerCase();const alias=Utils.getBrowserTypeByAlias(browserNameLower);if(includingAlias&&alias){browserNameLower=alias.toLowerCase()}return browserNameLower===defaultBrowserName}compareVersion(version){let expectedResults=[0];let comparableVersion=version;let isLoose=false;const currentBrowserVersion=this.getBrowserVersion();if(typeof currentBrowserVersion!=="string"){return void 0}if(version[0]===">"||version[0]==="<"){comparableVersion=version.substr(1);if(version[1]==="="){isLoose=true;comparableVersion=version.substr(2)}else{expectedResults=[]}if(version[0]===">"){expectedResults.push(1)}else{expectedResults.push(-1)}}else if(version[0]==="="){comparableVersion=version.substr(1)}else if(version[0]==="~"){isLoose=true;comparableVersion=version.substr(1)}return expectedResults.indexOf(Utils.compareVersions(currentBrowserVersion,comparableVersion,isLoose))>-1}isOS(osName){return this.getOSName(true)===String(osName).toLowerCase()}isPlatform(platformType){return this.getPlatformType(true)===String(platformType).toLowerCase()}isEngine(engineName){return this.getEngineName(true)===String(engineName).toLowerCase()}is(anything,includingAlias=false){return this.isBrowser(anything,includingAlias)||this.isOS(anything)||this.isPlatform(anything)}some(anythings=[]){return anythings.some(anything=>this.is(anything))}}class Bowser{static getParser(UA,skipParsing=false){if(typeof UA!=="string"){throw new Error("UserAgent should be a string")}return new Parser(UA,skipParsing)}static parse(UA){return new Parser(UA).getResult()}static get BROWSER_MAP(){return BROWSER_MAP}static get ENGINE_MAP(){return ENGINE_MAP}static get OS_MAP(){return OS_MAP}static get PLATFORMS_MAP(){return PLATFORMS_MAP}}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t=this._data.length){return undefined}var res=this._data.slice(this._pos,this._pos+bytes);this._pos+=bytes;return res}},{key:"set",value:function set(pos,data){this._pos=pos;this._data=data}},{key:"clear",value:function clear(){this._pos=0;this._data=new Uint8Array}}])}();var PvFileIDB=function(_PvFile){function PvFileIDB(path,meta,db,mode){var _this;_classCallCheck(this,PvFileIDB);_this=_callSuper$1(this,PvFileIDB);_this._pageSize=512*1024;_this._pagePtr=0;_this._pageOffset=0;_this._path=path;_this._meta=meta;_this._db=db;_this._mode=mode;_this._cache=new PvCache;return _this}_inherits(PvFileIDB,_PvFile);return _createClass(PvFileIDB,[{key:"pageSize",get:function get(){return this._pageSize}},{key:"close",value:function(){var _close=_asyncToGenerator(_regeneratorRuntime.mark(function _callee(){return _regeneratorRuntime.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:this._db.close();case 1:case"end":return _context.stop()}},_callee,this)}));function close(){return _close.apply(this,arguments)}return close}()},{key:"read",value:function(){var _read=_asyncToGenerator(_regeneratorRuntime.mark(function _callee2(size,count){var _this2=this;return _regeneratorRuntime.wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:return _context2.abrupt("return",new Promise(function(resolve,reject){if(!_this2.exists()){reject(new Error("'".concat(_this2._path,"' doesn't exist.")));return}if(_this2._isEOF){var err=new Error("EOF");err.name="EndOfFile";reject(err);return}var copied=0;var maxToCopy=Math.min(size*count,_this2._meta.size);var totalElems=maxToCopy-maxToCopy%size;var buffer=new Uint8Array(totalElems);var res=_this2._cache.get(totalElems);if(res){copied+=res.length;_this2._pageOffset+=res.length;if(_this2._pageOffset===_this2._pageSize){_this2._pagePtr+=1;_this2._pageOffset=0}if(totalElems===copied){resolve(res);return}buffer.set(res)}var keyRange=IDBKeyRange.bound("".concat(_this2._path,"-").concat(PvFileIDB.createPage(_this2._pagePtr)),"".concat(_this2._path,"-").concat(PvFileIDB.createPage(_this2._pagePtr+Math.floor(totalElems/_this2._pageSize)+1)));var store=_this2._store;var req=store.openCursor(keyRange);req.onsuccess=function(){var cursor=req.result;if(!cursor||_this2._isEOF){return}var toCopy=Math.min(totalElems-copied,cursor.value.length-_this2._pageOffset);buffer.set(cursor.value.slice(_this2._pageOffset,_this2._pageOffset+toCopy),copied);copied+=toCopy;_this2._pageOffset+=toCopy;if(_this2._pageOffset===_this2._pageSize){_this2._pagePtr+=1;_this2._pageOffset=0}if(copied1&&_args4[1]!==undefined?_args4[1]:1;return _context4.abrupt("return",new Promise(function(){var _ref=_asyncToGenerator(_regeneratorRuntime.mark(function _callee3(resolve,reject){var _store$transaction3;var store,getCurrentPage,last,newContent,newSize,newMeta,pages,i,keyRange,_store$transaction4;return _regeneratorRuntime.wrap(function _callee3$(_context3){while(1)switch(_context3.prev=_context3.next){case 0:if(!(_this3._mode==="readonly")){_context3.next=3;break}reject(new Error("Instance is readonly mode only."));return _context3.abrupt("return");case 3:if(!(typeof version!=="number"&&version<=0)){_context3.next=6;break}reject(new Error("Version should be a positive number"));return _context3.abrupt("return");case 6:store=_this3._store;getCurrentPage=function getCurrentPage(){return new Promise(function(res){var req=store.get("".concat(_this3._path,"-").concat(PvFileIDB.createPage(_this3._pagePtr)));req.onsuccess=function(){if(req.result!==undefined){res(req.result.slice(0,_this3._pageOffset))}else{res(new Uint8Array(0))}}})};_context3.next=10;return getCurrentPage();case 10:last=_context3.sent;newContent=new Uint8Array(last.length+content.length);newContent.set(last);newContent.set(content,last.length);newSize=_this3._pagePtr*_this3._pageSize+newContent.length;newMeta={size:newSize,numPages:Math.ceil(newSize/_this3._pageSize),version:version,pageSize:_this3._pageSize};store.put(newMeta,_this3._path);pages=Math.ceil(newContent.length/_this3._pageSize);for(i=0;i=this._meta.numPages-1&&this._pageOffset>=this._meta.size%this._pageSize}},{key:"_store",get:function get(){return this._db.transaction(PV_FILE_STORE,this._mode).objectStore(PV_FILE_STORE)}}],[{key:"open",value:function open(path,mode){if(!self.indexedDB){var error=new Error("IndexedDB is not supported");error.name="IndexedDBNotSupported";throw error}return new Promise(function(){var _ref3=_asyncToGenerator(_regeneratorRuntime.mark(function _callee7(resolve,reject){var db,req,_error2;return _regeneratorRuntime.wrap(function _callee7$(_context7){while(1)switch(_context7.prev=_context7.next){case 0:_context7.prev=0;_context7.next=3;return getDB();case 3:db=_context7.sent;req=db.transaction(PV_FILE_STORE,"readwrite").objectStore(PV_FILE_STORE).get(path);req.onerror=function(){reject(req.error)};req.onsuccess=function(){var meta=req.result;var dbMode=mode.includes("r")?"readonly":"readwrite";if(meta===undefined&&dbMode==="readonly"){var _error=new Error("'".concat(path,"' doesn't exist."));_error.name="FileNotExists";reject(_error);return}var fileIDB=new PvFileIDB(path,meta,db,dbMode);if(mode.includes("a")){fileIDB.seek(0,2)}resolve(fileIDB)};_context7.next=12;break;case 9:_context7.prev=9;_context7.t0=_context7["catch"](0);if(_context7.t0.name==="InvalidStateError"){_error2=new Error("IndexedDB is not supported");_error2.name="IndexedDBNotSupported";reject(_error2)}else{reject(_context7.t0)}case 12:case"end":return _context7.stop()}},_callee7,null,[[0,9]])}));return function(_x8,_x9){return _ref3.apply(this,arguments)}}())}},{key:"createPage",value:function createPage(page){return("00000"+page).slice(-6)}}])}(PvFile);function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}var PvFileMem=function(_PvFile){function PvFileMem(path,meta,db,mode){var _this;_classCallCheck(this,PvFileMem);_this=_callSuper(this,PvFileMem);_this._pos=0;_this._path=path;_this._meta=meta;_this._mode=mode;return _this}_inherits(PvFileMem,_PvFile);return _createClass(PvFileMem,[{key:"close",value:function close(){return}},{key:"read",value:function read(size,count){if(!this.exists()){throw new Error("'".concat(this._path,"' doesn't exist."))}if(this._isEOF){var err=new Error("EOF");err.name="EndOfFile";throw err}var toCopy=Math.min(size*count,this._file.length-this._pos);var totalElems=toCopy-toCopy%size;var buffer=new Uint8Array(totalElems);buffer.set(this._file.slice(this._pos,this._pos+totalElems),0);this._pos+=totalElems;return buffer}},{key:"write",value:function write(content){var version=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;var newFile=new Uint8Array(this._pos+content.length);if(this._file!==undefined){newFile.set(this._file.slice(0,this._pos));newFile.set(content,this._pos)}else{newFile.set(content)}this._file=newFile;this._pos+=content.length}},{key:"seek",value:function seek(offset,whence){if(!this.exists()&&this._mode==="readonly"){throw new Error("'".concat(this._path,"' doesn't exist."))}if(!this.exists()){throw new Error("'".concat(this._path,"' doesn't exist."))}if(offset<0){var err=new Error("EOF");err.name="EndOfFile";throw err}var newOffset;if(whence===0){newOffset=Math.min(offset,this._file.length)}else if(whence===1){newOffset=Math.min(this._pos+offset,this._file.length)}else if(whence===2){newOffset=Math.min(this._file.length+offset,this._file.length)}else{throw new Error("Invalid operation: ".concat(whence,"."))}this._pos=newOffset}},{key:"tell",value:function tell(){if(!this.exists()){return-1}return this._pos}},{key:"remove",value:function(){var _remove=_asyncToGenerator(_regeneratorRuntime.mark(function _callee(){return _regeneratorRuntime.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:if(this.exists()){_context.next=2;break}throw new Error("ENOENT");case 2:PvFileMem._memFiles["delete"](this._path);this._pos=0;case 4:case"end":return _context.stop()}},_callee,this)}));function remove(){return _remove.apply(this,arguments)}return remove}()},{key:"exists",value:function exists(){return this._file!==undefined}},{key:"_isEOF",get:function get(){return this._pos>=this._file.length}},{key:"_file",get:function get(){return PvFileMem._memFiles.get(this._path)},set:function set(content){PvFileMem._memFiles.set(this._path,content)}}],[{key:"open",value:function open(path,mode){var file=PvFileMem._memFiles.get(path);var dbMode=mode.includes("r")?"readonly":"readwrite";if(file===undefined&&dbMode==="readonly"){var error=new Error("'".concat(path,"' doesn't exist."));error.name="FileNotExists";throw error}var fileMem=new PvFileMem(path,undefined,undefined,dbMode);if(mode.includes("a")){fileMem.seek(0,2)}return fileMem}}])}(PvFile);PvFileMem._memFiles=new Map;function unsignedAddress(address){if(address<0){return address>>>0}return address}function _arrayWithHoles(r){if(Array.isArray(r))return r}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayLikeToArray$2(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _unsupportedIterableToArray$1(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray$1(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray$1(r,a):void 0}}function _arrayLikeToArray$1(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e=16){this.endComputePass();this.flushCommandEncoder()}}},{key:"endComputePass",value:function endComputePass(){if(this._passEncoder){this._passEncoder.end();this._passEncoder=null}}},{key:"getBuffer",value:function getBuffer(sizeBytes,usage){var mappedAtCreation=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var label=arguments.length>3?arguments[3]:undefined;var key=this.getBufferKey(sizeBytes,usage);if(this.bufferReusePool.has(key)){var buffers=this.bufferReusePool.get(key);if(buffers&&buffers.length>0){return buffers.pop()}}return this.device.createBuffer({size:sizeBytes*Uint8Array.BYTES_PER_ELEMENT,usage:usage,mappedAtCreation:mappedAtCreation,label:label})}},{key:"scheduleUniformBufferForRelease",value:function scheduleUniformBufferForRelease(buffer){this._uniformBuffersPendingRelease.push(buffer)}},{key:"releaseBuffer",value:function releaseBuffer(buffer){var clearBuffer=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;if(clearBuffer){this.endComputePass();this.commandEncoder.clearBuffer(buffer,0,buffer.size)}var key=this.getBufferKey(buffer.size,buffer.usage);if(!this.bufferReusePool.has(key)){this.bufferReusePool.set(key,[])}this.bufferReusePool.get(key).push(buffer)}},{key:"sync",value:function(){var _sync=_asyncToGenerator(_regeneratorRuntime.mark(function _callee(){var _this=this;var _iterator,_step,k,buffers,_iterator3,_step3,b,_loop,_i,_Object$entries;return _regeneratorRuntime.wrap(function _callee$(_context3){while(1)switch(_context3.prev=_context3.next){case 0:this.endComputePass();this.flushCommandEncoder();_context3.next=4;return this.device.queue.onSubmittedWorkDone();case 4:_iterator=_createForOfIteratorHelper$1(this.bufferReusePool.keys());try{for(_iterator.s();!(_step=_iterator.n()).done;){k=_step.value;buffers=this.bufferReusePool.get(k);if(buffers&&buffers.length>0){_iterator3=_createForOfIteratorHelper$1(buffers);try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){b=_step3.value;b===null||b===void 0||b.destroy()}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}}}}catch(err){_iterator.e(err)}finally{_iterator.f()}this.bufferReusePool.clear();_loop=_regeneratorRuntime.mark(function _loop(){var _Object$entries$_i,shaderName,timestampBuffers,_iterator2,_step2,_loop2;return _regeneratorRuntime.wrap(function _loop$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:_Object$entries$_i=_slicedToArray(_Object$entries[_i],2),shaderName=_Object$entries$_i[0],timestampBuffers=_Object$entries$_i[1];if(!_this.shaderTimes[shaderName]){_this.shaderTimes[shaderName]=[]}_iterator2=_createForOfIteratorHelper$1(timestampBuffers);_context2.prev=3;_loop2=_regeneratorRuntime.mark(function _loop2(){var timestampBuffer;return _regeneratorRuntime.wrap(function _loop2$(_context){while(1)switch(_context.prev=_context.next){case 0:timestampBuffer=_step2.value;timestampBuffer.mapAsync(GPUMapMode.READ).then(function(){var times=new BigInt64Array(timestampBuffer.getMappedRange());var timeDif=times[1]-times[0];timestampBuffer.unmap();timestampBuffer.destroy();_this.shaderTimes[shaderName].push(timeDif)});case 2:case"end":return _context.stop()}},_loop2)});_iterator2.s();case 6:if((_step2=_iterator2.n()).done){_context2.next=10;break}return _context2.delegateYield(_loop2(),"t0",8);case 8:_context2.next=6;break;case 10:_context2.next=15;break;case 12:_context2.prev=12;_context2.t1=_context2["catch"](3);_iterator2.e(_context2.t1);case 15:_context2.prev=15;_iterator2.f();return _context2.finish(15);case 18:case"end":return _context2.stop()}},_loop,null,[[3,12,15,18]])});_i=0,_Object$entries=Object.entries(this.timestampBuffers);case 9:if(!(_i<_Object$entries.length)){_context3.next=14;break}return _context3.delegateYield(_loop(),"t0",11);case 11:_i++;_context3.next=9;break;case 14:this.timestampBuffers={};case 15:case"end":return _context3.stop()}},_callee,this)}));function sync(){return _sync.apply(this,arguments)}return sync}()},{key:"reportShaderTimes",value:function reportShaderTimes(){for(var _i2=0,_Object$entries2=Object.entries(this.shaderTimes);_i2<_Object$entries2.length;_i2++){var _Object$entries2$_i=_slicedToArray(_Object$entries2[_i2],2),shaderName=_Object$entries2$_i[0],shaderTimes=_Object$entries2$_i[1];var timeSum=0n;var _iterator4=_createForOfIteratorHelper$1(shaderTimes),_step4;try{for(_iterator4.s();!(_step4=_iterator4.n()).done;){var shaderTime=_step4.value;timeSum=timeSum+shaderTime}}catch(err){_iterator4.e(err)}finally{_iterator4.f()}var totalSeconds=Number(timeSum)*1e-9;var avgSeconds=(totalSeconds/shaderTimes.length).toFixed(7);console.log("".concat(shaderName,", ").concat(totalSeconds.toFixed(5),", ").concat(avgSeconds))}this.shaderTimes={}}},{key:"flushCommandEncoder",value:function flushCommandEncoder(){var _this2=this;this.device.queue.submit([this.commandEncoder.finish()]);this._commandEncoder=null;this._numCommandsEncoded=0;this._stageBuffersPendingMap.forEach(function(buffer){buffer.destroy()});this._stageBuffersPendingMap=[];this._uniformBuffersPendingRelease.forEach(function(buffer){_this2.releaseBuffer(buffer,false)});this._uniformBuffersPendingRelease=[]}},{key:"writeBuffer",value:function writeBuffer(sizeBytes,offset,srcArray,dstBuffer){var stagingBuffer=this.getBuffer(sizeBytes,GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC,true);new Uint8Array(stagingBuffer.getMappedRange()).set(srcArray);stagingBuffer.unmap();this._stageBuffersPendingMap.push(stagingBuffer);this.endComputePass();this.commandEncoder.copyBufferToBuffer(stagingBuffer,0,dstBuffer,offset,sizeBytes);this.numCommandsEncoded++}},{key:"dispatchComputerShader",value:function dispatchComputerShader(bindGroup,pipeline,shaderName,workgroupCountX,workgroupCountY,workgroupCountZ){if(this.isTimerEnabled){var querySet=this.device.createQuerySet({type:"timestamp",count:2});var timestampWrites={querySet:querySet,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1};this.endComputePass();this._passEncoder=this.commandEncoder.beginComputePass({timestampWrites:timestampWrites});this._passEncoder.setBindGroup(0,bindGroup);this._passEncoder.setPipeline(pipeline);this._passEncoder.dispatchWorkgroups(workgroupCountX,workgroupCountY,workgroupCountZ);this.endComputePass();var size=2*BigInt64Array.BYTES_PER_ELEMENT;var resolveBuffer=this.device.createBuffer({size:size,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC});this.commandEncoder.resolveQuerySet(querySet,0,2,resolveBuffer,0);var resultBuffer=this.device.createBuffer({size:size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});this.commandEncoder.copyBufferToBuffer(resolveBuffer,0,resultBuffer,0,size);if(!this.timestampBuffers[shaderName]){this.timestampBuffers[shaderName]=[]}this.timestampBuffers[shaderName].push(resultBuffer);this.numCommandsEncoded+=3}else{if(!this._passEncoder){this._passEncoder=this.commandEncoder.beginComputePass()}this._passEncoder.setBindGroup(0,bindGroup);this._passEncoder.setPipeline(pipeline);this._passEncoder.dispatchWorkgroups(workgroupCountX,workgroupCountY,workgroupCountZ);this.numCommandsEncoded++}}}])}();var PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE=256;var gpuDevices=new Map;var gpuBuffers=new Map;var emptyShader="\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main_empty() {}\n";var shaderEntryPoint="main";var PRECOMPUTE_ENCODING_SHADER_NAME="pv_picollm_attention_precompute_encoding_shader";var attentionPrecomputeEncodingShaderSource="\nstruct argsStruct {\n dimension: u32,\n steps: u32,\n theta: f32,\n encoding_offset: u32,\n rope_scale: f32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar encoding: array;\n\n@group(0) @binding(2)\nvar rope_scales: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3,\n @builtin(num_workgroups) num_workgroups: vec3\n) {\n let ts = workgroup_id.x;\n let ds = local_id.x;\n \n for (var t = ts; t < args.steps; t += num_workgroups.x) {\n for (var d = ds; d < (args.dimension / 2u); d += workgroup_size_x) {\n let f = 2u * d;\n let x = f32(t) / (f32(rope_scales[f >> 1]) * pow(args.theta, f32(f) / f32(args.dimension)));\n let encoding_idx = args.encoding_offset + (t * args.dimension) + f;\n encoding[encoding_idx] = cos(x) * args.rope_scale;\n encoding[encoding_idx + 1] = sin(x) * args.rope_scale;\n }\n }\n}\n\n".concat(emptyShader);var loadAttentionPrecomputeEncodingShader=function loadAttentionPrecomputeEncodingShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention precompute encoding bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention precompute encoding pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention precompute encoding shader module",code:attentionPrecomputeEncodingShaderSource});var computePipeline=device.createComputePipeline({label:"attention precompute encoding pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ENCODE_ROPE_INTERLEAVED_SHADER_NAME="pv_picollm_attention_encode_rope_interleaved_shader";var attentionEncodeRopeInterleavedShaderSource="\nstruct argsStruct { \n n: u32,\n num_heads: u32,\n head_dimension: u32,\n rope_dimension: u32,\n position: u32,\n encoding_offset: u32,\n x_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar encoding: array;\n\n@group(0) @binding(2)\nvar x: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3,\n @builtin(num_workgroups) num_workgroups: vec3\n) {\n let ts = workgroup_id.x;\n let h = workgroup_id.y;\n let ds = local_id.x;\n\n for (var t = ts; t < args.n; t += num_workgroups.x) {\n let x_start = args.x_offset + (t * args.num_heads + h) * args.head_dimension;\n let encoding_start = args.encoding_offset + ((t + args.position) * args.rope_dimension); \n for (var d = ds; d < (args.head_dimension / 2u); d += workgroup_size_x) {\n let i = 2u * d;\n let x_idx = x_start + i;\n let encoding_idx = encoding_start + i;\n \n let re = x[x_idx];\n let im = x[x_idx + 1];\n x[x_idx] = (re * encoding[encoding_idx]) - (im * encoding[encoding_idx + 1]);\n x[x_idx + 1] = (re * encoding[encoding_idx + 1]) + (im * encoding[encoding_idx]);\n }\n }\n}\n\n".concat(emptyShader);var loadAttentionEncodeRopeInterleavedShader=function loadAttentionEncodeRopeInterleavedShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention encode rope interleave bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention encode rope interleave pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention encode rope interleave shader module",code:attentionEncodeRopeInterleavedShaderSource});var computePipeline=device.createComputePipeline({label:"attention encode rope interleave pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ENCODE_SHADER_NAME="pv_picollm_attention_encode_shader";var attentionEncodeShaderSource="\nstruct argsStruct { \n n: u32,\n num_heads: u32,\n head_dimension: u32,\n rope_dimension: u32,\n position: u32,\n encoding_offset: u32,\n x_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar encoding: array;\n\n@group(0) @binding(2)\nvar x: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3,\n @builtin(num_workgroups) num_workgroups: vec3\n) {\n let ts = workgroup_id.x;\n let h = workgroup_id.y;\n let ds = local_id.x;\n\n for (var t = ts; t < args.n; t += num_workgroups.x) {\n let half_rope = (args.rope_dimension / 2);\n let xr_start = args.x_offset + ((t * args.num_heads + h) * args.head_dimension);\n let xi_start = xr_start + half_rope;\n let encoding_start = args.encoding_offset + ((t + args.position) * args.rope_dimension); \n for (var d = ds; d < half_rope; d += workgroup_size_x) {\n let xr_idx = xr_start + d;\n let xi_idx = xi_start + d;\n let encoding_idx = encoding_start + (2 * d);\n\n let re = x[xr_idx];\n let im = x[xi_idx];\n x[xr_idx] = (re * encoding[encoding_idx]) - (im * encoding[encoding_idx + 1]);\n x[xi_idx] = (re * encoding[encoding_idx + 1]) + (im * encoding[encoding_idx]);\n }\n }\n}\n\n".concat(emptyShader);var loadAttentionEncodeShader=function loadAttentionEncodeShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention encode bind layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention encode pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention encode shader",code:attentionEncodeShaderSource});var computePipeline=device.createComputePipeline({label:"attention encode pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var DOT_PRODUCT_SHADER_NAME="pv_picollm_attention_dot_product_shader";var attentionDotProductShaderSource="\nstruct argsStruct { \n n: u32,\n tq: u32,\n head_dimension: u32,\n num_heads: u32,\n num_kv_heads: u32,\n window_length: u32,\n start: u32,\n norm: f32,\n length1: u32,\n num_keys: u32,\n query_offset: u32,\n keys_offset: u32,\n key_intercepts_offset: u32,\n key_slopes_offset: u32,\n scores_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar query: array;\n\n@group(0) @binding(2)\nvar keys: array;\n\n@group(0) @binding(3)\nvar key_intercepts: array;\n\n@group(0) @binding(4)\nvar key_slopes: array;\n\n@group(0) @binding(5)\nvar scores: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.num_heads) {\n return;\n }\n\n let head = global_id.x / (args.num_heads / args.num_kv_heads);\n \n let head_offset = head * args.window_length;\n let start_index = head_offset + args.start;\n \n let keys_local_a = args.keys_offset + (start_index * args.head_dimension);\n let key_intercepts_local_a = args.key_intercepts_offset + start_index; \n let key_slopes_local_a = args.key_slopes_offset + start_index;\n \n let keys_local_b = args.keys_offset + (head_offset * args.head_dimension);\n let key_intercepts_local_b = args.key_intercepts_offset + head_offset; \n let key_slopes_local_b = args.key_slopes_offset + head_offset;\n \n let scores_local = args.scores_offset + (global_id.x * args.num_keys);\n let query_local = args.query_offset + (((global_id.x * args.n) + args.tq) * args.head_dimension);\n \n for (var i = 0u; i < args.head_dimension; i++) { \n for (var k = 0u; k < args.num_keys; k++) {\n if (k < args.length1) { \n let key_idx = keys_local_a + (k * args.head_dimension) + i;\n let key_val = f32(extractBits(keys[key_idx / 4], (i * 8u) % 32u, 8u));\n let tmp = query[query_local + i] * (key_intercepts[key_intercepts_local_a + k] + (key_slopes[key_slopes_local_a + k] * key_val));\n scores[scores_local + k] += tmp;\n }\n else {\n let j = k - args.length1;\n let key_idx = keys_local_b + (j * args.head_dimension) + i;\n let key_val = f32(extractBits(keys[key_idx / 4], (i * 8u) % 32u, 8u));\n let tmp = query[query_local + i] * (key_intercepts[key_intercepts_local_b + j] + (key_slopes[key_slopes_local_b + j] * key_val));\n scores[scores_local + k] += tmp;\n }\n } \n }\n \n for (var k = 0u; k < args.num_keys; k++) {\n scores[scores_local + k] *= args.norm;\n }\n}\n\n".concat(emptyShader);var loadAttentionDotProductShader=function loadAttentionDotProductShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention dot product bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention dot product pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention dot product shader module",code:attentionDotProductShaderSource});var computePipeline=device.createComputePipeline({label:"attention dot product pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var SOFTMAX_SHADER_NAME="pv_picollm_attention_softmax_shader";var attentionSoftmaxShaderSource="\nstruct argsStruct { \n num_heads: u32,\n num_keys: u32,\n scores_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar scores: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.num_heads) {\n return;\n }\n\n let scores_start = args.scores_offset + (global_id.x * args.num_keys);\n \n var max_index: u32 = 0;\n for (var i = 1u; i < args.num_keys; i++) {\n if (scores[scores_start + i] > scores[scores_start + max_index]) {\n max_index = i;\n }\n }\n let max: f32 = scores[scores_start + max_index];\n\n var sum: f32 = 0.0;\n for (var i = 0u; i < args.num_keys; i++) {\n scores[scores_start + i] = exp(scores[scores_start + i] - max);\n sum += scores[scores_start + i];\n }\n\n for (var i = 0u; i < args.num_keys; i++) {\n scores[scores_start + i] /= sum;\n }\n}\n\n".concat(emptyShader);var loadAttentionSoftmaxShader=function loadAttentionSoftmaxShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention softmax bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention softmax pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention softmax shader module",code:attentionSoftmaxShaderSource});var computePipeline=device.createComputePipeline({label:"attention softmax pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var FIR_SHADER_NAME="pv_picollm_attention_fir_shader";var attentionFirShaderSource="\nstruct argsStruct { \n length1: u32,\n length2: u32,\n tq: u32,\n head_dimension: u32,\n num_heads: u32,\n num_kv_heads: u32,\n window_length: u32,\n start: u32,\n values_offset: u32,\n value_intercepts_offset: u32,\n value_slopes_offset: u32,\n scores_offset: u32,\n output_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar values: array;\n\n@group(0) @binding(2)\nvar value_intercepts: array;\n\n@group(0) @binding(3)\nvar value_slopes: array;\n\n@group(0) @binding(4)\nvar scores: array;\n\n@group(0) @binding(5)\nvar output: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.num_heads) {\n return;\n }\n\n let head = global_id.x / (args.num_heads / args.num_kv_heads);\n\n let head_offset = head * args.window_length;\n let start_index = head_offset + args.start;\n\n let values_local_a = args.values_offset + (start_index * args.head_dimension);\n let value_intercepts_local_a = args.value_intercepts_offset + start_index;\n let value_slopes_local_a = args.value_slopes_offset + start_index;\n let values_local_b = args.values_offset + (head_offset * args.head_dimension);\n let value_intercepts_local_b = args.value_intercepts_offset + head_offset;\n let value_slopes_local_b = args.value_slopes_offset + head_offset;\n let scores_local = args.scores_offset + (global_id.x * (args.length1 + args.length2));\n let output_local = args.output_offset + (((args.tq * args.num_heads) + global_id.x) * args.head_dimension);\n\n for (var i = 0u; i < args.head_dimension; i++) {\n var tmp: f32 = 0.0;\n for (var k = 0u; k < args.length1; k++) {\n let value_idx = values_local_a + (k * args.head_dimension) + i;\n let value_val = f32(extractBits(values[value_idx / 4], (i * 8u) % 32u, 8u));\n tmp += scores[scores_local + k] * (value_intercepts[value_intercepts_local_a + k] + (value_slopes[value_slopes_local_a + k] * value_val)); \n }\n for (var k = 0u; k < args.length2; k++) {\n let value_idx = values_local_b + (k * args.head_dimension) + i;\n let value_val = f32(extractBits(values[value_idx / 4], (i * 8u) % 32u, 8u));\n tmp += scores[scores_local + args.length1 + k] * (value_intercepts[value_intercepts_local_b + k] + (value_slopes[value_slopes_local_b + k] * value_val)); \n }\n output[output_local + i] = tmp;\n }\n}\n\n".concat(emptyShader);var loadAttentionFirShader=function loadAttentionFirShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention fir bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention fir pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention fir shader module",code:attentionFirShaderSource});var computePipeline=device.createComputePipeline({label:"attention fir pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var UPDATE_KV_SHADER_NAME="pv_picollm_attention_update_kv_shader";var attentionUpdateKvShaderSource="\nstruct argsStruct {\n n: u32,\n num_kv_heads: u32,\n window_length: u32,\n position: u32,\n head_dimension: u32,\n tf_offset: u32,\n kv_offset: u32,\n kv_intercepts_offset: u32,\n kv_slopes_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar tf: array;\n\n@group(0) @binding(2)\nvar kv: array;\n\n@group(0) @binding(3)\nvar kv_intercepts: array;\n\n@group(0) @binding(4)\nvar kv_slopes: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) { \n if (global_id.x >= args.num_kv_heads) {\n return;\n }\n \n for (var i = 0u; i < args.n; i++) {\n let index = (global_id.x * args.window_length) + ((args.position + i) % args.window_length);\n let tf_start = args.tf_offset + (((i * args.num_kv_heads) + global_id.x) * args.head_dimension);\n let kv_start = args.kv_offset + ((index * args.head_dimension) / 4);\n let kv_intercepts_start = args.kv_intercepts_offset + index;\n let kv_slopes_start = args.kv_slopes_offset + index;\n \n var xmax = tf[tf_start]; \n var xmin = tf[tf_start]; \n \n for (var j = 1u; j < args.head_dimension; j++) {\n xmax = max(xmax, tf[tf_start + j]);\n xmin = min(xmin, tf[tf_start + j]);\n }\n\n kv_intercepts[kv_intercepts_start] = xmin;\n kv_slopes[kv_slopes_start] = f32(xmax - xmin) / 255.0;\n\n for (var j = 0u; j < args.head_dimension; j++) {\n let kv_idx = kv_start + (j / 4);\n let kv_val = u32(round((tf[tf_start + j] - xmin) / kv_slopes[kv_slopes_start])); \n kv[kv_idx] = insertBits(kv[kv_idx], extractBits(kv_val, 0u, 8u), (j * 8u) % 32u, 8u); \n }\n }\n}\n\n".concat(emptyShader);var loadAttentionUpdateKvShader=function loadAttentionUpdateKvShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention update kv bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention update kv pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention update kv shader module",code:attentionUpdateKvShaderSource});var computePipeline=device.createComputePipeline({label:"attention update kv pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var TRANSPOSE_QUERY_SHADER_NAME="pv_picollm_attention_transpose_query_shader";var attentionTransposeQueryShaderSource="\nstruct argsStruct {\n n: u32,\n num_heads: u32,\n head_dimension: u32,\n tf_offset: u32,\n hf_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar tf: array;\n\n@group(0) @binding(2)\nvar hf: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(local_invocation_id) local_id : vec3\n) {\n\n if (workgroup_id.x >= args.num_heads || workgroup_id.y >= args.n || local_id.x >= args.head_dimension) {\n return;\n }\n \n let tf_idx = args.tf_offset + (workgroup_id.y * args.num_heads * args.head_dimension) + (workgroup_id.x * args.head_dimension) + local_id.x; \n let hf_idx = args.hf_offset + (workgroup_id.x * args.n * args.head_dimension) + (workgroup_id.y * args.head_dimension) + local_id.x; \n hf[hf_idx] = tf[tf_idx];\n}\n\n".concat(emptyShader);var loadAttentionTransposeQueryShader=function loadAttentionTransposeQueryShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention transpose query bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention transpose query pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention transpose query shader module",code:attentionTransposeQueryShaderSource});var computePipeline=device.createComputePipeline({label:"attention transpose query pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var attentionShaders=_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({},PRECOMPUTE_ENCODING_SHADER_NAME,loadAttentionPrecomputeEncodingShader),ENCODE_ROPE_INTERLEAVED_SHADER_NAME,loadAttentionEncodeRopeInterleavedShader),ENCODE_SHADER_NAME,loadAttentionEncodeShader),DOT_PRODUCT_SHADER_NAME,loadAttentionDotProductShader),SOFTMAX_SHADER_NAME,loadAttentionSoftmaxShader),FIR_SHADER_NAME,loadAttentionFirShader),UPDATE_KV_SHADER_NAME,loadAttentionUpdateKvShader),TRANSPOSE_QUERY_SHADER_NAME,loadAttentionTransposeQueryShader);var SILU_SHADER_NAME="pv_picollm_feed_forward_silu_shader";var feedForwardSiluShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n x[global_id.x] = x[global_id.x] / (1.0 + exp(-x[global_id.x]));\n}\n\n".concat(emptyShader);var loadFeedForwardSiluShader=function loadFeedForwardSiluShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff silu bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff silu pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff silu shader module",code:feedForwardSiluShaderSource});var computePipeline=device.createComputePipeline({label:"ff silu pipline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var GELU_SHADER_NAME="pv_picollm_feed_forward_gelu_shader";var feedForwardGeluShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\nconst a1: f32 = 0.254829592;\nconst a2: f32 = -0.284496736;\nconst a3: f32 = 1.421413741;\nconst a4: f32 = -1.453152027;\nconst a5: f32 = 1.061405429;\nconst p: f32 = 0.3275911;\n\n// A&S formula 7.1.26\nfn erf(x: f32) -> f32 { \n var sign: f32 = 1.0;\n if (x < 0) {\n sign = -1.0;\n }\n var x_abs: f32 = abs(x);\n \n let t: f32 = 1.0 / fma(p, x_abs, 1.0);\n let y: f32 = 1.0 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * exp(-x_abs * x_abs);\n\n return sign * y;\n}\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n x[global_id.x] = 0.5 * x[global_id.x] * (1.0 + erf(x[global_id.x] * 0.7071067811865475));\n}\n\n".concat(emptyShader);var loadFeedForwardGeluShader=function loadFeedForwardGeluShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff gelu bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff gelu pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff gelu shader module",code:feedForwardGeluShaderSource});var computePipeline=device.createComputePipeline({label:"ff gelu pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ALMOST_GELU_SHADER_NAME="pv_picollm_feed_forward_almost_gelu_shader";var feedForwardAlmostGeluShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n x[global_id.x] = 0.5 * x[global_id.x] * (1 + tanh(0.7978845608028654 * (x[global_id.x] + (0.044715f * x[global_id.x] * x[global_id.x] * x[global_id.x]))));\n}\n\n".concat(emptyShader);var loadFeedForwardAlmostGeluShader=function loadFeedForwardAlmostGeluShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff almost gelu bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff almost gelu pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff almost gelu shader module",code:feedForwardAlmostGeluShaderSource});var computePipeline=device.createComputePipeline({label:"ff almost gelu pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var MULTIPLY_BUFFERS_SHADER_NAME="pv_picollm_feed_forward_multiply_buffers_shader";var feedForwardMultiplyBuffersShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n y[global_id.x] *= x[global_id.x];\n}\n\n".concat(emptyShader);var loadFeedForwardMultiplyBuffersShader=function loadFeedForwardMultiplyBuffersShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff multiply buffers bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff multiply buffers pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff multiply buffers shader module",code:feedForwardMultiplyBuffersShaderSource});var computePipeline=device.createComputePipeline({label:"ff multiply buffers pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var feedForwardShaders=_defineProperty(_defineProperty(_defineProperty(_defineProperty({},SILU_SHADER_NAME,loadFeedForwardSiluShader),GELU_SHADER_NAME,loadFeedForwardGeluShader),ALMOST_GELU_SHADER_NAME,loadFeedForwardAlmostGeluShader),MULTIPLY_BUFFERS_SHADER_NAME,loadFeedForwardMultiplyBuffersShader);var FORWARD_SHADER_NAME$1="pv_picollm_gate_forward_shader";var gateForwardShaderSource="\n\nstruct pv_picollm_gate_ix_t {\n i: u32,\n x: f32,\n}\n\n@group(0) @binding(0)\nvar y: array;\n\n@group(0) @binding(1)\nvar indices: array;\n\n@group(0) @binding(2)\nvar weights: array;\n\noverride n: u32 = 0;\noverride k: u32 = 0;\noverride num_experts: u32 = 0;\n\noverride y_offset: u32 = 0;\noverride indices_offset: u32 = 0;\noverride weights_offset: u32 = 0;\n\nvar ixs: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(global_invocation_id) global_id : vec3\n) {\n if (global_id.x >= n) {\n return;\n }\n \n var y_start: u32 = y_offset + global_id.x * num_experts;\n for (var j = 0u; j < num_experts; j++) {\n ixs[j].i = j;\n ixs[j].x = y[y_start + j];\n }\n\n for (var i = 0u; i < num_experts - 1; i++) {\n for (var j = 0u; j < num_experts - i - 1; j++) {\n if (ixs[j].x < ixs[j + 1].x) {\n let tmp = ixs[j];\n ixs[j] = ixs[j + 1];\n ixs[j + 1] = tmp;\n }\n }\n }\n\n for (var j = 0u; j < k; j++) {\n indices[indices_offset + (global_id.x * k) + j] = ixs[j].i;\n weights[weights_offset + (global_id.x * k) + j] = ixs[j].x;\n }\n\n var max_weight: f32 = weights[weights_offset + (global_id.x * k)];\n for (var j = 1u; j < k; j++) {\n max_weight = max(max_weight, weights[weights_offset + (global_id.x * k) + j]);\n }\n\n var sum_weight: f32 = 0.0;\n for (var j = 0u; j < k; j++) {\n weights[weights_offset + (global_id.x * k) + j] = exp(weights[weights_offset + (global_id.x * k) + j] - max_weight);\n sum_weight += weights[weights_offset + (global_id.x * k) + j];\n }\n\n for (var j = 0u; j < k; j++) {\n weights[weights_offset + (global_id.x * k) + j] /= sum_weight;\n }\n}\n\n".concat(emptyShader);var loadGateForwardShader=function loadGateForwardShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"gate forward bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"gate forward pipeline",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"gate forward shader module",code:gateForwardShaderSource});var computePipeline=device.createComputePipeline({layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{num_experts:1}}});return{computePipeline:computePipeline,pipelineLayout:pipelineLayout,shaderModule:shaderModule}};var gateForwardShader=_defineProperty({},FORWARD_SHADER_NAME$1,loadGateForwardShader);var ADD_TO_BUFFER_SHADER_NAME$1="pv_picollm_moe_transformer_add_to_buffer_shader";var moeTransformerAddToBufferShaderSource="\nstruct argsStruct {\n n: u32, \n x_offset: u32,\n buffer_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar buffer: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n\n buffer[args.buffer_offset + global_id.x] += x[args.x_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadMoeTransformerAddToBufferShader=function loadMoeTransformerAddToBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"moe transformer add to buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"moe transformer add to buffer pipeline",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"moe transformer add to buffer shader module",code:moeTransformerAddToBufferShaderSource});var computePipeline=device.createComputePipeline({label:"moe transformer add to buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER_SHADER_NAME="pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer_shader";var moeTransformerMultiplyWeightAndToBufferShaderSource="\nstruct argsStruct {\n n: u32, \n weights_index: u32,\n y_index: u32,\n weights_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weights: array;\n\n@group(0) @binding(2)\nvar x: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n y[args.y_offset + args.y_index + global_id.x] += weights[args.weights_index] + x[args.x_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadMoeTransformerMultiplyWeightAndAddToBufferShader=function loadMoeTransformerMultiplyWeightAndAddToBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"moe transformer multiply weight and add to buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"moe transformer multiply weight and add to buffer pipeline",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"moe transformer multiply weight and add to buffer shader module",code:moeTransformerMultiplyWeightAndToBufferShaderSource});var computePipeline=device.createComputePipeline({label:"moe transformer multiply weight and add to buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var ADD_BUFFERS_SHADER_NAME$1="pv_picollm_moe_transformer_add_buffers_shader";var moeTransformerAddBuffersShaderSource="\nstruct argsStruct {\n n: u32, \n buffer1_offset: u32,\n buffer2_offset: u32,\n y_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar buffer1: array;\n\n@group(0) @binding(2)\nvar buffer2: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n y[args.y_offset + global_id.x] = buffer1[args.buffer1_offset + global_id.x] + buffer2[args.buffer2_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadMoeTransformerAddBuffersShader=function loadMoeTransformerAddBuffersShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"moe transformer add buffers bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"moe transformer add buffers pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"moe transformer add buffers shader module",code:moeTransformerAddBuffersShaderSource});var computePipeline=device.createComputePipeline({label:"moe transformer add buffers pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var moeTransformerForwardShaders=_defineProperty(_defineProperty(_defineProperty({},ADD_TO_BUFFER_SHADER_NAME$1,loadMoeTransformerAddToBufferShader),MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER_SHADER_NAME,loadMoeTransformerMultiplyWeightAndAddToBufferShader),ADD_BUFFERS_SHADER_NAME$1,loadMoeTransformerAddBuffersShader);var sdataReduce="\n for (var s: u32 = workgroup_size_x / 2; s > 0; s >>= 1) {\n if tid < s {\n sdata[tid] += sdata[tid + s];\n }\n workgroupBarrier();\n }\n";var dividePadFunction="\n fn divide_pad(a: u32, b: u32) -> u32 { \n return (a + b - 1) / b;\n }\n";var FORWARD_MULTI_BUFFER_SHADER_NAME$1="pv_picollm_norm_forward_multi_buffer_shader";var FORWARD_SINGLE_BUFFER_SHADER_NAME$1="pv_picollm_norm_forward_single_buffer_shader";var normForwardShaderSource=function normForwardShaderSource(isMulti){return"\nstruct argsStruct {\n n: u32,\n dimension: u32,\n remainder: u32,\n remainder_start: u32, \n eps: f32, \n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weight: array;\n\n".concat(isMulti?"\n@group(0) @binding(2)\nvar x: array;\n\n@group(0) @binding(3) \nvar y: array;\n":" \n@group(0) @binding(2)\nvar x: array;\n","\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\nvar sdata: array, workgroup_size_x>;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3\n) {\n let tid = local_id.x;\n let m = workgroup_id.x;\n let block_size = workgroup_size_x;\n \n var power_vec: vec4;\n let x_start: u32 = args.x_offset + (m * args.dimension);\n let skip = tid * 4;\n let shift = (block_size * 4);\n for (var j = 0u; j + skip < args.remainder_start; j += shift) {\n let local_index = x_start + j + skip; \n\n let x_vec = vec4(\n x[local_index],\n x[local_index + 1],\n x[local_index + 2],\n x[local_index + 3]);\n \n power_vec += x_vec * x_vec; \n } \n \n if (tid == 0 && args.remainder > 0) {\n var remainder_vec = vec4(0.0, 0.0, 0.0, 0.0);\n let x_idx = x_start + args.remainder_start;\n for (var j = 0u; j < args.remainder; j++) { \n remainder_vec[j] = x[x_idx + j];\n } \n power_vec += remainder_vec * remainder_vec;\n }\n \n sdata[tid] = power_vec;\n workgroupBarrier();\n\n ").concat(sdataReduce,"\n \n let power = sdata[0].x + sdata[0].y + sdata[0].z + sdata[0].w;\n let norm: vec4 = vec4(1.0 / sqrt((power / f32(args.dimension)) + args.eps));\n \n let y_start: u32 = args.y_offset + (m * args.dimension);\n for (var j = 0u; j + skip < args.remainder_start; j += shift) {\n let local_index = j + skip;\n let x_idx = x_start + local_index;\n let x_vec = vec4(\n x[x_idx],\n x[x_idx + 1],\n x[x_idx + 2],\n x[x_idx + 3]);\n \n let weight_vec = vec4(\n weight[local_index],\n weight[local_index + 1],\n weight[local_index + 2],\n weight[local_index + 3]);\n let y_vec = x_vec * norm * weight_vec;\n \n let y_idx = y_start + local_index;\n").concat(isMulti?" \n y[y_idx] = y_vec.x;\n y[y_idx + 1] = y_vec.y;\n y[y_idx + 2] = y_vec.z;\n y[y_idx + 3] = y_vec.w;\n":" \n x[y_idx] = y_vec.x;\n x[y_idx + 1] = y_vec.y;\n x[y_idx + 2] = y_vec.z;\n x[y_idx + 3] = y_vec.w;\n"," \n }\n \n if (tid == 0 && args.remainder > 0) {\n let x_idx = x_start + args.remainder_start;\n let weight_idx = args.remainder_start; \n let y_idx = y_start + args.remainder_start;\n for (var j = 0u; j < args.remainder; j++) {\n").concat(isMulti?" \n y[y_idx + j] = x[x_idx + j] * norm[j] * weight[weight_idx + j];\n":" \n x[y_idx + j] = x[x_idx + j] * norm[j] * weight[weight_idx + j];\n"," \n } \n }\n}\n\n").concat(emptyShader)};var loadNormForwardShader=function loadNormForwardShader(device,isMulti){var entries=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}}];if(isMulti){entries.push({binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}});entries.push({binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}})}else{entries.push({binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}})}var bindGroupLayout=device.createBindGroupLayout({label:"norm forward ".concat(isMulti?"multi":"single"," buffer bind group layout"),entries:entries});var pipelineLayout=device.createPipelineLayout({label:"norm forward ".concat(isMulti?"multi":"single"," buffer pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"norm forward ".concat(isMulti?"multi":"single"," buffer shader module"),code:normForwardShaderSource(isMulti)});var computePipeline=device.createComputePipeline({label:"norm forward ".concat(isMulti?"multi":"single"," buffer pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var normForwardShader=_defineProperty(_defineProperty({},FORWARD_SINGLE_BUFFER_SHADER_NAME$1,function(device){return loadNormForwardShader(device,false)}),FORWARD_MULTI_BUFFER_SHADER_NAME$1,function(device){return loadNormForwardShader(device,true)});var FORWARD_MULTI_BUFFER_SHADER_NAME="pv_picollm_norm_layer_forward_multi_buffer_shader";var normLayerForwardMultiBufferShaderSource="\nstruct argsStruct {\n n: u32,\n dimension: u32,\n eps: f32,\n weight_offset: u32,\n bias_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weight: array;\n\n@group(0) @binding(2)\nvar bias: array;\n\n@group(0) @binding(3)\nvar x: array;\n\n@group(0) @binding(4)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n let x_start: u32 = args.x_offset + (global_id.x * args.dimension);\n\n var mean: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean += x[x_start + j];\n }\n mean /= f32(args.dimension);\n\n var mean2: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean2 += (x[x_start + j] - mean) * (x[x_start + j] - mean);\n }\n mean2 /= f32(args.dimension);\n\n var norm: f32 = 1.0 / sqrt(mean2 + args.eps);\n\n var y_start = args.y_offset + (global_id.x * args.dimension);\n for (var j = 0u; j < args.dimension; j++) {\n y[y_start + j] = ((x[x_start + j] - mean) * norm * weight[args.weight_offset + j]) + bias[args.bias_offset + j];\n }\n}\n\n".concat(emptyShader);var loadNormLayerForwardMultiBufferShader=function loadNormLayerForwardMultiBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"norm layer forward multi buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"norm layer forward multi buffer pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"norm layer forward multi buffer shader module",code:normLayerForwardMultiBufferShaderSource});var computePipeline=device.createComputePipeline({label:"norm layer forward multi buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var FORWARD_SINGLE_BUFFER_SHADER_NAME="pv_picollm_norm_layer_forward_single_buffer_shader";var normLayerForwardSingleBufferShaderSource="\nstruct argsStruct {\n n: u32,\n dimension: u32,\n eps: f32,\n weight_offset: u32,\n bias_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weight: array;\n\n@group(0) @binding(2)\nvar bias: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n let x_start: u32 = args.x_offset + (global_id.x * args.dimension);\n\n var mean: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean += y[x_start + j];\n }\n mean /= f32(args.dimension);\n\n var mean2: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean2 += (y[x_start + j] - mean) * (y[x_start + j] - mean);\n }\n mean2 /= f32(args.dimension);\n\n var norm: f32 = 1.0 / sqrt(mean2 + args.eps);\n\n var y_start = args.y_offset + (global_id.x * args.dimension);\n for (var j = 0u; j < args.dimension; j++) {\n y[y_start + j] = ((y[x_start + j] - mean) * norm * weight[args.weight_offset + j]) + bias[args.bias_offset + j];\n }\n}\n\n".concat(emptyShader);var loadNormLayerForwardSingleBufferShader=function loadNormLayerForwardSingleBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"norm layer forward single buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"norm layer forward single buffer pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"norm layer forward single buffer shader module",code:normLayerForwardSingleBufferShaderSource});var computePipeline=device.createComputePipeline({label:"norm layer forward single buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var normLayerForwardShader=_defineProperty(_defineProperty({},FORWARD_SINGLE_BUFFER_SHADER_NAME,loadNormLayerForwardSingleBufferShader),FORWARD_MULTI_BUFFER_SHADER_NAME,loadNormLayerForwardMultiBufferShader);var ADD_TO_BUFFER_SHADER_NAME="pv_picollm_transformer_add_to_buffer_shader";var transformerAddToBufferShaderSource="\nstruct argsStruct {\n n: u32,\n x_offset: u32,\n buffer_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar buffer: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n buffer[args.buffer_offset + global_id.x] += x[args.x_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadTransformerAddToBufferShader=function loadTransformerAddToBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"transformer add to buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"transformer add to buffer pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"transformer add to buffer shader module",code:transformerAddToBufferShaderSource});var computePipeline=device.createComputePipeline({label:"transformer add to buffer compute",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ADD_BUFFERS_SHADER_NAME="pv_picollm_transformer_add_buffers_shader";var transformerAddBuffersShaderSource="\n\nstruct argsStruct {\n n: u32,\n buffer1_offset: u32,\n buffer2_offset: u32,\n y_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar buffer1: array;\n\n@group(0) @binding(2)\nvar buffer2: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n y[args.y_offset + global_id.x] = buffer1[args.buffer1_offset + global_id.x] + buffer2[args.buffer2_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadTransformerAddBuffersShader=function loadTransformerAddBuffersShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"transformer add buffers bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"transformer add buffers pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"transformer add buffers shader module",code:transformerAddBuffersShaderSource});var computePipeline=device.createComputePipeline({label:"transformer add buffers pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var transformerForwardShaders=_defineProperty(_defineProperty({},ADD_TO_BUFFER_SHADER_NAME,loadTransformerAddToBufferShader),ADD_BUFFERS_SHADER_NAME,loadTransformerAddBuffersShader);var FORWARD_SHADER_NAME="pv_picollm_weight_float_forward_shader";var weightFloatForwardShaderSource="\n\nstruct argsStruct {\n nr: u32,\n nc: u32,\n w_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar w: array;\n\n@group(0) @binding(2)\nvar x: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(local_invocation_id) local_id : vec3\n) {\n if (local_id.x >= args.nr) {\n return;\n }\n let x_start: u32 = args.x_offset + (workgroup_id.x * args.nc);\n let y_idx: u32 = local_id.x + args.y_offset + (workgroup_id.x * args.nr);\n \n let w_start: u32 = args.w_offset + (local_id.x * args.nc);\n for (var j = 0u; j < args.nc; j++) {\n y[y_idx] += w[w_start + j] * x[x_start + j]; \n }\n}\n\n".concat(emptyShader);var loadWeightFloatForwardShader=function loadWeightFloatForwardShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight float forward bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight float forward pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight float forward shader module",code:weightFloatForwardShaderSource});var computePipeline=device.createComputePipeline({label:"weight float forward pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var weightFloatForwardShader=_defineProperty({},FORWARD_SHADER_NAME,loadWeightFloatForwardShader);var rowsPerBlock=16;var columnsPerBlock=8;var preprocessDim=16;var weightBlockSize=256;var unpackBlock128BitDepth3="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_3(packed_offset: u32) {\n let val_0 = blocks[packed_offset]; \n unpacked[0] = extractBits(val_0, 0u, 3u);\n unpacked[1] = extractBits(val_0, 3u, 3u);\n unpacked[2] = extractBits(val_0, 6u, 3u);\n unpacked[3] = extractBits(val_0, 9u, 3u);\n unpacked[4] = extractBits(val_0, 12u, 3u);\n unpacked[5] = extractBits(val_0, 15u, 3u);\n unpacked[6] = extractBits(val_0, 18u, 3u);\n unpacked[7] = extractBits(val_0, 21u, 3u);\n unpacked[8] = extractBits(val_0, 24u, 3u);\n unpacked[9] = extractBits(val_0, 27u, 3u);\n unpacked[10] = extractBits(val_0, 30u, 2u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[10] = insertBits(unpacked[10], extractBits(val_1, 0u, 1u), 2u, 1u);\n unpacked[11] = extractBits(val_1, 1u, 3u);\n unpacked[12] = extractBits(val_1, 4u, 3u);\n unpacked[13] = extractBits(val_1, 7u, 3u);\n unpacked[14] = extractBits(val_1, 10u, 3u);\n unpacked[15] = extractBits(val_1, 13u, 3u);\n unpacked[16] = extractBits(val_1, 16u, 3u);\n unpacked[17] = extractBits(val_1, 19u, 3u);\n unpacked[18] = extractBits(val_1, 22u, 3u);\n unpacked[19] = extractBits(val_1, 25u, 3u);\n unpacked[20] = extractBits(val_1, 28u, 3u);\n unpacked[21] = extractBits(val_1, 31u, 1u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[21] = insertBits(unpacked[21], extractBits(val_2, 0u, 2u), 1u, 2u); \n unpacked[22] = extractBits(val_2, 2u, 3u);\n unpacked[23] = extractBits(val_2, 5u, 3u);\n unpacked[24] = extractBits(val_2, 8u, 3u);\n unpacked[25] = extractBits(val_2, 11u, 3u);\n unpacked[26] = extractBits(val_2, 14u, 3u);\n unpacked[27] = extractBits(val_2, 17u, 3u);\n unpacked[28] = extractBits(val_2, 20u, 3u);\n unpacked[29] = extractBits(val_2, 23u, 3u);\n unpacked[30] = extractBits(val_2, 26u, 3u);\n unpacked[31] = extractBits(val_2, 29u, 3u);\n \n let val_3 = blocks[packed_offset + 3]; \n unpacked[32] = extractBits(val_3, 0u, 3u);\n unpacked[33] = extractBits(val_3, 3u, 3u);\n unpacked[34] = extractBits(val_3, 6u, 3u);\n unpacked[35] = extractBits(val_3, 9u, 3u);\n unpacked[36] = extractBits(val_3, 12u, 3u);\n unpacked[37] = extractBits(val_3, 15u, 3u);\n unpacked[38] = extractBits(val_3, 18u, 3u);\n unpacked[39] = extractBits(val_3, 21u, 3u);\n unpacked[40] = extractBits(val_3, 24u, 3u);\n unpacked[41] = extractBits(val_3, 27u, 3u);\n unpacked[42] = extractBits(val_3, 30u, 2u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[42] = insertBits(unpacked[42], extractBits(val_4, 0u, 1u), 2u, 1u);\n unpacked[43] = extractBits(val_4, 1u, 3u);\n unpacked[44] = extractBits(val_4, 4u, 3u);\n unpacked[45] = extractBits(val_4, 7u, 3u);\n unpacked[46] = extractBits(val_4, 10u, 3u);\n unpacked[47] = extractBits(val_4, 13u, 3u);\n unpacked[48] = extractBits(val_4, 16u, 3u);\n unpacked[49] = extractBits(val_4, 19u, 3u);\n unpacked[50] = extractBits(val_4, 22u, 3u);\n unpacked[51] = extractBits(val_4, 25u, 3u);\n unpacked[52] = extractBits(val_4, 28u, 3u);\n unpacked[53] = extractBits(val_4, 31u, 1u);\n \n let val_5 = blocks[packed_offset + 5];\n unpacked[53] = insertBits(unpacked[53], extractBits(val_5, 0u, 2u), 1u, 2u); \n unpacked[54] = extractBits(val_5, 2u, 3u);\n unpacked[55] = extractBits(val_5, 5u, 3u);\n unpacked[56] = extractBits(val_5, 8u, 3u);\n unpacked[57] = extractBits(val_5, 11u, 3u);\n unpacked[58] = extractBits(val_5, 14u, 3u);\n unpacked[59] = extractBits(val_5, 17u, 3u);\n unpacked[60] = extractBits(val_5, 20u, 3u);\n unpacked[61] = extractBits(val_5, 23u, 3u);\n unpacked[62] = extractBits(val_5, 26u, 3u);\n unpacked[63] = extractBits(val_5, 29u, 3u);\n \n let val_6 = blocks[packed_offset + 6];\n unpacked[64] = extractBits(val_6, 0u, 3u);\n unpacked[65] = extractBits(val_6, 3u, 3u);\n unpacked[66] = extractBits(val_6, 6u, 3u);\n unpacked[67] = extractBits(val_6, 9u, 3u);\n unpacked[68] = extractBits(val_6, 12u, 3u);\n unpacked[69] = extractBits(val_6, 15u, 3u);\n unpacked[70] = extractBits(val_6, 18u, 3u);\n unpacked[71] = extractBits(val_6, 21u, 3u);\n unpacked[72] = extractBits(val_6, 24u, 3u);\n unpacked[73] = extractBits(val_6, 27u, 3u);\n unpacked[74] = extractBits(val_6, 30u, 2u);\n \n let val_7 = blocks[packed_offset + 7];\n unpacked[74] = insertBits(unpacked[74], extractBits(val_7, 0u, 1u), 2u, 1u);\n unpacked[75] = extractBits(val_7, 1u, 3u);\n unpacked[76] = extractBits(val_7, 4u, 3u);\n unpacked[77] = extractBits(val_7, 7u, 3u);\n unpacked[78] = extractBits(val_7, 10u, 3u);\n unpacked[79] = extractBits(val_7, 13u, 3u);\n unpacked[80] = extractBits(val_7, 16u, 3u);\n unpacked[81] = extractBits(val_7, 19u, 3u);\n unpacked[82] = extractBits(val_7, 22u, 3u);\n unpacked[83] = extractBits(val_7, 25u, 3u);\n unpacked[84] = extractBits(val_7, 28u, 3u);\n unpacked[85] = extractBits(val_7, 31u, 1u);\n \n let val_8 = blocks[packed_offset + 8];\n unpacked[85] = insertBits(unpacked[85], extractBits(val_8, 0u, 2u), 1u, 2u); \n unpacked[86] = extractBits(val_8, 2u, 3u);\n unpacked[87] = extractBits(val_8, 5u, 3u);\n unpacked[88] = extractBits(val_8, 8u, 3u);\n unpacked[89] = extractBits(val_8, 11u, 3u);\n unpacked[90] = extractBits(val_8, 14u, 3u);\n unpacked[91] = extractBits(val_8, 17u, 3u);\n unpacked[92] = extractBits(val_8, 20u, 3u);\n unpacked[93] = extractBits(val_8, 23u, 3u);\n unpacked[94] = extractBits(val_8, 26u, 3u);\n unpacked[95] = extractBits(val_8, 29u, 3u);\n \n let val_9 = blocks[packed_offset + 9];\n unpacked[96] = extractBits(val_9, 0u, 3u);\n unpacked[97] = extractBits(val_9, 3u, 3u);\n unpacked[98] = extractBits(val_9, 6u, 3u);\n unpacked[99] = extractBits(val_9, 9u, 3u);\n unpacked[100] = extractBits(val_9, 12u, 3u);\n unpacked[101] = extractBits(val_9, 15u, 3u);\n unpacked[102] = extractBits(val_9, 18u, 3u);\n unpacked[103] = extractBits(val_9, 21u, 3u);\n unpacked[104] = extractBits(val_9, 24u, 3u);\n unpacked[105] = extractBits(val_9, 27u, 3u);\n unpacked[106] = extractBits(val_9, 30u, 2u);\n \n let val_10 = blocks[packed_offset + 10];\n unpacked[106] = insertBits(unpacked[106], extractBits(val_10, 0u, 1u), 2u, 1u);\n unpacked[107] = extractBits(val_10, 1u, 3u);\n unpacked[108] = extractBits(val_10, 4u, 3u);\n unpacked[109] = extractBits(val_10, 7u, 3u);\n unpacked[110] = extractBits(val_10, 10u, 3u);\n unpacked[111] = extractBits(val_10, 13u, 3u);\n unpacked[112] = extractBits(val_10, 16u, 3u);\n unpacked[113] = extractBits(val_10, 19u, 3u);\n unpacked[114] = extractBits(val_10, 22u, 3u);\n unpacked[115] = extractBits(val_10, 25u, 3u);\n unpacked[116] = extractBits(val_10, 28u, 3u);\n unpacked[117] = extractBits(val_10, 31u, 1u);\n \n let val_11 = blocks[packed_offset + 11];\n unpacked[117] = insertBits(unpacked[117], extractBits(val_11, 0u, 2u), 1u, 2u); \n unpacked[118] = extractBits(val_11, 2u, 3u);\n unpacked[119] = extractBits(val_11, 5u, 3u);\n unpacked[120] = extractBits(val_11, 8u, 3u);\n unpacked[121] = extractBits(val_11, 11u, 3u);\n unpacked[122] = extractBits(val_11, 14u, 3u);\n unpacked[123] = extractBits(val_11, 17u, 3u);\n unpacked[124] = extractBits(val_11, 20u, 3u);\n unpacked[125] = extractBits(val_11, 23u, 3u);\n unpacked[126] = extractBits(val_11, 26u, 3u);\n unpacked[127] = extractBits(val_11, 29u, 3u);\n}\n";var unpackBlock128BitDepth5="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_5(packed_offset: u32) { \n let val_0 = blocks[packed_offset];\n unpacked[0] = extractBits(val_0, 0u, 5u);\n unpacked[1] = extractBits(val_0, 5u, 5u);\n unpacked[2] = extractBits(val_0, 10u, 5u);\n unpacked[3] = extractBits(val_0, 15u, 5u);\n unpacked[4] = extractBits(val_0, 20u, 5u);\n unpacked[5] = extractBits(val_0, 25u, 5u);\n unpacked[6] = extractBits(val_0, 30u, 2u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[6] = insertBits(unpacked[6], extractBits(val_1, 0u, 3u), 2u, 3u); \n unpacked[7] = extractBits(val_1, 3u, 5u);\n unpacked[8] = extractBits(val_1, 8u, 5u);\n unpacked[9] = extractBits(val_1, 13u, 5u);\n unpacked[10] = extractBits(val_1, 18u, 5u);\n unpacked[11] = extractBits(val_1, 23u, 5u);\n unpacked[12] = extractBits(val_1, 28u, 4u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[12] = insertBits(unpacked[12], extractBits(val_2, 0u, 1u), 4u, 1u);\n unpacked[13] = extractBits(val_2, 1u, 5u);\n unpacked[14] = extractBits(val_2, 6u, 5u);\n unpacked[15] = extractBits(val_2, 11u, 5u);\n unpacked[16] = extractBits(val_2, 16u, 5u);\n unpacked[17] = extractBits(val_2, 21u, 5u);\n unpacked[18] = extractBits(val_2, 26u, 5u);\n unpacked[19] = extractBits(val_2, 31u, 1u);\n \n let val_3 = blocks[packed_offset + 3];\n unpacked[19] = insertBits(unpacked[19], extractBits(val_3, 0u, 4u), 1u, 4u);\n unpacked[20] = extractBits(val_3, 4u, 5u);\n unpacked[21] = extractBits(val_3, 9u, 5u);\n unpacked[22] = extractBits(val_3, 14u, 5u);\n unpacked[23] = extractBits(val_3, 19u, 5u);\n unpacked[24] = extractBits(val_3, 24u, 5u);\n unpacked[25] = extractBits(val_3, 29u, 3u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[25] = insertBits(unpacked[25], extractBits(val_4, 0u, 2u), 3u, 2u);\n unpacked[26] = extractBits(val_4, 2u, 5u);\n unpacked[27] = extractBits(val_4, 7u, 5u);\n unpacked[28] = extractBits(val_4, 12u, 5u);\n unpacked[29] = extractBits(val_4, 17u, 5u);\n unpacked[30] = extractBits(val_4, 22u, 5u);\n unpacked[31] = extractBits(val_4, 27u, 5u);\n \n let val_5 = blocks[packed_offset + 5];\n unpacked[32] = extractBits(val_5, 0u, 5u);\n unpacked[33] = extractBits(val_5, 5u, 5u);\n unpacked[34] = extractBits(val_5, 10u, 5u);\n unpacked[35] = extractBits(val_5, 15u, 5u);\n unpacked[36] = extractBits(val_5, 20u, 5u);\n unpacked[37] = extractBits(val_5, 25u, 5u);\n unpacked[38] = extractBits(val_5, 30u, 2u);\n\n let val_6 = blocks[packed_offset + 6];\n unpacked[38] = insertBits(unpacked[38], extractBits(val_6, 0u, 3u), 2u, 3u);\n unpacked[39] = extractBits(val_6, 3u, 5u);\n unpacked[40] = extractBits(val_6, 8u, 5u);\n unpacked[41] = extractBits(val_6, 13u, 5u);\n unpacked[42] = extractBits(val_6, 18u, 5u);\n unpacked[43] = extractBits(val_6, 23u, 5u);\n unpacked[44] = extractBits(val_6, 28u, 4u);\n\n let val_7 = blocks[packed_offset + 7];\n unpacked[44] = insertBits(unpacked[44], extractBits(val_7, 0u, 1u), 4u, 1u);\n unpacked[45] = extractBits(val_7, 1u, 5u);\n unpacked[46] = extractBits(val_7, 6u, 5u);\n unpacked[47] = extractBits(val_7, 11u, 5u);\n unpacked[48] = extractBits(val_7, 16u, 5u);\n unpacked[49] = extractBits(val_7, 21u, 5u);\n unpacked[50] = extractBits(val_7, 26u, 5u);\n unpacked[51] = extractBits(val_7, 31u, 1u);\n\n let val_8 = blocks[packed_offset + 8];\n unpacked[51] = insertBits(unpacked[51], extractBits(val_8, 0u, 4u), 1u, 4u);\n unpacked[52] = extractBits(val_8, 4u, 5u);\n unpacked[53] = extractBits(val_8, 9u, 5u);\n unpacked[54] = extractBits(val_8, 14u, 5u);\n unpacked[55] = extractBits(val_8, 19u, 5u);\n unpacked[56] = extractBits(val_8, 24u, 5u);\n unpacked[57] = extractBits(val_8, 29u, 3u);\n \n let val_9 = blocks[packed_offset + 9];\n unpacked[57] = insertBits(unpacked[57], extractBits(val_9, 0u, 2u), 3u, 2u);\n unpacked[58] = extractBits(val_9, 2u, 5u);\n unpacked[59] = extractBits(val_9, 7u, 5u);\n unpacked[60] = extractBits(val_9, 12u, 5u);\n unpacked[61] = extractBits(val_9, 17u, 5u);\n unpacked[62] = extractBits(val_9, 22u, 5u);\n unpacked[63] = extractBits(val_9, 27u, 5u);\n \n let val_10 = blocks[packed_offset + 10];\n unpacked[64] = extractBits(val_10, 0u, 5u);\n unpacked[65] = extractBits(val_10, 5u, 5u);\n unpacked[66] = extractBits(val_10, 10u, 5u);\n unpacked[67] = extractBits(val_10, 15u, 5u);\n unpacked[68] = extractBits(val_10, 20u, 5u);\n unpacked[69] = extractBits(val_10, 25u, 5u);\n unpacked[70] = extractBits(val_10, 30u, 2u);\n\n let val_11 = blocks[packed_offset + 11];\n unpacked[70] = insertBits(unpacked[70], extractBits(val_11, 0u, 3u), 2u, 3u);\n unpacked[71] = extractBits(val_11, 3u, 5u);\n unpacked[72] = extractBits(val_11, 8u, 5u);\n unpacked[73] = extractBits(val_11, 13u, 5u);\n unpacked[74] = extractBits(val_11, 18u, 5u);\n unpacked[75] = extractBits(val_11, 23u, 5u);\n unpacked[76] = extractBits(val_11, 28u, 4u);\n\n let val_12 = blocks[packed_offset + 12];\n unpacked[76] = insertBits(unpacked[76], extractBits(val_12, 0u, 1u), 4u, 1u);\n unpacked[77] = extractBits(val_12, 1u, 5u);\n unpacked[78] = extractBits(val_12, 6u, 5u);\n unpacked[79] = extractBits(val_12, 11u, 5u);\n unpacked[80] = extractBits(val_12, 16u, 5u);\n unpacked[81] = extractBits(val_12, 21u, 5u);\n unpacked[82] = extractBits(val_12, 26u, 5u);\n unpacked[83] = extractBits(val_12, 31u, 1u);\n\n let val_13 = blocks[packed_offset + 13];\n unpacked[83] = insertBits(unpacked[83], extractBits(val_13, 0u, 4u), 1u, 4u);\n unpacked[84] = extractBits(val_13, 4u, 5u);\n unpacked[85] = extractBits(val_13, 9u, 5u);\n unpacked[86] = extractBits(val_13, 14u, 5u);\n unpacked[87] = extractBits(val_13, 19u, 5u);\n unpacked[88] = extractBits(val_13, 24u, 5u);\n unpacked[89] = extractBits(val_13, 29u, 3u);\n \n let val_14 = blocks[packed_offset + 14];\n unpacked[89] = insertBits(unpacked[89], extractBits(val_14, 0u, 2u), 3u, 2u);\n unpacked[90] = extractBits(val_14, 2u, 5u);\n unpacked[91] = extractBits(val_14, 7u, 5u);\n unpacked[92] = extractBits(val_14, 12u, 5u);\n unpacked[93] = extractBits(val_14, 17u, 5u);\n unpacked[94] = extractBits(val_14, 22u, 5u);\n unpacked[95] = extractBits(val_14, 27u, 5u);\n\n let val_15 = blocks[packed_offset + 15];\n unpacked[96] = extractBits(val_15, 0u, 5u);\n unpacked[97] = extractBits(val_15, 5u, 5u);\n unpacked[98] = extractBits(val_15, 10u, 5u);\n unpacked[99] = extractBits(val_15, 15u, 5u);\n unpacked[100] = extractBits(val_15, 20u, 5u);\n unpacked[101] = extractBits(val_15, 25u, 5u);\n unpacked[102] = extractBits(val_15, 30u, 2u);\n\n let val_16 = blocks[packed_offset + 16];\n unpacked[102] = insertBits(unpacked[102], extractBits(val_16, 0u, 3u), 2u, 3u);\n unpacked[103] = extractBits(val_16, 3u, 5u);\n unpacked[104] = extractBits(val_16, 8u, 5u);\n unpacked[105] = extractBits(val_16, 13u, 5u);\n unpacked[106] = extractBits(val_16, 18u, 5u);\n unpacked[107] = extractBits(val_16, 23u, 5u);\n unpacked[108] = extractBits(val_16, 28u, 4u);\n\n let val_17 = blocks[packed_offset + 17];\n unpacked[108] = insertBits(unpacked[108], extractBits(val_17, 0u, 1u), 4u, 1u);\n unpacked[109] = extractBits(val_17, 1u, 5u);\n unpacked[110] = extractBits(val_17, 6u, 5u);\n unpacked[111] = extractBits(val_17, 11u, 5u);\n unpacked[112] = extractBits(val_17, 16u, 5u);\n unpacked[113] = extractBits(val_17, 21u, 5u);\n unpacked[114] = extractBits(val_17, 26u, 5u);\n unpacked[115] = extractBits(val_17, 31u, 1u);\n \n let val_18 = blocks[packed_offset + 18];\n unpacked[115] = insertBits(unpacked[115], extractBits(val_18, 0u, 4u), 1u, 4u);\n unpacked[116] = extractBits(val_18, 4u, 5u);\n unpacked[117] = extractBits(val_18, 9u, 5u);\n unpacked[118] = extractBits(val_18, 14u, 5u);\n unpacked[119] = extractBits(val_18, 19u, 5u);\n unpacked[120] = extractBits(val_18, 24u, 5u);\n unpacked[121] = extractBits(val_18, 29u, 3u);\n\n let val_19 = blocks[packed_offset + 19];\n unpacked[121] = insertBits(unpacked[121], extractBits(val_19, 0u, 2u), 3u, 2u);\n unpacked[122] = extractBits(val_19, 2u, 5u);\n unpacked[123] = extractBits(val_19, 7u, 5u);\n unpacked[124] = extractBits(val_19, 12u, 5u);\n unpacked[125] = extractBits(val_19, 17u, 5u);\n unpacked[126] = extractBits(val_19, 22u, 5u);\n unpacked[127] = extractBits(val_19, 27u, 5u);\n}\n";var unpackBlock128BitDepth6="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_6(packed_offset: u32) {\n let val_0 = blocks[packed_offset];\n unpacked[0] = extractBits(val_0, 0u, 6u);\n unpacked[1] = extractBits(val_0, 6u, 6u);\n unpacked[2] = extractBits(val_0, 12u, 6u);\n unpacked[3] = extractBits(val_0, 18u, 6u);\n unpacked[4] = extractBits(val_0, 24u, 6u);\n unpacked[5] = extractBits(val_0, 30u, 2u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[5] = insertBits(unpacked[5], extractBits(val_1, 0u, 4u), 2u, 4u);\n unpacked[6] = extractBits(val_1, 4u, 6u);\n unpacked[7] = extractBits(val_1, 10u, 6u);\n unpacked[8] = extractBits(val_1, 16u, 6u);\n unpacked[9] = extractBits(val_1, 22u, 6u);\n unpacked[10] = extractBits(val_1, 28u, 4u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[10] = insertBits(unpacked[10], extractBits(val_2, 0u, 2u), 4u, 2u);\n unpacked[11] = extractBits(val_2, 2u, 6u);\n unpacked[12] = extractBits(val_2, 8u, 6u);\n unpacked[13] = extractBits(val_2, 14u, 6u);\n unpacked[14] = extractBits(val_2, 20u, 6u);\n unpacked[15] = extractBits(val_2, 26u, 6u);\n \n let val_3 = blocks[packed_offset + 3];\n unpacked[16] = extractBits(val_3, 0u, 6u);\n unpacked[17] = extractBits(val_3, 6u, 6u);\n unpacked[18] = extractBits(val_3, 12u, 6u);\n unpacked[19] = extractBits(val_3, 18u, 6u);\n unpacked[20] = extractBits(val_3, 24u, 6u);\n unpacked[21] = extractBits(val_3, 30u, 2u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[21] = insertBits(unpacked[21], extractBits(val_4, 0u, 4u), 2u, 4u);\n unpacked[22] = extractBits(val_4, 4u, 6u);\n unpacked[23] = extractBits(val_4, 10u, 6u);\n unpacked[24] = extractBits(val_4, 16u, 6u);\n unpacked[25] = extractBits(val_4, 22u, 6u);\n unpacked[26] = extractBits(val_4, 28u, 4u);\n\n let val_5 = blocks[packed_offset + 5];\n unpacked[26] = insertBits(unpacked[26], extractBits(val_5, 0u, 2u), 4u, 2u);\n unpacked[27] = extractBits(val_5, 2u, 6u);\n unpacked[28] = extractBits(val_5, 8u, 6u);\n unpacked[29] = extractBits(val_5, 14u, 6u);\n unpacked[30] = extractBits(val_5, 20u, 6u);\n unpacked[31] = extractBits(val_5, 26u, 6u);\n\n let val_6 = blocks[packed_offset + 6];\n unpacked[32] = extractBits(val_6, 0u, 6u);\n unpacked[33] = extractBits(val_6, 6u, 6u);\n unpacked[34] = extractBits(val_6, 12u, 6u);\n unpacked[35] = extractBits(val_6, 18u, 6u);\n unpacked[36] = extractBits(val_6, 24u, 6u);\n unpacked[37] = extractBits(val_6, 30u, 2u);\n\n let val_7 = blocks[packed_offset + 7];\n unpacked[37] = insertBits(unpacked[37], extractBits(val_7, 0u, 4u), 2u, 4u);\n unpacked[38] = extractBits(val_7, 4u, 6u);\n unpacked[39] = extractBits(val_7, 10u, 6u);\n unpacked[40] = extractBits(val_7, 16u, 6u);\n unpacked[41] = extractBits(val_7, 22u, 6u);\n unpacked[42] = extractBits(val_7, 28u, 4u);\n \n let val_8 = blocks[packed_offset + 8];\n unpacked[42] = insertBits(unpacked[42], extractBits(val_8, 0u, 2u), 4u, 2u);\n unpacked[43] = extractBits(val_8, 2u, 6u);\n unpacked[44] = extractBits(val_8, 8u, 6u);\n unpacked[45] = extractBits(val_8, 14u, 6u);\n unpacked[46] = extractBits(val_8, 20u, 6u);\n unpacked[47] = extractBits(val_8, 26u, 6u);\n\n let val_9 = blocks[packed_offset + 9];\n unpacked[48] = extractBits(val_9, 0u, 6u);\n unpacked[49] = extractBits(val_9, 6u, 6u);\n unpacked[50] = extractBits(val_9, 12u, 6u);\n unpacked[51] = extractBits(val_9, 18u, 6u);\n unpacked[52] = extractBits(val_9, 24u, 6u);\n unpacked[53] = extractBits(val_9, 30u, 2u);\n\n let val_10 = blocks[packed_offset + 10];\n unpacked[53] = insertBits(unpacked[53], extractBits(val_10, 0u, 4u), 2u, 4u);\n unpacked[54] = extractBits(val_10, 4u, 6u);\n unpacked[55] = extractBits(val_10, 10u, 6u);\n unpacked[56] = extractBits(val_10, 16u, 6u);\n unpacked[57] = extractBits(val_10, 22u, 6u);\n unpacked[58] = extractBits(val_10, 28u, 4u);\n\n let val_11 = blocks[packed_offset + 11];\n unpacked[58] = insertBits(unpacked[58], extractBits(val_11, 0u, 2u), 4u, 2u);\n unpacked[59] = extractBits(val_11, 2u, 6u);\n unpacked[60] = extractBits(val_11, 8u, 6u);\n unpacked[61] = extractBits(val_11, 14u, 6u);\n unpacked[62] = extractBits(val_11, 20u, 6u);\n unpacked[63] = extractBits(val_11, 26u, 6u);\n \n let val_12 = blocks[packed_offset + 12];\n unpacked[64] = extractBits(val_12, 0u, 6u);\n unpacked[65] = extractBits(val_12, 6u, 6u);\n unpacked[66] = extractBits(val_12, 12u, 6u);\n unpacked[67] = extractBits(val_12, 18u, 6u);\n unpacked[68] = extractBits(val_12, 24u, 6u);\n unpacked[69] = extractBits(val_12, 30u, 2u);\n\n let val_13 = blocks[packed_offset + 13];\n unpacked[69] = insertBits(unpacked[69], extractBits(val_13, 0u, 4u), 2u, 4u);\n unpacked[70] = extractBits(val_13, 4u, 6u);\n unpacked[71] = extractBits(val_13, 10u, 6u);\n unpacked[72] = extractBits(val_13, 16u, 6u);\n unpacked[73] = extractBits(val_13, 22u, 6u);\n unpacked[74] = extractBits(val_13, 28u, 4u);\n\n let val_14 = blocks[packed_offset + 14];\n unpacked[74] = insertBits(unpacked[74], extractBits(val_14, 0u, 2u), 4u, 2u);\n unpacked[75] = extractBits(val_14, 2u, 6u);\n unpacked[76] = extractBits(val_14, 8u, 6u);\n unpacked[77] = extractBits(val_14, 14u, 6u);\n unpacked[78] = extractBits(val_14, 20u, 6u);\n unpacked[79] = extractBits(val_14, 26u, 6u);\n\n let val_15 = blocks[packed_offset + 15];\n unpacked[80] = extractBits(val_15, 0u, 6u);\n unpacked[81] = extractBits(val_15, 6u, 6u);\n unpacked[82] = extractBits(val_15, 12u, 6u);\n unpacked[83] = extractBits(val_15, 18u, 6u);\n unpacked[84] = extractBits(val_15, 24u, 6u);\n unpacked[85] = extractBits(val_15, 30u, 2u);\n \n let val_16 = blocks[packed_offset + 16];\n unpacked[85] = insertBits(unpacked[85], extractBits(val_16, 0u, 4u), 2u, 4u);\n unpacked[86] = extractBits(val_16, 4u, 6u);\n unpacked[87] = extractBits(val_16, 10u, 6u);\n unpacked[88] = extractBits(val_16, 16u, 6u);\n unpacked[89] = extractBits(val_16, 22u, 6u);\n unpacked[90] = extractBits(val_16, 28u, 4u);\n\n let val_17 = blocks[packed_offset + 17];\n unpacked[90] = insertBits(unpacked[90], extractBits(val_17, 0u, 2u), 4u, 2u);\n unpacked[91] = extractBits(val_17, 2u, 6u);\n unpacked[92] = extractBits(val_17, 8u, 6u);\n unpacked[93] = extractBits(val_17, 14u, 6u);\n unpacked[94] = extractBits(val_17, 20u, 6u);\n unpacked[95] = extractBits(val_17, 26u, 6u);\n\n let val_18 = blocks[packed_offset + 18];\n unpacked[96] = extractBits(val_18, 0u, 6u);\n unpacked[97] = extractBits(val_18, 6u, 6u);\n unpacked[98] = extractBits(val_18, 12u, 6u);\n unpacked[99] = extractBits(val_18, 18u, 6u);\n unpacked[100] = extractBits(val_18, 24u, 6u);\n unpacked[101] = extractBits(val_18, 30u, 2u);\n\n let val_19 = blocks[packed_offset + 19];\n unpacked[101] = insertBits(unpacked[101], extractBits(val_19, 0u, 4u), 2u, 4u);\n unpacked[102] = extractBits(val_19, 4u, 6u);\n unpacked[103] = extractBits(val_19, 10u, 6u);\n unpacked[104] = extractBits(val_19, 16u, 6u);\n unpacked[105] = extractBits(val_19, 22u, 6u);\n unpacked[106] = extractBits(val_19, 28u, 4u);\n \n let val_20 = blocks[packed_offset + 20];\n unpacked[106] = insertBits(unpacked[106], extractBits(val_20, 0u, 2u), 4u, 2u);\n unpacked[107] = extractBits(val_20, 2u, 6u);\n unpacked[108] = extractBits(val_20, 8u, 6u);\n unpacked[109] = extractBits(val_20, 14u, 6u);\n unpacked[110] = extractBits(val_20, 20u, 6u);\n unpacked[111] = extractBits(val_20, 26u, 6u);\n\n let val_21 = blocks[packed_offset + 21];\n unpacked[112] = extractBits(val_21, 0u, 6u);\n unpacked[113] = extractBits(val_21, 6u, 6u);\n unpacked[114] = extractBits(val_21, 12u, 6u);\n unpacked[115] = extractBits(val_21, 18u, 6u);\n unpacked[116] = extractBits(val_21, 24u, 6u);\n unpacked[117] = extractBits(val_21, 30u, 2u);\n\n let val_22 = blocks[packed_offset + 22];\n unpacked[117] = insertBits(unpacked[117], extractBits(val_22, 0u, 4u), 2u, 4u);\n unpacked[118] = extractBits(val_22, 4u, 6u);\n unpacked[119] = extractBits(val_22, 10u, 6u);\n unpacked[120] = extractBits(val_22, 16u, 6u);\n unpacked[121] = extractBits(val_22, 22u, 6u);\n unpacked[122] = extractBits(val_22, 28u, 4u);\n\n let val_23 = blocks[packed_offset + 23];\n unpacked[122] = insertBits(unpacked[122], extractBits(val_23, 0u, 2u), 4u, 2u);\n unpacked[123] = extractBits(val_23, 2u, 6u);\n unpacked[124] = extractBits(val_23, 8u, 6u);\n unpacked[125] = extractBits(val_23, 14u, 6u);\n unpacked[126] = extractBits(val_23, 20u, 6u);\n unpacked[127] = extractBits(val_23, 26u, 6u);\n}\n";var unpackBlock128BitDepth7="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_7(packed_offset: u32) {\n let val_0 = blocks[packed_offset];\n unpacked[0] = extractBits(val_0, 0u, 7u);\n unpacked[1] = extractBits(val_0, 7u, 7u);\n unpacked[2] = extractBits(val_0, 14u, 7u);\n unpacked[3] = extractBits(val_0, 21u, 7u);\n unpacked[4] = extractBits(val_0, 28u, 4u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[4] = insertBits(unpacked[4], extractBits(val_1, 0u, 3u), 4u, 3u);\n unpacked[5] = extractBits(val_1, 3u, 7u);\n unpacked[6] = extractBits(val_1, 10u, 7u);\n unpacked[7] = extractBits(val_1, 17u, 7u);\n unpacked[8] = extractBits(val_1, 24u, 7u);\n unpacked[9] = extractBits(val_1, 31u, 1u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[9] = insertBits(unpacked[9], extractBits(val_2, 0u, 6u), 1u, 6u);\n unpacked[10] = extractBits(val_2, 6u, 7u);\n unpacked[11] = extractBits(val_2, 13u, 7u);\n unpacked[12] = extractBits(val_2, 20u, 7u);\n unpacked[13] = extractBits(val_2, 27u, 5u);\n \n let val_3 = blocks[packed_offset + 3];\n unpacked[13] = insertBits(unpacked[13], extractBits(val_3, 0u, 2u), 5u, 2u);\n unpacked[14] = extractBits(val_3, 2u, 7u);\n unpacked[15] = extractBits(val_3, 9u, 7u);\n unpacked[16] = extractBits(val_3, 16u, 7u);\n unpacked[17] = extractBits(val_3, 23u, 7u);\n unpacked[18] = extractBits(val_3, 30u, 2u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[18] = insertBits(unpacked[18], extractBits(val_4, 0u, 5u), 2u, 5u);\n unpacked[19] = extractBits(val_4, 5u, 7u);\n unpacked[20] = extractBits(val_4, 12u, 7u);\n unpacked[21] = extractBits(val_4, 19u, 7u);\n unpacked[22] = extractBits(val_4, 26u, 6u);\n \n let val_5 = blocks[packed_offset + 5];\n unpacked[22] = insertBits(unpacked[22], extractBits(val_5, 0u, 1u), 6u, 1u);\n unpacked[23] = extractBits(val_5, 1u, 7u);\n unpacked[24] = extractBits(val_5, 8u, 7u);\n unpacked[25] = extractBits(val_5, 15u, 7u);\n unpacked[26] = extractBits(val_5, 22u, 7u);\n unpacked[27] = extractBits(val_5, 29u, 3u);\n \n let val_6 = blocks[packed_offset + 6];\n unpacked[27] = insertBits(unpacked[27], extractBits(val_6, 0u, 4u), 3u, 4u);\n unpacked[28] = extractBits(val_6, 4u, 7u);\n unpacked[29] = extractBits(val_6, 11u, 7u);\n unpacked[30] = extractBits(val_6, 18u, 7u);\n unpacked[31] = extractBits(val_6, 25u, 7u);\n \n let val_7 = blocks[packed_offset + 7];\n unpacked[32] = extractBits(val_7, 0u, 7u);\n unpacked[33] = extractBits(val_7, 7u, 7u);\n unpacked[34] = extractBits(val_7, 14u, 7u);\n unpacked[35] = extractBits(val_7, 21u, 7u);\n unpacked[36] = extractBits(val_7, 28u, 4u);\n \n let val_8 = blocks[packed_offset + 8];\n unpacked[36] = insertBits(unpacked[36], extractBits(val_8, 0u, 3u), 4u, 3u);\n unpacked[37] = extractBits(val_8, 3u, 7u);\n unpacked[38] = extractBits(val_8, 10u, 7u);\n unpacked[39] = extractBits(val_8, 17u, 7u);\n unpacked[40] = extractBits(val_8, 24u, 7u);\n unpacked[41] = extractBits(val_8, 31u, 1u);\n \n let val_9 = blocks[packed_offset + 9];\n unpacked[41] = insertBits(unpacked[41], extractBits(val_9, 0u, 6u), 1u, 6u);\n unpacked[42] = extractBits(val_9, 6u, 7u);\n unpacked[43] = extractBits(val_9, 13u, 7u);\n unpacked[44] = extractBits(val_9, 20u, 7u);\n unpacked[45] = extractBits(val_9, 27u, 5u);\n \n let val_10 = blocks[packed_offset + 10];\n unpacked[45] = insertBits(unpacked[45], extractBits(val_10, 0u, 2u), 5u, 2u);\n unpacked[46] = extractBits(val_10, 2u, 7u);\n unpacked[47] = extractBits(val_10, 9u, 7u);\n unpacked[48] = extractBits(val_10, 16u, 7u);\n unpacked[49] = extractBits(val_10, 23u, 7u);\n unpacked[50] = extractBits(val_10, 30u, 2u);\n \n let val_11 = blocks[packed_offset + 11];\n unpacked[50] = insertBits(unpacked[50], extractBits(val_11, 0u, 5u), 2u, 5u);\n unpacked[51] = extractBits(val_11, 5u, 7u);\n unpacked[52] = extractBits(val_11, 12u, 7u);\n unpacked[53] = extractBits(val_11, 19u, 7u);\n unpacked[54] = extractBits(val_11, 26u, 6u);\n \n let val_12 = blocks[packed_offset + 12];\n unpacked[54] = insertBits(unpacked[54], extractBits(val_12, 0u, 1u), 6u, 1u);\n unpacked[55] = extractBits(val_12, 1u, 7u);\n unpacked[56] = extractBits(val_12, 8u, 7u);\n unpacked[57] = extractBits(val_12, 15u, 7u);\n unpacked[58] = extractBits(val_12, 22u, 7u);\n unpacked[59] = extractBits(val_12, 29u, 3u);\n \n let val_13 = blocks[packed_offset + 13];\n unpacked[59] = insertBits(unpacked[59], extractBits(val_13, 0u, 4u), 3u, 4u);\n unpacked[60] = extractBits(val_13, 4u, 7u);\n unpacked[61] = extractBits(val_13, 11u, 7u);\n unpacked[62] = extractBits(val_13, 18u, 7u);\n unpacked[63] = extractBits(val_13, 25u, 7u);\n \n let val_14 = blocks[packed_offset + 14];\n unpacked[64] = extractBits(val_14, 0u, 7u);\n unpacked[65] = extractBits(val_14, 7u, 7u);\n unpacked[66] = extractBits(val_14, 14u, 7u);\n unpacked[67] = extractBits(val_14, 21u, 7u);\n unpacked[68] = extractBits(val_14, 28u, 4u);\n \n let val_15 = blocks[packed_offset + 15];\n unpacked[68] = insertBits(unpacked[68], extractBits(val_15, 0u, 3u), 4u, 3u);\n unpacked[69] = extractBits(val_15, 3u, 7u);\n unpacked[70] = extractBits(val_15, 10u, 7u);\n unpacked[71] = extractBits(val_15, 17u, 7u);\n unpacked[72] = extractBits(val_15, 24u, 7u);\n unpacked[73] = extractBits(val_15, 31u, 1u);\n \n let val_16 = blocks[packed_offset + 16];\n unpacked[73] = insertBits(unpacked[73], extractBits(val_16, 0u, 6u), 1u, 6u);\n unpacked[74] = extractBits(val_16, 6u, 7u);\n unpacked[75] = extractBits(val_16, 13u, 7u);\n unpacked[76] = extractBits(val_16, 20u, 7u);\n unpacked[77] = extractBits(val_16, 27u, 5u);\n \n let val_17 = blocks[packed_offset + 17];\n unpacked[77] = insertBits(unpacked[77], extractBits(val_17, 0u, 2u), 5u, 2u);\n unpacked[78] = extractBits(val_17, 2u, 7u);\n unpacked[79] = extractBits(val_17, 9u, 7u);\n unpacked[80] = extractBits(val_17, 16u, 7u);\n unpacked[81] = extractBits(val_17, 23u, 7u);\n unpacked[82] = extractBits(val_17, 30u, 2u);\n \n let val_18 = blocks[packed_offset + 18];\n unpacked[82] = insertBits(unpacked[82], extractBits(val_18, 0u, 5u), 2u, 5u);\n unpacked[83] = extractBits(val_18, 5u, 7u);\n unpacked[84] = extractBits(val_18, 12u, 7u);\n unpacked[85] = extractBits(val_18, 19u, 7u);\n unpacked[86] = extractBits(val_18, 26u, 6u);\n \n let val_19 = blocks[packed_offset + 19];\n unpacked[86] = insertBits(unpacked[86], extractBits(val_19, 0u, 1u), 6u, 1u);\n unpacked[87] = extractBits(val_19, 1u, 7u);\n unpacked[88] = extractBits(val_19, 8u, 7u);\n unpacked[89] = extractBits(val_19, 15u, 7u);\n unpacked[90] = extractBits(val_19, 22u, 7u);\n unpacked[91] = extractBits(val_19, 29u, 3u);\n \n let val_20 = blocks[packed_offset + 20];\n unpacked[91] = insertBits(unpacked[91], extractBits(val_20, 0u, 4u), 3u, 4u);\n unpacked[92] = extractBits(val_20, 4u, 7u);\n unpacked[93] = extractBits(val_20, 11u, 7u);\n unpacked[94] = extractBits(val_20, 18u, 7u);\n unpacked[95] = extractBits(val_20, 25u, 7u);\n \n let val_21 = blocks[packed_offset + 21];\n unpacked[96] = extractBits(val_21, 0u, 7u);\n unpacked[97] = extractBits(val_21, 7u, 7u);\n unpacked[98] = extractBits(val_21, 14u, 7u);\n unpacked[99] = extractBits(val_21, 21u, 7u);\n unpacked[100] = extractBits(val_21, 28u, 4u);\n \n let val_22 = blocks[packed_offset + 22];\n unpacked[100] = insertBits(unpacked[100], extractBits(val_22, 0u, 3u), 4u, 3u);\n unpacked[101] = extractBits(val_22, 3u, 7u);\n unpacked[102] = extractBits(val_22, 10u, 7u);\n unpacked[103] = extractBits(val_22, 17u, 7u);\n unpacked[104] = extractBits(val_22, 24u, 7u);\n unpacked[105] = extractBits(val_22, 31u, 1u);\n \n let val_23 = blocks[packed_offset + 23];\n unpacked[105] = insertBits(unpacked[105], extractBits(val_23, 0u, 6u), 1u, 6u);\n unpacked[106] = extractBits(val_23, 6u, 7u);\n unpacked[107] = extractBits(val_23, 13u, 7u);\n unpacked[108] = extractBits(val_23, 20u, 7u);\n unpacked[109] = extractBits(val_23, 27u, 5u);\n \n let val_24 = blocks[packed_offset + 24];\n unpacked[109] = insertBits(unpacked[109], extractBits(val_24, 0u, 2u), 5u, 2u);\n unpacked[110] = extractBits(val_24, 2u, 7u);\n unpacked[111] = extractBits(val_24, 9u, 7u);\n unpacked[112] = extractBits(val_24, 16u, 7u);\n unpacked[113] = extractBits(val_24, 23u, 7u);\n unpacked[114] = extractBits(val_24, 30u, 2u);\n \n let val_25 = blocks[packed_offset + 25];\n unpacked[114] = insertBits(unpacked[114], extractBits(val_25, 0u, 5u), 2u, 5u);\n unpacked[115] = extractBits(val_25, 5u, 7u);\n unpacked[116] = extractBits(val_25, 12u, 7u);\n unpacked[117] = extractBits(val_25, 19u, 7u);\n unpacked[118] = extractBits(val_25, 26u, 6u);\n \n let val_26 = blocks[packed_offset + 26];\n unpacked[118] = insertBits(unpacked[118], extractBits(val_26, 0u, 1u), 6u, 1u);\n unpacked[119] = extractBits(val_26, 1u, 7u);\n unpacked[120] = extractBits(val_26, 8u, 7u);\n unpacked[121] = extractBits(val_26, 15u, 7u);\n unpacked[122] = extractBits(val_26, 22u, 7u);\n unpacked[123] = extractBits(val_26, 29u, 3u);\n \n let val_27 = blocks[packed_offset + 27];\n unpacked[123] = insertBits(unpacked[123], extractBits(val_27, 0u, 4u), 3u, 4u);\n unpacked[124] = extractBits(val_27, 4u, 7u);\n unpacked[125] = extractBits(val_27, 11u, 7u);\n unpacked[126] = extractBits(val_27, 18u, 7u);\n unpacked[127] = extractBits(val_27, 25u, 7u); \n}\n";var fromFP510Function="\n\nconst exponents: array = array(\n 2.9103830456733704e-11, \n 5.820766091346741e-11, \n 1.1641532182693481e-10, \n 2.3283064365386963e-10,\n 4.656612873077393e-10, \n 9.313225746154785e-10, \n 1.862645149230957e-09, \n 3.725290298461914e-09,\n 7.450580596923828e-09, \n 1.4901161193847656e-08, \n 2.9802322387695312e-08, \n 5.960464477539063e-08,\n 1.1920928955078125e-07, \n 2.384185791015625e-07, \n 4.76837158203125e-07, \n 9.5367431640625e-07,\n 1.9073486328125e-06, \n 3.814697265625e-06, \n 7.62939453125e-06, \n 1.52587890625e-05, \n 3.0517578125e-05,\n 6.103515625e-05, \n 0.0001220703125, \n 0.000244140625, \n 0.00048828125, \n 0.0009765625, \n 0.001953125, \n 0.00390625,\n 0.0078125, \n 0.015625, \n 0.03125, \n 0.0625);\n\nfn from_fp510(x: u32) -> f32 {\n let exponent = f32(exponents[extractBits(x, 10u, 5u)]); \n let fractional = f32(extractBits(x, 0u, 10u)); \n let abs = exponent * fractional;\n return abs * (1.0 - (2.0 * f32(extractBits(x, 15u, 1u))));\n}\n";var preprocessBlocks3BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth3,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n \n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 12u); \n unpack_block_128_bit_depth_3(blocks_start); \n \n let b01: u32 = blocks_start;\n let b2: u32 = blocks_start + 8u;\n \n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b01_idx = b01 + (r / 2u);\n let b2_idx = b2 + (r / 4u);\n\n blocks[b01_idx] = insertBits(blocks[b01_idx], extractBits(unpacked[unpacked_idx], 0u, 2u), (r * 16u) % 32u, 16u);\n blocks[b2_idx] = insertBits(blocks[b2_idx], extractBits(unpacked[unpacked_idx], 2u, 1u), (r * 8u) % 32u, 8u); \n }\n \n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b01_idx = b01 + (r / 2u);\n let b2_idx = b2 + (r / 4u);\n \n blocks[b01_idx] = insertBits(blocks[b01_idx], extractBits(unpacked[unpacked_idx], 0u, 2u), ((r * 16u) % 32u) + (2u * c), 2u);\n blocks[b2_idx] = insertBits(blocks[b2_idx], extractBits(unpacked[unpacked_idx], 2u, 1u), ((r * 8u) % 32u) + c, 1u); \n }\n }\n}\n\n").concat(emptyShader);var preprocessBlocks5BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth5,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n\n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 20u);\n unpack_block_128_bit_depth_5(blocks_start); \n \n let b03: u32 = blocks_start;\n let b4: u32 = blocks_start + 16u;\n\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b03_idx = b03 + r;\n let b4_idx = b4 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 0u, 32u);\n blocks[b4_idx] = insertBits(blocks[b4_idx], extractBits(unpacked[unpacked_idx], 4u, 1u), (r * 8u) % 32u, 8u);\n }\n \n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b03_idx = b03 + r;\n let b4_idx = b4 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 4 * c, 4u);\n blocks[b4_idx] = insertBits(blocks[b4_idx], extractBits(unpacked[unpacked_idx], 4u, 1u), ((r * 8u) % 32u) + c, 1u);\n }\n } \n}\n\n").concat(emptyShader);var preprocessBlocks6BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth6,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n \n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 24u);\n unpack_block_128_bit_depth_6(blocks_start);\n \n let b03: u32 = blocks_start;\n let b45: u32 = blocks_start + 16u; \n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 0u, 32u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u), 16u);\n }\n\n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 4 * c, 4u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u) + (2 * c), 2u);\n }\n }\n}\n\n").concat(emptyShader);var preprocessBlocks7BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth7,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n \n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 28u);\n unpack_block_128_bit_depth_7(blocks_start);\n \n let b03: u32 = blocks_start;\n let b45: u32 = blocks_start + 16u;\n let b6: u32 = blocks_start + 24u; \n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n let b6_idx = b6 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 0, 32u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u), 16u);\n blocks[b6_idx] = insertBits(blocks[b6_idx], extractBits(unpacked[unpacked_idx], 6u, 1u), ((r * 8u) % 32u), 8u);\n }\n \n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n let b6_idx = b6 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 4 * c, 4u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u) + (2 * c), 2u);\n blocks[b6_idx] = insertBits(blocks[b6_idx], extractBits(unpacked[unpacked_idx], 6u, 1u), ((r * 8u) % 32u) + c, 1u);\n }\n }\n}\n\n").concat(emptyShader);var preprocessShaderSources={3:preprocessBlocks3BitShaderSource,5:preprocessBlocks5BitShaderSource,6:preprocessBlocks6BitShaderSource,7:preprocessBlocks7BitShaderSource};var preprocessShaderNames={3:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_3bit_shader",5:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_5bit_shader",6:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_6bit_shader",7:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_7bit_shader"};var BM=8;var BN=32;var TM=2;var TN=16;var TC=rowsPerBlock*BM*BN/(TM*TN);var constantSnippet="\nconst BM = ".concat(BM,"u;\nconst BN = ").concat(BN,"u;\n\nconst TM = ").concat(TM,"u;\nconst TN = ").concat(TN,"u;\n\nconst TC = ").concat(TC,"u;\n\nconst ROW_PER_BLOCK = ").concat(rowsPerBlock,"u;\nconst COL_PER_BLOCK = ").concat(columnsPerBlock,"u;\n\nconst VEC_COL_PER_BLOCK = COL_PER_BLOCK / 4u;\n\nconst block_size: u32 = (COL_PER_BLOCK * ROW_PER_BLOCK * bit_depth) / 32u;\n\n");var forwardMultipleInputArgsSnippet="\nstruct argsStruct {\n n: u32,\n m: u32,\n total_nbc: u32,\n k: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array;\n";var forwardMultipleSharedPrivateMemSnippet="\nvar shared_x: array, BN * VEC_COL_PER_BLOCK>;\nvar shared_ab: array;\nvar shared_w: array, BM * ROW_PER_BLOCK * VEC_COL_PER_BLOCK>;\n\nvar local_x: array, TN * VEC_COL_PER_BLOCK>;\nvar local_x_sums: array;\nvar local_results: array;\n";var forwardMultipleLocalVarSnippet="\n let tid = local_id.x;\n let bm_idx = workgroup_id.x;\n let bn_idx = workgroup_id.y;\n\n let local_bm_idx = bm_idx * BM;\n let local_bn_idx = bn_idx * BN;\n \n let n_idx = tid % (BN / TN);\n let k_idx = tid / (BN / TN) / (BM * ROW_PER_BLOCK / TM);\n let m_idx = tid / (BN / TN) % (BM * ROW_PER_BLOCK / TM);\n";var forwardMultipleLoadW1Bit="\n let b0 = blocks[src + (row / 4u)];\n\n let b0_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b0_offset = b0_offset_base + (c * 4u); \n shared_w[dst + c] = vec4(\n f32(extractBits(b0, b0_offset, 1u)), \n f32(extractBits(b0, b0_offset + 1, 1u)),\n f32(extractBits(b0, b0_offset + 2, 1u)),\n f32(extractBits(b0, b0_offset + 3, 1u)));\n }\n";var forwardMultipleLoadW2Bit="\n let b01 = blocks[src + (row / 2u)];\n \n let b01_offset_base = (row * 16u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) { \n let b01_offset = b01_offset_base + (c * 8u);\n shared_w[dst + c] = vec4(\n f32(extractBits(b01, b01_offset, 2u)), \n f32(extractBits(b01, b01_offset + 2, 2u)),\n f32(extractBits(b01, b01_offset + 4, 2u)),\n f32(extractBits(b01, b01_offset + 6, 2u)));\n } \n";var forwardMultipleLoadW3Bit="\n let b01 = blocks[src + (row / 2u)];\n let b2 = blocks[src + 8u + (row / 4u)]; \n\n let b01_offset_base = (row * 16u) % 32u;\n let b2_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b01_offset = b01_offset_base + (c * 8u);\n let b2_offset = b2_offset_base + (c * 4u);\n\n shared_w[dst + c] = vec4(\n f32(insertBits(extractBits(b01, b01_offset, 2u), extractBits(b2, b2_offset, 1u), 2u, 1u)), \n f32(insertBits(extractBits(b01, b01_offset + 2, 2u), extractBits(b2, b2_offset + 1, 1u), 2u, 1u)),\n f32(insertBits(extractBits(b01, b01_offset + 4, 2u), extractBits(b2, b2_offset + 2, 1u), 2u, 1u)),\n f32(insertBits(extractBits(b01, b01_offset + 6, 2u), extractBits(b2, b2_offset + 3, 1u), 2u, 1u))); \n }\n";var forwardMultipleLoadW4Bit="\n let b03 = blocks[src + row];\n \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b03_offset = (c * 16u); \n shared_w[dst + c] = vec4(\n f32(extractBits(b03, b03_offset, 4u)), \n f32(extractBits(b03, b03_offset + 4, 4u)),\n f32(extractBits(b03, b03_offset + 8, 4u)),\n f32(extractBits(b03, b03_offset + 12, 4u)));\n }\n";var forwardMultipleLoadW5Bit="\n let b03 = blocks[src + row];\n let b4 = blocks[src + 16u + (row / 4u)];\n \n let b4_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b03_offset = (c * 16u);\n let b4_offset = b4_offset_base + (c * 4u);\n shared_w[dst + c] = vec4(\n f32(insertBits(extractBits(b03, b03_offset, 4u), extractBits(b4, b4_offset, 1u), 4u, 1u)), \n f32(insertBits(extractBits(b03, b03_offset + 4, 4u), extractBits(b4, b4_offset + 1, 1u), 4u, 1u)),\n f32(insertBits(extractBits(b03, b03_offset + 8, 4u), extractBits(b4, b4_offset + 2, 1u), 4u, 1u)),\n f32(insertBits(extractBits(b03, b03_offset + 12, 4u), extractBits(b4, b4_offset + 3, 1u), 4u, 1u)));\n }\n";var forwardMultipleLoadW6Bit="\n let b03 = blocks[src + row];\n let b45 = blocks[src + 16u + (row / 2u)];\n \n let b45_offset_base = (row * 16u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) { \n let b03_offset = (c * 16u);\n let b45_offset = b45_offset_base + (c * 8u);\n shared_w[dst + c] = vec4(\n f32(insertBits(extractBits(b03, b03_offset, 4u), extractBits(b45, b45_offset, 2u), 4u, 2u)), \n f32(insertBits(extractBits(b03, b03_offset + 4, 4u), extractBits(b45, b45_offset + 2, 2u), 4u, 2u)),\n f32(insertBits(extractBits(b03, b03_offset + 8, 4u), extractBits(b45, b45_offset + 4, 2u), 4u, 2u)),\n f32(insertBits(extractBits(b03, b03_offset + 12, 4u), extractBits(b45, b45_offset + 6, 2u), 4u, 2u)));\n }\n";var forwardMultipleLoadW7Bit="\n let b03 = blocks[src + row];\n let b45 = blocks[src + 16u + (row / 2u)];\n let b6 = blocks[src + 24u + (row / 4u)];\n \n let b45_offset_base = (row * 16u) % 32u;\n let b6_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b03_offset = (c * 16u);\n let b45_offset = b45_offset_base + (c * 8u);\n let b6_offset = b6_offset_base + (c * 4u);\n \n shared_w[dst + c] = vec4(\n f32(insertBits(insertBits(extractBits(b03, b03_offset, 4u), extractBits(b45, b45_offset, 2u), 4u, 2u), extractBits(b6, b6_offset, 1u), 6u, 1u)), \n f32(insertBits(insertBits(extractBits(b03, b03_offset + 4, 4u), extractBits(b45, b45_offset + 2, 2u), 4u, 2u), extractBits(b6, b6_offset + 1, 1u), 6u, 1u)),\n f32(insertBits(insertBits(extractBits(b03, b03_offset + 8, 4u), extractBits(b45, b45_offset + 4, 2u), 4u, 2u), extractBits(b6, b6_offset + 2, 1u), 6u, 1u)),\n f32(insertBits(insertBits(extractBits(b03, b03_offset + 12, 4u), extractBits(b45, b45_offset + 6, 2u), 4u, 2u), extractBits(b6, b6_offset + 3, 1u), 6u, 1u)));\n }\n";var forwardMultipleLoadW8Bit="\n let b07_offset = src + (row * 2);\n \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b07 = blocks[b07_offset + c];\n shared_w[dst + c] = vec4(\n f32(extractBits(b07, 0u, 8u)), \n f32(extractBits(b07, 8u, 8u)),\n f32(extractBits(b07, 16u, 8u)),\n f32(extractBits(b07, 24u, 8u)));\n }\n";var forwardLoadWBitDepthSnippets={1:forwardMultipleLoadW1Bit,2:forwardMultipleLoadW2Bit,3:forwardMultipleLoadW3Bit,4:forwardMultipleLoadW4Bit,5:forwardMultipleLoadW5Bit,6:forwardMultipleLoadW6Bit,7:forwardMultipleLoadW7Bit,8:forwardMultipleLoadW8Bit};var forwardMultipleLoadXSnippet="\n let total_work_x = VEC_COL_PER_BLOCK * BN;\n for (var local_idx = 0u; local_idx < divide_pad(total_work_x, TC); local_idx++) {\n let idx = local_idx * TC + tid;\n if (idx < total_work_x) { \n let n_load_idx = local_bn_idx + idx / VEC_COL_PER_BLOCK;\n let inner_idx = idx % VEC_COL_PER_BLOCK;\n \n if (bk_idx < args.k && n_load_idx < args.n) { \n let x_idx = (args.x_offset / 4u) + ((bk_idx * args.n + n_load_idx) * VEC_COL_PER_BLOCK + inner_idx); \n shared_x[idx] = x[x_idx];\n } else {\n shared_x[idx] = vec4(0.0);\n }\n }\n }\n";var forwardMultipleLoadABSnippet="\n let total_work_ab = BM * 2;\n for (var local_idx = 0u; local_idx < divide_pad(total_work_ab, TC); local_idx++) {\n let idx = local_idx * TC + tid;\n if (idx < total_work_ab) {\n let m_load_idx = local_bm_idx + idx / 2; \n let inner_idx = (idx % 2) * 16u;\n \n if (m_load_idx < args.m && bk_idx < args.k) {\n let ab_bits = extractBits(metas[args.metas_offset + (m_load_idx * args.k + bk_idx)], inner_idx, 16u);\n shared_ab[idx] = from_fp510(ab_bits); \n } else {\n shared_ab[idx] = 0.0;\n }\n }\n }\n";var forwardMultipleLoadWSnippet=function forwardMultipleLoadWSnippet(bitDepth){return"\n let total_work_w = BM * ROW_PER_BLOCK;\n for (var local_idx = 0u; local_idx < divide_pad(total_work_w, TC); local_idx++) {\n let idx = local_idx * TC + tid;\n if (idx < total_work_w) {\n let m_load_idx = local_bm_idx + idx / ROW_PER_BLOCK;\n let row = idx % ROW_PER_BLOCK;\n let dst = idx * VEC_COL_PER_BLOCK;\n\n if (m_load_idx < args.m) {\n let src = args.blocks_offset + (m_load_idx * args.k + bk_idx) * block_size;\n ".concat(forwardLoadWBitDepthSnippets[bitDepth],"\n } else { \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n shared_w[dst + c] = vec4(0.0);\n }\n }\n }\n }\n")};var forwardMultipleCopyXSnippet="\nfor (var tn_idx = 0u; tn_idx < TN; tn_idx++) { \n var x_sum_vec = vec4(0.0); \n let local_x_idx = tn_idx * VEC_COL_PER_BLOCK;\n let shared_x_idx = (n_idx * TN + tn_idx) * VEC_COL_PER_BLOCK + (k_idx * VEC_COL_PER_BLOCK);\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n local_x[local_x_idx + c] = shared_x[shared_x_idx + c];\n x_sum_vec += local_x[local_x_idx + c];\n }\n local_x_sums[tn_idx] = x_sum_vec.x + x_sum_vec.y + x_sum_vec.z + x_sum_vec.w; \n}\n";var forwardMultipleComputeResultsSnippet="\n for (var tm_idx = 0u; tm_idx < TM; tm_idx++) { \n let shared_ab_idx = ((m_idx * TM + tm_idx) / ROW_PER_BLOCK + k_idx) * 2;\n let alpha = shared_ab[shared_ab_idx];\n let beta = shared_ab[shared_ab_idx + 1]; \n let shared_w_idx = ((m_idx * TM + tm_idx) + k_idx) * VEC_COL_PER_BLOCK;\n \n for (var tn_idx = 0u; tn_idx < TN; tn_idx++) { \n let local_x_idx = tn_idx * VEC_COL_PER_BLOCK;\n \n var swx_vec = vec4(0.0); \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) { \n swx_vec += shared_w[shared_w_idx + c] * local_x[local_x_idx + c];\n }\n let swx = swx_vec.x + swx_vec.y + swx_vec.z + swx_vec.w;\n \n let kappa = alpha * local_x_sums[tn_idx]; \n let results_idx = tm_idx * TN + tn_idx;\n local_results[results_idx] += kappa + (beta * swx);\n }\n }\n";var forwardMultipleWriteResultsSnippet="\nfor (var tm_idx = 0u; tm_idx < TM; tm_idx++) {\n let row = local_bm_idx * ROW_PER_BLOCK + (m_idx * TM + tm_idx); \n for (var tn_idx = 0u; tn_idx < TN; tn_idx++) { \n let col = local_bn_idx + (n_idx * TN + tn_idx);\n if (row < args.m * ROW_PER_BLOCK && col < args.n) {\n let y_idx = args.y_offset + ((row / ROW_PER_BLOCK) * args.n + col) * ROW_PER_BLOCK + (row % ROW_PER_BLOCK);\n let results_idx = tm_idx * TN + tn_idx;\n \n y[y_idx] += local_results[results_idx];\n }\n }\n}\n";var forwardMultipleShaderSources=function forwardMultipleShaderSources(bitDepth){return"\n\n".concat(forwardMultipleInputArgsSnippet,"\n\n").concat(constantSnippet,"\n\n").concat(forwardMultipleSharedPrivateMemSnippet,"\n\n").concat(fromFP510Function,"\n\n").concat(dividePadFunction,"\n\nconst bit_depth: u32 = ").concat(bitDepth,"u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n \n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3\n) {\n ").concat(forwardMultipleLocalVarSnippet,"\n \n for (var bk_idx = 0u; bk_idx < args.k; bk_idx++) { \n ").concat(forwardMultipleLoadXSnippet,"\n ").concat(forwardMultipleLoadABSnippet," \n ").concat(forwardMultipleLoadWSnippet(bitDepth)," \n workgroupBarrier();\n \n ").concat(forwardMultipleCopyXSnippet,"\n ").concat(forwardMultipleComputeResultsSnippet,"\n workgroupBarrier();\n }\n \n ").concat(forwardMultipleWriteResultsSnippet,"\n}\n\n").concat(emptyShader,"\n")};var forwardShuffleXShaderSource="\nstruct argsStruct {\n n: u32,\n shape1: u32,\n x_offset: u32,\n indices_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar indices: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n || global_id.y >= args.shape1) {\n return;\n } \n\n let b = global_id.x;\n let i = global_id.y;\n \n let c = i / 8u;\n let j = i % 8u;\n y[((c * args.n) + b) * 8 + j] = x[args.x_offset + (b * args.shape1) + indices[args.indices_offset + i]];\n}\n\n".concat(emptyShader,"\n");var forwardSingleReduceYShaderSource="\nstruct argsStruct {\n nvr: u32,\n nbc: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar y: array>;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) { \n if (global_id.x > args.nvr) {\n return;\n }\n\n let x_start = global_id.x * args.nbc;\n var sum: vec4 = vec4(0.0, 0.0, 0.0, 0.0);\n for (var i = 0u; i < args.nbc; i++) {\n sum += x[x_start + i]; \n }\n y[global_id.x] += sum;\n}\n\n".concat(emptyShader);var forwardShuffleYShaderSource="\nstruct argsStruct {\n n: u32,\n shape0: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n || global_id.y >= args.shape0) {\n return;\n } \n \n let b = global_id.x;\n let i = global_id.y;\n \n let r = i / 16u;\n let j = i % 16u;\n y[(b * args.shape0) + (r * 16) + j] = x[(((r * args.n) + b) * 16) + j];\n}\n\n".concat(emptyShader);var addBiasShaderSource="\nstruct argsStruct {\n dimension: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar bias: array;\n\n@group(0) @binding(2)\nvar y: array;\n\n".concat(fromFP510Function,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) { \n y[(global_id.x * args.dimension) + global_id.y] += bias[global_id.y];\n}\n\n").concat(emptyShader);var forwardSingleBitDepth1ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 4u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n\n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b0_start = row_blocks_start + br_offset + (bc * block_size);\n var b0_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b0 = blocks[b0_start];\n \n let w0_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w0_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w0_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w0_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 8u;\n \n let w1_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w1_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w1_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w1_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 16u;\n \n let w2_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w2_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w2_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w2_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 24u;\n \n let w3_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w3_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w3_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w3_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w; \n }\n \n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth2ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 8u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n\n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b01_start = row_blocks_start + (br_offset * 2u) + (bc * block_size);\n var b01_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b01 = blocks[b01_start];\n \n let w0_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w0_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w0_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w0_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 16u;\n \n let w1_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w1_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w1_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w1_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 0u; \n b01 = blocks[b01_start + 1u];\n \n let w2_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w2_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w2_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w2_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 16u;\n \n let w3_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w3_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w3_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w3_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w; \n }\n \n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth3ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 12u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id : vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n\n let x_start = ((args.x_offset + c) / 4u);\n \n var b01_start = row_blocks_start + (br_offset * 2u) + (bc * block_size);\n var b2_start = row_blocks_start + br_offset + (bc * block_size) + 8u;\n var b01_offset = 0u;\n var b2_offset = 0u;\n\n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) { \n \n var b01 = blocks[b01_start];\n var b2 = blocks[b2_start];\n \n var b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n var b2_bit = extractBits(b2, b2_offset + j, 1u);\n let w0_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w0_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w0_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w0_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 16u;\n b2_offset = 8u;\n \n b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n b2_bit = extractBits(b2, b2_offset + j, 1u); \n let w1_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w1_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w1_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w1_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 0u;\n b2_offset = 16u; \n b01 = blocks[b01_start + 1u];\n \n b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n b2_bit = extractBits(b2, b2_offset + j, 1u); \n let w2_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w2_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w2_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w2_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 16u;\n b2_offset = 24u; \n \n b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n b2_bit = extractBits(b2, b2_offset + j, 1u); \n let w3_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w3_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w3_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w3_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 0u;\n b2_offset = 0u; \n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n \n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth4ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 16u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size); \n\n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n\n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start]; \n \n let w0_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w0_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w0_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w0_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n b03 = blocks[b03_start + 1];\n \n let w1_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w1_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w1_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w1_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n b03 = blocks[b03_start + 2];\n \n let w2_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w2_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w2_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w2_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n b03 = blocks[b03_start + 3];\n \n let w3_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w3_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w3_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w3_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth5ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 20u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size);\n var b4_start = row_blocks_start + br_offset + (bc * block_size) + 16u;\n \n var b4_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start];\n var b4 = blocks[b4_start];\n \n var b03_bits = extractBits(b03, 4u * j, 4u);\n var b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w0_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w0_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w0_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w0_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03 = blocks[b03_start + 1];\n b4_offset = 8u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w1_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w1_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w1_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w1_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03 = blocks[b03_start + 2];\n b4_offset = 16u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w2_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w2_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w2_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w2_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03 = blocks[b03_start + 3];\n b4_offset = 24u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w3_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w3_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w3_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w3_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b4_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth6ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 24u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size);\n var b45_start = row_blocks_start + (br_offset * 2u) + (bc * block_size) + 16u;\n \n var b45_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start];\n var b45 = blocks[b45_start];\n \n var b03_bits = extractBits(b03, 4u * j, 4u);\n var b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w0_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w0_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w0_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w0_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03 = blocks[b03_start + 1];\n b45_offset = 16u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w1_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w1_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w1_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w1_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u)); \n \n b03 = blocks[b03_start + 2];\n b45 = blocks[b45_start + 1];\n b45_offset = 0u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w2_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w2_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w2_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w2_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03 = blocks[b03_start + 3];\n b45_offset = 16u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w3_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w3_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w3_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w3_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b45_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth7ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 28u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size);\n var b45_start = row_blocks_start + (br_offset * 2u) + (bc * block_size) + 16u;\n var b6_start = row_blocks_start + br_offset + (bc * block_size) + 24u;\n \n var b45_offset = 0u;\n var b6_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start];\n var b45 = blocks[b45_start];\n var b6 = blocks[b6_start];\n \n var b03_bits = extractBits(b03, 4u * j, 4u);\n var b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n var b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w0_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w0_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w0_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w0_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03 = blocks[b03_start + 1];\n b45_offset = 16u;\n b6_offset = 8u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w1_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w1_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w1_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w1_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03 = blocks[b03_start + 2];\n b45 = blocks[b45_start + 1];\n b45_offset = 0u;\n b6_offset = 16u;\n\n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w2_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w2_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w2_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w2_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03 = blocks[b03_start + 3];\n b45_offset = 16u;\n b6_offset = 24u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w3_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w3_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w3_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w3_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b45_offset = 0u;\n b6_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth8ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 32u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b07_start = row_blocks_start + (br_offset * 8u) + (bc * block_size); \n\n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n\n for (var j = 0u; j < 2; j++) {\n \n var b07 = blocks[b07_start + j];\n \n let w0_0 = f32(extractBits(b07, 0u, 8u)); \n let w0_1 = f32(extractBits(b07, 8u, 8u)); \n let w0_2 = f32(extractBits(b07, 16u, 8u));\n let w0_3 = f32(extractBits(b07, 24u, 8u));\n \n b07 = blocks[b07_start + 2 + j];\n \n let w1_0 = f32(extractBits(b07, 0u, 8u)); \n let w1_1 = f32(extractBits(b07, 8u, 8u)); \n let w1_2 = f32(extractBits(b07, 16u, 8u));\n let w1_3 = f32(extractBits(b07, 24u, 8u));\n \n b07 = blocks[b07_start + 4 + j];\n \n let w2_0 = f32(extractBits(b07, 0u, 8u)); \n let w2_1 = f32(extractBits(b07, 8u, 8u)); \n let w2_2 = f32(extractBits(b07, 16u, 8u));\n let w2_3 = f32(extractBits(b07, 24u, 8u));\n \n b07 = blocks[b07_start + 6 + j];\n \n let w3_0 = f32(extractBits(b07, 0u, 8u)); \n let w3_1 = f32(extractBits(b07, 8u, 8u)); \n let w3_2 = f32(extractBits(b07, 16u, 8u));\n let w3_3 = f32(extractBits(b07, 24u, 8u));\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_vec = x[x_start + j];\n res[j] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleShaderSources={1:forwardSingleBitDepth1ShaderSource,2:forwardSingleBitDepth2ShaderSource,3:forwardSingleBitDepth3ShaderSource,4:forwardSingleBitDepth4ShaderSource,5:forwardSingleBitDepth5ShaderSource,6:forwardSingleBitDepth6ShaderSource,7:forwardSingleBitDepth7ShaderSource,8:forwardSingleBitDepth8ShaderSource};var forwardSingleShaderNames={1:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_1_shader",2:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_2_shader",3:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_3_shader",4:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_4_shader",5:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_5_shader",6:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_6_shader",7:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_7_shader",8:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_8_shader"};var forwardShaderSources={1:forwardMultipleShaderSources(1),2:forwardMultipleShaderSources(2),3:forwardMultipleShaderSources(3),4:forwardMultipleShaderSources(4),5:forwardMultipleShaderSources(5),6:forwardMultipleShaderSources(6),7:forwardMultipleShaderSources(7),8:forwardMultipleShaderSources(8)};var forwardShaderNames={1:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_1_shader",2:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_2_shader",3:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_3_shader",4:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_4_shader",5:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_5_shader",6:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_6_shader",7:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_7_shader",8:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_8_shader"};var forwardShuffleXShaderName="pv_picollm_weight_block_mixed_16x8_forward_shuffle_x_shader";var forwardShuffleYShaderName="pv_picollm_weight_block_mixed_16x8_forward_shuffle_y_shader";var addBiasShaderName="pv_picollm_weight_block_mixed_16x8_add_bias_shader";var forwardSingleReduceYShaderName="pv_picollm_weight_block_mixed_16x8_forward_single_reduce_y_shader";var _weightBlockMixed16x;var loadPreprocessBlocksShader=function loadPreprocessBlocksShader(device,bitDepth){var bindGroupLayout=device.createBindGroupLayout({label:"weight preprocess blocks ".concat(bitDepth," bind group layout"),entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight preprocess blocks ".concat(bitDepth," pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight preprocess blocks ".concat(bitDepth," shader module"),code:preprocessShaderSources[bitDepth]});var computePipeline=device.createComputePipeline({label:"weight preprocess blocks ".concat(bitDepth," pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:preprocessDim,workgroup_size_y:preprocessDim}}});return{computePipeline:computePipeline}};var loadForwardShuffleXShader=function loadForwardShuffleXShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight shuffle x bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight shuffle x pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight shuffle x shader module",code:forwardShuffleXShaderSource});var computePipeline=device.createComputePipeline({label:"weight shuffle x pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_y:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var loadForwardSingleReduceYShader=function loadForwardSingleReduceYShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight single reduce y bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight single reduce y pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight single reduce y shader module",code:forwardSingleReduceYShaderSource});var computePipeline=device.createComputePipeline({label:"weight single reduce y pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var loadForwardShuffleYShader=function loadForwardShuffleYShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight shuffle y bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight shuffle y pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight shuffle y shader module",code:forwardShuffleYShaderSource});var computePipeline=device.createComputePipeline({label:"weight shuffle y pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var loadForwardSingleShader=function loadForwardSingleShader(device,bitDepth){var entries=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}];var bindGroupLayout=device.createBindGroupLayout({label:"weight forward single ".concat(bitDepth," bind group layout"),entries:entries});var pipelineLayout=device.createPipelineLayout({label:"weight forward single ".concat(bitDepth," pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight forward single ".concat(bitDepth," shader module"),code:forwardSingleShaderSources[bitDepth]});var computePipeline=device.createComputePipeline({label:"weight forward single ".concat(bitDepth," pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:weightBlockSize,workgroup_size_y:1}}});return{computePipeline:computePipeline}};var loadForwardShader=function loadForwardShader(device,bitDepth){var entries=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}];var bindGroupLayout=device.createBindGroupLayout({label:"weight forward multi ".concat(bitDepth," bind group layout"),entries:entries});var pipelineLayout=device.createPipelineLayout({label:"weight forward multi ".concat(bitDepth," pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight forward multi ".concat(bitDepth," shader module"),code:forwardShaderSources[bitDepth]});var computePipeline=device.createComputePipeline({label:"weight forward multi ".concat(bitDepth," pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:TC}}});return{computePipeline:computePipeline}};var loadAddBiasShader=function loadAddBiasShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight add bias bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight add bias pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight add bias shader module",code:addBiasShaderSource});var computePipeline=device.createComputePipeline({label:"weight add bias pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var weightBlockMixed16x8Shaders=(_weightBlockMixed16x={},_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_weightBlockMixed16x,preprocessShaderNames[3],function(device){return loadPreprocessBlocksShader(device,3)}),preprocessShaderNames[5],function(device){return loadPreprocessBlocksShader(device,5)}),preprocessShaderNames[6],function(device){return loadPreprocessBlocksShader(device,6)}),preprocessShaderNames[7],function(device){return loadPreprocessBlocksShader(device,7)}),forwardShuffleXShaderName,loadForwardShuffleXShader),forwardShuffleYShaderName,loadForwardShuffleYShader),forwardSingleReduceYShaderName,loadForwardSingleReduceYShader),forwardSingleShaderNames[1],function(device){return loadForwardSingleShader(device,1)}),forwardSingleShaderNames[2],function(device){return loadForwardSingleShader(device,2)}),forwardSingleShaderNames[3],function(device){return loadForwardSingleShader(device,3)}),_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_weightBlockMixed16x,forwardSingleShaderNames[4],function(device){return loadForwardSingleShader(device,4)}),forwardSingleShaderNames[5],function(device){return loadForwardSingleShader(device,5)}),forwardSingleShaderNames[6],function(device){return loadForwardSingleShader(device,6)}),forwardSingleShaderNames[7],function(device){return loadForwardSingleShader(device,7)}),forwardSingleShaderNames[8],function(device){return loadForwardSingleShader(device,8)}),forwardShaderNames[1],function(device){return loadForwardShader(device,1)}),forwardShaderNames[2],function(device){return loadForwardShader(device,2)}),forwardShaderNames[3],function(device){return loadForwardShader(device,3)}),forwardShaderNames[4],function(device){return loadForwardShader(device,4)}),forwardShaderNames[5],function(device){return loadForwardShader(device,5)}),_defineProperty(_defineProperty(_defineProperty(_defineProperty(_weightBlockMixed16x,forwardShaderNames[6],function(device){return loadForwardShader(device,6)}),forwardShaderNames[7],function(device){return loadForwardShader(device,7)}),forwardShaderNames[8],function(device){return loadForwardShader(device,8)}),addBiasShaderName,loadAddBiasShader));function ownKeys$1(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread$1(e){for(var r=1;r=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e1&&_args[1]!==undefined?_args[1]:{};time=_args.length>2&&_args[2]!==undefined?_args[2]:5e3;controller=new AbortController;config=_objectSpread(_objectSpread({},options),{},{signal:controller.signal});timeout=setTimeout(function(){controller.abort()},time);_context.next=7;return fetch(uri,config);case 7:response=_context.sent;clearTimeout(timeout);return _context.abrupt("return",response);case 10:case"end":return _context.stop()}},_callee)}));return _fetchWithTimeout.apply(this,arguments)}function open(_x2,_x3){return _open.apply(this,arguments)}function _open(){_open=_asyncToGenerator(_regeneratorRuntime.mark(function _callee2(path,mode){var error;return _regeneratorRuntime.wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:_context2.prev=0;_context2.next=3;return PvFileIDB.open(path,mode);case 3:return _context2.abrupt("return",_context2.sent);case 6:_context2.prev=6;_context2.t0=_context2["catch"](0);if(_context2.t0.name==="IndexedDBNotSupported"){console.warn("IndexedDB is not supported. Fallback to in-memory storage.")}else if(_context2.t0.name!=="FileNotExists"){console.warn("Unable to access IndexedDB (".concat(_context2.t0.toString(),"). Fallback to in-memory storage."))}if(!(typeof WorkerGlobalScope!=="undefined"&&self instanceof WorkerGlobalScope)){_context2.next=16;break}if(!(_context2.t0.name==="FileNotExists")){_context2.next=12;break}throw _context2.t0;case 12:console.error("In-memory storage cannot be used inside a worker.");error=new Error("Failed to start PvFile: ".concat(_context2.t0.toString()));error.name="PvFileNotSupported";throw error;case 16:return _context2.abrupt("return",PvFileMem.open(path,mode));case 17:case"end":return _context2.stop()}},_callee2,null,[[0,6]])}));return _open.apply(this,arguments)}var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=url=>{if(isFileURI(url)){return new Promise((reject,resolve)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response)}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}return fetch(url,{credentials:"same-origin"}).then(response=>{if(response.ok){return response.arrayBuffer()}return Promise.reject(new Error(response.status+" : "+response.url))})}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith("file://");function findWasmBinary(){var f="pv_orca.wasm";if(!isDataURI(f)){return locateFile(f)}return f}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary){return readAsync(binaryFile).then(response=>new Uint8Array(response),()=>getBinarySync(binaryFile))}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function getWasmImports(){return{a:wasmImports}}function createWasm(){var info=getWasmImports();function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=Asyncify.instrumentWasmExports(wasmExports);wasmMemory=wasmExports["u"];updateMemoryViews();wasmTable=wasmExports["Fb"];addOnInit(wasmExports["v"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}if(!wasmBinaryFile)wasmBinaryFile=findWasmBinary();instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var noExitRuntime=Module["noExitRuntime"]||true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();function syscallGetVarargI(){var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key of Object.keys(node.contents)){entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url).then(arrayBuffer=>{onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},err=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)};var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,processData,onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:class{constructor(errno){this.name="ErrnoError";this.errno=errno}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev;this.readMode=292|73;this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;iFS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""});FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS:MEMFS}},init(input,output,error){FS.init.initialized=true;Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit(){FS.init.initialized=false;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat(func,path,buf){var stat=func(path);HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;HEAP64[buf+24>>3]=BigInt(stat.size);HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>2]=atime%1e3*1e3;HEAP64[buf+56>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>2]=mtime%1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>2]=ctime%1e3*1e3;HEAP64[buf+88>>3]=BigInt(stat.ino);return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>{abort("")};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var __tzset_js=(timezone,daylight,std_name,dst_name)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffset2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToAscii=(str,buffer)=>{for(var i=0;i{var bufSize=0;getEnvStrings().forEach((string,i)=>{var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(string=>bufSize+=string.length+1);HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _pv_console_log_wasm(index){console.log(arrayBufferToStringAtIndex(Module.HEAPU8,index))}var _pv_file_close_wasm=async function(fileAddress,statusAddress){statusAddress=unsignedAddress(statusAddress);return Asyncify.handleAsync(async()=>{try{const file=await PvFile.getPtr(fileAddress);await file.close();setInt(statusAddress,0)}catch(e){console.error("pvFileCloseWasm",e);setInt(statusAddress,-1)}})};_pv_file_close_wasm.isAsync=true;var _pv_file_open_wasm=async function(fileAddress,pathAddress,modeAddress,statusAddress){pathAddress=unsignedAddress(pathAddress);modeAddress=unsignedAddress(modeAddress);statusAddress=unsignedAddress(statusAddress);return Asyncify.handleAsync(async()=>{const path=arrayBufferToStringAtIndex(Module.HEAPU8,pathAddress);const mode=arrayBufferToStringAtIndex(Module.HEAPU8,modeAddress);try{const file=await open(path,mode);PvFile.setPtr(fileAddress,file);setInt(statusAddress,0)}catch(e){if(e.name!=="FileNotExists"){console.error("pvFileOpenWasm",e)}setInt(statusAddress,-1)}})};_pv_file_open_wasm.isAsync=true;var _pv_file_read_wasm=async function(fileAddress,contentAddress,size,count,numReadAddress){contentAddress=unsignedAddress(contentAddress);numReadAddress=unsignedAddress(numReadAddress);return Asyncify.handleAsync(async()=>{try{const file=PvFile.getPtr(fileAddress);const content=await file.read(size,count);Module.HEAPU8.set(content,contentAddress);setInt(numReadAddress,content.length/size)}catch(e){console.error("pvFileReadWasm",e);setInt(numReadAddress,-1)}})};_pv_file_read_wasm.isAsync=true;function _pv_file_seek_wasm(fileAddress,offset,whence,statusAddress){statusAddress=unsignedAddress(statusAddress);try{const file=PvFile.getPtr(fileAddress);file.seek(offset,whence);setInt(statusAddress,0)}catch(e){console.error("pvFileSeekWasm",e);setInt(statusAddress,-1)}}function _pv_file_tell_wasm(fileAddress,offsetAddress){offsetAddress=unsignedAddress(offsetAddress);try{const file=PvFile.getPtr(fileAddress);setInt(offsetAddress,file.tell())}catch(e){console.error("pvFileTellWasm",e);setInt(offsetAddress,-1)}}var _pv_file_write_wasm=function(fileAddress,contentAddress,size,count,numWriteAddress){contentAddress=unsignedAddress(contentAddress);numWriteAddress=unsignedAddress(numWriteAddress);return Asyncify.handleAsync(async()=>{try{const file=PvFile.getPtr(fileAddress);const content=new Uint8Array(size*count);content.set(Module.HEAPU8.slice(contentAddress,contentAddress+size*count),0);await file.write(content);setInt(numWriteAddress,content.length/size)}catch(e){console.error("pvFileWriteWasm",e);setInt(numWriteAddress,-1)}})};var _pv_https_request_wasm=async function(httpMethodAddress,serverNameAddress,endpointAddress,headerAddress,bodyAddress,timeoutMs,responseAddressAddress,responseSizeAddress,responseCodeAddress){httpMethodAddress=unsignedAddress(httpMethodAddress);serverNameAddress=unsignedAddress(serverNameAddress);endpointAddress=unsignedAddress(endpointAddress);headerAddress=unsignedAddress(headerAddress);bodyAddress=unsignedAddress(bodyAddress);responseAddressAddress=unsignedAddress(responseAddressAddress);responseSizeAddress=unsignedAddress(responseSizeAddress);responseCodeAddress=unsignedAddress(responseCodeAddress);return Asyncify.handleAsync(async()=>{const httpMethod=arrayBufferToStringAtIndex(Module.HEAPU8,httpMethodAddress);const serverName=arrayBufferToStringAtIndex(Module.HEAPU8,serverNameAddress);const endpoint=arrayBufferToStringAtIndex(Module.HEAPU8,endpointAddress);const header=arrayBufferToStringAtIndex(Module.HEAPU8,headerAddress);const body=arrayBufferToStringAtIndex(Module.HEAPU8,bodyAddress);const headerObject=stringHeaderToObject(header);const options={method:httpMethod};if(body.length>0){options.body=body}if(Object.keys(headerObject).length>0){options.headers=headerObject}let response;let responseText;let statusCode;try{response=await fetchWithTimeout("https://"+serverName+endpoint,options,timeoutMs);statusCode=response.status}catch(error){console.error("pvHttpsRequestWasm",`Failed to fetch: ${error}`);return}try{responseText=await response.text()}catch(error){console.error("pvHttpsRequestWasm",`Failed to get response text: ${error}`);return}const responseAddress=Module._malloc((responseText.length+1)*Int8Array.BYTES_PER_ELEMENT);if(responseAddress===0){console.error("pvMallocError","pvHttpsRequestWasm: cannot allocate memory for response");setInt(responseAddressAddress,0);return}setInt(responseSizeAddress,responseText.length+1);setInt(responseAddressAddress,responseAddress);for(let i=0;i{try{return func()}catch(e){abort(e)}};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var sigToWasmTypes=sig=>{var typeNames={i:"i32",j:"i64",f:"f32",d:"f64",e:"externref",p:"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i{runtimeKeepaliveCounter+=1};var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};var Asyncify={instrumentWasmImports(imports){var importPattern=/^(pv_https_request_wasm|pv_file_open_wasm|pv_file_close_wasm|pv_file_read_wasm|pv_file_write_wasm|pv_file_remove_wasm|pv_sleep_wasm|pv_xpu_webgpu_device_init_wasm|pv_xpu_webgpu_device_info_wasm|pv_xpu_webgpu_device_mem_copy_from_xpu_wasm|pv_xpu_webgpu_device_wait_wasm|pv_xpu_webgpu_timer_stop_wasm|invoke_.*|__asyncjs__.*)$/;for(let[x,original]of Object.entries(imports)){if(typeof original=="function"){let isAsyncifyImport=original.isAsync||importPattern.test(x)}}},instrumentWasmExports(exports){var ret={};for(let[x,original]of Object.entries(exports)){if(typeof original=="function"){ret[x]=(...args)=>{Asyncify.exportCallStack.push(x);try{return original(...args)}finally{if(!ABORT){var y=Asyncify.exportCallStack.pop();Asyncify.maybeStopUnwind()}}}}else{ret[x]=original}}return ret},State:{Normal:0,Unwinding:1,Rewinding:2,Disabled:3},state:0,StackSize:4096,currData:null,handleSleepReturnValue:0,exportCallStack:[],callStackNameToId:{},callStackIdToName:{},callStackId:0,asyncPromiseHandlers:null,sleepCallbacks:[],getCallStackId(funcName){var id=Asyncify.callStackNameToId[funcName];if(id===undefined){id=Asyncify.callStackId++;Asyncify.callStackNameToId[funcName]=id;Asyncify.callStackIdToName[id]=funcName}return id},maybeStopUnwind(){if(Asyncify.currData&&Asyncify.state===Asyncify.State.Unwinding&&Asyncify.exportCallStack.length===0){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_unwind);if(typeof Fibers!="undefined"){Fibers.trampoline()}}},whenDone(){return new Promise((resolve,reject)=>{Asyncify.asyncPromiseHandlers={resolve:resolve,reject:reject}})},allocateData(){var ptr=_malloc(12+Asyncify.StackSize);Asyncify.setDataHeader(ptr,ptr+12,Asyncify.StackSize);Asyncify.setDataRewindFunc(ptr);return ptr},setDataHeader(ptr,stack,stackSize){HEAPU32[ptr>>2]=stack;HEAPU32[ptr+4>>2]=stack+stackSize},setDataRewindFunc(ptr){var bottomOfCallStack=Asyncify.exportCallStack[0];var rewindId=Asyncify.getCallStackId(bottomOfCallStack);HEAP32[ptr+8>>2]=rewindId},getDataRewindFuncName(ptr){var id=HEAP32[ptr+8>>2];var name=Asyncify.callStackIdToName[id];return name},getDataRewindFunc(name){var func=wasmExports[name];return func},doRewind(ptr){var name=Asyncify.getDataRewindFuncName(ptr);var func=Asyncify.getDataRewindFunc(name);return func()},handleSleep(startAsync){if(ABORT)return;if(Asyncify.state===Asyncify.State.Normal){var reachedCallback=false;var reachedAfterCallback=false;startAsync((handleSleepReturnValue=0)=>{if(ABORT)return;Asyncify.handleSleepReturnValue=handleSleepReturnValue;reachedCallback=true;if(!reachedAfterCallback){return}Asyncify.state=Asyncify.State.Rewinding;runAndAbortIfError(()=>_asyncify_start_rewind(Asyncify.currData));if(typeof Browser!="undefined"&&Browser.mainLoop.func){Browser.mainLoop.resume()}var asyncWasmReturnValue,isError=false;try{asyncWasmReturnValue=Asyncify.doRewind(Asyncify.currData)}catch(err){asyncWasmReturnValue=err;isError=true}var handled=false;if(!Asyncify.currData){var asyncPromiseHandlers=Asyncify.asyncPromiseHandlers;if(asyncPromiseHandlers){Asyncify.asyncPromiseHandlers=null;(isError?asyncPromiseHandlers.reject:asyncPromiseHandlers.resolve)(asyncWasmReturnValue);handled=true}}if(isError&&!handled){throw asyncWasmReturnValue}});reachedAfterCallback=true;if(!reachedCallback){Asyncify.state=Asyncify.State.Unwinding;Asyncify.currData=Asyncify.allocateData();if(typeof Browser!="undefined"&&Browser.mainLoop.func){Browser.mainLoop.pause()}runAndAbortIfError(()=>_asyncify_start_unwind(Asyncify.currData))}}else if(Asyncify.state===Asyncify.State.Rewinding){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_rewind);_free(Asyncify.currData);Asyncify.currData=null;Asyncify.sleepCallbacks.forEach(callUserCallback)}else{abort(`invalid state: ${Asyncify.state}`)}return Asyncify.handleSleepReturnValue},handleAsync(startAsync){return Asyncify.handleSleep(wakeUp=>{startAsync().then(wakeUp)})}};var uleb128Encode=(n,target)=>{if(n<128){target.push(n)}else{target.push(n%128|128,n>>7)}};var generateFuncType=(sig,target)=>{var sigRet=sig.slice(0,1);var sigParam=sig.slice(1);var typeCodes={i:127,p:127,j:126,f:125,d:124,e:111};target.push(96);uleb128Encode(sigParam.length,target);for(var i=0;i{if(typeof WebAssembly.Function=="function"){return new WebAssembly.Function(sigToWasmTypes(sig),func)}var typeSectionBody=[1];generateFuncType(sig,typeSectionBody);var bytes=[0,97,115,109,1,0,0,0,1];uleb128Encode(typeSectionBody.length,bytes);bytes.push(...typeSectionBody);bytes.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);var module=new WebAssembly.Module(new Uint8Array(bytes));var instance=new WebAssembly.Instance(module,{e:{f:func}});var wrappedFunc=instance.exports["f"];return wrappedFunc};var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var updateTableMap=(offset,count)=>{if(functionsInTableMap){for(var i=offset;i{if(!functionsInTableMap){functionsInTableMap=new WeakMap;updateTableMap(0,wasmTable.length)}return functionsInTableMap.get(func)||0};var freeTableIndexes=[];var getEmptyTableSlot=()=>{if(freeTableIndexes.length){return freeTableIndexes.pop()}try{wasmTable.grow(1)}catch(err){if(!(err instanceof RangeError)){throw err}throw"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH."}return wasmTable.length-1};var setWasmTableEntry=(idx,func)=>{wasmTable.set(idx,func);wasmTableMirror[idx]=wasmTable.get(idx)};var addFunction=(func,sig)=>{var rtn=getFunctionAddress(func);if(rtn){return rtn}var ret=getEmptyTableSlot();try{setWasmTableEntry(ret,func)}catch(err){if(!(err instanceof TypeError)){throw err}var wrapped=convertJsFunctionToWasm(func,sig);setWasmTableEntry(ret,wrapped)}functionsInTableMap.set(func,ret);return ret};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};Module["cwrap"]=cwrap;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();var wasmImports={h:___syscall_openat,i:__abort_js,s:__tzset_js,p:_emscripten_resize_heap,q:_environ_get,r:_environ_sizes_get,c:_exit,b:_fd_close,g:_fd_read,f:_fd_seek,a:_fd_write,e:_pv_console_log_wasm,n:_pv_file_close_wasm,o:_pv_file_open_wasm,d:_pv_file_read_wasm,m:_pv_file_seek_wasm,l:_pv_file_tell_wasm,k:_pv_file_write_wasm,j:_pv_https_request_wasm,t:_pv_time_wasm};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["v"])();var __Znwm=Module["__Znwm"]=a0=>(__Znwm=Module["__Znwm"]=wasmExports["w"])(a0);var __Znam=Module["__Znam"]=a0=>(__Znam=Module["__Znam"]=wasmExports["x"])(a0);var __ZdlPv=Module["__ZdlPv"]=a0=>(__ZdlPv=Module["__ZdlPv"]=wasmExports["y"])(a0);var __ZdlPvm=Module["__ZdlPvm"]=(a0,a1)=>(__ZdlPvm=Module["__ZdlPvm"]=wasmExports["z"])(a0,a1);var __ZdaPv=Module["__ZdaPv"]=a0=>(__ZdaPv=Module["__ZdaPv"]=wasmExports["A"])(a0);var __ZdaPvm=Module["__ZdaPvm"]=(a0,a1)=>(__ZdaPvm=Module["__ZdaPvm"]=wasmExports["B"])(a0,a1);var __ZnwmSt11align_val_t=Module["__ZnwmSt11align_val_t"]=(a0,a1)=>(__ZnwmSt11align_val_t=Module["__ZnwmSt11align_val_t"]=wasmExports["C"])(a0,a1);var __ZnamSt11align_val_t=Module["__ZnamSt11align_val_t"]=(a0,a1)=>(__ZnamSt11align_val_t=Module["__ZnamSt11align_val_t"]=wasmExports["D"])(a0,a1);var __ZdlPvSt11align_val_t=Module["__ZdlPvSt11align_val_t"]=(a0,a1)=>(__ZdlPvSt11align_val_t=Module["__ZdlPvSt11align_val_t"]=wasmExports["E"])(a0,a1);var __ZdlPvmSt11align_val_t=Module["__ZdlPvmSt11align_val_t"]=(a0,a1,a2)=>(__ZdlPvmSt11align_val_t=Module["__ZdlPvmSt11align_val_t"]=wasmExports["F"])(a0,a1,a2);var __ZdaPvSt11align_val_t=Module["__ZdaPvSt11align_val_t"]=(a0,a1)=>(__ZdaPvSt11align_val_t=Module["__ZdaPvSt11align_val_t"]=wasmExports["G"])(a0,a1);var __ZdaPvmSt11align_val_t=Module["__ZdaPvmSt11align_val_t"]=(a0,a1,a2)=>(__ZdaPvmSt11align_val_t=Module["__ZdaPvmSt11align_val_t"]=wasmExports["H"])(a0,a1,a2);var __ZSt14set_unexpectedPFvvE=Module["__ZSt14set_unexpectedPFvvE"]=a0=>(__ZSt14set_unexpectedPFvvE=Module["__ZSt14set_unexpectedPFvvE"]=wasmExports["I"])(a0);var __ZSt13set_terminatePFvvE=Module["__ZSt13set_terminatePFvvE"]=a0=>(__ZSt13set_terminatePFvvE=Module["__ZSt13set_terminatePFvvE"]=wasmExports["J"])(a0);var __ZSt15set_new_handlerPFvvE=Module["__ZSt15set_new_handlerPFvvE"]=a0=>(__ZSt15set_new_handlerPFvvE=Module["__ZSt15set_new_handlerPFvvE"]=wasmExports["K"])(a0);var __ZSt14get_unexpectedv=Module["__ZSt14get_unexpectedv"]=()=>(__ZSt14get_unexpectedv=Module["__ZSt14get_unexpectedv"]=wasmExports["L"])();var __ZSt10unexpectedv=Module["__ZSt10unexpectedv"]=()=>(__ZSt10unexpectedv=Module["__ZSt10unexpectedv"]=wasmExports["M"])();var __ZSt13get_terminatev=Module["__ZSt13get_terminatev"]=()=>(__ZSt13get_terminatev=Module["__ZSt13get_terminatev"]=wasmExports["N"])();var __ZSt9terminatev=Module["__ZSt9terminatev"]=()=>(__ZSt9terminatev=Module["__ZSt9terminatev"]=wasmExports["O"])();var __ZSt15get_new_handlerv=Module["__ZSt15get_new_handlerv"]=()=>(__ZSt15get_new_handlerv=Module["__ZSt15get_new_handlerv"]=wasmExports["P"])();var ___cxa_current_primary_exception=Module["___cxa_current_primary_exception"]=()=>(___cxa_current_primary_exception=Module["___cxa_current_primary_exception"]=wasmExports["Q"])();var ___cxa_rethrow_primary_exception=Module["___cxa_rethrow_primary_exception"]=a0=>(___cxa_rethrow_primary_exception=Module["___cxa_rethrow_primary_exception"]=wasmExports["R"])(a0);var ___cxa_uncaught_exception=Module["___cxa_uncaught_exception"]=()=>(___cxa_uncaught_exception=Module["___cxa_uncaught_exception"]=wasmExports["S"])();var ___cxa_uncaught_exceptions=Module["___cxa_uncaught_exceptions"]=()=>(___cxa_uncaught_exceptions=Module["___cxa_uncaught_exceptions"]=wasmExports["T"])();var ___cxa_allocate_exception=Module["___cxa_allocate_exception"]=a0=>(___cxa_allocate_exception=Module["___cxa_allocate_exception"]=wasmExports["U"])(a0);var ___cxa_free_exception=Module["___cxa_free_exception"]=a0=>(___cxa_free_exception=Module["___cxa_free_exception"]=wasmExports["V"])(a0);var ___cxa_init_primary_exception=Module["___cxa_init_primary_exception"]=(a0,a1,a2)=>(___cxa_init_primary_exception=Module["___cxa_init_primary_exception"]=wasmExports["W"])(a0,a1,a2);var ___cxa_pure_virtual=Module["___cxa_pure_virtual"]=()=>(___cxa_pure_virtual=Module["___cxa_pure_virtual"]=wasmExports["X"])();var ___cxa_deleted_virtual=Module["___cxa_deleted_virtual"]=()=>(___cxa_deleted_virtual=Module["___cxa_deleted_virtual"]=wasmExports["Y"])();var ___dynamic_cast=Module["___dynamic_cast"]=(a0,a1,a2,a3)=>(___dynamic_cast=Module["___dynamic_cast"]=wasmExports["Z"])(a0,a1,a2,a3);var __ZNSt9exceptionD2Ev=Module["__ZNSt9exceptionD2Ev"]=a0=>(__ZNSt9exceptionD2Ev=Module["__ZNSt9exceptionD2Ev"]=wasmExports["_"])(a0);var __ZNSt9exceptionD0Ev=Module["__ZNSt9exceptionD0Ev"]=a0=>(__ZNSt9exceptionD0Ev=Module["__ZNSt9exceptionD0Ev"]=wasmExports["$"])(a0);var __ZNSt9exceptionD1Ev=Module["__ZNSt9exceptionD1Ev"]=a0=>(__ZNSt9exceptionD1Ev=Module["__ZNSt9exceptionD1Ev"]=wasmExports["aa"])(a0);var __ZNKSt9exception4whatEv=Module["__ZNKSt9exception4whatEv"]=a0=>(__ZNKSt9exception4whatEv=Module["__ZNKSt9exception4whatEv"]=wasmExports["ba"])(a0);var __ZNSt13bad_exceptionD0Ev=Module["__ZNSt13bad_exceptionD0Ev"]=a0=>(__ZNSt13bad_exceptionD0Ev=Module["__ZNSt13bad_exceptionD0Ev"]=wasmExports["ca"])(a0);var __ZNSt13bad_exceptionD1Ev=Module["__ZNSt13bad_exceptionD1Ev"]=a0=>(__ZNSt13bad_exceptionD1Ev=Module["__ZNSt13bad_exceptionD1Ev"]=wasmExports["da"])(a0);var __ZNKSt13bad_exception4whatEv=Module["__ZNKSt13bad_exception4whatEv"]=a0=>(__ZNKSt13bad_exception4whatEv=Module["__ZNKSt13bad_exception4whatEv"]=wasmExports["ea"])(a0);var __ZNSt9bad_allocC2Ev=Module["__ZNSt9bad_allocC2Ev"]=a0=>(__ZNSt9bad_allocC2Ev=Module["__ZNSt9bad_allocC2Ev"]=wasmExports["fa"])(a0);var __ZNSt9bad_allocD0Ev=Module["__ZNSt9bad_allocD0Ev"]=a0=>(__ZNSt9bad_allocD0Ev=Module["__ZNSt9bad_allocD0Ev"]=wasmExports["ga"])(a0);var __ZNSt9bad_allocD1Ev=Module["__ZNSt9bad_allocD1Ev"]=a0=>(__ZNSt9bad_allocD1Ev=Module["__ZNSt9bad_allocD1Ev"]=wasmExports["ha"])(a0);var __ZNKSt9bad_alloc4whatEv=Module["__ZNKSt9bad_alloc4whatEv"]=a0=>(__ZNKSt9bad_alloc4whatEv=Module["__ZNKSt9bad_alloc4whatEv"]=wasmExports["ia"])(a0);var __ZNSt20bad_array_new_lengthC2Ev=Module["__ZNSt20bad_array_new_lengthC2Ev"]=a0=>(__ZNSt20bad_array_new_lengthC2Ev=Module["__ZNSt20bad_array_new_lengthC2Ev"]=wasmExports["ja"])(a0);var __ZNSt20bad_array_new_lengthD0Ev=Module["__ZNSt20bad_array_new_lengthD0Ev"]=a0=>(__ZNSt20bad_array_new_lengthD0Ev=Module["__ZNSt20bad_array_new_lengthD0Ev"]=wasmExports["ka"])(a0);var __ZNSt20bad_array_new_lengthD1Ev=Module["__ZNSt20bad_array_new_lengthD1Ev"]=a0=>(__ZNSt20bad_array_new_lengthD1Ev=Module["__ZNSt20bad_array_new_lengthD1Ev"]=wasmExports["la"])(a0);var __ZNKSt20bad_array_new_length4whatEv=Module["__ZNKSt20bad_array_new_length4whatEv"]=a0=>(__ZNKSt20bad_array_new_length4whatEv=Module["__ZNKSt20bad_array_new_length4whatEv"]=wasmExports["ma"])(a0);var __ZNSt13bad_exceptionD2Ev=Module["__ZNSt13bad_exceptionD2Ev"]=a0=>(__ZNSt13bad_exceptionD2Ev=Module["__ZNSt13bad_exceptionD2Ev"]=wasmExports["na"])(a0);var __ZNSt9bad_allocC1Ev=Module["__ZNSt9bad_allocC1Ev"]=a0=>(__ZNSt9bad_allocC1Ev=Module["__ZNSt9bad_allocC1Ev"]=wasmExports["oa"])(a0);var __ZNSt9bad_allocD2Ev=Module["__ZNSt9bad_allocD2Ev"]=a0=>(__ZNSt9bad_allocD2Ev=Module["__ZNSt9bad_allocD2Ev"]=wasmExports["pa"])(a0);var __ZNSt20bad_array_new_lengthC1Ev=Module["__ZNSt20bad_array_new_lengthC1Ev"]=a0=>(__ZNSt20bad_array_new_lengthC1Ev=Module["__ZNSt20bad_array_new_lengthC1Ev"]=wasmExports["qa"])(a0);var __ZNSt20bad_array_new_lengthD2Ev=Module["__ZNSt20bad_array_new_lengthD2Ev"]=a0=>(__ZNSt20bad_array_new_lengthD2Ev=Module["__ZNSt20bad_array_new_lengthD2Ev"]=wasmExports["ra"])(a0);var __ZNSt11logic_errorD2Ev=Module["__ZNSt11logic_errorD2Ev"]=a0=>(__ZNSt11logic_errorD2Ev=Module["__ZNSt11logic_errorD2Ev"]=wasmExports["sa"])(a0);var __ZNSt11logic_errorD0Ev=Module["__ZNSt11logic_errorD0Ev"]=a0=>(__ZNSt11logic_errorD0Ev=Module["__ZNSt11logic_errorD0Ev"]=wasmExports["ta"])(a0);var __ZNSt11logic_errorD1Ev=Module["__ZNSt11logic_errorD1Ev"]=a0=>(__ZNSt11logic_errorD1Ev=Module["__ZNSt11logic_errorD1Ev"]=wasmExports["ua"])(a0);var __ZNKSt11logic_error4whatEv=Module["__ZNKSt11logic_error4whatEv"]=a0=>(__ZNKSt11logic_error4whatEv=Module["__ZNKSt11logic_error4whatEv"]=wasmExports["va"])(a0);var __ZNSt13runtime_errorD2Ev=Module["__ZNSt13runtime_errorD2Ev"]=a0=>(__ZNSt13runtime_errorD2Ev=Module["__ZNSt13runtime_errorD2Ev"]=wasmExports["wa"])(a0);var __ZNSt13runtime_errorD0Ev=Module["__ZNSt13runtime_errorD0Ev"]=a0=>(__ZNSt13runtime_errorD0Ev=Module["__ZNSt13runtime_errorD0Ev"]=wasmExports["xa"])(a0);var __ZNSt13runtime_errorD1Ev=Module["__ZNSt13runtime_errorD1Ev"]=a0=>(__ZNSt13runtime_errorD1Ev=Module["__ZNSt13runtime_errorD1Ev"]=wasmExports["ya"])(a0);var __ZNKSt13runtime_error4whatEv=Module["__ZNKSt13runtime_error4whatEv"]=a0=>(__ZNKSt13runtime_error4whatEv=Module["__ZNKSt13runtime_error4whatEv"]=wasmExports["za"])(a0);var __ZNSt12domain_errorD0Ev=Module["__ZNSt12domain_errorD0Ev"]=a0=>(__ZNSt12domain_errorD0Ev=Module["__ZNSt12domain_errorD0Ev"]=wasmExports["Aa"])(a0);var __ZNSt12domain_errorD1Ev=Module["__ZNSt12domain_errorD1Ev"]=a0=>(__ZNSt12domain_errorD1Ev=Module["__ZNSt12domain_errorD1Ev"]=wasmExports["Ba"])(a0);var __ZNSt16invalid_argumentD0Ev=Module["__ZNSt16invalid_argumentD0Ev"]=a0=>(__ZNSt16invalid_argumentD0Ev=Module["__ZNSt16invalid_argumentD0Ev"]=wasmExports["Ca"])(a0);var __ZNSt16invalid_argumentD1Ev=Module["__ZNSt16invalid_argumentD1Ev"]=a0=>(__ZNSt16invalid_argumentD1Ev=Module["__ZNSt16invalid_argumentD1Ev"]=wasmExports["Da"])(a0);var __ZNSt12length_errorD0Ev=Module["__ZNSt12length_errorD0Ev"]=a0=>(__ZNSt12length_errorD0Ev=Module["__ZNSt12length_errorD0Ev"]=wasmExports["Ea"])(a0);var __ZNSt12length_errorD1Ev=Module["__ZNSt12length_errorD1Ev"]=a0=>(__ZNSt12length_errorD1Ev=Module["__ZNSt12length_errorD1Ev"]=wasmExports["Fa"])(a0);var __ZNSt12out_of_rangeD0Ev=Module["__ZNSt12out_of_rangeD0Ev"]=a0=>(__ZNSt12out_of_rangeD0Ev=Module["__ZNSt12out_of_rangeD0Ev"]=wasmExports["Ga"])(a0);var __ZNSt12out_of_rangeD1Ev=Module["__ZNSt12out_of_rangeD1Ev"]=a0=>(__ZNSt12out_of_rangeD1Ev=Module["__ZNSt12out_of_rangeD1Ev"]=wasmExports["Ha"])(a0);var __ZNSt11range_errorD0Ev=Module["__ZNSt11range_errorD0Ev"]=a0=>(__ZNSt11range_errorD0Ev=Module["__ZNSt11range_errorD0Ev"]=wasmExports["Ia"])(a0);var __ZNSt11range_errorD1Ev=Module["__ZNSt11range_errorD1Ev"]=a0=>(__ZNSt11range_errorD1Ev=Module["__ZNSt11range_errorD1Ev"]=wasmExports["Ja"])(a0);var __ZNSt14overflow_errorD0Ev=Module["__ZNSt14overflow_errorD0Ev"]=a0=>(__ZNSt14overflow_errorD0Ev=Module["__ZNSt14overflow_errorD0Ev"]=wasmExports["Ka"])(a0);var __ZNSt14overflow_errorD1Ev=Module["__ZNSt14overflow_errorD1Ev"]=a0=>(__ZNSt14overflow_errorD1Ev=Module["__ZNSt14overflow_errorD1Ev"]=wasmExports["La"])(a0);var __ZNSt15underflow_errorD0Ev=Module["__ZNSt15underflow_errorD0Ev"]=a0=>(__ZNSt15underflow_errorD0Ev=Module["__ZNSt15underflow_errorD0Ev"]=wasmExports["Ma"])(a0);var __ZNSt15underflow_errorD1Ev=Module["__ZNSt15underflow_errorD1Ev"]=a0=>(__ZNSt15underflow_errorD1Ev=Module["__ZNSt15underflow_errorD1Ev"]=wasmExports["Na"])(a0);var __ZNSt12domain_errorD2Ev=Module["__ZNSt12domain_errorD2Ev"]=a0=>(__ZNSt12domain_errorD2Ev=Module["__ZNSt12domain_errorD2Ev"]=wasmExports["Oa"])(a0);var __ZNSt16invalid_argumentD2Ev=Module["__ZNSt16invalid_argumentD2Ev"]=a0=>(__ZNSt16invalid_argumentD2Ev=Module["__ZNSt16invalid_argumentD2Ev"]=wasmExports["Pa"])(a0);var __ZNSt12length_errorD2Ev=Module["__ZNSt12length_errorD2Ev"]=a0=>(__ZNSt12length_errorD2Ev=Module["__ZNSt12length_errorD2Ev"]=wasmExports["Qa"])(a0);var __ZNSt12out_of_rangeD2Ev=Module["__ZNSt12out_of_rangeD2Ev"]=a0=>(__ZNSt12out_of_rangeD2Ev=Module["__ZNSt12out_of_rangeD2Ev"]=wasmExports["Ra"])(a0);var __ZNSt11range_errorD2Ev=Module["__ZNSt11range_errorD2Ev"]=a0=>(__ZNSt11range_errorD2Ev=Module["__ZNSt11range_errorD2Ev"]=wasmExports["Sa"])(a0);var __ZNSt14overflow_errorD2Ev=Module["__ZNSt14overflow_errorD2Ev"]=a0=>(__ZNSt14overflow_errorD2Ev=Module["__ZNSt14overflow_errorD2Ev"]=wasmExports["Ta"])(a0);var __ZNSt15underflow_errorD2Ev=Module["__ZNSt15underflow_errorD2Ev"]=a0=>(__ZNSt15underflow_errorD2Ev=Module["__ZNSt15underflow_errorD2Ev"]=wasmExports["Ua"])(a0);var __ZNSt9type_infoD2Ev=Module["__ZNSt9type_infoD2Ev"]=a0=>(__ZNSt9type_infoD2Ev=Module["__ZNSt9type_infoD2Ev"]=wasmExports["Va"])(a0);var __ZNSt9type_infoD0Ev=Module["__ZNSt9type_infoD0Ev"]=a0=>(__ZNSt9type_infoD0Ev=Module["__ZNSt9type_infoD0Ev"]=wasmExports["Wa"])(a0);var __ZNSt9type_infoD1Ev=Module["__ZNSt9type_infoD1Ev"]=a0=>(__ZNSt9type_infoD1Ev=Module["__ZNSt9type_infoD1Ev"]=wasmExports["Xa"])(a0);var __ZNSt8bad_castC2Ev=Module["__ZNSt8bad_castC2Ev"]=a0=>(__ZNSt8bad_castC2Ev=Module["__ZNSt8bad_castC2Ev"]=wasmExports["Ya"])(a0);var __ZNSt8bad_castD2Ev=Module["__ZNSt8bad_castD2Ev"]=a0=>(__ZNSt8bad_castD2Ev=Module["__ZNSt8bad_castD2Ev"]=wasmExports["Za"])(a0);var __ZNSt8bad_castD0Ev=Module["__ZNSt8bad_castD0Ev"]=a0=>(__ZNSt8bad_castD0Ev=Module["__ZNSt8bad_castD0Ev"]=wasmExports["_a"])(a0);var __ZNSt8bad_castD1Ev=Module["__ZNSt8bad_castD1Ev"]=a0=>(__ZNSt8bad_castD1Ev=Module["__ZNSt8bad_castD1Ev"]=wasmExports["$a"])(a0);var __ZNKSt8bad_cast4whatEv=Module["__ZNKSt8bad_cast4whatEv"]=a0=>(__ZNKSt8bad_cast4whatEv=Module["__ZNKSt8bad_cast4whatEv"]=wasmExports["ab"])(a0);var __ZNSt10bad_typeidC2Ev=Module["__ZNSt10bad_typeidC2Ev"]=a0=>(__ZNSt10bad_typeidC2Ev=Module["__ZNSt10bad_typeidC2Ev"]=wasmExports["bb"])(a0);var __ZNSt10bad_typeidD2Ev=Module["__ZNSt10bad_typeidD2Ev"]=a0=>(__ZNSt10bad_typeidD2Ev=Module["__ZNSt10bad_typeidD2Ev"]=wasmExports["cb"])(a0);var __ZNSt10bad_typeidD0Ev=Module["__ZNSt10bad_typeidD0Ev"]=a0=>(__ZNSt10bad_typeidD0Ev=Module["__ZNSt10bad_typeidD0Ev"]=wasmExports["db"])(a0);var __ZNSt10bad_typeidD1Ev=Module["__ZNSt10bad_typeidD1Ev"]=a0=>(__ZNSt10bad_typeidD1Ev=Module["__ZNSt10bad_typeidD1Ev"]=wasmExports["eb"])(a0);var __ZNKSt10bad_typeid4whatEv=Module["__ZNKSt10bad_typeid4whatEv"]=a0=>(__ZNKSt10bad_typeid4whatEv=Module["__ZNKSt10bad_typeid4whatEv"]=wasmExports["fb"])(a0);var __ZNSt8bad_castC1Ev=Module["__ZNSt8bad_castC1Ev"]=a0=>(__ZNSt8bad_castC1Ev=Module["__ZNSt8bad_castC1Ev"]=wasmExports["gb"])(a0);var __ZNSt10bad_typeidC1Ev=Module["__ZNSt10bad_typeidC1Ev"]=a0=>(__ZNSt10bad_typeidC1Ev=Module["__ZNSt10bad_typeidC1Ev"]=wasmExports["hb"])(a0);var _pv_orca_init=Module["_pv_orca_init"]=(a0,a1,a2)=>(_pv_orca_init=Module["_pv_orca_init"]=wasmExports["ib"])(a0,a1,a2);var _free=a0=>(_free=wasmExports["jb"])(a0);var _pv_orca_delete=Module["_pv_orca_delete"]=a0=>(_pv_orca_delete=Module["_pv_orca_delete"]=wasmExports["kb"])(a0);var _malloc=Module["_malloc"]=a0=>(_malloc=Module["_malloc"]=wasmExports["lb"])(a0);var _pv_orca_version=Module["_pv_orca_version"]=()=>(_pv_orca_version=Module["_pv_orca_version"]=wasmExports["mb"])();var _pv_orca_valid_characters=Module["_pv_orca_valid_characters"]=(a0,a1,a2)=>(_pv_orca_valid_characters=Module["_pv_orca_valid_characters"]=wasmExports["nb"])(a0,a1,a2);var _pv_orca_sample_rate=Module["_pv_orca_sample_rate"]=(a0,a1)=>(_pv_orca_sample_rate=Module["_pv_orca_sample_rate"]=wasmExports["ob"])(a0,a1);var _pv_orca_word_alignments_delete=Module["_pv_orca_word_alignments_delete"]=(a0,a1)=>(_pv_orca_word_alignments_delete=Module["_pv_orca_word_alignments_delete"]=wasmExports["pb"])(a0,a1);var _pv_orca_synthesize=Module["_pv_orca_synthesize"]=(a0,a1,a2,a3,a4,a5,a6)=>(_pv_orca_synthesize=Module["_pv_orca_synthesize"]=wasmExports["qb"])(a0,a1,a2,a3,a4,a5,a6);var _pv_orca_synthesize_to_file=Module["_pv_orca_synthesize_to_file"]=(a0,a1,a2,a3,a4,a5)=>(_pv_orca_synthesize_to_file=Module["_pv_orca_synthesize_to_file"]=wasmExports["rb"])(a0,a1,a2,a3,a4,a5);var _pv_orca_pcm_delete=Module["_pv_orca_pcm_delete"]=a0=>(_pv_orca_pcm_delete=Module["_pv_orca_pcm_delete"]=wasmExports["sb"])(a0);var _pv_orca_synthesize_params_init=Module["_pv_orca_synthesize_params_init"]=a0=>(_pv_orca_synthesize_params_init=Module["_pv_orca_synthesize_params_init"]=wasmExports["tb"])(a0);var _pv_orca_synthesize_params_delete=Module["_pv_orca_synthesize_params_delete"]=a0=>(_pv_orca_synthesize_params_delete=Module["_pv_orca_synthesize_params_delete"]=wasmExports["ub"])(a0);var _pv_orca_synthesize_params_set_speech_rate=Module["_pv_orca_synthesize_params_set_speech_rate"]=(a0,a1)=>(_pv_orca_synthesize_params_set_speech_rate=Module["_pv_orca_synthesize_params_set_speech_rate"]=wasmExports["vb"])(a0,a1);var _pv_orca_synthesize_params_get_speech_rate=Module["_pv_orca_synthesize_params_get_speech_rate"]=(a0,a1)=>(_pv_orca_synthesize_params_get_speech_rate=Module["_pv_orca_synthesize_params_get_speech_rate"]=wasmExports["wb"])(a0,a1);var _pv_orca_synthesize_params_set_random_state=Module["_pv_orca_synthesize_params_set_random_state"]=(a0,a1)=>(_pv_orca_synthesize_params_set_random_state=Module["_pv_orca_synthesize_params_set_random_state"]=wasmExports["xb"])(a0,a1);var _pv_orca_synthesize_params_get_random_state=Module["_pv_orca_synthesize_params_get_random_state"]=(a0,a1)=>(_pv_orca_synthesize_params_get_random_state=Module["_pv_orca_synthesize_params_get_random_state"]=wasmExports["yb"])(a0,a1);var _pv_orca_valid_characters_delete=Module["_pv_orca_valid_characters_delete"]=a0=>(_pv_orca_valid_characters_delete=Module["_pv_orca_valid_characters_delete"]=wasmExports["zb"])(a0);var _pv_orca_max_character_limit=Module["_pv_orca_max_character_limit"]=(a0,a1)=>(_pv_orca_max_character_limit=Module["_pv_orca_max_character_limit"]=wasmExports["Ab"])(a0,a1);var _pv_orca_stream_open=Module["_pv_orca_stream_open"]=(a0,a1,a2)=>(_pv_orca_stream_open=Module["_pv_orca_stream_open"]=wasmExports["Bb"])(a0,a1,a2);var _pv_orca_stream_close=Module["_pv_orca_stream_close"]=a0=>(_pv_orca_stream_close=Module["_pv_orca_stream_close"]=wasmExports["Cb"])(a0);var _pv_orca_stream_synthesize=Module["_pv_orca_stream_synthesize"]=(a0,a1,a2,a3)=>(_pv_orca_stream_synthesize=Module["_pv_orca_stream_synthesize"]=wasmExports["Db"])(a0,a1,a2,a3);var _pv_orca_stream_flush=Module["_pv_orca_stream_flush"]=(a0,a1,a2)=>(_pv_orca_stream_flush=Module["_pv_orca_stream_flush"]=wasmExports["Eb"])(a0,a1,a2);var _pv_status_to_string=Module["_pv_status_to_string"]=a0=>(_pv_status_to_string=Module["_pv_status_to_string"]=wasmExports["Gb"])(a0);var _pv_sample_rate=Module["_pv_sample_rate"]=()=>(_pv_sample_rate=Module["_pv_sample_rate"]=wasmExports["Hb"])();var _pv_log_enable=Module["_pv_log_enable"]=()=>(_pv_log_enable=Module["_pv_log_enable"]=wasmExports["Ib"])();var _pv_log_disable=Module["_pv_log_disable"]=()=>(_pv_log_disable=Module["_pv_log_disable"]=wasmExports["Jb"])();var _aligned_alloc=Module["_aligned_alloc"]=(a0,a1)=>(_aligned_alloc=Module["_aligned_alloc"]=wasmExports["Kb"])(a0,a1);var _pv_get_sdk=Module["_pv_get_sdk"]=()=>(_pv_get_sdk=Module["_pv_get_sdk"]=wasmExports["Lb"])();var _pv_set_sdk=Module["_pv_set_sdk"]=a0=>(_pv_set_sdk=Module["_pv_set_sdk"]=wasmExports["Mb"])(a0);var _pv_free=Module["_pv_free"]=a0=>(_pv_free=Module["_pv_free"]=wasmExports["Nb"])(a0);var _pv_get_error_stack=Module["_pv_get_error_stack"]=(a0,a1)=>(_pv_get_error_stack=Module["_pv_get_error_stack"]=wasmExports["Ob"])(a0,a1);var _pv_free_error_stack=Module["_pv_free_error_stack"]=a0=>(_pv_free_error_stack=Module["_pv_free_error_stack"]=wasmExports["Pb"])(a0);var __emscripten_memcpy_bulkmem=Module["__emscripten_memcpy_bulkmem"]=(a0,a1,a2)=>(__emscripten_memcpy_bulkmem=Module["__emscripten_memcpy_bulkmem"]=wasmExports["Qb"])(a0,a1,a2);var __emscripten_memset_bulkmem=Module["__emscripten_memset_bulkmem"]=(a0,a1,a2)=>(__emscripten_memset_bulkmem=Module["__emscripten_memset_bulkmem"]=wasmExports["Rb"])(a0,a1,a2);var __emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports["Sb"])(a0);var __emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports["Tb"])(a0);var _emscripten_stack_get_current=()=>(_emscripten_stack_get_current=wasmExports["Ub"])();var _asyncify_start_unwind=a0=>(_asyncify_start_unwind=wasmExports["Vb"])(a0);var _asyncify_stop_unwind=()=>(_asyncify_stop_unwind=wasmExports["Wb"])();var _asyncify_start_rewind=a0=>(_asyncify_start_rewind=wasmExports["Xb"])(a0);var _asyncify_stop_rewind=()=>(_asyncify_stop_rewind=wasmExports["Yb"])();var ___cxa_unexpected_handler=Module["___cxa_unexpected_handler"]=2370504;var ___cxa_terminate_handler=Module["___cxa_terminate_handler"]=2370500;var ___cxa_new_handler=Module["___cxa_new_handler"]=2373600;var __ZTIN10__cxxabiv116__shim_type_infoE=Module["__ZTIN10__cxxabiv116__shim_type_infoE"]=50212;var __ZTIN10__cxxabiv117__class_type_infoE=Module["__ZTIN10__cxxabiv117__class_type_infoE"]=50260;var __ZTIN10__cxxabiv117__pbase_type_infoE=Module["__ZTIN10__cxxabiv117__pbase_type_infoE"]=50308;var __ZTIDn=Module["__ZTIDn"]=50656;var __ZTIN10__cxxabiv119__pointer_type_infoE=Module["__ZTIN10__cxxabiv119__pointer_type_infoE"]=50356;var __ZTIv=Module["__ZTIv"]=50604;var __ZTIN10__cxxabiv120__function_type_infoE=Module["__ZTIN10__cxxabiv120__function_type_infoE"]=50408;var __ZTIN10__cxxabiv129__pointer_to_member_type_infoE=Module["__ZTIN10__cxxabiv129__pointer_to_member_type_infoE"]=50468;var __ZTSN10__cxxabiv116__shim_type_infoE=Module["__ZTSN10__cxxabiv116__shim_type_infoE"]=50176;var __ZTVN10__cxxabiv120__si_class_type_infoE=Module["__ZTVN10__cxxabiv120__si_class_type_infoE"]=52140;var __ZTSN10__cxxabiv117__class_type_infoE=Module["__ZTSN10__cxxabiv117__class_type_infoE"]=50224;var __ZTSN10__cxxabiv117__pbase_type_infoE=Module["__ZTSN10__cxxabiv117__pbase_type_infoE"]=50272;var __ZTSN10__cxxabiv119__pointer_type_infoE=Module["__ZTSN10__cxxabiv119__pointer_type_infoE"]=50320;var __ZTSN10__cxxabiv120__function_type_infoE=Module["__ZTSN10__cxxabiv120__function_type_infoE"]=50368;var __ZTSN10__cxxabiv129__pointer_to_member_type_infoE=Module["__ZTSN10__cxxabiv129__pointer_to_member_type_infoE"]=50420;var __ZTVN10__cxxabiv116__shim_type_infoE=Module["__ZTVN10__cxxabiv116__shim_type_infoE"]=50492;var __ZTVN10__cxxabiv123__fundamental_type_infoE=Module["__ZTVN10__cxxabiv123__fundamental_type_infoE"]=50520;var __ZTIN10__cxxabiv123__fundamental_type_infoE=Module["__ZTIN10__cxxabiv123__fundamental_type_infoE"]=50588;var __ZTSN10__cxxabiv123__fundamental_type_infoE=Module["__ZTSN10__cxxabiv123__fundamental_type_infoE"]=50548;var __ZTSv=Module["__ZTSv"]=50600;var __ZTSPv=Module["__ZTSPv"]=50612;var __ZTIPv=Module["__ZTIPv"]=50616;var __ZTVN10__cxxabiv119__pointer_type_infoE=Module["__ZTVN10__cxxabiv119__pointer_type_infoE"]=52352;var __ZTSPKv=Module["__ZTSPKv"]=50632;var __ZTIPKv=Module["__ZTIPKv"]=50636;var __ZTSDn=Module["__ZTSDn"]=50652;var __ZTSPDn=Module["__ZTSPDn"]=50664;var __ZTIPDn=Module["__ZTIPDn"]=50668;var __ZTSPKDn=Module["__ZTSPKDn"]=50684;var __ZTIPKDn=Module["__ZTIPKDn"]=50692;var __ZTSb=Module["__ZTSb"]=50708;var __ZTIb=Module["__ZTIb"]=50712;var __ZTSPb=Module["__ZTSPb"]=50720;var __ZTIPb=Module["__ZTIPb"]=50724;var __ZTSPKb=Module["__ZTSPKb"]=50740;var __ZTIPKb=Module["__ZTIPKb"]=50744;var __ZTSw=Module["__ZTSw"]=50760;var __ZTIw=Module["__ZTIw"]=50764;var __ZTSPw=Module["__ZTSPw"]=50772;var __ZTIPw=Module["__ZTIPw"]=50776;var __ZTSPKw=Module["__ZTSPKw"]=50792;var __ZTIPKw=Module["__ZTIPKw"]=50796;var __ZTSc=Module["__ZTSc"]=50812;var __ZTIc=Module["__ZTIc"]=50816;var __ZTSPc=Module["__ZTSPc"]=50824;var __ZTIPc=Module["__ZTIPc"]=50828;var __ZTSPKc=Module["__ZTSPKc"]=50844;var __ZTIPKc=Module["__ZTIPKc"]=50848;var __ZTSh=Module["__ZTSh"]=50864;var __ZTIh=Module["__ZTIh"]=50868;var __ZTSPh=Module["__ZTSPh"]=50876;var __ZTIPh=Module["__ZTIPh"]=50880;var __ZTSPKh=Module["__ZTSPKh"]=50896;var __ZTIPKh=Module["__ZTIPKh"]=50900;var __ZTSa=Module["__ZTSa"]=50916;var __ZTIa=Module["__ZTIa"]=50920;var __ZTSPa=Module["__ZTSPa"]=50928;var __ZTIPa=Module["__ZTIPa"]=50932;var __ZTSPKa=Module["__ZTSPKa"]=50948;var __ZTIPKa=Module["__ZTIPKa"]=50952;var __ZTSs=Module["__ZTSs"]=50968;var __ZTIs=Module["__ZTIs"]=50972;var __ZTSPs=Module["__ZTSPs"]=50980;var __ZTIPs=Module["__ZTIPs"]=50984;var __ZTSPKs=Module["__ZTSPKs"]=51e3;var __ZTIPKs=Module["__ZTIPKs"]=51004;var __ZTSt=Module["__ZTSt"]=51020;var __ZTIt=Module["__ZTIt"]=51024;var __ZTSPt=Module["__ZTSPt"]=51032;var __ZTIPt=Module["__ZTIPt"]=51036;var __ZTSPKt=Module["__ZTSPKt"]=51052;var __ZTIPKt=Module["__ZTIPKt"]=51056;var __ZTSi=Module["__ZTSi"]=51072;var __ZTIi=Module["__ZTIi"]=51076;var __ZTSPi=Module["__ZTSPi"]=51084;var __ZTIPi=Module["__ZTIPi"]=51088;var __ZTSPKi=Module["__ZTSPKi"]=51104;var __ZTIPKi=Module["__ZTIPKi"]=51108;var __ZTSj=Module["__ZTSj"]=51124;var __ZTIj=Module["__ZTIj"]=51128;var __ZTSPj=Module["__ZTSPj"]=51136;var __ZTIPj=Module["__ZTIPj"]=51140;var __ZTSPKj=Module["__ZTSPKj"]=51156;var __ZTIPKj=Module["__ZTIPKj"]=51160;var __ZTSl=Module["__ZTSl"]=51176;var __ZTIl=Module["__ZTIl"]=51180;var __ZTSPl=Module["__ZTSPl"]=51188;var __ZTIPl=Module["__ZTIPl"]=51192;var __ZTSPKl=Module["__ZTSPKl"]=51208;var __ZTIPKl=Module["__ZTIPKl"]=51212;var __ZTSm=Module["__ZTSm"]=51228;var __ZTIm=Module["__ZTIm"]=51232;var __ZTSPm=Module["__ZTSPm"]=51240;var __ZTIPm=Module["__ZTIPm"]=51244;var __ZTSPKm=Module["__ZTSPKm"]=51260;var __ZTIPKm=Module["__ZTIPKm"]=51264;var __ZTSx=Module["__ZTSx"]=51280;var __ZTIx=Module["__ZTIx"]=51284;var __ZTSPx=Module["__ZTSPx"]=51292;var __ZTIPx=Module["__ZTIPx"]=51296;var __ZTSPKx=Module["__ZTSPKx"]=51312;var __ZTIPKx=Module["__ZTIPKx"]=51316;var __ZTSy=Module["__ZTSy"]=51332;var __ZTIy=Module["__ZTIy"]=51336;var __ZTSPy=Module["__ZTSPy"]=51344;var __ZTIPy=Module["__ZTIPy"]=51348;var __ZTSPKy=Module["__ZTSPKy"]=51364;var __ZTIPKy=Module["__ZTIPKy"]=51368;var __ZTSn=Module["__ZTSn"]=51384;var __ZTIn=Module["__ZTIn"]=51388;var __ZTSPn=Module["__ZTSPn"]=51396;var __ZTIPn=Module["__ZTIPn"]=51400;var __ZTSPKn=Module["__ZTSPKn"]=51416;var __ZTIPKn=Module["__ZTIPKn"]=51420;var __ZTSo=Module["__ZTSo"]=51436;var __ZTIo=Module["__ZTIo"]=51440;var __ZTSPo=Module["__ZTSPo"]=51448;var __ZTIPo=Module["__ZTIPo"]=51452;var __ZTSPKo=Module["__ZTSPKo"]=51468;var __ZTIPKo=Module["__ZTIPKo"]=51472;var __ZTSDh=Module["__ZTSDh"]=51488;var __ZTIDh=Module["__ZTIDh"]=51492;var __ZTSPDh=Module["__ZTSPDh"]=51500;var __ZTIPDh=Module["__ZTIPDh"]=51504;var __ZTSPKDh=Module["__ZTSPKDh"]=51520;var __ZTIPKDh=Module["__ZTIPKDh"]=51528;var __ZTSf=Module["__ZTSf"]=51544;var __ZTIf=Module["__ZTIf"]=51548;var __ZTSPf=Module["__ZTSPf"]=51556;var __ZTIPf=Module["__ZTIPf"]=51560;var __ZTSPKf=Module["__ZTSPKf"]=51576;var __ZTIPKf=Module["__ZTIPKf"]=51580;var __ZTSd=Module["__ZTSd"]=51596;var __ZTId=Module["__ZTId"]=51600;var __ZTSPd=Module["__ZTSPd"]=51608;var __ZTIPd=Module["__ZTIPd"]=51612;var __ZTSPKd=Module["__ZTSPKd"]=51628;var __ZTIPKd=Module["__ZTIPKd"]=51632;var __ZTSe=Module["__ZTSe"]=51648;var __ZTIe=Module["__ZTIe"]=51652;var __ZTSPe=Module["__ZTSPe"]=51660;var __ZTIPe=Module["__ZTIPe"]=51664;var __ZTSPKe=Module["__ZTSPKe"]=51680;var __ZTIPKe=Module["__ZTIPKe"]=51684;var __ZTSg=Module["__ZTSg"]=51700;var __ZTIg=Module["__ZTIg"]=51704;var __ZTSPg=Module["__ZTSPg"]=51712;var __ZTIPg=Module["__ZTIPg"]=51716;var __ZTSPKg=Module["__ZTSPKg"]=51732;var __ZTIPKg=Module["__ZTIPKg"]=51736;var __ZTSDu=Module["__ZTSDu"]=51752;var __ZTIDu=Module["__ZTIDu"]=51756;var __ZTSPDu=Module["__ZTSPDu"]=51764;var __ZTIPDu=Module["__ZTIPDu"]=51768;var __ZTSPKDu=Module["__ZTSPKDu"]=51784;var __ZTIPKDu=Module["__ZTIPKDu"]=51792;var __ZTSDs=Module["__ZTSDs"]=51808;var __ZTIDs=Module["__ZTIDs"]=51812;var __ZTSPDs=Module["__ZTSPDs"]=51820;var __ZTIPDs=Module["__ZTIPDs"]=51824;var __ZTSPKDs=Module["__ZTSPKDs"]=51840;var __ZTIPKDs=Module["__ZTIPKDs"]=51848;var __ZTSDi=Module["__ZTSDi"]=51864;var __ZTIDi=Module["__ZTIDi"]=51868;var __ZTSPDi=Module["__ZTSPDi"]=51876;var __ZTIPDi=Module["__ZTIPDi"]=51880;var __ZTSPKDi=Module["__ZTSPKDi"]=51896;var __ZTIPKDi=Module["__ZTIPKDi"]=51904;var __ZTVN10__cxxabiv117__array_type_infoE=Module["__ZTVN10__cxxabiv117__array_type_infoE"]=51920;var __ZTIN10__cxxabiv117__array_type_infoE=Module["__ZTIN10__cxxabiv117__array_type_infoE"]=51984;var __ZTSN10__cxxabiv117__array_type_infoE=Module["__ZTSN10__cxxabiv117__array_type_infoE"]=51948;var __ZTVN10__cxxabiv120__function_type_infoE=Module["__ZTVN10__cxxabiv120__function_type_infoE"]=51996;var __ZTVN10__cxxabiv116__enum_type_infoE=Module["__ZTVN10__cxxabiv116__enum_type_infoE"]=52024;var __ZTIN10__cxxabiv116__enum_type_infoE=Module["__ZTIN10__cxxabiv116__enum_type_infoE"]=52088;var __ZTSN10__cxxabiv116__enum_type_infoE=Module["__ZTSN10__cxxabiv116__enum_type_infoE"]=52052;var __ZTVN10__cxxabiv117__class_type_infoE=Module["__ZTVN10__cxxabiv117__class_type_infoE"]=52100;var __ZTIN10__cxxabiv120__si_class_type_infoE=Module["__ZTIN10__cxxabiv120__si_class_type_infoE"]=52220;var __ZTSN10__cxxabiv120__si_class_type_infoE=Module["__ZTSN10__cxxabiv120__si_class_type_infoE"]=52180;var __ZTVN10__cxxabiv121__vmi_class_type_infoE=Module["__ZTVN10__cxxabiv121__vmi_class_type_infoE"]=52232;var __ZTIN10__cxxabiv121__vmi_class_type_infoE=Module["__ZTIN10__cxxabiv121__vmi_class_type_infoE"]=52312;var __ZTSN10__cxxabiv121__vmi_class_type_infoE=Module["__ZTSN10__cxxabiv121__vmi_class_type_infoE"]=52272;var __ZTVN10__cxxabiv117__pbase_type_infoE=Module["__ZTVN10__cxxabiv117__pbase_type_infoE"]=52324;var __ZTVN10__cxxabiv129__pointer_to_member_type_infoE=Module["__ZTVN10__cxxabiv129__pointer_to_member_type_infoE"]=52380;var __ZTVSt9bad_alloc=Module["__ZTVSt9bad_alloc"]=52408;var __ZTVSt9exception=Module["__ZTVSt9exception"]=52448;var __ZTVSt20bad_array_new_length=Module["__ZTVSt20bad_array_new_length"]=52428;var __ZTISt9bad_alloc=Module["__ZTISt9bad_alloc"]=52560;var __ZTISt20bad_array_new_length=Module["__ZTISt20bad_array_new_length"]=52600;var __ZTISt9exception=Module["__ZTISt9exception"]=52484;var __ZTSSt9exception=Module["__ZTSSt9exception"]=52468;var __ZTVSt13bad_exception=Module["__ZTVSt13bad_exception"]=52492;var __ZTISt13bad_exception=Module["__ZTISt13bad_exception"]=52532;var __ZTSSt13bad_exception=Module["__ZTSSt13bad_exception"]=52512;var __ZTSSt9bad_alloc=Module["__ZTSSt9bad_alloc"]=52544;var __ZTSSt20bad_array_new_length=Module["__ZTSSt20bad_array_new_length"]=52572;var __ZTVSt11logic_error=Module["__ZTVSt11logic_error"]=52612;var __ZTVSt13runtime_error=Module["__ZTVSt13runtime_error"]=52632;var __ZTISt11logic_error=Module["__ZTISt11logic_error"]=52708;var __ZTISt13runtime_error=Module["__ZTISt13runtime_error"]=52948;var __ZTVSt12domain_error=Module["__ZTVSt12domain_error"]=52652;var __ZTISt12domain_error=Module["__ZTISt12domain_error"]=52720;var __ZTSSt12domain_error=Module["__ZTSSt12domain_error"]=52672;var __ZTSSt11logic_error=Module["__ZTSSt11logic_error"]=52689;var __ZTVSt16invalid_argument=Module["__ZTVSt16invalid_argument"]=52732;var __ZTISt16invalid_argument=Module["__ZTISt16invalid_argument"]=52776;var __ZTSSt16invalid_argument=Module["__ZTSSt16invalid_argument"]=52752;var __ZTVSt12length_error=Module["__ZTVSt12length_error"]=52788;var __ZTISt12length_error=Module["__ZTISt12length_error"]=52828;var __ZTSSt12length_error=Module["__ZTSSt12length_error"]=52808;var __ZTVSt12out_of_range=Module["__ZTVSt12out_of_range"]=52840;var __ZTISt12out_of_range=Module["__ZTISt12out_of_range"]=52880;var __ZTSSt12out_of_range=Module["__ZTSSt12out_of_range"]=52860;var __ZTVSt11range_error=Module["__ZTVSt11range_error"]=52892;var __ZTISt11range_error=Module["__ZTISt11range_error"]=52960;var __ZTSSt11range_error=Module["__ZTSSt11range_error"]=52912;var __ZTSSt13runtime_error=Module["__ZTSSt13runtime_error"]=52928;var __ZTVSt14overflow_error=Module["__ZTVSt14overflow_error"]=52972;var __ZTISt14overflow_error=Module["__ZTISt14overflow_error"]=53012;var __ZTSSt14overflow_error=Module["__ZTSSt14overflow_error"]=52992;var __ZTVSt15underflow_error=Module["__ZTVSt15underflow_error"]=53024;var __ZTISt15underflow_error=Module["__ZTISt15underflow_error"]=53064;var __ZTSSt15underflow_error=Module["__ZTSSt15underflow_error"]=53044;var __ZTVSt8bad_cast=Module["__ZTVSt8bad_cast"]=50044;var __ZTVSt10bad_typeid=Module["__ZTVSt10bad_typeid"]=50064;var __ZTISt8bad_cast=Module["__ZTISt8bad_cast"]=50136;var __ZTISt10bad_typeid=Module["__ZTISt10bad_typeid"]=50164;var __ZTVSt9type_info=Module["__ZTVSt9type_info"]=50084;var __ZTISt9type_info=Module["__ZTISt9type_info"]=50116;var __ZTSSt9type_info=Module["__ZTSSt9type_info"]=50100;var __ZTSSt8bad_cast=Module["__ZTSSt8bad_cast"]=50124;var __ZTSSt10bad_typeid=Module["__ZTSSt10bad_typeid"]=50148;Module["addFunction"]=addFunction;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();moduleRtn=readyPromise; - - - return moduleRtn; -} -); -})(); -export default pv_orca; diff --git a/lib/wasm/pv_orca.wasm b/lib/wasm/pv_orca.wasm deleted file mode 100755 index 0134e91c..00000000 Binary files a/lib/wasm/pv_orca.wasm and /dev/null differ diff --git a/lib/wasm/pv_orca_pthread.js b/lib/wasm/pv_orca_pthread.js new file mode 100644 index 00000000..e095e107 --- /dev/null +++ b/lib/wasm/pv_orca_pthread.js @@ -0,0 +1,19 @@ + +var pv_orca_pthread = (() => { + var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined; + + return ( +function(moduleArg = {}) { + var moduleRtn; + +function GROWABLE_HEAP_I8(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAP8}function GROWABLE_HEAP_U8(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAPU8}function GROWABLE_HEAP_I32(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAP32}function GROWABLE_HEAP_U32(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAPU32}function GROWABLE_HEAP_F64(){if(wasmMemory.buffer!=HEAP8.buffer){updateMemoryViews()}return HEAPF64}var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var ENVIRONMENT_IS_PTHREAD=ENVIRONMENT_IS_WORKER&&self.name=="em-pthread";function _typeof$2(o){null;return _typeof$2="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof$2(o)}function toPrimitive(t,r){if("object"!=_typeof$2(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof$2(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}function toPropertyKey(t){var i=toPrimitive(t,"string");return"symbol"==_typeof$2(i)?i:i+""}function _defineProperty(e,r,t){return(r=toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function asyncGeneratorStep(n,t,e,r,o,a,c){try{var i=n[a](c),u=i.value}catch(n){return void e(n)}i.done?t(u):Promise.resolve(u).then(r,o)}function _asyncToGenerator(n){return function(){var t=this,e=arguments;return new Promise(function(r,o){var a=n.apply(t,e);function _next(n){asyncGeneratorStep(a,r,o,_next,_throw,"next",n)}function _throw(n){asyncGeneratorStep(a,r,o,_next,_throw,"throw",n)}_next(void 0)})}}function getDefaultExportFromCjs(x){return x&&x.__esModule&&Object.prototype.hasOwnProperty.call(x,"default")?x["default"]:x}var regeneratorRuntime$3={exports:{}};var _typeof$1={exports:{}};var _typeof_1=_typeof$1.exports;(function(module){function _typeof(o){null;return module.exports=_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},module.exports.__esModule=true,module.exports["default"]=module.exports,_typeof(o)}module.exports=_typeof,module.exports.__esModule=true,module.exports["default"]=module.exports})(_typeof$1);var _typeofExports=_typeof$1.exports;var _typeof=getDefaultExportFromCjs(_typeofExports);var regeneratorRuntime$1=regeneratorRuntime$3.exports;(function(module){var _typeof=_typeofExports["default"];function _regeneratorRuntime(){"use strict";module.exports=_regeneratorRuntime=function _regeneratorRuntime(){return e},module.exports.__esModule=true,module.exports["default"]=module.exports;var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",c=i.asyncIterator||"@@asyncIterator",u=i.toStringTag||"@@toStringTag";function define(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{define({},"")}catch(t){define=function define(t,e,r){return t[e]=r}}function wrap(t,e,r,n){var i=e&&e.prototype instanceof Generator?e:Generator,a=Object.create(i.prototype),c=new Context(n||[]);return o(a,"_invoke",{value:makeInvokeMethod(t,r,c)}),a}function tryCatch(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=wrap;var h="suspendedStart",l="suspendedYield",f="executing",s="completed",y={};function Generator(){}function GeneratorFunction(){}function GeneratorFunctionPrototype(){}var p={};define(p,a,function(){return this});var d=Object.getPrototypeOf,v=d&&d(d(values([])));v&&v!==r&&n.call(v,a)&&(p=v);var g=GeneratorFunctionPrototype.prototype=Generator.prototype=Object.create(p);function defineIteratorMethods(t){["next","throw","return"].forEach(function(e){define(t,e,function(t){return this._invoke(e,t)})})}function AsyncIterator(t,e){function invoke(r,o,i,a){var c=tryCatch(t[r],t,o);if("throw"!==c.type){var u=c.arg,h=u.value;return h&&"object"==_typeof(h)&&n.call(h,"__await")?e.resolve(h.__await).then(function(t){invoke("next",t,i,a)},function(t){invoke("throw",t,i,a)}):e.resolve(h).then(function(t){u.value=t,i(u)},function(t){return invoke("throw",t,i,a)})}a(c.arg)}var r;o(this,"_invoke",{value:function value(t,n){function callInvokeWithMethodAndArg(){return new e(function(e,r){invoke(t,n,e,r)})}return r=r?r.then(callInvokeWithMethodAndArg,callInvokeWithMethodAndArg):callInvokeWithMethodAndArg()}})}function makeInvokeMethod(e,r,n){var o=h;return function(i,a){if(o===f)throw Error("Generator is already running");if(o===s){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var c=n.delegate;if(c){var u=maybeInvokeDelegate(c,n);if(u){if(u===y)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===h)throw o=s,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=f;var p=tryCatch(e,r,n);if("normal"===p.type){if(o=n.done?s:l,p.arg===y)continue;return{value:p.arg,done:n.done}}"throw"===p.type&&(o=s,n.method="throw",n.arg=p.arg)}}}function maybeInvokeDelegate(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator["return"]&&(r.method="return",r.arg=t,maybeInvokeDelegate(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),y;var i=tryCatch(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,y;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,y):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,y)}function pushTryEntry(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function resetTryEntry(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function Context(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(pushTryEntry,this),this.reset(!0)}function values(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function next(){for(;++o=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return handle("end");if(i.tryLoc<=this.prev){var c=n.call(i,"catchLoc"),u=n.call(i,"finallyLoc");if(c&&u){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),resetTryEntry(r),y}},catch:function _catch(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;resetTryEntry(r)}return o}}throw Error("illegal catch attempt")},delegateYield:function delegateYield(e,r,n){return this.delegate={iterator:values(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),y}},e}module.exports=_regeneratorRuntime,module.exports.__esModule=true,module.exports["default"]=module.exports})(regeneratorRuntime$3);var regeneratorRuntimeExports=regeneratorRuntime$3.exports;var regeneratorRuntime$2=getDefaultExportFromCjs(regeneratorRuntimeExports);var runtime=regeneratorRuntimeExports();var regenerator=runtime;try{regeneratorRuntime=runtime}catch(accidentalStrictMode){if(typeof globalThis==="object"){globalThis.regeneratorRuntime=runtime}else{Function("r","regeneratorRuntime = r")(runtime)}}var _regeneratorRuntime=getDefaultExportFromCjs(regenerator);const BROWSER_ALIASES_MAP={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"};const BROWSER_MAP={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"};const PLATFORMS_MAP={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"};const OS_MAP={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"};const ENGINE_MAP={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};class Utils{static getFirstMatch(regexp,ua){const match=ua.match(regexp);return match&&match.length>0&&match[1]||""}static getSecondMatch(regexp,ua){const match=ua.match(regexp);return match&&match.length>1&&match[2]||""}static matchAndReturnConst(regexp,ua,_const){if(regexp.test(ua)){return _const}return void 0}static getWindowsVersionName(version){switch(version){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return undefined}}static getMacOSVersionName(version){const v=version.split(".").splice(0,2).map(s=>parseInt(s,10)||0);v.push(0);if(v[0]!==10)return undefined;switch(v[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return undefined}}static getAndroidVersionName(version){const v=version.split(".").splice(0,2).map(s=>parseInt(s,10)||0);v.push(0);if(v[0]===1&&v[1]<5)return undefined;if(v[0]===1&&v[1]<6)return"Cupcake";if(v[0]===1&&v[1]>=6)return"Donut";if(v[0]===2&&v[1]<2)return"Eclair";if(v[0]===2&&v[1]===2)return"Froyo";if(v[0]===2&&v[1]>2)return"Gingerbread";if(v[0]===3)return"Honeycomb";if(v[0]===4&&v[1]<1)return"Ice Cream Sandwich";if(v[0]===4&&v[1]<4)return"Jelly Bean";if(v[0]===4&&v[1]>=4)return"KitKat";if(v[0]===5)return"Lollipop";if(v[0]===6)return"Marshmallow";if(v[0]===7)return"Nougat";if(v[0]===8)return"Oreo";if(v[0]===9)return"Pie";return undefined}static getVersionPrecision(version){return version.split(".").length}static compareVersions(versionA,versionB,isLoose=false){const versionAPrecision=Utils.getVersionPrecision(versionA);const versionBPrecision=Utils.getVersionPrecision(versionB);let precision=Math.max(versionAPrecision,versionBPrecision);let lastPrecision=0;const chunks=Utils.map([versionA,versionB],version=>{const delta=precision-Utils.getVersionPrecision(version);const _version=version+new Array(delta+1).join(".0");return Utils.map(_version.split("."),chunk=>new Array(20-chunk.length).join("0")+chunk).reverse()});if(isLoose){lastPrecision=precision-Math.min(versionAPrecision,versionBPrecision)}precision-=1;while(precision>=lastPrecision){if(chunks[0][precision]>chunks[1][precision]){return 1}if(chunks[0][precision]===chunks[1][precision]){if(precision===lastPrecision){return 0}precision-=1}else if(chunks[0][precision]{result[key]=assigner[key]})}}return obj}static getBrowserAlias(browserName){return BROWSER_ALIASES_MAP[browserName]}static getBrowserTypeByAlias(browserAlias){return BROWSER_MAP[browserAlias]||""}}const commonVersionIdentifier=/version\/(\d+(\.?_?\d+)+)/i;const browsersList=[{test:[/googlebot/i],describe(ua){const browser={name:"Googlebot"};const version=Utils.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/opera/i],describe(ua){const browser={name:"Opera"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/opr\/|opios/i],describe(ua){const browser={name:"Opera"};const version=Utils.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/SamsungBrowser/i],describe(ua){const browser={name:"Samsung Internet for Android"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/Whale/i],describe(ua){const browser={name:"NAVER Whale Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/MZBrowser/i],describe(ua){const browser={name:"MZ Browser"};const version=Utils.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/focus/i],describe(ua){const browser={name:"Focus"};const version=Utils.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/swing/i],describe(ua){const browser={name:"Swing"};const version=Utils.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/coast/i],describe(ua){const browser={name:"Opera Coast"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(ua){const browser={name:"Opera Touch"};const version=Utils.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/yabrowser/i],describe(ua){const browser={name:"Yandex Browser"};const version=Utils.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/ucbrowser/i],describe(ua){const browser={name:"UC Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/Maxthon|mxios/i],describe(ua){const browser={name:"Maxthon"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/epiphany/i],describe(ua){const browser={name:"Epiphany"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/puffin/i],describe(ua){const browser={name:"Puffin"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/sleipnir/i],describe(ua){const browser={name:"Sleipnir"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/k-meleon/i],describe(ua){const browser={name:"K-Meleon"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/micromessenger/i],describe(ua){const browser={name:"WeChat"};const version=Utils.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/qqbrowser/i],describe(ua){const browser={name:/qqbrowserlite/i.test(ua)?"QQ Browser Lite":"QQ Browser"};const version=Utils.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/msie|trident/i],describe(ua){const browser={name:"Internet Explorer"};const version=Utils.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/\sedg\//i],describe(ua){const browser={name:"Microsoft Edge"};const version=Utils.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/edg([ea]|ios)/i],describe(ua){const browser={name:"Microsoft Edge"};const version=Utils.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/vivaldi/i],describe(ua){const browser={name:"Vivaldi"};const version=Utils.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/seamonkey/i],describe(ua){const browser={name:"SeaMonkey"};const version=Utils.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/sailfish/i],describe(ua){const browser={name:"Sailfish"};const version=Utils.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,ua);if(version){browser.version=version}return browser}},{test:[/silk/i],describe(ua){const browser={name:"Amazon Silk"};const version=Utils.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/phantom/i],describe(ua){const browser={name:"PhantomJS"};const version=Utils.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/slimerjs/i],describe(ua){const browser={name:"SlimerJS"};const version=Utils.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(ua){const browser={name:"BlackBerry"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/(web|hpw)[o0]s/i],describe(ua){const browser={name:"WebOS Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/bada/i],describe(ua){const browser={name:"Bada"};const version=Utils.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/tizen/i],describe(ua){const browser={name:"Tizen"};const version=Utils.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/qupzilla/i],describe(ua){const browser={name:"QupZilla"};const version=Utils.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/firefox|iceweasel|fxios/i],describe(ua){const browser={name:"Firefox"};const version=Utils.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/electron/i],describe(ua){const browser={name:"Electron"};const version=Utils.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/MiuiBrowser/i],describe(ua){const browser={name:"Miui"};const version=Utils.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/chromium/i],describe(ua){const browser={name:"Chromium"};const version=Utils.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/chrome|crios|crmo/i],describe(ua){const browser={name:"Chrome"};const version=Utils.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/GSA/i],describe(ua){const browser={name:"Google Search"};const version=Utils.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test(parser){const notLikeAndroid=!parser.test(/like android/i);const butAndroid=parser.test(/android/i);return notLikeAndroid&&butAndroid},describe(ua){const browser={name:"Android Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/playstation 4/i],describe(ua){const browser={name:"PlayStation 4"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/safari|applewebkit/i],describe(ua){const browser={name:"Safari"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/.*/i],describe(ua){const regexpWithoutDeviceSpec=/^(.*)\/(.*) /;const regexpWithDeviceSpec=/^(.*)\/(.*)[ \t]\((.*)/;const hasDeviceSpec=ua.search("\\(")!==-1;const regexp=hasDeviceSpec?regexpWithDeviceSpec:regexpWithoutDeviceSpec;return{name:Utils.getFirstMatch(regexp,ua),version:Utils.getSecondMatch(regexp,ua)}}}];var osParsersList=[{test:[/Roku\/DVP/],describe(ua){const version=Utils.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,ua);return{name:OS_MAP.Roku,version:version}}},{test:[/windows phone/i],describe(ua){const version=Utils.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,ua);return{name:OS_MAP.WindowsPhone,version:version}}},{test:[/windows /i],describe(ua){const version=Utils.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,ua);const versionName=Utils.getWindowsVersionName(version);return{name:OS_MAP.Windows,version:version,versionName:versionName}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(ua){const result={name:OS_MAP.iOS};const version=Utils.getSecondMatch(/(Version\/)(\d[\d.]+)/,ua);if(version){result.version=version}return result}},{test:[/macintosh/i],describe(ua){const version=Utils.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,ua).replace(/[_\s]/g,".");const versionName=Utils.getMacOSVersionName(version);const os={name:OS_MAP.MacOS,version:version};if(versionName){os.versionName=versionName}return os}},{test:[/(ipod|iphone|ipad)/i],describe(ua){const version=Utils.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,ua).replace(/[_\s]/g,".");return{name:OS_MAP.iOS,version:version}}},{test(parser){const notLikeAndroid=!parser.test(/like android/i);const butAndroid=parser.test(/android/i);return notLikeAndroid&&butAndroid},describe(ua){const version=Utils.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,ua);const versionName=Utils.getAndroidVersionName(version);const os={name:OS_MAP.Android,version:version};if(versionName){os.versionName=versionName}return os}},{test:[/(web|hpw)[o0]s/i],describe(ua){const version=Utils.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,ua);const os={name:OS_MAP.WebOS};if(version&&version.length){os.version=version}return os}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(ua){const version=Utils.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,ua)||Utils.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,ua)||Utils.getFirstMatch(/\bbb(\d+)/i,ua);return{name:OS_MAP.BlackBerry,version:version}}},{test:[/bada/i],describe(ua){const version=Utils.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,ua);return{name:OS_MAP.Bada,version:version}}},{test:[/tizen/i],describe(ua){const version=Utils.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,ua);return{name:OS_MAP.Tizen,version:version}}},{test:[/linux/i],describe(){return{name:OS_MAP.Linux}}},{test:[/CrOS/],describe(){return{name:OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe(ua){const version=Utils.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,ua);return{name:OS_MAP.PlayStation4,version:version}}}];var platformParsersList=[{test:[/googlebot/i],describe(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe(ua){const model=Utils.getFirstMatch(/(can-l01)/i,ua)&&"Nova";const platform={type:PLATFORMS_MAP.mobile,vendor:"Huawei"};if(model){platform.model=model}return platform}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe(){return{type:PLATFORMS_MAP.tablet}}},{test(parser){const iDevice=parser.test(/ipod|iphone/i);const likeIDevice=parser.test(/like (ipod|iphone)/i);return iDevice&&!likeIDevice},describe(ua){const model=Utils.getFirstMatch(/(ipod|iphone)/i,ua);return{type:PLATFORMS_MAP.mobile,vendor:"Apple",model:model}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe(){return{type:PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe(){return{type:PLATFORMS_MAP.mobile}}},{test(parser){return parser.getBrowserName(true)==="blackberry"},describe(){return{type:PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test(parser){return parser.getBrowserName(true)==="bada"},describe(){return{type:PLATFORMS_MAP.mobile}}},{test(parser){return parser.getBrowserName()==="windows phone"},describe(){return{type:PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test(parser){const osMajorVersion=Number(String(parser.getOSVersion()).split(".")[0]);return parser.getOSName(true)==="android"&&osMajorVersion>=3},describe(){return{type:PLATFORMS_MAP.tablet}}},{test(parser){return parser.getOSName(true)==="android"},describe(){return{type:PLATFORMS_MAP.mobile}}},{test(parser){return parser.getOSName(true)==="macos"},describe(){return{type:PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test(parser){return parser.getOSName(true)==="windows"},describe(){return{type:PLATFORMS_MAP.desktop}}},{test(parser){return parser.getOSName(true)==="linux"},describe(){return{type:PLATFORMS_MAP.desktop}}},{test(parser){return parser.getOSName(true)==="playstation 4"},describe(){return{type:PLATFORMS_MAP.tv}}},{test(parser){return parser.getOSName(true)==="roku"},describe(){return{type:PLATFORMS_MAP.tv}}}];var enginesParsersList=[{test(parser){return parser.getBrowserName(true)==="microsoft edge"},describe(ua){const isBlinkBased=/\sedg\//i.test(ua);if(isBlinkBased){return{name:ENGINE_MAP.Blink}}const version=Utils.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,ua);return{name:ENGINE_MAP.EdgeHTML,version:version}}},{test:[/trident/i],describe(ua){const engine={name:ENGINE_MAP.Trident};const version=Utils.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}},{test(parser){return parser.test(/presto/i)},describe(ua){const engine={name:ENGINE_MAP.Presto};const version=Utils.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}},{test(parser){const isGecko=parser.test(/gecko/i);const likeGecko=parser.test(/like gecko/i);return isGecko&&!likeGecko},describe(ua){const engine={name:ENGINE_MAP.Gecko};const version=Utils.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}},{test:[/(apple)?webkit\/537\.36/i],describe(){return{name:ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe(ua){const engine={name:ENGINE_MAP.WebKit};const version=Utils.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}}];class Parser{constructor(UA,skipParsing=false){if(UA===void 0||UA===null||UA===""){throw new Error("UserAgent parameter can't be empty")}this._ua=UA;this.parsedResult={};if(skipParsing!==true){this.parse()}}getUA(){return this._ua}test(regex){return regex.test(this._ua)}parseBrowser(){this.parsedResult.browser={};const browserDescriptor=Utils.find(browsersList,_browser=>{if(typeof _browser.test==="function"){return _browser.test(this)}if(_browser.test instanceof Array){return _browser.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(browserDescriptor){this.parsedResult.browser=browserDescriptor.describe(this.getUA())}return this.parsedResult.browser}getBrowser(){if(this.parsedResult.browser){return this.parsedResult.browser}return this.parseBrowser()}getBrowserName(toLowerCase){if(toLowerCase){return String(this.getBrowser().name).toLowerCase()||""}return this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){if(this.parsedResult.os){return this.parsedResult.os}return this.parseOS()}parseOS(){this.parsedResult.os={};const os=Utils.find(osParsersList,_os=>{if(typeof _os.test==="function"){return _os.test(this)}if(_os.test instanceof Array){return _os.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(os){this.parsedResult.os=os.describe(this.getUA())}return this.parsedResult.os}getOSName(toLowerCase){const{name:name}=this.getOS();if(toLowerCase){return String(name).toLowerCase()||""}return name||""}getOSVersion(){return this.getOS().version}getPlatform(){if(this.parsedResult.platform){return this.parsedResult.platform}return this.parsePlatform()}getPlatformType(toLowerCase=false){const{type:type}=this.getPlatform();if(toLowerCase){return String(type).toLowerCase()||""}return type||""}parsePlatform(){this.parsedResult.platform={};const platform=Utils.find(platformParsersList,_platform=>{if(typeof _platform.test==="function"){return _platform.test(this)}if(_platform.test instanceof Array){return _platform.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(platform){this.parsedResult.platform=platform.describe(this.getUA())}return this.parsedResult.platform}getEngine(){if(this.parsedResult.engine){return this.parsedResult.engine}return this.parseEngine()}getEngineName(toLowerCase){if(toLowerCase){return String(this.getEngine().name).toLowerCase()||""}return this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};const engine=Utils.find(enginesParsersList,_engine=>{if(typeof _engine.test==="function"){return _engine.test(this)}if(_engine.test instanceof Array){return _engine.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(engine){this.parsedResult.engine=engine.describe(this.getUA())}return this.parsedResult.engine}parse(){this.parseBrowser();this.parseOS();this.parsePlatform();this.parseEngine();return this}getResult(){return Utils.assign({},this.parsedResult)}satisfies(checkTree){const platformsAndOSes={};let platformsAndOSCounter=0;const browsers={};let browsersCounter=0;const allDefinitions=Object.keys(checkTree);allDefinitions.forEach(key=>{const currentDefinition=checkTree[key];if(typeof currentDefinition==="string"){browsers[key]=currentDefinition;browsersCounter+=1}else if(typeof currentDefinition==="object"){platformsAndOSes[key]=currentDefinition;platformsAndOSCounter+=1}});if(platformsAndOSCounter>0){const platformsAndOSNames=Object.keys(platformsAndOSes);const OSMatchingDefinition=Utils.find(platformsAndOSNames,name=>this.isOS(name));if(OSMatchingDefinition){const osResult=this.satisfies(platformsAndOSes[OSMatchingDefinition]);if(osResult!==void 0){return osResult}}const platformMatchingDefinition=Utils.find(platformsAndOSNames,name=>this.isPlatform(name));if(platformMatchingDefinition){const platformResult=this.satisfies(platformsAndOSes[platformMatchingDefinition]);if(platformResult!==void 0){return platformResult}}}if(browsersCounter>0){const browserNames=Object.keys(browsers);const matchingDefinition=Utils.find(browserNames,name=>this.isBrowser(name,true));if(matchingDefinition!==void 0){return this.compareVersion(browsers[matchingDefinition])}}return undefined}isBrowser(browserName,includingAlias=false){const defaultBrowserName=this.getBrowserName().toLowerCase();let browserNameLower=browserName.toLowerCase();const alias=Utils.getBrowserTypeByAlias(browserNameLower);if(includingAlias&&alias){browserNameLower=alias.toLowerCase()}return browserNameLower===defaultBrowserName}compareVersion(version){let expectedResults=[0];let comparableVersion=version;let isLoose=false;const currentBrowserVersion=this.getBrowserVersion();if(typeof currentBrowserVersion!=="string"){return void 0}if(version[0]===">"||version[0]==="<"){comparableVersion=version.substr(1);if(version[1]==="="){isLoose=true;comparableVersion=version.substr(2)}else{expectedResults=[]}if(version[0]===">"){expectedResults.push(1)}else{expectedResults.push(-1)}}else if(version[0]==="="){comparableVersion=version.substr(1)}else if(version[0]==="~"){isLoose=true;comparableVersion=version.substr(1)}return expectedResults.indexOf(Utils.compareVersions(currentBrowserVersion,comparableVersion,isLoose))>-1}isOS(osName){return this.getOSName(true)===String(osName).toLowerCase()}isPlatform(platformType){return this.getPlatformType(true)===String(platformType).toLowerCase()}isEngine(engineName){return this.getEngineName(true)===String(engineName).toLowerCase()}is(anything,includingAlias=false){return this.isBrowser(anything,includingAlias)||this.isOS(anything)||this.isPlatform(anything)}some(anythings=[]){return anythings.some(anything=>this.is(anything))}}class Bowser{static getParser(UA,skipParsing=false){if(typeof UA!=="string"){throw new Error("UserAgent should be a string")}return new Parser(UA,skipParsing)}static parse(UA){return new Parser(UA).getResult()}static get BROWSER_MAP(){return BROWSER_MAP}static get ENGINE_MAP(){return ENGINE_MAP}static get OS_MAP(){return OS_MAP}static get PLATFORMS_MAP(){return PLATFORMS_MAP}}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t=this._data.length){return undefined}var res=this._data.slice(this._pos,this._pos+bytes);this._pos+=bytes;return res}},{key:"set",value:function set(pos,data){this._pos=pos;this._data=data}},{key:"clear",value:function clear(){this._pos=0;this._data=new Uint8Array}}])}();var PvFileIDB=function(_PvFile){function PvFileIDB(path,meta,db,mode){var _this;_classCallCheck(this,PvFileIDB);_this=_callSuper$1(this,PvFileIDB);_this._pageSize=512*1024;_this._pagePtr=0;_this._pageOffset=0;_this._path=path;_this._meta=meta;_this._db=db;_this._mode=mode;_this._cache=new PvCache;return _this}_inherits(PvFileIDB,_PvFile);return _createClass(PvFileIDB,[{key:"pageSize",get:function get(){return this._pageSize}},{key:"close",value:function(){var _close=_asyncToGenerator(_regeneratorRuntime.mark(function _callee(){return _regeneratorRuntime.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:this._db.close();case 1:case"end":return _context.stop()}},_callee,this)}));function close(){return _close.apply(this,arguments)}return close}()},{key:"read",value:function(){var _read=_asyncToGenerator(_regeneratorRuntime.mark(function _callee2(size,count){var _this2=this;return _regeneratorRuntime.wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:return _context2.abrupt("return",new Promise(function(resolve,reject){if(!_this2.exists()){reject(new Error("'".concat(_this2._path,"' doesn't exist.")));return}if(_this2._isEOF){var err=new Error("EOF");err.name="EndOfFile";reject(err);return}var copied=0;var maxToCopy=Math.min(size*count,_this2._meta.size);var totalElems=maxToCopy-maxToCopy%size;var buffer=new Uint8Array(totalElems);var res=_this2._cache.get(totalElems);if(res){copied+=res.length;_this2._pageOffset+=res.length;if(_this2._pageOffset===_this2._pageSize){_this2._pagePtr+=1;_this2._pageOffset=0}if(totalElems===copied){resolve(res);return}buffer.set(res)}var keyRange=IDBKeyRange.bound("".concat(_this2._path,"-").concat(PvFileIDB.createPage(_this2._pagePtr)),"".concat(_this2._path,"-").concat(PvFileIDB.createPage(_this2._pagePtr+Math.floor(totalElems/_this2._pageSize)+1)));var store=_this2._store;var req=store.openCursor(keyRange);req.onsuccess=function(){var cursor=req.result;if(!cursor||_this2._isEOF){return}var toCopy=Math.min(totalElems-copied,cursor.value.length-_this2._pageOffset);buffer.set(cursor.value.slice(_this2._pageOffset,_this2._pageOffset+toCopy),copied);copied+=toCopy;_this2._pageOffset+=toCopy;if(_this2._pageOffset===_this2._pageSize){_this2._pagePtr+=1;_this2._pageOffset=0}if(copied1&&_args4[1]!==undefined?_args4[1]:1;return _context4.abrupt("return",new Promise(function(){var _ref=_asyncToGenerator(_regeneratorRuntime.mark(function _callee3(resolve,reject){var _store$transaction3;var store,getCurrentPage,last,newContent,newSize,newMeta,pages,i,keyRange,_store$transaction4;return _regeneratorRuntime.wrap(function _callee3$(_context3){while(1)switch(_context3.prev=_context3.next){case 0:if(!(_this3._mode==="readonly")){_context3.next=3;break}reject(new Error("Instance is readonly mode only."));return _context3.abrupt("return");case 3:if(!(typeof version!=="number"&&version<=0)){_context3.next=6;break}reject(new Error("Version should be a positive number"));return _context3.abrupt("return");case 6:store=_this3._store;getCurrentPage=function getCurrentPage(){return new Promise(function(res){var req=store.get("".concat(_this3._path,"-").concat(PvFileIDB.createPage(_this3._pagePtr)));req.onsuccess=function(){if(req.result!==undefined){res(req.result.slice(0,_this3._pageOffset))}else{res(new Uint8Array(0))}}})};_context3.next=10;return getCurrentPage();case 10:last=_context3.sent;newContent=new Uint8Array(last.length+content.length);newContent.set(last);newContent.set(content,last.length);newSize=_this3._pagePtr*_this3._pageSize+newContent.length;newMeta={size:newSize,numPages:Math.ceil(newSize/_this3._pageSize),version:version,pageSize:_this3._pageSize};store.put(newMeta,_this3._path);pages=Math.ceil(newContent.length/_this3._pageSize);for(i=0;i=this._meta.numPages-1&&this._pageOffset>=this._meta.size%this._pageSize}},{key:"_store",get:function get(){return this._db.transaction(PV_FILE_STORE,this._mode).objectStore(PV_FILE_STORE)}}],[{key:"open",value:function open(path,mode){if(!self.indexedDB){var error=new Error("IndexedDB is not supported");error.name="IndexedDBNotSupported";throw error}return new Promise(function(){var _ref3=_asyncToGenerator(_regeneratorRuntime.mark(function _callee7(resolve,reject){var db,req,_error2;return _regeneratorRuntime.wrap(function _callee7$(_context7){while(1)switch(_context7.prev=_context7.next){case 0:_context7.prev=0;_context7.next=3;return getDB();case 3:db=_context7.sent;req=db.transaction(PV_FILE_STORE,"readwrite").objectStore(PV_FILE_STORE).get(path);req.onerror=function(){reject(req.error)};req.onsuccess=function(){var meta=req.result;var dbMode=mode.includes("r")?"readonly":"readwrite";if(meta===undefined&&dbMode==="readonly"){var _error=new Error("'".concat(path,"' doesn't exist."));_error.name="FileNotExists";reject(_error);return}var fileIDB=new PvFileIDB(path,meta,db,dbMode);if(mode.includes("a")){fileIDB.seek(0,2)}resolve(fileIDB)};_context7.next=12;break;case 9:_context7.prev=9;_context7.t0=_context7["catch"](0);if(_context7.t0.name==="InvalidStateError"){_error2=new Error("IndexedDB is not supported");_error2.name="IndexedDBNotSupported";reject(_error2)}else{reject(_context7.t0)}case 12:case"end":return _context7.stop()}},_callee7,null,[[0,9]])}));return function(_x8,_x9){return _ref3.apply(this,arguments)}}())}},{key:"createPage",value:function createPage(page){return("00000"+page).slice(-6)}}])}(PvFile);function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}var PvFileMem=function(_PvFile){function PvFileMem(path,meta,db,mode){var _this;_classCallCheck(this,PvFileMem);_this=_callSuper(this,PvFileMem);_this._pos=0;_this._path=path;_this._meta=meta;_this._mode=mode;return _this}_inherits(PvFileMem,_PvFile);return _createClass(PvFileMem,[{key:"close",value:function close(){return}},{key:"read",value:function read(size,count){if(!this.exists()){throw new Error("'".concat(this._path,"' doesn't exist."))}if(this._isEOF){var err=new Error("EOF");err.name="EndOfFile";throw err}var toCopy=Math.min(size*count,this._file.length-this._pos);var totalElems=toCopy-toCopy%size;var buffer=new Uint8Array(totalElems);buffer.set(this._file.slice(this._pos,this._pos+totalElems),0);this._pos+=totalElems;return buffer}},{key:"write",value:function write(content){var version=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;var newFile=new Uint8Array(this._pos+content.length);if(this._file!==undefined){newFile.set(this._file.slice(0,this._pos));newFile.set(content,this._pos)}else{newFile.set(content)}this._file=newFile;this._pos+=content.length}},{key:"seek",value:function seek(offset,whence){if(!this.exists()&&this._mode==="readonly"){throw new Error("'".concat(this._path,"' doesn't exist."))}if(!this.exists()){throw new Error("'".concat(this._path,"' doesn't exist."))}if(offset<0){var err=new Error("EOF");err.name="EndOfFile";throw err}var newOffset;if(whence===0){newOffset=Math.min(offset,this._file.length)}else if(whence===1){newOffset=Math.min(this._pos+offset,this._file.length)}else if(whence===2){newOffset=Math.min(this._file.length+offset,this._file.length)}else{throw new Error("Invalid operation: ".concat(whence,"."))}this._pos=newOffset}},{key:"tell",value:function tell(){if(!this.exists()){return-1}return this._pos}},{key:"remove",value:function(){var _remove=_asyncToGenerator(_regeneratorRuntime.mark(function _callee(){return _regeneratorRuntime.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:if(this.exists()){_context.next=2;break}throw new Error("ENOENT");case 2:PvFileMem._memFiles["delete"](this._path);this._pos=0;case 4:case"end":return _context.stop()}},_callee,this)}));function remove(){return _remove.apply(this,arguments)}return remove}()},{key:"exists",value:function exists(){return this._file!==undefined}},{key:"_isEOF",get:function get(){return this._pos>=this._file.length}},{key:"_file",get:function get(){return PvFileMem._memFiles.get(this._path)},set:function set(content){PvFileMem._memFiles.set(this._path,content)}}],[{key:"open",value:function open(path,mode){var file=PvFileMem._memFiles.get(path);var dbMode=mode.includes("r")?"readonly":"readwrite";if(file===undefined&&dbMode==="readonly"){var error=new Error("'".concat(path,"' doesn't exist."));error.name="FileNotExists";throw error}var fileMem=new PvFileMem(path,undefined,undefined,dbMode);if(mode.includes("a")){fileMem.seek(0,2)}return fileMem}}])}(PvFile);PvFileMem._memFiles=new Map;function unsignedAddress(address){if(address<0){return address>>>0}return address}function _arrayWithHoles(r){if(Array.isArray(r))return r}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayLikeToArray$2(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _unsupportedIterableToArray$1(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray$1(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray$1(r,a):void 0}}function _arrayLikeToArray$1(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e=16){this.endComputePass();this.flushCommandEncoder()}}},{key:"endComputePass",value:function endComputePass(){if(this._passEncoder){this._passEncoder.end();this._passEncoder=null}}},{key:"getBuffer",value:function getBuffer(sizeBytes,usage){var mappedAtCreation=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var label=arguments.length>3?arguments[3]:undefined;var key=this.getBufferKey(sizeBytes,usage);if(this.bufferReusePool.has(key)){var buffers=this.bufferReusePool.get(key);if(buffers&&buffers.length>0){return buffers.pop()}}return this.device.createBuffer({size:sizeBytes*Uint8Array.BYTES_PER_ELEMENT,usage:usage,mappedAtCreation:mappedAtCreation,label:label})}},{key:"scheduleUniformBufferForRelease",value:function scheduleUniformBufferForRelease(buffer){this._uniformBuffersPendingRelease.push(buffer)}},{key:"releaseBuffer",value:function releaseBuffer(buffer){var clearBuffer=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;if(clearBuffer){this.endComputePass();this.commandEncoder.clearBuffer(buffer,0,buffer.size)}var key=this.getBufferKey(buffer.size,buffer.usage);if(!this.bufferReusePool.has(key)){this.bufferReusePool.set(key,[])}this.bufferReusePool.get(key).push(buffer)}},{key:"sync",value:function(){var _sync=_asyncToGenerator(_regeneratorRuntime.mark(function _callee(){var _this=this;var _iterator,_step,k,buffers,_iterator3,_step3,b,_loop,_i,_Object$entries;return _regeneratorRuntime.wrap(function _callee$(_context3){while(1)switch(_context3.prev=_context3.next){case 0:this.endComputePass();this.flushCommandEncoder();_context3.next=4;return this.device.queue.onSubmittedWorkDone();case 4:_iterator=_createForOfIteratorHelper$1(this.bufferReusePool.keys());try{for(_iterator.s();!(_step=_iterator.n()).done;){k=_step.value;buffers=this.bufferReusePool.get(k);if(buffers&&buffers.length>0){_iterator3=_createForOfIteratorHelper$1(buffers);try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){b=_step3.value;b===null||b===void 0||b.destroy()}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}}}}catch(err){_iterator.e(err)}finally{_iterator.f()}this.bufferReusePool.clear();_loop=_regeneratorRuntime.mark(function _loop(){var _Object$entries$_i,shaderName,timestampBuffers,_iterator2,_step2,_loop2;return _regeneratorRuntime.wrap(function _loop$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:_Object$entries$_i=_slicedToArray(_Object$entries[_i],2),shaderName=_Object$entries$_i[0],timestampBuffers=_Object$entries$_i[1];if(!_this.shaderTimes[shaderName]){_this.shaderTimes[shaderName]=[]}_iterator2=_createForOfIteratorHelper$1(timestampBuffers);_context2.prev=3;_loop2=_regeneratorRuntime.mark(function _loop2(){var timestampBuffer;return _regeneratorRuntime.wrap(function _loop2$(_context){while(1)switch(_context.prev=_context.next){case 0:timestampBuffer=_step2.value;timestampBuffer.mapAsync(GPUMapMode.READ).then(function(){var times=new BigInt64Array(timestampBuffer.getMappedRange());var timeDif=times[1]-times[0];timestampBuffer.unmap();timestampBuffer.destroy();_this.shaderTimes[shaderName].push(timeDif)});case 2:case"end":return _context.stop()}},_loop2)});_iterator2.s();case 6:if((_step2=_iterator2.n()).done){_context2.next=10;break}return _context2.delegateYield(_loop2(),"t0",8);case 8:_context2.next=6;break;case 10:_context2.next=15;break;case 12:_context2.prev=12;_context2.t1=_context2["catch"](3);_iterator2.e(_context2.t1);case 15:_context2.prev=15;_iterator2.f();return _context2.finish(15);case 18:case"end":return _context2.stop()}},_loop,null,[[3,12,15,18]])});_i=0,_Object$entries=Object.entries(this.timestampBuffers);case 9:if(!(_i<_Object$entries.length)){_context3.next=14;break}return _context3.delegateYield(_loop(),"t0",11);case 11:_i++;_context3.next=9;break;case 14:this.timestampBuffers={};case 15:case"end":return _context3.stop()}},_callee,this)}));function sync(){return _sync.apply(this,arguments)}return sync}()},{key:"reportShaderTimes",value:function reportShaderTimes(){for(var _i2=0,_Object$entries2=Object.entries(this.shaderTimes);_i2<_Object$entries2.length;_i2++){var _Object$entries2$_i=_slicedToArray(_Object$entries2[_i2],2),shaderName=_Object$entries2$_i[0],shaderTimes=_Object$entries2$_i[1];var timeSum=0n;var _iterator4=_createForOfIteratorHelper$1(shaderTimes),_step4;try{for(_iterator4.s();!(_step4=_iterator4.n()).done;){var shaderTime=_step4.value;timeSum=timeSum+shaderTime}}catch(err){_iterator4.e(err)}finally{_iterator4.f()}var totalSeconds=Number(timeSum)*1e-9;var avgSeconds=(totalSeconds/shaderTimes.length).toFixed(7);console.log("".concat(shaderName,", ").concat(totalSeconds.toFixed(5),", ").concat(avgSeconds))}this.shaderTimes={}}},{key:"flushCommandEncoder",value:function flushCommandEncoder(){var _this2=this;this.device.queue.submit([this.commandEncoder.finish()]);this._commandEncoder=null;this._numCommandsEncoded=0;this._stageBuffersPendingMap.forEach(function(buffer){buffer.destroy()});this._stageBuffersPendingMap=[];this._uniformBuffersPendingRelease.forEach(function(buffer){_this2.releaseBuffer(buffer,false)});this._uniformBuffersPendingRelease=[]}},{key:"writeBuffer",value:function writeBuffer(sizeBytes,offset,srcArray,dstBuffer){var stagingBuffer=this.getBuffer(sizeBytes,GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC,true);new Uint8Array(stagingBuffer.getMappedRange()).set(srcArray);stagingBuffer.unmap();this._stageBuffersPendingMap.push(stagingBuffer);this.endComputePass();this.commandEncoder.copyBufferToBuffer(stagingBuffer,0,dstBuffer,offset,sizeBytes);this.numCommandsEncoded++}},{key:"dispatchComputerShader",value:function dispatchComputerShader(bindGroup,pipeline,shaderName,workgroupCountX,workgroupCountY,workgroupCountZ){if(this.isTimerEnabled){var querySet=this.device.createQuerySet({type:"timestamp",count:2});var timestampWrites={querySet:querySet,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1};this.endComputePass();this._passEncoder=this.commandEncoder.beginComputePass({timestampWrites:timestampWrites});this._passEncoder.setBindGroup(0,bindGroup);this._passEncoder.setPipeline(pipeline);this._passEncoder.dispatchWorkgroups(workgroupCountX,workgroupCountY,workgroupCountZ);this.endComputePass();var size=2*BigInt64Array.BYTES_PER_ELEMENT;var resolveBuffer=this.device.createBuffer({size:size,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC});this.commandEncoder.resolveQuerySet(querySet,0,2,resolveBuffer,0);var resultBuffer=this.device.createBuffer({size:size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});this.commandEncoder.copyBufferToBuffer(resolveBuffer,0,resultBuffer,0,size);if(!this.timestampBuffers[shaderName]){this.timestampBuffers[shaderName]=[]}this.timestampBuffers[shaderName].push(resultBuffer);this.numCommandsEncoded+=3}else{if(!this._passEncoder){this._passEncoder=this.commandEncoder.beginComputePass()}this._passEncoder.setBindGroup(0,bindGroup);this._passEncoder.setPipeline(pipeline);this._passEncoder.dispatchWorkgroups(workgroupCountX,workgroupCountY,workgroupCountZ);this.numCommandsEncoded++}}}])}();var PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE=256;var gpuDevices=new Map;var gpuBuffers=new Map;var emptyShader="\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main_empty() {}\n";var shaderEntryPoint="main";var PRECOMPUTE_ENCODING_SHADER_NAME="pv_picollm_attention_precompute_encoding_shader";var attentionPrecomputeEncodingShaderSource="\nstruct argsStruct {\n dimension: u32,\n steps: u32,\n theta: f32,\n encoding_offset: u32,\n rope_scale: f32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar encoding: array;\n\n@group(0) @binding(2)\nvar rope_scales: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3,\n @builtin(num_workgroups) num_workgroups: vec3\n) {\n let ts = workgroup_id.x;\n let ds = local_id.x;\n \n for (var t = ts; t < args.steps; t += num_workgroups.x) {\n for (var d = ds; d < (args.dimension / 2u); d += workgroup_size_x) {\n let f = 2u * d;\n let x = f32(t) / (f32(rope_scales[f >> 1]) * pow(args.theta, f32(f) / f32(args.dimension)));\n let encoding_idx = args.encoding_offset + (t * args.dimension) + f;\n encoding[encoding_idx] = cos(x) * args.rope_scale;\n encoding[encoding_idx + 1] = sin(x) * args.rope_scale;\n }\n }\n}\n\n".concat(emptyShader);var loadAttentionPrecomputeEncodingShader=function loadAttentionPrecomputeEncodingShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention precompute encoding bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention precompute encoding pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention precompute encoding shader module",code:attentionPrecomputeEncodingShaderSource});var computePipeline=device.createComputePipeline({label:"attention precompute encoding pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ENCODE_ROPE_INTERLEAVED_SHADER_NAME="pv_picollm_attention_encode_rope_interleaved_shader";var attentionEncodeRopeInterleavedShaderSource="\nstruct argsStruct { \n n: u32,\n num_heads: u32,\n head_dimension: u32,\n rope_dimension: u32,\n position: u32,\n encoding_offset: u32,\n x_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar encoding: array;\n\n@group(0) @binding(2)\nvar x: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3,\n @builtin(num_workgroups) num_workgroups: vec3\n) {\n let ts = workgroup_id.x;\n let h = workgroup_id.y;\n let ds = local_id.x;\n\n for (var t = ts; t < args.n; t += num_workgroups.x) {\n let x_start = args.x_offset + (t * args.num_heads + h) * args.head_dimension;\n let encoding_start = args.encoding_offset + ((t + args.position) * args.rope_dimension); \n for (var d = ds; d < (args.head_dimension / 2u); d += workgroup_size_x) {\n let i = 2u * d;\n let x_idx = x_start + i;\n let encoding_idx = encoding_start + i;\n \n let re = x[x_idx];\n let im = x[x_idx + 1];\n x[x_idx] = (re * encoding[encoding_idx]) - (im * encoding[encoding_idx + 1]);\n x[x_idx + 1] = (re * encoding[encoding_idx + 1]) + (im * encoding[encoding_idx]);\n }\n }\n}\n\n".concat(emptyShader);var loadAttentionEncodeRopeInterleavedShader=function loadAttentionEncodeRopeInterleavedShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention encode rope interleave bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention encode rope interleave pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention encode rope interleave shader module",code:attentionEncodeRopeInterleavedShaderSource});var computePipeline=device.createComputePipeline({label:"attention encode rope interleave pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ENCODE_SHADER_NAME="pv_picollm_attention_encode_shader";var attentionEncodeShaderSource="\nstruct argsStruct { \n n: u32,\n num_heads: u32,\n head_dimension: u32,\n rope_dimension: u32,\n position: u32,\n encoding_offset: u32,\n x_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar encoding: array;\n\n@group(0) @binding(2)\nvar x: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3,\n @builtin(num_workgroups) num_workgroups: vec3\n) {\n let ts = workgroup_id.x;\n let h = workgroup_id.y;\n let ds = local_id.x;\n\n for (var t = ts; t < args.n; t += num_workgroups.x) {\n let half_rope = (args.rope_dimension / 2);\n let xr_start = args.x_offset + ((t * args.num_heads + h) * args.head_dimension);\n let xi_start = xr_start + half_rope;\n let encoding_start = args.encoding_offset + ((t + args.position) * args.rope_dimension); \n for (var d = ds; d < half_rope; d += workgroup_size_x) {\n let xr_idx = xr_start + d;\n let xi_idx = xi_start + d;\n let encoding_idx = encoding_start + (2 * d);\n\n let re = x[xr_idx];\n let im = x[xi_idx];\n x[xr_idx] = (re * encoding[encoding_idx]) - (im * encoding[encoding_idx + 1]);\n x[xi_idx] = (re * encoding[encoding_idx + 1]) + (im * encoding[encoding_idx]);\n }\n }\n}\n\n".concat(emptyShader);var loadAttentionEncodeShader=function loadAttentionEncodeShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention encode bind layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention encode pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention encode shader",code:attentionEncodeShaderSource});var computePipeline=device.createComputePipeline({label:"attention encode pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var DOT_PRODUCT_SHADER_NAME="pv_picollm_attention_dot_product_shader";var attentionDotProductShaderSource="\nstruct argsStruct { \n n: u32,\n tq: u32,\n head_dimension: u32,\n num_heads: u32,\n num_kv_heads: u32,\n window_length: u32,\n start: u32,\n norm: f32,\n length1: u32,\n num_keys: u32,\n query_offset: u32,\n keys_offset: u32,\n key_intercepts_offset: u32,\n key_slopes_offset: u32,\n scores_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar query: array;\n\n@group(0) @binding(2)\nvar keys: array;\n\n@group(0) @binding(3)\nvar key_intercepts: array;\n\n@group(0) @binding(4)\nvar key_slopes: array;\n\n@group(0) @binding(5)\nvar scores: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.num_heads) {\n return;\n }\n\n let head = global_id.x / (args.num_heads / args.num_kv_heads);\n \n let head_offset = head * args.window_length;\n let start_index = head_offset + args.start;\n \n let keys_local_a = args.keys_offset + (start_index * args.head_dimension);\n let key_intercepts_local_a = args.key_intercepts_offset + start_index; \n let key_slopes_local_a = args.key_slopes_offset + start_index;\n \n let keys_local_b = args.keys_offset + (head_offset * args.head_dimension);\n let key_intercepts_local_b = args.key_intercepts_offset + head_offset; \n let key_slopes_local_b = args.key_slopes_offset + head_offset;\n \n let scores_local = args.scores_offset + (global_id.x * args.num_keys);\n let query_local = args.query_offset + (((global_id.x * args.n) + args.tq) * args.head_dimension);\n \n for (var i = 0u; i < args.head_dimension; i++) { \n for (var k = 0u; k < args.num_keys; k++) {\n if (k < args.length1) { \n let key_idx = keys_local_a + (k * args.head_dimension) + i;\n let key_val = f32(extractBits(keys[key_idx / 4], (i * 8u) % 32u, 8u));\n let tmp = query[query_local + i] * (key_intercepts[key_intercepts_local_a + k] + (key_slopes[key_slopes_local_a + k] * key_val));\n scores[scores_local + k] += tmp;\n }\n else {\n let j = k - args.length1;\n let key_idx = keys_local_b + (j * args.head_dimension) + i;\n let key_val = f32(extractBits(keys[key_idx / 4], (i * 8u) % 32u, 8u));\n let tmp = query[query_local + i] * (key_intercepts[key_intercepts_local_b + j] + (key_slopes[key_slopes_local_b + j] * key_val));\n scores[scores_local + k] += tmp;\n }\n } \n }\n \n for (var k = 0u; k < args.num_keys; k++) {\n scores[scores_local + k] *= args.norm;\n }\n}\n\n".concat(emptyShader);var loadAttentionDotProductShader=function loadAttentionDotProductShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention dot product bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention dot product pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention dot product shader module",code:attentionDotProductShaderSource});var computePipeline=device.createComputePipeline({label:"attention dot product pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var SOFTMAX_SHADER_NAME="pv_picollm_attention_softmax_shader";var attentionSoftmaxShaderSource="\nstruct argsStruct { \n num_heads: u32,\n num_keys: u32,\n scores_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar scores: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.num_heads) {\n return;\n }\n\n let scores_start = args.scores_offset + (global_id.x * args.num_keys);\n \n var max_index: u32 = 0;\n for (var i = 1u; i < args.num_keys; i++) {\n if (scores[scores_start + i] > scores[scores_start + max_index]) {\n max_index = i;\n }\n }\n let max: f32 = scores[scores_start + max_index];\n\n var sum: f32 = 0.0;\n for (var i = 0u; i < args.num_keys; i++) {\n scores[scores_start + i] = exp(scores[scores_start + i] - max);\n sum += scores[scores_start + i];\n }\n\n for (var i = 0u; i < args.num_keys; i++) {\n scores[scores_start + i] /= sum;\n }\n}\n\n".concat(emptyShader);var loadAttentionSoftmaxShader=function loadAttentionSoftmaxShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention softmax bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention softmax pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention softmax shader module",code:attentionSoftmaxShaderSource});var computePipeline=device.createComputePipeline({label:"attention softmax pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var FIR_SHADER_NAME="pv_picollm_attention_fir_shader";var attentionFirShaderSource="\nstruct argsStruct { \n length1: u32,\n length2: u32,\n tq: u32,\n head_dimension: u32,\n num_heads: u32,\n num_kv_heads: u32,\n window_length: u32,\n start: u32,\n values_offset: u32,\n value_intercepts_offset: u32,\n value_slopes_offset: u32,\n scores_offset: u32,\n output_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar values: array;\n\n@group(0) @binding(2)\nvar value_intercepts: array;\n\n@group(0) @binding(3)\nvar value_slopes: array;\n\n@group(0) @binding(4)\nvar scores: array;\n\n@group(0) @binding(5)\nvar output: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.num_heads) {\n return;\n }\n\n let head = global_id.x / (args.num_heads / args.num_kv_heads);\n\n let head_offset = head * args.window_length;\n let start_index = head_offset + args.start;\n\n let values_local_a = args.values_offset + (start_index * args.head_dimension);\n let value_intercepts_local_a = args.value_intercepts_offset + start_index;\n let value_slopes_local_a = args.value_slopes_offset + start_index;\n let values_local_b = args.values_offset + (head_offset * args.head_dimension);\n let value_intercepts_local_b = args.value_intercepts_offset + head_offset;\n let value_slopes_local_b = args.value_slopes_offset + head_offset;\n let scores_local = args.scores_offset + (global_id.x * (args.length1 + args.length2));\n let output_local = args.output_offset + (((args.tq * args.num_heads) + global_id.x) * args.head_dimension);\n\n for (var i = 0u; i < args.head_dimension; i++) {\n var tmp: f32 = 0.0;\n for (var k = 0u; k < args.length1; k++) {\n let value_idx = values_local_a + (k * args.head_dimension) + i;\n let value_val = f32(extractBits(values[value_idx / 4], (i * 8u) % 32u, 8u));\n tmp += scores[scores_local + k] * (value_intercepts[value_intercepts_local_a + k] + (value_slopes[value_slopes_local_a + k] * value_val)); \n }\n for (var k = 0u; k < args.length2; k++) {\n let value_idx = values_local_b + (k * args.head_dimension) + i;\n let value_val = f32(extractBits(values[value_idx / 4], (i * 8u) % 32u, 8u));\n tmp += scores[scores_local + args.length1 + k] * (value_intercepts[value_intercepts_local_b + k] + (value_slopes[value_slopes_local_b + k] * value_val)); \n }\n output[output_local + i] = tmp;\n }\n}\n\n".concat(emptyShader);var loadAttentionFirShader=function loadAttentionFirShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention fir bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention fir pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention fir shader module",code:attentionFirShaderSource});var computePipeline=device.createComputePipeline({label:"attention fir pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var UPDATE_KV_SHADER_NAME="pv_picollm_attention_update_kv_shader";var attentionUpdateKvShaderSource="\nstruct argsStruct {\n n: u32,\n num_kv_heads: u32,\n window_length: u32,\n position: u32,\n head_dimension: u32,\n tf_offset: u32,\n kv_offset: u32,\n kv_intercepts_offset: u32,\n kv_slopes_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar tf: array;\n\n@group(0) @binding(2)\nvar kv: array;\n\n@group(0) @binding(3)\nvar kv_intercepts: array;\n\n@group(0) @binding(4)\nvar kv_slopes: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) { \n if (global_id.x >= args.num_kv_heads) {\n return;\n }\n \n for (var i = 0u; i < args.n; i++) {\n let index = (global_id.x * args.window_length) + ((args.position + i) % args.window_length);\n let tf_start = args.tf_offset + (((i * args.num_kv_heads) + global_id.x) * args.head_dimension);\n let kv_start = args.kv_offset + ((index * args.head_dimension) / 4);\n let kv_intercepts_start = args.kv_intercepts_offset + index;\n let kv_slopes_start = args.kv_slopes_offset + index;\n \n var xmax = tf[tf_start]; \n var xmin = tf[tf_start]; \n \n for (var j = 1u; j < args.head_dimension; j++) {\n xmax = max(xmax, tf[tf_start + j]);\n xmin = min(xmin, tf[tf_start + j]);\n }\n\n kv_intercepts[kv_intercepts_start] = xmin;\n kv_slopes[kv_slopes_start] = f32(xmax - xmin) / 255.0;\n\n for (var j = 0u; j < args.head_dimension; j++) {\n let kv_idx = kv_start + (j / 4);\n let kv_val = u32(round((tf[tf_start + j] - xmin) / kv_slopes[kv_slopes_start])); \n kv[kv_idx] = insertBits(kv[kv_idx], extractBits(kv_val, 0u, 8u), (j * 8u) % 32u, 8u); \n }\n }\n}\n\n".concat(emptyShader);var loadAttentionUpdateKvShader=function loadAttentionUpdateKvShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention update kv bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention update kv pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention update kv shader module",code:attentionUpdateKvShaderSource});var computePipeline=device.createComputePipeline({label:"attention update kv pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var TRANSPOSE_QUERY_SHADER_NAME="pv_picollm_attention_transpose_query_shader";var attentionTransposeQueryShaderSource="\nstruct argsStruct {\n n: u32,\n num_heads: u32,\n head_dimension: u32,\n tf_offset: u32,\n hf_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar tf: array;\n\n@group(0) @binding(2)\nvar hf: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(local_invocation_id) local_id : vec3\n) {\n\n if (workgroup_id.x >= args.num_heads || workgroup_id.y >= args.n || local_id.x >= args.head_dimension) {\n return;\n }\n \n let tf_idx = args.tf_offset + (workgroup_id.y * args.num_heads * args.head_dimension) + (workgroup_id.x * args.head_dimension) + local_id.x; \n let hf_idx = args.hf_offset + (workgroup_id.x * args.n * args.head_dimension) + (workgroup_id.y * args.head_dimension) + local_id.x; \n hf[hf_idx] = tf[tf_idx];\n}\n\n".concat(emptyShader);var loadAttentionTransposeQueryShader=function loadAttentionTransposeQueryShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention transpose query bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention transpose query pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention transpose query shader module",code:attentionTransposeQueryShaderSource});var computePipeline=device.createComputePipeline({label:"attention transpose query pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var attentionShaders=_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({},PRECOMPUTE_ENCODING_SHADER_NAME,loadAttentionPrecomputeEncodingShader),ENCODE_ROPE_INTERLEAVED_SHADER_NAME,loadAttentionEncodeRopeInterleavedShader),ENCODE_SHADER_NAME,loadAttentionEncodeShader),DOT_PRODUCT_SHADER_NAME,loadAttentionDotProductShader),SOFTMAX_SHADER_NAME,loadAttentionSoftmaxShader),FIR_SHADER_NAME,loadAttentionFirShader),UPDATE_KV_SHADER_NAME,loadAttentionUpdateKvShader),TRANSPOSE_QUERY_SHADER_NAME,loadAttentionTransposeQueryShader);var SILU_SHADER_NAME="pv_picollm_feed_forward_silu_shader";var feedForwardSiluShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n x[global_id.x] = x[global_id.x] / (1.0 + exp(-x[global_id.x]));\n}\n\n".concat(emptyShader);var loadFeedForwardSiluShader=function loadFeedForwardSiluShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff silu bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff silu pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff silu shader module",code:feedForwardSiluShaderSource});var computePipeline=device.createComputePipeline({label:"ff silu pipline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var GELU_SHADER_NAME="pv_picollm_feed_forward_gelu_shader";var feedForwardGeluShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\nconst a1: f32 = 0.254829592;\nconst a2: f32 = -0.284496736;\nconst a3: f32 = 1.421413741;\nconst a4: f32 = -1.453152027;\nconst a5: f32 = 1.061405429;\nconst p: f32 = 0.3275911;\n\n// A&S formula 7.1.26\nfn erf(x: f32) -> f32 { \n var sign: f32 = 1.0;\n if (x < 0) {\n sign = -1.0;\n }\n var x_abs: f32 = abs(x);\n \n let t: f32 = 1.0 / fma(p, x_abs, 1.0);\n let y: f32 = 1.0 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * exp(-x_abs * x_abs);\n\n return sign * y;\n}\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n x[global_id.x] = 0.5 * x[global_id.x] * (1.0 + erf(x[global_id.x] * 0.7071067811865475));\n}\n\n".concat(emptyShader);var loadFeedForwardGeluShader=function loadFeedForwardGeluShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff gelu bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff gelu pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff gelu shader module",code:feedForwardGeluShaderSource});var computePipeline=device.createComputePipeline({label:"ff gelu pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ALMOST_GELU_SHADER_NAME="pv_picollm_feed_forward_almost_gelu_shader";var feedForwardAlmostGeluShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n x[global_id.x] = 0.5 * x[global_id.x] * (1 + tanh(0.7978845608028654 * (x[global_id.x] + (0.044715f * x[global_id.x] * x[global_id.x] * x[global_id.x]))));\n}\n\n".concat(emptyShader);var loadFeedForwardAlmostGeluShader=function loadFeedForwardAlmostGeluShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff almost gelu bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff almost gelu pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff almost gelu shader module",code:feedForwardAlmostGeluShaderSource});var computePipeline=device.createComputePipeline({label:"ff almost gelu pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var MULTIPLY_BUFFERS_SHADER_NAME="pv_picollm_feed_forward_multiply_buffers_shader";var feedForwardMultiplyBuffersShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n y[global_id.x] *= x[global_id.x];\n}\n\n".concat(emptyShader);var loadFeedForwardMultiplyBuffersShader=function loadFeedForwardMultiplyBuffersShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff multiply buffers bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff multiply buffers pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff multiply buffers shader module",code:feedForwardMultiplyBuffersShaderSource});var computePipeline=device.createComputePipeline({label:"ff multiply buffers pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var feedForwardShaders=_defineProperty(_defineProperty(_defineProperty(_defineProperty({},SILU_SHADER_NAME,loadFeedForwardSiluShader),GELU_SHADER_NAME,loadFeedForwardGeluShader),ALMOST_GELU_SHADER_NAME,loadFeedForwardAlmostGeluShader),MULTIPLY_BUFFERS_SHADER_NAME,loadFeedForwardMultiplyBuffersShader);var FORWARD_SHADER_NAME$1="pv_picollm_gate_forward_shader";var gateForwardShaderSource="\n\nstruct pv_picollm_gate_ix_t {\n i: u32,\n x: f32,\n}\n\n@group(0) @binding(0)\nvar y: array;\n\n@group(0) @binding(1)\nvar indices: array;\n\n@group(0) @binding(2)\nvar weights: array;\n\noverride n: u32 = 0;\noverride k: u32 = 0;\noverride num_experts: u32 = 0;\n\noverride y_offset: u32 = 0;\noverride indices_offset: u32 = 0;\noverride weights_offset: u32 = 0;\n\nvar ixs: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(global_invocation_id) global_id : vec3\n) {\n if (global_id.x >= n) {\n return;\n }\n \n var y_start: u32 = y_offset + global_id.x * num_experts;\n for (var j = 0u; j < num_experts; j++) {\n ixs[j].i = j;\n ixs[j].x = y[y_start + j];\n }\n\n for (var i = 0u; i < num_experts - 1; i++) {\n for (var j = 0u; j < num_experts - i - 1; j++) {\n if (ixs[j].x < ixs[j + 1].x) {\n let tmp = ixs[j];\n ixs[j] = ixs[j + 1];\n ixs[j + 1] = tmp;\n }\n }\n }\n\n for (var j = 0u; j < k; j++) {\n indices[indices_offset + (global_id.x * k) + j] = ixs[j].i;\n weights[weights_offset + (global_id.x * k) + j] = ixs[j].x;\n }\n\n var max_weight: f32 = weights[weights_offset + (global_id.x * k)];\n for (var j = 1u; j < k; j++) {\n max_weight = max(max_weight, weights[weights_offset + (global_id.x * k) + j]);\n }\n\n var sum_weight: f32 = 0.0;\n for (var j = 0u; j < k; j++) {\n weights[weights_offset + (global_id.x * k) + j] = exp(weights[weights_offset + (global_id.x * k) + j] - max_weight);\n sum_weight += weights[weights_offset + (global_id.x * k) + j];\n }\n\n for (var j = 0u; j < k; j++) {\n weights[weights_offset + (global_id.x * k) + j] /= sum_weight;\n }\n}\n\n".concat(emptyShader);var loadGateForwardShader=function loadGateForwardShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"gate forward bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"gate forward pipeline",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"gate forward shader module",code:gateForwardShaderSource});var computePipeline=device.createComputePipeline({layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{num_experts:1}}});return{computePipeline:computePipeline,pipelineLayout:pipelineLayout,shaderModule:shaderModule}};var gateForwardShader=_defineProperty({},FORWARD_SHADER_NAME$1,loadGateForwardShader);var ADD_TO_BUFFER_SHADER_NAME$1="pv_picollm_moe_transformer_add_to_buffer_shader";var moeTransformerAddToBufferShaderSource="\nstruct argsStruct {\n n: u32, \n x_offset: u32,\n buffer_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar buffer: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n\n buffer[args.buffer_offset + global_id.x] += x[args.x_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadMoeTransformerAddToBufferShader=function loadMoeTransformerAddToBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"moe transformer add to buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"moe transformer add to buffer pipeline",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"moe transformer add to buffer shader module",code:moeTransformerAddToBufferShaderSource});var computePipeline=device.createComputePipeline({label:"moe transformer add to buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER_SHADER_NAME="pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer_shader";var moeTransformerMultiplyWeightAndToBufferShaderSource="\nstruct argsStruct {\n n: u32, \n weights_index: u32,\n y_index: u32,\n weights_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weights: array;\n\n@group(0) @binding(2)\nvar x: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n y[args.y_offset + args.y_index + global_id.x] += weights[args.weights_index] + x[args.x_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadMoeTransformerMultiplyWeightAndAddToBufferShader=function loadMoeTransformerMultiplyWeightAndAddToBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"moe transformer multiply weight and add to buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"moe transformer multiply weight and add to buffer pipeline",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"moe transformer multiply weight and add to buffer shader module",code:moeTransformerMultiplyWeightAndToBufferShaderSource});var computePipeline=device.createComputePipeline({label:"moe transformer multiply weight and add to buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var ADD_BUFFERS_SHADER_NAME$1="pv_picollm_moe_transformer_add_buffers_shader";var moeTransformerAddBuffersShaderSource="\nstruct argsStruct {\n n: u32, \n buffer1_offset: u32,\n buffer2_offset: u32,\n y_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar buffer1: array;\n\n@group(0) @binding(2)\nvar buffer2: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n y[args.y_offset + global_id.x] = buffer1[args.buffer1_offset + global_id.x] + buffer2[args.buffer2_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadMoeTransformerAddBuffersShader=function loadMoeTransformerAddBuffersShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"moe transformer add buffers bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"moe transformer add buffers pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"moe transformer add buffers shader module",code:moeTransformerAddBuffersShaderSource});var computePipeline=device.createComputePipeline({label:"moe transformer add buffers pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var moeTransformerForwardShaders=_defineProperty(_defineProperty(_defineProperty({},ADD_TO_BUFFER_SHADER_NAME$1,loadMoeTransformerAddToBufferShader),MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER_SHADER_NAME,loadMoeTransformerMultiplyWeightAndAddToBufferShader),ADD_BUFFERS_SHADER_NAME$1,loadMoeTransformerAddBuffersShader);var sdataReduce="\n for (var s: u32 = workgroup_size_x / 2; s > 0; s >>= 1) {\n if tid < s {\n sdata[tid] += sdata[tid + s];\n }\n workgroupBarrier();\n }\n";var dividePadFunction="\n fn divide_pad(a: u32, b: u32) -> u32 { \n return (a + b - 1) / b;\n }\n";var FORWARD_MULTI_BUFFER_SHADER_NAME$1="pv_picollm_norm_forward_multi_buffer_shader";var FORWARD_SINGLE_BUFFER_SHADER_NAME$1="pv_picollm_norm_forward_single_buffer_shader";var normForwardShaderSource=function normForwardShaderSource(isMulti){return"\nstruct argsStruct {\n n: u32,\n dimension: u32,\n remainder: u32,\n remainder_start: u32, \n eps: f32, \n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weight: array;\n\n".concat(isMulti?"\n@group(0) @binding(2)\nvar x: array;\n\n@group(0) @binding(3) \nvar y: array;\n":" \n@group(0) @binding(2)\nvar x: array;\n","\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\nvar sdata: array, workgroup_size_x>;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3\n) {\n let tid = local_id.x;\n let m = workgroup_id.x;\n let block_size = workgroup_size_x;\n \n var power_vec: vec4;\n let x_start: u32 = args.x_offset + (m * args.dimension);\n let skip = tid * 4;\n let shift = (block_size * 4);\n for (var j = 0u; j + skip < args.remainder_start; j += shift) {\n let local_index = x_start + j + skip; \n\n let x_vec = vec4(\n x[local_index],\n x[local_index + 1],\n x[local_index + 2],\n x[local_index + 3]);\n \n power_vec += x_vec * x_vec; \n } \n \n if (tid == 0 && args.remainder > 0) {\n var remainder_vec = vec4(0.0, 0.0, 0.0, 0.0);\n let x_idx = x_start + args.remainder_start;\n for (var j = 0u; j < args.remainder; j++) { \n remainder_vec[j] = x[x_idx + j];\n } \n power_vec += remainder_vec * remainder_vec;\n }\n \n sdata[tid] = power_vec;\n workgroupBarrier();\n\n ").concat(sdataReduce,"\n \n let power = sdata[0].x + sdata[0].y + sdata[0].z + sdata[0].w;\n let norm: vec4 = vec4(1.0 / sqrt((power / f32(args.dimension)) + args.eps));\n \n let y_start: u32 = args.y_offset + (m * args.dimension);\n for (var j = 0u; j + skip < args.remainder_start; j += shift) {\n let local_index = j + skip;\n let x_idx = x_start + local_index;\n let x_vec = vec4(\n x[x_idx],\n x[x_idx + 1],\n x[x_idx + 2],\n x[x_idx + 3]);\n \n let weight_vec = vec4(\n weight[local_index],\n weight[local_index + 1],\n weight[local_index + 2],\n weight[local_index + 3]);\n let y_vec = x_vec * norm * weight_vec;\n \n let y_idx = y_start + local_index;\n").concat(isMulti?" \n y[y_idx] = y_vec.x;\n y[y_idx + 1] = y_vec.y;\n y[y_idx + 2] = y_vec.z;\n y[y_idx + 3] = y_vec.w;\n":" \n x[y_idx] = y_vec.x;\n x[y_idx + 1] = y_vec.y;\n x[y_idx + 2] = y_vec.z;\n x[y_idx + 3] = y_vec.w;\n"," \n }\n \n if (tid == 0 && args.remainder > 0) {\n let x_idx = x_start + args.remainder_start;\n let weight_idx = args.remainder_start; \n let y_idx = y_start + args.remainder_start;\n for (var j = 0u; j < args.remainder; j++) {\n").concat(isMulti?" \n y[y_idx + j] = x[x_idx + j] * norm[j] * weight[weight_idx + j];\n":" \n x[y_idx + j] = x[x_idx + j] * norm[j] * weight[weight_idx + j];\n"," \n } \n }\n}\n\n").concat(emptyShader)};var loadNormForwardShader=function loadNormForwardShader(device,isMulti){var entries=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}}];if(isMulti){entries.push({binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}});entries.push({binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}})}else{entries.push({binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}})}var bindGroupLayout=device.createBindGroupLayout({label:"norm forward ".concat(isMulti?"multi":"single"," buffer bind group layout"),entries:entries});var pipelineLayout=device.createPipelineLayout({label:"norm forward ".concat(isMulti?"multi":"single"," buffer pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"norm forward ".concat(isMulti?"multi":"single"," buffer shader module"),code:normForwardShaderSource(isMulti)});var computePipeline=device.createComputePipeline({label:"norm forward ".concat(isMulti?"multi":"single"," buffer pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var normForwardShader=_defineProperty(_defineProperty({},FORWARD_SINGLE_BUFFER_SHADER_NAME$1,function(device){return loadNormForwardShader(device,false)}),FORWARD_MULTI_BUFFER_SHADER_NAME$1,function(device){return loadNormForwardShader(device,true)});var FORWARD_MULTI_BUFFER_SHADER_NAME="pv_picollm_norm_layer_forward_multi_buffer_shader";var normLayerForwardMultiBufferShaderSource="\nstruct argsStruct {\n n: u32,\n dimension: u32,\n eps: f32,\n weight_offset: u32,\n bias_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weight: array;\n\n@group(0) @binding(2)\nvar bias: array;\n\n@group(0) @binding(3)\nvar x: array;\n\n@group(0) @binding(4)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n let x_start: u32 = args.x_offset + (global_id.x * args.dimension);\n\n var mean: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean += x[x_start + j];\n }\n mean /= f32(args.dimension);\n\n var mean2: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean2 += (x[x_start + j] - mean) * (x[x_start + j] - mean);\n }\n mean2 /= f32(args.dimension);\n\n var norm: f32 = 1.0 / sqrt(mean2 + args.eps);\n\n var y_start = args.y_offset + (global_id.x * args.dimension);\n for (var j = 0u; j < args.dimension; j++) {\n y[y_start + j] = ((x[x_start + j] - mean) * norm * weight[args.weight_offset + j]) + bias[args.bias_offset + j];\n }\n}\n\n".concat(emptyShader);var loadNormLayerForwardMultiBufferShader=function loadNormLayerForwardMultiBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"norm layer forward multi buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"norm layer forward multi buffer pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"norm layer forward multi buffer shader module",code:normLayerForwardMultiBufferShaderSource});var computePipeline=device.createComputePipeline({label:"norm layer forward multi buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var FORWARD_SINGLE_BUFFER_SHADER_NAME="pv_picollm_norm_layer_forward_single_buffer_shader";var normLayerForwardSingleBufferShaderSource="\nstruct argsStruct {\n n: u32,\n dimension: u32,\n eps: f32,\n weight_offset: u32,\n bias_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weight: array;\n\n@group(0) @binding(2)\nvar bias: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n let x_start: u32 = args.x_offset + (global_id.x * args.dimension);\n\n var mean: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean += y[x_start + j];\n }\n mean /= f32(args.dimension);\n\n var mean2: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean2 += (y[x_start + j] - mean) * (y[x_start + j] - mean);\n }\n mean2 /= f32(args.dimension);\n\n var norm: f32 = 1.0 / sqrt(mean2 + args.eps);\n\n var y_start = args.y_offset + (global_id.x * args.dimension);\n for (var j = 0u; j < args.dimension; j++) {\n y[y_start + j] = ((y[x_start + j] - mean) * norm * weight[args.weight_offset + j]) + bias[args.bias_offset + j];\n }\n}\n\n".concat(emptyShader);var loadNormLayerForwardSingleBufferShader=function loadNormLayerForwardSingleBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"norm layer forward single buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"norm layer forward single buffer pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"norm layer forward single buffer shader module",code:normLayerForwardSingleBufferShaderSource});var computePipeline=device.createComputePipeline({label:"norm layer forward single buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var normLayerForwardShader=_defineProperty(_defineProperty({},FORWARD_SINGLE_BUFFER_SHADER_NAME,loadNormLayerForwardSingleBufferShader),FORWARD_MULTI_BUFFER_SHADER_NAME,loadNormLayerForwardMultiBufferShader);var ADD_TO_BUFFER_SHADER_NAME="pv_picollm_transformer_add_to_buffer_shader";var transformerAddToBufferShaderSource="\nstruct argsStruct {\n n: u32,\n x_offset: u32,\n buffer_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar buffer: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n buffer[args.buffer_offset + global_id.x] += x[args.x_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadTransformerAddToBufferShader=function loadTransformerAddToBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"transformer add to buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"transformer add to buffer pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"transformer add to buffer shader module",code:transformerAddToBufferShaderSource});var computePipeline=device.createComputePipeline({label:"transformer add to buffer compute",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ADD_BUFFERS_SHADER_NAME="pv_picollm_transformer_add_buffers_shader";var transformerAddBuffersShaderSource="\n\nstruct argsStruct {\n n: u32,\n buffer1_offset: u32,\n buffer2_offset: u32,\n y_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar buffer1: array;\n\n@group(0) @binding(2)\nvar buffer2: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n y[args.y_offset + global_id.x] = buffer1[args.buffer1_offset + global_id.x] + buffer2[args.buffer2_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadTransformerAddBuffersShader=function loadTransformerAddBuffersShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"transformer add buffers bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"transformer add buffers pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"transformer add buffers shader module",code:transformerAddBuffersShaderSource});var computePipeline=device.createComputePipeline({label:"transformer add buffers pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var transformerForwardShaders=_defineProperty(_defineProperty({},ADD_TO_BUFFER_SHADER_NAME,loadTransformerAddToBufferShader),ADD_BUFFERS_SHADER_NAME,loadTransformerAddBuffersShader);var FORWARD_SHADER_NAME="pv_picollm_weight_float_forward_shader";var weightFloatForwardShaderSource="\n\nstruct argsStruct {\n nr: u32,\n nc: u32,\n w_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar w: array;\n\n@group(0) @binding(2)\nvar x: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(local_invocation_id) local_id : vec3\n) {\n if (local_id.x >= args.nr) {\n return;\n }\n let x_start: u32 = args.x_offset + (workgroup_id.x * args.nc);\n let y_idx: u32 = local_id.x + args.y_offset + (workgroup_id.x * args.nr);\n \n let w_start: u32 = args.w_offset + (local_id.x * args.nc);\n for (var j = 0u; j < args.nc; j++) {\n y[y_idx] += w[w_start + j] * x[x_start + j]; \n }\n}\n\n".concat(emptyShader);var loadWeightFloatForwardShader=function loadWeightFloatForwardShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight float forward bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight float forward pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight float forward shader module",code:weightFloatForwardShaderSource});var computePipeline=device.createComputePipeline({label:"weight float forward pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var weightFloatForwardShader=_defineProperty({},FORWARD_SHADER_NAME,loadWeightFloatForwardShader);var rowsPerBlock=16;var columnsPerBlock=8;var preprocessDim=16;var weightBlockSize=256;var unpackBlock128BitDepth3="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_3(packed_offset: u32) {\n let val_0 = blocks[packed_offset]; \n unpacked[0] = extractBits(val_0, 0u, 3u);\n unpacked[1] = extractBits(val_0, 3u, 3u);\n unpacked[2] = extractBits(val_0, 6u, 3u);\n unpacked[3] = extractBits(val_0, 9u, 3u);\n unpacked[4] = extractBits(val_0, 12u, 3u);\n unpacked[5] = extractBits(val_0, 15u, 3u);\n unpacked[6] = extractBits(val_0, 18u, 3u);\n unpacked[7] = extractBits(val_0, 21u, 3u);\n unpacked[8] = extractBits(val_0, 24u, 3u);\n unpacked[9] = extractBits(val_0, 27u, 3u);\n unpacked[10] = extractBits(val_0, 30u, 2u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[10] = insertBits(unpacked[10], extractBits(val_1, 0u, 1u), 2u, 1u);\n unpacked[11] = extractBits(val_1, 1u, 3u);\n unpacked[12] = extractBits(val_1, 4u, 3u);\n unpacked[13] = extractBits(val_1, 7u, 3u);\n unpacked[14] = extractBits(val_1, 10u, 3u);\n unpacked[15] = extractBits(val_1, 13u, 3u);\n unpacked[16] = extractBits(val_1, 16u, 3u);\n unpacked[17] = extractBits(val_1, 19u, 3u);\n unpacked[18] = extractBits(val_1, 22u, 3u);\n unpacked[19] = extractBits(val_1, 25u, 3u);\n unpacked[20] = extractBits(val_1, 28u, 3u);\n unpacked[21] = extractBits(val_1, 31u, 1u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[21] = insertBits(unpacked[21], extractBits(val_2, 0u, 2u), 1u, 2u); \n unpacked[22] = extractBits(val_2, 2u, 3u);\n unpacked[23] = extractBits(val_2, 5u, 3u);\n unpacked[24] = extractBits(val_2, 8u, 3u);\n unpacked[25] = extractBits(val_2, 11u, 3u);\n unpacked[26] = extractBits(val_2, 14u, 3u);\n unpacked[27] = extractBits(val_2, 17u, 3u);\n unpacked[28] = extractBits(val_2, 20u, 3u);\n unpacked[29] = extractBits(val_2, 23u, 3u);\n unpacked[30] = extractBits(val_2, 26u, 3u);\n unpacked[31] = extractBits(val_2, 29u, 3u);\n \n let val_3 = blocks[packed_offset + 3]; \n unpacked[32] = extractBits(val_3, 0u, 3u);\n unpacked[33] = extractBits(val_3, 3u, 3u);\n unpacked[34] = extractBits(val_3, 6u, 3u);\n unpacked[35] = extractBits(val_3, 9u, 3u);\n unpacked[36] = extractBits(val_3, 12u, 3u);\n unpacked[37] = extractBits(val_3, 15u, 3u);\n unpacked[38] = extractBits(val_3, 18u, 3u);\n unpacked[39] = extractBits(val_3, 21u, 3u);\n unpacked[40] = extractBits(val_3, 24u, 3u);\n unpacked[41] = extractBits(val_3, 27u, 3u);\n unpacked[42] = extractBits(val_3, 30u, 2u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[42] = insertBits(unpacked[42], extractBits(val_4, 0u, 1u), 2u, 1u);\n unpacked[43] = extractBits(val_4, 1u, 3u);\n unpacked[44] = extractBits(val_4, 4u, 3u);\n unpacked[45] = extractBits(val_4, 7u, 3u);\n unpacked[46] = extractBits(val_4, 10u, 3u);\n unpacked[47] = extractBits(val_4, 13u, 3u);\n unpacked[48] = extractBits(val_4, 16u, 3u);\n unpacked[49] = extractBits(val_4, 19u, 3u);\n unpacked[50] = extractBits(val_4, 22u, 3u);\n unpacked[51] = extractBits(val_4, 25u, 3u);\n unpacked[52] = extractBits(val_4, 28u, 3u);\n unpacked[53] = extractBits(val_4, 31u, 1u);\n \n let val_5 = blocks[packed_offset + 5];\n unpacked[53] = insertBits(unpacked[53], extractBits(val_5, 0u, 2u), 1u, 2u); \n unpacked[54] = extractBits(val_5, 2u, 3u);\n unpacked[55] = extractBits(val_5, 5u, 3u);\n unpacked[56] = extractBits(val_5, 8u, 3u);\n unpacked[57] = extractBits(val_5, 11u, 3u);\n unpacked[58] = extractBits(val_5, 14u, 3u);\n unpacked[59] = extractBits(val_5, 17u, 3u);\n unpacked[60] = extractBits(val_5, 20u, 3u);\n unpacked[61] = extractBits(val_5, 23u, 3u);\n unpacked[62] = extractBits(val_5, 26u, 3u);\n unpacked[63] = extractBits(val_5, 29u, 3u);\n \n let val_6 = blocks[packed_offset + 6];\n unpacked[64] = extractBits(val_6, 0u, 3u);\n unpacked[65] = extractBits(val_6, 3u, 3u);\n unpacked[66] = extractBits(val_6, 6u, 3u);\n unpacked[67] = extractBits(val_6, 9u, 3u);\n unpacked[68] = extractBits(val_6, 12u, 3u);\n unpacked[69] = extractBits(val_6, 15u, 3u);\n unpacked[70] = extractBits(val_6, 18u, 3u);\n unpacked[71] = extractBits(val_6, 21u, 3u);\n unpacked[72] = extractBits(val_6, 24u, 3u);\n unpacked[73] = extractBits(val_6, 27u, 3u);\n unpacked[74] = extractBits(val_6, 30u, 2u);\n \n let val_7 = blocks[packed_offset + 7];\n unpacked[74] = insertBits(unpacked[74], extractBits(val_7, 0u, 1u), 2u, 1u);\n unpacked[75] = extractBits(val_7, 1u, 3u);\n unpacked[76] = extractBits(val_7, 4u, 3u);\n unpacked[77] = extractBits(val_7, 7u, 3u);\n unpacked[78] = extractBits(val_7, 10u, 3u);\n unpacked[79] = extractBits(val_7, 13u, 3u);\n unpacked[80] = extractBits(val_7, 16u, 3u);\n unpacked[81] = extractBits(val_7, 19u, 3u);\n unpacked[82] = extractBits(val_7, 22u, 3u);\n unpacked[83] = extractBits(val_7, 25u, 3u);\n unpacked[84] = extractBits(val_7, 28u, 3u);\n unpacked[85] = extractBits(val_7, 31u, 1u);\n \n let val_8 = blocks[packed_offset + 8];\n unpacked[85] = insertBits(unpacked[85], extractBits(val_8, 0u, 2u), 1u, 2u); \n unpacked[86] = extractBits(val_8, 2u, 3u);\n unpacked[87] = extractBits(val_8, 5u, 3u);\n unpacked[88] = extractBits(val_8, 8u, 3u);\n unpacked[89] = extractBits(val_8, 11u, 3u);\n unpacked[90] = extractBits(val_8, 14u, 3u);\n unpacked[91] = extractBits(val_8, 17u, 3u);\n unpacked[92] = extractBits(val_8, 20u, 3u);\n unpacked[93] = extractBits(val_8, 23u, 3u);\n unpacked[94] = extractBits(val_8, 26u, 3u);\n unpacked[95] = extractBits(val_8, 29u, 3u);\n \n let val_9 = blocks[packed_offset + 9];\n unpacked[96] = extractBits(val_9, 0u, 3u);\n unpacked[97] = extractBits(val_9, 3u, 3u);\n unpacked[98] = extractBits(val_9, 6u, 3u);\n unpacked[99] = extractBits(val_9, 9u, 3u);\n unpacked[100] = extractBits(val_9, 12u, 3u);\n unpacked[101] = extractBits(val_9, 15u, 3u);\n unpacked[102] = extractBits(val_9, 18u, 3u);\n unpacked[103] = extractBits(val_9, 21u, 3u);\n unpacked[104] = extractBits(val_9, 24u, 3u);\n unpacked[105] = extractBits(val_9, 27u, 3u);\n unpacked[106] = extractBits(val_9, 30u, 2u);\n \n let val_10 = blocks[packed_offset + 10];\n unpacked[106] = insertBits(unpacked[106], extractBits(val_10, 0u, 1u), 2u, 1u);\n unpacked[107] = extractBits(val_10, 1u, 3u);\n unpacked[108] = extractBits(val_10, 4u, 3u);\n unpacked[109] = extractBits(val_10, 7u, 3u);\n unpacked[110] = extractBits(val_10, 10u, 3u);\n unpacked[111] = extractBits(val_10, 13u, 3u);\n unpacked[112] = extractBits(val_10, 16u, 3u);\n unpacked[113] = extractBits(val_10, 19u, 3u);\n unpacked[114] = extractBits(val_10, 22u, 3u);\n unpacked[115] = extractBits(val_10, 25u, 3u);\n unpacked[116] = extractBits(val_10, 28u, 3u);\n unpacked[117] = extractBits(val_10, 31u, 1u);\n \n let val_11 = blocks[packed_offset + 11];\n unpacked[117] = insertBits(unpacked[117], extractBits(val_11, 0u, 2u), 1u, 2u); \n unpacked[118] = extractBits(val_11, 2u, 3u);\n unpacked[119] = extractBits(val_11, 5u, 3u);\n unpacked[120] = extractBits(val_11, 8u, 3u);\n unpacked[121] = extractBits(val_11, 11u, 3u);\n unpacked[122] = extractBits(val_11, 14u, 3u);\n unpacked[123] = extractBits(val_11, 17u, 3u);\n unpacked[124] = extractBits(val_11, 20u, 3u);\n unpacked[125] = extractBits(val_11, 23u, 3u);\n unpacked[126] = extractBits(val_11, 26u, 3u);\n unpacked[127] = extractBits(val_11, 29u, 3u);\n}\n";var unpackBlock128BitDepth5="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_5(packed_offset: u32) { \n let val_0 = blocks[packed_offset];\n unpacked[0] = extractBits(val_0, 0u, 5u);\n unpacked[1] = extractBits(val_0, 5u, 5u);\n unpacked[2] = extractBits(val_0, 10u, 5u);\n unpacked[3] = extractBits(val_0, 15u, 5u);\n unpacked[4] = extractBits(val_0, 20u, 5u);\n unpacked[5] = extractBits(val_0, 25u, 5u);\n unpacked[6] = extractBits(val_0, 30u, 2u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[6] = insertBits(unpacked[6], extractBits(val_1, 0u, 3u), 2u, 3u); \n unpacked[7] = extractBits(val_1, 3u, 5u);\n unpacked[8] = extractBits(val_1, 8u, 5u);\n unpacked[9] = extractBits(val_1, 13u, 5u);\n unpacked[10] = extractBits(val_1, 18u, 5u);\n unpacked[11] = extractBits(val_1, 23u, 5u);\n unpacked[12] = extractBits(val_1, 28u, 4u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[12] = insertBits(unpacked[12], extractBits(val_2, 0u, 1u), 4u, 1u);\n unpacked[13] = extractBits(val_2, 1u, 5u);\n unpacked[14] = extractBits(val_2, 6u, 5u);\n unpacked[15] = extractBits(val_2, 11u, 5u);\n unpacked[16] = extractBits(val_2, 16u, 5u);\n unpacked[17] = extractBits(val_2, 21u, 5u);\n unpacked[18] = extractBits(val_2, 26u, 5u);\n unpacked[19] = extractBits(val_2, 31u, 1u);\n \n let val_3 = blocks[packed_offset + 3];\n unpacked[19] = insertBits(unpacked[19], extractBits(val_3, 0u, 4u), 1u, 4u);\n unpacked[20] = extractBits(val_3, 4u, 5u);\n unpacked[21] = extractBits(val_3, 9u, 5u);\n unpacked[22] = extractBits(val_3, 14u, 5u);\n unpacked[23] = extractBits(val_3, 19u, 5u);\n unpacked[24] = extractBits(val_3, 24u, 5u);\n unpacked[25] = extractBits(val_3, 29u, 3u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[25] = insertBits(unpacked[25], extractBits(val_4, 0u, 2u), 3u, 2u);\n unpacked[26] = extractBits(val_4, 2u, 5u);\n unpacked[27] = extractBits(val_4, 7u, 5u);\n unpacked[28] = extractBits(val_4, 12u, 5u);\n unpacked[29] = extractBits(val_4, 17u, 5u);\n unpacked[30] = extractBits(val_4, 22u, 5u);\n unpacked[31] = extractBits(val_4, 27u, 5u);\n \n let val_5 = blocks[packed_offset + 5];\n unpacked[32] = extractBits(val_5, 0u, 5u);\n unpacked[33] = extractBits(val_5, 5u, 5u);\n unpacked[34] = extractBits(val_5, 10u, 5u);\n unpacked[35] = extractBits(val_5, 15u, 5u);\n unpacked[36] = extractBits(val_5, 20u, 5u);\n unpacked[37] = extractBits(val_5, 25u, 5u);\n unpacked[38] = extractBits(val_5, 30u, 2u);\n\n let val_6 = blocks[packed_offset + 6];\n unpacked[38] = insertBits(unpacked[38], extractBits(val_6, 0u, 3u), 2u, 3u);\n unpacked[39] = extractBits(val_6, 3u, 5u);\n unpacked[40] = extractBits(val_6, 8u, 5u);\n unpacked[41] = extractBits(val_6, 13u, 5u);\n unpacked[42] = extractBits(val_6, 18u, 5u);\n unpacked[43] = extractBits(val_6, 23u, 5u);\n unpacked[44] = extractBits(val_6, 28u, 4u);\n\n let val_7 = blocks[packed_offset + 7];\n unpacked[44] = insertBits(unpacked[44], extractBits(val_7, 0u, 1u), 4u, 1u);\n unpacked[45] = extractBits(val_7, 1u, 5u);\n unpacked[46] = extractBits(val_7, 6u, 5u);\n unpacked[47] = extractBits(val_7, 11u, 5u);\n unpacked[48] = extractBits(val_7, 16u, 5u);\n unpacked[49] = extractBits(val_7, 21u, 5u);\n unpacked[50] = extractBits(val_7, 26u, 5u);\n unpacked[51] = extractBits(val_7, 31u, 1u);\n\n let val_8 = blocks[packed_offset + 8];\n unpacked[51] = insertBits(unpacked[51], extractBits(val_8, 0u, 4u), 1u, 4u);\n unpacked[52] = extractBits(val_8, 4u, 5u);\n unpacked[53] = extractBits(val_8, 9u, 5u);\n unpacked[54] = extractBits(val_8, 14u, 5u);\n unpacked[55] = extractBits(val_8, 19u, 5u);\n unpacked[56] = extractBits(val_8, 24u, 5u);\n unpacked[57] = extractBits(val_8, 29u, 3u);\n \n let val_9 = blocks[packed_offset + 9];\n unpacked[57] = insertBits(unpacked[57], extractBits(val_9, 0u, 2u), 3u, 2u);\n unpacked[58] = extractBits(val_9, 2u, 5u);\n unpacked[59] = extractBits(val_9, 7u, 5u);\n unpacked[60] = extractBits(val_9, 12u, 5u);\n unpacked[61] = extractBits(val_9, 17u, 5u);\n unpacked[62] = extractBits(val_9, 22u, 5u);\n unpacked[63] = extractBits(val_9, 27u, 5u);\n \n let val_10 = blocks[packed_offset + 10];\n unpacked[64] = extractBits(val_10, 0u, 5u);\n unpacked[65] = extractBits(val_10, 5u, 5u);\n unpacked[66] = extractBits(val_10, 10u, 5u);\n unpacked[67] = extractBits(val_10, 15u, 5u);\n unpacked[68] = extractBits(val_10, 20u, 5u);\n unpacked[69] = extractBits(val_10, 25u, 5u);\n unpacked[70] = extractBits(val_10, 30u, 2u);\n\n let val_11 = blocks[packed_offset + 11];\n unpacked[70] = insertBits(unpacked[70], extractBits(val_11, 0u, 3u), 2u, 3u);\n unpacked[71] = extractBits(val_11, 3u, 5u);\n unpacked[72] = extractBits(val_11, 8u, 5u);\n unpacked[73] = extractBits(val_11, 13u, 5u);\n unpacked[74] = extractBits(val_11, 18u, 5u);\n unpacked[75] = extractBits(val_11, 23u, 5u);\n unpacked[76] = extractBits(val_11, 28u, 4u);\n\n let val_12 = blocks[packed_offset + 12];\n unpacked[76] = insertBits(unpacked[76], extractBits(val_12, 0u, 1u), 4u, 1u);\n unpacked[77] = extractBits(val_12, 1u, 5u);\n unpacked[78] = extractBits(val_12, 6u, 5u);\n unpacked[79] = extractBits(val_12, 11u, 5u);\n unpacked[80] = extractBits(val_12, 16u, 5u);\n unpacked[81] = extractBits(val_12, 21u, 5u);\n unpacked[82] = extractBits(val_12, 26u, 5u);\n unpacked[83] = extractBits(val_12, 31u, 1u);\n\n let val_13 = blocks[packed_offset + 13];\n unpacked[83] = insertBits(unpacked[83], extractBits(val_13, 0u, 4u), 1u, 4u);\n unpacked[84] = extractBits(val_13, 4u, 5u);\n unpacked[85] = extractBits(val_13, 9u, 5u);\n unpacked[86] = extractBits(val_13, 14u, 5u);\n unpacked[87] = extractBits(val_13, 19u, 5u);\n unpacked[88] = extractBits(val_13, 24u, 5u);\n unpacked[89] = extractBits(val_13, 29u, 3u);\n \n let val_14 = blocks[packed_offset + 14];\n unpacked[89] = insertBits(unpacked[89], extractBits(val_14, 0u, 2u), 3u, 2u);\n unpacked[90] = extractBits(val_14, 2u, 5u);\n unpacked[91] = extractBits(val_14, 7u, 5u);\n unpacked[92] = extractBits(val_14, 12u, 5u);\n unpacked[93] = extractBits(val_14, 17u, 5u);\n unpacked[94] = extractBits(val_14, 22u, 5u);\n unpacked[95] = extractBits(val_14, 27u, 5u);\n\n let val_15 = blocks[packed_offset + 15];\n unpacked[96] = extractBits(val_15, 0u, 5u);\n unpacked[97] = extractBits(val_15, 5u, 5u);\n unpacked[98] = extractBits(val_15, 10u, 5u);\n unpacked[99] = extractBits(val_15, 15u, 5u);\n unpacked[100] = extractBits(val_15, 20u, 5u);\n unpacked[101] = extractBits(val_15, 25u, 5u);\n unpacked[102] = extractBits(val_15, 30u, 2u);\n\n let val_16 = blocks[packed_offset + 16];\n unpacked[102] = insertBits(unpacked[102], extractBits(val_16, 0u, 3u), 2u, 3u);\n unpacked[103] = extractBits(val_16, 3u, 5u);\n unpacked[104] = extractBits(val_16, 8u, 5u);\n unpacked[105] = extractBits(val_16, 13u, 5u);\n unpacked[106] = extractBits(val_16, 18u, 5u);\n unpacked[107] = extractBits(val_16, 23u, 5u);\n unpacked[108] = extractBits(val_16, 28u, 4u);\n\n let val_17 = blocks[packed_offset + 17];\n unpacked[108] = insertBits(unpacked[108], extractBits(val_17, 0u, 1u), 4u, 1u);\n unpacked[109] = extractBits(val_17, 1u, 5u);\n unpacked[110] = extractBits(val_17, 6u, 5u);\n unpacked[111] = extractBits(val_17, 11u, 5u);\n unpacked[112] = extractBits(val_17, 16u, 5u);\n unpacked[113] = extractBits(val_17, 21u, 5u);\n unpacked[114] = extractBits(val_17, 26u, 5u);\n unpacked[115] = extractBits(val_17, 31u, 1u);\n \n let val_18 = blocks[packed_offset + 18];\n unpacked[115] = insertBits(unpacked[115], extractBits(val_18, 0u, 4u), 1u, 4u);\n unpacked[116] = extractBits(val_18, 4u, 5u);\n unpacked[117] = extractBits(val_18, 9u, 5u);\n unpacked[118] = extractBits(val_18, 14u, 5u);\n unpacked[119] = extractBits(val_18, 19u, 5u);\n unpacked[120] = extractBits(val_18, 24u, 5u);\n unpacked[121] = extractBits(val_18, 29u, 3u);\n\n let val_19 = blocks[packed_offset + 19];\n unpacked[121] = insertBits(unpacked[121], extractBits(val_19, 0u, 2u), 3u, 2u);\n unpacked[122] = extractBits(val_19, 2u, 5u);\n unpacked[123] = extractBits(val_19, 7u, 5u);\n unpacked[124] = extractBits(val_19, 12u, 5u);\n unpacked[125] = extractBits(val_19, 17u, 5u);\n unpacked[126] = extractBits(val_19, 22u, 5u);\n unpacked[127] = extractBits(val_19, 27u, 5u);\n}\n";var unpackBlock128BitDepth6="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_6(packed_offset: u32) {\n let val_0 = blocks[packed_offset];\n unpacked[0] = extractBits(val_0, 0u, 6u);\n unpacked[1] = extractBits(val_0, 6u, 6u);\n unpacked[2] = extractBits(val_0, 12u, 6u);\n unpacked[3] = extractBits(val_0, 18u, 6u);\n unpacked[4] = extractBits(val_0, 24u, 6u);\n unpacked[5] = extractBits(val_0, 30u, 2u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[5] = insertBits(unpacked[5], extractBits(val_1, 0u, 4u), 2u, 4u);\n unpacked[6] = extractBits(val_1, 4u, 6u);\n unpacked[7] = extractBits(val_1, 10u, 6u);\n unpacked[8] = extractBits(val_1, 16u, 6u);\n unpacked[9] = extractBits(val_1, 22u, 6u);\n unpacked[10] = extractBits(val_1, 28u, 4u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[10] = insertBits(unpacked[10], extractBits(val_2, 0u, 2u), 4u, 2u);\n unpacked[11] = extractBits(val_2, 2u, 6u);\n unpacked[12] = extractBits(val_2, 8u, 6u);\n unpacked[13] = extractBits(val_2, 14u, 6u);\n unpacked[14] = extractBits(val_2, 20u, 6u);\n unpacked[15] = extractBits(val_2, 26u, 6u);\n \n let val_3 = blocks[packed_offset + 3];\n unpacked[16] = extractBits(val_3, 0u, 6u);\n unpacked[17] = extractBits(val_3, 6u, 6u);\n unpacked[18] = extractBits(val_3, 12u, 6u);\n unpacked[19] = extractBits(val_3, 18u, 6u);\n unpacked[20] = extractBits(val_3, 24u, 6u);\n unpacked[21] = extractBits(val_3, 30u, 2u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[21] = insertBits(unpacked[21], extractBits(val_4, 0u, 4u), 2u, 4u);\n unpacked[22] = extractBits(val_4, 4u, 6u);\n unpacked[23] = extractBits(val_4, 10u, 6u);\n unpacked[24] = extractBits(val_4, 16u, 6u);\n unpacked[25] = extractBits(val_4, 22u, 6u);\n unpacked[26] = extractBits(val_4, 28u, 4u);\n\n let val_5 = blocks[packed_offset + 5];\n unpacked[26] = insertBits(unpacked[26], extractBits(val_5, 0u, 2u), 4u, 2u);\n unpacked[27] = extractBits(val_5, 2u, 6u);\n unpacked[28] = extractBits(val_5, 8u, 6u);\n unpacked[29] = extractBits(val_5, 14u, 6u);\n unpacked[30] = extractBits(val_5, 20u, 6u);\n unpacked[31] = extractBits(val_5, 26u, 6u);\n\n let val_6 = blocks[packed_offset + 6];\n unpacked[32] = extractBits(val_6, 0u, 6u);\n unpacked[33] = extractBits(val_6, 6u, 6u);\n unpacked[34] = extractBits(val_6, 12u, 6u);\n unpacked[35] = extractBits(val_6, 18u, 6u);\n unpacked[36] = extractBits(val_6, 24u, 6u);\n unpacked[37] = extractBits(val_6, 30u, 2u);\n\n let val_7 = blocks[packed_offset + 7];\n unpacked[37] = insertBits(unpacked[37], extractBits(val_7, 0u, 4u), 2u, 4u);\n unpacked[38] = extractBits(val_7, 4u, 6u);\n unpacked[39] = extractBits(val_7, 10u, 6u);\n unpacked[40] = extractBits(val_7, 16u, 6u);\n unpacked[41] = extractBits(val_7, 22u, 6u);\n unpacked[42] = extractBits(val_7, 28u, 4u);\n \n let val_8 = blocks[packed_offset + 8];\n unpacked[42] = insertBits(unpacked[42], extractBits(val_8, 0u, 2u), 4u, 2u);\n unpacked[43] = extractBits(val_8, 2u, 6u);\n unpacked[44] = extractBits(val_8, 8u, 6u);\n unpacked[45] = extractBits(val_8, 14u, 6u);\n unpacked[46] = extractBits(val_8, 20u, 6u);\n unpacked[47] = extractBits(val_8, 26u, 6u);\n\n let val_9 = blocks[packed_offset + 9];\n unpacked[48] = extractBits(val_9, 0u, 6u);\n unpacked[49] = extractBits(val_9, 6u, 6u);\n unpacked[50] = extractBits(val_9, 12u, 6u);\n unpacked[51] = extractBits(val_9, 18u, 6u);\n unpacked[52] = extractBits(val_9, 24u, 6u);\n unpacked[53] = extractBits(val_9, 30u, 2u);\n\n let val_10 = blocks[packed_offset + 10];\n unpacked[53] = insertBits(unpacked[53], extractBits(val_10, 0u, 4u), 2u, 4u);\n unpacked[54] = extractBits(val_10, 4u, 6u);\n unpacked[55] = extractBits(val_10, 10u, 6u);\n unpacked[56] = extractBits(val_10, 16u, 6u);\n unpacked[57] = extractBits(val_10, 22u, 6u);\n unpacked[58] = extractBits(val_10, 28u, 4u);\n\n let val_11 = blocks[packed_offset + 11];\n unpacked[58] = insertBits(unpacked[58], extractBits(val_11, 0u, 2u), 4u, 2u);\n unpacked[59] = extractBits(val_11, 2u, 6u);\n unpacked[60] = extractBits(val_11, 8u, 6u);\n unpacked[61] = extractBits(val_11, 14u, 6u);\n unpacked[62] = extractBits(val_11, 20u, 6u);\n unpacked[63] = extractBits(val_11, 26u, 6u);\n \n let val_12 = blocks[packed_offset + 12];\n unpacked[64] = extractBits(val_12, 0u, 6u);\n unpacked[65] = extractBits(val_12, 6u, 6u);\n unpacked[66] = extractBits(val_12, 12u, 6u);\n unpacked[67] = extractBits(val_12, 18u, 6u);\n unpacked[68] = extractBits(val_12, 24u, 6u);\n unpacked[69] = extractBits(val_12, 30u, 2u);\n\n let val_13 = blocks[packed_offset + 13];\n unpacked[69] = insertBits(unpacked[69], extractBits(val_13, 0u, 4u), 2u, 4u);\n unpacked[70] = extractBits(val_13, 4u, 6u);\n unpacked[71] = extractBits(val_13, 10u, 6u);\n unpacked[72] = extractBits(val_13, 16u, 6u);\n unpacked[73] = extractBits(val_13, 22u, 6u);\n unpacked[74] = extractBits(val_13, 28u, 4u);\n\n let val_14 = blocks[packed_offset + 14];\n unpacked[74] = insertBits(unpacked[74], extractBits(val_14, 0u, 2u), 4u, 2u);\n unpacked[75] = extractBits(val_14, 2u, 6u);\n unpacked[76] = extractBits(val_14, 8u, 6u);\n unpacked[77] = extractBits(val_14, 14u, 6u);\n unpacked[78] = extractBits(val_14, 20u, 6u);\n unpacked[79] = extractBits(val_14, 26u, 6u);\n\n let val_15 = blocks[packed_offset + 15];\n unpacked[80] = extractBits(val_15, 0u, 6u);\n unpacked[81] = extractBits(val_15, 6u, 6u);\n unpacked[82] = extractBits(val_15, 12u, 6u);\n unpacked[83] = extractBits(val_15, 18u, 6u);\n unpacked[84] = extractBits(val_15, 24u, 6u);\n unpacked[85] = extractBits(val_15, 30u, 2u);\n \n let val_16 = blocks[packed_offset + 16];\n unpacked[85] = insertBits(unpacked[85], extractBits(val_16, 0u, 4u), 2u, 4u);\n unpacked[86] = extractBits(val_16, 4u, 6u);\n unpacked[87] = extractBits(val_16, 10u, 6u);\n unpacked[88] = extractBits(val_16, 16u, 6u);\n unpacked[89] = extractBits(val_16, 22u, 6u);\n unpacked[90] = extractBits(val_16, 28u, 4u);\n\n let val_17 = blocks[packed_offset + 17];\n unpacked[90] = insertBits(unpacked[90], extractBits(val_17, 0u, 2u), 4u, 2u);\n unpacked[91] = extractBits(val_17, 2u, 6u);\n unpacked[92] = extractBits(val_17, 8u, 6u);\n unpacked[93] = extractBits(val_17, 14u, 6u);\n unpacked[94] = extractBits(val_17, 20u, 6u);\n unpacked[95] = extractBits(val_17, 26u, 6u);\n\n let val_18 = blocks[packed_offset + 18];\n unpacked[96] = extractBits(val_18, 0u, 6u);\n unpacked[97] = extractBits(val_18, 6u, 6u);\n unpacked[98] = extractBits(val_18, 12u, 6u);\n unpacked[99] = extractBits(val_18, 18u, 6u);\n unpacked[100] = extractBits(val_18, 24u, 6u);\n unpacked[101] = extractBits(val_18, 30u, 2u);\n\n let val_19 = blocks[packed_offset + 19];\n unpacked[101] = insertBits(unpacked[101], extractBits(val_19, 0u, 4u), 2u, 4u);\n unpacked[102] = extractBits(val_19, 4u, 6u);\n unpacked[103] = extractBits(val_19, 10u, 6u);\n unpacked[104] = extractBits(val_19, 16u, 6u);\n unpacked[105] = extractBits(val_19, 22u, 6u);\n unpacked[106] = extractBits(val_19, 28u, 4u);\n \n let val_20 = blocks[packed_offset + 20];\n unpacked[106] = insertBits(unpacked[106], extractBits(val_20, 0u, 2u), 4u, 2u);\n unpacked[107] = extractBits(val_20, 2u, 6u);\n unpacked[108] = extractBits(val_20, 8u, 6u);\n unpacked[109] = extractBits(val_20, 14u, 6u);\n unpacked[110] = extractBits(val_20, 20u, 6u);\n unpacked[111] = extractBits(val_20, 26u, 6u);\n\n let val_21 = blocks[packed_offset + 21];\n unpacked[112] = extractBits(val_21, 0u, 6u);\n unpacked[113] = extractBits(val_21, 6u, 6u);\n unpacked[114] = extractBits(val_21, 12u, 6u);\n unpacked[115] = extractBits(val_21, 18u, 6u);\n unpacked[116] = extractBits(val_21, 24u, 6u);\n unpacked[117] = extractBits(val_21, 30u, 2u);\n\n let val_22 = blocks[packed_offset + 22];\n unpacked[117] = insertBits(unpacked[117], extractBits(val_22, 0u, 4u), 2u, 4u);\n unpacked[118] = extractBits(val_22, 4u, 6u);\n unpacked[119] = extractBits(val_22, 10u, 6u);\n unpacked[120] = extractBits(val_22, 16u, 6u);\n unpacked[121] = extractBits(val_22, 22u, 6u);\n unpacked[122] = extractBits(val_22, 28u, 4u);\n\n let val_23 = blocks[packed_offset + 23];\n unpacked[122] = insertBits(unpacked[122], extractBits(val_23, 0u, 2u), 4u, 2u);\n unpacked[123] = extractBits(val_23, 2u, 6u);\n unpacked[124] = extractBits(val_23, 8u, 6u);\n unpacked[125] = extractBits(val_23, 14u, 6u);\n unpacked[126] = extractBits(val_23, 20u, 6u);\n unpacked[127] = extractBits(val_23, 26u, 6u);\n}\n";var unpackBlock128BitDepth7="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_7(packed_offset: u32) {\n let val_0 = blocks[packed_offset];\n unpacked[0] = extractBits(val_0, 0u, 7u);\n unpacked[1] = extractBits(val_0, 7u, 7u);\n unpacked[2] = extractBits(val_0, 14u, 7u);\n unpacked[3] = extractBits(val_0, 21u, 7u);\n unpacked[4] = extractBits(val_0, 28u, 4u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[4] = insertBits(unpacked[4], extractBits(val_1, 0u, 3u), 4u, 3u);\n unpacked[5] = extractBits(val_1, 3u, 7u);\n unpacked[6] = extractBits(val_1, 10u, 7u);\n unpacked[7] = extractBits(val_1, 17u, 7u);\n unpacked[8] = extractBits(val_1, 24u, 7u);\n unpacked[9] = extractBits(val_1, 31u, 1u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[9] = insertBits(unpacked[9], extractBits(val_2, 0u, 6u), 1u, 6u);\n unpacked[10] = extractBits(val_2, 6u, 7u);\n unpacked[11] = extractBits(val_2, 13u, 7u);\n unpacked[12] = extractBits(val_2, 20u, 7u);\n unpacked[13] = extractBits(val_2, 27u, 5u);\n \n let val_3 = blocks[packed_offset + 3];\n unpacked[13] = insertBits(unpacked[13], extractBits(val_3, 0u, 2u), 5u, 2u);\n unpacked[14] = extractBits(val_3, 2u, 7u);\n unpacked[15] = extractBits(val_3, 9u, 7u);\n unpacked[16] = extractBits(val_3, 16u, 7u);\n unpacked[17] = extractBits(val_3, 23u, 7u);\n unpacked[18] = extractBits(val_3, 30u, 2u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[18] = insertBits(unpacked[18], extractBits(val_4, 0u, 5u), 2u, 5u);\n unpacked[19] = extractBits(val_4, 5u, 7u);\n unpacked[20] = extractBits(val_4, 12u, 7u);\n unpacked[21] = extractBits(val_4, 19u, 7u);\n unpacked[22] = extractBits(val_4, 26u, 6u);\n \n let val_5 = blocks[packed_offset + 5];\n unpacked[22] = insertBits(unpacked[22], extractBits(val_5, 0u, 1u), 6u, 1u);\n unpacked[23] = extractBits(val_5, 1u, 7u);\n unpacked[24] = extractBits(val_5, 8u, 7u);\n unpacked[25] = extractBits(val_5, 15u, 7u);\n unpacked[26] = extractBits(val_5, 22u, 7u);\n unpacked[27] = extractBits(val_5, 29u, 3u);\n \n let val_6 = blocks[packed_offset + 6];\n unpacked[27] = insertBits(unpacked[27], extractBits(val_6, 0u, 4u), 3u, 4u);\n unpacked[28] = extractBits(val_6, 4u, 7u);\n unpacked[29] = extractBits(val_6, 11u, 7u);\n unpacked[30] = extractBits(val_6, 18u, 7u);\n unpacked[31] = extractBits(val_6, 25u, 7u);\n \n let val_7 = blocks[packed_offset + 7];\n unpacked[32] = extractBits(val_7, 0u, 7u);\n unpacked[33] = extractBits(val_7, 7u, 7u);\n unpacked[34] = extractBits(val_7, 14u, 7u);\n unpacked[35] = extractBits(val_7, 21u, 7u);\n unpacked[36] = extractBits(val_7, 28u, 4u);\n \n let val_8 = blocks[packed_offset + 8];\n unpacked[36] = insertBits(unpacked[36], extractBits(val_8, 0u, 3u), 4u, 3u);\n unpacked[37] = extractBits(val_8, 3u, 7u);\n unpacked[38] = extractBits(val_8, 10u, 7u);\n unpacked[39] = extractBits(val_8, 17u, 7u);\n unpacked[40] = extractBits(val_8, 24u, 7u);\n unpacked[41] = extractBits(val_8, 31u, 1u);\n \n let val_9 = blocks[packed_offset + 9];\n unpacked[41] = insertBits(unpacked[41], extractBits(val_9, 0u, 6u), 1u, 6u);\n unpacked[42] = extractBits(val_9, 6u, 7u);\n unpacked[43] = extractBits(val_9, 13u, 7u);\n unpacked[44] = extractBits(val_9, 20u, 7u);\n unpacked[45] = extractBits(val_9, 27u, 5u);\n \n let val_10 = blocks[packed_offset + 10];\n unpacked[45] = insertBits(unpacked[45], extractBits(val_10, 0u, 2u), 5u, 2u);\n unpacked[46] = extractBits(val_10, 2u, 7u);\n unpacked[47] = extractBits(val_10, 9u, 7u);\n unpacked[48] = extractBits(val_10, 16u, 7u);\n unpacked[49] = extractBits(val_10, 23u, 7u);\n unpacked[50] = extractBits(val_10, 30u, 2u);\n \n let val_11 = blocks[packed_offset + 11];\n unpacked[50] = insertBits(unpacked[50], extractBits(val_11, 0u, 5u), 2u, 5u);\n unpacked[51] = extractBits(val_11, 5u, 7u);\n unpacked[52] = extractBits(val_11, 12u, 7u);\n unpacked[53] = extractBits(val_11, 19u, 7u);\n unpacked[54] = extractBits(val_11, 26u, 6u);\n \n let val_12 = blocks[packed_offset + 12];\n unpacked[54] = insertBits(unpacked[54], extractBits(val_12, 0u, 1u), 6u, 1u);\n unpacked[55] = extractBits(val_12, 1u, 7u);\n unpacked[56] = extractBits(val_12, 8u, 7u);\n unpacked[57] = extractBits(val_12, 15u, 7u);\n unpacked[58] = extractBits(val_12, 22u, 7u);\n unpacked[59] = extractBits(val_12, 29u, 3u);\n \n let val_13 = blocks[packed_offset + 13];\n unpacked[59] = insertBits(unpacked[59], extractBits(val_13, 0u, 4u), 3u, 4u);\n unpacked[60] = extractBits(val_13, 4u, 7u);\n unpacked[61] = extractBits(val_13, 11u, 7u);\n unpacked[62] = extractBits(val_13, 18u, 7u);\n unpacked[63] = extractBits(val_13, 25u, 7u);\n \n let val_14 = blocks[packed_offset + 14];\n unpacked[64] = extractBits(val_14, 0u, 7u);\n unpacked[65] = extractBits(val_14, 7u, 7u);\n unpacked[66] = extractBits(val_14, 14u, 7u);\n unpacked[67] = extractBits(val_14, 21u, 7u);\n unpacked[68] = extractBits(val_14, 28u, 4u);\n \n let val_15 = blocks[packed_offset + 15];\n unpacked[68] = insertBits(unpacked[68], extractBits(val_15, 0u, 3u), 4u, 3u);\n unpacked[69] = extractBits(val_15, 3u, 7u);\n unpacked[70] = extractBits(val_15, 10u, 7u);\n unpacked[71] = extractBits(val_15, 17u, 7u);\n unpacked[72] = extractBits(val_15, 24u, 7u);\n unpacked[73] = extractBits(val_15, 31u, 1u);\n \n let val_16 = blocks[packed_offset + 16];\n unpacked[73] = insertBits(unpacked[73], extractBits(val_16, 0u, 6u), 1u, 6u);\n unpacked[74] = extractBits(val_16, 6u, 7u);\n unpacked[75] = extractBits(val_16, 13u, 7u);\n unpacked[76] = extractBits(val_16, 20u, 7u);\n unpacked[77] = extractBits(val_16, 27u, 5u);\n \n let val_17 = blocks[packed_offset + 17];\n unpacked[77] = insertBits(unpacked[77], extractBits(val_17, 0u, 2u), 5u, 2u);\n unpacked[78] = extractBits(val_17, 2u, 7u);\n unpacked[79] = extractBits(val_17, 9u, 7u);\n unpacked[80] = extractBits(val_17, 16u, 7u);\n unpacked[81] = extractBits(val_17, 23u, 7u);\n unpacked[82] = extractBits(val_17, 30u, 2u);\n \n let val_18 = blocks[packed_offset + 18];\n unpacked[82] = insertBits(unpacked[82], extractBits(val_18, 0u, 5u), 2u, 5u);\n unpacked[83] = extractBits(val_18, 5u, 7u);\n unpacked[84] = extractBits(val_18, 12u, 7u);\n unpacked[85] = extractBits(val_18, 19u, 7u);\n unpacked[86] = extractBits(val_18, 26u, 6u);\n \n let val_19 = blocks[packed_offset + 19];\n unpacked[86] = insertBits(unpacked[86], extractBits(val_19, 0u, 1u), 6u, 1u);\n unpacked[87] = extractBits(val_19, 1u, 7u);\n unpacked[88] = extractBits(val_19, 8u, 7u);\n unpacked[89] = extractBits(val_19, 15u, 7u);\n unpacked[90] = extractBits(val_19, 22u, 7u);\n unpacked[91] = extractBits(val_19, 29u, 3u);\n \n let val_20 = blocks[packed_offset + 20];\n unpacked[91] = insertBits(unpacked[91], extractBits(val_20, 0u, 4u), 3u, 4u);\n unpacked[92] = extractBits(val_20, 4u, 7u);\n unpacked[93] = extractBits(val_20, 11u, 7u);\n unpacked[94] = extractBits(val_20, 18u, 7u);\n unpacked[95] = extractBits(val_20, 25u, 7u);\n \n let val_21 = blocks[packed_offset + 21];\n unpacked[96] = extractBits(val_21, 0u, 7u);\n unpacked[97] = extractBits(val_21, 7u, 7u);\n unpacked[98] = extractBits(val_21, 14u, 7u);\n unpacked[99] = extractBits(val_21, 21u, 7u);\n unpacked[100] = extractBits(val_21, 28u, 4u);\n \n let val_22 = blocks[packed_offset + 22];\n unpacked[100] = insertBits(unpacked[100], extractBits(val_22, 0u, 3u), 4u, 3u);\n unpacked[101] = extractBits(val_22, 3u, 7u);\n unpacked[102] = extractBits(val_22, 10u, 7u);\n unpacked[103] = extractBits(val_22, 17u, 7u);\n unpacked[104] = extractBits(val_22, 24u, 7u);\n unpacked[105] = extractBits(val_22, 31u, 1u);\n \n let val_23 = blocks[packed_offset + 23];\n unpacked[105] = insertBits(unpacked[105], extractBits(val_23, 0u, 6u), 1u, 6u);\n unpacked[106] = extractBits(val_23, 6u, 7u);\n unpacked[107] = extractBits(val_23, 13u, 7u);\n unpacked[108] = extractBits(val_23, 20u, 7u);\n unpacked[109] = extractBits(val_23, 27u, 5u);\n \n let val_24 = blocks[packed_offset + 24];\n unpacked[109] = insertBits(unpacked[109], extractBits(val_24, 0u, 2u), 5u, 2u);\n unpacked[110] = extractBits(val_24, 2u, 7u);\n unpacked[111] = extractBits(val_24, 9u, 7u);\n unpacked[112] = extractBits(val_24, 16u, 7u);\n unpacked[113] = extractBits(val_24, 23u, 7u);\n unpacked[114] = extractBits(val_24, 30u, 2u);\n \n let val_25 = blocks[packed_offset + 25];\n unpacked[114] = insertBits(unpacked[114], extractBits(val_25, 0u, 5u), 2u, 5u);\n unpacked[115] = extractBits(val_25, 5u, 7u);\n unpacked[116] = extractBits(val_25, 12u, 7u);\n unpacked[117] = extractBits(val_25, 19u, 7u);\n unpacked[118] = extractBits(val_25, 26u, 6u);\n \n let val_26 = blocks[packed_offset + 26];\n unpacked[118] = insertBits(unpacked[118], extractBits(val_26, 0u, 1u), 6u, 1u);\n unpacked[119] = extractBits(val_26, 1u, 7u);\n unpacked[120] = extractBits(val_26, 8u, 7u);\n unpacked[121] = extractBits(val_26, 15u, 7u);\n unpacked[122] = extractBits(val_26, 22u, 7u);\n unpacked[123] = extractBits(val_26, 29u, 3u);\n \n let val_27 = blocks[packed_offset + 27];\n unpacked[123] = insertBits(unpacked[123], extractBits(val_27, 0u, 4u), 3u, 4u);\n unpacked[124] = extractBits(val_27, 4u, 7u);\n unpacked[125] = extractBits(val_27, 11u, 7u);\n unpacked[126] = extractBits(val_27, 18u, 7u);\n unpacked[127] = extractBits(val_27, 25u, 7u); \n}\n";var fromFP510Function="\n\nconst exponents: array = array(\n 2.9103830456733704e-11, \n 5.820766091346741e-11, \n 1.1641532182693481e-10, \n 2.3283064365386963e-10,\n 4.656612873077393e-10, \n 9.313225746154785e-10, \n 1.862645149230957e-09, \n 3.725290298461914e-09,\n 7.450580596923828e-09, \n 1.4901161193847656e-08, \n 2.9802322387695312e-08, \n 5.960464477539063e-08,\n 1.1920928955078125e-07, \n 2.384185791015625e-07, \n 4.76837158203125e-07, \n 9.5367431640625e-07,\n 1.9073486328125e-06, \n 3.814697265625e-06, \n 7.62939453125e-06, \n 1.52587890625e-05, \n 3.0517578125e-05,\n 6.103515625e-05, \n 0.0001220703125, \n 0.000244140625, \n 0.00048828125, \n 0.0009765625, \n 0.001953125, \n 0.00390625,\n 0.0078125, \n 0.015625, \n 0.03125, \n 0.0625);\n\nfn from_fp510(x: u32) -> f32 {\n let exponent = f32(exponents[extractBits(x, 10u, 5u)]); \n let fractional = f32(extractBits(x, 0u, 10u)); \n let abs = exponent * fractional;\n return abs * (1.0 - (2.0 * f32(extractBits(x, 15u, 1u))));\n}\n";var preprocessBlocks3BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth3,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n \n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 12u); \n unpack_block_128_bit_depth_3(blocks_start); \n \n let b01: u32 = blocks_start;\n let b2: u32 = blocks_start + 8u;\n \n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b01_idx = b01 + (r / 2u);\n let b2_idx = b2 + (r / 4u);\n\n blocks[b01_idx] = insertBits(blocks[b01_idx], extractBits(unpacked[unpacked_idx], 0u, 2u), (r * 16u) % 32u, 16u);\n blocks[b2_idx] = insertBits(blocks[b2_idx], extractBits(unpacked[unpacked_idx], 2u, 1u), (r * 8u) % 32u, 8u); \n }\n \n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b01_idx = b01 + (r / 2u);\n let b2_idx = b2 + (r / 4u);\n \n blocks[b01_idx] = insertBits(blocks[b01_idx], extractBits(unpacked[unpacked_idx], 0u, 2u), ((r * 16u) % 32u) + (2u * c), 2u);\n blocks[b2_idx] = insertBits(blocks[b2_idx], extractBits(unpacked[unpacked_idx], 2u, 1u), ((r * 8u) % 32u) + c, 1u); \n }\n }\n}\n\n").concat(emptyShader);var preprocessBlocks5BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth5,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n\n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 20u);\n unpack_block_128_bit_depth_5(blocks_start); \n \n let b03: u32 = blocks_start;\n let b4: u32 = blocks_start + 16u;\n\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b03_idx = b03 + r;\n let b4_idx = b4 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 0u, 32u);\n blocks[b4_idx] = insertBits(blocks[b4_idx], extractBits(unpacked[unpacked_idx], 4u, 1u), (r * 8u) % 32u, 8u);\n }\n \n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b03_idx = b03 + r;\n let b4_idx = b4 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 4 * c, 4u);\n blocks[b4_idx] = insertBits(blocks[b4_idx], extractBits(unpacked[unpacked_idx], 4u, 1u), ((r * 8u) % 32u) + c, 1u);\n }\n } \n}\n\n").concat(emptyShader);var preprocessBlocks6BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth6,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n \n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 24u);\n unpack_block_128_bit_depth_6(blocks_start);\n \n let b03: u32 = blocks_start;\n let b45: u32 = blocks_start + 16u; \n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 0u, 32u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u), 16u);\n }\n\n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 4 * c, 4u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u) + (2 * c), 2u);\n }\n }\n}\n\n").concat(emptyShader);var preprocessBlocks7BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth7,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n \n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 28u);\n unpack_block_128_bit_depth_7(blocks_start);\n \n let b03: u32 = blocks_start;\n let b45: u32 = blocks_start + 16u;\n let b6: u32 = blocks_start + 24u; \n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n let b6_idx = b6 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 0, 32u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u), 16u);\n blocks[b6_idx] = insertBits(blocks[b6_idx], extractBits(unpacked[unpacked_idx], 6u, 1u), ((r * 8u) % 32u), 8u);\n }\n \n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n let b6_idx = b6 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 4 * c, 4u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u) + (2 * c), 2u);\n blocks[b6_idx] = insertBits(blocks[b6_idx], extractBits(unpacked[unpacked_idx], 6u, 1u), ((r * 8u) % 32u) + c, 1u);\n }\n }\n}\n\n").concat(emptyShader);var preprocessShaderSources={3:preprocessBlocks3BitShaderSource,5:preprocessBlocks5BitShaderSource,6:preprocessBlocks6BitShaderSource,7:preprocessBlocks7BitShaderSource};var preprocessShaderNames={3:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_3bit_shader",5:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_5bit_shader",6:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_6bit_shader",7:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_7bit_shader"};var BM=8;var BN=32;var TM=2;var TN=16;var TC=rowsPerBlock*BM*BN/(TM*TN);var constantSnippet="\nconst BM = ".concat(BM,"u;\nconst BN = ").concat(BN,"u;\n\nconst TM = ").concat(TM,"u;\nconst TN = ").concat(TN,"u;\n\nconst TC = ").concat(TC,"u;\n\nconst ROW_PER_BLOCK = ").concat(rowsPerBlock,"u;\nconst COL_PER_BLOCK = ").concat(columnsPerBlock,"u;\n\nconst VEC_COL_PER_BLOCK = COL_PER_BLOCK / 4u;\n\nconst block_size: u32 = (COL_PER_BLOCK * ROW_PER_BLOCK * bit_depth) / 32u;\n\n");var forwardMultipleInputArgsSnippet="\nstruct argsStruct {\n n: u32,\n m: u32,\n total_nbc: u32,\n k: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array;\n";var forwardMultipleSharedPrivateMemSnippet="\nvar shared_x: array, BN * VEC_COL_PER_BLOCK>;\nvar shared_ab: array;\nvar shared_w: array, BM * ROW_PER_BLOCK * VEC_COL_PER_BLOCK>;\n\nvar local_x: array, TN * VEC_COL_PER_BLOCK>;\nvar local_x_sums: array;\nvar local_results: array;\n";var forwardMultipleLocalVarSnippet="\n let tid = local_id.x;\n let bm_idx = workgroup_id.x;\n let bn_idx = workgroup_id.y;\n\n let local_bm_idx = bm_idx * BM;\n let local_bn_idx = bn_idx * BN;\n \n let n_idx = tid % (BN / TN);\n let k_idx = tid / (BN / TN) / (BM * ROW_PER_BLOCK / TM);\n let m_idx = tid / (BN / TN) % (BM * ROW_PER_BLOCK / TM);\n";var forwardMultipleLoadW1Bit="\n let b0 = blocks[src + (row / 4u)];\n\n let b0_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b0_offset = b0_offset_base + (c * 4u); \n shared_w[dst + c] = vec4(\n f32(extractBits(b0, b0_offset, 1u)), \n f32(extractBits(b0, b0_offset + 1, 1u)),\n f32(extractBits(b0, b0_offset + 2, 1u)),\n f32(extractBits(b0, b0_offset + 3, 1u)));\n }\n";var forwardMultipleLoadW2Bit="\n let b01 = blocks[src + (row / 2u)];\n \n let b01_offset_base = (row * 16u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) { \n let b01_offset = b01_offset_base + (c * 8u);\n shared_w[dst + c] = vec4(\n f32(extractBits(b01, b01_offset, 2u)), \n f32(extractBits(b01, b01_offset + 2, 2u)),\n f32(extractBits(b01, b01_offset + 4, 2u)),\n f32(extractBits(b01, b01_offset + 6, 2u)));\n } \n";var forwardMultipleLoadW3Bit="\n let b01 = blocks[src + (row / 2u)];\n let b2 = blocks[src + 8u + (row / 4u)]; \n\n let b01_offset_base = (row * 16u) % 32u;\n let b2_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b01_offset = b01_offset_base + (c * 8u);\n let b2_offset = b2_offset_base + (c * 4u);\n\n shared_w[dst + c] = vec4(\n f32(insertBits(extractBits(b01, b01_offset, 2u), extractBits(b2, b2_offset, 1u), 2u, 1u)), \n f32(insertBits(extractBits(b01, b01_offset + 2, 2u), extractBits(b2, b2_offset + 1, 1u), 2u, 1u)),\n f32(insertBits(extractBits(b01, b01_offset + 4, 2u), extractBits(b2, b2_offset + 2, 1u), 2u, 1u)),\n f32(insertBits(extractBits(b01, b01_offset + 6, 2u), extractBits(b2, b2_offset + 3, 1u), 2u, 1u))); \n }\n";var forwardMultipleLoadW4Bit="\n let b03 = blocks[src + row];\n \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b03_offset = (c * 16u); \n shared_w[dst + c] = vec4(\n f32(extractBits(b03, b03_offset, 4u)), \n f32(extractBits(b03, b03_offset + 4, 4u)),\n f32(extractBits(b03, b03_offset + 8, 4u)),\n f32(extractBits(b03, b03_offset + 12, 4u)));\n }\n";var forwardMultipleLoadW5Bit="\n let b03 = blocks[src + row];\n let b4 = blocks[src + 16u + (row / 4u)];\n \n let b4_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b03_offset = (c * 16u);\n let b4_offset = b4_offset_base + (c * 4u);\n shared_w[dst + c] = vec4(\n f32(insertBits(extractBits(b03, b03_offset, 4u), extractBits(b4, b4_offset, 1u), 4u, 1u)), \n f32(insertBits(extractBits(b03, b03_offset + 4, 4u), extractBits(b4, b4_offset + 1, 1u), 4u, 1u)),\n f32(insertBits(extractBits(b03, b03_offset + 8, 4u), extractBits(b4, b4_offset + 2, 1u), 4u, 1u)),\n f32(insertBits(extractBits(b03, b03_offset + 12, 4u), extractBits(b4, b4_offset + 3, 1u), 4u, 1u)));\n }\n";var forwardMultipleLoadW6Bit="\n let b03 = blocks[src + row];\n let b45 = blocks[src + 16u + (row / 2u)];\n \n let b45_offset_base = (row * 16u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) { \n let b03_offset = (c * 16u);\n let b45_offset = b45_offset_base + (c * 8u);\n shared_w[dst + c] = vec4(\n f32(insertBits(extractBits(b03, b03_offset, 4u), extractBits(b45, b45_offset, 2u), 4u, 2u)), \n f32(insertBits(extractBits(b03, b03_offset + 4, 4u), extractBits(b45, b45_offset + 2, 2u), 4u, 2u)),\n f32(insertBits(extractBits(b03, b03_offset + 8, 4u), extractBits(b45, b45_offset + 4, 2u), 4u, 2u)),\n f32(insertBits(extractBits(b03, b03_offset + 12, 4u), extractBits(b45, b45_offset + 6, 2u), 4u, 2u)));\n }\n";var forwardMultipleLoadW7Bit="\n let b03 = blocks[src + row];\n let b45 = blocks[src + 16u + (row / 2u)];\n let b6 = blocks[src + 24u + (row / 4u)];\n \n let b45_offset_base = (row * 16u) % 32u;\n let b6_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b03_offset = (c * 16u);\n let b45_offset = b45_offset_base + (c * 8u);\n let b6_offset = b6_offset_base + (c * 4u);\n \n shared_w[dst + c] = vec4(\n f32(insertBits(insertBits(extractBits(b03, b03_offset, 4u), extractBits(b45, b45_offset, 2u), 4u, 2u), extractBits(b6, b6_offset, 1u), 6u, 1u)), \n f32(insertBits(insertBits(extractBits(b03, b03_offset + 4, 4u), extractBits(b45, b45_offset + 2, 2u), 4u, 2u), extractBits(b6, b6_offset + 1, 1u), 6u, 1u)),\n f32(insertBits(insertBits(extractBits(b03, b03_offset + 8, 4u), extractBits(b45, b45_offset + 4, 2u), 4u, 2u), extractBits(b6, b6_offset + 2, 1u), 6u, 1u)),\n f32(insertBits(insertBits(extractBits(b03, b03_offset + 12, 4u), extractBits(b45, b45_offset + 6, 2u), 4u, 2u), extractBits(b6, b6_offset + 3, 1u), 6u, 1u)));\n }\n";var forwardMultipleLoadW8Bit="\n let b07_offset = src + (row * 2);\n \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b07 = blocks[b07_offset + c];\n shared_w[dst + c] = vec4(\n f32(extractBits(b07, 0u, 8u)), \n f32(extractBits(b07, 8u, 8u)),\n f32(extractBits(b07, 16u, 8u)),\n f32(extractBits(b07, 24u, 8u)));\n }\n";var forwardLoadWBitDepthSnippets={1:forwardMultipleLoadW1Bit,2:forwardMultipleLoadW2Bit,3:forwardMultipleLoadW3Bit,4:forwardMultipleLoadW4Bit,5:forwardMultipleLoadW5Bit,6:forwardMultipleLoadW6Bit,7:forwardMultipleLoadW7Bit,8:forwardMultipleLoadW8Bit};var forwardMultipleLoadXSnippet="\n let total_work_x = VEC_COL_PER_BLOCK * BN;\n for (var local_idx = 0u; local_idx < divide_pad(total_work_x, TC); local_idx++) {\n let idx = local_idx * TC + tid;\n if (idx < total_work_x) { \n let n_load_idx = local_bn_idx + idx / VEC_COL_PER_BLOCK;\n let inner_idx = idx % VEC_COL_PER_BLOCK;\n \n if (bk_idx < args.k && n_load_idx < args.n) { \n let x_idx = (args.x_offset / 4u) + ((bk_idx * args.n + n_load_idx) * VEC_COL_PER_BLOCK + inner_idx); \n shared_x[idx] = x[x_idx];\n } else {\n shared_x[idx] = vec4(0.0);\n }\n }\n }\n";var forwardMultipleLoadABSnippet="\n let total_work_ab = BM * 2;\n for (var local_idx = 0u; local_idx < divide_pad(total_work_ab, TC); local_idx++) {\n let idx = local_idx * TC + tid;\n if (idx < total_work_ab) {\n let m_load_idx = local_bm_idx + idx / 2; \n let inner_idx = (idx % 2) * 16u;\n \n if (m_load_idx < args.m && bk_idx < args.k) {\n let ab_bits = extractBits(metas[args.metas_offset + (m_load_idx * args.k + bk_idx)], inner_idx, 16u);\n shared_ab[idx] = from_fp510(ab_bits); \n } else {\n shared_ab[idx] = 0.0;\n }\n }\n }\n";var forwardMultipleLoadWSnippet=function forwardMultipleLoadWSnippet(bitDepth){return"\n let total_work_w = BM * ROW_PER_BLOCK;\n for (var local_idx = 0u; local_idx < divide_pad(total_work_w, TC); local_idx++) {\n let idx = local_idx * TC + tid;\n if (idx < total_work_w) {\n let m_load_idx = local_bm_idx + idx / ROW_PER_BLOCK;\n let row = idx % ROW_PER_BLOCK;\n let dst = idx * VEC_COL_PER_BLOCK;\n\n if (m_load_idx < args.m) {\n let src = args.blocks_offset + (m_load_idx * args.k + bk_idx) * block_size;\n ".concat(forwardLoadWBitDepthSnippets[bitDepth],"\n } else { \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n shared_w[dst + c] = vec4(0.0);\n }\n }\n }\n }\n")};var forwardMultipleCopyXSnippet="\nfor (var tn_idx = 0u; tn_idx < TN; tn_idx++) { \n var x_sum_vec = vec4(0.0); \n let local_x_idx = tn_idx * VEC_COL_PER_BLOCK;\n let shared_x_idx = (n_idx * TN + tn_idx) * VEC_COL_PER_BLOCK + (k_idx * VEC_COL_PER_BLOCK);\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n local_x[local_x_idx + c] = shared_x[shared_x_idx + c];\n x_sum_vec += local_x[local_x_idx + c];\n }\n local_x_sums[tn_idx] = x_sum_vec.x + x_sum_vec.y + x_sum_vec.z + x_sum_vec.w; \n}\n";var forwardMultipleComputeResultsSnippet="\n for (var tm_idx = 0u; tm_idx < TM; tm_idx++) { \n let shared_ab_idx = ((m_idx * TM + tm_idx) / ROW_PER_BLOCK + k_idx) * 2;\n let alpha = shared_ab[shared_ab_idx];\n let beta = shared_ab[shared_ab_idx + 1]; \n let shared_w_idx = ((m_idx * TM + tm_idx) + k_idx) * VEC_COL_PER_BLOCK;\n \n for (var tn_idx = 0u; tn_idx < TN; tn_idx++) { \n let local_x_idx = tn_idx * VEC_COL_PER_BLOCK;\n \n var swx_vec = vec4(0.0); \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) { \n swx_vec += shared_w[shared_w_idx + c] * local_x[local_x_idx + c];\n }\n let swx = swx_vec.x + swx_vec.y + swx_vec.z + swx_vec.w;\n \n let kappa = alpha * local_x_sums[tn_idx]; \n let results_idx = tm_idx * TN + tn_idx;\n local_results[results_idx] += kappa + (beta * swx);\n }\n }\n";var forwardMultipleWriteResultsSnippet="\nfor (var tm_idx = 0u; tm_idx < TM; tm_idx++) {\n let row = local_bm_idx * ROW_PER_BLOCK + (m_idx * TM + tm_idx); \n for (var tn_idx = 0u; tn_idx < TN; tn_idx++) { \n let col = local_bn_idx + (n_idx * TN + tn_idx);\n if (row < args.m * ROW_PER_BLOCK && col < args.n) {\n let y_idx = args.y_offset + ((row / ROW_PER_BLOCK) * args.n + col) * ROW_PER_BLOCK + (row % ROW_PER_BLOCK);\n let results_idx = tm_idx * TN + tn_idx;\n \n y[y_idx] += local_results[results_idx];\n }\n }\n}\n";var forwardMultipleShaderSources=function forwardMultipleShaderSources(bitDepth){return"\n\n".concat(forwardMultipleInputArgsSnippet,"\n\n").concat(constantSnippet,"\n\n").concat(forwardMultipleSharedPrivateMemSnippet,"\n\n").concat(fromFP510Function,"\n\n").concat(dividePadFunction,"\n\nconst bit_depth: u32 = ").concat(bitDepth,"u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n \n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3\n) {\n ").concat(forwardMultipleLocalVarSnippet,"\n \n for (var bk_idx = 0u; bk_idx < args.k; bk_idx++) { \n ").concat(forwardMultipleLoadXSnippet,"\n ").concat(forwardMultipleLoadABSnippet," \n ").concat(forwardMultipleLoadWSnippet(bitDepth)," \n workgroupBarrier();\n \n ").concat(forwardMultipleCopyXSnippet,"\n ").concat(forwardMultipleComputeResultsSnippet,"\n workgroupBarrier();\n }\n \n ").concat(forwardMultipleWriteResultsSnippet,"\n}\n\n").concat(emptyShader,"\n")};var forwardShuffleXShaderSource="\nstruct argsStruct {\n n: u32,\n shape1: u32,\n x_offset: u32,\n indices_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar indices: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n || global_id.y >= args.shape1) {\n return;\n } \n\n let b = global_id.x;\n let i = global_id.y;\n \n let c = i / 8u;\n let j = i % 8u;\n y[((c * args.n) + b) * 8 + j] = x[args.x_offset + (b * args.shape1) + indices[args.indices_offset + i]];\n}\n\n".concat(emptyShader,"\n");var forwardSingleReduceYShaderSource="\nstruct argsStruct {\n nvr: u32,\n nbc: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar y: array>;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) { \n if (global_id.x > args.nvr) {\n return;\n }\n\n let x_start = global_id.x * args.nbc;\n var sum: vec4 = vec4(0.0, 0.0, 0.0, 0.0);\n for (var i = 0u; i < args.nbc; i++) {\n sum += x[x_start + i]; \n }\n y[global_id.x] += sum;\n}\n\n".concat(emptyShader);var forwardShuffleYShaderSource="\nstruct argsStruct {\n n: u32,\n shape0: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n || global_id.y >= args.shape0) {\n return;\n } \n \n let b = global_id.x;\n let i = global_id.y;\n \n let r = i / 16u;\n let j = i % 16u;\n y[(b * args.shape0) + (r * 16) + j] = x[(((r * args.n) + b) * 16) + j];\n}\n\n".concat(emptyShader);var addBiasShaderSource="\nstruct argsStruct {\n dimension: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar bias: array;\n\n@group(0) @binding(2)\nvar y: array;\n\n".concat(fromFP510Function,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) { \n y[(global_id.x * args.dimension) + global_id.y] += bias[global_id.y];\n}\n\n").concat(emptyShader);var forwardSingleBitDepth1ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 4u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n\n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b0_start = row_blocks_start + br_offset + (bc * block_size);\n var b0_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b0 = blocks[b0_start];\n \n let w0_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w0_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w0_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w0_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 8u;\n \n let w1_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w1_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w1_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w1_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 16u;\n \n let w2_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w2_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w2_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w2_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 24u;\n \n let w3_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w3_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w3_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w3_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w; \n }\n \n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth2ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 8u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n\n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b01_start = row_blocks_start + (br_offset * 2u) + (bc * block_size);\n var b01_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b01 = blocks[b01_start];\n \n let w0_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w0_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w0_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w0_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 16u;\n \n let w1_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w1_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w1_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w1_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 0u; \n b01 = blocks[b01_start + 1u];\n \n let w2_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w2_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w2_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w2_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 16u;\n \n let w3_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w3_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w3_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w3_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w; \n }\n \n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth3ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 12u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id : vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n\n let x_start = ((args.x_offset + c) / 4u);\n \n var b01_start = row_blocks_start + (br_offset * 2u) + (bc * block_size);\n var b2_start = row_blocks_start + br_offset + (bc * block_size) + 8u;\n var b01_offset = 0u;\n var b2_offset = 0u;\n\n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) { \n \n var b01 = blocks[b01_start];\n var b2 = blocks[b2_start];\n \n var b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n var b2_bit = extractBits(b2, b2_offset + j, 1u);\n let w0_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w0_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w0_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w0_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 16u;\n b2_offset = 8u;\n \n b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n b2_bit = extractBits(b2, b2_offset + j, 1u); \n let w1_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w1_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w1_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w1_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 0u;\n b2_offset = 16u; \n b01 = blocks[b01_start + 1u];\n \n b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n b2_bit = extractBits(b2, b2_offset + j, 1u); \n let w2_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w2_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w2_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w2_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 16u;\n b2_offset = 24u; \n \n b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n b2_bit = extractBits(b2, b2_offset + j, 1u); \n let w3_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w3_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w3_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w3_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 0u;\n b2_offset = 0u; \n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n \n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth4ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 16u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size); \n\n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n\n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start]; \n \n let w0_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w0_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w0_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w0_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n b03 = blocks[b03_start + 1];\n \n let w1_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w1_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w1_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w1_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n b03 = blocks[b03_start + 2];\n \n let w2_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w2_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w2_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w2_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n b03 = blocks[b03_start + 3];\n \n let w3_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w3_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w3_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w3_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth5ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 20u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size);\n var b4_start = row_blocks_start + br_offset + (bc * block_size) + 16u;\n \n var b4_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start];\n var b4 = blocks[b4_start];\n \n var b03_bits = extractBits(b03, 4u * j, 4u);\n var b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w0_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w0_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w0_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w0_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03 = blocks[b03_start + 1];\n b4_offset = 8u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w1_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w1_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w1_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w1_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03 = blocks[b03_start + 2];\n b4_offset = 16u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w2_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w2_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w2_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w2_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03 = blocks[b03_start + 3];\n b4_offset = 24u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w3_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w3_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w3_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w3_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b4_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth6ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 24u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size);\n var b45_start = row_blocks_start + (br_offset * 2u) + (bc * block_size) + 16u;\n \n var b45_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start];\n var b45 = blocks[b45_start];\n \n var b03_bits = extractBits(b03, 4u * j, 4u);\n var b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w0_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w0_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w0_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w0_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03 = blocks[b03_start + 1];\n b45_offset = 16u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w1_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w1_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w1_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w1_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u)); \n \n b03 = blocks[b03_start + 2];\n b45 = blocks[b45_start + 1];\n b45_offset = 0u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w2_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w2_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w2_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w2_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03 = blocks[b03_start + 3];\n b45_offset = 16u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w3_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w3_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w3_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w3_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b45_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth7ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 28u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size);\n var b45_start = row_blocks_start + (br_offset * 2u) + (bc * block_size) + 16u;\n var b6_start = row_blocks_start + br_offset + (bc * block_size) + 24u;\n \n var b45_offset = 0u;\n var b6_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start];\n var b45 = blocks[b45_start];\n var b6 = blocks[b6_start];\n \n var b03_bits = extractBits(b03, 4u * j, 4u);\n var b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n var b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w0_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w0_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w0_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w0_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03 = blocks[b03_start + 1];\n b45_offset = 16u;\n b6_offset = 8u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w1_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w1_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w1_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w1_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03 = blocks[b03_start + 2];\n b45 = blocks[b45_start + 1];\n b45_offset = 0u;\n b6_offset = 16u;\n\n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w2_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w2_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w2_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w2_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03 = blocks[b03_start + 3];\n b45_offset = 16u;\n b6_offset = 24u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w3_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w3_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w3_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w3_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b45_offset = 0u;\n b6_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth8ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 32u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b07_start = row_blocks_start + (br_offset * 8u) + (bc * block_size); \n\n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n\n for (var j = 0u; j < 2; j++) {\n \n var b07 = blocks[b07_start + j];\n \n let w0_0 = f32(extractBits(b07, 0u, 8u)); \n let w0_1 = f32(extractBits(b07, 8u, 8u)); \n let w0_2 = f32(extractBits(b07, 16u, 8u));\n let w0_3 = f32(extractBits(b07, 24u, 8u));\n \n b07 = blocks[b07_start + 2 + j];\n \n let w1_0 = f32(extractBits(b07, 0u, 8u)); \n let w1_1 = f32(extractBits(b07, 8u, 8u)); \n let w1_2 = f32(extractBits(b07, 16u, 8u));\n let w1_3 = f32(extractBits(b07, 24u, 8u));\n \n b07 = blocks[b07_start + 4 + j];\n \n let w2_0 = f32(extractBits(b07, 0u, 8u)); \n let w2_1 = f32(extractBits(b07, 8u, 8u)); \n let w2_2 = f32(extractBits(b07, 16u, 8u));\n let w2_3 = f32(extractBits(b07, 24u, 8u));\n \n b07 = blocks[b07_start + 6 + j];\n \n let w3_0 = f32(extractBits(b07, 0u, 8u)); \n let w3_1 = f32(extractBits(b07, 8u, 8u)); \n let w3_2 = f32(extractBits(b07, 16u, 8u));\n let w3_3 = f32(extractBits(b07, 24u, 8u));\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_vec = x[x_start + j];\n res[j] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleShaderSources={1:forwardSingleBitDepth1ShaderSource,2:forwardSingleBitDepth2ShaderSource,3:forwardSingleBitDepth3ShaderSource,4:forwardSingleBitDepth4ShaderSource,5:forwardSingleBitDepth5ShaderSource,6:forwardSingleBitDepth6ShaderSource,7:forwardSingleBitDepth7ShaderSource,8:forwardSingleBitDepth8ShaderSource};var forwardSingleShaderNames={1:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_1_shader",2:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_2_shader",3:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_3_shader",4:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_4_shader",5:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_5_shader",6:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_6_shader",7:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_7_shader",8:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_8_shader"};var forwardShaderSources={1:forwardMultipleShaderSources(1),2:forwardMultipleShaderSources(2),3:forwardMultipleShaderSources(3),4:forwardMultipleShaderSources(4),5:forwardMultipleShaderSources(5),6:forwardMultipleShaderSources(6),7:forwardMultipleShaderSources(7),8:forwardMultipleShaderSources(8)};var forwardShaderNames={1:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_1_shader",2:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_2_shader",3:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_3_shader",4:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_4_shader",5:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_5_shader",6:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_6_shader",7:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_7_shader",8:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_8_shader"};var forwardShuffleXShaderName="pv_picollm_weight_block_mixed_16x8_forward_shuffle_x_shader";var forwardShuffleYShaderName="pv_picollm_weight_block_mixed_16x8_forward_shuffle_y_shader";var addBiasShaderName="pv_picollm_weight_block_mixed_16x8_add_bias_shader";var forwardSingleReduceYShaderName="pv_picollm_weight_block_mixed_16x8_forward_single_reduce_y_shader";var _weightBlockMixed16x;var loadPreprocessBlocksShader=function loadPreprocessBlocksShader(device,bitDepth){var bindGroupLayout=device.createBindGroupLayout({label:"weight preprocess blocks ".concat(bitDepth," bind group layout"),entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight preprocess blocks ".concat(bitDepth," pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight preprocess blocks ".concat(bitDepth," shader module"),code:preprocessShaderSources[bitDepth]});var computePipeline=device.createComputePipeline({label:"weight preprocess blocks ".concat(bitDepth," pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:preprocessDim,workgroup_size_y:preprocessDim}}});return{computePipeline:computePipeline}};var loadForwardShuffleXShader=function loadForwardShuffleXShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight shuffle x bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight shuffle x pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight shuffle x shader module",code:forwardShuffleXShaderSource});var computePipeline=device.createComputePipeline({label:"weight shuffle x pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_y:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var loadForwardSingleReduceYShader=function loadForwardSingleReduceYShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight single reduce y bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight single reduce y pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight single reduce y shader module",code:forwardSingleReduceYShaderSource});var computePipeline=device.createComputePipeline({label:"weight single reduce y pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var loadForwardShuffleYShader=function loadForwardShuffleYShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight shuffle y bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight shuffle y pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight shuffle y shader module",code:forwardShuffleYShaderSource});var computePipeline=device.createComputePipeline({label:"weight shuffle y pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var loadForwardSingleShader=function loadForwardSingleShader(device,bitDepth){var entries=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}];var bindGroupLayout=device.createBindGroupLayout({label:"weight forward single ".concat(bitDepth," bind group layout"),entries:entries});var pipelineLayout=device.createPipelineLayout({label:"weight forward single ".concat(bitDepth," pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight forward single ".concat(bitDepth," shader module"),code:forwardSingleShaderSources[bitDepth]});var computePipeline=device.createComputePipeline({label:"weight forward single ".concat(bitDepth," pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:weightBlockSize,workgroup_size_y:1}}});return{computePipeline:computePipeline}};var loadForwardShader=function loadForwardShader(device,bitDepth){var entries=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}];var bindGroupLayout=device.createBindGroupLayout({label:"weight forward multi ".concat(bitDepth," bind group layout"),entries:entries});var pipelineLayout=device.createPipelineLayout({label:"weight forward multi ".concat(bitDepth," pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight forward multi ".concat(bitDepth," shader module"),code:forwardShaderSources[bitDepth]});var computePipeline=device.createComputePipeline({label:"weight forward multi ".concat(bitDepth," pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:TC}}});return{computePipeline:computePipeline}};var loadAddBiasShader=function loadAddBiasShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight add bias bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight add bias pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight add bias shader module",code:addBiasShaderSource});var computePipeline=device.createComputePipeline({label:"weight add bias pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var weightBlockMixed16x8Shaders=(_weightBlockMixed16x={},_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_weightBlockMixed16x,preprocessShaderNames[3],function(device){return loadPreprocessBlocksShader(device,3)}),preprocessShaderNames[5],function(device){return loadPreprocessBlocksShader(device,5)}),preprocessShaderNames[6],function(device){return loadPreprocessBlocksShader(device,6)}),preprocessShaderNames[7],function(device){return loadPreprocessBlocksShader(device,7)}),forwardShuffleXShaderName,loadForwardShuffleXShader),forwardShuffleYShaderName,loadForwardShuffleYShader),forwardSingleReduceYShaderName,loadForwardSingleReduceYShader),forwardSingleShaderNames[1],function(device){return loadForwardSingleShader(device,1)}),forwardSingleShaderNames[2],function(device){return loadForwardSingleShader(device,2)}),forwardSingleShaderNames[3],function(device){return loadForwardSingleShader(device,3)}),_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_weightBlockMixed16x,forwardSingleShaderNames[4],function(device){return loadForwardSingleShader(device,4)}),forwardSingleShaderNames[5],function(device){return loadForwardSingleShader(device,5)}),forwardSingleShaderNames[6],function(device){return loadForwardSingleShader(device,6)}),forwardSingleShaderNames[7],function(device){return loadForwardSingleShader(device,7)}),forwardSingleShaderNames[8],function(device){return loadForwardSingleShader(device,8)}),forwardShaderNames[1],function(device){return loadForwardShader(device,1)}),forwardShaderNames[2],function(device){return loadForwardShader(device,2)}),forwardShaderNames[3],function(device){return loadForwardShader(device,3)}),forwardShaderNames[4],function(device){return loadForwardShader(device,4)}),forwardShaderNames[5],function(device){return loadForwardShader(device,5)}),_defineProperty(_defineProperty(_defineProperty(_defineProperty(_weightBlockMixed16x,forwardShaderNames[6],function(device){return loadForwardShader(device,6)}),forwardShaderNames[7],function(device){return loadForwardShader(device,7)}),forwardShaderNames[8],function(device){return loadForwardShader(device,8)}),addBiasShaderName,loadAddBiasShader));function ownKeys$1(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread$1(e){for(var r=1;r=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e1&&_args[1]!==undefined?_args[1]:{};time=_args.length>2&&_args[2]!==undefined?_args[2]:5e3;controller=new AbortController;config=_objectSpread(_objectSpread({},options),{},{signal:controller.signal});timeout=setTimeout(function(){controller.abort()},time);_context.next=7;return fetch(uri,config);case 7:response=_context.sent;clearTimeout(timeout);return _context.abrupt("return",response);case 10:case"end":return _context.stop()}},_callee)}));return _fetchWithTimeout.apply(this,arguments)}function open(_x2,_x3){return _open.apply(this,arguments)}function _open(){_open=_asyncToGenerator(_regeneratorRuntime.mark(function _callee2(path,mode){var error;return _regeneratorRuntime.wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:_context2.prev=0;_context2.next=3;return PvFileIDB.open(path,mode);case 3:return _context2.abrupt("return",_context2.sent);case 6:_context2.prev=6;_context2.t0=_context2["catch"](0);if(_context2.t0.name==="IndexedDBNotSupported"){console.warn("IndexedDB is not supported. Fallback to in-memory storage.")}else if(_context2.t0.name!=="FileNotExists"){console.warn("Unable to access IndexedDB (".concat(_context2.t0.toString(),"). Fallback to in-memory storage."))}if(!(typeof WorkerGlobalScope!=="undefined"&&self instanceof WorkerGlobalScope)){_context2.next=16;break}if(!(_context2.t0.name==="FileNotExists")){_context2.next=12;break}throw _context2.t0;case 12:console.error("In-memory storage cannot be used inside a worker.");error=new Error("Failed to start PvFile: ".concat(_context2.t0.toString()));error.name="PvFileNotSupported";throw error;case 16:return _context2.abrupt("return",PvFileMem.open(path,mode));case 17:case"end":return _context2.stop()}},_callee2,null,[[0,6]])}));return _open.apply(this,arguments)}var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=url=>{if(isFileURI(url)){return new Promise((reject,resolve)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response)}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}return fetch(url,{credentials:"same-origin"}).then(response=>{if(response.ok){return response.arrayBuffer()}return Promise.reject(new Error(response.status+" : "+response.url))})}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];if(ENVIRONMENT_IS_PTHREAD){var wasmPromiseResolve;var wasmPromiseReject;var initializedJS=false;function threadPrintErr(...args){var text=args.join(" ");console.error(text)}if(!Module["printErr"])err=threadPrintErr;function threadAlert(...args){var text=args.join(" ");postMessage({cmd:"alert",text:text,threadId:_pthread_self()})}self.alert=threadAlert;Module["instantiateWasm"]=(info,receiveInstance)=>new Promise((resolve,reject)=>{wasmPromiseResolve=module=>{var instance=new WebAssembly.Instance(module,getWasmImports());receiveInstance(instance);resolve()};wasmPromiseReject=reject});self.onunhandledrejection=e=>{throw e.reason||e};function handleMessage(e){try{var msgData=e["data"];var cmd=msgData["cmd"];if(cmd==="load"){let messageQueue=[];self.onmessage=e=>messageQueue.push(e);self.startWorker=instance=>{postMessage({cmd:"loaded"});for(let msg of messageQueue){handleMessage(msg)}self.onmessage=handleMessage};for(const handler of msgData["handlers"]){if(!Module[handler]||Module[handler].proxy){Module[handler]=(...args)=>{postMessage({cmd:"callHandler",handler:handler,args:args})};if(handler=="print")out=Module[handler];if(handler=="printErr")err=Module[handler]}}wasmMemory=msgData["wasmMemory"];updateMemoryViews();wasmPromiseResolve(msgData["wasmModule"])}else if(cmd==="run"){__emscripten_thread_init(msgData["pthread_ptr"],0,0,1,0,0);__emscripten_thread_mailbox_await(msgData["pthread_ptr"]);establishStackSpace();PThread.receiveObjectTransfer(msgData);PThread.threadInitTLS();if(!initializedJS){initializedJS=true}try{invokeEntryPoint(msgData["start_routine"],msgData["arg"])}catch(ex){if(ex!="unwind"){throw ex}}}else if(cmd==="cancel"){if(_pthread_self()){__emscripten_thread_exit(-1)}}else if(msgData.target==="setimmediate"){}else if(cmd==="checkMailbox"){if(initializedJS){checkMailbox()}}else if(cmd){err(`worker: received unknown command ${cmd}`);err(msgData)}}catch(ex){__emscripten_thread_crashed();throw ex}}self.onmessage=handleMessage}var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}if(!ENVIRONMENT_IS_PTHREAD){if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||67108864;wasmMemory=new WebAssembly.Memory({initial:INITIAL_MEMORY/65536,maximum:4294967296/65536,shared:true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){err("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and/or recent version)")}throw Error("bad memory")}}updateMemoryViews()}var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(ENVIRONMENT_IS_PTHREAD)return;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith("file://");function findWasmBinary(){var f="pv_orca_pthread.wasm";if(!isDataURI(f)){return locateFile(f)}return f}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary){return readAsync(binaryFile).then(response=>new Uint8Array(response),()=>getBinarySync(binaryFile))}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function getWasmImports(){assignWasmImports();return{a:wasmImports}}function createWasm(){var info=getWasmImports();function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=Asyncify.instrumentWasmExports(wasmExports);wasmExports=applySignatureConversions(wasmExports);registerTLSInit(wasmExports["gc"]);wasmTable=wasmExports["Xb"];addOnInit(wasmExports["I"]);wasmModule=module;removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"],result["module"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}if(!wasmBinaryFile)wasmBinaryFile=findWasmBinary();instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var terminateWorker=worker=>{worker.terminate();worker.onmessage=e=>{}};var killThread=pthread_ptr=>{var worker=PThread.pthreads[pthread_ptr];delete PThread.pthreads[pthread_ptr];terminateWorker(worker);__emscripten_thread_free_data(pthread_ptr);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker),1);worker.pthread_ptr=0};var cancelThread=pthread_ptr=>{var worker=PThread.pthreads[pthread_ptr];worker.postMessage({cmd:"cancel"})};var cleanupThread=pthread_ptr=>{var worker=PThread.pthreads[pthread_ptr];PThread.returnWorkerToPool(worker)};var spawnThread=threadParams=>{var worker=PThread.getNewWorker();if(!worker){return 6}PThread.runningWorkers.push(worker);PThread.pthreads[threadParams.pthread_ptr]=worker;worker.pthread_ptr=threadParams.pthread_ptr;var msg={cmd:"run",start_routine:threadParams.startRoutine,arg:threadParams.arg,pthread_ptr:threadParams.pthread_ptr};worker.postMessage(msg,threadParams.transferList);return 0};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var stackSave=()=>_emscripten_stack_get_current();var stackRestore=val=>__emscripten_stack_restore(val);var stackAlloc=sz=>__emscripten_stack_alloc(sz);var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);var proxyToMainThread=(funcIndex,emAsmAddr,sync,...callArgs)=>{var serializedNumCallArgs=callArgs.length*2;var sp=stackSave();var args=stackAlloc(serializedNumCallArgs*8);var b=args>>>3;for(var i=0;i>>0]=arg}}var rtn=__emscripten_run_on_main_thread_js(funcIndex,emAsmAddr,serializedNumCallArgs,args,sync);stackRestore(sp);return rtn};function _proc_exit(code){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(0,0,1,code);EXITSTATUS=code;if(!keepRuntimeAlive()){PThread.terminateAllThreads();Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))}var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};function exitOnMainThread(returnCode){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(1,0,0,returnCode);_exit(returnCode)}var exitJS=(status,implicit)=>{EXITSTATUS=status;if(ENVIRONMENT_IS_PTHREAD){exitOnMainThread(status);throw"unwind"}_proc_exit(status)};var _exit=exitJS;var PThread={unusedWorkers:[],runningWorkers:[],tlsInitFunctions:[],pthreads:{},init(){if(ENVIRONMENT_IS_PTHREAD){PThread.initWorker()}else{PThread.initMainThread()}},initMainThread(){var pthreadPoolSize=navigator.hardwareConcurrency;while(pthreadPoolSize--){PThread.allocateUnusedWorker()}addOnPreRun(()=>{addRunDependency("loading-workers");PThread.loadWasmModuleToAllWorkers(()=>removeRunDependency("loading-workers"))})},initWorker(){noExitRuntime=false},setExitStatus:status=>EXITSTATUS=status,terminateAllThreads__deps:["$terminateWorker"],terminateAllThreads:()=>{for(var worker of PThread.runningWorkers){terminateWorker(worker)}for(var worker of PThread.unusedWorkers){terminateWorker(worker)}PThread.unusedWorkers=[];PThread.runningWorkers=[];PThread.pthreads=[]},returnWorkerToPool:worker=>{var pthread_ptr=worker.pthread_ptr;delete PThread.pthreads[pthread_ptr];PThread.unusedWorkers.push(worker);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker),1);worker.pthread_ptr=0;__emscripten_thread_free_data(pthread_ptr)},receiveObjectTransfer(data){},threadInitTLS(){PThread.tlsInitFunctions.forEach(f=>f())},loadWasmModuleToWorker:worker=>new Promise(onFinishedLoading=>{worker.onmessage=e=>{var d=e["data"];var cmd=d["cmd"];if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var targetWorker=PThread.pthreads[d["targetThread"]];if(targetWorker){targetWorker.postMessage(d,d["transferList"])}else{err(`Internal error! Worker sent a message "${cmd}" to target pthread ${d["targetThread"]}, but that thread no longer exists!`)}return}if(cmd==="checkMailbox"){checkMailbox()}else if(cmd==="spawnThread"){spawnThread(d)}else if(cmd==="cleanupThread"){cleanupThread(d["thread"])}else if(cmd==="killThread"){killThread(d["thread"])}else if(cmd==="cancelThread"){cancelThread(d["thread"])}else if(cmd==="loaded"){worker.loaded=true;onFinishedLoading(worker)}else if(cmd==="alert"){alert(`Thread ${d["threadId"]}: ${d["text"]}`)}else if(d.target==="setimmediate"){worker.postMessage(d)}else if(cmd==="callHandler"){Module[d["handler"]](...d["args"])}else if(cmd){err(`worker sent an unknown command ${cmd}`)}};worker.onerror=e=>{var message="worker sent an error!";err(`${message} ${e.filename}:${e.lineno}: ${e.message}`);throw e};var handlers=[];var knownHandlers=["onExit","onAbort","print","printErr"];for(var handler of knownHandlers){if(Module.propertyIsEnumerable(handler)){handlers.push(handler)}}worker.postMessage({cmd:"load",handlers:handlers,wasmMemory:wasmMemory,wasmModule:wasmModule})}),loadWasmModuleToAllWorkers(onMaybeReady){if(ENVIRONMENT_IS_PTHREAD){return onMaybeReady()}let pthreadPoolReady=Promise.all(PThread.unusedWorkers.map(PThread.loadWasmModuleToWorker));pthreadPoolReady.then(onMaybeReady)},allocateUnusedWorker(){var worker;var workerOptions={type:"module",name:"em-pthread"};var pthreadMainJs=_scriptName;if(Module["mainScriptUrlOrBlob"]){pthreadMainJs=Module["mainScriptUrlOrBlob"];if(typeof pthreadMainJs!="string"){pthreadMainJs=URL.createObjectURL(pthreadMainJs)}}worker=new Worker(pthreadMainJs,workerOptions);PThread.unusedWorkers.push(worker)},getNewWorker(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}return PThread.unusedWorkers.pop()}};var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var establishStackSpace=()=>{var pthread_ptr=_pthread_self();var stackHigh=GROWABLE_HEAP_U32()[pthread_ptr+52>>>2>>>0];var stackSize=GROWABLE_HEAP_U32()[pthread_ptr+56>>>2>>>0];var stackLow=stackHigh-stackSize;_emscripten_stack_set_limits(stackHigh,stackLow);stackRestore(stackHigh)};var invokeEntryPoint=(ptr,arg)=>{runtimeKeepaliveCounter=0;var result=(a1=>dynCall_ii(ptr,a1))(arg);function finish(result){if(keepRuntimeAlive()){PThread.setExitStatus(result)}else{__emscripten_thread_exit(result)}}finish(result)};var noExitRuntime=Module["noExitRuntime"]||true;var registerTLSInit=tlsInitFunc=>PThread.tlsInitFunctions.push(tlsInitFunc);function pthreadCreateProxied(pthread_ptr,attr,startRoutine,arg){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(2,0,1,pthread_ptr,attr,startRoutine,arg);return ___pthread_create_js(pthread_ptr,attr,startRoutine,arg)}function ___pthread_create_js(pthread_ptr,attr,startRoutine,arg){pthread_ptr>>>=0;attr>>>=0;startRoutine>>>=0;arg>>>=0;if(typeof SharedArrayBuffer=="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return pthreadCreateProxied(pthread_ptr,attr,startRoutine,arg)}if(error)return error;var threadParams={startRoutine:startRoutine,pthread_ptr:pthread_ptr,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList);return 0}return spawnThread(threadParams)}function syscallGetVarargI(){var ret=GROWABLE_HEAP_I32()[+SYSCALLS.varargs>>>2>>>0];SYSCALLS.varargs+=4;return ret}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>(view.set(crypto.getRandomValues(new Uint8Array(view.byteLength))),view)}else abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{idx>>>=0;var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.buffer instanceof SharedArrayBuffer?heapOrArray.slice(idx,endPtr):heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{outIdx>>>=0;if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++>>>0]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++>>>0]=192|u>>6;heap[outIdx++>>>0]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++>>>0]=224|u>>12;heap[outIdx++>>>0]=128|u>>6&63;heap[outIdx++>>>0]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++>>>0]=240|u>>18;heap[outIdx++>>>0]=128|u>>12&63;heap[outIdx++>>>0]=128|u>>6&63;heap[outIdx++>>>0]=128|u&63}}heap[outIdx>>>0]=0;return outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key of Object.keys(node.contents)){entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length>>0)}return{ptr:ptr,allocated:allocated}},msync(stream,buffer,offset,length,mmapFlags){MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};var asyncLoad=(url,onload,onerror,noRunDep)=>{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url).then(arrayBuffer=>{onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},err=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)};var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,processData,onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:class{constructor(errno){this.name="ErrnoError";this.errno=errno}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev;this.readMode=292|73;this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;iFS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""});FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS:MEMFS}},init(input,output,error){FS.init.initialized=true;Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit(){FS.init.initialized=false;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,GROWABLE_HEAP_I8(),ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead)=>{ptr>>>=0;return ptr?UTF8ArrayToString(GROWABLE_HEAP_U8(),ptr,maxBytesToRead):""};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat(func,path,buf){var stat=func(path);GROWABLE_HEAP_I32()[buf>>>2>>>0]=stat.dev;GROWABLE_HEAP_I32()[buf+4>>>2>>>0]=stat.mode;GROWABLE_HEAP_U32()[buf+8>>>2>>>0]=stat.nlink;GROWABLE_HEAP_I32()[buf+12>>>2>>>0]=stat.uid;GROWABLE_HEAP_I32()[buf+16>>>2>>>0]=stat.gid;GROWABLE_HEAP_I32()[buf+20>>>2>>>0]=stat.rdev;HEAP64[buf+24>>>3]=BigInt(stat.size);GROWABLE_HEAP_I32()[buf+32>>>2>>>0]=4096;GROWABLE_HEAP_I32()[buf+36>>>2>>>0]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>>3]=BigInt(Math.floor(atime/1e3));GROWABLE_HEAP_U32()[buf+48>>>2>>>0]=atime%1e3*1e3;HEAP64[buf+56>>>3]=BigInt(Math.floor(mtime/1e3));GROWABLE_HEAP_U32()[buf+64>>>2>>>0]=mtime%1e3*1e3;HEAP64[buf+72>>>3]=BigInt(Math.floor(ctime/1e3));GROWABLE_HEAP_U32()[buf+80>>>2>>>0]=ctime%1e3*1e3;HEAP64[buf+88>>>3]=BigInt(stat.ino);return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=GROWABLE_HEAP_U8().slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_openat(dirfd,path,flags,varargs){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(3,0,1,dirfd,path,flags,varargs);path>>>=0;varargs>>>=0;SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>{abort("")};function __emscripten_init_main_thread_js(tb){tb>>>=0;__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1,!ENVIRONMENT_IS_WEB,65536,false);PThread.threadInitTLS()}var maybeExit=()=>{if(!keepRuntimeAlive()){try{if(ENVIRONMENT_IS_PTHREAD)__emscripten_thread_exit(EXITSTATUS);else _exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};function __emscripten_thread_mailbox_await(pthread_ptr){pthread_ptr>>>=0;if(typeof Atomics.waitAsync==="function"){var wait=Atomics.waitAsync(GROWABLE_HEAP_I32(),pthread_ptr>>>2,pthread_ptr);wait.value.then(checkMailbox);var waitingAsync=pthread_ptr+128;Atomics.store(GROWABLE_HEAP_I32(),waitingAsync>>>2,1)}}var checkMailbox=()=>{var pthread_ptr=_pthread_self();if(pthread_ptr){__emscripten_thread_mailbox_await(pthread_ptr);callUserCallback(__emscripten_check_mailbox)}};function __emscripten_notify_mailbox_postmessage(targetThreadId,currThreadId,mainThreadId){targetThreadId>>>=0;currThreadId>>>=0;mainThreadId>>>=0;if(targetThreadId==currThreadId){setTimeout(checkMailbox)}else if(ENVIRONMENT_IS_PTHREAD){postMessage({targetThread:targetThreadId,cmd:"checkMailbox"})}else{var worker=PThread.pthreads[targetThreadId];if(!worker){return}worker.postMessage({cmd:"checkMailbox"})}}var proxiedJSCallArgs=[];function __emscripten_receive_on_main_thread_js(funcIndex,emAsmAddr,callingThread,numCallArgs,args){emAsmAddr>>>=0;callingThread>>>=0;args>>>=0;numCallArgs/=2;proxiedJSCallArgs.length=numCallArgs;var b=args>>>3;for(var i=0;i>>0]}}var func=proxiedFunctionTable[funcIndex];PThread.currentProxiedOperationCallerThread=callingThread;var rtn=func(...proxiedJSCallArgs);PThread.currentProxiedOperationCallerThread=0;return rtn}function __emscripten_thread_cleanup(thread){thread>>>=0;if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({cmd:"cleanupThread",thread:thread})}function __emscripten_thread_set_strongref(thread){thread>>>=0}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,GROWABLE_HEAP_U8(),outPtr,maxBytesToWrite);var __tzset_js=function(timezone,daylight,std_name,dst_name){timezone>>>=0;daylight>>>=0;std_name>>>=0;dst_name>>>=0;var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);GROWABLE_HEAP_U32()[timezone>>>2>>>0]=stdTimezoneOffset*60;GROWABLE_HEAP_I32()[daylight>>>2>>>0]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffset{warnOnce.shown||={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}};var _emscripten_check_blocking_allowed=()=>{};var runtimeKeepalivePush=()=>{runtimeKeepaliveCounter+=1};var _emscripten_exit_with_live_runtime=()=>{runtimeKeepalivePush();throw"unwind"};var getHeapMax=()=>4294901760;function _emscripten_get_heap_max(){return getHeapMax()}var _emscripten_get_now;_emscripten_get_now=()=>performance.timeOrigin+performance.now();var _emscripten_num_logical_cores=()=>navigator["hardwareConcurrency"];var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};function _emscripten_resize_heap(requestedSize){requestedSize>>>=0;var oldSize=GROWABLE_HEAP_U8().length;if(requestedSize<=oldSize){return false}var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false}var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToAscii=(str,buffer)=>{for(var i=0;i>>0]=str.charCodeAt(i)}GROWABLE_HEAP_I8()[buffer>>>0]=0};var _environ_get=function(__environ,environ_buf){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(4,0,1,__environ,environ_buf);__environ>>>=0;environ_buf>>>=0;var bufSize=0;getEnvStrings().forEach((string,i)=>{var ptr=environ_buf+bufSize;GROWABLE_HEAP_U32()[__environ+i*4>>>2>>>0]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0};var _environ_sizes_get=function(penviron_count,penviron_buf_size){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(5,0,1,penviron_count,penviron_buf_size);penviron_count>>>=0;penviron_buf_size>>>=0;var strings=getEnvStrings();GROWABLE_HEAP_U32()[penviron_count>>>2>>>0]=strings.length;var bufSize=0;strings.forEach(string=>bufSize+=string.length+1);GROWABLE_HEAP_U32()[penviron_buf_size>>>2>>>0]=bufSize;return 0};function _fd_close(fd){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(6,0,1,fd);try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>>2>>>0];var len=GROWABLE_HEAP_U32()[iov+4>>>2>>>0];iov+=8;var curr=FS.read(stream,GROWABLE_HEAP_I8(),ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>>=0;iovcnt>>>=0;pnum>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doReadv(stream,iov,iovcnt);GROWABLE_HEAP_U32()[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset,whence,newOffset){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(8,0,1,fd,offset,whence,newOffset);offset=bigintToI53Checked(offset);newOffset>>>=0;try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>>3]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>>2>>>0];var len=GROWABLE_HEAP_U32()[iov+4>>>2>>>0];iov+=8;var curr=FS.write(stream,GROWABLE_HEAP_I8(),ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return proxyToMainThread(9,0,1,fd,iov,iovcnt,pnum);iov>>>=0;iovcnt>>>=0;pnum>>>=0;try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);GROWABLE_HEAP_U32()[pnum>>>2>>>0]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _pv_console_log_wasm(index){console.log(arrayBufferToStringAtIndex(Module.HEAPU8,index))}var _pv_file_close_wasm=async function(fileAddress,statusAddress){statusAddress=unsignedAddress(statusAddress);return Asyncify.handleAsync(async()=>{try{const file=await PvFile.getPtr(fileAddress);await file.close();setInt(statusAddress,0)}catch(e){console.error("pvFileCloseWasm",e);setInt(statusAddress,-1)}})};_pv_file_close_wasm.isAsync=true;var _pv_file_open_wasm=async function(fileAddress,pathAddress,modeAddress,statusAddress){pathAddress=unsignedAddress(pathAddress);modeAddress=unsignedAddress(modeAddress);statusAddress=unsignedAddress(statusAddress);return Asyncify.handleAsync(async()=>{const path=arrayBufferToStringAtIndex(Module.HEAPU8,pathAddress);const mode=arrayBufferToStringAtIndex(Module.HEAPU8,modeAddress);try{const file=await open(path,mode);PvFile.setPtr(fileAddress,file);setInt(statusAddress,0)}catch(e){if(e.name!=="FileNotExists"){console.error("pvFileOpenWasm",e)}setInt(statusAddress,-1)}})};_pv_file_open_wasm.isAsync=true;var _pv_file_read_wasm=async function(fileAddress,contentAddress,size,count,numReadAddress){contentAddress=unsignedAddress(contentAddress);numReadAddress=unsignedAddress(numReadAddress);return Asyncify.handleAsync(async()=>{try{const file=PvFile.getPtr(fileAddress);const content=await file.read(size,count);Module.HEAPU8.set(content,contentAddress);setInt(numReadAddress,content.length/size)}catch(e){console.error("pvFileReadWasm",e);setInt(numReadAddress,-1)}})};_pv_file_read_wasm.isAsync=true;function _pv_file_seek_wasm(fileAddress,offset,whence,statusAddress){statusAddress=unsignedAddress(statusAddress);try{const file=PvFile.getPtr(fileAddress);file.seek(offset,whence);setInt(statusAddress,0)}catch(e){console.error("pvFileSeekWasm",e);setInt(statusAddress,-1)}}function _pv_file_tell_wasm(fileAddress,offsetAddress){offsetAddress=unsignedAddress(offsetAddress);try{const file=PvFile.getPtr(fileAddress);setInt(offsetAddress,file.tell())}catch(e){console.error("pvFileTellWasm",e);setInt(offsetAddress,-1)}}var _pv_file_write_wasm=function(fileAddress,contentAddress,size,count,numWriteAddress){contentAddress=unsignedAddress(contentAddress);numWriteAddress=unsignedAddress(numWriteAddress);return Asyncify.handleAsync(async()=>{try{const file=PvFile.getPtr(fileAddress);const content=new Uint8Array(size*count);content.set(Module.HEAPU8.slice(contentAddress,contentAddress+size*count),0);await file.write(content);setInt(numWriteAddress,content.length/size)}catch(e){console.error("pvFileWriteWasm",e);setInt(numWriteAddress,-1)}})};var _pv_https_request_wasm=async function(httpMethodAddress,serverNameAddress,endpointAddress,headerAddress,bodyAddress,timeoutMs,responseAddressAddress,responseSizeAddress,responseCodeAddress){httpMethodAddress=unsignedAddress(httpMethodAddress);serverNameAddress=unsignedAddress(serverNameAddress);endpointAddress=unsignedAddress(endpointAddress);headerAddress=unsignedAddress(headerAddress);bodyAddress=unsignedAddress(bodyAddress);responseAddressAddress=unsignedAddress(responseAddressAddress);responseSizeAddress=unsignedAddress(responseSizeAddress);responseCodeAddress=unsignedAddress(responseCodeAddress);return Asyncify.handleAsync(async()=>{const httpMethod=arrayBufferToStringAtIndex(Module.HEAPU8,httpMethodAddress);const serverName=arrayBufferToStringAtIndex(Module.HEAPU8,serverNameAddress);const endpoint=arrayBufferToStringAtIndex(Module.HEAPU8,endpointAddress);const header=arrayBufferToStringAtIndex(Module.HEAPU8,headerAddress);const body=arrayBufferToStringAtIndex(Module.HEAPU8,bodyAddress);const headerObject=stringHeaderToObject(header);const options={method:httpMethod};if(body.length>0){options.body=body}if(Object.keys(headerObject).length>0){options.headers=headerObject}let response;let responseText;let statusCode;try{response=await fetchWithTimeout("https://"+serverName+endpoint,options,timeoutMs);statusCode=response.status}catch(error){console.error("pvHttpsRequestWasm",`Failed to fetch: ${error}`);return}try{responseText=await response.text()}catch(error){console.error("pvHttpsRequestWasm",`Failed to get response text: ${error}`);return}const responseAddress=Module._malloc((responseText.length+1)*Int8Array.BYTES_PER_ELEMENT);if(responseAddress===0){console.error("pvMallocError","pvHttpsRequestWasm: cannot allocate memory for response");setInt(responseAddressAddress,0);return}setInt(responseSizeAddress,responseText.length+1);setInt(responseAddressAddress,responseAddress);for(let i=0;i{try{return func()}catch(e){abort(e)}};var sigToWasmTypes=sig=>{var typeNames={i:"i32",j:"i64",f:"f32",d:"f64",e:"externref",p:"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i{runtimeKeepaliveCounter-=1};var Asyncify={instrumentWasmImports(imports){var importPattern=/^(pv_https_request_wasm|pv_file_open_wasm|pv_file_close_wasm|pv_file_read_wasm|pv_file_write_wasm|pv_file_remove_wasm|pv_sleep_wasm|pv_xpu_webgpu_device_init_wasm|pv_xpu_webgpu_device_info_wasm|pv_xpu_webgpu_device_mem_copy_from_xpu_wasm|pv_xpu_webgpu_device_wait_wasm|pv_xpu_webgpu_timer_stop_wasm|invoke_.*|__asyncjs__.*)$/;for(let[x,original]of Object.entries(imports)){if(typeof original=="function"){let isAsyncifyImport=original.isAsync||importPattern.test(x)}}},instrumentWasmExports(exports){var ret={};for(let[x,original]of Object.entries(exports)){if(typeof original=="function"){ret[x]=(...args)=>{Asyncify.exportCallStack.push(x);try{return original(...args)}finally{if(!ABORT){var y=Asyncify.exportCallStack.pop();Asyncify.maybeStopUnwind()}}}}else{ret[x]=original}}return ret},State:{Normal:0,Unwinding:1,Rewinding:2,Disabled:3},state:0,StackSize:4096,currData:null,handleSleepReturnValue:0,exportCallStack:[],callStackNameToId:{},callStackIdToName:{},callStackId:0,asyncPromiseHandlers:null,sleepCallbacks:[],getCallStackId(funcName){var id=Asyncify.callStackNameToId[funcName];if(id===undefined){id=Asyncify.callStackId++;Asyncify.callStackNameToId[funcName]=id;Asyncify.callStackIdToName[id]=funcName}return id},maybeStopUnwind(){if(Asyncify.currData&&Asyncify.state===Asyncify.State.Unwinding&&Asyncify.exportCallStack.length===0){Asyncify.state=Asyncify.State.Normal;runtimeKeepalivePush();runAndAbortIfError(_asyncify_stop_unwind);if(typeof Fibers!="undefined"){Fibers.trampoline()}}},whenDone(){return new Promise((resolve,reject)=>{Asyncify.asyncPromiseHandlers={resolve:resolve,reject:reject}})},allocateData(){var ptr=_malloc(12+Asyncify.StackSize);Asyncify.setDataHeader(ptr,ptr+12,Asyncify.StackSize);Asyncify.setDataRewindFunc(ptr);return ptr},setDataHeader(ptr,stack,stackSize){GROWABLE_HEAP_U32()[ptr>>>2>>>0]=stack;GROWABLE_HEAP_U32()[ptr+4>>>2>>>0]=stack+stackSize},setDataRewindFunc(ptr){var bottomOfCallStack=Asyncify.exportCallStack[0];var rewindId=Asyncify.getCallStackId(bottomOfCallStack);GROWABLE_HEAP_I32()[ptr+8>>>2>>>0]=rewindId},getDataRewindFuncName(ptr){var id=GROWABLE_HEAP_I32()[ptr+8>>>2>>>0];var name=Asyncify.callStackIdToName[id];return name},getDataRewindFunc(name){var func=wasmExports[name];return func},doRewind(ptr){var name=Asyncify.getDataRewindFuncName(ptr);var func=Asyncify.getDataRewindFunc(name);runtimeKeepalivePop();return func()},handleSleep(startAsync){if(ABORT)return;if(Asyncify.state===Asyncify.State.Normal){var reachedCallback=false;var reachedAfterCallback=false;startAsync((handleSleepReturnValue=0)=>{if(ABORT)return;Asyncify.handleSleepReturnValue=handleSleepReturnValue;reachedCallback=true;if(!reachedAfterCallback){return}Asyncify.state=Asyncify.State.Rewinding;runAndAbortIfError(()=>_asyncify_start_rewind(Asyncify.currData));if(typeof Browser!="undefined"&&Browser.mainLoop.func){Browser.mainLoop.resume()}var asyncWasmReturnValue,isError=false;try{asyncWasmReturnValue=Asyncify.doRewind(Asyncify.currData)}catch(err){asyncWasmReturnValue=err;isError=true}var handled=false;if(!Asyncify.currData){var asyncPromiseHandlers=Asyncify.asyncPromiseHandlers;if(asyncPromiseHandlers){Asyncify.asyncPromiseHandlers=null;(isError?asyncPromiseHandlers.reject:asyncPromiseHandlers.resolve)(asyncWasmReturnValue);handled=true}}if(isError&&!handled){throw asyncWasmReturnValue}});reachedAfterCallback=true;if(!reachedCallback){Asyncify.state=Asyncify.State.Unwinding;Asyncify.currData=Asyncify.allocateData();if(typeof Browser!="undefined"&&Browser.mainLoop.func){Browser.mainLoop.pause()}runAndAbortIfError(()=>_asyncify_start_unwind(Asyncify.currData))}}else if(Asyncify.state===Asyncify.State.Rewinding){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_rewind);_free(Asyncify.currData);Asyncify.currData=null;Asyncify.sleepCallbacks.forEach(callUserCallback)}else{abort(`invalid state: ${Asyncify.state}`)}return Asyncify.handleSleepReturnValue},handleAsync(startAsync){return Asyncify.handleSleep(wakeUp=>{startAsync().then(wakeUp)})}};var uleb128Encode=(n,target)=>{if(n<128){target.push(n)}else{target.push(n%128|128,n>>7)}};var generateFuncType=(sig,target)=>{var sigRet=sig.slice(0,1);var sigParam=sig.slice(1);var typeCodes={i:127,p:127,j:126,f:125,d:124,e:111};target.push(96);uleb128Encode(sigParam.length,target);for(var i=0;i{if(typeof WebAssembly.Function=="function"){return new WebAssembly.Function(sigToWasmTypes(sig),func)}var typeSectionBody=[1];generateFuncType(sig,typeSectionBody);var bytes=[0,97,115,109,1,0,0,0,1];uleb128Encode(typeSectionBody.length,bytes);bytes.push(...typeSectionBody);bytes.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);var module=new WebAssembly.Module(new Uint8Array(bytes));var instance=new WebAssembly.Instance(module,{e:{f:func}});var wrappedFunc=instance.exports["f"];return wrappedFunc};var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var updateTableMap=(offset,count)=>{if(functionsInTableMap){for(var i=offset;i{if(!functionsInTableMap){functionsInTableMap=new WeakMap;updateTableMap(0,wasmTable.length)}return functionsInTableMap.get(func)||0};var freeTableIndexes=[];var getEmptyTableSlot=()=>{if(freeTableIndexes.length){return freeTableIndexes.pop()}try{wasmTable.grow(1)}catch(err){if(!(err instanceof RangeError)){throw err}throw"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH."}return wasmTable.length-1};var setWasmTableEntry=(idx,func)=>{wasmTable.set(idx,func);wasmTableMirror[idx]=wasmTable.get(idx)};var addFunction=(func,sig)=>{var rtn=getFunctionAddress(func);if(rtn){return rtn}var ret=getEmptyTableSlot();try{setWasmTableEntry(ret,func)}catch(err){if(!(err instanceof TypeError)){throw err}var wrapped=convertJsFunctionToWasm(func,sig);setWasmTableEntry(ret,wrapped)}functionsInTableMap.set(func,ret);return ret};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{GROWABLE_HEAP_I8().set(array,buffer>>>0)};var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};Module["cwrap"]=cwrap;PThread.init();FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();xpu_cpu_support();var proxiedFunctionTable=[_proc_exit,exitOnMainThread,pthreadCreateProxied,___syscall_openat,_environ_get,_environ_sizes_get,_fd_close,_fd_read,_fd_seek,_fd_write];var wasmImports;function assignWasmImports(){wasmImports={w:___pthread_create_js,G:___syscall_openat,l:__abort_js,E:__emscripten_init_main_thread_js,t:__emscripten_notify_mailbox_postmessage,y:__emscripten_receive_on_main_thread_js,g:__emscripten_thread_cleanup,D:__emscripten_thread_mailbox_await,k:__emscripten_thread_set_strongref,B:__tzset_js,h:_emscripten_check_blocking_allowed,j:_emscripten_exit_with_live_runtime,u:_emscripten_get_heap_max,b:_emscripten_get_now,v:_emscripten_num_logical_cores,s:_emscripten_resize_heap,z:_environ_get,A:_environ_sizes_get,c:_exit,e:_fd_close,F:_fd_read,C:_fd_seek,d:_fd_write,a:wasmMemory,i:_pv_console_log_wasm,q:_pv_file_close_wasm,r:_pv_file_open_wasm,f:_pv_file_read_wasm,p:_pv_file_seek_wasm,o:_pv_file_tell_wasm,n:_pv_file_write_wasm,m:_pv_https_request_wasm,H:_pv_time_wasm,x:_pv_xpu_get_max_workers_wasm}}var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["I"])();var __Znwm=Module["__Znwm"]=a0=>(__Znwm=Module["__Znwm"]=wasmExports["J"])(a0);var __Znam=Module["__Znam"]=a0=>(__Znam=Module["__Znam"]=wasmExports["K"])(a0);var __ZdlPv=Module["__ZdlPv"]=a0=>(__ZdlPv=Module["__ZdlPv"]=wasmExports["L"])(a0);var __ZdlPvm=Module["__ZdlPvm"]=(a0,a1)=>(__ZdlPvm=Module["__ZdlPvm"]=wasmExports["M"])(a0,a1);var __ZdaPv=Module["__ZdaPv"]=a0=>(__ZdaPv=Module["__ZdaPv"]=wasmExports["N"])(a0);var __ZdaPvm=Module["__ZdaPvm"]=(a0,a1)=>(__ZdaPvm=Module["__ZdaPvm"]=wasmExports["O"])(a0,a1);var __ZnwmSt11align_val_t=Module["__ZnwmSt11align_val_t"]=(a0,a1)=>(__ZnwmSt11align_val_t=Module["__ZnwmSt11align_val_t"]=wasmExports["P"])(a0,a1);var __ZnamSt11align_val_t=Module["__ZnamSt11align_val_t"]=(a0,a1)=>(__ZnamSt11align_val_t=Module["__ZnamSt11align_val_t"]=wasmExports["Q"])(a0,a1);var __ZdlPvSt11align_val_t=Module["__ZdlPvSt11align_val_t"]=(a0,a1)=>(__ZdlPvSt11align_val_t=Module["__ZdlPvSt11align_val_t"]=wasmExports["R"])(a0,a1);var __ZdlPvmSt11align_val_t=Module["__ZdlPvmSt11align_val_t"]=(a0,a1,a2)=>(__ZdlPvmSt11align_val_t=Module["__ZdlPvmSt11align_val_t"]=wasmExports["S"])(a0,a1,a2);var __ZdaPvSt11align_val_t=Module["__ZdaPvSt11align_val_t"]=(a0,a1)=>(__ZdaPvSt11align_val_t=Module["__ZdaPvSt11align_val_t"]=wasmExports["T"])(a0,a1);var __ZdaPvmSt11align_val_t=Module["__ZdaPvmSt11align_val_t"]=(a0,a1,a2)=>(__ZdaPvmSt11align_val_t=Module["__ZdaPvmSt11align_val_t"]=wasmExports["U"])(a0,a1,a2);var __ZSt14set_unexpectedPFvvE=Module["__ZSt14set_unexpectedPFvvE"]=a0=>(__ZSt14set_unexpectedPFvvE=Module["__ZSt14set_unexpectedPFvvE"]=wasmExports["V"])(a0);var __ZSt13set_terminatePFvvE=Module["__ZSt13set_terminatePFvvE"]=a0=>(__ZSt13set_terminatePFvvE=Module["__ZSt13set_terminatePFvvE"]=wasmExports["W"])(a0);var __ZSt15set_new_handlerPFvvE=Module["__ZSt15set_new_handlerPFvvE"]=a0=>(__ZSt15set_new_handlerPFvvE=Module["__ZSt15set_new_handlerPFvvE"]=wasmExports["X"])(a0);var ___cxa_guard_acquire=Module["___cxa_guard_acquire"]=a0=>(___cxa_guard_acquire=Module["___cxa_guard_acquire"]=wasmExports["Y"])(a0);var ___cxa_guard_release=Module["___cxa_guard_release"]=a0=>(___cxa_guard_release=Module["___cxa_guard_release"]=wasmExports["Z"])(a0);var ___cxa_guard_abort=Module["___cxa_guard_abort"]=a0=>(___cxa_guard_abort=Module["___cxa_guard_abort"]=wasmExports["_"])(a0);var __ZSt14get_unexpectedv=Module["__ZSt14get_unexpectedv"]=()=>(__ZSt14get_unexpectedv=Module["__ZSt14get_unexpectedv"]=wasmExports["$"])();var __ZSt10unexpectedv=Module["__ZSt10unexpectedv"]=()=>(__ZSt10unexpectedv=Module["__ZSt10unexpectedv"]=wasmExports["aa"])();var __ZSt13get_terminatev=Module["__ZSt13get_terminatev"]=()=>(__ZSt13get_terminatev=Module["__ZSt13get_terminatev"]=wasmExports["ba"])();var __ZSt9terminatev=Module["__ZSt9terminatev"]=()=>(__ZSt9terminatev=Module["__ZSt9terminatev"]=wasmExports["ca"])();var __ZSt15get_new_handlerv=Module["__ZSt15get_new_handlerv"]=()=>(__ZSt15get_new_handlerv=Module["__ZSt15get_new_handlerv"]=wasmExports["da"])();var ___cxa_current_primary_exception=Module["___cxa_current_primary_exception"]=()=>(___cxa_current_primary_exception=Module["___cxa_current_primary_exception"]=wasmExports["ea"])();var ___cxa_rethrow_primary_exception=Module["___cxa_rethrow_primary_exception"]=a0=>(___cxa_rethrow_primary_exception=Module["___cxa_rethrow_primary_exception"]=wasmExports["fa"])(a0);var ___cxa_uncaught_exception=Module["___cxa_uncaught_exception"]=()=>(___cxa_uncaught_exception=Module["___cxa_uncaught_exception"]=wasmExports["ga"])();var ___cxa_uncaught_exceptions=Module["___cxa_uncaught_exceptions"]=()=>(___cxa_uncaught_exceptions=Module["___cxa_uncaught_exceptions"]=wasmExports["ha"])();var ___cxa_allocate_exception=Module["___cxa_allocate_exception"]=a0=>(___cxa_allocate_exception=Module["___cxa_allocate_exception"]=wasmExports["ia"])(a0);var ___cxa_free_exception=Module["___cxa_free_exception"]=a0=>(___cxa_free_exception=Module["___cxa_free_exception"]=wasmExports["ja"])(a0);var ___cxa_init_primary_exception=Module["___cxa_init_primary_exception"]=(a0,a1,a2)=>(___cxa_init_primary_exception=Module["___cxa_init_primary_exception"]=wasmExports["ka"])(a0,a1,a2);var ___cxa_pure_virtual=Module["___cxa_pure_virtual"]=()=>(___cxa_pure_virtual=Module["___cxa_pure_virtual"]=wasmExports["la"])();var ___cxa_deleted_virtual=Module["___cxa_deleted_virtual"]=()=>(___cxa_deleted_virtual=Module["___cxa_deleted_virtual"]=wasmExports["ma"])();var ___dynamic_cast=Module["___dynamic_cast"]=(a0,a1,a2,a3)=>(___dynamic_cast=Module["___dynamic_cast"]=wasmExports["na"])(a0,a1,a2,a3);var __ZNSt9exceptionD2Ev=Module["__ZNSt9exceptionD2Ev"]=a0=>(__ZNSt9exceptionD2Ev=Module["__ZNSt9exceptionD2Ev"]=wasmExports["oa"])(a0);var __ZNSt9exceptionD0Ev=Module["__ZNSt9exceptionD0Ev"]=a0=>(__ZNSt9exceptionD0Ev=Module["__ZNSt9exceptionD0Ev"]=wasmExports["pa"])(a0);var __ZNSt9exceptionD1Ev=Module["__ZNSt9exceptionD1Ev"]=a0=>(__ZNSt9exceptionD1Ev=Module["__ZNSt9exceptionD1Ev"]=wasmExports["qa"])(a0);var __ZNKSt9exception4whatEv=Module["__ZNKSt9exception4whatEv"]=a0=>(__ZNKSt9exception4whatEv=Module["__ZNKSt9exception4whatEv"]=wasmExports["ra"])(a0);var __ZNSt13bad_exceptionD0Ev=Module["__ZNSt13bad_exceptionD0Ev"]=a0=>(__ZNSt13bad_exceptionD0Ev=Module["__ZNSt13bad_exceptionD0Ev"]=wasmExports["sa"])(a0);var __ZNSt13bad_exceptionD1Ev=Module["__ZNSt13bad_exceptionD1Ev"]=a0=>(__ZNSt13bad_exceptionD1Ev=Module["__ZNSt13bad_exceptionD1Ev"]=wasmExports["ta"])(a0);var __ZNKSt13bad_exception4whatEv=Module["__ZNKSt13bad_exception4whatEv"]=a0=>(__ZNKSt13bad_exception4whatEv=Module["__ZNKSt13bad_exception4whatEv"]=wasmExports["ua"])(a0);var __ZNSt9bad_allocC2Ev=Module["__ZNSt9bad_allocC2Ev"]=a0=>(__ZNSt9bad_allocC2Ev=Module["__ZNSt9bad_allocC2Ev"]=wasmExports["va"])(a0);var __ZNSt9bad_allocD0Ev=Module["__ZNSt9bad_allocD0Ev"]=a0=>(__ZNSt9bad_allocD0Ev=Module["__ZNSt9bad_allocD0Ev"]=wasmExports["wa"])(a0);var __ZNSt9bad_allocD1Ev=Module["__ZNSt9bad_allocD1Ev"]=a0=>(__ZNSt9bad_allocD1Ev=Module["__ZNSt9bad_allocD1Ev"]=wasmExports["xa"])(a0);var __ZNKSt9bad_alloc4whatEv=Module["__ZNKSt9bad_alloc4whatEv"]=a0=>(__ZNKSt9bad_alloc4whatEv=Module["__ZNKSt9bad_alloc4whatEv"]=wasmExports["ya"])(a0);var __ZNSt20bad_array_new_lengthC2Ev=Module["__ZNSt20bad_array_new_lengthC2Ev"]=a0=>(__ZNSt20bad_array_new_lengthC2Ev=Module["__ZNSt20bad_array_new_lengthC2Ev"]=wasmExports["za"])(a0);var __ZNSt20bad_array_new_lengthD0Ev=Module["__ZNSt20bad_array_new_lengthD0Ev"]=a0=>(__ZNSt20bad_array_new_lengthD0Ev=Module["__ZNSt20bad_array_new_lengthD0Ev"]=wasmExports["Aa"])(a0);var __ZNSt20bad_array_new_lengthD1Ev=Module["__ZNSt20bad_array_new_lengthD1Ev"]=a0=>(__ZNSt20bad_array_new_lengthD1Ev=Module["__ZNSt20bad_array_new_lengthD1Ev"]=wasmExports["Ba"])(a0);var __ZNKSt20bad_array_new_length4whatEv=Module["__ZNKSt20bad_array_new_length4whatEv"]=a0=>(__ZNKSt20bad_array_new_length4whatEv=Module["__ZNKSt20bad_array_new_length4whatEv"]=wasmExports["Ca"])(a0);var __ZNSt13bad_exceptionD2Ev=Module["__ZNSt13bad_exceptionD2Ev"]=a0=>(__ZNSt13bad_exceptionD2Ev=Module["__ZNSt13bad_exceptionD2Ev"]=wasmExports["Da"])(a0);var __ZNSt9bad_allocC1Ev=Module["__ZNSt9bad_allocC1Ev"]=a0=>(__ZNSt9bad_allocC1Ev=Module["__ZNSt9bad_allocC1Ev"]=wasmExports["Ea"])(a0);var __ZNSt9bad_allocD2Ev=Module["__ZNSt9bad_allocD2Ev"]=a0=>(__ZNSt9bad_allocD2Ev=Module["__ZNSt9bad_allocD2Ev"]=wasmExports["Fa"])(a0);var __ZNSt20bad_array_new_lengthC1Ev=Module["__ZNSt20bad_array_new_lengthC1Ev"]=a0=>(__ZNSt20bad_array_new_lengthC1Ev=Module["__ZNSt20bad_array_new_lengthC1Ev"]=wasmExports["Ga"])(a0);var __ZNSt20bad_array_new_lengthD2Ev=Module["__ZNSt20bad_array_new_lengthD2Ev"]=a0=>(__ZNSt20bad_array_new_lengthD2Ev=Module["__ZNSt20bad_array_new_lengthD2Ev"]=wasmExports["Ha"])(a0);var __ZNSt11logic_errorD2Ev=Module["__ZNSt11logic_errorD2Ev"]=a0=>(__ZNSt11logic_errorD2Ev=Module["__ZNSt11logic_errorD2Ev"]=wasmExports["Ia"])(a0);var __ZNSt11logic_errorD0Ev=Module["__ZNSt11logic_errorD0Ev"]=a0=>(__ZNSt11logic_errorD0Ev=Module["__ZNSt11logic_errorD0Ev"]=wasmExports["Ja"])(a0);var __ZNSt11logic_errorD1Ev=Module["__ZNSt11logic_errorD1Ev"]=a0=>(__ZNSt11logic_errorD1Ev=Module["__ZNSt11logic_errorD1Ev"]=wasmExports["Ka"])(a0);var __ZNKSt11logic_error4whatEv=Module["__ZNKSt11logic_error4whatEv"]=a0=>(__ZNKSt11logic_error4whatEv=Module["__ZNKSt11logic_error4whatEv"]=wasmExports["La"])(a0);var __ZNSt13runtime_errorD2Ev=Module["__ZNSt13runtime_errorD2Ev"]=a0=>(__ZNSt13runtime_errorD2Ev=Module["__ZNSt13runtime_errorD2Ev"]=wasmExports["Ma"])(a0);var __ZNSt13runtime_errorD0Ev=Module["__ZNSt13runtime_errorD0Ev"]=a0=>(__ZNSt13runtime_errorD0Ev=Module["__ZNSt13runtime_errorD0Ev"]=wasmExports["Na"])(a0);var __ZNSt13runtime_errorD1Ev=Module["__ZNSt13runtime_errorD1Ev"]=a0=>(__ZNSt13runtime_errorD1Ev=Module["__ZNSt13runtime_errorD1Ev"]=wasmExports["Oa"])(a0);var __ZNKSt13runtime_error4whatEv=Module["__ZNKSt13runtime_error4whatEv"]=a0=>(__ZNKSt13runtime_error4whatEv=Module["__ZNKSt13runtime_error4whatEv"]=wasmExports["Pa"])(a0);var __ZNSt12domain_errorD0Ev=Module["__ZNSt12domain_errorD0Ev"]=a0=>(__ZNSt12domain_errorD0Ev=Module["__ZNSt12domain_errorD0Ev"]=wasmExports["Qa"])(a0);var __ZNSt12domain_errorD1Ev=Module["__ZNSt12domain_errorD1Ev"]=a0=>(__ZNSt12domain_errorD1Ev=Module["__ZNSt12domain_errorD1Ev"]=wasmExports["Ra"])(a0);var __ZNSt16invalid_argumentD0Ev=Module["__ZNSt16invalid_argumentD0Ev"]=a0=>(__ZNSt16invalid_argumentD0Ev=Module["__ZNSt16invalid_argumentD0Ev"]=wasmExports["Sa"])(a0);var __ZNSt16invalid_argumentD1Ev=Module["__ZNSt16invalid_argumentD1Ev"]=a0=>(__ZNSt16invalid_argumentD1Ev=Module["__ZNSt16invalid_argumentD1Ev"]=wasmExports["Ta"])(a0);var __ZNSt12length_errorD0Ev=Module["__ZNSt12length_errorD0Ev"]=a0=>(__ZNSt12length_errorD0Ev=Module["__ZNSt12length_errorD0Ev"]=wasmExports["Ua"])(a0);var __ZNSt12length_errorD1Ev=Module["__ZNSt12length_errorD1Ev"]=a0=>(__ZNSt12length_errorD1Ev=Module["__ZNSt12length_errorD1Ev"]=wasmExports["Va"])(a0);var __ZNSt12out_of_rangeD0Ev=Module["__ZNSt12out_of_rangeD0Ev"]=a0=>(__ZNSt12out_of_rangeD0Ev=Module["__ZNSt12out_of_rangeD0Ev"]=wasmExports["Wa"])(a0);var __ZNSt12out_of_rangeD1Ev=Module["__ZNSt12out_of_rangeD1Ev"]=a0=>(__ZNSt12out_of_rangeD1Ev=Module["__ZNSt12out_of_rangeD1Ev"]=wasmExports["Xa"])(a0);var __ZNSt11range_errorD0Ev=Module["__ZNSt11range_errorD0Ev"]=a0=>(__ZNSt11range_errorD0Ev=Module["__ZNSt11range_errorD0Ev"]=wasmExports["Ya"])(a0);var __ZNSt11range_errorD1Ev=Module["__ZNSt11range_errorD1Ev"]=a0=>(__ZNSt11range_errorD1Ev=Module["__ZNSt11range_errorD1Ev"]=wasmExports["Za"])(a0);var __ZNSt14overflow_errorD0Ev=Module["__ZNSt14overflow_errorD0Ev"]=a0=>(__ZNSt14overflow_errorD0Ev=Module["__ZNSt14overflow_errorD0Ev"]=wasmExports["_a"])(a0);var __ZNSt14overflow_errorD1Ev=Module["__ZNSt14overflow_errorD1Ev"]=a0=>(__ZNSt14overflow_errorD1Ev=Module["__ZNSt14overflow_errorD1Ev"]=wasmExports["$a"])(a0);var __ZNSt15underflow_errorD0Ev=Module["__ZNSt15underflow_errorD0Ev"]=a0=>(__ZNSt15underflow_errorD0Ev=Module["__ZNSt15underflow_errorD0Ev"]=wasmExports["ab"])(a0);var __ZNSt15underflow_errorD1Ev=Module["__ZNSt15underflow_errorD1Ev"]=a0=>(__ZNSt15underflow_errorD1Ev=Module["__ZNSt15underflow_errorD1Ev"]=wasmExports["bb"])(a0);var __ZNSt12domain_errorD2Ev=Module["__ZNSt12domain_errorD2Ev"]=a0=>(__ZNSt12domain_errorD2Ev=Module["__ZNSt12domain_errorD2Ev"]=wasmExports["cb"])(a0);var __ZNSt16invalid_argumentD2Ev=Module["__ZNSt16invalid_argumentD2Ev"]=a0=>(__ZNSt16invalid_argumentD2Ev=Module["__ZNSt16invalid_argumentD2Ev"]=wasmExports["db"])(a0);var __ZNSt12length_errorD2Ev=Module["__ZNSt12length_errorD2Ev"]=a0=>(__ZNSt12length_errorD2Ev=Module["__ZNSt12length_errorD2Ev"]=wasmExports["eb"])(a0);var __ZNSt12out_of_rangeD2Ev=Module["__ZNSt12out_of_rangeD2Ev"]=a0=>(__ZNSt12out_of_rangeD2Ev=Module["__ZNSt12out_of_rangeD2Ev"]=wasmExports["fb"])(a0);var __ZNSt11range_errorD2Ev=Module["__ZNSt11range_errorD2Ev"]=a0=>(__ZNSt11range_errorD2Ev=Module["__ZNSt11range_errorD2Ev"]=wasmExports["gb"])(a0);var __ZNSt14overflow_errorD2Ev=Module["__ZNSt14overflow_errorD2Ev"]=a0=>(__ZNSt14overflow_errorD2Ev=Module["__ZNSt14overflow_errorD2Ev"]=wasmExports["hb"])(a0);var __ZNSt15underflow_errorD2Ev=Module["__ZNSt15underflow_errorD2Ev"]=a0=>(__ZNSt15underflow_errorD2Ev=Module["__ZNSt15underflow_errorD2Ev"]=wasmExports["ib"])(a0);var __ZNSt9type_infoD2Ev=Module["__ZNSt9type_infoD2Ev"]=a0=>(__ZNSt9type_infoD2Ev=Module["__ZNSt9type_infoD2Ev"]=wasmExports["jb"])(a0);var __ZNSt9type_infoD0Ev=Module["__ZNSt9type_infoD0Ev"]=a0=>(__ZNSt9type_infoD0Ev=Module["__ZNSt9type_infoD0Ev"]=wasmExports["kb"])(a0);var __ZNSt9type_infoD1Ev=Module["__ZNSt9type_infoD1Ev"]=a0=>(__ZNSt9type_infoD1Ev=Module["__ZNSt9type_infoD1Ev"]=wasmExports["lb"])(a0);var __ZNSt8bad_castC2Ev=Module["__ZNSt8bad_castC2Ev"]=a0=>(__ZNSt8bad_castC2Ev=Module["__ZNSt8bad_castC2Ev"]=wasmExports["mb"])(a0);var __ZNSt8bad_castD2Ev=Module["__ZNSt8bad_castD2Ev"]=a0=>(__ZNSt8bad_castD2Ev=Module["__ZNSt8bad_castD2Ev"]=wasmExports["nb"])(a0);var __ZNSt8bad_castD0Ev=Module["__ZNSt8bad_castD0Ev"]=a0=>(__ZNSt8bad_castD0Ev=Module["__ZNSt8bad_castD0Ev"]=wasmExports["ob"])(a0);var __ZNSt8bad_castD1Ev=Module["__ZNSt8bad_castD1Ev"]=a0=>(__ZNSt8bad_castD1Ev=Module["__ZNSt8bad_castD1Ev"]=wasmExports["pb"])(a0);var __ZNKSt8bad_cast4whatEv=Module["__ZNKSt8bad_cast4whatEv"]=a0=>(__ZNKSt8bad_cast4whatEv=Module["__ZNKSt8bad_cast4whatEv"]=wasmExports["qb"])(a0);var __ZNSt10bad_typeidC2Ev=Module["__ZNSt10bad_typeidC2Ev"]=a0=>(__ZNSt10bad_typeidC2Ev=Module["__ZNSt10bad_typeidC2Ev"]=wasmExports["rb"])(a0);var __ZNSt10bad_typeidD2Ev=Module["__ZNSt10bad_typeidD2Ev"]=a0=>(__ZNSt10bad_typeidD2Ev=Module["__ZNSt10bad_typeidD2Ev"]=wasmExports["sb"])(a0);var __ZNSt10bad_typeidD0Ev=Module["__ZNSt10bad_typeidD0Ev"]=a0=>(__ZNSt10bad_typeidD0Ev=Module["__ZNSt10bad_typeidD0Ev"]=wasmExports["tb"])(a0);var __ZNSt10bad_typeidD1Ev=Module["__ZNSt10bad_typeidD1Ev"]=a0=>(__ZNSt10bad_typeidD1Ev=Module["__ZNSt10bad_typeidD1Ev"]=wasmExports["ub"])(a0);var __ZNKSt10bad_typeid4whatEv=Module["__ZNKSt10bad_typeid4whatEv"]=a0=>(__ZNKSt10bad_typeid4whatEv=Module["__ZNKSt10bad_typeid4whatEv"]=wasmExports["vb"])(a0);var __ZNSt8bad_castC1Ev=Module["__ZNSt8bad_castC1Ev"]=a0=>(__ZNSt8bad_castC1Ev=Module["__ZNSt8bad_castC1Ev"]=wasmExports["wb"])(a0);var __ZNSt10bad_typeidC1Ev=Module["__ZNSt10bad_typeidC1Ev"]=a0=>(__ZNSt10bad_typeidC1Ev=Module["__ZNSt10bad_typeidC1Ev"]=wasmExports["xb"])(a0);var _pv_orca_init=Module["_pv_orca_init"]=(a0,a1,a2,a3)=>(_pv_orca_init=Module["_pv_orca_init"]=wasmExports["yb"])(a0,a1,a2,a3);var _free=a0=>(_free=wasmExports["zb"])(a0);var _pv_orca_delete=Module["_pv_orca_delete"]=a0=>(_pv_orca_delete=Module["_pv_orca_delete"]=wasmExports["Ab"])(a0);var _pv_orca_version=Module["_pv_orca_version"]=()=>(_pv_orca_version=Module["_pv_orca_version"]=wasmExports["Bb"])();var _pv_orca_valid_characters=Module["_pv_orca_valid_characters"]=(a0,a1,a2)=>(_pv_orca_valid_characters=Module["_pv_orca_valid_characters"]=wasmExports["Cb"])(a0,a1,a2);var _malloc=Module["_malloc"]=a0=>(_malloc=Module["_malloc"]=wasmExports["Db"])(a0);var _pv_orca_sample_rate=Module["_pv_orca_sample_rate"]=(a0,a1)=>(_pv_orca_sample_rate=Module["_pv_orca_sample_rate"]=wasmExports["Eb"])(a0,a1);var _pv_orca_word_alignments_delete=Module["_pv_orca_word_alignments_delete"]=(a0,a1)=>(_pv_orca_word_alignments_delete=Module["_pv_orca_word_alignments_delete"]=wasmExports["Fb"])(a0,a1);var _pv_orca_synthesize=Module["_pv_orca_synthesize"]=(a0,a1,a2,a3,a4,a5,a6)=>(_pv_orca_synthesize=Module["_pv_orca_synthesize"]=wasmExports["Gb"])(a0,a1,a2,a3,a4,a5,a6);var _pv_orca_synthesize_to_file=Module["_pv_orca_synthesize_to_file"]=(a0,a1,a2,a3,a4,a5)=>(_pv_orca_synthesize_to_file=Module["_pv_orca_synthesize_to_file"]=wasmExports["Hb"])(a0,a1,a2,a3,a4,a5);var _pv_orca_pcm_delete=Module["_pv_orca_pcm_delete"]=a0=>(_pv_orca_pcm_delete=Module["_pv_orca_pcm_delete"]=wasmExports["Ib"])(a0);var _pv_orca_synthesize_params_init=Module["_pv_orca_synthesize_params_init"]=a0=>(_pv_orca_synthesize_params_init=Module["_pv_orca_synthesize_params_init"]=wasmExports["Jb"])(a0);var _pv_orca_synthesize_params_delete=Module["_pv_orca_synthesize_params_delete"]=a0=>(_pv_orca_synthesize_params_delete=Module["_pv_orca_synthesize_params_delete"]=wasmExports["Kb"])(a0);var _pv_orca_synthesize_params_set_speech_rate=Module["_pv_orca_synthesize_params_set_speech_rate"]=(a0,a1)=>(_pv_orca_synthesize_params_set_speech_rate=Module["_pv_orca_synthesize_params_set_speech_rate"]=wasmExports["Lb"])(a0,a1);var _pv_orca_synthesize_params_get_speech_rate=Module["_pv_orca_synthesize_params_get_speech_rate"]=(a0,a1)=>(_pv_orca_synthesize_params_get_speech_rate=Module["_pv_orca_synthesize_params_get_speech_rate"]=wasmExports["Mb"])(a0,a1);var _pv_orca_synthesize_params_set_random_state=Module["_pv_orca_synthesize_params_set_random_state"]=(a0,a1)=>(_pv_orca_synthesize_params_set_random_state=Module["_pv_orca_synthesize_params_set_random_state"]=wasmExports["Nb"])(a0,a1);var _pv_orca_synthesize_params_get_random_state=Module["_pv_orca_synthesize_params_get_random_state"]=(a0,a1)=>(_pv_orca_synthesize_params_get_random_state=Module["_pv_orca_synthesize_params_get_random_state"]=wasmExports["Ob"])(a0,a1);var _pv_orca_valid_characters_delete=Module["_pv_orca_valid_characters_delete"]=a0=>(_pv_orca_valid_characters_delete=Module["_pv_orca_valid_characters_delete"]=wasmExports["Pb"])(a0);var _pv_orca_max_character_limit=Module["_pv_orca_max_character_limit"]=(a0,a1)=>(_pv_orca_max_character_limit=Module["_pv_orca_max_character_limit"]=wasmExports["Qb"])(a0,a1);var _pv_orca_stream_open=Module["_pv_orca_stream_open"]=(a0,a1,a2)=>(_pv_orca_stream_open=Module["_pv_orca_stream_open"]=wasmExports["Rb"])(a0,a1,a2);var _pv_orca_stream_close=Module["_pv_orca_stream_close"]=a0=>(_pv_orca_stream_close=Module["_pv_orca_stream_close"]=wasmExports["Sb"])(a0);var _pv_orca_stream_synthesize=Module["_pv_orca_stream_synthesize"]=(a0,a1,a2,a3)=>(_pv_orca_stream_synthesize=Module["_pv_orca_stream_synthesize"]=wasmExports["Tb"])(a0,a1,a2,a3);var _pv_orca_stream_flush=Module["_pv_orca_stream_flush"]=(a0,a1,a2)=>(_pv_orca_stream_flush=Module["_pv_orca_stream_flush"]=wasmExports["Ub"])(a0,a1,a2);var _pv_orca_list_hardware_devices=Module["_pv_orca_list_hardware_devices"]=(a0,a1)=>(_pv_orca_list_hardware_devices=Module["_pv_orca_list_hardware_devices"]=wasmExports["Vb"])(a0,a1);var _pv_orca_free_hardware_devices=Module["_pv_orca_free_hardware_devices"]=(a0,a1)=>(_pv_orca_free_hardware_devices=Module["_pv_orca_free_hardware_devices"]=wasmExports["Wb"])(a0,a1);var _pv_status_to_string=Module["_pv_status_to_string"]=a0=>(_pv_status_to_string=Module["_pv_status_to_string"]=wasmExports["Yb"])(a0);var _pv_sample_rate=Module["_pv_sample_rate"]=()=>(_pv_sample_rate=Module["_pv_sample_rate"]=wasmExports["Zb"])();var _pv_log_enable=Module["_pv_log_enable"]=()=>(_pv_log_enable=Module["_pv_log_enable"]=wasmExports["_b"])();var _pv_log_disable=Module["_pv_log_disable"]=()=>(_pv_log_disable=Module["_pv_log_disable"]=wasmExports["$b"])();var _aligned_alloc=Module["_aligned_alloc"]=(a0,a1)=>(_aligned_alloc=Module["_aligned_alloc"]=wasmExports["ac"])(a0,a1);var _pv_get_sdk=Module["_pv_get_sdk"]=()=>(_pv_get_sdk=Module["_pv_get_sdk"]=wasmExports["bc"])();var _pv_set_sdk=Module["_pv_set_sdk"]=a0=>(_pv_set_sdk=Module["_pv_set_sdk"]=wasmExports["cc"])(a0);var _pv_free=Module["_pv_free"]=a0=>(_pv_free=Module["_pv_free"]=wasmExports["dc"])(a0);var _pv_get_error_stack=Module["_pv_get_error_stack"]=(a0,a1)=>(_pv_get_error_stack=Module["_pv_get_error_stack"]=wasmExports["ec"])(a0,a1);var _pv_free_error_stack=Module["_pv_free_error_stack"]=a0=>(_pv_free_error_stack=Module["_pv_free_error_stack"]=wasmExports["fc"])(a0);var __emscripten_tls_init=()=>(__emscripten_tls_init=wasmExports["gc"])();var _pthread_self=()=>(_pthread_self=wasmExports["hc"])();var __emscripten_memcpy_bulkmem=Module["__emscripten_memcpy_bulkmem"]=(a0,a1,a2)=>(__emscripten_memcpy_bulkmem=Module["__emscripten_memcpy_bulkmem"]=wasmExports["ic"])(a0,a1,a2);var __emscripten_memset_bulkmem=Module["__emscripten_memset_bulkmem"]=(a0,a1,a2)=>(__emscripten_memset_bulkmem=Module["__emscripten_memset_bulkmem"]=wasmExports["jc"])(a0,a1,a2);var ___get_tp=Module["___get_tp"]=()=>(___get_tp=Module["___get_tp"]=wasmExports["kc"])();var __emscripten_thread_supports_atomics_wait=Module["__emscripten_thread_supports_atomics_wait"]=()=>(__emscripten_thread_supports_atomics_wait=Module["__emscripten_thread_supports_atomics_wait"]=wasmExports["lc"])();var __emscripten_thread_init=(a0,a1,a2,a3,a4,a5)=>(__emscripten_thread_init=wasmExports["mc"])(a0,a1,a2,a3,a4,a5);var ___set_thread_state=Module["___set_thread_state"]=(a0,a1,a2,a3)=>(___set_thread_state=Module["___set_thread_state"]=wasmExports["nc"])(a0,a1,a2,a3);var _emscripten_is_main_runtime_thread=Module["_emscripten_is_main_runtime_thread"]=()=>(_emscripten_is_main_runtime_thread=Module["_emscripten_is_main_runtime_thread"]=wasmExports["oc"])();var _emscripten_is_main_browser_thread=Module["_emscripten_is_main_browser_thread"]=()=>(_emscripten_is_main_browser_thread=Module["_emscripten_is_main_browser_thread"]=wasmExports["pc"])();var __emscripten_thread_crashed=()=>(__emscripten_thread_crashed=wasmExports["qc"])();var _emscripten_stack_get_base=Module["_emscripten_stack_get_base"]=()=>(_emscripten_stack_get_base=Module["_emscripten_stack_get_base"]=wasmExports["rc"])();var _emscripten_stack_get_end=Module["_emscripten_stack_get_end"]=()=>(_emscripten_stack_get_end=Module["_emscripten_stack_get_end"]=wasmExports["sc"])();var __emscripten_run_on_main_thread_js=(a0,a1,a2,a3,a4)=>(__emscripten_run_on_main_thread_js=wasmExports["tc"])(a0,a1,a2,a3,a4);var __emscripten_thread_free_data=a0=>(__emscripten_thread_free_data=wasmExports["uc"])(a0);var __emscripten_thread_exit=a0=>(__emscripten_thread_exit=wasmExports["vc"])(a0);var __emscripten_check_mailbox=()=>(__emscripten_check_mailbox=wasmExports["wc"])();var _emscripten_stack_init=Module["_emscripten_stack_init"]=()=>(_emscripten_stack_init=Module["_emscripten_stack_init"]=wasmExports["xc"])();var _emscripten_stack_set_limits=(a0,a1)=>(_emscripten_stack_set_limits=wasmExports["yc"])(a0,a1);var _emscripten_stack_get_free=Module["_emscripten_stack_get_free"]=()=>(_emscripten_stack_get_free=Module["_emscripten_stack_get_free"]=wasmExports["zc"])();var __emscripten_wasm_worker_initialize=Module["__emscripten_wasm_worker_initialize"]=(a0,a1)=>(__emscripten_wasm_worker_initialize=Module["__emscripten_wasm_worker_initialize"]=wasmExports["Ac"])(a0,a1);var __emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports["Bc"])(a0);var __emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports["Cc"])(a0);var _emscripten_stack_get_current=()=>(_emscripten_stack_get_current=wasmExports["Dc"])();var dynCall_ii=Module["dynCall_ii"]=(a0,a1)=>(dynCall_ii=Module["dynCall_ii"]=wasmExports["Ec"])(a0,a1);var _asyncify_start_unwind=a0=>(_asyncify_start_unwind=wasmExports["Fc"])(a0);var _asyncify_stop_unwind=()=>(_asyncify_stop_unwind=wasmExports["Gc"])();var _asyncify_start_rewind=a0=>(_asyncify_start_rewind=wasmExports["Hc"])(a0);var _asyncify_stop_rewind=()=>(_asyncify_stop_rewind=wasmExports["Ic"])();var ___cxa_unexpected_handler=Module["___cxa_unexpected_handler"]=2374668;var ___cxa_terminate_handler=Module["___cxa_terminate_handler"]=2374664;var ___cxa_new_handler=Module["___cxa_new_handler"]=2381104;var __ZTIN10__cxxabiv116__shim_type_infoE=Module["__ZTIN10__cxxabiv116__shim_type_infoE"]=52268;var __ZTIN10__cxxabiv117__class_type_infoE=Module["__ZTIN10__cxxabiv117__class_type_infoE"]=52316;var __ZTIN10__cxxabiv117__pbase_type_infoE=Module["__ZTIN10__cxxabiv117__pbase_type_infoE"]=52364;var __ZTIDn=Module["__ZTIDn"]=52712;var __ZTIN10__cxxabiv119__pointer_type_infoE=Module["__ZTIN10__cxxabiv119__pointer_type_infoE"]=52412;var __ZTIv=Module["__ZTIv"]=52660;var __ZTIN10__cxxabiv120__function_type_infoE=Module["__ZTIN10__cxxabiv120__function_type_infoE"]=52464;var __ZTIN10__cxxabiv129__pointer_to_member_type_infoE=Module["__ZTIN10__cxxabiv129__pointer_to_member_type_infoE"]=52524;var __ZTSN10__cxxabiv116__shim_type_infoE=Module["__ZTSN10__cxxabiv116__shim_type_infoE"]=52232;var __ZTVN10__cxxabiv120__si_class_type_infoE=Module["__ZTVN10__cxxabiv120__si_class_type_infoE"]=54196;var __ZTSN10__cxxabiv117__class_type_infoE=Module["__ZTSN10__cxxabiv117__class_type_infoE"]=52280;var __ZTSN10__cxxabiv117__pbase_type_infoE=Module["__ZTSN10__cxxabiv117__pbase_type_infoE"]=52328;var __ZTSN10__cxxabiv119__pointer_type_infoE=Module["__ZTSN10__cxxabiv119__pointer_type_infoE"]=52376;var __ZTSN10__cxxabiv120__function_type_infoE=Module["__ZTSN10__cxxabiv120__function_type_infoE"]=52424;var __ZTSN10__cxxabiv129__pointer_to_member_type_infoE=Module["__ZTSN10__cxxabiv129__pointer_to_member_type_infoE"]=52476;var __ZTVN10__cxxabiv116__shim_type_infoE=Module["__ZTVN10__cxxabiv116__shim_type_infoE"]=52548;var __ZTVN10__cxxabiv123__fundamental_type_infoE=Module["__ZTVN10__cxxabiv123__fundamental_type_infoE"]=52576;var __ZTIN10__cxxabiv123__fundamental_type_infoE=Module["__ZTIN10__cxxabiv123__fundamental_type_infoE"]=52644;var __ZTSN10__cxxabiv123__fundamental_type_infoE=Module["__ZTSN10__cxxabiv123__fundamental_type_infoE"]=52604;var __ZTSv=Module["__ZTSv"]=52656;var __ZTSPv=Module["__ZTSPv"]=52668;var __ZTIPv=Module["__ZTIPv"]=52672;var __ZTVN10__cxxabiv119__pointer_type_infoE=Module["__ZTVN10__cxxabiv119__pointer_type_infoE"]=54408;var __ZTSPKv=Module["__ZTSPKv"]=52688;var __ZTIPKv=Module["__ZTIPKv"]=52692;var __ZTSDn=Module["__ZTSDn"]=52708;var __ZTSPDn=Module["__ZTSPDn"]=52720;var __ZTIPDn=Module["__ZTIPDn"]=52724;var __ZTSPKDn=Module["__ZTSPKDn"]=52740;var __ZTIPKDn=Module["__ZTIPKDn"]=52748;var __ZTSb=Module["__ZTSb"]=52764;var __ZTIb=Module["__ZTIb"]=52768;var __ZTSPb=Module["__ZTSPb"]=52776;var __ZTIPb=Module["__ZTIPb"]=52780;var __ZTSPKb=Module["__ZTSPKb"]=52796;var __ZTIPKb=Module["__ZTIPKb"]=52800;var __ZTSw=Module["__ZTSw"]=52816;var __ZTIw=Module["__ZTIw"]=52820;var __ZTSPw=Module["__ZTSPw"]=52828;var __ZTIPw=Module["__ZTIPw"]=52832;var __ZTSPKw=Module["__ZTSPKw"]=52848;var __ZTIPKw=Module["__ZTIPKw"]=52852;var __ZTSc=Module["__ZTSc"]=52868;var __ZTIc=Module["__ZTIc"]=52872;var __ZTSPc=Module["__ZTSPc"]=52880;var __ZTIPc=Module["__ZTIPc"]=52884;var __ZTSPKc=Module["__ZTSPKc"]=52900;var __ZTIPKc=Module["__ZTIPKc"]=52904;var __ZTSh=Module["__ZTSh"]=52920;var __ZTIh=Module["__ZTIh"]=52924;var __ZTSPh=Module["__ZTSPh"]=52932;var __ZTIPh=Module["__ZTIPh"]=52936;var __ZTSPKh=Module["__ZTSPKh"]=52952;var __ZTIPKh=Module["__ZTIPKh"]=52956;var __ZTSa=Module["__ZTSa"]=52972;var __ZTIa=Module["__ZTIa"]=52976;var __ZTSPa=Module["__ZTSPa"]=52984;var __ZTIPa=Module["__ZTIPa"]=52988;var __ZTSPKa=Module["__ZTSPKa"]=53004;var __ZTIPKa=Module["__ZTIPKa"]=53008;var __ZTSs=Module["__ZTSs"]=53024;var __ZTIs=Module["__ZTIs"]=53028;var __ZTSPs=Module["__ZTSPs"]=53036;var __ZTIPs=Module["__ZTIPs"]=53040;var __ZTSPKs=Module["__ZTSPKs"]=53056;var __ZTIPKs=Module["__ZTIPKs"]=53060;var __ZTSt=Module["__ZTSt"]=53076;var __ZTIt=Module["__ZTIt"]=53080;var __ZTSPt=Module["__ZTSPt"]=53088;var __ZTIPt=Module["__ZTIPt"]=53092;var __ZTSPKt=Module["__ZTSPKt"]=53108;var __ZTIPKt=Module["__ZTIPKt"]=53112;var __ZTSi=Module["__ZTSi"]=53128;var __ZTIi=Module["__ZTIi"]=53132;var __ZTSPi=Module["__ZTSPi"]=53140;var __ZTIPi=Module["__ZTIPi"]=53144;var __ZTSPKi=Module["__ZTSPKi"]=53160;var __ZTIPKi=Module["__ZTIPKi"]=53164;var __ZTSj=Module["__ZTSj"]=53180;var __ZTIj=Module["__ZTIj"]=53184;var __ZTSPj=Module["__ZTSPj"]=53192;var __ZTIPj=Module["__ZTIPj"]=53196;var __ZTSPKj=Module["__ZTSPKj"]=53212;var __ZTIPKj=Module["__ZTIPKj"]=53216;var __ZTSl=Module["__ZTSl"]=53232;var __ZTIl=Module["__ZTIl"]=53236;var __ZTSPl=Module["__ZTSPl"]=53244;var __ZTIPl=Module["__ZTIPl"]=53248;var __ZTSPKl=Module["__ZTSPKl"]=53264;var __ZTIPKl=Module["__ZTIPKl"]=53268;var __ZTSm=Module["__ZTSm"]=53284;var __ZTIm=Module["__ZTIm"]=53288;var __ZTSPm=Module["__ZTSPm"]=53296;var __ZTIPm=Module["__ZTIPm"]=53300;var __ZTSPKm=Module["__ZTSPKm"]=53316;var __ZTIPKm=Module["__ZTIPKm"]=53320;var __ZTSx=Module["__ZTSx"]=53336;var __ZTIx=Module["__ZTIx"]=53340;var __ZTSPx=Module["__ZTSPx"]=53348;var __ZTIPx=Module["__ZTIPx"]=53352;var __ZTSPKx=Module["__ZTSPKx"]=53368;var __ZTIPKx=Module["__ZTIPKx"]=53372;var __ZTSy=Module["__ZTSy"]=53388;var __ZTIy=Module["__ZTIy"]=53392;var __ZTSPy=Module["__ZTSPy"]=53400;var __ZTIPy=Module["__ZTIPy"]=53404;var __ZTSPKy=Module["__ZTSPKy"]=53420;var __ZTIPKy=Module["__ZTIPKy"]=53424;var __ZTSn=Module["__ZTSn"]=53440;var __ZTIn=Module["__ZTIn"]=53444;var __ZTSPn=Module["__ZTSPn"]=53452;var __ZTIPn=Module["__ZTIPn"]=53456;var __ZTSPKn=Module["__ZTSPKn"]=53472;var __ZTIPKn=Module["__ZTIPKn"]=53476;var __ZTSo=Module["__ZTSo"]=53492;var __ZTIo=Module["__ZTIo"]=53496;var __ZTSPo=Module["__ZTSPo"]=53504;var __ZTIPo=Module["__ZTIPo"]=53508;var __ZTSPKo=Module["__ZTSPKo"]=53524;var __ZTIPKo=Module["__ZTIPKo"]=53528;var __ZTSDh=Module["__ZTSDh"]=53544;var __ZTIDh=Module["__ZTIDh"]=53548;var __ZTSPDh=Module["__ZTSPDh"]=53556;var __ZTIPDh=Module["__ZTIPDh"]=53560;var __ZTSPKDh=Module["__ZTSPKDh"]=53576;var __ZTIPKDh=Module["__ZTIPKDh"]=53584;var __ZTSf=Module["__ZTSf"]=53600;var __ZTIf=Module["__ZTIf"]=53604;var __ZTSPf=Module["__ZTSPf"]=53612;var __ZTIPf=Module["__ZTIPf"]=53616;var __ZTSPKf=Module["__ZTSPKf"]=53632;var __ZTIPKf=Module["__ZTIPKf"]=53636;var __ZTSd=Module["__ZTSd"]=53652;var __ZTId=Module["__ZTId"]=53656;var __ZTSPd=Module["__ZTSPd"]=53664;var __ZTIPd=Module["__ZTIPd"]=53668;var __ZTSPKd=Module["__ZTSPKd"]=53684;var __ZTIPKd=Module["__ZTIPKd"]=53688;var __ZTSe=Module["__ZTSe"]=53704;var __ZTIe=Module["__ZTIe"]=53708;var __ZTSPe=Module["__ZTSPe"]=53716;var __ZTIPe=Module["__ZTIPe"]=53720;var __ZTSPKe=Module["__ZTSPKe"]=53736;var __ZTIPKe=Module["__ZTIPKe"]=53740;var __ZTSg=Module["__ZTSg"]=53756;var __ZTIg=Module["__ZTIg"]=53760;var __ZTSPg=Module["__ZTSPg"]=53768;var __ZTIPg=Module["__ZTIPg"]=53772;var __ZTSPKg=Module["__ZTSPKg"]=53788;var __ZTIPKg=Module["__ZTIPKg"]=53792;var __ZTSDu=Module["__ZTSDu"]=53808;var __ZTIDu=Module["__ZTIDu"]=53812;var __ZTSPDu=Module["__ZTSPDu"]=53820;var __ZTIPDu=Module["__ZTIPDu"]=53824;var __ZTSPKDu=Module["__ZTSPKDu"]=53840;var __ZTIPKDu=Module["__ZTIPKDu"]=53848;var __ZTSDs=Module["__ZTSDs"]=53864;var __ZTIDs=Module["__ZTIDs"]=53868;var __ZTSPDs=Module["__ZTSPDs"]=53876;var __ZTIPDs=Module["__ZTIPDs"]=53880;var __ZTSPKDs=Module["__ZTSPKDs"]=53896;var __ZTIPKDs=Module["__ZTIPKDs"]=53904;var __ZTSDi=Module["__ZTSDi"]=53920;var __ZTIDi=Module["__ZTIDi"]=53924;var __ZTSPDi=Module["__ZTSPDi"]=53932;var __ZTIPDi=Module["__ZTIPDi"]=53936;var __ZTSPKDi=Module["__ZTSPKDi"]=53952;var __ZTIPKDi=Module["__ZTIPKDi"]=53960;var __ZTVN10__cxxabiv117__array_type_infoE=Module["__ZTVN10__cxxabiv117__array_type_infoE"]=53976;var __ZTIN10__cxxabiv117__array_type_infoE=Module["__ZTIN10__cxxabiv117__array_type_infoE"]=54040;var __ZTSN10__cxxabiv117__array_type_infoE=Module["__ZTSN10__cxxabiv117__array_type_infoE"]=54004;var __ZTVN10__cxxabiv120__function_type_infoE=Module["__ZTVN10__cxxabiv120__function_type_infoE"]=54052;var __ZTVN10__cxxabiv116__enum_type_infoE=Module["__ZTVN10__cxxabiv116__enum_type_infoE"]=54080;var __ZTIN10__cxxabiv116__enum_type_infoE=Module["__ZTIN10__cxxabiv116__enum_type_infoE"]=54144;var __ZTSN10__cxxabiv116__enum_type_infoE=Module["__ZTSN10__cxxabiv116__enum_type_infoE"]=54108;var __ZTVN10__cxxabiv117__class_type_infoE=Module["__ZTVN10__cxxabiv117__class_type_infoE"]=54156;var __ZTIN10__cxxabiv120__si_class_type_infoE=Module["__ZTIN10__cxxabiv120__si_class_type_infoE"]=54276;var __ZTSN10__cxxabiv120__si_class_type_infoE=Module["__ZTSN10__cxxabiv120__si_class_type_infoE"]=54236;var __ZTVN10__cxxabiv121__vmi_class_type_infoE=Module["__ZTVN10__cxxabiv121__vmi_class_type_infoE"]=54288;var __ZTIN10__cxxabiv121__vmi_class_type_infoE=Module["__ZTIN10__cxxabiv121__vmi_class_type_infoE"]=54368;var __ZTSN10__cxxabiv121__vmi_class_type_infoE=Module["__ZTSN10__cxxabiv121__vmi_class_type_infoE"]=54328;var __ZTVN10__cxxabiv117__pbase_type_infoE=Module["__ZTVN10__cxxabiv117__pbase_type_infoE"]=54380;var __ZTVN10__cxxabiv129__pointer_to_member_type_infoE=Module["__ZTVN10__cxxabiv129__pointer_to_member_type_infoE"]=54436;var __ZTVSt9bad_alloc=Module["__ZTVSt9bad_alloc"]=54464;var __ZTVSt9exception=Module["__ZTVSt9exception"]=54504;var __ZTVSt20bad_array_new_length=Module["__ZTVSt20bad_array_new_length"]=54484;var __ZTISt9bad_alloc=Module["__ZTISt9bad_alloc"]=54616;var __ZTISt20bad_array_new_length=Module["__ZTISt20bad_array_new_length"]=54656;var __ZTISt9exception=Module["__ZTISt9exception"]=54540;var __ZTSSt9exception=Module["__ZTSSt9exception"]=54524;var __ZTVSt13bad_exception=Module["__ZTVSt13bad_exception"]=54548;var __ZTISt13bad_exception=Module["__ZTISt13bad_exception"]=54588;var __ZTSSt13bad_exception=Module["__ZTSSt13bad_exception"]=54568;var __ZTSSt9bad_alloc=Module["__ZTSSt9bad_alloc"]=54600;var __ZTSSt20bad_array_new_length=Module["__ZTSSt20bad_array_new_length"]=54628;var __ZTVSt11logic_error=Module["__ZTVSt11logic_error"]=54668;var __ZTVSt13runtime_error=Module["__ZTVSt13runtime_error"]=54688;var __ZTISt11logic_error=Module["__ZTISt11logic_error"]=54764;var __ZTISt13runtime_error=Module["__ZTISt13runtime_error"]=55004;var __ZTVSt12domain_error=Module["__ZTVSt12domain_error"]=54708;var __ZTISt12domain_error=Module["__ZTISt12domain_error"]=54776;var __ZTSSt12domain_error=Module["__ZTSSt12domain_error"]=54728;var __ZTSSt11logic_error=Module["__ZTSSt11logic_error"]=54745;var __ZTVSt16invalid_argument=Module["__ZTVSt16invalid_argument"]=54788;var __ZTISt16invalid_argument=Module["__ZTISt16invalid_argument"]=54832;var __ZTSSt16invalid_argument=Module["__ZTSSt16invalid_argument"]=54808;var __ZTVSt12length_error=Module["__ZTVSt12length_error"]=54844;var __ZTISt12length_error=Module["__ZTISt12length_error"]=54884;var __ZTSSt12length_error=Module["__ZTSSt12length_error"]=54864;var __ZTVSt12out_of_range=Module["__ZTVSt12out_of_range"]=54896;var __ZTISt12out_of_range=Module["__ZTISt12out_of_range"]=54936;var __ZTSSt12out_of_range=Module["__ZTSSt12out_of_range"]=54916;var __ZTVSt11range_error=Module["__ZTVSt11range_error"]=54948;var __ZTISt11range_error=Module["__ZTISt11range_error"]=55016;var __ZTSSt11range_error=Module["__ZTSSt11range_error"]=54968;var __ZTSSt13runtime_error=Module["__ZTSSt13runtime_error"]=54984;var __ZTVSt14overflow_error=Module["__ZTVSt14overflow_error"]=55028;var __ZTISt14overflow_error=Module["__ZTISt14overflow_error"]=55068;var __ZTSSt14overflow_error=Module["__ZTSSt14overflow_error"]=55048;var __ZTVSt15underflow_error=Module["__ZTVSt15underflow_error"]=55080;var __ZTISt15underflow_error=Module["__ZTISt15underflow_error"]=55120;var __ZTSSt15underflow_error=Module["__ZTSSt15underflow_error"]=55100;var __ZTVSt8bad_cast=Module["__ZTVSt8bad_cast"]=52100;var __ZTVSt10bad_typeid=Module["__ZTVSt10bad_typeid"]=52120;var __ZTISt8bad_cast=Module["__ZTISt8bad_cast"]=52192;var __ZTISt10bad_typeid=Module["__ZTISt10bad_typeid"]=52220;var __ZTVSt9type_info=Module["__ZTVSt9type_info"]=52140;var __ZTISt9type_info=Module["__ZTISt9type_info"]=52172;var __ZTSSt9type_info=Module["__ZTSSt9type_info"]=52156;var __ZTSSt8bad_cast=Module["__ZTSSt8bad_cast"]=52180;var __ZTSSt10bad_typeid=Module["__ZTSSt10bad_typeid"]=52204;function applySignatureConversions(wasmExports){wasmExports=Object.assign({},wasmExports);var makeWrapper_pp=f=>a0=>f(a0)>>>0;var makeWrapper_p=f=>()=>f()>>>0;wasmExports["Db"]=makeWrapper_pp(wasmExports["Db"]);wasmExports["hc"]=makeWrapper_p(wasmExports["hc"]);wasmExports["emscripten_main_runtime_thread_id"]=makeWrapper_p(wasmExports["emscripten_main_runtime_thread_id"]);wasmExports["rc"]=makeWrapper_p(wasmExports["rc"]);wasmExports["sc"]=makeWrapper_p(wasmExports["sc"]);wasmExports["Cc"]=makeWrapper_pp(wasmExports["Cc"]);wasmExports["Dc"]=makeWrapper_p(wasmExports["Dc"]);return wasmExports}Module["addFunction"]=addFunction;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){readyPromiseResolve(Module);initRuntime();startWorker(Module);return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();moduleRtn=readyPromise; + + + return moduleRtn; +} +); +})(); +export default pv_orca_pthread; +var isPthread = globalThis.self?.name === 'em-pthread'; +// When running as a pthread, construct a new instance on startup +isPthread && pv_orca_pthread(); diff --git a/lib/wasm/pv_orca_pthread.wasm b/lib/wasm/pv_orca_pthread.wasm new file mode 100755 index 00000000..a7f16ae7 Binary files /dev/null and b/lib/wasm/pv_orca_pthread.wasm differ diff --git a/lib/wasm/pv_orca_simd.js b/lib/wasm/pv_orca_simd.js index faec6ca8..7620bf42 100644 --- a/lib/wasm/pv_orca_simd.js +++ b/lib/wasm/pv_orca_simd.js @@ -6,7 +6,7 @@ var pv_orca_simd = (() => { function(moduleArg = {}) { var moduleRtn; -var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";function _typeof$2(o){null;return _typeof$2="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof$2(o)}function toPrimitive(t,r){if("object"!=_typeof$2(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof$2(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}function toPropertyKey(t){var i=toPrimitive(t,"string");return"symbol"==_typeof$2(i)?i:i+""}function _defineProperty(e,r,t){return(r=toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function asyncGeneratorStep(n,t,e,r,o,a,c){try{var i=n[a](c),u=i.value}catch(n){return void e(n)}i.done?t(u):Promise.resolve(u).then(r,o)}function _asyncToGenerator(n){return function(){var t=this,e=arguments;return new Promise(function(r,o){var a=n.apply(t,e);function _next(n){asyncGeneratorStep(a,r,o,_next,_throw,"next",n)}function _throw(n){asyncGeneratorStep(a,r,o,_next,_throw,"throw",n)}_next(void 0)})}}function getDefaultExportFromCjs(x){return x&&x.__esModule&&Object.prototype.hasOwnProperty.call(x,"default")?x["default"]:x}var regeneratorRuntime$3={exports:{}};var _typeof$1={exports:{}};var _typeof_1=_typeof$1.exports;(function(module){function _typeof(o){null;return module.exports=_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},module.exports.__esModule=true,module.exports["default"]=module.exports,_typeof(o)}module.exports=_typeof,module.exports.__esModule=true,module.exports["default"]=module.exports})(_typeof$1);var _typeofExports=_typeof$1.exports;var _typeof=getDefaultExportFromCjs(_typeofExports);var regeneratorRuntime$1=regeneratorRuntime$3.exports;(function(module){var _typeof=_typeofExports["default"];function _regeneratorRuntime(){"use strict";module.exports=_regeneratorRuntime=function _regeneratorRuntime(){return e},module.exports.__esModule=true,module.exports["default"]=module.exports;var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",c=i.asyncIterator||"@@asyncIterator",u=i.toStringTag||"@@toStringTag";function define(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{define({},"")}catch(t){define=function define(t,e,r){return t[e]=r}}function wrap(t,e,r,n){var i=e&&e.prototype instanceof Generator?e:Generator,a=Object.create(i.prototype),c=new Context(n||[]);return o(a,"_invoke",{value:makeInvokeMethod(t,r,c)}),a}function tryCatch(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=wrap;var h="suspendedStart",l="suspendedYield",f="executing",s="completed",y={};function Generator(){}function GeneratorFunction(){}function GeneratorFunctionPrototype(){}var p={};define(p,a,function(){return this});var d=Object.getPrototypeOf,v=d&&d(d(values([])));v&&v!==r&&n.call(v,a)&&(p=v);var g=GeneratorFunctionPrototype.prototype=Generator.prototype=Object.create(p);function defineIteratorMethods(t){["next","throw","return"].forEach(function(e){define(t,e,function(t){return this._invoke(e,t)})})}function AsyncIterator(t,e){function invoke(r,o,i,a){var c=tryCatch(t[r],t,o);if("throw"!==c.type){var u=c.arg,h=u.value;return h&&"object"==_typeof(h)&&n.call(h,"__await")?e.resolve(h.__await).then(function(t){invoke("next",t,i,a)},function(t){invoke("throw",t,i,a)}):e.resolve(h).then(function(t){u.value=t,i(u)},function(t){return invoke("throw",t,i,a)})}a(c.arg)}var r;o(this,"_invoke",{value:function value(t,n){function callInvokeWithMethodAndArg(){return new e(function(e,r){invoke(t,n,e,r)})}return r=r?r.then(callInvokeWithMethodAndArg,callInvokeWithMethodAndArg):callInvokeWithMethodAndArg()}})}function makeInvokeMethod(e,r,n){var o=h;return function(i,a){if(o===f)throw Error("Generator is already running");if(o===s){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var c=n.delegate;if(c){var u=maybeInvokeDelegate(c,n);if(u){if(u===y)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===h)throw o=s,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=f;var p=tryCatch(e,r,n);if("normal"===p.type){if(o=n.done?s:l,p.arg===y)continue;return{value:p.arg,done:n.done}}"throw"===p.type&&(o=s,n.method="throw",n.arg=p.arg)}}}function maybeInvokeDelegate(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator["return"]&&(r.method="return",r.arg=t,maybeInvokeDelegate(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),y;var i=tryCatch(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,y;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,y):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,y)}function pushTryEntry(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function resetTryEntry(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function Context(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(pushTryEntry,this),this.reset(!0)}function values(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function next(){for(;++o=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return handle("end");if(i.tryLoc<=this.prev){var c=n.call(i,"catchLoc"),u=n.call(i,"finallyLoc");if(c&&u){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),resetTryEntry(r),y}},catch:function _catch(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;resetTryEntry(r)}return o}}throw Error("illegal catch attempt")},delegateYield:function delegateYield(e,r,n){return this.delegate={iterator:values(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),y}},e}module.exports=_regeneratorRuntime,module.exports.__esModule=true,module.exports["default"]=module.exports})(regeneratorRuntime$3);var regeneratorRuntimeExports=regeneratorRuntime$3.exports;var regeneratorRuntime$2=getDefaultExportFromCjs(regeneratorRuntimeExports);var runtime=regeneratorRuntimeExports();var regenerator=runtime;try{regeneratorRuntime=runtime}catch(accidentalStrictMode){if(typeof globalThis==="object"){globalThis.regeneratorRuntime=runtime}else{Function("r","regeneratorRuntime = r")(runtime)}}var _regeneratorRuntime=getDefaultExportFromCjs(regenerator);const BROWSER_ALIASES_MAP={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"};const BROWSER_MAP={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"};const PLATFORMS_MAP={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"};const OS_MAP={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"};const ENGINE_MAP={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};class Utils{static getFirstMatch(regexp,ua){const match=ua.match(regexp);return match&&match.length>0&&match[1]||""}static getSecondMatch(regexp,ua){const match=ua.match(regexp);return match&&match.length>1&&match[2]||""}static matchAndReturnConst(regexp,ua,_const){if(regexp.test(ua)){return _const}return void 0}static getWindowsVersionName(version){switch(version){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return undefined}}static getMacOSVersionName(version){const v=version.split(".").splice(0,2).map(s=>parseInt(s,10)||0);v.push(0);if(v[0]!==10)return undefined;switch(v[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return undefined}}static getAndroidVersionName(version){const v=version.split(".").splice(0,2).map(s=>parseInt(s,10)||0);v.push(0);if(v[0]===1&&v[1]<5)return undefined;if(v[0]===1&&v[1]<6)return"Cupcake";if(v[0]===1&&v[1]>=6)return"Donut";if(v[0]===2&&v[1]<2)return"Eclair";if(v[0]===2&&v[1]===2)return"Froyo";if(v[0]===2&&v[1]>2)return"Gingerbread";if(v[0]===3)return"Honeycomb";if(v[0]===4&&v[1]<1)return"Ice Cream Sandwich";if(v[0]===4&&v[1]<4)return"Jelly Bean";if(v[0]===4&&v[1]>=4)return"KitKat";if(v[0]===5)return"Lollipop";if(v[0]===6)return"Marshmallow";if(v[0]===7)return"Nougat";if(v[0]===8)return"Oreo";if(v[0]===9)return"Pie";return undefined}static getVersionPrecision(version){return version.split(".").length}static compareVersions(versionA,versionB,isLoose=false){const versionAPrecision=Utils.getVersionPrecision(versionA);const versionBPrecision=Utils.getVersionPrecision(versionB);let precision=Math.max(versionAPrecision,versionBPrecision);let lastPrecision=0;const chunks=Utils.map([versionA,versionB],version=>{const delta=precision-Utils.getVersionPrecision(version);const _version=version+new Array(delta+1).join(".0");return Utils.map(_version.split("."),chunk=>new Array(20-chunk.length).join("0")+chunk).reverse()});if(isLoose){lastPrecision=precision-Math.min(versionAPrecision,versionBPrecision)}precision-=1;while(precision>=lastPrecision){if(chunks[0][precision]>chunks[1][precision]){return 1}if(chunks[0][precision]===chunks[1][precision]){if(precision===lastPrecision){return 0}precision-=1}else if(chunks[0][precision]{result[key]=assigner[key]})}}return obj}static getBrowserAlias(browserName){return BROWSER_ALIASES_MAP[browserName]}static getBrowserTypeByAlias(browserAlias){return BROWSER_MAP[browserAlias]||""}}const commonVersionIdentifier=/version\/(\d+(\.?_?\d+)+)/i;const browsersList=[{test:[/googlebot/i],describe(ua){const browser={name:"Googlebot"};const version=Utils.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/opera/i],describe(ua){const browser={name:"Opera"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/opr\/|opios/i],describe(ua){const browser={name:"Opera"};const version=Utils.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/SamsungBrowser/i],describe(ua){const browser={name:"Samsung Internet for Android"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/Whale/i],describe(ua){const browser={name:"NAVER Whale Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/MZBrowser/i],describe(ua){const browser={name:"MZ Browser"};const version=Utils.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/focus/i],describe(ua){const browser={name:"Focus"};const version=Utils.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/swing/i],describe(ua){const browser={name:"Swing"};const version=Utils.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/coast/i],describe(ua){const browser={name:"Opera Coast"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(ua){const browser={name:"Opera Touch"};const version=Utils.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/yabrowser/i],describe(ua){const browser={name:"Yandex Browser"};const version=Utils.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/ucbrowser/i],describe(ua){const browser={name:"UC Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/Maxthon|mxios/i],describe(ua){const browser={name:"Maxthon"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/epiphany/i],describe(ua){const browser={name:"Epiphany"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/puffin/i],describe(ua){const browser={name:"Puffin"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/sleipnir/i],describe(ua){const browser={name:"Sleipnir"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/k-meleon/i],describe(ua){const browser={name:"K-Meleon"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/micromessenger/i],describe(ua){const browser={name:"WeChat"};const version=Utils.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/qqbrowser/i],describe(ua){const browser={name:/qqbrowserlite/i.test(ua)?"QQ Browser Lite":"QQ Browser"};const version=Utils.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/msie|trident/i],describe(ua){const browser={name:"Internet Explorer"};const version=Utils.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/\sedg\//i],describe(ua){const browser={name:"Microsoft Edge"};const version=Utils.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/edg([ea]|ios)/i],describe(ua){const browser={name:"Microsoft Edge"};const version=Utils.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/vivaldi/i],describe(ua){const browser={name:"Vivaldi"};const version=Utils.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/seamonkey/i],describe(ua){const browser={name:"SeaMonkey"};const version=Utils.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/sailfish/i],describe(ua){const browser={name:"Sailfish"};const version=Utils.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,ua);if(version){browser.version=version}return browser}},{test:[/silk/i],describe(ua){const browser={name:"Amazon Silk"};const version=Utils.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/phantom/i],describe(ua){const browser={name:"PhantomJS"};const version=Utils.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/slimerjs/i],describe(ua){const browser={name:"SlimerJS"};const version=Utils.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(ua){const browser={name:"BlackBerry"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/(web|hpw)[o0]s/i],describe(ua){const browser={name:"WebOS Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/bada/i],describe(ua){const browser={name:"Bada"};const version=Utils.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/tizen/i],describe(ua){const browser={name:"Tizen"};const version=Utils.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/qupzilla/i],describe(ua){const browser={name:"QupZilla"};const version=Utils.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/firefox|iceweasel|fxios/i],describe(ua){const browser={name:"Firefox"};const version=Utils.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/electron/i],describe(ua){const browser={name:"Electron"};const version=Utils.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/MiuiBrowser/i],describe(ua){const browser={name:"Miui"};const version=Utils.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/chromium/i],describe(ua){const browser={name:"Chromium"};const version=Utils.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/chrome|crios|crmo/i],describe(ua){const browser={name:"Chrome"};const version=Utils.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/GSA/i],describe(ua){const browser={name:"Google Search"};const version=Utils.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test(parser){const notLikeAndroid=!parser.test(/like android/i);const butAndroid=parser.test(/android/i);return notLikeAndroid&&butAndroid},describe(ua){const browser={name:"Android Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/playstation 4/i],describe(ua){const browser={name:"PlayStation 4"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/safari|applewebkit/i],describe(ua){const browser={name:"Safari"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/.*/i],describe(ua){const regexpWithoutDeviceSpec=/^(.*)\/(.*) /;const regexpWithDeviceSpec=/^(.*)\/(.*)[ \t]\((.*)/;const hasDeviceSpec=ua.search("\\(")!==-1;const regexp=hasDeviceSpec?regexpWithDeviceSpec:regexpWithoutDeviceSpec;return{name:Utils.getFirstMatch(regexp,ua),version:Utils.getSecondMatch(regexp,ua)}}}];var osParsersList=[{test:[/Roku\/DVP/],describe(ua){const version=Utils.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,ua);return{name:OS_MAP.Roku,version:version}}},{test:[/windows phone/i],describe(ua){const version=Utils.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,ua);return{name:OS_MAP.WindowsPhone,version:version}}},{test:[/windows /i],describe(ua){const version=Utils.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,ua);const versionName=Utils.getWindowsVersionName(version);return{name:OS_MAP.Windows,version:version,versionName:versionName}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(ua){const result={name:OS_MAP.iOS};const version=Utils.getSecondMatch(/(Version\/)(\d[\d.]+)/,ua);if(version){result.version=version}return result}},{test:[/macintosh/i],describe(ua){const version=Utils.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,ua).replace(/[_\s]/g,".");const versionName=Utils.getMacOSVersionName(version);const os={name:OS_MAP.MacOS,version:version};if(versionName){os.versionName=versionName}return os}},{test:[/(ipod|iphone|ipad)/i],describe(ua){const version=Utils.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,ua).replace(/[_\s]/g,".");return{name:OS_MAP.iOS,version:version}}},{test(parser){const notLikeAndroid=!parser.test(/like android/i);const butAndroid=parser.test(/android/i);return notLikeAndroid&&butAndroid},describe(ua){const version=Utils.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,ua);const versionName=Utils.getAndroidVersionName(version);const os={name:OS_MAP.Android,version:version};if(versionName){os.versionName=versionName}return os}},{test:[/(web|hpw)[o0]s/i],describe(ua){const version=Utils.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,ua);const os={name:OS_MAP.WebOS};if(version&&version.length){os.version=version}return os}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(ua){const version=Utils.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,ua)||Utils.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,ua)||Utils.getFirstMatch(/\bbb(\d+)/i,ua);return{name:OS_MAP.BlackBerry,version:version}}},{test:[/bada/i],describe(ua){const version=Utils.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,ua);return{name:OS_MAP.Bada,version:version}}},{test:[/tizen/i],describe(ua){const version=Utils.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,ua);return{name:OS_MAP.Tizen,version:version}}},{test:[/linux/i],describe(){return{name:OS_MAP.Linux}}},{test:[/CrOS/],describe(){return{name:OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe(ua){const version=Utils.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,ua);return{name:OS_MAP.PlayStation4,version:version}}}];var platformParsersList=[{test:[/googlebot/i],describe(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe(ua){const model=Utils.getFirstMatch(/(can-l01)/i,ua)&&"Nova";const platform={type:PLATFORMS_MAP.mobile,vendor:"Huawei"};if(model){platform.model=model}return platform}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe(){return{type:PLATFORMS_MAP.tablet}}},{test(parser){const iDevice=parser.test(/ipod|iphone/i);const likeIDevice=parser.test(/like (ipod|iphone)/i);return iDevice&&!likeIDevice},describe(ua){const model=Utils.getFirstMatch(/(ipod|iphone)/i,ua);return{type:PLATFORMS_MAP.mobile,vendor:"Apple",model:model}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe(){return{type:PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe(){return{type:PLATFORMS_MAP.mobile}}},{test(parser){return parser.getBrowserName(true)==="blackberry"},describe(){return{type:PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test(parser){return parser.getBrowserName(true)==="bada"},describe(){return{type:PLATFORMS_MAP.mobile}}},{test(parser){return parser.getBrowserName()==="windows phone"},describe(){return{type:PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test(parser){const osMajorVersion=Number(String(parser.getOSVersion()).split(".")[0]);return parser.getOSName(true)==="android"&&osMajorVersion>=3},describe(){return{type:PLATFORMS_MAP.tablet}}},{test(parser){return parser.getOSName(true)==="android"},describe(){return{type:PLATFORMS_MAP.mobile}}},{test(parser){return parser.getOSName(true)==="macos"},describe(){return{type:PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test(parser){return parser.getOSName(true)==="windows"},describe(){return{type:PLATFORMS_MAP.desktop}}},{test(parser){return parser.getOSName(true)==="linux"},describe(){return{type:PLATFORMS_MAP.desktop}}},{test(parser){return parser.getOSName(true)==="playstation 4"},describe(){return{type:PLATFORMS_MAP.tv}}},{test(parser){return parser.getOSName(true)==="roku"},describe(){return{type:PLATFORMS_MAP.tv}}}];var enginesParsersList=[{test(parser){return parser.getBrowserName(true)==="microsoft edge"},describe(ua){const isBlinkBased=/\sedg\//i.test(ua);if(isBlinkBased){return{name:ENGINE_MAP.Blink}}const version=Utils.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,ua);return{name:ENGINE_MAP.EdgeHTML,version:version}}},{test:[/trident/i],describe(ua){const engine={name:ENGINE_MAP.Trident};const version=Utils.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}},{test(parser){return parser.test(/presto/i)},describe(ua){const engine={name:ENGINE_MAP.Presto};const version=Utils.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}},{test(parser){const isGecko=parser.test(/gecko/i);const likeGecko=parser.test(/like gecko/i);return isGecko&&!likeGecko},describe(ua){const engine={name:ENGINE_MAP.Gecko};const version=Utils.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}},{test:[/(apple)?webkit\/537\.36/i],describe(){return{name:ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe(ua){const engine={name:ENGINE_MAP.WebKit};const version=Utils.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}}];class Parser{constructor(UA,skipParsing=false){if(UA===void 0||UA===null||UA===""){throw new Error("UserAgent parameter can't be empty")}this._ua=UA;this.parsedResult={};if(skipParsing!==true){this.parse()}}getUA(){return this._ua}test(regex){return regex.test(this._ua)}parseBrowser(){this.parsedResult.browser={};const browserDescriptor=Utils.find(browsersList,_browser=>{if(typeof _browser.test==="function"){return _browser.test(this)}if(_browser.test instanceof Array){return _browser.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(browserDescriptor){this.parsedResult.browser=browserDescriptor.describe(this.getUA())}return this.parsedResult.browser}getBrowser(){if(this.parsedResult.browser){return this.parsedResult.browser}return this.parseBrowser()}getBrowserName(toLowerCase){if(toLowerCase){return String(this.getBrowser().name).toLowerCase()||""}return this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){if(this.parsedResult.os){return this.parsedResult.os}return this.parseOS()}parseOS(){this.parsedResult.os={};const os=Utils.find(osParsersList,_os=>{if(typeof _os.test==="function"){return _os.test(this)}if(_os.test instanceof Array){return _os.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(os){this.parsedResult.os=os.describe(this.getUA())}return this.parsedResult.os}getOSName(toLowerCase){const{name:name}=this.getOS();if(toLowerCase){return String(name).toLowerCase()||""}return name||""}getOSVersion(){return this.getOS().version}getPlatform(){if(this.parsedResult.platform){return this.parsedResult.platform}return this.parsePlatform()}getPlatformType(toLowerCase=false){const{type:type}=this.getPlatform();if(toLowerCase){return String(type).toLowerCase()||""}return type||""}parsePlatform(){this.parsedResult.platform={};const platform=Utils.find(platformParsersList,_platform=>{if(typeof _platform.test==="function"){return _platform.test(this)}if(_platform.test instanceof Array){return _platform.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(platform){this.parsedResult.platform=platform.describe(this.getUA())}return this.parsedResult.platform}getEngine(){if(this.parsedResult.engine){return this.parsedResult.engine}return this.parseEngine()}getEngineName(toLowerCase){if(toLowerCase){return String(this.getEngine().name).toLowerCase()||""}return this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};const engine=Utils.find(enginesParsersList,_engine=>{if(typeof _engine.test==="function"){return _engine.test(this)}if(_engine.test instanceof Array){return _engine.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(engine){this.parsedResult.engine=engine.describe(this.getUA())}return this.parsedResult.engine}parse(){this.parseBrowser();this.parseOS();this.parsePlatform();this.parseEngine();return this}getResult(){return Utils.assign({},this.parsedResult)}satisfies(checkTree){const platformsAndOSes={};let platformsAndOSCounter=0;const browsers={};let browsersCounter=0;const allDefinitions=Object.keys(checkTree);allDefinitions.forEach(key=>{const currentDefinition=checkTree[key];if(typeof currentDefinition==="string"){browsers[key]=currentDefinition;browsersCounter+=1}else if(typeof currentDefinition==="object"){platformsAndOSes[key]=currentDefinition;platformsAndOSCounter+=1}});if(platformsAndOSCounter>0){const platformsAndOSNames=Object.keys(platformsAndOSes);const OSMatchingDefinition=Utils.find(platformsAndOSNames,name=>this.isOS(name));if(OSMatchingDefinition){const osResult=this.satisfies(platformsAndOSes[OSMatchingDefinition]);if(osResult!==void 0){return osResult}}const platformMatchingDefinition=Utils.find(platformsAndOSNames,name=>this.isPlatform(name));if(platformMatchingDefinition){const platformResult=this.satisfies(platformsAndOSes[platformMatchingDefinition]);if(platformResult!==void 0){return platformResult}}}if(browsersCounter>0){const browserNames=Object.keys(browsers);const matchingDefinition=Utils.find(browserNames,name=>this.isBrowser(name,true));if(matchingDefinition!==void 0){return this.compareVersion(browsers[matchingDefinition])}}return undefined}isBrowser(browserName,includingAlias=false){const defaultBrowserName=this.getBrowserName().toLowerCase();let browserNameLower=browserName.toLowerCase();const alias=Utils.getBrowserTypeByAlias(browserNameLower);if(includingAlias&&alias){browserNameLower=alias.toLowerCase()}return browserNameLower===defaultBrowserName}compareVersion(version){let expectedResults=[0];let comparableVersion=version;let isLoose=false;const currentBrowserVersion=this.getBrowserVersion();if(typeof currentBrowserVersion!=="string"){return void 0}if(version[0]===">"||version[0]==="<"){comparableVersion=version.substr(1);if(version[1]==="="){isLoose=true;comparableVersion=version.substr(2)}else{expectedResults=[]}if(version[0]===">"){expectedResults.push(1)}else{expectedResults.push(-1)}}else if(version[0]==="="){comparableVersion=version.substr(1)}else if(version[0]==="~"){isLoose=true;comparableVersion=version.substr(1)}return expectedResults.indexOf(Utils.compareVersions(currentBrowserVersion,comparableVersion,isLoose))>-1}isOS(osName){return this.getOSName(true)===String(osName).toLowerCase()}isPlatform(platformType){return this.getPlatformType(true)===String(platformType).toLowerCase()}isEngine(engineName){return this.getEngineName(true)===String(engineName).toLowerCase()}is(anything,includingAlias=false){return this.isBrowser(anything,includingAlias)||this.isOS(anything)||this.isPlatform(anything)}some(anythings=[]){return anythings.some(anything=>this.is(anything))}}class Bowser{static getParser(UA,skipParsing=false){if(typeof UA!=="string"){throw new Error("UserAgent should be a string")}return new Parser(UA,skipParsing)}static parse(UA){return new Parser(UA).getResult()}static get BROWSER_MAP(){return BROWSER_MAP}static get ENGINE_MAP(){return ENGINE_MAP}static get OS_MAP(){return OS_MAP}static get PLATFORMS_MAP(){return PLATFORMS_MAP}}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t=this._data.length){return undefined}var res=this._data.slice(this._pos,this._pos+bytes);this._pos+=bytes;return res}},{key:"set",value:function set(pos,data){this._pos=pos;this._data=data}},{key:"clear",value:function clear(){this._pos=0;this._data=new Uint8Array}}])}();var PvFileIDB=function(_PvFile){function PvFileIDB(path,meta,db,mode){var _this;_classCallCheck(this,PvFileIDB);_this=_callSuper$1(this,PvFileIDB);_this._pageSize=512*1024;_this._pagePtr=0;_this._pageOffset=0;_this._path=path;_this._meta=meta;_this._db=db;_this._mode=mode;_this._cache=new PvCache;return _this}_inherits(PvFileIDB,_PvFile);return _createClass(PvFileIDB,[{key:"pageSize",get:function get(){return this._pageSize}},{key:"close",value:function(){var _close=_asyncToGenerator(_regeneratorRuntime.mark(function _callee(){return _regeneratorRuntime.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:this._db.close();case 1:case"end":return _context.stop()}},_callee,this)}));function close(){return _close.apply(this,arguments)}return close}()},{key:"read",value:function(){var _read=_asyncToGenerator(_regeneratorRuntime.mark(function _callee2(size,count){var _this2=this;return _regeneratorRuntime.wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:return _context2.abrupt("return",new Promise(function(resolve,reject){if(!_this2.exists()){reject(new Error("'".concat(_this2._path,"' doesn't exist.")));return}if(_this2._isEOF){var err=new Error("EOF");err.name="EndOfFile";reject(err);return}var copied=0;var maxToCopy=Math.min(size*count,_this2._meta.size);var totalElems=maxToCopy-maxToCopy%size;var buffer=new Uint8Array(totalElems);var res=_this2._cache.get(totalElems);if(res){copied+=res.length;_this2._pageOffset+=res.length;if(_this2._pageOffset===_this2._pageSize){_this2._pagePtr+=1;_this2._pageOffset=0}if(totalElems===copied){resolve(res);return}buffer.set(res)}var keyRange=IDBKeyRange.bound("".concat(_this2._path,"-").concat(PvFileIDB.createPage(_this2._pagePtr)),"".concat(_this2._path,"-").concat(PvFileIDB.createPage(_this2._pagePtr+Math.floor(totalElems/_this2._pageSize)+1)));var store=_this2._store;var req=store.openCursor(keyRange);req.onsuccess=function(){var cursor=req.result;if(!cursor||_this2._isEOF){return}var toCopy=Math.min(totalElems-copied,cursor.value.length-_this2._pageOffset);buffer.set(cursor.value.slice(_this2._pageOffset,_this2._pageOffset+toCopy),copied);copied+=toCopy;_this2._pageOffset+=toCopy;if(_this2._pageOffset===_this2._pageSize){_this2._pagePtr+=1;_this2._pageOffset=0}if(copied1&&_args4[1]!==undefined?_args4[1]:1;return _context4.abrupt("return",new Promise(function(){var _ref=_asyncToGenerator(_regeneratorRuntime.mark(function _callee3(resolve,reject){var _store$transaction3;var store,getCurrentPage,last,newContent,newSize,newMeta,pages,i,keyRange,_store$transaction4;return _regeneratorRuntime.wrap(function _callee3$(_context3){while(1)switch(_context3.prev=_context3.next){case 0:if(!(_this3._mode==="readonly")){_context3.next=3;break}reject(new Error("Instance is readonly mode only."));return _context3.abrupt("return");case 3:if(!(typeof version!=="number"&&version<=0)){_context3.next=6;break}reject(new Error("Version should be a positive number"));return _context3.abrupt("return");case 6:store=_this3._store;getCurrentPage=function getCurrentPage(){return new Promise(function(res){var req=store.get("".concat(_this3._path,"-").concat(PvFileIDB.createPage(_this3._pagePtr)));req.onsuccess=function(){if(req.result!==undefined){res(req.result.slice(0,_this3._pageOffset))}else{res(new Uint8Array(0))}}})};_context3.next=10;return getCurrentPage();case 10:last=_context3.sent;newContent=new Uint8Array(last.length+content.length);newContent.set(last);newContent.set(content,last.length);newSize=_this3._pagePtr*_this3._pageSize+newContent.length;newMeta={size:newSize,numPages:Math.ceil(newSize/_this3._pageSize),version:version,pageSize:_this3._pageSize};store.put(newMeta,_this3._path);pages=Math.ceil(newContent.length/_this3._pageSize);for(i=0;i=this._meta.numPages-1&&this._pageOffset>=this._meta.size%this._pageSize}},{key:"_store",get:function get(){return this._db.transaction(PV_FILE_STORE,this._mode).objectStore(PV_FILE_STORE)}}],[{key:"open",value:function open(path,mode){if(!self.indexedDB){var error=new Error("IndexedDB is not supported");error.name="IndexedDBNotSupported";throw error}return new Promise(function(){var _ref3=_asyncToGenerator(_regeneratorRuntime.mark(function _callee7(resolve,reject){var db,req,_error2;return _regeneratorRuntime.wrap(function _callee7$(_context7){while(1)switch(_context7.prev=_context7.next){case 0:_context7.prev=0;_context7.next=3;return getDB();case 3:db=_context7.sent;req=db.transaction(PV_FILE_STORE,"readwrite").objectStore(PV_FILE_STORE).get(path);req.onerror=function(){reject(req.error)};req.onsuccess=function(){var meta=req.result;var dbMode=mode.includes("r")?"readonly":"readwrite";if(meta===undefined&&dbMode==="readonly"){var _error=new Error("'".concat(path,"' doesn't exist."));_error.name="FileNotExists";reject(_error);return}var fileIDB=new PvFileIDB(path,meta,db,dbMode);if(mode.includes("a")){fileIDB.seek(0,2)}resolve(fileIDB)};_context7.next=12;break;case 9:_context7.prev=9;_context7.t0=_context7["catch"](0);if(_context7.t0.name==="InvalidStateError"){_error2=new Error("IndexedDB is not supported");_error2.name="IndexedDBNotSupported";reject(_error2)}else{reject(_context7.t0)}case 12:case"end":return _context7.stop()}},_callee7,null,[[0,9]])}));return function(_x8,_x9){return _ref3.apply(this,arguments)}}())}},{key:"createPage",value:function createPage(page){return("00000"+page).slice(-6)}}])}(PvFile);function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}var PvFileMem=function(_PvFile){function PvFileMem(path,meta,db,mode){var _this;_classCallCheck(this,PvFileMem);_this=_callSuper(this,PvFileMem);_this._pos=0;_this._path=path;_this._meta=meta;_this._mode=mode;return _this}_inherits(PvFileMem,_PvFile);return _createClass(PvFileMem,[{key:"close",value:function close(){return}},{key:"read",value:function read(size,count){if(!this.exists()){throw new Error("'".concat(this._path,"' doesn't exist."))}if(this._isEOF){var err=new Error("EOF");err.name="EndOfFile";throw err}var toCopy=Math.min(size*count,this._file.length-this._pos);var totalElems=toCopy-toCopy%size;var buffer=new Uint8Array(totalElems);buffer.set(this._file.slice(this._pos,this._pos+totalElems),0);this._pos+=totalElems;return buffer}},{key:"write",value:function write(content){var version=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;var newFile=new Uint8Array(this._pos+content.length);if(this._file!==undefined){newFile.set(this._file.slice(0,this._pos));newFile.set(content,this._pos)}else{newFile.set(content)}this._file=newFile;this._pos+=content.length}},{key:"seek",value:function seek(offset,whence){if(!this.exists()&&this._mode==="readonly"){throw new Error("'".concat(this._path,"' doesn't exist."))}if(!this.exists()){throw new Error("'".concat(this._path,"' doesn't exist."))}if(offset<0){var err=new Error("EOF");err.name="EndOfFile";throw err}var newOffset;if(whence===0){newOffset=Math.min(offset,this._file.length)}else if(whence===1){newOffset=Math.min(this._pos+offset,this._file.length)}else if(whence===2){newOffset=Math.min(this._file.length+offset,this._file.length)}else{throw new Error("Invalid operation: ".concat(whence,"."))}this._pos=newOffset}},{key:"tell",value:function tell(){if(!this.exists()){return-1}return this._pos}},{key:"remove",value:function(){var _remove=_asyncToGenerator(_regeneratorRuntime.mark(function _callee(){return _regeneratorRuntime.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:if(this.exists()){_context.next=2;break}throw new Error("ENOENT");case 2:PvFileMem._memFiles["delete"](this._path);this._pos=0;case 4:case"end":return _context.stop()}},_callee,this)}));function remove(){return _remove.apply(this,arguments)}return remove}()},{key:"exists",value:function exists(){return this._file!==undefined}},{key:"_isEOF",get:function get(){return this._pos>=this._file.length}},{key:"_file",get:function get(){return PvFileMem._memFiles.get(this._path)},set:function set(content){PvFileMem._memFiles.set(this._path,content)}}],[{key:"open",value:function open(path,mode){var file=PvFileMem._memFiles.get(path);var dbMode=mode.includes("r")?"readonly":"readwrite";if(file===undefined&&dbMode==="readonly"){var error=new Error("'".concat(path,"' doesn't exist."));error.name="FileNotExists";throw error}var fileMem=new PvFileMem(path,undefined,undefined,dbMode);if(mode.includes("a")){fileMem.seek(0,2)}return fileMem}}])}(PvFile);PvFileMem._memFiles=new Map;function unsignedAddress(address){if(address<0){return address>>>0}return address}function _arrayWithHoles(r){if(Array.isArray(r))return r}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayLikeToArray$2(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _unsupportedIterableToArray$1(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray$1(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray$1(r,a):void 0}}function _arrayLikeToArray$1(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e=16){this.endComputePass();this.flushCommandEncoder()}}},{key:"endComputePass",value:function endComputePass(){if(this._passEncoder){this._passEncoder.end();this._passEncoder=null}}},{key:"getBuffer",value:function getBuffer(sizeBytes,usage){var mappedAtCreation=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var label=arguments.length>3?arguments[3]:undefined;var key=this.getBufferKey(sizeBytes,usage);if(this.bufferReusePool.has(key)){var buffers=this.bufferReusePool.get(key);if(buffers&&buffers.length>0){return buffers.pop()}}return this.device.createBuffer({size:sizeBytes*Uint8Array.BYTES_PER_ELEMENT,usage:usage,mappedAtCreation:mappedAtCreation,label:label})}},{key:"scheduleUniformBufferForRelease",value:function scheduleUniformBufferForRelease(buffer){this._uniformBuffersPendingRelease.push(buffer)}},{key:"releaseBuffer",value:function releaseBuffer(buffer){var clearBuffer=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;if(clearBuffer){this.endComputePass();this.commandEncoder.clearBuffer(buffer,0,buffer.size)}var key=this.getBufferKey(buffer.size,buffer.usage);if(!this.bufferReusePool.has(key)){this.bufferReusePool.set(key,[])}this.bufferReusePool.get(key).push(buffer)}},{key:"sync",value:function(){var _sync=_asyncToGenerator(_regeneratorRuntime.mark(function _callee(){var _this=this;var _iterator,_step,k,buffers,_iterator3,_step3,b,_loop,_i,_Object$entries;return _regeneratorRuntime.wrap(function _callee$(_context3){while(1)switch(_context3.prev=_context3.next){case 0:this.endComputePass();this.flushCommandEncoder();_context3.next=4;return this.device.queue.onSubmittedWorkDone();case 4:_iterator=_createForOfIteratorHelper$1(this.bufferReusePool.keys());try{for(_iterator.s();!(_step=_iterator.n()).done;){k=_step.value;buffers=this.bufferReusePool.get(k);if(buffers&&buffers.length>0){_iterator3=_createForOfIteratorHelper$1(buffers);try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){b=_step3.value;b===null||b===void 0||b.destroy()}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}}}}catch(err){_iterator.e(err)}finally{_iterator.f()}this.bufferReusePool.clear();_loop=_regeneratorRuntime.mark(function _loop(){var _Object$entries$_i,shaderName,timestampBuffers,_iterator2,_step2,_loop2;return _regeneratorRuntime.wrap(function _loop$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:_Object$entries$_i=_slicedToArray(_Object$entries[_i],2),shaderName=_Object$entries$_i[0],timestampBuffers=_Object$entries$_i[1];if(!_this.shaderTimes[shaderName]){_this.shaderTimes[shaderName]=[]}_iterator2=_createForOfIteratorHelper$1(timestampBuffers);_context2.prev=3;_loop2=_regeneratorRuntime.mark(function _loop2(){var timestampBuffer;return _regeneratorRuntime.wrap(function _loop2$(_context){while(1)switch(_context.prev=_context.next){case 0:timestampBuffer=_step2.value;timestampBuffer.mapAsync(GPUMapMode.READ).then(function(){var times=new BigInt64Array(timestampBuffer.getMappedRange());var timeDif=times[1]-times[0];timestampBuffer.unmap();timestampBuffer.destroy();_this.shaderTimes[shaderName].push(timeDif)});case 2:case"end":return _context.stop()}},_loop2)});_iterator2.s();case 6:if((_step2=_iterator2.n()).done){_context2.next=10;break}return _context2.delegateYield(_loop2(),"t0",8);case 8:_context2.next=6;break;case 10:_context2.next=15;break;case 12:_context2.prev=12;_context2.t1=_context2["catch"](3);_iterator2.e(_context2.t1);case 15:_context2.prev=15;_iterator2.f();return _context2.finish(15);case 18:case"end":return _context2.stop()}},_loop,null,[[3,12,15,18]])});_i=0,_Object$entries=Object.entries(this.timestampBuffers);case 9:if(!(_i<_Object$entries.length)){_context3.next=14;break}return _context3.delegateYield(_loop(),"t0",11);case 11:_i++;_context3.next=9;break;case 14:this.timestampBuffers={};case 15:case"end":return _context3.stop()}},_callee,this)}));function sync(){return _sync.apply(this,arguments)}return sync}()},{key:"reportShaderTimes",value:function reportShaderTimes(){for(var _i2=0,_Object$entries2=Object.entries(this.shaderTimes);_i2<_Object$entries2.length;_i2++){var _Object$entries2$_i=_slicedToArray(_Object$entries2[_i2],2),shaderName=_Object$entries2$_i[0],shaderTimes=_Object$entries2$_i[1];var timeSum=0n;var _iterator4=_createForOfIteratorHelper$1(shaderTimes),_step4;try{for(_iterator4.s();!(_step4=_iterator4.n()).done;){var shaderTime=_step4.value;timeSum=timeSum+shaderTime}}catch(err){_iterator4.e(err)}finally{_iterator4.f()}var totalSeconds=Number(timeSum)*1e-9;var avgSeconds=(totalSeconds/shaderTimes.length).toFixed(7);console.log("".concat(shaderName,", ").concat(totalSeconds.toFixed(5),", ").concat(avgSeconds))}this.shaderTimes={}}},{key:"flushCommandEncoder",value:function flushCommandEncoder(){var _this2=this;this.device.queue.submit([this.commandEncoder.finish()]);this._commandEncoder=null;this._numCommandsEncoded=0;this._stageBuffersPendingMap.forEach(function(buffer){buffer.destroy()});this._stageBuffersPendingMap=[];this._uniformBuffersPendingRelease.forEach(function(buffer){_this2.releaseBuffer(buffer,false)});this._uniformBuffersPendingRelease=[]}},{key:"writeBuffer",value:function writeBuffer(sizeBytes,offset,srcArray,dstBuffer){var stagingBuffer=this.getBuffer(sizeBytes,GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC,true);new Uint8Array(stagingBuffer.getMappedRange()).set(srcArray);stagingBuffer.unmap();this._stageBuffersPendingMap.push(stagingBuffer);this.endComputePass();this.commandEncoder.copyBufferToBuffer(stagingBuffer,0,dstBuffer,offset,sizeBytes);this.numCommandsEncoded++}},{key:"dispatchComputerShader",value:function dispatchComputerShader(bindGroup,pipeline,shaderName,workgroupCountX,workgroupCountY,workgroupCountZ){if(this.isTimerEnabled){var querySet=this.device.createQuerySet({type:"timestamp",count:2});var timestampWrites={querySet:querySet,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1};this.endComputePass();this._passEncoder=this.commandEncoder.beginComputePass({timestampWrites:timestampWrites});this._passEncoder.setBindGroup(0,bindGroup);this._passEncoder.setPipeline(pipeline);this._passEncoder.dispatchWorkgroups(workgroupCountX,workgroupCountY,workgroupCountZ);this.endComputePass();var size=2*BigInt64Array.BYTES_PER_ELEMENT;var resolveBuffer=this.device.createBuffer({size:size,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC});this.commandEncoder.resolveQuerySet(querySet,0,2,resolveBuffer,0);var resultBuffer=this.device.createBuffer({size:size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});this.commandEncoder.copyBufferToBuffer(resolveBuffer,0,resultBuffer,0,size);if(!this.timestampBuffers[shaderName]){this.timestampBuffers[shaderName]=[]}this.timestampBuffers[shaderName].push(resultBuffer);this.numCommandsEncoded+=3}else{if(!this._passEncoder){this._passEncoder=this.commandEncoder.beginComputePass()}this._passEncoder.setBindGroup(0,bindGroup);this._passEncoder.setPipeline(pipeline);this._passEncoder.dispatchWorkgroups(workgroupCountX,workgroupCountY,workgroupCountZ);this.numCommandsEncoded++}}}])}();var PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE=256;var gpuDevices=new Map;var gpuBuffers=new Map;var emptyShader="\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main_empty() {}\n";var shaderEntryPoint="main";var PRECOMPUTE_ENCODING_SHADER_NAME="pv_picollm_attention_precompute_encoding_shader";var attentionPrecomputeEncodingShaderSource="\nstruct argsStruct {\n dimension: u32,\n steps: u32,\n theta: f32,\n encoding_offset: u32,\n rope_scale: f32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar encoding: array;\n\n@group(0) @binding(2)\nvar rope_scales: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3,\n @builtin(num_workgroups) num_workgroups: vec3\n) {\n let ts = workgroup_id.x;\n let ds = local_id.x;\n \n for (var t = ts; t < args.steps; t += num_workgroups.x) {\n for (var d = ds; d < (args.dimension / 2u); d += workgroup_size_x) {\n let f = 2u * d;\n let x = f32(t) / (f32(rope_scales[f >> 1]) * pow(args.theta, f32(f) / f32(args.dimension)));\n let encoding_idx = args.encoding_offset + (t * args.dimension) + f;\n encoding[encoding_idx] = cos(x) * args.rope_scale;\n encoding[encoding_idx + 1] = sin(x) * args.rope_scale;\n }\n }\n}\n\n".concat(emptyShader);var loadAttentionPrecomputeEncodingShader=function loadAttentionPrecomputeEncodingShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention precompute encoding bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention precompute encoding pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention precompute encoding shader module",code:attentionPrecomputeEncodingShaderSource});var computePipeline=device.createComputePipeline({label:"attention precompute encoding pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ENCODE_ROPE_INTERLEAVED_SHADER_NAME="pv_picollm_attention_encode_rope_interleaved_shader";var attentionEncodeRopeInterleavedShaderSource="\nstruct argsStruct { \n n: u32,\n num_heads: u32,\n head_dimension: u32,\n rope_dimension: u32,\n position: u32,\n encoding_offset: u32,\n x_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar encoding: array;\n\n@group(0) @binding(2)\nvar x: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3,\n @builtin(num_workgroups) num_workgroups: vec3\n) {\n let ts = workgroup_id.x;\n let h = workgroup_id.y;\n let ds = local_id.x;\n\n for (var t = ts; t < args.n; t += num_workgroups.x) {\n let x_start = args.x_offset + (t * args.num_heads + h) * args.head_dimension;\n let encoding_start = args.encoding_offset + ((t + args.position) * args.rope_dimension); \n for (var d = ds; d < (args.head_dimension / 2u); d += workgroup_size_x) {\n let i = 2u * d;\n let x_idx = x_start + i;\n let encoding_idx = encoding_start + i;\n \n let re = x[x_idx];\n let im = x[x_idx + 1];\n x[x_idx] = (re * encoding[encoding_idx]) - (im * encoding[encoding_idx + 1]);\n x[x_idx + 1] = (re * encoding[encoding_idx + 1]) + (im * encoding[encoding_idx]);\n }\n }\n}\n\n".concat(emptyShader);var loadAttentionEncodeRopeInterleavedShader=function loadAttentionEncodeRopeInterleavedShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention encode rope interleave bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention encode rope interleave pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention encode rope interleave shader module",code:attentionEncodeRopeInterleavedShaderSource});var computePipeline=device.createComputePipeline({label:"attention encode rope interleave pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ENCODE_SHADER_NAME="pv_picollm_attention_encode_shader";var attentionEncodeShaderSource="\nstruct argsStruct { \n n: u32,\n num_heads: u32,\n head_dimension: u32,\n rope_dimension: u32,\n position: u32,\n encoding_offset: u32,\n x_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar encoding: array;\n\n@group(0) @binding(2)\nvar x: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3,\n @builtin(num_workgroups) num_workgroups: vec3\n) {\n let ts = workgroup_id.x;\n let h = workgroup_id.y;\n let ds = local_id.x;\n\n for (var t = ts; t < args.n; t += num_workgroups.x) {\n let half_rope = (args.rope_dimension / 2);\n let xr_start = args.x_offset + ((t * args.num_heads + h) * args.head_dimension);\n let xi_start = xr_start + half_rope;\n let encoding_start = args.encoding_offset + ((t + args.position) * args.rope_dimension); \n for (var d = ds; d < half_rope; d += workgroup_size_x) {\n let xr_idx = xr_start + d;\n let xi_idx = xi_start + d;\n let encoding_idx = encoding_start + (2 * d);\n\n let re = x[xr_idx];\n let im = x[xi_idx];\n x[xr_idx] = (re * encoding[encoding_idx]) - (im * encoding[encoding_idx + 1]);\n x[xi_idx] = (re * encoding[encoding_idx + 1]) + (im * encoding[encoding_idx]);\n }\n }\n}\n\n".concat(emptyShader);var loadAttentionEncodeShader=function loadAttentionEncodeShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention encode bind layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention encode pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention encode shader",code:attentionEncodeShaderSource});var computePipeline=device.createComputePipeline({label:"attention encode pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var DOT_PRODUCT_SHADER_NAME="pv_picollm_attention_dot_product_shader";var attentionDotProductShaderSource="\nstruct argsStruct { \n n: u32,\n tq: u32,\n head_dimension: u32,\n num_heads: u32,\n num_kv_heads: u32,\n window_length: u32,\n start: u32,\n norm: f32,\n length1: u32,\n num_keys: u32,\n query_offset: u32,\n keys_offset: u32,\n key_intercepts_offset: u32,\n key_slopes_offset: u32,\n scores_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar query: array;\n\n@group(0) @binding(2)\nvar keys: array;\n\n@group(0) @binding(3)\nvar key_intercepts: array;\n\n@group(0) @binding(4)\nvar key_slopes: array;\n\n@group(0) @binding(5)\nvar scores: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.num_heads) {\n return;\n }\n\n let head = global_id.x / (args.num_heads / args.num_kv_heads);\n \n let head_offset = head * args.window_length;\n let start_index = head_offset + args.start;\n \n let keys_local_a = args.keys_offset + (start_index * args.head_dimension);\n let key_intercepts_local_a = args.key_intercepts_offset + start_index; \n let key_slopes_local_a = args.key_slopes_offset + start_index;\n \n let keys_local_b = args.keys_offset + (head_offset * args.head_dimension);\n let key_intercepts_local_b = args.key_intercepts_offset + head_offset; \n let key_slopes_local_b = args.key_slopes_offset + head_offset;\n \n let scores_local = args.scores_offset + (global_id.x * args.num_keys);\n let query_local = args.query_offset + (((global_id.x * args.n) + args.tq) * args.head_dimension);\n \n for (var i = 0u; i < args.head_dimension; i++) { \n for (var k = 0u; k < args.num_keys; k++) {\n if (k < args.length1) { \n let key_idx = keys_local_a + (k * args.head_dimension) + i;\n let key_val = f32(extractBits(keys[key_idx / 4], (i * 8u) % 32u, 8u));\n let tmp = query[query_local + i] * (key_intercepts[key_intercepts_local_a + k] + (key_slopes[key_slopes_local_a + k] * key_val));\n scores[scores_local + k] += tmp;\n }\n else {\n let j = k - args.length1;\n let key_idx = keys_local_b + (j * args.head_dimension) + i;\n let key_val = f32(extractBits(keys[key_idx / 4], (i * 8u) % 32u, 8u));\n let tmp = query[query_local + i] * (key_intercepts[key_intercepts_local_b + j] + (key_slopes[key_slopes_local_b + j] * key_val));\n scores[scores_local + k] += tmp;\n }\n } \n }\n \n for (var k = 0u; k < args.num_keys; k++) {\n scores[scores_local + k] *= args.norm;\n }\n}\n\n".concat(emptyShader);var loadAttentionDotProductShader=function loadAttentionDotProductShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention dot product bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention dot product pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention dot product shader module",code:attentionDotProductShaderSource});var computePipeline=device.createComputePipeline({label:"attention dot product pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var SOFTMAX_SHADER_NAME="pv_picollm_attention_softmax_shader";var attentionSoftmaxShaderSource="\nstruct argsStruct { \n num_heads: u32,\n num_keys: u32,\n scores_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar scores: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.num_heads) {\n return;\n }\n\n let scores_start = args.scores_offset + (global_id.x * args.num_keys);\n \n var max_index: u32 = 0;\n for (var i = 1u; i < args.num_keys; i++) {\n if (scores[scores_start + i] > scores[scores_start + max_index]) {\n max_index = i;\n }\n }\n let max: f32 = scores[scores_start + max_index];\n\n var sum: f32 = 0.0;\n for (var i = 0u; i < args.num_keys; i++) {\n scores[scores_start + i] = exp(scores[scores_start + i] - max);\n sum += scores[scores_start + i];\n }\n\n for (var i = 0u; i < args.num_keys; i++) {\n scores[scores_start + i] /= sum;\n }\n}\n\n".concat(emptyShader);var loadAttentionSoftmaxShader=function loadAttentionSoftmaxShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention softmax bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention softmax pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention softmax shader module",code:attentionSoftmaxShaderSource});var computePipeline=device.createComputePipeline({label:"attention softmax pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var FIR_SHADER_NAME="pv_picollm_attention_fir_shader";var attentionFirShaderSource="\nstruct argsStruct { \n length1: u32,\n length2: u32,\n tq: u32,\n head_dimension: u32,\n num_heads: u32,\n num_kv_heads: u32,\n window_length: u32,\n start: u32,\n values_offset: u32,\n value_intercepts_offset: u32,\n value_slopes_offset: u32,\n scores_offset: u32,\n output_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar values: array;\n\n@group(0) @binding(2)\nvar value_intercepts: array;\n\n@group(0) @binding(3)\nvar value_slopes: array;\n\n@group(0) @binding(4)\nvar scores: array;\n\n@group(0) @binding(5)\nvar output: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.num_heads) {\n return;\n }\n\n let head = global_id.x / (args.num_heads / args.num_kv_heads);\n\n let head_offset = head * args.window_length;\n let start_index = head_offset + args.start;\n\n let values_local_a = args.values_offset + (start_index * args.head_dimension);\n let value_intercepts_local_a = args.value_intercepts_offset + start_index;\n let value_slopes_local_a = args.value_slopes_offset + start_index;\n let values_local_b = args.values_offset + (head_offset * args.head_dimension);\n let value_intercepts_local_b = args.value_intercepts_offset + head_offset;\n let value_slopes_local_b = args.value_slopes_offset + head_offset;\n let scores_local = args.scores_offset + (global_id.x * (args.length1 + args.length2));\n let output_local = args.output_offset + (((args.tq * args.num_heads) + global_id.x) * args.head_dimension);\n\n for (var i = 0u; i < args.head_dimension; i++) {\n var tmp: f32 = 0.0;\n for (var k = 0u; k < args.length1; k++) {\n let value_idx = values_local_a + (k * args.head_dimension) + i;\n let value_val = f32(extractBits(values[value_idx / 4], (i * 8u) % 32u, 8u));\n tmp += scores[scores_local + k] * (value_intercepts[value_intercepts_local_a + k] + (value_slopes[value_slopes_local_a + k] * value_val)); \n }\n for (var k = 0u; k < args.length2; k++) {\n let value_idx = values_local_b + (k * args.head_dimension) + i;\n let value_val = f32(extractBits(values[value_idx / 4], (i * 8u) % 32u, 8u));\n tmp += scores[scores_local + args.length1 + k] * (value_intercepts[value_intercepts_local_b + k] + (value_slopes[value_slopes_local_b + k] * value_val)); \n }\n output[output_local + i] = tmp;\n }\n}\n\n".concat(emptyShader);var loadAttentionFirShader=function loadAttentionFirShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention fir bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention fir pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention fir shader module",code:attentionFirShaderSource});var computePipeline=device.createComputePipeline({label:"attention fir pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var UPDATE_KV_SHADER_NAME="pv_picollm_attention_update_kv_shader";var attentionUpdateKvShaderSource="\nstruct argsStruct {\n n: u32,\n num_kv_heads: u32,\n window_length: u32,\n position: u32,\n head_dimension: u32,\n tf_offset: u32,\n kv_offset: u32,\n kv_intercepts_offset: u32,\n kv_slopes_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar tf: array;\n\n@group(0) @binding(2)\nvar kv: array;\n\n@group(0) @binding(3)\nvar kv_intercepts: array;\n\n@group(0) @binding(4)\nvar kv_slopes: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) { \n if (global_id.x >= args.num_kv_heads) {\n return;\n }\n \n for (var i = 0u; i < args.n; i++) {\n let index = (global_id.x * args.window_length) + ((args.position + i) % args.window_length);\n let tf_start = args.tf_offset + (((i * args.num_kv_heads) + global_id.x) * args.head_dimension);\n let kv_start = args.kv_offset + ((index * args.head_dimension) / 4);\n let kv_intercepts_start = args.kv_intercepts_offset + index;\n let kv_slopes_start = args.kv_slopes_offset + index;\n \n var xmax = tf[tf_start]; \n var xmin = tf[tf_start]; \n \n for (var j = 1u; j < args.head_dimension; j++) {\n xmax = max(xmax, tf[tf_start + j]);\n xmin = min(xmin, tf[tf_start + j]);\n }\n\n kv_intercepts[kv_intercepts_start] = xmin;\n kv_slopes[kv_slopes_start] = f32(xmax - xmin) / 255.0;\n\n for (var j = 0u; j < args.head_dimension; j++) {\n let kv_idx = kv_start + (j / 4);\n let kv_val = u32(round((tf[tf_start + j] - xmin) / kv_slopes[kv_slopes_start])); \n kv[kv_idx] = insertBits(kv[kv_idx], extractBits(kv_val, 0u, 8u), (j * 8u) % 32u, 8u); \n }\n }\n}\n\n".concat(emptyShader);var loadAttentionUpdateKvShader=function loadAttentionUpdateKvShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention update kv bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention update kv pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention update kv shader module",code:attentionUpdateKvShaderSource});var computePipeline=device.createComputePipeline({label:"attention update kv pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var TRANSPOSE_QUERY_SHADER_NAME="pv_picollm_attention_transpose_query_shader";var attentionTransposeQueryShaderSource="\nstruct argsStruct {\n n: u32,\n num_heads: u32,\n head_dimension: u32,\n tf_offset: u32,\n hf_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar tf: array;\n\n@group(0) @binding(2)\nvar hf: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(local_invocation_id) local_id : vec3\n) {\n\n if (workgroup_id.x >= args.num_heads || workgroup_id.y >= args.n || local_id.x >= args.head_dimension) {\n return;\n }\n \n let tf_idx = args.tf_offset + (workgroup_id.y * args.num_heads * args.head_dimension) + (workgroup_id.x * args.head_dimension) + local_id.x; \n let hf_idx = args.hf_offset + (workgroup_id.x * args.n * args.head_dimension) + (workgroup_id.y * args.head_dimension) + local_id.x; \n hf[hf_idx] = tf[tf_idx];\n}\n\n".concat(emptyShader);var loadAttentionTransposeQueryShader=function loadAttentionTransposeQueryShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention transpose query bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention transpose query pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention transpose query shader module",code:attentionTransposeQueryShaderSource});var computePipeline=device.createComputePipeline({label:"attention transpose query pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var attentionShaders=_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({},PRECOMPUTE_ENCODING_SHADER_NAME,loadAttentionPrecomputeEncodingShader),ENCODE_ROPE_INTERLEAVED_SHADER_NAME,loadAttentionEncodeRopeInterleavedShader),ENCODE_SHADER_NAME,loadAttentionEncodeShader),DOT_PRODUCT_SHADER_NAME,loadAttentionDotProductShader),SOFTMAX_SHADER_NAME,loadAttentionSoftmaxShader),FIR_SHADER_NAME,loadAttentionFirShader),UPDATE_KV_SHADER_NAME,loadAttentionUpdateKvShader),TRANSPOSE_QUERY_SHADER_NAME,loadAttentionTransposeQueryShader);var SILU_SHADER_NAME="pv_picollm_feed_forward_silu_shader";var feedForwardSiluShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n x[global_id.x] = x[global_id.x] / (1.0 + exp(-x[global_id.x]));\n}\n\n".concat(emptyShader);var loadFeedForwardSiluShader=function loadFeedForwardSiluShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff silu bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff silu pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff silu shader module",code:feedForwardSiluShaderSource});var computePipeline=device.createComputePipeline({label:"ff silu pipline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var GELU_SHADER_NAME="pv_picollm_feed_forward_gelu_shader";var feedForwardGeluShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\nconst a1: f32 = 0.254829592;\nconst a2: f32 = -0.284496736;\nconst a3: f32 = 1.421413741;\nconst a4: f32 = -1.453152027;\nconst a5: f32 = 1.061405429;\nconst p: f32 = 0.3275911;\n\n// A&S formula 7.1.26\nfn erf(x: f32) -> f32 { \n var sign: f32 = 1.0;\n if (x < 0) {\n sign = -1.0;\n }\n var x_abs: f32 = abs(x);\n \n let t: f32 = 1.0 / fma(p, x_abs, 1.0);\n let y: f32 = 1.0 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * exp(-x_abs * x_abs);\n\n return sign * y;\n}\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n x[global_id.x] = 0.5 * x[global_id.x] * (1.0 + erf(x[global_id.x] * 0.7071067811865475));\n}\n\n".concat(emptyShader);var loadFeedForwardGeluShader=function loadFeedForwardGeluShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff gelu bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff gelu pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff gelu shader module",code:feedForwardGeluShaderSource});var computePipeline=device.createComputePipeline({label:"ff gelu pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ALMOST_GELU_SHADER_NAME="pv_picollm_feed_forward_almost_gelu_shader";var feedForwardAlmostGeluShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n x[global_id.x] = 0.5 * x[global_id.x] * (1 + tanh(0.7978845608028654 * (x[global_id.x] + (0.044715f * x[global_id.x] * x[global_id.x] * x[global_id.x]))));\n}\n\n".concat(emptyShader);var loadFeedForwardAlmostGeluShader=function loadFeedForwardAlmostGeluShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff almost gelu bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff almost gelu pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff almost gelu shader module",code:feedForwardAlmostGeluShaderSource});var computePipeline=device.createComputePipeline({label:"ff almost gelu pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var MULTIPLY_BUFFERS_SHADER_NAME="pv_picollm_feed_forward_multiply_buffers_shader";var feedForwardMultiplyBuffersShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n y[global_id.x] *= x[global_id.x];\n}\n\n".concat(emptyShader);var loadFeedForwardMultiplyBuffersShader=function loadFeedForwardMultiplyBuffersShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff multiply buffers bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff multiply buffers pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff multiply buffers shader module",code:feedForwardMultiplyBuffersShaderSource});var computePipeline=device.createComputePipeline({label:"ff multiply buffers pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var feedForwardShaders=_defineProperty(_defineProperty(_defineProperty(_defineProperty({},SILU_SHADER_NAME,loadFeedForwardSiluShader),GELU_SHADER_NAME,loadFeedForwardGeluShader),ALMOST_GELU_SHADER_NAME,loadFeedForwardAlmostGeluShader),MULTIPLY_BUFFERS_SHADER_NAME,loadFeedForwardMultiplyBuffersShader);var FORWARD_SHADER_NAME$1="pv_picollm_gate_forward_shader";var gateForwardShaderSource="\n\nstruct pv_picollm_gate_ix_t {\n i: u32,\n x: f32,\n}\n\n@group(0) @binding(0)\nvar y: array;\n\n@group(0) @binding(1)\nvar indices: array;\n\n@group(0) @binding(2)\nvar weights: array;\n\noverride n: u32 = 0;\noverride k: u32 = 0;\noverride num_experts: u32 = 0;\n\noverride y_offset: u32 = 0;\noverride indices_offset: u32 = 0;\noverride weights_offset: u32 = 0;\n\nvar ixs: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(global_invocation_id) global_id : vec3\n) {\n if (global_id.x >= n) {\n return;\n }\n \n var y_start: u32 = y_offset + global_id.x * num_experts;\n for (var j = 0u; j < num_experts; j++) {\n ixs[j].i = j;\n ixs[j].x = y[y_start + j];\n }\n\n for (var i = 0u; i < num_experts - 1; i++) {\n for (var j = 0u; j < num_experts - i - 1; j++) {\n if (ixs[j].x < ixs[j + 1].x) {\n let tmp = ixs[j];\n ixs[j] = ixs[j + 1];\n ixs[j + 1] = tmp;\n }\n }\n }\n\n for (var j = 0u; j < k; j++) {\n indices[indices_offset + (global_id.x * k) + j] = ixs[j].i;\n weights[weights_offset + (global_id.x * k) + j] = ixs[j].x;\n }\n\n var max_weight: f32 = weights[weights_offset + (global_id.x * k)];\n for (var j = 1u; j < k; j++) {\n max_weight = max(max_weight, weights[weights_offset + (global_id.x * k) + j]);\n }\n\n var sum_weight: f32 = 0.0;\n for (var j = 0u; j < k; j++) {\n weights[weights_offset + (global_id.x * k) + j] = exp(weights[weights_offset + (global_id.x * k) + j] - max_weight);\n sum_weight += weights[weights_offset + (global_id.x * k) + j];\n }\n\n for (var j = 0u; j < k; j++) {\n weights[weights_offset + (global_id.x * k) + j] /= sum_weight;\n }\n}\n\n".concat(emptyShader);var loadGateForwardShader=function loadGateForwardShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"gate forward bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"gate forward pipeline",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"gate forward shader module",code:gateForwardShaderSource});var computePipeline=device.createComputePipeline({layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{num_experts:1}}});return{computePipeline:computePipeline,pipelineLayout:pipelineLayout,shaderModule:shaderModule}};var gateForwardShader=_defineProperty({},FORWARD_SHADER_NAME$1,loadGateForwardShader);var ADD_TO_BUFFER_SHADER_NAME$1="pv_picollm_moe_transformer_add_to_buffer_shader";var moeTransformerAddToBufferShaderSource="\nstruct argsStruct {\n n: u32, \n x_offset: u32,\n buffer_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar buffer: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n\n buffer[args.buffer_offset + global_id.x] += x[args.x_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadMoeTransformerAddToBufferShader=function loadMoeTransformerAddToBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"moe transformer add to buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"moe transformer add to buffer pipeline",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"moe transformer add to buffer shader module",code:moeTransformerAddToBufferShaderSource});var computePipeline=device.createComputePipeline({label:"moe transformer add to buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER_SHADER_NAME="pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer_shader";var moeTransformerMultiplyWeightAndToBufferShaderSource="\nstruct argsStruct {\n n: u32, \n weights_index: u32,\n y_index: u32,\n weights_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weights: array;\n\n@group(0) @binding(2)\nvar x: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n y[args.y_offset + args.y_index + global_id.x] += weights[args.weights_index] + x[args.x_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadMoeTransformerMultiplyWeightAndAddToBufferShader=function loadMoeTransformerMultiplyWeightAndAddToBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"moe transformer multiply weight and add to buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"moe transformer multiply weight and add to buffer pipeline",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"moe transformer multiply weight and add to buffer shader module",code:moeTransformerMultiplyWeightAndToBufferShaderSource});var computePipeline=device.createComputePipeline({label:"moe transformer multiply weight and add to buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var ADD_BUFFERS_SHADER_NAME$1="pv_picollm_moe_transformer_add_buffers_shader";var moeTransformerAddBuffersShaderSource="\nstruct argsStruct {\n n: u32, \n buffer1_offset: u32,\n buffer2_offset: u32,\n y_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar buffer1: array;\n\n@group(0) @binding(2)\nvar buffer2: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n y[args.y_offset + global_id.x] = buffer1[args.buffer1_offset + global_id.x] + buffer2[args.buffer2_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadMoeTransformerAddBuffersShader=function loadMoeTransformerAddBuffersShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"moe transformer add buffers bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"moe transformer add buffers pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"moe transformer add buffers shader module",code:moeTransformerAddBuffersShaderSource});var computePipeline=device.createComputePipeline({label:"moe transformer add buffers pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var moeTransformerForwardShaders=_defineProperty(_defineProperty(_defineProperty({},ADD_TO_BUFFER_SHADER_NAME$1,loadMoeTransformerAddToBufferShader),MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER_SHADER_NAME,loadMoeTransformerMultiplyWeightAndAddToBufferShader),ADD_BUFFERS_SHADER_NAME$1,loadMoeTransformerAddBuffersShader);var sdataReduce="\n for (var s: u32 = workgroup_size_x / 2; s > 0; s >>= 1) {\n if tid < s {\n sdata[tid] += sdata[tid + s];\n }\n workgroupBarrier();\n }\n";var dividePadFunction="\n fn divide_pad(a: u32, b: u32) -> u32 { \n return (a + b - 1) / b;\n }\n";var FORWARD_MULTI_BUFFER_SHADER_NAME$1="pv_picollm_norm_forward_multi_buffer_shader";var FORWARD_SINGLE_BUFFER_SHADER_NAME$1="pv_picollm_norm_forward_single_buffer_shader";var normForwardShaderSource=function normForwardShaderSource(isMulti){return"\nstruct argsStruct {\n n: u32,\n dimension: u32,\n remainder: u32,\n remainder_start: u32, \n eps: f32, \n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weight: array;\n\n".concat(isMulti?"\n@group(0) @binding(2)\nvar x: array;\n\n@group(0) @binding(3) \nvar y: array;\n":" \n@group(0) @binding(2)\nvar x: array;\n","\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\nvar sdata: array, workgroup_size_x>;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3\n) {\n let tid = local_id.x;\n let m = workgroup_id.x;\n let block_size = workgroup_size_x;\n \n var power_vec: vec4;\n let x_start: u32 = args.x_offset + (m * args.dimension);\n let skip = tid * 4;\n let shift = (block_size * 4);\n for (var j = 0u; j + skip < args.remainder_start; j += shift) {\n let local_index = x_start + j + skip; \n\n let x_vec = vec4(\n x[local_index],\n x[local_index + 1],\n x[local_index + 2],\n x[local_index + 3]);\n \n power_vec += x_vec * x_vec; \n } \n \n if (tid == 0 && args.remainder > 0) {\n var remainder_vec = vec4(0.0, 0.0, 0.0, 0.0);\n let x_idx = x_start + args.remainder_start;\n for (var j = 0u; j < args.remainder; j++) { \n remainder_vec[j] = x[x_idx + j];\n } \n power_vec += remainder_vec * remainder_vec;\n }\n \n sdata[tid] = power_vec;\n workgroupBarrier();\n\n ").concat(sdataReduce,"\n \n let power = sdata[0].x + sdata[0].y + sdata[0].z + sdata[0].w;\n let norm: vec4 = vec4(1.0 / sqrt((power / f32(args.dimension)) + args.eps));\n \n let y_start: u32 = args.y_offset + (m * args.dimension);\n for (var j = 0u; j + skip < args.remainder_start; j += shift) {\n let local_index = j + skip;\n let x_idx = x_start + local_index;\n let x_vec = vec4(\n x[x_idx],\n x[x_idx + 1],\n x[x_idx + 2],\n x[x_idx + 3]);\n \n let weight_vec = vec4(\n weight[local_index],\n weight[local_index + 1],\n weight[local_index + 2],\n weight[local_index + 3]);\n let y_vec = x_vec * norm * weight_vec;\n \n let y_idx = y_start + local_index;\n").concat(isMulti?" \n y[y_idx] = y_vec.x;\n y[y_idx + 1] = y_vec.y;\n y[y_idx + 2] = y_vec.z;\n y[y_idx + 3] = y_vec.w;\n":" \n x[y_idx] = y_vec.x;\n x[y_idx + 1] = y_vec.y;\n x[y_idx + 2] = y_vec.z;\n x[y_idx + 3] = y_vec.w;\n"," \n }\n \n if (tid == 0 && args.remainder > 0) {\n let x_idx = x_start + args.remainder_start;\n let weight_idx = args.remainder_start; \n let y_idx = y_start + args.remainder_start;\n for (var j = 0u; j < args.remainder; j++) {\n").concat(isMulti?" \n y[y_idx + j] = x[x_idx + j] * norm[j] * weight[weight_idx + j];\n":" \n x[y_idx + j] = x[x_idx + j] * norm[j] * weight[weight_idx + j];\n"," \n } \n }\n}\n\n").concat(emptyShader)};var loadNormForwardShader=function loadNormForwardShader(device,isMulti){var entries=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}}];if(isMulti){entries.push({binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}});entries.push({binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}})}else{entries.push({binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}})}var bindGroupLayout=device.createBindGroupLayout({label:"norm forward ".concat(isMulti?"multi":"single"," buffer bind group layout"),entries:entries});var pipelineLayout=device.createPipelineLayout({label:"norm forward ".concat(isMulti?"multi":"single"," buffer pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"norm forward ".concat(isMulti?"multi":"single"," buffer shader module"),code:normForwardShaderSource(isMulti)});var computePipeline=device.createComputePipeline({label:"norm forward ".concat(isMulti?"multi":"single"," buffer pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var normForwardShader=_defineProperty(_defineProperty({},FORWARD_SINGLE_BUFFER_SHADER_NAME$1,function(device){return loadNormForwardShader(device,false)}),FORWARD_MULTI_BUFFER_SHADER_NAME$1,function(device){return loadNormForwardShader(device,true)});var FORWARD_MULTI_BUFFER_SHADER_NAME="pv_picollm_norm_layer_forward_multi_buffer_shader";var normLayerForwardMultiBufferShaderSource="\nstruct argsStruct {\n n: u32,\n dimension: u32,\n eps: f32,\n weight_offset: u32,\n bias_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weight: array;\n\n@group(0) @binding(2)\nvar bias: array;\n\n@group(0) @binding(3)\nvar x: array;\n\n@group(0) @binding(4)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n let x_start: u32 = args.x_offset + (global_id.x * args.dimension);\n\n var mean: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean += x[x_start + j];\n }\n mean /= f32(args.dimension);\n\n var mean2: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean2 += (x[x_start + j] - mean) * (x[x_start + j] - mean);\n }\n mean2 /= f32(args.dimension);\n\n var norm: f32 = 1.0 / sqrt(mean2 + args.eps);\n\n var y_start = args.y_offset + (global_id.x * args.dimension);\n for (var j = 0u; j < args.dimension; j++) {\n y[y_start + j] = ((x[x_start + j] - mean) * norm * weight[args.weight_offset + j]) + bias[args.bias_offset + j];\n }\n}\n\n".concat(emptyShader);var loadNormLayerForwardMultiBufferShader=function loadNormLayerForwardMultiBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"norm layer forward multi buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"norm layer forward multi buffer pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"norm layer forward multi buffer shader module",code:normLayerForwardMultiBufferShaderSource});var computePipeline=device.createComputePipeline({label:"norm layer forward multi buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var FORWARD_SINGLE_BUFFER_SHADER_NAME="pv_picollm_norm_layer_forward_single_buffer_shader";var normLayerForwardSingleBufferShaderSource="\nstruct argsStruct {\n n: u32,\n dimension: u32,\n eps: f32,\n weight_offset: u32,\n bias_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weight: array;\n\n@group(0) @binding(2)\nvar bias: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n let x_start: u32 = args.x_offset + (global_id.x * args.dimension);\n\n var mean: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean += y[x_start + j];\n }\n mean /= f32(args.dimension);\n\n var mean2: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean2 += (y[x_start + j] - mean) * (y[x_start + j] - mean);\n }\n mean2 /= f32(args.dimension);\n\n var norm: f32 = 1.0 / sqrt(mean2 + args.eps);\n\n var y_start = args.y_offset + (global_id.x * args.dimension);\n for (var j = 0u; j < args.dimension; j++) {\n y[y_start + j] = ((y[x_start + j] - mean) * norm * weight[args.weight_offset + j]) + bias[args.bias_offset + j];\n }\n}\n\n".concat(emptyShader);var loadNormLayerForwardSingleBufferShader=function loadNormLayerForwardSingleBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"norm layer forward single buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"norm layer forward single buffer pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"norm layer forward single buffer shader module",code:normLayerForwardSingleBufferShaderSource});var computePipeline=device.createComputePipeline({label:"norm layer forward single buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var normLayerForwardShader=_defineProperty(_defineProperty({},FORWARD_SINGLE_BUFFER_SHADER_NAME,loadNormLayerForwardSingleBufferShader),FORWARD_MULTI_BUFFER_SHADER_NAME,loadNormLayerForwardMultiBufferShader);var ADD_TO_BUFFER_SHADER_NAME="pv_picollm_transformer_add_to_buffer_shader";var transformerAddToBufferShaderSource="\nstruct argsStruct {\n n: u32,\n x_offset: u32,\n buffer_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar buffer: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n buffer[args.buffer_offset + global_id.x] += x[args.x_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadTransformerAddToBufferShader=function loadTransformerAddToBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"transformer add to buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"transformer add to buffer pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"transformer add to buffer shader module",code:transformerAddToBufferShaderSource});var computePipeline=device.createComputePipeline({label:"transformer add to buffer compute",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ADD_BUFFERS_SHADER_NAME="pv_picollm_transformer_add_buffers_shader";var transformerAddBuffersShaderSource="\n\nstruct argsStruct {\n n: u32,\n buffer1_offset: u32,\n buffer2_offset: u32,\n y_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar buffer1: array;\n\n@group(0) @binding(2)\nvar buffer2: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n y[args.y_offset + global_id.x] = buffer1[args.buffer1_offset + global_id.x] + buffer2[args.buffer2_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadTransformerAddBuffersShader=function loadTransformerAddBuffersShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"transformer add buffers bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"transformer add buffers pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"transformer add buffers shader module",code:transformerAddBuffersShaderSource});var computePipeline=device.createComputePipeline({label:"transformer add buffers pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var transformerForwardShaders=_defineProperty(_defineProperty({},ADD_TO_BUFFER_SHADER_NAME,loadTransformerAddToBufferShader),ADD_BUFFERS_SHADER_NAME,loadTransformerAddBuffersShader);var FORWARD_SHADER_NAME="pv_picollm_weight_float_forward_shader";var weightFloatForwardShaderSource="\n\nstruct argsStruct {\n nr: u32,\n nc: u32,\n w_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar w: array;\n\n@group(0) @binding(2)\nvar x: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(local_invocation_id) local_id : vec3\n) {\n if (local_id.x >= args.nr) {\n return;\n }\n let x_start: u32 = args.x_offset + (workgroup_id.x * args.nc);\n let y_idx: u32 = local_id.x + args.y_offset + (workgroup_id.x * args.nr);\n \n let w_start: u32 = args.w_offset + (local_id.x * args.nc);\n for (var j = 0u; j < args.nc; j++) {\n y[y_idx] += w[w_start + j] * x[x_start + j]; \n }\n}\n\n".concat(emptyShader);var loadWeightFloatForwardShader=function loadWeightFloatForwardShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight float forward bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight float forward pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight float forward shader module",code:weightFloatForwardShaderSource});var computePipeline=device.createComputePipeline({label:"weight float forward pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var weightFloatForwardShader=_defineProperty({},FORWARD_SHADER_NAME,loadWeightFloatForwardShader);var rowsPerBlock=16;var columnsPerBlock=8;var preprocessDim=16;var weightBlockSize=256;var unpackBlock128BitDepth3="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_3(packed_offset: u32) {\n let val_0 = blocks[packed_offset]; \n unpacked[0] = extractBits(val_0, 0u, 3u);\n unpacked[1] = extractBits(val_0, 3u, 3u);\n unpacked[2] = extractBits(val_0, 6u, 3u);\n unpacked[3] = extractBits(val_0, 9u, 3u);\n unpacked[4] = extractBits(val_0, 12u, 3u);\n unpacked[5] = extractBits(val_0, 15u, 3u);\n unpacked[6] = extractBits(val_0, 18u, 3u);\n unpacked[7] = extractBits(val_0, 21u, 3u);\n unpacked[8] = extractBits(val_0, 24u, 3u);\n unpacked[9] = extractBits(val_0, 27u, 3u);\n unpacked[10] = extractBits(val_0, 30u, 2u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[10] = insertBits(unpacked[10], extractBits(val_1, 0u, 1u), 2u, 1u);\n unpacked[11] = extractBits(val_1, 1u, 3u);\n unpacked[12] = extractBits(val_1, 4u, 3u);\n unpacked[13] = extractBits(val_1, 7u, 3u);\n unpacked[14] = extractBits(val_1, 10u, 3u);\n unpacked[15] = extractBits(val_1, 13u, 3u);\n unpacked[16] = extractBits(val_1, 16u, 3u);\n unpacked[17] = extractBits(val_1, 19u, 3u);\n unpacked[18] = extractBits(val_1, 22u, 3u);\n unpacked[19] = extractBits(val_1, 25u, 3u);\n unpacked[20] = extractBits(val_1, 28u, 3u);\n unpacked[21] = extractBits(val_1, 31u, 1u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[21] = insertBits(unpacked[21], extractBits(val_2, 0u, 2u), 1u, 2u); \n unpacked[22] = extractBits(val_2, 2u, 3u);\n unpacked[23] = extractBits(val_2, 5u, 3u);\n unpacked[24] = extractBits(val_2, 8u, 3u);\n unpacked[25] = extractBits(val_2, 11u, 3u);\n unpacked[26] = extractBits(val_2, 14u, 3u);\n unpacked[27] = extractBits(val_2, 17u, 3u);\n unpacked[28] = extractBits(val_2, 20u, 3u);\n unpacked[29] = extractBits(val_2, 23u, 3u);\n unpacked[30] = extractBits(val_2, 26u, 3u);\n unpacked[31] = extractBits(val_2, 29u, 3u);\n \n let val_3 = blocks[packed_offset + 3]; \n unpacked[32] = extractBits(val_3, 0u, 3u);\n unpacked[33] = extractBits(val_3, 3u, 3u);\n unpacked[34] = extractBits(val_3, 6u, 3u);\n unpacked[35] = extractBits(val_3, 9u, 3u);\n unpacked[36] = extractBits(val_3, 12u, 3u);\n unpacked[37] = extractBits(val_3, 15u, 3u);\n unpacked[38] = extractBits(val_3, 18u, 3u);\n unpacked[39] = extractBits(val_3, 21u, 3u);\n unpacked[40] = extractBits(val_3, 24u, 3u);\n unpacked[41] = extractBits(val_3, 27u, 3u);\n unpacked[42] = extractBits(val_3, 30u, 2u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[42] = insertBits(unpacked[42], extractBits(val_4, 0u, 1u), 2u, 1u);\n unpacked[43] = extractBits(val_4, 1u, 3u);\n unpacked[44] = extractBits(val_4, 4u, 3u);\n unpacked[45] = extractBits(val_4, 7u, 3u);\n unpacked[46] = extractBits(val_4, 10u, 3u);\n unpacked[47] = extractBits(val_4, 13u, 3u);\n unpacked[48] = extractBits(val_4, 16u, 3u);\n unpacked[49] = extractBits(val_4, 19u, 3u);\n unpacked[50] = extractBits(val_4, 22u, 3u);\n unpacked[51] = extractBits(val_4, 25u, 3u);\n unpacked[52] = extractBits(val_4, 28u, 3u);\n unpacked[53] = extractBits(val_4, 31u, 1u);\n \n let val_5 = blocks[packed_offset + 5];\n unpacked[53] = insertBits(unpacked[53], extractBits(val_5, 0u, 2u), 1u, 2u); \n unpacked[54] = extractBits(val_5, 2u, 3u);\n unpacked[55] = extractBits(val_5, 5u, 3u);\n unpacked[56] = extractBits(val_5, 8u, 3u);\n unpacked[57] = extractBits(val_5, 11u, 3u);\n unpacked[58] = extractBits(val_5, 14u, 3u);\n unpacked[59] = extractBits(val_5, 17u, 3u);\n unpacked[60] = extractBits(val_5, 20u, 3u);\n unpacked[61] = extractBits(val_5, 23u, 3u);\n unpacked[62] = extractBits(val_5, 26u, 3u);\n unpacked[63] = extractBits(val_5, 29u, 3u);\n \n let val_6 = blocks[packed_offset + 6];\n unpacked[64] = extractBits(val_6, 0u, 3u);\n unpacked[65] = extractBits(val_6, 3u, 3u);\n unpacked[66] = extractBits(val_6, 6u, 3u);\n unpacked[67] = extractBits(val_6, 9u, 3u);\n unpacked[68] = extractBits(val_6, 12u, 3u);\n unpacked[69] = extractBits(val_6, 15u, 3u);\n unpacked[70] = extractBits(val_6, 18u, 3u);\n unpacked[71] = extractBits(val_6, 21u, 3u);\n unpacked[72] = extractBits(val_6, 24u, 3u);\n unpacked[73] = extractBits(val_6, 27u, 3u);\n unpacked[74] = extractBits(val_6, 30u, 2u);\n \n let val_7 = blocks[packed_offset + 7];\n unpacked[74] = insertBits(unpacked[74], extractBits(val_7, 0u, 1u), 2u, 1u);\n unpacked[75] = extractBits(val_7, 1u, 3u);\n unpacked[76] = extractBits(val_7, 4u, 3u);\n unpacked[77] = extractBits(val_7, 7u, 3u);\n unpacked[78] = extractBits(val_7, 10u, 3u);\n unpacked[79] = extractBits(val_7, 13u, 3u);\n unpacked[80] = extractBits(val_7, 16u, 3u);\n unpacked[81] = extractBits(val_7, 19u, 3u);\n unpacked[82] = extractBits(val_7, 22u, 3u);\n unpacked[83] = extractBits(val_7, 25u, 3u);\n unpacked[84] = extractBits(val_7, 28u, 3u);\n unpacked[85] = extractBits(val_7, 31u, 1u);\n \n let val_8 = blocks[packed_offset + 8];\n unpacked[85] = insertBits(unpacked[85], extractBits(val_8, 0u, 2u), 1u, 2u); \n unpacked[86] = extractBits(val_8, 2u, 3u);\n unpacked[87] = extractBits(val_8, 5u, 3u);\n unpacked[88] = extractBits(val_8, 8u, 3u);\n unpacked[89] = extractBits(val_8, 11u, 3u);\n unpacked[90] = extractBits(val_8, 14u, 3u);\n unpacked[91] = extractBits(val_8, 17u, 3u);\n unpacked[92] = extractBits(val_8, 20u, 3u);\n unpacked[93] = extractBits(val_8, 23u, 3u);\n unpacked[94] = extractBits(val_8, 26u, 3u);\n unpacked[95] = extractBits(val_8, 29u, 3u);\n \n let val_9 = blocks[packed_offset + 9];\n unpacked[96] = extractBits(val_9, 0u, 3u);\n unpacked[97] = extractBits(val_9, 3u, 3u);\n unpacked[98] = extractBits(val_9, 6u, 3u);\n unpacked[99] = extractBits(val_9, 9u, 3u);\n unpacked[100] = extractBits(val_9, 12u, 3u);\n unpacked[101] = extractBits(val_9, 15u, 3u);\n unpacked[102] = extractBits(val_9, 18u, 3u);\n unpacked[103] = extractBits(val_9, 21u, 3u);\n unpacked[104] = extractBits(val_9, 24u, 3u);\n unpacked[105] = extractBits(val_9, 27u, 3u);\n unpacked[106] = extractBits(val_9, 30u, 2u);\n \n let val_10 = blocks[packed_offset + 10];\n unpacked[106] = insertBits(unpacked[106], extractBits(val_10, 0u, 1u), 2u, 1u);\n unpacked[107] = extractBits(val_10, 1u, 3u);\n unpacked[108] = extractBits(val_10, 4u, 3u);\n unpacked[109] = extractBits(val_10, 7u, 3u);\n unpacked[110] = extractBits(val_10, 10u, 3u);\n unpacked[111] = extractBits(val_10, 13u, 3u);\n unpacked[112] = extractBits(val_10, 16u, 3u);\n unpacked[113] = extractBits(val_10, 19u, 3u);\n unpacked[114] = extractBits(val_10, 22u, 3u);\n unpacked[115] = extractBits(val_10, 25u, 3u);\n unpacked[116] = extractBits(val_10, 28u, 3u);\n unpacked[117] = extractBits(val_10, 31u, 1u);\n \n let val_11 = blocks[packed_offset + 11];\n unpacked[117] = insertBits(unpacked[117], extractBits(val_11, 0u, 2u), 1u, 2u); \n unpacked[118] = extractBits(val_11, 2u, 3u);\n unpacked[119] = extractBits(val_11, 5u, 3u);\n unpacked[120] = extractBits(val_11, 8u, 3u);\n unpacked[121] = extractBits(val_11, 11u, 3u);\n unpacked[122] = extractBits(val_11, 14u, 3u);\n unpacked[123] = extractBits(val_11, 17u, 3u);\n unpacked[124] = extractBits(val_11, 20u, 3u);\n unpacked[125] = extractBits(val_11, 23u, 3u);\n unpacked[126] = extractBits(val_11, 26u, 3u);\n unpacked[127] = extractBits(val_11, 29u, 3u);\n}\n";var unpackBlock128BitDepth5="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_5(packed_offset: u32) { \n let val_0 = blocks[packed_offset];\n unpacked[0] = extractBits(val_0, 0u, 5u);\n unpacked[1] = extractBits(val_0, 5u, 5u);\n unpacked[2] = extractBits(val_0, 10u, 5u);\n unpacked[3] = extractBits(val_0, 15u, 5u);\n unpacked[4] = extractBits(val_0, 20u, 5u);\n unpacked[5] = extractBits(val_0, 25u, 5u);\n unpacked[6] = extractBits(val_0, 30u, 2u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[6] = insertBits(unpacked[6], extractBits(val_1, 0u, 3u), 2u, 3u); \n unpacked[7] = extractBits(val_1, 3u, 5u);\n unpacked[8] = extractBits(val_1, 8u, 5u);\n unpacked[9] = extractBits(val_1, 13u, 5u);\n unpacked[10] = extractBits(val_1, 18u, 5u);\n unpacked[11] = extractBits(val_1, 23u, 5u);\n unpacked[12] = extractBits(val_1, 28u, 4u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[12] = insertBits(unpacked[12], extractBits(val_2, 0u, 1u), 4u, 1u);\n unpacked[13] = extractBits(val_2, 1u, 5u);\n unpacked[14] = extractBits(val_2, 6u, 5u);\n unpacked[15] = extractBits(val_2, 11u, 5u);\n unpacked[16] = extractBits(val_2, 16u, 5u);\n unpacked[17] = extractBits(val_2, 21u, 5u);\n unpacked[18] = extractBits(val_2, 26u, 5u);\n unpacked[19] = extractBits(val_2, 31u, 1u);\n \n let val_3 = blocks[packed_offset + 3];\n unpacked[19] = insertBits(unpacked[19], extractBits(val_3, 0u, 4u), 1u, 4u);\n unpacked[20] = extractBits(val_3, 4u, 5u);\n unpacked[21] = extractBits(val_3, 9u, 5u);\n unpacked[22] = extractBits(val_3, 14u, 5u);\n unpacked[23] = extractBits(val_3, 19u, 5u);\n unpacked[24] = extractBits(val_3, 24u, 5u);\n unpacked[25] = extractBits(val_3, 29u, 3u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[25] = insertBits(unpacked[25], extractBits(val_4, 0u, 2u), 3u, 2u);\n unpacked[26] = extractBits(val_4, 2u, 5u);\n unpacked[27] = extractBits(val_4, 7u, 5u);\n unpacked[28] = extractBits(val_4, 12u, 5u);\n unpacked[29] = extractBits(val_4, 17u, 5u);\n unpacked[30] = extractBits(val_4, 22u, 5u);\n unpacked[31] = extractBits(val_4, 27u, 5u);\n \n let val_5 = blocks[packed_offset + 5];\n unpacked[32] = extractBits(val_5, 0u, 5u);\n unpacked[33] = extractBits(val_5, 5u, 5u);\n unpacked[34] = extractBits(val_5, 10u, 5u);\n unpacked[35] = extractBits(val_5, 15u, 5u);\n unpacked[36] = extractBits(val_5, 20u, 5u);\n unpacked[37] = extractBits(val_5, 25u, 5u);\n unpacked[38] = extractBits(val_5, 30u, 2u);\n\n let val_6 = blocks[packed_offset + 6];\n unpacked[38] = insertBits(unpacked[38], extractBits(val_6, 0u, 3u), 2u, 3u);\n unpacked[39] = extractBits(val_6, 3u, 5u);\n unpacked[40] = extractBits(val_6, 8u, 5u);\n unpacked[41] = extractBits(val_6, 13u, 5u);\n unpacked[42] = extractBits(val_6, 18u, 5u);\n unpacked[43] = extractBits(val_6, 23u, 5u);\n unpacked[44] = extractBits(val_6, 28u, 4u);\n\n let val_7 = blocks[packed_offset + 7];\n unpacked[44] = insertBits(unpacked[44], extractBits(val_7, 0u, 1u), 4u, 1u);\n unpacked[45] = extractBits(val_7, 1u, 5u);\n unpacked[46] = extractBits(val_7, 6u, 5u);\n unpacked[47] = extractBits(val_7, 11u, 5u);\n unpacked[48] = extractBits(val_7, 16u, 5u);\n unpacked[49] = extractBits(val_7, 21u, 5u);\n unpacked[50] = extractBits(val_7, 26u, 5u);\n unpacked[51] = extractBits(val_7, 31u, 1u);\n\n let val_8 = blocks[packed_offset + 8];\n unpacked[51] = insertBits(unpacked[51], extractBits(val_8, 0u, 4u), 1u, 4u);\n unpacked[52] = extractBits(val_8, 4u, 5u);\n unpacked[53] = extractBits(val_8, 9u, 5u);\n unpacked[54] = extractBits(val_8, 14u, 5u);\n unpacked[55] = extractBits(val_8, 19u, 5u);\n unpacked[56] = extractBits(val_8, 24u, 5u);\n unpacked[57] = extractBits(val_8, 29u, 3u);\n \n let val_9 = blocks[packed_offset + 9];\n unpacked[57] = insertBits(unpacked[57], extractBits(val_9, 0u, 2u), 3u, 2u);\n unpacked[58] = extractBits(val_9, 2u, 5u);\n unpacked[59] = extractBits(val_9, 7u, 5u);\n unpacked[60] = extractBits(val_9, 12u, 5u);\n unpacked[61] = extractBits(val_9, 17u, 5u);\n unpacked[62] = extractBits(val_9, 22u, 5u);\n unpacked[63] = extractBits(val_9, 27u, 5u);\n \n let val_10 = blocks[packed_offset + 10];\n unpacked[64] = extractBits(val_10, 0u, 5u);\n unpacked[65] = extractBits(val_10, 5u, 5u);\n unpacked[66] = extractBits(val_10, 10u, 5u);\n unpacked[67] = extractBits(val_10, 15u, 5u);\n unpacked[68] = extractBits(val_10, 20u, 5u);\n unpacked[69] = extractBits(val_10, 25u, 5u);\n unpacked[70] = extractBits(val_10, 30u, 2u);\n\n let val_11 = blocks[packed_offset + 11];\n unpacked[70] = insertBits(unpacked[70], extractBits(val_11, 0u, 3u), 2u, 3u);\n unpacked[71] = extractBits(val_11, 3u, 5u);\n unpacked[72] = extractBits(val_11, 8u, 5u);\n unpacked[73] = extractBits(val_11, 13u, 5u);\n unpacked[74] = extractBits(val_11, 18u, 5u);\n unpacked[75] = extractBits(val_11, 23u, 5u);\n unpacked[76] = extractBits(val_11, 28u, 4u);\n\n let val_12 = blocks[packed_offset + 12];\n unpacked[76] = insertBits(unpacked[76], extractBits(val_12, 0u, 1u), 4u, 1u);\n unpacked[77] = extractBits(val_12, 1u, 5u);\n unpacked[78] = extractBits(val_12, 6u, 5u);\n unpacked[79] = extractBits(val_12, 11u, 5u);\n unpacked[80] = extractBits(val_12, 16u, 5u);\n unpacked[81] = extractBits(val_12, 21u, 5u);\n unpacked[82] = extractBits(val_12, 26u, 5u);\n unpacked[83] = extractBits(val_12, 31u, 1u);\n\n let val_13 = blocks[packed_offset + 13];\n unpacked[83] = insertBits(unpacked[83], extractBits(val_13, 0u, 4u), 1u, 4u);\n unpacked[84] = extractBits(val_13, 4u, 5u);\n unpacked[85] = extractBits(val_13, 9u, 5u);\n unpacked[86] = extractBits(val_13, 14u, 5u);\n unpacked[87] = extractBits(val_13, 19u, 5u);\n unpacked[88] = extractBits(val_13, 24u, 5u);\n unpacked[89] = extractBits(val_13, 29u, 3u);\n \n let val_14 = blocks[packed_offset + 14];\n unpacked[89] = insertBits(unpacked[89], extractBits(val_14, 0u, 2u), 3u, 2u);\n unpacked[90] = extractBits(val_14, 2u, 5u);\n unpacked[91] = extractBits(val_14, 7u, 5u);\n unpacked[92] = extractBits(val_14, 12u, 5u);\n unpacked[93] = extractBits(val_14, 17u, 5u);\n unpacked[94] = extractBits(val_14, 22u, 5u);\n unpacked[95] = extractBits(val_14, 27u, 5u);\n\n let val_15 = blocks[packed_offset + 15];\n unpacked[96] = extractBits(val_15, 0u, 5u);\n unpacked[97] = extractBits(val_15, 5u, 5u);\n unpacked[98] = extractBits(val_15, 10u, 5u);\n unpacked[99] = extractBits(val_15, 15u, 5u);\n unpacked[100] = extractBits(val_15, 20u, 5u);\n unpacked[101] = extractBits(val_15, 25u, 5u);\n unpacked[102] = extractBits(val_15, 30u, 2u);\n\n let val_16 = blocks[packed_offset + 16];\n unpacked[102] = insertBits(unpacked[102], extractBits(val_16, 0u, 3u), 2u, 3u);\n unpacked[103] = extractBits(val_16, 3u, 5u);\n unpacked[104] = extractBits(val_16, 8u, 5u);\n unpacked[105] = extractBits(val_16, 13u, 5u);\n unpacked[106] = extractBits(val_16, 18u, 5u);\n unpacked[107] = extractBits(val_16, 23u, 5u);\n unpacked[108] = extractBits(val_16, 28u, 4u);\n\n let val_17 = blocks[packed_offset + 17];\n unpacked[108] = insertBits(unpacked[108], extractBits(val_17, 0u, 1u), 4u, 1u);\n unpacked[109] = extractBits(val_17, 1u, 5u);\n unpacked[110] = extractBits(val_17, 6u, 5u);\n unpacked[111] = extractBits(val_17, 11u, 5u);\n unpacked[112] = extractBits(val_17, 16u, 5u);\n unpacked[113] = extractBits(val_17, 21u, 5u);\n unpacked[114] = extractBits(val_17, 26u, 5u);\n unpacked[115] = extractBits(val_17, 31u, 1u);\n \n let val_18 = blocks[packed_offset + 18];\n unpacked[115] = insertBits(unpacked[115], extractBits(val_18, 0u, 4u), 1u, 4u);\n unpacked[116] = extractBits(val_18, 4u, 5u);\n unpacked[117] = extractBits(val_18, 9u, 5u);\n unpacked[118] = extractBits(val_18, 14u, 5u);\n unpacked[119] = extractBits(val_18, 19u, 5u);\n unpacked[120] = extractBits(val_18, 24u, 5u);\n unpacked[121] = extractBits(val_18, 29u, 3u);\n\n let val_19 = blocks[packed_offset + 19];\n unpacked[121] = insertBits(unpacked[121], extractBits(val_19, 0u, 2u), 3u, 2u);\n unpacked[122] = extractBits(val_19, 2u, 5u);\n unpacked[123] = extractBits(val_19, 7u, 5u);\n unpacked[124] = extractBits(val_19, 12u, 5u);\n unpacked[125] = extractBits(val_19, 17u, 5u);\n unpacked[126] = extractBits(val_19, 22u, 5u);\n unpacked[127] = extractBits(val_19, 27u, 5u);\n}\n";var unpackBlock128BitDepth6="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_6(packed_offset: u32) {\n let val_0 = blocks[packed_offset];\n unpacked[0] = extractBits(val_0, 0u, 6u);\n unpacked[1] = extractBits(val_0, 6u, 6u);\n unpacked[2] = extractBits(val_0, 12u, 6u);\n unpacked[3] = extractBits(val_0, 18u, 6u);\n unpacked[4] = extractBits(val_0, 24u, 6u);\n unpacked[5] = extractBits(val_0, 30u, 2u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[5] = insertBits(unpacked[5], extractBits(val_1, 0u, 4u), 2u, 4u);\n unpacked[6] = extractBits(val_1, 4u, 6u);\n unpacked[7] = extractBits(val_1, 10u, 6u);\n unpacked[8] = extractBits(val_1, 16u, 6u);\n unpacked[9] = extractBits(val_1, 22u, 6u);\n unpacked[10] = extractBits(val_1, 28u, 4u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[10] = insertBits(unpacked[10], extractBits(val_2, 0u, 2u), 4u, 2u);\n unpacked[11] = extractBits(val_2, 2u, 6u);\n unpacked[12] = extractBits(val_2, 8u, 6u);\n unpacked[13] = extractBits(val_2, 14u, 6u);\n unpacked[14] = extractBits(val_2, 20u, 6u);\n unpacked[15] = extractBits(val_2, 26u, 6u);\n \n let val_3 = blocks[packed_offset + 3];\n unpacked[16] = extractBits(val_3, 0u, 6u);\n unpacked[17] = extractBits(val_3, 6u, 6u);\n unpacked[18] = extractBits(val_3, 12u, 6u);\n unpacked[19] = extractBits(val_3, 18u, 6u);\n unpacked[20] = extractBits(val_3, 24u, 6u);\n unpacked[21] = extractBits(val_3, 30u, 2u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[21] = insertBits(unpacked[21], extractBits(val_4, 0u, 4u), 2u, 4u);\n unpacked[22] = extractBits(val_4, 4u, 6u);\n unpacked[23] = extractBits(val_4, 10u, 6u);\n unpacked[24] = extractBits(val_4, 16u, 6u);\n unpacked[25] = extractBits(val_4, 22u, 6u);\n unpacked[26] = extractBits(val_4, 28u, 4u);\n\n let val_5 = blocks[packed_offset + 5];\n unpacked[26] = insertBits(unpacked[26], extractBits(val_5, 0u, 2u), 4u, 2u);\n unpacked[27] = extractBits(val_5, 2u, 6u);\n unpacked[28] = extractBits(val_5, 8u, 6u);\n unpacked[29] = extractBits(val_5, 14u, 6u);\n unpacked[30] = extractBits(val_5, 20u, 6u);\n unpacked[31] = extractBits(val_5, 26u, 6u);\n\n let val_6 = blocks[packed_offset + 6];\n unpacked[32] = extractBits(val_6, 0u, 6u);\n unpacked[33] = extractBits(val_6, 6u, 6u);\n unpacked[34] = extractBits(val_6, 12u, 6u);\n unpacked[35] = extractBits(val_6, 18u, 6u);\n unpacked[36] = extractBits(val_6, 24u, 6u);\n unpacked[37] = extractBits(val_6, 30u, 2u);\n\n let val_7 = blocks[packed_offset + 7];\n unpacked[37] = insertBits(unpacked[37], extractBits(val_7, 0u, 4u), 2u, 4u);\n unpacked[38] = extractBits(val_7, 4u, 6u);\n unpacked[39] = extractBits(val_7, 10u, 6u);\n unpacked[40] = extractBits(val_7, 16u, 6u);\n unpacked[41] = extractBits(val_7, 22u, 6u);\n unpacked[42] = extractBits(val_7, 28u, 4u);\n \n let val_8 = blocks[packed_offset + 8];\n unpacked[42] = insertBits(unpacked[42], extractBits(val_8, 0u, 2u), 4u, 2u);\n unpacked[43] = extractBits(val_8, 2u, 6u);\n unpacked[44] = extractBits(val_8, 8u, 6u);\n unpacked[45] = extractBits(val_8, 14u, 6u);\n unpacked[46] = extractBits(val_8, 20u, 6u);\n unpacked[47] = extractBits(val_8, 26u, 6u);\n\n let val_9 = blocks[packed_offset + 9];\n unpacked[48] = extractBits(val_9, 0u, 6u);\n unpacked[49] = extractBits(val_9, 6u, 6u);\n unpacked[50] = extractBits(val_9, 12u, 6u);\n unpacked[51] = extractBits(val_9, 18u, 6u);\n unpacked[52] = extractBits(val_9, 24u, 6u);\n unpacked[53] = extractBits(val_9, 30u, 2u);\n\n let val_10 = blocks[packed_offset + 10];\n unpacked[53] = insertBits(unpacked[53], extractBits(val_10, 0u, 4u), 2u, 4u);\n unpacked[54] = extractBits(val_10, 4u, 6u);\n unpacked[55] = extractBits(val_10, 10u, 6u);\n unpacked[56] = extractBits(val_10, 16u, 6u);\n unpacked[57] = extractBits(val_10, 22u, 6u);\n unpacked[58] = extractBits(val_10, 28u, 4u);\n\n let val_11 = blocks[packed_offset + 11];\n unpacked[58] = insertBits(unpacked[58], extractBits(val_11, 0u, 2u), 4u, 2u);\n unpacked[59] = extractBits(val_11, 2u, 6u);\n unpacked[60] = extractBits(val_11, 8u, 6u);\n unpacked[61] = extractBits(val_11, 14u, 6u);\n unpacked[62] = extractBits(val_11, 20u, 6u);\n unpacked[63] = extractBits(val_11, 26u, 6u);\n \n let val_12 = blocks[packed_offset + 12];\n unpacked[64] = extractBits(val_12, 0u, 6u);\n unpacked[65] = extractBits(val_12, 6u, 6u);\n unpacked[66] = extractBits(val_12, 12u, 6u);\n unpacked[67] = extractBits(val_12, 18u, 6u);\n unpacked[68] = extractBits(val_12, 24u, 6u);\n unpacked[69] = extractBits(val_12, 30u, 2u);\n\n let val_13 = blocks[packed_offset + 13];\n unpacked[69] = insertBits(unpacked[69], extractBits(val_13, 0u, 4u), 2u, 4u);\n unpacked[70] = extractBits(val_13, 4u, 6u);\n unpacked[71] = extractBits(val_13, 10u, 6u);\n unpacked[72] = extractBits(val_13, 16u, 6u);\n unpacked[73] = extractBits(val_13, 22u, 6u);\n unpacked[74] = extractBits(val_13, 28u, 4u);\n\n let val_14 = blocks[packed_offset + 14];\n unpacked[74] = insertBits(unpacked[74], extractBits(val_14, 0u, 2u), 4u, 2u);\n unpacked[75] = extractBits(val_14, 2u, 6u);\n unpacked[76] = extractBits(val_14, 8u, 6u);\n unpacked[77] = extractBits(val_14, 14u, 6u);\n unpacked[78] = extractBits(val_14, 20u, 6u);\n unpacked[79] = extractBits(val_14, 26u, 6u);\n\n let val_15 = blocks[packed_offset + 15];\n unpacked[80] = extractBits(val_15, 0u, 6u);\n unpacked[81] = extractBits(val_15, 6u, 6u);\n unpacked[82] = extractBits(val_15, 12u, 6u);\n unpacked[83] = extractBits(val_15, 18u, 6u);\n unpacked[84] = extractBits(val_15, 24u, 6u);\n unpacked[85] = extractBits(val_15, 30u, 2u);\n \n let val_16 = blocks[packed_offset + 16];\n unpacked[85] = insertBits(unpacked[85], extractBits(val_16, 0u, 4u), 2u, 4u);\n unpacked[86] = extractBits(val_16, 4u, 6u);\n unpacked[87] = extractBits(val_16, 10u, 6u);\n unpacked[88] = extractBits(val_16, 16u, 6u);\n unpacked[89] = extractBits(val_16, 22u, 6u);\n unpacked[90] = extractBits(val_16, 28u, 4u);\n\n let val_17 = blocks[packed_offset + 17];\n unpacked[90] = insertBits(unpacked[90], extractBits(val_17, 0u, 2u), 4u, 2u);\n unpacked[91] = extractBits(val_17, 2u, 6u);\n unpacked[92] = extractBits(val_17, 8u, 6u);\n unpacked[93] = extractBits(val_17, 14u, 6u);\n unpacked[94] = extractBits(val_17, 20u, 6u);\n unpacked[95] = extractBits(val_17, 26u, 6u);\n\n let val_18 = blocks[packed_offset + 18];\n unpacked[96] = extractBits(val_18, 0u, 6u);\n unpacked[97] = extractBits(val_18, 6u, 6u);\n unpacked[98] = extractBits(val_18, 12u, 6u);\n unpacked[99] = extractBits(val_18, 18u, 6u);\n unpacked[100] = extractBits(val_18, 24u, 6u);\n unpacked[101] = extractBits(val_18, 30u, 2u);\n\n let val_19 = blocks[packed_offset + 19];\n unpacked[101] = insertBits(unpacked[101], extractBits(val_19, 0u, 4u), 2u, 4u);\n unpacked[102] = extractBits(val_19, 4u, 6u);\n unpacked[103] = extractBits(val_19, 10u, 6u);\n unpacked[104] = extractBits(val_19, 16u, 6u);\n unpacked[105] = extractBits(val_19, 22u, 6u);\n unpacked[106] = extractBits(val_19, 28u, 4u);\n \n let val_20 = blocks[packed_offset + 20];\n unpacked[106] = insertBits(unpacked[106], extractBits(val_20, 0u, 2u), 4u, 2u);\n unpacked[107] = extractBits(val_20, 2u, 6u);\n unpacked[108] = extractBits(val_20, 8u, 6u);\n unpacked[109] = extractBits(val_20, 14u, 6u);\n unpacked[110] = extractBits(val_20, 20u, 6u);\n unpacked[111] = extractBits(val_20, 26u, 6u);\n\n let val_21 = blocks[packed_offset + 21];\n unpacked[112] = extractBits(val_21, 0u, 6u);\n unpacked[113] = extractBits(val_21, 6u, 6u);\n unpacked[114] = extractBits(val_21, 12u, 6u);\n unpacked[115] = extractBits(val_21, 18u, 6u);\n unpacked[116] = extractBits(val_21, 24u, 6u);\n unpacked[117] = extractBits(val_21, 30u, 2u);\n\n let val_22 = blocks[packed_offset + 22];\n unpacked[117] = insertBits(unpacked[117], extractBits(val_22, 0u, 4u), 2u, 4u);\n unpacked[118] = extractBits(val_22, 4u, 6u);\n unpacked[119] = extractBits(val_22, 10u, 6u);\n unpacked[120] = extractBits(val_22, 16u, 6u);\n unpacked[121] = extractBits(val_22, 22u, 6u);\n unpacked[122] = extractBits(val_22, 28u, 4u);\n\n let val_23 = blocks[packed_offset + 23];\n unpacked[122] = insertBits(unpacked[122], extractBits(val_23, 0u, 2u), 4u, 2u);\n unpacked[123] = extractBits(val_23, 2u, 6u);\n unpacked[124] = extractBits(val_23, 8u, 6u);\n unpacked[125] = extractBits(val_23, 14u, 6u);\n unpacked[126] = extractBits(val_23, 20u, 6u);\n unpacked[127] = extractBits(val_23, 26u, 6u);\n}\n";var unpackBlock128BitDepth7="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_7(packed_offset: u32) {\n let val_0 = blocks[packed_offset];\n unpacked[0] = extractBits(val_0, 0u, 7u);\n unpacked[1] = extractBits(val_0, 7u, 7u);\n unpacked[2] = extractBits(val_0, 14u, 7u);\n unpacked[3] = extractBits(val_0, 21u, 7u);\n unpacked[4] = extractBits(val_0, 28u, 4u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[4] = insertBits(unpacked[4], extractBits(val_1, 0u, 3u), 4u, 3u);\n unpacked[5] = extractBits(val_1, 3u, 7u);\n unpacked[6] = extractBits(val_1, 10u, 7u);\n unpacked[7] = extractBits(val_1, 17u, 7u);\n unpacked[8] = extractBits(val_1, 24u, 7u);\n unpacked[9] = extractBits(val_1, 31u, 1u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[9] = insertBits(unpacked[9], extractBits(val_2, 0u, 6u), 1u, 6u);\n unpacked[10] = extractBits(val_2, 6u, 7u);\n unpacked[11] = extractBits(val_2, 13u, 7u);\n unpacked[12] = extractBits(val_2, 20u, 7u);\n unpacked[13] = extractBits(val_2, 27u, 5u);\n \n let val_3 = blocks[packed_offset + 3];\n unpacked[13] = insertBits(unpacked[13], extractBits(val_3, 0u, 2u), 5u, 2u);\n unpacked[14] = extractBits(val_3, 2u, 7u);\n unpacked[15] = extractBits(val_3, 9u, 7u);\n unpacked[16] = extractBits(val_3, 16u, 7u);\n unpacked[17] = extractBits(val_3, 23u, 7u);\n unpacked[18] = extractBits(val_3, 30u, 2u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[18] = insertBits(unpacked[18], extractBits(val_4, 0u, 5u), 2u, 5u);\n unpacked[19] = extractBits(val_4, 5u, 7u);\n unpacked[20] = extractBits(val_4, 12u, 7u);\n unpacked[21] = extractBits(val_4, 19u, 7u);\n unpacked[22] = extractBits(val_4, 26u, 6u);\n \n let val_5 = blocks[packed_offset + 5];\n unpacked[22] = insertBits(unpacked[22], extractBits(val_5, 0u, 1u), 6u, 1u);\n unpacked[23] = extractBits(val_5, 1u, 7u);\n unpacked[24] = extractBits(val_5, 8u, 7u);\n unpacked[25] = extractBits(val_5, 15u, 7u);\n unpacked[26] = extractBits(val_5, 22u, 7u);\n unpacked[27] = extractBits(val_5, 29u, 3u);\n \n let val_6 = blocks[packed_offset + 6];\n unpacked[27] = insertBits(unpacked[27], extractBits(val_6, 0u, 4u), 3u, 4u);\n unpacked[28] = extractBits(val_6, 4u, 7u);\n unpacked[29] = extractBits(val_6, 11u, 7u);\n unpacked[30] = extractBits(val_6, 18u, 7u);\n unpacked[31] = extractBits(val_6, 25u, 7u);\n \n let val_7 = blocks[packed_offset + 7];\n unpacked[32] = extractBits(val_7, 0u, 7u);\n unpacked[33] = extractBits(val_7, 7u, 7u);\n unpacked[34] = extractBits(val_7, 14u, 7u);\n unpacked[35] = extractBits(val_7, 21u, 7u);\n unpacked[36] = extractBits(val_7, 28u, 4u);\n \n let val_8 = blocks[packed_offset + 8];\n unpacked[36] = insertBits(unpacked[36], extractBits(val_8, 0u, 3u), 4u, 3u);\n unpacked[37] = extractBits(val_8, 3u, 7u);\n unpacked[38] = extractBits(val_8, 10u, 7u);\n unpacked[39] = extractBits(val_8, 17u, 7u);\n unpacked[40] = extractBits(val_8, 24u, 7u);\n unpacked[41] = extractBits(val_8, 31u, 1u);\n \n let val_9 = blocks[packed_offset + 9];\n unpacked[41] = insertBits(unpacked[41], extractBits(val_9, 0u, 6u), 1u, 6u);\n unpacked[42] = extractBits(val_9, 6u, 7u);\n unpacked[43] = extractBits(val_9, 13u, 7u);\n unpacked[44] = extractBits(val_9, 20u, 7u);\n unpacked[45] = extractBits(val_9, 27u, 5u);\n \n let val_10 = blocks[packed_offset + 10];\n unpacked[45] = insertBits(unpacked[45], extractBits(val_10, 0u, 2u), 5u, 2u);\n unpacked[46] = extractBits(val_10, 2u, 7u);\n unpacked[47] = extractBits(val_10, 9u, 7u);\n unpacked[48] = extractBits(val_10, 16u, 7u);\n unpacked[49] = extractBits(val_10, 23u, 7u);\n unpacked[50] = extractBits(val_10, 30u, 2u);\n \n let val_11 = blocks[packed_offset + 11];\n unpacked[50] = insertBits(unpacked[50], extractBits(val_11, 0u, 5u), 2u, 5u);\n unpacked[51] = extractBits(val_11, 5u, 7u);\n unpacked[52] = extractBits(val_11, 12u, 7u);\n unpacked[53] = extractBits(val_11, 19u, 7u);\n unpacked[54] = extractBits(val_11, 26u, 6u);\n \n let val_12 = blocks[packed_offset + 12];\n unpacked[54] = insertBits(unpacked[54], extractBits(val_12, 0u, 1u), 6u, 1u);\n unpacked[55] = extractBits(val_12, 1u, 7u);\n unpacked[56] = extractBits(val_12, 8u, 7u);\n unpacked[57] = extractBits(val_12, 15u, 7u);\n unpacked[58] = extractBits(val_12, 22u, 7u);\n unpacked[59] = extractBits(val_12, 29u, 3u);\n \n let val_13 = blocks[packed_offset + 13];\n unpacked[59] = insertBits(unpacked[59], extractBits(val_13, 0u, 4u), 3u, 4u);\n unpacked[60] = extractBits(val_13, 4u, 7u);\n unpacked[61] = extractBits(val_13, 11u, 7u);\n unpacked[62] = extractBits(val_13, 18u, 7u);\n unpacked[63] = extractBits(val_13, 25u, 7u);\n \n let val_14 = blocks[packed_offset + 14];\n unpacked[64] = extractBits(val_14, 0u, 7u);\n unpacked[65] = extractBits(val_14, 7u, 7u);\n unpacked[66] = extractBits(val_14, 14u, 7u);\n unpacked[67] = extractBits(val_14, 21u, 7u);\n unpacked[68] = extractBits(val_14, 28u, 4u);\n \n let val_15 = blocks[packed_offset + 15];\n unpacked[68] = insertBits(unpacked[68], extractBits(val_15, 0u, 3u), 4u, 3u);\n unpacked[69] = extractBits(val_15, 3u, 7u);\n unpacked[70] = extractBits(val_15, 10u, 7u);\n unpacked[71] = extractBits(val_15, 17u, 7u);\n unpacked[72] = extractBits(val_15, 24u, 7u);\n unpacked[73] = extractBits(val_15, 31u, 1u);\n \n let val_16 = blocks[packed_offset + 16];\n unpacked[73] = insertBits(unpacked[73], extractBits(val_16, 0u, 6u), 1u, 6u);\n unpacked[74] = extractBits(val_16, 6u, 7u);\n unpacked[75] = extractBits(val_16, 13u, 7u);\n unpacked[76] = extractBits(val_16, 20u, 7u);\n unpacked[77] = extractBits(val_16, 27u, 5u);\n \n let val_17 = blocks[packed_offset + 17];\n unpacked[77] = insertBits(unpacked[77], extractBits(val_17, 0u, 2u), 5u, 2u);\n unpacked[78] = extractBits(val_17, 2u, 7u);\n unpacked[79] = extractBits(val_17, 9u, 7u);\n unpacked[80] = extractBits(val_17, 16u, 7u);\n unpacked[81] = extractBits(val_17, 23u, 7u);\n unpacked[82] = extractBits(val_17, 30u, 2u);\n \n let val_18 = blocks[packed_offset + 18];\n unpacked[82] = insertBits(unpacked[82], extractBits(val_18, 0u, 5u), 2u, 5u);\n unpacked[83] = extractBits(val_18, 5u, 7u);\n unpacked[84] = extractBits(val_18, 12u, 7u);\n unpacked[85] = extractBits(val_18, 19u, 7u);\n unpacked[86] = extractBits(val_18, 26u, 6u);\n \n let val_19 = blocks[packed_offset + 19];\n unpacked[86] = insertBits(unpacked[86], extractBits(val_19, 0u, 1u), 6u, 1u);\n unpacked[87] = extractBits(val_19, 1u, 7u);\n unpacked[88] = extractBits(val_19, 8u, 7u);\n unpacked[89] = extractBits(val_19, 15u, 7u);\n unpacked[90] = extractBits(val_19, 22u, 7u);\n unpacked[91] = extractBits(val_19, 29u, 3u);\n \n let val_20 = blocks[packed_offset + 20];\n unpacked[91] = insertBits(unpacked[91], extractBits(val_20, 0u, 4u), 3u, 4u);\n unpacked[92] = extractBits(val_20, 4u, 7u);\n unpacked[93] = extractBits(val_20, 11u, 7u);\n unpacked[94] = extractBits(val_20, 18u, 7u);\n unpacked[95] = extractBits(val_20, 25u, 7u);\n \n let val_21 = blocks[packed_offset + 21];\n unpacked[96] = extractBits(val_21, 0u, 7u);\n unpacked[97] = extractBits(val_21, 7u, 7u);\n unpacked[98] = extractBits(val_21, 14u, 7u);\n unpacked[99] = extractBits(val_21, 21u, 7u);\n unpacked[100] = extractBits(val_21, 28u, 4u);\n \n let val_22 = blocks[packed_offset + 22];\n unpacked[100] = insertBits(unpacked[100], extractBits(val_22, 0u, 3u), 4u, 3u);\n unpacked[101] = extractBits(val_22, 3u, 7u);\n unpacked[102] = extractBits(val_22, 10u, 7u);\n unpacked[103] = extractBits(val_22, 17u, 7u);\n unpacked[104] = extractBits(val_22, 24u, 7u);\n unpacked[105] = extractBits(val_22, 31u, 1u);\n \n let val_23 = blocks[packed_offset + 23];\n unpacked[105] = insertBits(unpacked[105], extractBits(val_23, 0u, 6u), 1u, 6u);\n unpacked[106] = extractBits(val_23, 6u, 7u);\n unpacked[107] = extractBits(val_23, 13u, 7u);\n unpacked[108] = extractBits(val_23, 20u, 7u);\n unpacked[109] = extractBits(val_23, 27u, 5u);\n \n let val_24 = blocks[packed_offset + 24];\n unpacked[109] = insertBits(unpacked[109], extractBits(val_24, 0u, 2u), 5u, 2u);\n unpacked[110] = extractBits(val_24, 2u, 7u);\n unpacked[111] = extractBits(val_24, 9u, 7u);\n unpacked[112] = extractBits(val_24, 16u, 7u);\n unpacked[113] = extractBits(val_24, 23u, 7u);\n unpacked[114] = extractBits(val_24, 30u, 2u);\n \n let val_25 = blocks[packed_offset + 25];\n unpacked[114] = insertBits(unpacked[114], extractBits(val_25, 0u, 5u), 2u, 5u);\n unpacked[115] = extractBits(val_25, 5u, 7u);\n unpacked[116] = extractBits(val_25, 12u, 7u);\n unpacked[117] = extractBits(val_25, 19u, 7u);\n unpacked[118] = extractBits(val_25, 26u, 6u);\n \n let val_26 = blocks[packed_offset + 26];\n unpacked[118] = insertBits(unpacked[118], extractBits(val_26, 0u, 1u), 6u, 1u);\n unpacked[119] = extractBits(val_26, 1u, 7u);\n unpacked[120] = extractBits(val_26, 8u, 7u);\n unpacked[121] = extractBits(val_26, 15u, 7u);\n unpacked[122] = extractBits(val_26, 22u, 7u);\n unpacked[123] = extractBits(val_26, 29u, 3u);\n \n let val_27 = blocks[packed_offset + 27];\n unpacked[123] = insertBits(unpacked[123], extractBits(val_27, 0u, 4u), 3u, 4u);\n unpacked[124] = extractBits(val_27, 4u, 7u);\n unpacked[125] = extractBits(val_27, 11u, 7u);\n unpacked[126] = extractBits(val_27, 18u, 7u);\n unpacked[127] = extractBits(val_27, 25u, 7u); \n}\n";var fromFP510Function="\n\nconst exponents: array = array(\n 2.9103830456733704e-11, \n 5.820766091346741e-11, \n 1.1641532182693481e-10, \n 2.3283064365386963e-10,\n 4.656612873077393e-10, \n 9.313225746154785e-10, \n 1.862645149230957e-09, \n 3.725290298461914e-09,\n 7.450580596923828e-09, \n 1.4901161193847656e-08, \n 2.9802322387695312e-08, \n 5.960464477539063e-08,\n 1.1920928955078125e-07, \n 2.384185791015625e-07, \n 4.76837158203125e-07, \n 9.5367431640625e-07,\n 1.9073486328125e-06, \n 3.814697265625e-06, \n 7.62939453125e-06, \n 1.52587890625e-05, \n 3.0517578125e-05,\n 6.103515625e-05, \n 0.0001220703125, \n 0.000244140625, \n 0.00048828125, \n 0.0009765625, \n 0.001953125, \n 0.00390625,\n 0.0078125, \n 0.015625, \n 0.03125, \n 0.0625);\n\nfn from_fp510(x: u32) -> f32 {\n let exponent = f32(exponents[extractBits(x, 10u, 5u)]); \n let fractional = f32(extractBits(x, 0u, 10u)); \n let abs = exponent * fractional;\n return abs * (1.0 - (2.0 * f32(extractBits(x, 15u, 1u))));\n}\n";var preprocessBlocks3BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth3,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n \n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 12u); \n unpack_block_128_bit_depth_3(blocks_start); \n \n let b01: u32 = blocks_start;\n let b2: u32 = blocks_start + 8u;\n \n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b01_idx = b01 + (r / 2u);\n let b2_idx = b2 + (r / 4u);\n\n blocks[b01_idx] = insertBits(blocks[b01_idx], extractBits(unpacked[unpacked_idx], 0u, 2u), (r * 16u) % 32u, 16u);\n blocks[b2_idx] = insertBits(blocks[b2_idx], extractBits(unpacked[unpacked_idx], 2u, 1u), (r * 8u) % 32u, 8u); \n }\n \n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b01_idx = b01 + (r / 2u);\n let b2_idx = b2 + (r / 4u);\n \n blocks[b01_idx] = insertBits(blocks[b01_idx], extractBits(unpacked[unpacked_idx], 0u, 2u), ((r * 16u) % 32u) + (2u * c), 2u);\n blocks[b2_idx] = insertBits(blocks[b2_idx], extractBits(unpacked[unpacked_idx], 2u, 1u), ((r * 8u) % 32u) + c, 1u); \n }\n }\n}\n\n").concat(emptyShader);var preprocessBlocks5BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth5,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n\n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 20u);\n unpack_block_128_bit_depth_5(blocks_start); \n \n let b03: u32 = blocks_start;\n let b4: u32 = blocks_start + 16u;\n\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b03_idx = b03 + r;\n let b4_idx = b4 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 0u, 32u);\n blocks[b4_idx] = insertBits(blocks[b4_idx], extractBits(unpacked[unpacked_idx], 4u, 1u), (r * 8u) % 32u, 8u);\n }\n \n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b03_idx = b03 + r;\n let b4_idx = b4 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 4 * c, 4u);\n blocks[b4_idx] = insertBits(blocks[b4_idx], extractBits(unpacked[unpacked_idx], 4u, 1u), ((r * 8u) % 32u) + c, 1u);\n }\n } \n}\n\n").concat(emptyShader);var preprocessBlocks6BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth6,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n \n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 24u);\n unpack_block_128_bit_depth_6(blocks_start);\n \n let b03: u32 = blocks_start;\n let b45: u32 = blocks_start + 16u; \n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 0u, 32u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u), 16u);\n }\n\n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 4 * c, 4u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u) + (2 * c), 2u);\n }\n }\n}\n\n").concat(emptyShader);var preprocessBlocks7BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth7,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n \n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 28u);\n unpack_block_128_bit_depth_7(blocks_start);\n \n let b03: u32 = blocks_start;\n let b45: u32 = blocks_start + 16u;\n let b6: u32 = blocks_start + 24u; \n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n let b6_idx = b6 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 0, 32u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u), 16u);\n blocks[b6_idx] = insertBits(blocks[b6_idx], extractBits(unpacked[unpacked_idx], 6u, 1u), ((r * 8u) % 32u), 8u);\n }\n \n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n let b6_idx = b6 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 4 * c, 4u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u) + (2 * c), 2u);\n blocks[b6_idx] = insertBits(blocks[b6_idx], extractBits(unpacked[unpacked_idx], 6u, 1u), ((r * 8u) % 32u) + c, 1u);\n }\n }\n}\n\n").concat(emptyShader);var preprocessShaderSources={3:preprocessBlocks3BitShaderSource,5:preprocessBlocks5BitShaderSource,6:preprocessBlocks6BitShaderSource,7:preprocessBlocks7BitShaderSource};var preprocessShaderNames={3:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_3bit_shader",5:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_5bit_shader",6:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_6bit_shader",7:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_7bit_shader"};var BM=8;var BN=32;var TM=2;var TN=16;var TC=rowsPerBlock*BM*BN/(TM*TN);var constantSnippet="\nconst BM = ".concat(BM,"u;\nconst BN = ").concat(BN,"u;\n\nconst TM = ").concat(TM,"u;\nconst TN = ").concat(TN,"u;\n\nconst TC = ").concat(TC,"u;\n\nconst ROW_PER_BLOCK = ").concat(rowsPerBlock,"u;\nconst COL_PER_BLOCK = ").concat(columnsPerBlock,"u;\n\nconst VEC_COL_PER_BLOCK = COL_PER_BLOCK / 4u;\n\nconst block_size: u32 = (COL_PER_BLOCK * ROW_PER_BLOCK * bit_depth) / 32u;\n\n");var forwardMultipleInputArgsSnippet="\nstruct argsStruct {\n n: u32,\n m: u32,\n total_nbc: u32,\n k: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array;\n";var forwardMultipleSharedPrivateMemSnippet="\nvar shared_x: array, BN * VEC_COL_PER_BLOCK>;\nvar shared_ab: array;\nvar shared_w: array, BM * ROW_PER_BLOCK * VEC_COL_PER_BLOCK>;\n\nvar local_x: array, TN * VEC_COL_PER_BLOCK>;\nvar local_x_sums: array;\nvar local_results: array;\n";var forwardMultipleLocalVarSnippet="\n let tid = local_id.x;\n let bm_idx = workgroup_id.x;\n let bn_idx = workgroup_id.y;\n\n let local_bm_idx = bm_idx * BM;\n let local_bn_idx = bn_idx * BN;\n \n let n_idx = tid % (BN / TN);\n let k_idx = tid / (BN / TN) / (BM * ROW_PER_BLOCK / TM);\n let m_idx = tid / (BN / TN) % (BM * ROW_PER_BLOCK / TM);\n";var forwardMultipleLoadW1Bit="\n let b0 = blocks[src + (row / 4u)];\n\n let b0_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b0_offset = b0_offset_base + (c * 4u); \n shared_w[dst + c] = vec4(\n f32(extractBits(b0, b0_offset, 1u)), \n f32(extractBits(b0, b0_offset + 1, 1u)),\n f32(extractBits(b0, b0_offset + 2, 1u)),\n f32(extractBits(b0, b0_offset + 3, 1u)));\n }\n";var forwardMultipleLoadW2Bit="\n let b01 = blocks[src + (row / 2u)];\n \n let b01_offset_base = (row * 16u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) { \n let b01_offset = b01_offset_base + (c * 8u);\n shared_w[dst + c] = vec4(\n f32(extractBits(b01, b01_offset, 2u)), \n f32(extractBits(b01, b01_offset + 2, 2u)),\n f32(extractBits(b01, b01_offset + 4, 2u)),\n f32(extractBits(b01, b01_offset + 6, 2u)));\n } \n";var forwardMultipleLoadW3Bit="\n let b01 = blocks[src + (row / 2u)];\n let b2 = blocks[src + 8u + (row / 4u)]; \n\n let b01_offset_base = (row * 16u) % 32u;\n let b2_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b01_offset = b01_offset_base + (c * 8u);\n let b2_offset = b2_offset_base + (c * 4u);\n\n shared_w[dst + c] = vec4(\n f32(insertBits(extractBits(b01, b01_offset, 2u), extractBits(b2, b2_offset, 1u), 2u, 1u)), \n f32(insertBits(extractBits(b01, b01_offset + 2, 2u), extractBits(b2, b2_offset + 1, 1u), 2u, 1u)),\n f32(insertBits(extractBits(b01, b01_offset + 4, 2u), extractBits(b2, b2_offset + 2, 1u), 2u, 1u)),\n f32(insertBits(extractBits(b01, b01_offset + 6, 2u), extractBits(b2, b2_offset + 3, 1u), 2u, 1u))); \n }\n";var forwardMultipleLoadW4Bit="\n let b03 = blocks[src + row];\n \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b03_offset = (c * 16u); \n shared_w[dst + c] = vec4(\n f32(extractBits(b03, b03_offset, 4u)), \n f32(extractBits(b03, b03_offset + 4, 4u)),\n f32(extractBits(b03, b03_offset + 8, 4u)),\n f32(extractBits(b03, b03_offset + 12, 4u)));\n }\n";var forwardMultipleLoadW5Bit="\n let b03 = blocks[src + row];\n let b4 = blocks[src + 16u + (row / 4u)];\n \n let b4_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b03_offset = (c * 16u);\n let b4_offset = b4_offset_base + (c * 4u);\n shared_w[dst + c] = vec4(\n f32(insertBits(extractBits(b03, b03_offset, 4u), extractBits(b4, b4_offset, 1u), 4u, 1u)), \n f32(insertBits(extractBits(b03, b03_offset + 4, 4u), extractBits(b4, b4_offset + 1, 1u), 4u, 1u)),\n f32(insertBits(extractBits(b03, b03_offset + 8, 4u), extractBits(b4, b4_offset + 2, 1u), 4u, 1u)),\n f32(insertBits(extractBits(b03, b03_offset + 12, 4u), extractBits(b4, b4_offset + 3, 1u), 4u, 1u)));\n }\n";var forwardMultipleLoadW6Bit="\n let b03 = blocks[src + row];\n let b45 = blocks[src + 16u + (row / 2u)];\n \n let b45_offset_base = (row * 16u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) { \n let b03_offset = (c * 16u);\n let b45_offset = b45_offset_base + (c * 8u);\n shared_w[dst + c] = vec4(\n f32(insertBits(extractBits(b03, b03_offset, 4u), extractBits(b45, b45_offset, 2u), 4u, 2u)), \n f32(insertBits(extractBits(b03, b03_offset + 4, 4u), extractBits(b45, b45_offset + 2, 2u), 4u, 2u)),\n f32(insertBits(extractBits(b03, b03_offset + 8, 4u), extractBits(b45, b45_offset + 4, 2u), 4u, 2u)),\n f32(insertBits(extractBits(b03, b03_offset + 12, 4u), extractBits(b45, b45_offset + 6, 2u), 4u, 2u)));\n }\n";var forwardMultipleLoadW7Bit="\n let b03 = blocks[src + row];\n let b45 = blocks[src + 16u + (row / 2u)];\n let b6 = blocks[src + 24u + (row / 4u)];\n \n let b45_offset_base = (row * 16u) % 32u;\n let b6_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b03_offset = (c * 16u);\n let b45_offset = b45_offset_base + (c * 8u);\n let b6_offset = b6_offset_base + (c * 4u);\n \n shared_w[dst + c] = vec4(\n f32(insertBits(insertBits(extractBits(b03, b03_offset, 4u), extractBits(b45, b45_offset, 2u), 4u, 2u), extractBits(b6, b6_offset, 1u), 6u, 1u)), \n f32(insertBits(insertBits(extractBits(b03, b03_offset + 4, 4u), extractBits(b45, b45_offset + 2, 2u), 4u, 2u), extractBits(b6, b6_offset + 1, 1u), 6u, 1u)),\n f32(insertBits(insertBits(extractBits(b03, b03_offset + 8, 4u), extractBits(b45, b45_offset + 4, 2u), 4u, 2u), extractBits(b6, b6_offset + 2, 1u), 6u, 1u)),\n f32(insertBits(insertBits(extractBits(b03, b03_offset + 12, 4u), extractBits(b45, b45_offset + 6, 2u), 4u, 2u), extractBits(b6, b6_offset + 3, 1u), 6u, 1u)));\n }\n";var forwardMultipleLoadW8Bit="\n let b07_offset = src + (row * 2);\n \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b07 = blocks[b07_offset + c];\n shared_w[dst + c] = vec4(\n f32(extractBits(b07, 0u, 8u)), \n f32(extractBits(b07, 8u, 8u)),\n f32(extractBits(b07, 16u, 8u)),\n f32(extractBits(b07, 24u, 8u)));\n }\n";var forwardLoadWBitDepthSnippets={1:forwardMultipleLoadW1Bit,2:forwardMultipleLoadW2Bit,3:forwardMultipleLoadW3Bit,4:forwardMultipleLoadW4Bit,5:forwardMultipleLoadW5Bit,6:forwardMultipleLoadW6Bit,7:forwardMultipleLoadW7Bit,8:forwardMultipleLoadW8Bit};var forwardMultipleLoadXSnippet="\n let total_work_x = VEC_COL_PER_BLOCK * BN;\n for (var local_idx = 0u; local_idx < divide_pad(total_work_x, TC); local_idx++) {\n let idx = local_idx * TC + tid;\n if (idx < total_work_x) { \n let n_load_idx = local_bn_idx + idx / VEC_COL_PER_BLOCK;\n let inner_idx = idx % VEC_COL_PER_BLOCK;\n \n if (bk_idx < args.k && n_load_idx < args.n) { \n let x_idx = (args.x_offset / 4u) + ((bk_idx * args.n + n_load_idx) * VEC_COL_PER_BLOCK + inner_idx); \n shared_x[idx] = x[x_idx];\n } else {\n shared_x[idx] = vec4(0.0);\n }\n }\n }\n";var forwardMultipleLoadABSnippet="\n let total_work_ab = BM * 2;\n for (var local_idx = 0u; local_idx < divide_pad(total_work_ab, TC); local_idx++) {\n let idx = local_idx * TC + tid;\n if (idx < total_work_ab) {\n let m_load_idx = local_bm_idx + idx / 2; \n let inner_idx = (idx % 2) * 16u;\n \n if (m_load_idx < args.m && bk_idx < args.k) {\n let ab_bits = extractBits(metas[args.metas_offset + (m_load_idx * args.k + bk_idx)], inner_idx, 16u);\n shared_ab[idx] = from_fp510(ab_bits); \n } else {\n shared_ab[idx] = 0.0;\n }\n }\n }\n";var forwardMultipleLoadWSnippet=function forwardMultipleLoadWSnippet(bitDepth){return"\n let total_work_w = BM * ROW_PER_BLOCK;\n for (var local_idx = 0u; local_idx < divide_pad(total_work_w, TC); local_idx++) {\n let idx = local_idx * TC + tid;\n if (idx < total_work_w) {\n let m_load_idx = local_bm_idx + idx / ROW_PER_BLOCK;\n let row = idx % ROW_PER_BLOCK;\n let dst = idx * VEC_COL_PER_BLOCK;\n\n if (m_load_idx < args.m) {\n let src = args.blocks_offset + (m_load_idx * args.k + bk_idx) * block_size;\n ".concat(forwardLoadWBitDepthSnippets[bitDepth],"\n } else { \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n shared_w[dst + c] = vec4(0.0);\n }\n }\n }\n }\n")};var forwardMultipleCopyXSnippet="\nfor (var tn_idx = 0u; tn_idx < TN; tn_idx++) { \n var x_sum_vec = vec4(0.0); \n let local_x_idx = tn_idx * VEC_COL_PER_BLOCK;\n let shared_x_idx = (n_idx * TN + tn_idx) * VEC_COL_PER_BLOCK + (k_idx * VEC_COL_PER_BLOCK);\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n local_x[local_x_idx + c] = shared_x[shared_x_idx + c];\n x_sum_vec += local_x[local_x_idx + c];\n }\n local_x_sums[tn_idx] = x_sum_vec.x + x_sum_vec.y + x_sum_vec.z + x_sum_vec.w; \n}\n";var forwardMultipleComputeResultsSnippet="\n for (var tm_idx = 0u; tm_idx < TM; tm_idx++) { \n let shared_ab_idx = ((m_idx * TM + tm_idx) / ROW_PER_BLOCK + k_idx) * 2;\n let alpha = shared_ab[shared_ab_idx];\n let beta = shared_ab[shared_ab_idx + 1]; \n let shared_w_idx = ((m_idx * TM + tm_idx) + k_idx) * VEC_COL_PER_BLOCK;\n \n for (var tn_idx = 0u; tn_idx < TN; tn_idx++) { \n let local_x_idx = tn_idx * VEC_COL_PER_BLOCK;\n \n var swx_vec = vec4(0.0); \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) { \n swx_vec += shared_w[shared_w_idx + c] * local_x[local_x_idx + c];\n }\n let swx = swx_vec.x + swx_vec.y + swx_vec.z + swx_vec.w;\n \n let kappa = alpha * local_x_sums[tn_idx]; \n let results_idx = tm_idx * TN + tn_idx;\n local_results[results_idx] += kappa + (beta * swx);\n }\n }\n";var forwardMultipleWriteResultsSnippet="\nfor (var tm_idx = 0u; tm_idx < TM; tm_idx++) {\n let row = local_bm_idx * ROW_PER_BLOCK + (m_idx * TM + tm_idx); \n for (var tn_idx = 0u; tn_idx < TN; tn_idx++) { \n let col = local_bn_idx + (n_idx * TN + tn_idx);\n if (row < args.m * ROW_PER_BLOCK && col < args.n) {\n let y_idx = args.y_offset + ((row / ROW_PER_BLOCK) * args.n + col) * ROW_PER_BLOCK + (row % ROW_PER_BLOCK);\n let results_idx = tm_idx * TN + tn_idx;\n \n y[y_idx] += local_results[results_idx];\n }\n }\n}\n";var forwardMultipleShaderSources=function forwardMultipleShaderSources(bitDepth){return"\n\n".concat(forwardMultipleInputArgsSnippet,"\n\n").concat(constantSnippet,"\n\n").concat(forwardMultipleSharedPrivateMemSnippet,"\n\n").concat(fromFP510Function,"\n\n").concat(dividePadFunction,"\n\nconst bit_depth: u32 = ").concat(bitDepth,"u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n \n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3\n) {\n ").concat(forwardMultipleLocalVarSnippet,"\n \n for (var bk_idx = 0u; bk_idx < args.k; bk_idx++) { \n ").concat(forwardMultipleLoadXSnippet,"\n ").concat(forwardMultipleLoadABSnippet," \n ").concat(forwardMultipleLoadWSnippet(bitDepth)," \n workgroupBarrier();\n \n ").concat(forwardMultipleCopyXSnippet,"\n ").concat(forwardMultipleComputeResultsSnippet,"\n workgroupBarrier();\n }\n \n ").concat(forwardMultipleWriteResultsSnippet,"\n}\n\n").concat(emptyShader,"\n")};var forwardShuffleXShaderSource="\nstruct argsStruct {\n n: u32,\n shape1: u32,\n x_offset: u32,\n indices_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar indices: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n || global_id.y >= args.shape1) {\n return;\n } \n\n let b = global_id.x;\n let i = global_id.y;\n \n let c = i / 8u;\n let j = i % 8u;\n y[((c * args.n) + b) * 8 + j] = x[args.x_offset + (b * args.shape1) + indices[args.indices_offset + i]];\n}\n\n".concat(emptyShader,"\n");var forwardSingleReduceYShaderSource="\nstruct argsStruct {\n nvr: u32,\n nbc: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar y: array>;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) { \n if (global_id.x > args.nvr) {\n return;\n }\n\n let x_start = global_id.x * args.nbc;\n var sum: vec4 = vec4(0.0, 0.0, 0.0, 0.0);\n for (var i = 0u; i < args.nbc; i++) {\n sum += x[x_start + i]; \n }\n y[global_id.x] += sum;\n}\n\n".concat(emptyShader);var forwardShuffleYShaderSource="\nstruct argsStruct {\n n: u32,\n shape0: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n || global_id.y >= args.shape0) {\n return;\n } \n \n let b = global_id.x;\n let i = global_id.y;\n \n let r = i / 16u;\n let j = i % 16u;\n y[(b * args.shape0) + (r * 16) + j] = x[(((r * args.n) + b) * 16) + j];\n}\n\n".concat(emptyShader);var addBiasShaderSource="\nstruct argsStruct {\n dimension: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar bias: array;\n\n@group(0) @binding(2)\nvar y: array;\n\n".concat(fromFP510Function,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) { \n y[(global_id.x * args.dimension) + global_id.y] += bias[global_id.y];\n}\n\n").concat(emptyShader);var forwardSingleBitDepth1ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 4u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n\n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b0_start = row_blocks_start + br_offset + (bc * block_size);\n var b0_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b0 = blocks[b0_start];\n \n let w0_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w0_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w0_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w0_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 8u;\n \n let w1_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w1_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w1_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w1_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 16u;\n \n let w2_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w2_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w2_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w2_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 24u;\n \n let w3_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w3_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w3_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w3_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w; \n }\n \n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth2ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 8u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n\n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b01_start = row_blocks_start + (br_offset * 2u) + (bc * block_size);\n var b01_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b01 = blocks[b01_start];\n \n let w0_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w0_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w0_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w0_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 16u;\n \n let w1_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w1_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w1_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w1_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 0u; \n b01 = blocks[b01_start + 1u];\n \n let w2_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w2_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w2_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w2_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 16u;\n \n let w3_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w3_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w3_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w3_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w; \n }\n \n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth3ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 12u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id : vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n\n let x_start = ((args.x_offset + c) / 4u);\n \n var b01_start = row_blocks_start + (br_offset * 2u) + (bc * block_size);\n var b2_start = row_blocks_start + br_offset + (bc * block_size) + 8u;\n var b01_offset = 0u;\n var b2_offset = 0u;\n\n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) { \n \n var b01 = blocks[b01_start];\n var b2 = blocks[b2_start];\n \n var b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n var b2_bit = extractBits(b2, b2_offset + j, 1u);\n let w0_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w0_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w0_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w0_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 16u;\n b2_offset = 8u;\n \n b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n b2_bit = extractBits(b2, b2_offset + j, 1u); \n let w1_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w1_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w1_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w1_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 0u;\n b2_offset = 16u; \n b01 = blocks[b01_start + 1u];\n \n b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n b2_bit = extractBits(b2, b2_offset + j, 1u); \n let w2_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w2_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w2_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w2_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 16u;\n b2_offset = 24u; \n \n b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n b2_bit = extractBits(b2, b2_offset + j, 1u); \n let w3_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w3_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w3_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w3_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 0u;\n b2_offset = 0u; \n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n \n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth4ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 16u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size); \n\n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n\n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start]; \n \n let w0_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w0_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w0_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w0_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n b03 = blocks[b03_start + 1];\n \n let w1_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w1_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w1_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w1_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n b03 = blocks[b03_start + 2];\n \n let w2_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w2_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w2_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w2_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n b03 = blocks[b03_start + 3];\n \n let w3_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w3_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w3_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w3_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth5ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 20u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size);\n var b4_start = row_blocks_start + br_offset + (bc * block_size) + 16u;\n \n var b4_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start];\n var b4 = blocks[b4_start];\n \n var b03_bits = extractBits(b03, 4u * j, 4u);\n var b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w0_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w0_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w0_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w0_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03 = blocks[b03_start + 1];\n b4_offset = 8u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w1_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w1_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w1_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w1_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03 = blocks[b03_start + 2];\n b4_offset = 16u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w2_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w2_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w2_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w2_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03 = blocks[b03_start + 3];\n b4_offset = 24u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w3_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w3_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w3_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w3_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b4_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth6ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 24u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size);\n var b45_start = row_blocks_start + (br_offset * 2u) + (bc * block_size) + 16u;\n \n var b45_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start];\n var b45 = blocks[b45_start];\n \n var b03_bits = extractBits(b03, 4u * j, 4u);\n var b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w0_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w0_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w0_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w0_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03 = blocks[b03_start + 1];\n b45_offset = 16u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w1_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w1_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w1_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w1_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u)); \n \n b03 = blocks[b03_start + 2];\n b45 = blocks[b45_start + 1];\n b45_offset = 0u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w2_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w2_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w2_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w2_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03 = blocks[b03_start + 3];\n b45_offset = 16u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w3_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w3_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w3_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w3_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b45_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth7ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 28u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size);\n var b45_start = row_blocks_start + (br_offset * 2u) + (bc * block_size) + 16u;\n var b6_start = row_blocks_start + br_offset + (bc * block_size) + 24u;\n \n var b45_offset = 0u;\n var b6_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start];\n var b45 = blocks[b45_start];\n var b6 = blocks[b6_start];\n \n var b03_bits = extractBits(b03, 4u * j, 4u);\n var b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n var b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w0_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w0_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w0_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w0_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03 = blocks[b03_start + 1];\n b45_offset = 16u;\n b6_offset = 8u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w1_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w1_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w1_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w1_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03 = blocks[b03_start + 2];\n b45 = blocks[b45_start + 1];\n b45_offset = 0u;\n b6_offset = 16u;\n\n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w2_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w2_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w2_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w2_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03 = blocks[b03_start + 3];\n b45_offset = 16u;\n b6_offset = 24u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w3_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w3_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w3_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w3_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b45_offset = 0u;\n b6_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth8ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 32u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b07_start = row_blocks_start + (br_offset * 8u) + (bc * block_size); \n\n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n\n for (var j = 0u; j < 2; j++) {\n \n var b07 = blocks[b07_start + j];\n \n let w0_0 = f32(extractBits(b07, 0u, 8u)); \n let w0_1 = f32(extractBits(b07, 8u, 8u)); \n let w0_2 = f32(extractBits(b07, 16u, 8u));\n let w0_3 = f32(extractBits(b07, 24u, 8u));\n \n b07 = blocks[b07_start + 2 + j];\n \n let w1_0 = f32(extractBits(b07, 0u, 8u)); \n let w1_1 = f32(extractBits(b07, 8u, 8u)); \n let w1_2 = f32(extractBits(b07, 16u, 8u));\n let w1_3 = f32(extractBits(b07, 24u, 8u));\n \n b07 = blocks[b07_start + 4 + j];\n \n let w2_0 = f32(extractBits(b07, 0u, 8u)); \n let w2_1 = f32(extractBits(b07, 8u, 8u)); \n let w2_2 = f32(extractBits(b07, 16u, 8u));\n let w2_3 = f32(extractBits(b07, 24u, 8u));\n \n b07 = blocks[b07_start + 6 + j];\n \n let w3_0 = f32(extractBits(b07, 0u, 8u)); \n let w3_1 = f32(extractBits(b07, 8u, 8u)); \n let w3_2 = f32(extractBits(b07, 16u, 8u));\n let w3_3 = f32(extractBits(b07, 24u, 8u));\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_vec = x[x_start + j];\n res[j] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleShaderSources={1:forwardSingleBitDepth1ShaderSource,2:forwardSingleBitDepth2ShaderSource,3:forwardSingleBitDepth3ShaderSource,4:forwardSingleBitDepth4ShaderSource,5:forwardSingleBitDepth5ShaderSource,6:forwardSingleBitDepth6ShaderSource,7:forwardSingleBitDepth7ShaderSource,8:forwardSingleBitDepth8ShaderSource};var forwardSingleShaderNames={1:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_1_shader",2:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_2_shader",3:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_3_shader",4:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_4_shader",5:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_5_shader",6:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_6_shader",7:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_7_shader",8:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_8_shader"};var forwardShaderSources={1:forwardMultipleShaderSources(1),2:forwardMultipleShaderSources(2),3:forwardMultipleShaderSources(3),4:forwardMultipleShaderSources(4),5:forwardMultipleShaderSources(5),6:forwardMultipleShaderSources(6),7:forwardMultipleShaderSources(7),8:forwardMultipleShaderSources(8)};var forwardShaderNames={1:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_1_shader",2:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_2_shader",3:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_3_shader",4:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_4_shader",5:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_5_shader",6:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_6_shader",7:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_7_shader",8:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_8_shader"};var forwardShuffleXShaderName="pv_picollm_weight_block_mixed_16x8_forward_shuffle_x_shader";var forwardShuffleYShaderName="pv_picollm_weight_block_mixed_16x8_forward_shuffle_y_shader";var addBiasShaderName="pv_picollm_weight_block_mixed_16x8_add_bias_shader";var forwardSingleReduceYShaderName="pv_picollm_weight_block_mixed_16x8_forward_single_reduce_y_shader";var _weightBlockMixed16x;var loadPreprocessBlocksShader=function loadPreprocessBlocksShader(device,bitDepth){var bindGroupLayout=device.createBindGroupLayout({label:"weight preprocess blocks ".concat(bitDepth," bind group layout"),entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight preprocess blocks ".concat(bitDepth," pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight preprocess blocks ".concat(bitDepth," shader module"),code:preprocessShaderSources[bitDepth]});var computePipeline=device.createComputePipeline({label:"weight preprocess blocks ".concat(bitDepth," pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:preprocessDim,workgroup_size_y:preprocessDim}}});return{computePipeline:computePipeline}};var loadForwardShuffleXShader=function loadForwardShuffleXShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight shuffle x bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight shuffle x pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight shuffle x shader module",code:forwardShuffleXShaderSource});var computePipeline=device.createComputePipeline({label:"weight shuffle x pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_y:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var loadForwardSingleReduceYShader=function loadForwardSingleReduceYShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight single reduce y bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight single reduce y pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight single reduce y shader module",code:forwardSingleReduceYShaderSource});var computePipeline=device.createComputePipeline({label:"weight single reduce y pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var loadForwardShuffleYShader=function loadForwardShuffleYShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight shuffle y bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight shuffle y pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight shuffle y shader module",code:forwardShuffleYShaderSource});var computePipeline=device.createComputePipeline({label:"weight shuffle y pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var loadForwardSingleShader=function loadForwardSingleShader(device,bitDepth){var entries=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}];var bindGroupLayout=device.createBindGroupLayout({label:"weight forward single ".concat(bitDepth," bind group layout"),entries:entries});var pipelineLayout=device.createPipelineLayout({label:"weight forward single ".concat(bitDepth," pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight forward single ".concat(bitDepth," shader module"),code:forwardSingleShaderSources[bitDepth]});var computePipeline=device.createComputePipeline({label:"weight forward single ".concat(bitDepth," pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:weightBlockSize,workgroup_size_y:1}}});return{computePipeline:computePipeline}};var loadForwardShader=function loadForwardShader(device,bitDepth){var entries=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}];var bindGroupLayout=device.createBindGroupLayout({label:"weight forward multi ".concat(bitDepth," bind group layout"),entries:entries});var pipelineLayout=device.createPipelineLayout({label:"weight forward multi ".concat(bitDepth," pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight forward multi ".concat(bitDepth," shader module"),code:forwardShaderSources[bitDepth]});var computePipeline=device.createComputePipeline({label:"weight forward multi ".concat(bitDepth," pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:TC}}});return{computePipeline:computePipeline}};var loadAddBiasShader=function loadAddBiasShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight add bias bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight add bias pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight add bias shader module",code:addBiasShaderSource});var computePipeline=device.createComputePipeline({label:"weight add bias pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var weightBlockMixed16x8Shaders=(_weightBlockMixed16x={},_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_weightBlockMixed16x,preprocessShaderNames[3],function(device){return loadPreprocessBlocksShader(device,3)}),preprocessShaderNames[5],function(device){return loadPreprocessBlocksShader(device,5)}),preprocessShaderNames[6],function(device){return loadPreprocessBlocksShader(device,6)}),preprocessShaderNames[7],function(device){return loadPreprocessBlocksShader(device,7)}),forwardShuffleXShaderName,loadForwardShuffleXShader),forwardShuffleYShaderName,loadForwardShuffleYShader),forwardSingleReduceYShaderName,loadForwardSingleReduceYShader),forwardSingleShaderNames[1],function(device){return loadForwardSingleShader(device,1)}),forwardSingleShaderNames[2],function(device){return loadForwardSingleShader(device,2)}),forwardSingleShaderNames[3],function(device){return loadForwardSingleShader(device,3)}),_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_weightBlockMixed16x,forwardSingleShaderNames[4],function(device){return loadForwardSingleShader(device,4)}),forwardSingleShaderNames[5],function(device){return loadForwardSingleShader(device,5)}),forwardSingleShaderNames[6],function(device){return loadForwardSingleShader(device,6)}),forwardSingleShaderNames[7],function(device){return loadForwardSingleShader(device,7)}),forwardSingleShaderNames[8],function(device){return loadForwardSingleShader(device,8)}),forwardShaderNames[1],function(device){return loadForwardShader(device,1)}),forwardShaderNames[2],function(device){return loadForwardShader(device,2)}),forwardShaderNames[3],function(device){return loadForwardShader(device,3)}),forwardShaderNames[4],function(device){return loadForwardShader(device,4)}),forwardShaderNames[5],function(device){return loadForwardShader(device,5)}),_defineProperty(_defineProperty(_defineProperty(_defineProperty(_weightBlockMixed16x,forwardShaderNames[6],function(device){return loadForwardShader(device,6)}),forwardShaderNames[7],function(device){return loadForwardShader(device,7)}),forwardShaderNames[8],function(device){return loadForwardShader(device,8)}),addBiasShaderName,loadAddBiasShader));function ownKeys$1(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread$1(e){for(var r=1;r=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e1&&_args[1]!==undefined?_args[1]:{};time=_args.length>2&&_args[2]!==undefined?_args[2]:5e3;controller=new AbortController;config=_objectSpread(_objectSpread({},options),{},{signal:controller.signal});timeout=setTimeout(function(){controller.abort()},time);_context.next=7;return fetch(uri,config);case 7:response=_context.sent;clearTimeout(timeout);return _context.abrupt("return",response);case 10:case"end":return _context.stop()}},_callee)}));return _fetchWithTimeout.apply(this,arguments)}function open(_x2,_x3){return _open.apply(this,arguments)}function _open(){_open=_asyncToGenerator(_regeneratorRuntime.mark(function _callee2(path,mode){var error;return _regeneratorRuntime.wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:_context2.prev=0;_context2.next=3;return PvFileIDB.open(path,mode);case 3:return _context2.abrupt("return",_context2.sent);case 6:_context2.prev=6;_context2.t0=_context2["catch"](0);if(_context2.t0.name==="IndexedDBNotSupported"){console.warn("IndexedDB is not supported. Fallback to in-memory storage.")}else if(_context2.t0.name!=="FileNotExists"){console.warn("Unable to access IndexedDB (".concat(_context2.t0.toString(),"). Fallback to in-memory storage."))}if(!(typeof WorkerGlobalScope!=="undefined"&&self instanceof WorkerGlobalScope)){_context2.next=16;break}if(!(_context2.t0.name==="FileNotExists")){_context2.next=12;break}throw _context2.t0;case 12:console.error("In-memory storage cannot be used inside a worker.");error=new Error("Failed to start PvFile: ".concat(_context2.t0.toString()));error.name="PvFileNotSupported";throw error;case 16:return _context2.abrupt("return",PvFileMem.open(path,mode));case 17:case"end":return _context2.stop()}},_callee2,null,[[0,6]])}));return _open.apply(this,arguments)}var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=url=>{if(isFileURI(url)){return new Promise((reject,resolve)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response)}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}return fetch(url,{credentials:"same-origin"}).then(response=>{if(response.ok){return response.arrayBuffer()}return Promise.reject(new Error(response.status+" : "+response.url))})}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith("file://");function findWasmBinary(){var f="pv_orca_simd.wasm";if(!isDataURI(f)){return locateFile(f)}return f}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary){return readAsync(binaryFile).then(response=>new Uint8Array(response),()=>getBinarySync(binaryFile))}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function getWasmImports(){return{a:wasmImports}}function createWasm(){var info=getWasmImports();function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=Asyncify.instrumentWasmExports(wasmExports);wasmMemory=wasmExports["u"];updateMemoryViews();wasmTable=wasmExports["Fb"];addOnInit(wasmExports["v"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}if(!wasmBinaryFile)wasmBinaryFile=findWasmBinary();instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var noExitRuntime=Module["noExitRuntime"]||true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();function syscallGetVarargI(){var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key of Object.keys(node.contents)){entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url).then(arrayBuffer=>{onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},err=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)};var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,processData,onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:class{constructor(errno){this.name="ErrnoError";this.errno=errno}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev;this.readMode=292|73;this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;iFS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""});FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS:MEMFS}},init(input,output,error){FS.init.initialized=true;Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit(){FS.init.initialized=false;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat(func,path,buf){var stat=func(path);HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;HEAP64[buf+24>>3]=BigInt(stat.size);HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>2]=atime%1e3*1e3;HEAP64[buf+56>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>2]=mtime%1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>2]=ctime%1e3*1e3;HEAP64[buf+88>>3]=BigInt(stat.ino);return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>{abort("")};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var __tzset_js=(timezone,daylight,std_name,dst_name)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffset2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToAscii=(str,buffer)=>{for(var i=0;i{var bufSize=0;getEnvStrings().forEach((string,i)=>{var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(string=>bufSize+=string.length+1);HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _pv_console_log_wasm(index){console.log(arrayBufferToStringAtIndex(Module.HEAPU8,index))}var _pv_file_close_wasm=async function(fileAddress,statusAddress){statusAddress=unsignedAddress(statusAddress);return Asyncify.handleAsync(async()=>{try{const file=await PvFile.getPtr(fileAddress);await file.close();setInt(statusAddress,0)}catch(e){console.error("pvFileCloseWasm",e);setInt(statusAddress,-1)}})};_pv_file_close_wasm.isAsync=true;var _pv_file_open_wasm=async function(fileAddress,pathAddress,modeAddress,statusAddress){pathAddress=unsignedAddress(pathAddress);modeAddress=unsignedAddress(modeAddress);statusAddress=unsignedAddress(statusAddress);return Asyncify.handleAsync(async()=>{const path=arrayBufferToStringAtIndex(Module.HEAPU8,pathAddress);const mode=arrayBufferToStringAtIndex(Module.HEAPU8,modeAddress);try{const file=await open(path,mode);PvFile.setPtr(fileAddress,file);setInt(statusAddress,0)}catch(e){if(e.name!=="FileNotExists"){console.error("pvFileOpenWasm",e)}setInt(statusAddress,-1)}})};_pv_file_open_wasm.isAsync=true;var _pv_file_read_wasm=async function(fileAddress,contentAddress,size,count,numReadAddress){contentAddress=unsignedAddress(contentAddress);numReadAddress=unsignedAddress(numReadAddress);return Asyncify.handleAsync(async()=>{try{const file=PvFile.getPtr(fileAddress);const content=await file.read(size,count);Module.HEAPU8.set(content,contentAddress);setInt(numReadAddress,content.length/size)}catch(e){console.error("pvFileReadWasm",e);setInt(numReadAddress,-1)}})};_pv_file_read_wasm.isAsync=true;function _pv_file_seek_wasm(fileAddress,offset,whence,statusAddress){statusAddress=unsignedAddress(statusAddress);try{const file=PvFile.getPtr(fileAddress);file.seek(offset,whence);setInt(statusAddress,0)}catch(e){console.error("pvFileSeekWasm",e);setInt(statusAddress,-1)}}function _pv_file_tell_wasm(fileAddress,offsetAddress){offsetAddress=unsignedAddress(offsetAddress);try{const file=PvFile.getPtr(fileAddress);setInt(offsetAddress,file.tell())}catch(e){console.error("pvFileTellWasm",e);setInt(offsetAddress,-1)}}var _pv_file_write_wasm=function(fileAddress,contentAddress,size,count,numWriteAddress){contentAddress=unsignedAddress(contentAddress);numWriteAddress=unsignedAddress(numWriteAddress);return Asyncify.handleAsync(async()=>{try{const file=PvFile.getPtr(fileAddress);const content=new Uint8Array(size*count);content.set(Module.HEAPU8.slice(contentAddress,contentAddress+size*count),0);await file.write(content);setInt(numWriteAddress,content.length/size)}catch(e){console.error("pvFileWriteWasm",e);setInt(numWriteAddress,-1)}})};var _pv_https_request_wasm=async function(httpMethodAddress,serverNameAddress,endpointAddress,headerAddress,bodyAddress,timeoutMs,responseAddressAddress,responseSizeAddress,responseCodeAddress){httpMethodAddress=unsignedAddress(httpMethodAddress);serverNameAddress=unsignedAddress(serverNameAddress);endpointAddress=unsignedAddress(endpointAddress);headerAddress=unsignedAddress(headerAddress);bodyAddress=unsignedAddress(bodyAddress);responseAddressAddress=unsignedAddress(responseAddressAddress);responseSizeAddress=unsignedAddress(responseSizeAddress);responseCodeAddress=unsignedAddress(responseCodeAddress);return Asyncify.handleAsync(async()=>{const httpMethod=arrayBufferToStringAtIndex(Module.HEAPU8,httpMethodAddress);const serverName=arrayBufferToStringAtIndex(Module.HEAPU8,serverNameAddress);const endpoint=arrayBufferToStringAtIndex(Module.HEAPU8,endpointAddress);const header=arrayBufferToStringAtIndex(Module.HEAPU8,headerAddress);const body=arrayBufferToStringAtIndex(Module.HEAPU8,bodyAddress);const headerObject=stringHeaderToObject(header);const options={method:httpMethod};if(body.length>0){options.body=body}if(Object.keys(headerObject).length>0){options.headers=headerObject}let response;let responseText;let statusCode;try{response=await fetchWithTimeout("https://"+serverName+endpoint,options,timeoutMs);statusCode=response.status}catch(error){console.error("pvHttpsRequestWasm",`Failed to fetch: ${error}`);return}try{responseText=await response.text()}catch(error){console.error("pvHttpsRequestWasm",`Failed to get response text: ${error}`);return}const responseAddress=Module._malloc((responseText.length+1)*Int8Array.BYTES_PER_ELEMENT);if(responseAddress===0){console.error("pvMallocError","pvHttpsRequestWasm: cannot allocate memory for response");setInt(responseAddressAddress,0);return}setInt(responseSizeAddress,responseText.length+1);setInt(responseAddressAddress,responseAddress);for(let i=0;i{try{return func()}catch(e){abort(e)}};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var sigToWasmTypes=sig=>{var typeNames={i:"i32",j:"i64",f:"f32",d:"f64",e:"externref",p:"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i{runtimeKeepaliveCounter+=1};var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};var Asyncify={instrumentWasmImports(imports){var importPattern=/^(pv_https_request_wasm|pv_file_open_wasm|pv_file_close_wasm|pv_file_read_wasm|pv_file_write_wasm|pv_file_remove_wasm|pv_sleep_wasm|pv_xpu_webgpu_device_init_wasm|pv_xpu_webgpu_device_info_wasm|pv_xpu_webgpu_device_mem_copy_from_xpu_wasm|pv_xpu_webgpu_device_wait_wasm|pv_xpu_webgpu_timer_stop_wasm|invoke_.*|__asyncjs__.*)$/;for(let[x,original]of Object.entries(imports)){if(typeof original=="function"){let isAsyncifyImport=original.isAsync||importPattern.test(x)}}},instrumentWasmExports(exports){var ret={};for(let[x,original]of Object.entries(exports)){if(typeof original=="function"){ret[x]=(...args)=>{Asyncify.exportCallStack.push(x);try{return original(...args)}finally{if(!ABORT){var y=Asyncify.exportCallStack.pop();Asyncify.maybeStopUnwind()}}}}else{ret[x]=original}}return ret},State:{Normal:0,Unwinding:1,Rewinding:2,Disabled:3},state:0,StackSize:4096,currData:null,handleSleepReturnValue:0,exportCallStack:[],callStackNameToId:{},callStackIdToName:{},callStackId:0,asyncPromiseHandlers:null,sleepCallbacks:[],getCallStackId(funcName){var id=Asyncify.callStackNameToId[funcName];if(id===undefined){id=Asyncify.callStackId++;Asyncify.callStackNameToId[funcName]=id;Asyncify.callStackIdToName[id]=funcName}return id},maybeStopUnwind(){if(Asyncify.currData&&Asyncify.state===Asyncify.State.Unwinding&&Asyncify.exportCallStack.length===0){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_unwind);if(typeof Fibers!="undefined"){Fibers.trampoline()}}},whenDone(){return new Promise((resolve,reject)=>{Asyncify.asyncPromiseHandlers={resolve:resolve,reject:reject}})},allocateData(){var ptr=_malloc(12+Asyncify.StackSize);Asyncify.setDataHeader(ptr,ptr+12,Asyncify.StackSize);Asyncify.setDataRewindFunc(ptr);return ptr},setDataHeader(ptr,stack,stackSize){HEAPU32[ptr>>2]=stack;HEAPU32[ptr+4>>2]=stack+stackSize},setDataRewindFunc(ptr){var bottomOfCallStack=Asyncify.exportCallStack[0];var rewindId=Asyncify.getCallStackId(bottomOfCallStack);HEAP32[ptr+8>>2]=rewindId},getDataRewindFuncName(ptr){var id=HEAP32[ptr+8>>2];var name=Asyncify.callStackIdToName[id];return name},getDataRewindFunc(name){var func=wasmExports[name];return func},doRewind(ptr){var name=Asyncify.getDataRewindFuncName(ptr);var func=Asyncify.getDataRewindFunc(name);return func()},handleSleep(startAsync){if(ABORT)return;if(Asyncify.state===Asyncify.State.Normal){var reachedCallback=false;var reachedAfterCallback=false;startAsync((handleSleepReturnValue=0)=>{if(ABORT)return;Asyncify.handleSleepReturnValue=handleSleepReturnValue;reachedCallback=true;if(!reachedAfterCallback){return}Asyncify.state=Asyncify.State.Rewinding;runAndAbortIfError(()=>_asyncify_start_rewind(Asyncify.currData));if(typeof Browser!="undefined"&&Browser.mainLoop.func){Browser.mainLoop.resume()}var asyncWasmReturnValue,isError=false;try{asyncWasmReturnValue=Asyncify.doRewind(Asyncify.currData)}catch(err){asyncWasmReturnValue=err;isError=true}var handled=false;if(!Asyncify.currData){var asyncPromiseHandlers=Asyncify.asyncPromiseHandlers;if(asyncPromiseHandlers){Asyncify.asyncPromiseHandlers=null;(isError?asyncPromiseHandlers.reject:asyncPromiseHandlers.resolve)(asyncWasmReturnValue);handled=true}}if(isError&&!handled){throw asyncWasmReturnValue}});reachedAfterCallback=true;if(!reachedCallback){Asyncify.state=Asyncify.State.Unwinding;Asyncify.currData=Asyncify.allocateData();if(typeof Browser!="undefined"&&Browser.mainLoop.func){Browser.mainLoop.pause()}runAndAbortIfError(()=>_asyncify_start_unwind(Asyncify.currData))}}else if(Asyncify.state===Asyncify.State.Rewinding){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_rewind);_free(Asyncify.currData);Asyncify.currData=null;Asyncify.sleepCallbacks.forEach(callUserCallback)}else{abort(`invalid state: ${Asyncify.state}`)}return Asyncify.handleSleepReturnValue},handleAsync(startAsync){return Asyncify.handleSleep(wakeUp=>{startAsync().then(wakeUp)})}};var uleb128Encode=(n,target)=>{if(n<128){target.push(n)}else{target.push(n%128|128,n>>7)}};var generateFuncType=(sig,target)=>{var sigRet=sig.slice(0,1);var sigParam=sig.slice(1);var typeCodes={i:127,p:127,j:126,f:125,d:124,e:111};target.push(96);uleb128Encode(sigParam.length,target);for(var i=0;i{if(typeof WebAssembly.Function=="function"){return new WebAssembly.Function(sigToWasmTypes(sig),func)}var typeSectionBody=[1];generateFuncType(sig,typeSectionBody);var bytes=[0,97,115,109,1,0,0,0,1];uleb128Encode(typeSectionBody.length,bytes);bytes.push(...typeSectionBody);bytes.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);var module=new WebAssembly.Module(new Uint8Array(bytes));var instance=new WebAssembly.Instance(module,{e:{f:func}});var wrappedFunc=instance.exports["f"];return wrappedFunc};var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var updateTableMap=(offset,count)=>{if(functionsInTableMap){for(var i=offset;i{if(!functionsInTableMap){functionsInTableMap=new WeakMap;updateTableMap(0,wasmTable.length)}return functionsInTableMap.get(func)||0};var freeTableIndexes=[];var getEmptyTableSlot=()=>{if(freeTableIndexes.length){return freeTableIndexes.pop()}try{wasmTable.grow(1)}catch(err){if(!(err instanceof RangeError)){throw err}throw"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH."}return wasmTable.length-1};var setWasmTableEntry=(idx,func)=>{wasmTable.set(idx,func);wasmTableMirror[idx]=wasmTable.get(idx)};var addFunction=(func,sig)=>{var rtn=getFunctionAddress(func);if(rtn){return rtn}var ret=getEmptyTableSlot();try{setWasmTableEntry(ret,func)}catch(err){if(!(err instanceof TypeError)){throw err}var wrapped=convertJsFunctionToWasm(func,sig);setWasmTableEntry(ret,wrapped)}functionsInTableMap.set(func,ret);return ret};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};Module["cwrap"]=cwrap;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();var wasmImports={h:___syscall_openat,i:__abort_js,s:__tzset_js,p:_emscripten_resize_heap,q:_environ_get,r:_environ_sizes_get,c:_exit,b:_fd_close,g:_fd_read,f:_fd_seek,a:_fd_write,e:_pv_console_log_wasm,n:_pv_file_close_wasm,o:_pv_file_open_wasm,d:_pv_file_read_wasm,m:_pv_file_seek_wasm,l:_pv_file_tell_wasm,k:_pv_file_write_wasm,j:_pv_https_request_wasm,t:_pv_time_wasm};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["v"])();var __Znwm=Module["__Znwm"]=a0=>(__Znwm=Module["__Znwm"]=wasmExports["w"])(a0);var __Znam=Module["__Znam"]=a0=>(__Znam=Module["__Znam"]=wasmExports["x"])(a0);var __ZdlPv=Module["__ZdlPv"]=a0=>(__ZdlPv=Module["__ZdlPv"]=wasmExports["y"])(a0);var __ZdlPvm=Module["__ZdlPvm"]=(a0,a1)=>(__ZdlPvm=Module["__ZdlPvm"]=wasmExports["z"])(a0,a1);var __ZdaPv=Module["__ZdaPv"]=a0=>(__ZdaPv=Module["__ZdaPv"]=wasmExports["A"])(a0);var __ZdaPvm=Module["__ZdaPvm"]=(a0,a1)=>(__ZdaPvm=Module["__ZdaPvm"]=wasmExports["B"])(a0,a1);var __ZnwmSt11align_val_t=Module["__ZnwmSt11align_val_t"]=(a0,a1)=>(__ZnwmSt11align_val_t=Module["__ZnwmSt11align_val_t"]=wasmExports["C"])(a0,a1);var __ZnamSt11align_val_t=Module["__ZnamSt11align_val_t"]=(a0,a1)=>(__ZnamSt11align_val_t=Module["__ZnamSt11align_val_t"]=wasmExports["D"])(a0,a1);var __ZdlPvSt11align_val_t=Module["__ZdlPvSt11align_val_t"]=(a0,a1)=>(__ZdlPvSt11align_val_t=Module["__ZdlPvSt11align_val_t"]=wasmExports["E"])(a0,a1);var __ZdlPvmSt11align_val_t=Module["__ZdlPvmSt11align_val_t"]=(a0,a1,a2)=>(__ZdlPvmSt11align_val_t=Module["__ZdlPvmSt11align_val_t"]=wasmExports["F"])(a0,a1,a2);var __ZdaPvSt11align_val_t=Module["__ZdaPvSt11align_val_t"]=(a0,a1)=>(__ZdaPvSt11align_val_t=Module["__ZdaPvSt11align_val_t"]=wasmExports["G"])(a0,a1);var __ZdaPvmSt11align_val_t=Module["__ZdaPvmSt11align_val_t"]=(a0,a1,a2)=>(__ZdaPvmSt11align_val_t=Module["__ZdaPvmSt11align_val_t"]=wasmExports["H"])(a0,a1,a2);var __ZSt14set_unexpectedPFvvE=Module["__ZSt14set_unexpectedPFvvE"]=a0=>(__ZSt14set_unexpectedPFvvE=Module["__ZSt14set_unexpectedPFvvE"]=wasmExports["I"])(a0);var __ZSt13set_terminatePFvvE=Module["__ZSt13set_terminatePFvvE"]=a0=>(__ZSt13set_terminatePFvvE=Module["__ZSt13set_terminatePFvvE"]=wasmExports["J"])(a0);var __ZSt15set_new_handlerPFvvE=Module["__ZSt15set_new_handlerPFvvE"]=a0=>(__ZSt15set_new_handlerPFvvE=Module["__ZSt15set_new_handlerPFvvE"]=wasmExports["K"])(a0);var __ZSt14get_unexpectedv=Module["__ZSt14get_unexpectedv"]=()=>(__ZSt14get_unexpectedv=Module["__ZSt14get_unexpectedv"]=wasmExports["L"])();var __ZSt10unexpectedv=Module["__ZSt10unexpectedv"]=()=>(__ZSt10unexpectedv=Module["__ZSt10unexpectedv"]=wasmExports["M"])();var __ZSt13get_terminatev=Module["__ZSt13get_terminatev"]=()=>(__ZSt13get_terminatev=Module["__ZSt13get_terminatev"]=wasmExports["N"])();var __ZSt9terminatev=Module["__ZSt9terminatev"]=()=>(__ZSt9terminatev=Module["__ZSt9terminatev"]=wasmExports["O"])();var __ZSt15get_new_handlerv=Module["__ZSt15get_new_handlerv"]=()=>(__ZSt15get_new_handlerv=Module["__ZSt15get_new_handlerv"]=wasmExports["P"])();var ___cxa_current_primary_exception=Module["___cxa_current_primary_exception"]=()=>(___cxa_current_primary_exception=Module["___cxa_current_primary_exception"]=wasmExports["Q"])();var ___cxa_rethrow_primary_exception=Module["___cxa_rethrow_primary_exception"]=a0=>(___cxa_rethrow_primary_exception=Module["___cxa_rethrow_primary_exception"]=wasmExports["R"])(a0);var ___cxa_uncaught_exception=Module["___cxa_uncaught_exception"]=()=>(___cxa_uncaught_exception=Module["___cxa_uncaught_exception"]=wasmExports["S"])();var ___cxa_uncaught_exceptions=Module["___cxa_uncaught_exceptions"]=()=>(___cxa_uncaught_exceptions=Module["___cxa_uncaught_exceptions"]=wasmExports["T"])();var ___cxa_allocate_exception=Module["___cxa_allocate_exception"]=a0=>(___cxa_allocate_exception=Module["___cxa_allocate_exception"]=wasmExports["U"])(a0);var ___cxa_free_exception=Module["___cxa_free_exception"]=a0=>(___cxa_free_exception=Module["___cxa_free_exception"]=wasmExports["V"])(a0);var ___cxa_init_primary_exception=Module["___cxa_init_primary_exception"]=(a0,a1,a2)=>(___cxa_init_primary_exception=Module["___cxa_init_primary_exception"]=wasmExports["W"])(a0,a1,a2);var ___cxa_pure_virtual=Module["___cxa_pure_virtual"]=()=>(___cxa_pure_virtual=Module["___cxa_pure_virtual"]=wasmExports["X"])();var ___cxa_deleted_virtual=Module["___cxa_deleted_virtual"]=()=>(___cxa_deleted_virtual=Module["___cxa_deleted_virtual"]=wasmExports["Y"])();var ___dynamic_cast=Module["___dynamic_cast"]=(a0,a1,a2,a3)=>(___dynamic_cast=Module["___dynamic_cast"]=wasmExports["Z"])(a0,a1,a2,a3);var __ZNSt9exceptionD2Ev=Module["__ZNSt9exceptionD2Ev"]=a0=>(__ZNSt9exceptionD2Ev=Module["__ZNSt9exceptionD2Ev"]=wasmExports["_"])(a0);var __ZNSt9exceptionD0Ev=Module["__ZNSt9exceptionD0Ev"]=a0=>(__ZNSt9exceptionD0Ev=Module["__ZNSt9exceptionD0Ev"]=wasmExports["$"])(a0);var __ZNSt9exceptionD1Ev=Module["__ZNSt9exceptionD1Ev"]=a0=>(__ZNSt9exceptionD1Ev=Module["__ZNSt9exceptionD1Ev"]=wasmExports["aa"])(a0);var __ZNKSt9exception4whatEv=Module["__ZNKSt9exception4whatEv"]=a0=>(__ZNKSt9exception4whatEv=Module["__ZNKSt9exception4whatEv"]=wasmExports["ba"])(a0);var __ZNSt13bad_exceptionD0Ev=Module["__ZNSt13bad_exceptionD0Ev"]=a0=>(__ZNSt13bad_exceptionD0Ev=Module["__ZNSt13bad_exceptionD0Ev"]=wasmExports["ca"])(a0);var __ZNSt13bad_exceptionD1Ev=Module["__ZNSt13bad_exceptionD1Ev"]=a0=>(__ZNSt13bad_exceptionD1Ev=Module["__ZNSt13bad_exceptionD1Ev"]=wasmExports["da"])(a0);var __ZNKSt13bad_exception4whatEv=Module["__ZNKSt13bad_exception4whatEv"]=a0=>(__ZNKSt13bad_exception4whatEv=Module["__ZNKSt13bad_exception4whatEv"]=wasmExports["ea"])(a0);var __ZNSt9bad_allocC2Ev=Module["__ZNSt9bad_allocC2Ev"]=a0=>(__ZNSt9bad_allocC2Ev=Module["__ZNSt9bad_allocC2Ev"]=wasmExports["fa"])(a0);var __ZNSt9bad_allocD0Ev=Module["__ZNSt9bad_allocD0Ev"]=a0=>(__ZNSt9bad_allocD0Ev=Module["__ZNSt9bad_allocD0Ev"]=wasmExports["ga"])(a0);var __ZNSt9bad_allocD1Ev=Module["__ZNSt9bad_allocD1Ev"]=a0=>(__ZNSt9bad_allocD1Ev=Module["__ZNSt9bad_allocD1Ev"]=wasmExports["ha"])(a0);var __ZNKSt9bad_alloc4whatEv=Module["__ZNKSt9bad_alloc4whatEv"]=a0=>(__ZNKSt9bad_alloc4whatEv=Module["__ZNKSt9bad_alloc4whatEv"]=wasmExports["ia"])(a0);var __ZNSt20bad_array_new_lengthC2Ev=Module["__ZNSt20bad_array_new_lengthC2Ev"]=a0=>(__ZNSt20bad_array_new_lengthC2Ev=Module["__ZNSt20bad_array_new_lengthC2Ev"]=wasmExports["ja"])(a0);var __ZNSt20bad_array_new_lengthD0Ev=Module["__ZNSt20bad_array_new_lengthD0Ev"]=a0=>(__ZNSt20bad_array_new_lengthD0Ev=Module["__ZNSt20bad_array_new_lengthD0Ev"]=wasmExports["ka"])(a0);var __ZNSt20bad_array_new_lengthD1Ev=Module["__ZNSt20bad_array_new_lengthD1Ev"]=a0=>(__ZNSt20bad_array_new_lengthD1Ev=Module["__ZNSt20bad_array_new_lengthD1Ev"]=wasmExports["la"])(a0);var __ZNKSt20bad_array_new_length4whatEv=Module["__ZNKSt20bad_array_new_length4whatEv"]=a0=>(__ZNKSt20bad_array_new_length4whatEv=Module["__ZNKSt20bad_array_new_length4whatEv"]=wasmExports["ma"])(a0);var __ZNSt13bad_exceptionD2Ev=Module["__ZNSt13bad_exceptionD2Ev"]=a0=>(__ZNSt13bad_exceptionD2Ev=Module["__ZNSt13bad_exceptionD2Ev"]=wasmExports["na"])(a0);var __ZNSt9bad_allocC1Ev=Module["__ZNSt9bad_allocC1Ev"]=a0=>(__ZNSt9bad_allocC1Ev=Module["__ZNSt9bad_allocC1Ev"]=wasmExports["oa"])(a0);var __ZNSt9bad_allocD2Ev=Module["__ZNSt9bad_allocD2Ev"]=a0=>(__ZNSt9bad_allocD2Ev=Module["__ZNSt9bad_allocD2Ev"]=wasmExports["pa"])(a0);var __ZNSt20bad_array_new_lengthC1Ev=Module["__ZNSt20bad_array_new_lengthC1Ev"]=a0=>(__ZNSt20bad_array_new_lengthC1Ev=Module["__ZNSt20bad_array_new_lengthC1Ev"]=wasmExports["qa"])(a0);var __ZNSt20bad_array_new_lengthD2Ev=Module["__ZNSt20bad_array_new_lengthD2Ev"]=a0=>(__ZNSt20bad_array_new_lengthD2Ev=Module["__ZNSt20bad_array_new_lengthD2Ev"]=wasmExports["ra"])(a0);var __ZNSt11logic_errorD2Ev=Module["__ZNSt11logic_errorD2Ev"]=a0=>(__ZNSt11logic_errorD2Ev=Module["__ZNSt11logic_errorD2Ev"]=wasmExports["sa"])(a0);var __ZNSt11logic_errorD0Ev=Module["__ZNSt11logic_errorD0Ev"]=a0=>(__ZNSt11logic_errorD0Ev=Module["__ZNSt11logic_errorD0Ev"]=wasmExports["ta"])(a0);var __ZNSt11logic_errorD1Ev=Module["__ZNSt11logic_errorD1Ev"]=a0=>(__ZNSt11logic_errorD1Ev=Module["__ZNSt11logic_errorD1Ev"]=wasmExports["ua"])(a0);var __ZNKSt11logic_error4whatEv=Module["__ZNKSt11logic_error4whatEv"]=a0=>(__ZNKSt11logic_error4whatEv=Module["__ZNKSt11logic_error4whatEv"]=wasmExports["va"])(a0);var __ZNSt13runtime_errorD2Ev=Module["__ZNSt13runtime_errorD2Ev"]=a0=>(__ZNSt13runtime_errorD2Ev=Module["__ZNSt13runtime_errorD2Ev"]=wasmExports["wa"])(a0);var __ZNSt13runtime_errorD0Ev=Module["__ZNSt13runtime_errorD0Ev"]=a0=>(__ZNSt13runtime_errorD0Ev=Module["__ZNSt13runtime_errorD0Ev"]=wasmExports["xa"])(a0);var __ZNSt13runtime_errorD1Ev=Module["__ZNSt13runtime_errorD1Ev"]=a0=>(__ZNSt13runtime_errorD1Ev=Module["__ZNSt13runtime_errorD1Ev"]=wasmExports["ya"])(a0);var __ZNKSt13runtime_error4whatEv=Module["__ZNKSt13runtime_error4whatEv"]=a0=>(__ZNKSt13runtime_error4whatEv=Module["__ZNKSt13runtime_error4whatEv"]=wasmExports["za"])(a0);var __ZNSt12domain_errorD0Ev=Module["__ZNSt12domain_errorD0Ev"]=a0=>(__ZNSt12domain_errorD0Ev=Module["__ZNSt12domain_errorD0Ev"]=wasmExports["Aa"])(a0);var __ZNSt12domain_errorD1Ev=Module["__ZNSt12domain_errorD1Ev"]=a0=>(__ZNSt12domain_errorD1Ev=Module["__ZNSt12domain_errorD1Ev"]=wasmExports["Ba"])(a0);var __ZNSt16invalid_argumentD0Ev=Module["__ZNSt16invalid_argumentD0Ev"]=a0=>(__ZNSt16invalid_argumentD0Ev=Module["__ZNSt16invalid_argumentD0Ev"]=wasmExports["Ca"])(a0);var __ZNSt16invalid_argumentD1Ev=Module["__ZNSt16invalid_argumentD1Ev"]=a0=>(__ZNSt16invalid_argumentD1Ev=Module["__ZNSt16invalid_argumentD1Ev"]=wasmExports["Da"])(a0);var __ZNSt12length_errorD0Ev=Module["__ZNSt12length_errorD0Ev"]=a0=>(__ZNSt12length_errorD0Ev=Module["__ZNSt12length_errorD0Ev"]=wasmExports["Ea"])(a0);var __ZNSt12length_errorD1Ev=Module["__ZNSt12length_errorD1Ev"]=a0=>(__ZNSt12length_errorD1Ev=Module["__ZNSt12length_errorD1Ev"]=wasmExports["Fa"])(a0);var __ZNSt12out_of_rangeD0Ev=Module["__ZNSt12out_of_rangeD0Ev"]=a0=>(__ZNSt12out_of_rangeD0Ev=Module["__ZNSt12out_of_rangeD0Ev"]=wasmExports["Ga"])(a0);var __ZNSt12out_of_rangeD1Ev=Module["__ZNSt12out_of_rangeD1Ev"]=a0=>(__ZNSt12out_of_rangeD1Ev=Module["__ZNSt12out_of_rangeD1Ev"]=wasmExports["Ha"])(a0);var __ZNSt11range_errorD0Ev=Module["__ZNSt11range_errorD0Ev"]=a0=>(__ZNSt11range_errorD0Ev=Module["__ZNSt11range_errorD0Ev"]=wasmExports["Ia"])(a0);var __ZNSt11range_errorD1Ev=Module["__ZNSt11range_errorD1Ev"]=a0=>(__ZNSt11range_errorD1Ev=Module["__ZNSt11range_errorD1Ev"]=wasmExports["Ja"])(a0);var __ZNSt14overflow_errorD0Ev=Module["__ZNSt14overflow_errorD0Ev"]=a0=>(__ZNSt14overflow_errorD0Ev=Module["__ZNSt14overflow_errorD0Ev"]=wasmExports["Ka"])(a0);var __ZNSt14overflow_errorD1Ev=Module["__ZNSt14overflow_errorD1Ev"]=a0=>(__ZNSt14overflow_errorD1Ev=Module["__ZNSt14overflow_errorD1Ev"]=wasmExports["La"])(a0);var __ZNSt15underflow_errorD0Ev=Module["__ZNSt15underflow_errorD0Ev"]=a0=>(__ZNSt15underflow_errorD0Ev=Module["__ZNSt15underflow_errorD0Ev"]=wasmExports["Ma"])(a0);var __ZNSt15underflow_errorD1Ev=Module["__ZNSt15underflow_errorD1Ev"]=a0=>(__ZNSt15underflow_errorD1Ev=Module["__ZNSt15underflow_errorD1Ev"]=wasmExports["Na"])(a0);var __ZNSt12domain_errorD2Ev=Module["__ZNSt12domain_errorD2Ev"]=a0=>(__ZNSt12domain_errorD2Ev=Module["__ZNSt12domain_errorD2Ev"]=wasmExports["Oa"])(a0);var __ZNSt16invalid_argumentD2Ev=Module["__ZNSt16invalid_argumentD2Ev"]=a0=>(__ZNSt16invalid_argumentD2Ev=Module["__ZNSt16invalid_argumentD2Ev"]=wasmExports["Pa"])(a0);var __ZNSt12length_errorD2Ev=Module["__ZNSt12length_errorD2Ev"]=a0=>(__ZNSt12length_errorD2Ev=Module["__ZNSt12length_errorD2Ev"]=wasmExports["Qa"])(a0);var __ZNSt12out_of_rangeD2Ev=Module["__ZNSt12out_of_rangeD2Ev"]=a0=>(__ZNSt12out_of_rangeD2Ev=Module["__ZNSt12out_of_rangeD2Ev"]=wasmExports["Ra"])(a0);var __ZNSt11range_errorD2Ev=Module["__ZNSt11range_errorD2Ev"]=a0=>(__ZNSt11range_errorD2Ev=Module["__ZNSt11range_errorD2Ev"]=wasmExports["Sa"])(a0);var __ZNSt14overflow_errorD2Ev=Module["__ZNSt14overflow_errorD2Ev"]=a0=>(__ZNSt14overflow_errorD2Ev=Module["__ZNSt14overflow_errorD2Ev"]=wasmExports["Ta"])(a0);var __ZNSt15underflow_errorD2Ev=Module["__ZNSt15underflow_errorD2Ev"]=a0=>(__ZNSt15underflow_errorD2Ev=Module["__ZNSt15underflow_errorD2Ev"]=wasmExports["Ua"])(a0);var __ZNSt9type_infoD2Ev=Module["__ZNSt9type_infoD2Ev"]=a0=>(__ZNSt9type_infoD2Ev=Module["__ZNSt9type_infoD2Ev"]=wasmExports["Va"])(a0);var __ZNSt9type_infoD0Ev=Module["__ZNSt9type_infoD0Ev"]=a0=>(__ZNSt9type_infoD0Ev=Module["__ZNSt9type_infoD0Ev"]=wasmExports["Wa"])(a0);var __ZNSt9type_infoD1Ev=Module["__ZNSt9type_infoD1Ev"]=a0=>(__ZNSt9type_infoD1Ev=Module["__ZNSt9type_infoD1Ev"]=wasmExports["Xa"])(a0);var __ZNSt8bad_castC2Ev=Module["__ZNSt8bad_castC2Ev"]=a0=>(__ZNSt8bad_castC2Ev=Module["__ZNSt8bad_castC2Ev"]=wasmExports["Ya"])(a0);var __ZNSt8bad_castD2Ev=Module["__ZNSt8bad_castD2Ev"]=a0=>(__ZNSt8bad_castD2Ev=Module["__ZNSt8bad_castD2Ev"]=wasmExports["Za"])(a0);var __ZNSt8bad_castD0Ev=Module["__ZNSt8bad_castD0Ev"]=a0=>(__ZNSt8bad_castD0Ev=Module["__ZNSt8bad_castD0Ev"]=wasmExports["_a"])(a0);var __ZNSt8bad_castD1Ev=Module["__ZNSt8bad_castD1Ev"]=a0=>(__ZNSt8bad_castD1Ev=Module["__ZNSt8bad_castD1Ev"]=wasmExports["$a"])(a0);var __ZNKSt8bad_cast4whatEv=Module["__ZNKSt8bad_cast4whatEv"]=a0=>(__ZNKSt8bad_cast4whatEv=Module["__ZNKSt8bad_cast4whatEv"]=wasmExports["ab"])(a0);var __ZNSt10bad_typeidC2Ev=Module["__ZNSt10bad_typeidC2Ev"]=a0=>(__ZNSt10bad_typeidC2Ev=Module["__ZNSt10bad_typeidC2Ev"]=wasmExports["bb"])(a0);var __ZNSt10bad_typeidD2Ev=Module["__ZNSt10bad_typeidD2Ev"]=a0=>(__ZNSt10bad_typeidD2Ev=Module["__ZNSt10bad_typeidD2Ev"]=wasmExports["cb"])(a0);var __ZNSt10bad_typeidD0Ev=Module["__ZNSt10bad_typeidD0Ev"]=a0=>(__ZNSt10bad_typeidD0Ev=Module["__ZNSt10bad_typeidD0Ev"]=wasmExports["db"])(a0);var __ZNSt10bad_typeidD1Ev=Module["__ZNSt10bad_typeidD1Ev"]=a0=>(__ZNSt10bad_typeidD1Ev=Module["__ZNSt10bad_typeidD1Ev"]=wasmExports["eb"])(a0);var __ZNKSt10bad_typeid4whatEv=Module["__ZNKSt10bad_typeid4whatEv"]=a0=>(__ZNKSt10bad_typeid4whatEv=Module["__ZNKSt10bad_typeid4whatEv"]=wasmExports["fb"])(a0);var __ZNSt8bad_castC1Ev=Module["__ZNSt8bad_castC1Ev"]=a0=>(__ZNSt8bad_castC1Ev=Module["__ZNSt8bad_castC1Ev"]=wasmExports["gb"])(a0);var __ZNSt10bad_typeidC1Ev=Module["__ZNSt10bad_typeidC1Ev"]=a0=>(__ZNSt10bad_typeidC1Ev=Module["__ZNSt10bad_typeidC1Ev"]=wasmExports["hb"])(a0);var _pv_orca_init=Module["_pv_orca_init"]=(a0,a1,a2)=>(_pv_orca_init=Module["_pv_orca_init"]=wasmExports["ib"])(a0,a1,a2);var _free=a0=>(_free=wasmExports["jb"])(a0);var _pv_orca_delete=Module["_pv_orca_delete"]=a0=>(_pv_orca_delete=Module["_pv_orca_delete"]=wasmExports["kb"])(a0);var _malloc=Module["_malloc"]=a0=>(_malloc=Module["_malloc"]=wasmExports["lb"])(a0);var _pv_orca_version=Module["_pv_orca_version"]=()=>(_pv_orca_version=Module["_pv_orca_version"]=wasmExports["mb"])();var _pv_orca_valid_characters=Module["_pv_orca_valid_characters"]=(a0,a1,a2)=>(_pv_orca_valid_characters=Module["_pv_orca_valid_characters"]=wasmExports["nb"])(a0,a1,a2);var _pv_orca_sample_rate=Module["_pv_orca_sample_rate"]=(a0,a1)=>(_pv_orca_sample_rate=Module["_pv_orca_sample_rate"]=wasmExports["ob"])(a0,a1);var _pv_orca_word_alignments_delete=Module["_pv_orca_word_alignments_delete"]=(a0,a1)=>(_pv_orca_word_alignments_delete=Module["_pv_orca_word_alignments_delete"]=wasmExports["pb"])(a0,a1);var _pv_orca_synthesize=Module["_pv_orca_synthesize"]=(a0,a1,a2,a3,a4,a5,a6)=>(_pv_orca_synthesize=Module["_pv_orca_synthesize"]=wasmExports["qb"])(a0,a1,a2,a3,a4,a5,a6);var _pv_orca_synthesize_to_file=Module["_pv_orca_synthesize_to_file"]=(a0,a1,a2,a3,a4,a5)=>(_pv_orca_synthesize_to_file=Module["_pv_orca_synthesize_to_file"]=wasmExports["rb"])(a0,a1,a2,a3,a4,a5);var _pv_orca_pcm_delete=Module["_pv_orca_pcm_delete"]=a0=>(_pv_orca_pcm_delete=Module["_pv_orca_pcm_delete"]=wasmExports["sb"])(a0);var _pv_orca_synthesize_params_init=Module["_pv_orca_synthesize_params_init"]=a0=>(_pv_orca_synthesize_params_init=Module["_pv_orca_synthesize_params_init"]=wasmExports["tb"])(a0);var _pv_orca_synthesize_params_delete=Module["_pv_orca_synthesize_params_delete"]=a0=>(_pv_orca_synthesize_params_delete=Module["_pv_orca_synthesize_params_delete"]=wasmExports["ub"])(a0);var _pv_orca_synthesize_params_set_speech_rate=Module["_pv_orca_synthesize_params_set_speech_rate"]=(a0,a1)=>(_pv_orca_synthesize_params_set_speech_rate=Module["_pv_orca_synthesize_params_set_speech_rate"]=wasmExports["vb"])(a0,a1);var _pv_orca_synthesize_params_get_speech_rate=Module["_pv_orca_synthesize_params_get_speech_rate"]=(a0,a1)=>(_pv_orca_synthesize_params_get_speech_rate=Module["_pv_orca_synthesize_params_get_speech_rate"]=wasmExports["wb"])(a0,a1);var _pv_orca_synthesize_params_set_random_state=Module["_pv_orca_synthesize_params_set_random_state"]=(a0,a1)=>(_pv_orca_synthesize_params_set_random_state=Module["_pv_orca_synthesize_params_set_random_state"]=wasmExports["xb"])(a0,a1);var _pv_orca_synthesize_params_get_random_state=Module["_pv_orca_synthesize_params_get_random_state"]=(a0,a1)=>(_pv_orca_synthesize_params_get_random_state=Module["_pv_orca_synthesize_params_get_random_state"]=wasmExports["yb"])(a0,a1);var _pv_orca_valid_characters_delete=Module["_pv_orca_valid_characters_delete"]=a0=>(_pv_orca_valid_characters_delete=Module["_pv_orca_valid_characters_delete"]=wasmExports["zb"])(a0);var _pv_orca_max_character_limit=Module["_pv_orca_max_character_limit"]=(a0,a1)=>(_pv_orca_max_character_limit=Module["_pv_orca_max_character_limit"]=wasmExports["Ab"])(a0,a1);var _pv_orca_stream_open=Module["_pv_orca_stream_open"]=(a0,a1,a2)=>(_pv_orca_stream_open=Module["_pv_orca_stream_open"]=wasmExports["Bb"])(a0,a1,a2);var _pv_orca_stream_close=Module["_pv_orca_stream_close"]=a0=>(_pv_orca_stream_close=Module["_pv_orca_stream_close"]=wasmExports["Cb"])(a0);var _pv_orca_stream_synthesize=Module["_pv_orca_stream_synthesize"]=(a0,a1,a2,a3)=>(_pv_orca_stream_synthesize=Module["_pv_orca_stream_synthesize"]=wasmExports["Db"])(a0,a1,a2,a3);var _pv_orca_stream_flush=Module["_pv_orca_stream_flush"]=(a0,a1,a2)=>(_pv_orca_stream_flush=Module["_pv_orca_stream_flush"]=wasmExports["Eb"])(a0,a1,a2);var _pv_status_to_string=Module["_pv_status_to_string"]=a0=>(_pv_status_to_string=Module["_pv_status_to_string"]=wasmExports["Gb"])(a0);var _pv_sample_rate=Module["_pv_sample_rate"]=()=>(_pv_sample_rate=Module["_pv_sample_rate"]=wasmExports["Hb"])();var _pv_log_enable=Module["_pv_log_enable"]=()=>(_pv_log_enable=Module["_pv_log_enable"]=wasmExports["Ib"])();var _pv_log_disable=Module["_pv_log_disable"]=()=>(_pv_log_disable=Module["_pv_log_disable"]=wasmExports["Jb"])();var _pv_set_sdk=Module["_pv_set_sdk"]=a0=>(_pv_set_sdk=Module["_pv_set_sdk"]=wasmExports["Kb"])(a0);var _pv_get_sdk=Module["_pv_get_sdk"]=()=>(_pv_get_sdk=Module["_pv_get_sdk"]=wasmExports["Lb"])();var _pv_free=Module["_pv_free"]=a0=>(_pv_free=Module["_pv_free"]=wasmExports["Mb"])(a0);var _pv_get_error_stack=Module["_pv_get_error_stack"]=(a0,a1)=>(_pv_get_error_stack=Module["_pv_get_error_stack"]=wasmExports["Nb"])(a0,a1);var _pv_free_error_stack=Module["_pv_free_error_stack"]=a0=>(_pv_free_error_stack=Module["_pv_free_error_stack"]=wasmExports["Ob"])(a0);var _aligned_alloc=Module["_aligned_alloc"]=(a0,a1)=>(_aligned_alloc=Module["_aligned_alloc"]=wasmExports["Pb"])(a0,a1);var __emscripten_memcpy_bulkmem=Module["__emscripten_memcpy_bulkmem"]=(a0,a1,a2)=>(__emscripten_memcpy_bulkmem=Module["__emscripten_memcpy_bulkmem"]=wasmExports["Qb"])(a0,a1,a2);var __emscripten_memset_bulkmem=Module["__emscripten_memset_bulkmem"]=(a0,a1,a2)=>(__emscripten_memset_bulkmem=Module["__emscripten_memset_bulkmem"]=wasmExports["Rb"])(a0,a1,a2);var __emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports["Sb"])(a0);var __emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports["Tb"])(a0);var _emscripten_stack_get_current=()=>(_emscripten_stack_get_current=wasmExports["Ub"])();var _asyncify_start_unwind=a0=>(_asyncify_start_unwind=wasmExports["Vb"])(a0);var _asyncify_stop_unwind=()=>(_asyncify_stop_unwind=wasmExports["Wb"])();var _asyncify_start_rewind=a0=>(_asyncify_start_rewind=wasmExports["Xb"])(a0);var _asyncify_stop_rewind=()=>(_asyncify_stop_rewind=wasmExports["Yb"])();var ___cxa_unexpected_handler=Module["___cxa_unexpected_handler"]=2370600;var ___cxa_terminate_handler=Module["___cxa_terminate_handler"]=2370596;var ___cxa_new_handler=Module["___cxa_new_handler"]=2378272;var __ZTIN10__cxxabiv116__shim_type_infoE=Module["__ZTIN10__cxxabiv116__shim_type_infoE"]=52804;var __ZTIN10__cxxabiv117__class_type_infoE=Module["__ZTIN10__cxxabiv117__class_type_infoE"]=52852;var __ZTIN10__cxxabiv117__pbase_type_infoE=Module["__ZTIN10__cxxabiv117__pbase_type_infoE"]=52900;var __ZTIDn=Module["__ZTIDn"]=53248;var __ZTIN10__cxxabiv119__pointer_type_infoE=Module["__ZTIN10__cxxabiv119__pointer_type_infoE"]=52948;var __ZTIv=Module["__ZTIv"]=53196;var __ZTIN10__cxxabiv120__function_type_infoE=Module["__ZTIN10__cxxabiv120__function_type_infoE"]=53e3;var __ZTIN10__cxxabiv129__pointer_to_member_type_infoE=Module["__ZTIN10__cxxabiv129__pointer_to_member_type_infoE"]=53060;var __ZTSN10__cxxabiv116__shim_type_infoE=Module["__ZTSN10__cxxabiv116__shim_type_infoE"]=52768;var __ZTVN10__cxxabiv120__si_class_type_infoE=Module["__ZTVN10__cxxabiv120__si_class_type_infoE"]=54732;var __ZTSN10__cxxabiv117__class_type_infoE=Module["__ZTSN10__cxxabiv117__class_type_infoE"]=52816;var __ZTSN10__cxxabiv117__pbase_type_infoE=Module["__ZTSN10__cxxabiv117__pbase_type_infoE"]=52864;var __ZTSN10__cxxabiv119__pointer_type_infoE=Module["__ZTSN10__cxxabiv119__pointer_type_infoE"]=52912;var __ZTSN10__cxxabiv120__function_type_infoE=Module["__ZTSN10__cxxabiv120__function_type_infoE"]=52960;var __ZTSN10__cxxabiv129__pointer_to_member_type_infoE=Module["__ZTSN10__cxxabiv129__pointer_to_member_type_infoE"]=53012;var __ZTVN10__cxxabiv116__shim_type_infoE=Module["__ZTVN10__cxxabiv116__shim_type_infoE"]=53084;var __ZTVN10__cxxabiv123__fundamental_type_infoE=Module["__ZTVN10__cxxabiv123__fundamental_type_infoE"]=53112;var __ZTIN10__cxxabiv123__fundamental_type_infoE=Module["__ZTIN10__cxxabiv123__fundamental_type_infoE"]=53180;var __ZTSN10__cxxabiv123__fundamental_type_infoE=Module["__ZTSN10__cxxabiv123__fundamental_type_infoE"]=53140;var __ZTSv=Module["__ZTSv"]=53192;var __ZTSPv=Module["__ZTSPv"]=53204;var __ZTIPv=Module["__ZTIPv"]=53208;var __ZTVN10__cxxabiv119__pointer_type_infoE=Module["__ZTVN10__cxxabiv119__pointer_type_infoE"]=54944;var __ZTSPKv=Module["__ZTSPKv"]=53224;var __ZTIPKv=Module["__ZTIPKv"]=53228;var __ZTSDn=Module["__ZTSDn"]=53244;var __ZTSPDn=Module["__ZTSPDn"]=53256;var __ZTIPDn=Module["__ZTIPDn"]=53260;var __ZTSPKDn=Module["__ZTSPKDn"]=53276;var __ZTIPKDn=Module["__ZTIPKDn"]=53284;var __ZTSb=Module["__ZTSb"]=53300;var __ZTIb=Module["__ZTIb"]=53304;var __ZTSPb=Module["__ZTSPb"]=53312;var __ZTIPb=Module["__ZTIPb"]=53316;var __ZTSPKb=Module["__ZTSPKb"]=53332;var __ZTIPKb=Module["__ZTIPKb"]=53336;var __ZTSw=Module["__ZTSw"]=53352;var __ZTIw=Module["__ZTIw"]=53356;var __ZTSPw=Module["__ZTSPw"]=53364;var __ZTIPw=Module["__ZTIPw"]=53368;var __ZTSPKw=Module["__ZTSPKw"]=53384;var __ZTIPKw=Module["__ZTIPKw"]=53388;var __ZTSc=Module["__ZTSc"]=53404;var __ZTIc=Module["__ZTIc"]=53408;var __ZTSPc=Module["__ZTSPc"]=53416;var __ZTIPc=Module["__ZTIPc"]=53420;var __ZTSPKc=Module["__ZTSPKc"]=53436;var __ZTIPKc=Module["__ZTIPKc"]=53440;var __ZTSh=Module["__ZTSh"]=53456;var __ZTIh=Module["__ZTIh"]=53460;var __ZTSPh=Module["__ZTSPh"]=53468;var __ZTIPh=Module["__ZTIPh"]=53472;var __ZTSPKh=Module["__ZTSPKh"]=53488;var __ZTIPKh=Module["__ZTIPKh"]=53492;var __ZTSa=Module["__ZTSa"]=53508;var __ZTIa=Module["__ZTIa"]=53512;var __ZTSPa=Module["__ZTSPa"]=53520;var __ZTIPa=Module["__ZTIPa"]=53524;var __ZTSPKa=Module["__ZTSPKa"]=53540;var __ZTIPKa=Module["__ZTIPKa"]=53544;var __ZTSs=Module["__ZTSs"]=53560;var __ZTIs=Module["__ZTIs"]=53564;var __ZTSPs=Module["__ZTSPs"]=53572;var __ZTIPs=Module["__ZTIPs"]=53576;var __ZTSPKs=Module["__ZTSPKs"]=53592;var __ZTIPKs=Module["__ZTIPKs"]=53596;var __ZTSt=Module["__ZTSt"]=53612;var __ZTIt=Module["__ZTIt"]=53616;var __ZTSPt=Module["__ZTSPt"]=53624;var __ZTIPt=Module["__ZTIPt"]=53628;var __ZTSPKt=Module["__ZTSPKt"]=53644;var __ZTIPKt=Module["__ZTIPKt"]=53648;var __ZTSi=Module["__ZTSi"]=53664;var __ZTIi=Module["__ZTIi"]=53668;var __ZTSPi=Module["__ZTSPi"]=53676;var __ZTIPi=Module["__ZTIPi"]=53680;var __ZTSPKi=Module["__ZTSPKi"]=53696;var __ZTIPKi=Module["__ZTIPKi"]=53700;var __ZTSj=Module["__ZTSj"]=53716;var __ZTIj=Module["__ZTIj"]=53720;var __ZTSPj=Module["__ZTSPj"]=53728;var __ZTIPj=Module["__ZTIPj"]=53732;var __ZTSPKj=Module["__ZTSPKj"]=53748;var __ZTIPKj=Module["__ZTIPKj"]=53752;var __ZTSl=Module["__ZTSl"]=53768;var __ZTIl=Module["__ZTIl"]=53772;var __ZTSPl=Module["__ZTSPl"]=53780;var __ZTIPl=Module["__ZTIPl"]=53784;var __ZTSPKl=Module["__ZTSPKl"]=53800;var __ZTIPKl=Module["__ZTIPKl"]=53804;var __ZTSm=Module["__ZTSm"]=53820;var __ZTIm=Module["__ZTIm"]=53824;var __ZTSPm=Module["__ZTSPm"]=53832;var __ZTIPm=Module["__ZTIPm"]=53836;var __ZTSPKm=Module["__ZTSPKm"]=53852;var __ZTIPKm=Module["__ZTIPKm"]=53856;var __ZTSx=Module["__ZTSx"]=53872;var __ZTIx=Module["__ZTIx"]=53876;var __ZTSPx=Module["__ZTSPx"]=53884;var __ZTIPx=Module["__ZTIPx"]=53888;var __ZTSPKx=Module["__ZTSPKx"]=53904;var __ZTIPKx=Module["__ZTIPKx"]=53908;var __ZTSy=Module["__ZTSy"]=53924;var __ZTIy=Module["__ZTIy"]=53928;var __ZTSPy=Module["__ZTSPy"]=53936;var __ZTIPy=Module["__ZTIPy"]=53940;var __ZTSPKy=Module["__ZTSPKy"]=53956;var __ZTIPKy=Module["__ZTIPKy"]=53960;var __ZTSn=Module["__ZTSn"]=53976;var __ZTIn=Module["__ZTIn"]=53980;var __ZTSPn=Module["__ZTSPn"]=53988;var __ZTIPn=Module["__ZTIPn"]=53992;var __ZTSPKn=Module["__ZTSPKn"]=54008;var __ZTIPKn=Module["__ZTIPKn"]=54012;var __ZTSo=Module["__ZTSo"]=54028;var __ZTIo=Module["__ZTIo"]=54032;var __ZTSPo=Module["__ZTSPo"]=54040;var __ZTIPo=Module["__ZTIPo"]=54044;var __ZTSPKo=Module["__ZTSPKo"]=54060;var __ZTIPKo=Module["__ZTIPKo"]=54064;var __ZTSDh=Module["__ZTSDh"]=54080;var __ZTIDh=Module["__ZTIDh"]=54084;var __ZTSPDh=Module["__ZTSPDh"]=54092;var __ZTIPDh=Module["__ZTIPDh"]=54096;var __ZTSPKDh=Module["__ZTSPKDh"]=54112;var __ZTIPKDh=Module["__ZTIPKDh"]=54120;var __ZTSf=Module["__ZTSf"]=54136;var __ZTIf=Module["__ZTIf"]=54140;var __ZTSPf=Module["__ZTSPf"]=54148;var __ZTIPf=Module["__ZTIPf"]=54152;var __ZTSPKf=Module["__ZTSPKf"]=54168;var __ZTIPKf=Module["__ZTIPKf"]=54172;var __ZTSd=Module["__ZTSd"]=54188;var __ZTId=Module["__ZTId"]=54192;var __ZTSPd=Module["__ZTSPd"]=54200;var __ZTIPd=Module["__ZTIPd"]=54204;var __ZTSPKd=Module["__ZTSPKd"]=54220;var __ZTIPKd=Module["__ZTIPKd"]=54224;var __ZTSe=Module["__ZTSe"]=54240;var __ZTIe=Module["__ZTIe"]=54244;var __ZTSPe=Module["__ZTSPe"]=54252;var __ZTIPe=Module["__ZTIPe"]=54256;var __ZTSPKe=Module["__ZTSPKe"]=54272;var __ZTIPKe=Module["__ZTIPKe"]=54276;var __ZTSg=Module["__ZTSg"]=54292;var __ZTIg=Module["__ZTIg"]=54296;var __ZTSPg=Module["__ZTSPg"]=54304;var __ZTIPg=Module["__ZTIPg"]=54308;var __ZTSPKg=Module["__ZTSPKg"]=54324;var __ZTIPKg=Module["__ZTIPKg"]=54328;var __ZTSDu=Module["__ZTSDu"]=54344;var __ZTIDu=Module["__ZTIDu"]=54348;var __ZTSPDu=Module["__ZTSPDu"]=54356;var __ZTIPDu=Module["__ZTIPDu"]=54360;var __ZTSPKDu=Module["__ZTSPKDu"]=54376;var __ZTIPKDu=Module["__ZTIPKDu"]=54384;var __ZTSDs=Module["__ZTSDs"]=54400;var __ZTIDs=Module["__ZTIDs"]=54404;var __ZTSPDs=Module["__ZTSPDs"]=54412;var __ZTIPDs=Module["__ZTIPDs"]=54416;var __ZTSPKDs=Module["__ZTSPKDs"]=54432;var __ZTIPKDs=Module["__ZTIPKDs"]=54440;var __ZTSDi=Module["__ZTSDi"]=54456;var __ZTIDi=Module["__ZTIDi"]=54460;var __ZTSPDi=Module["__ZTSPDi"]=54468;var __ZTIPDi=Module["__ZTIPDi"]=54472;var __ZTSPKDi=Module["__ZTSPKDi"]=54488;var __ZTIPKDi=Module["__ZTIPKDi"]=54496;var __ZTVN10__cxxabiv117__array_type_infoE=Module["__ZTVN10__cxxabiv117__array_type_infoE"]=54512;var __ZTIN10__cxxabiv117__array_type_infoE=Module["__ZTIN10__cxxabiv117__array_type_infoE"]=54576;var __ZTSN10__cxxabiv117__array_type_infoE=Module["__ZTSN10__cxxabiv117__array_type_infoE"]=54540;var __ZTVN10__cxxabiv120__function_type_infoE=Module["__ZTVN10__cxxabiv120__function_type_infoE"]=54588;var __ZTVN10__cxxabiv116__enum_type_infoE=Module["__ZTVN10__cxxabiv116__enum_type_infoE"]=54616;var __ZTIN10__cxxabiv116__enum_type_infoE=Module["__ZTIN10__cxxabiv116__enum_type_infoE"]=54680;var __ZTSN10__cxxabiv116__enum_type_infoE=Module["__ZTSN10__cxxabiv116__enum_type_infoE"]=54644;var __ZTVN10__cxxabiv117__class_type_infoE=Module["__ZTVN10__cxxabiv117__class_type_infoE"]=54692;var __ZTIN10__cxxabiv120__si_class_type_infoE=Module["__ZTIN10__cxxabiv120__si_class_type_infoE"]=54812;var __ZTSN10__cxxabiv120__si_class_type_infoE=Module["__ZTSN10__cxxabiv120__si_class_type_infoE"]=54772;var __ZTVN10__cxxabiv121__vmi_class_type_infoE=Module["__ZTVN10__cxxabiv121__vmi_class_type_infoE"]=54824;var __ZTIN10__cxxabiv121__vmi_class_type_infoE=Module["__ZTIN10__cxxabiv121__vmi_class_type_infoE"]=54904;var __ZTSN10__cxxabiv121__vmi_class_type_infoE=Module["__ZTSN10__cxxabiv121__vmi_class_type_infoE"]=54864;var __ZTVN10__cxxabiv117__pbase_type_infoE=Module["__ZTVN10__cxxabiv117__pbase_type_infoE"]=54916;var __ZTVN10__cxxabiv129__pointer_to_member_type_infoE=Module["__ZTVN10__cxxabiv129__pointer_to_member_type_infoE"]=54972;var __ZTVSt9bad_alloc=Module["__ZTVSt9bad_alloc"]=55e3;var __ZTVSt9exception=Module["__ZTVSt9exception"]=55040;var __ZTVSt20bad_array_new_length=Module["__ZTVSt20bad_array_new_length"]=55020;var __ZTISt9bad_alloc=Module["__ZTISt9bad_alloc"]=55152;var __ZTISt20bad_array_new_length=Module["__ZTISt20bad_array_new_length"]=55192;var __ZTISt9exception=Module["__ZTISt9exception"]=55076;var __ZTSSt9exception=Module["__ZTSSt9exception"]=55060;var __ZTVSt13bad_exception=Module["__ZTVSt13bad_exception"]=55084;var __ZTISt13bad_exception=Module["__ZTISt13bad_exception"]=55124;var __ZTSSt13bad_exception=Module["__ZTSSt13bad_exception"]=55104;var __ZTSSt9bad_alloc=Module["__ZTSSt9bad_alloc"]=55136;var __ZTSSt20bad_array_new_length=Module["__ZTSSt20bad_array_new_length"]=55164;var __ZTVSt11logic_error=Module["__ZTVSt11logic_error"]=55204;var __ZTVSt13runtime_error=Module["__ZTVSt13runtime_error"]=55224;var __ZTISt11logic_error=Module["__ZTISt11logic_error"]=55300;var __ZTISt13runtime_error=Module["__ZTISt13runtime_error"]=55540;var __ZTVSt12domain_error=Module["__ZTVSt12domain_error"]=55244;var __ZTISt12domain_error=Module["__ZTISt12domain_error"]=55312;var __ZTSSt12domain_error=Module["__ZTSSt12domain_error"]=55264;var __ZTSSt11logic_error=Module["__ZTSSt11logic_error"]=55281;var __ZTVSt16invalid_argument=Module["__ZTVSt16invalid_argument"]=55324;var __ZTISt16invalid_argument=Module["__ZTISt16invalid_argument"]=55368;var __ZTSSt16invalid_argument=Module["__ZTSSt16invalid_argument"]=55344;var __ZTVSt12length_error=Module["__ZTVSt12length_error"]=55380;var __ZTISt12length_error=Module["__ZTISt12length_error"]=55420;var __ZTSSt12length_error=Module["__ZTSSt12length_error"]=55400;var __ZTVSt12out_of_range=Module["__ZTVSt12out_of_range"]=55432;var __ZTISt12out_of_range=Module["__ZTISt12out_of_range"]=55472;var __ZTSSt12out_of_range=Module["__ZTSSt12out_of_range"]=55452;var __ZTVSt11range_error=Module["__ZTVSt11range_error"]=55484;var __ZTISt11range_error=Module["__ZTISt11range_error"]=55552;var __ZTSSt11range_error=Module["__ZTSSt11range_error"]=55504;var __ZTSSt13runtime_error=Module["__ZTSSt13runtime_error"]=55520;var __ZTVSt14overflow_error=Module["__ZTVSt14overflow_error"]=55564;var __ZTISt14overflow_error=Module["__ZTISt14overflow_error"]=55604;var __ZTSSt14overflow_error=Module["__ZTSSt14overflow_error"]=55584;var __ZTVSt15underflow_error=Module["__ZTVSt15underflow_error"]=55616;var __ZTISt15underflow_error=Module["__ZTISt15underflow_error"]=55656;var __ZTSSt15underflow_error=Module["__ZTSSt15underflow_error"]=55636;var __ZTVSt8bad_cast=Module["__ZTVSt8bad_cast"]=52636;var __ZTVSt10bad_typeid=Module["__ZTVSt10bad_typeid"]=52656;var __ZTISt8bad_cast=Module["__ZTISt8bad_cast"]=52728;var __ZTISt10bad_typeid=Module["__ZTISt10bad_typeid"]=52756;var __ZTVSt9type_info=Module["__ZTVSt9type_info"]=52676;var __ZTISt9type_info=Module["__ZTISt9type_info"]=52708;var __ZTSSt9type_info=Module["__ZTSSt9type_info"]=52692;var __ZTSSt8bad_cast=Module["__ZTSSt8bad_cast"]=52716;var __ZTSSt10bad_typeid=Module["__ZTSSt10bad_typeid"]=52740;Module["addFunction"]=addFunction;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();moduleRtn=readyPromise; +var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";function _typeof$2(o){null;return _typeof$2="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof$2(o)}function toPrimitive(t,r){if("object"!=_typeof$2(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof$2(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}function toPropertyKey(t){var i=toPrimitive(t,"string");return"symbol"==_typeof$2(i)?i:i+""}function _defineProperty(e,r,t){return(r=toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function asyncGeneratorStep(n,t,e,r,o,a,c){try{var i=n[a](c),u=i.value}catch(n){return void e(n)}i.done?t(u):Promise.resolve(u).then(r,o)}function _asyncToGenerator(n){return function(){var t=this,e=arguments;return new Promise(function(r,o){var a=n.apply(t,e);function _next(n){asyncGeneratorStep(a,r,o,_next,_throw,"next",n)}function _throw(n){asyncGeneratorStep(a,r,o,_next,_throw,"throw",n)}_next(void 0)})}}function getDefaultExportFromCjs(x){return x&&x.__esModule&&Object.prototype.hasOwnProperty.call(x,"default")?x["default"]:x}var regeneratorRuntime$3={exports:{}};var _typeof$1={exports:{}};var _typeof_1=_typeof$1.exports;(function(module){function _typeof(o){null;return module.exports=_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},module.exports.__esModule=true,module.exports["default"]=module.exports,_typeof(o)}module.exports=_typeof,module.exports.__esModule=true,module.exports["default"]=module.exports})(_typeof$1);var _typeofExports=_typeof$1.exports;var _typeof=getDefaultExportFromCjs(_typeofExports);var regeneratorRuntime$1=regeneratorRuntime$3.exports;(function(module){var _typeof=_typeofExports["default"];function _regeneratorRuntime(){"use strict";module.exports=_regeneratorRuntime=function _regeneratorRuntime(){return e},module.exports.__esModule=true,module.exports["default"]=module.exports;var t,e={},r=Object.prototype,n=r.hasOwnProperty,o=Object.defineProperty||function(t,e,r){t[e]=r.value},i="function"==typeof Symbol?Symbol:{},a=i.iterator||"@@iterator",c=i.asyncIterator||"@@asyncIterator",u=i.toStringTag||"@@toStringTag";function define(t,e,r){return Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}),t[e]}try{define({},"")}catch(t){define=function define(t,e,r){return t[e]=r}}function wrap(t,e,r,n){var i=e&&e.prototype instanceof Generator?e:Generator,a=Object.create(i.prototype),c=new Context(n||[]);return o(a,"_invoke",{value:makeInvokeMethod(t,r,c)}),a}function tryCatch(t,e,r){try{return{type:"normal",arg:t.call(e,r)}}catch(t){return{type:"throw",arg:t}}}e.wrap=wrap;var h="suspendedStart",l="suspendedYield",f="executing",s="completed",y={};function Generator(){}function GeneratorFunction(){}function GeneratorFunctionPrototype(){}var p={};define(p,a,function(){return this});var d=Object.getPrototypeOf,v=d&&d(d(values([])));v&&v!==r&&n.call(v,a)&&(p=v);var g=GeneratorFunctionPrototype.prototype=Generator.prototype=Object.create(p);function defineIteratorMethods(t){["next","throw","return"].forEach(function(e){define(t,e,function(t){return this._invoke(e,t)})})}function AsyncIterator(t,e){function invoke(r,o,i,a){var c=tryCatch(t[r],t,o);if("throw"!==c.type){var u=c.arg,h=u.value;return h&&"object"==_typeof(h)&&n.call(h,"__await")?e.resolve(h.__await).then(function(t){invoke("next",t,i,a)},function(t){invoke("throw",t,i,a)}):e.resolve(h).then(function(t){u.value=t,i(u)},function(t){return invoke("throw",t,i,a)})}a(c.arg)}var r;o(this,"_invoke",{value:function value(t,n){function callInvokeWithMethodAndArg(){return new e(function(e,r){invoke(t,n,e,r)})}return r=r?r.then(callInvokeWithMethodAndArg,callInvokeWithMethodAndArg):callInvokeWithMethodAndArg()}})}function makeInvokeMethod(e,r,n){var o=h;return function(i,a){if(o===f)throw Error("Generator is already running");if(o===s){if("throw"===i)throw a;return{value:t,done:!0}}for(n.method=i,n.arg=a;;){var c=n.delegate;if(c){var u=maybeInvokeDelegate(c,n);if(u){if(u===y)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if(o===h)throw o=s,n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);o=f;var p=tryCatch(e,r,n);if("normal"===p.type){if(o=n.done?s:l,p.arg===y)continue;return{value:p.arg,done:n.done}}"throw"===p.type&&(o=s,n.method="throw",n.arg=p.arg)}}}function maybeInvokeDelegate(e,r){var n=r.method,o=e.iterator[n];if(o===t)return r.delegate=null,"throw"===n&&e.iterator["return"]&&(r.method="return",r.arg=t,maybeInvokeDelegate(e,r),"throw"===r.method)||"return"!==n&&(r.method="throw",r.arg=new TypeError("The iterator does not provide a '"+n+"' method")),y;var i=tryCatch(o,e.iterator,r.arg);if("throw"===i.type)return r.method="throw",r.arg=i.arg,r.delegate=null,y;var a=i.arg;return a?a.done?(r[e.resultName]=a.value,r.next=e.nextLoc,"return"!==r.method&&(r.method="next",r.arg=t),r.delegate=null,y):a:(r.method="throw",r.arg=new TypeError("iterator result is not an object"),r.delegate=null,y)}function pushTryEntry(t){var e={tryLoc:t[0]};1 in t&&(e.catchLoc=t[1]),2 in t&&(e.finallyLoc=t[2],e.afterLoc=t[3]),this.tryEntries.push(e)}function resetTryEntry(t){var e=t.completion||{};e.type="normal",delete e.arg,t.completion=e}function Context(t){this.tryEntries=[{tryLoc:"root"}],t.forEach(pushTryEntry,this),this.reset(!0)}function values(e){if(e||""===e){var r=e[a];if(r)return r.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var o=-1,i=function next(){for(;++o=0;--o){var i=this.tryEntries[o],a=i.completion;if("root"===i.tryLoc)return handle("end");if(i.tryLoc<=this.prev){var c=n.call(i,"catchLoc"),u=n.call(i,"finallyLoc");if(c&&u){if(this.prev=0;--r){var o=this.tryEntries[r];if(o.tryLoc<=this.prev&&n.call(o,"finallyLoc")&&this.prev=0;--e){var r=this.tryEntries[e];if(r.finallyLoc===t)return this.complete(r.completion,r.afterLoc),resetTryEntry(r),y}},catch:function _catch(t){for(var e=this.tryEntries.length-1;e>=0;--e){var r=this.tryEntries[e];if(r.tryLoc===t){var n=r.completion;if("throw"===n.type){var o=n.arg;resetTryEntry(r)}return o}}throw Error("illegal catch attempt")},delegateYield:function delegateYield(e,r,n){return this.delegate={iterator:values(e),resultName:r,nextLoc:n},"next"===this.method&&(this.arg=t),y}},e}module.exports=_regeneratorRuntime,module.exports.__esModule=true,module.exports["default"]=module.exports})(regeneratorRuntime$3);var regeneratorRuntimeExports=regeneratorRuntime$3.exports;var regeneratorRuntime$2=getDefaultExportFromCjs(regeneratorRuntimeExports);var runtime=regeneratorRuntimeExports();var regenerator=runtime;try{regeneratorRuntime=runtime}catch(accidentalStrictMode){if(typeof globalThis==="object"){globalThis.regeneratorRuntime=runtime}else{Function("r","regeneratorRuntime = r")(runtime)}}var _regeneratorRuntime=getDefaultExportFromCjs(regenerator);const BROWSER_ALIASES_MAP={"Amazon Silk":"amazon_silk","Android Browser":"android",Bada:"bada",BlackBerry:"blackberry",Chrome:"chrome",Chromium:"chromium",Electron:"electron",Epiphany:"epiphany",Firefox:"firefox",Focus:"focus",Generic:"generic","Google Search":"google_search",Googlebot:"googlebot","Internet Explorer":"ie","K-Meleon":"k_meleon",Maxthon:"maxthon","Microsoft Edge":"edge","MZ Browser":"mz","NAVER Whale Browser":"naver",Opera:"opera","Opera Coast":"opera_coast",PhantomJS:"phantomjs",Puffin:"puffin",QupZilla:"qupzilla",QQ:"qq",QQLite:"qqlite",Safari:"safari",Sailfish:"sailfish","Samsung Internet for Android":"samsung_internet",SeaMonkey:"seamonkey",Sleipnir:"sleipnir",Swing:"swing",Tizen:"tizen","UC Browser":"uc",Vivaldi:"vivaldi","WebOS Browser":"webos",WeChat:"wechat","Yandex Browser":"yandex",Roku:"roku"};const BROWSER_MAP={amazon_silk:"Amazon Silk",android:"Android Browser",bada:"Bada",blackberry:"BlackBerry",chrome:"Chrome",chromium:"Chromium",electron:"Electron",epiphany:"Epiphany",firefox:"Firefox",focus:"Focus",generic:"Generic",googlebot:"Googlebot",google_search:"Google Search",ie:"Internet Explorer",k_meleon:"K-Meleon",maxthon:"Maxthon",edge:"Microsoft Edge",mz:"MZ Browser",naver:"NAVER Whale Browser",opera:"Opera",opera_coast:"Opera Coast",phantomjs:"PhantomJS",puffin:"Puffin",qupzilla:"QupZilla",qq:"QQ Browser",qqlite:"QQ Browser Lite",safari:"Safari",sailfish:"Sailfish",samsung_internet:"Samsung Internet for Android",seamonkey:"SeaMonkey",sleipnir:"Sleipnir",swing:"Swing",tizen:"Tizen",uc:"UC Browser",vivaldi:"Vivaldi",webos:"WebOS Browser",wechat:"WeChat",yandex:"Yandex Browser"};const PLATFORMS_MAP={tablet:"tablet",mobile:"mobile",desktop:"desktop",tv:"tv"};const OS_MAP={WindowsPhone:"Windows Phone",Windows:"Windows",MacOS:"macOS",iOS:"iOS",Android:"Android",WebOS:"WebOS",BlackBerry:"BlackBerry",Bada:"Bada",Tizen:"Tizen",Linux:"Linux",ChromeOS:"Chrome OS",PlayStation4:"PlayStation 4",Roku:"Roku"};const ENGINE_MAP={EdgeHTML:"EdgeHTML",Blink:"Blink",Trident:"Trident",Presto:"Presto",Gecko:"Gecko",WebKit:"WebKit"};class Utils{static getFirstMatch(regexp,ua){const match=ua.match(regexp);return match&&match.length>0&&match[1]||""}static getSecondMatch(regexp,ua){const match=ua.match(regexp);return match&&match.length>1&&match[2]||""}static matchAndReturnConst(regexp,ua,_const){if(regexp.test(ua)){return _const}return void 0}static getWindowsVersionName(version){switch(version){case"NT":return"NT";case"XP":return"XP";case"NT 5.0":return"2000";case"NT 5.1":return"XP";case"NT 5.2":return"2003";case"NT 6.0":return"Vista";case"NT 6.1":return"7";case"NT 6.2":return"8";case"NT 6.3":return"8.1";case"NT 10.0":return"10";default:return undefined}}static getMacOSVersionName(version){const v=version.split(".").splice(0,2).map(s=>parseInt(s,10)||0);v.push(0);if(v[0]!==10)return undefined;switch(v[1]){case 5:return"Leopard";case 6:return"Snow Leopard";case 7:return"Lion";case 8:return"Mountain Lion";case 9:return"Mavericks";case 10:return"Yosemite";case 11:return"El Capitan";case 12:return"Sierra";case 13:return"High Sierra";case 14:return"Mojave";case 15:return"Catalina";default:return undefined}}static getAndroidVersionName(version){const v=version.split(".").splice(0,2).map(s=>parseInt(s,10)||0);v.push(0);if(v[0]===1&&v[1]<5)return undefined;if(v[0]===1&&v[1]<6)return"Cupcake";if(v[0]===1&&v[1]>=6)return"Donut";if(v[0]===2&&v[1]<2)return"Eclair";if(v[0]===2&&v[1]===2)return"Froyo";if(v[0]===2&&v[1]>2)return"Gingerbread";if(v[0]===3)return"Honeycomb";if(v[0]===4&&v[1]<1)return"Ice Cream Sandwich";if(v[0]===4&&v[1]<4)return"Jelly Bean";if(v[0]===4&&v[1]>=4)return"KitKat";if(v[0]===5)return"Lollipop";if(v[0]===6)return"Marshmallow";if(v[0]===7)return"Nougat";if(v[0]===8)return"Oreo";if(v[0]===9)return"Pie";return undefined}static getVersionPrecision(version){return version.split(".").length}static compareVersions(versionA,versionB,isLoose=false){const versionAPrecision=Utils.getVersionPrecision(versionA);const versionBPrecision=Utils.getVersionPrecision(versionB);let precision=Math.max(versionAPrecision,versionBPrecision);let lastPrecision=0;const chunks=Utils.map([versionA,versionB],version=>{const delta=precision-Utils.getVersionPrecision(version);const _version=version+new Array(delta+1).join(".0");return Utils.map(_version.split("."),chunk=>new Array(20-chunk.length).join("0")+chunk).reverse()});if(isLoose){lastPrecision=precision-Math.min(versionAPrecision,versionBPrecision)}precision-=1;while(precision>=lastPrecision){if(chunks[0][precision]>chunks[1][precision]){return 1}if(chunks[0][precision]===chunks[1][precision]){if(precision===lastPrecision){return 0}precision-=1}else if(chunks[0][precision]{result[key]=assigner[key]})}}return obj}static getBrowserAlias(browserName){return BROWSER_ALIASES_MAP[browserName]}static getBrowserTypeByAlias(browserAlias){return BROWSER_MAP[browserAlias]||""}}const commonVersionIdentifier=/version\/(\d+(\.?_?\d+)+)/i;const browsersList=[{test:[/googlebot/i],describe(ua){const browser={name:"Googlebot"};const version=Utils.getFirstMatch(/googlebot\/(\d+(\.\d+))/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/opera/i],describe(ua){const browser={name:"Opera"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:opera)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/opr\/|opios/i],describe(ua){const browser={name:"Opera"};const version=Utils.getFirstMatch(/(?:opr|opios)[\s/](\S+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/SamsungBrowser/i],describe(ua){const browser={name:"Samsung Internet for Android"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:SamsungBrowser)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/Whale/i],describe(ua){const browser={name:"NAVER Whale Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:whale)[\s/](\d+(?:\.\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/MZBrowser/i],describe(ua){const browser={name:"MZ Browser"};const version=Utils.getFirstMatch(/(?:MZBrowser)[\s/](\d+(?:\.\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/focus/i],describe(ua){const browser={name:"Focus"};const version=Utils.getFirstMatch(/(?:focus)[\s/](\d+(?:\.\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/swing/i],describe(ua){const browser={name:"Swing"};const version=Utils.getFirstMatch(/(?:swing)[\s/](\d+(?:\.\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/coast/i],describe(ua){const browser={name:"Opera Coast"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:coast)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/opt\/\d+(?:.?_?\d+)+/i],describe(ua){const browser={name:"Opera Touch"};const version=Utils.getFirstMatch(/(?:opt)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/yabrowser/i],describe(ua){const browser={name:"Yandex Browser"};const version=Utils.getFirstMatch(/(?:yabrowser)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/ucbrowser/i],describe(ua){const browser={name:"UC Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:ucbrowser)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/Maxthon|mxios/i],describe(ua){const browser={name:"Maxthon"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:Maxthon|mxios)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/epiphany/i],describe(ua){const browser={name:"Epiphany"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:epiphany)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/puffin/i],describe(ua){const browser={name:"Puffin"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:puffin)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/sleipnir/i],describe(ua){const browser={name:"Sleipnir"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:sleipnir)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/k-meleon/i],describe(ua){const browser={name:"K-Meleon"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/(?:k-meleon)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/micromessenger/i],describe(ua){const browser={name:"WeChat"};const version=Utils.getFirstMatch(/(?:micromessenger)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/qqbrowser/i],describe(ua){const browser={name:/qqbrowserlite/i.test(ua)?"QQ Browser Lite":"QQ Browser"};const version=Utils.getFirstMatch(/(?:qqbrowserlite|qqbrowser)[/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/msie|trident/i],describe(ua){const browser={name:"Internet Explorer"};const version=Utils.getFirstMatch(/(?:msie |rv:)(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/\sedg\//i],describe(ua){const browser={name:"Microsoft Edge"};const version=Utils.getFirstMatch(/\sedg\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/edg([ea]|ios)/i],describe(ua){const browser={name:"Microsoft Edge"};const version=Utils.getSecondMatch(/edg([ea]|ios)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/vivaldi/i],describe(ua){const browser={name:"Vivaldi"};const version=Utils.getFirstMatch(/vivaldi\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/seamonkey/i],describe(ua){const browser={name:"SeaMonkey"};const version=Utils.getFirstMatch(/seamonkey\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/sailfish/i],describe(ua){const browser={name:"Sailfish"};const version=Utils.getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i,ua);if(version){browser.version=version}return browser}},{test:[/silk/i],describe(ua){const browser={name:"Amazon Silk"};const version=Utils.getFirstMatch(/silk\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/phantom/i],describe(ua){const browser={name:"PhantomJS"};const version=Utils.getFirstMatch(/phantomjs\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/slimerjs/i],describe(ua){const browser={name:"SlimerJS"};const version=Utils.getFirstMatch(/slimerjs\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(ua){const browser={name:"BlackBerry"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/blackberry[\d]+\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/(web|hpw)[o0]s/i],describe(ua){const browser={name:"WebOS Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua)||Utils.getFirstMatch(/w(?:eb)?[o0]sbrowser\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/bada/i],describe(ua){const browser={name:"Bada"};const version=Utils.getFirstMatch(/dolfin\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/tizen/i],describe(ua){const browser={name:"Tizen"};const version=Utils.getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/qupzilla/i],describe(ua){const browser={name:"QupZilla"};const version=Utils.getFirstMatch(/(?:qupzilla)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/firefox|iceweasel|fxios/i],describe(ua){const browser={name:"Firefox"};const version=Utils.getFirstMatch(/(?:firefox|iceweasel|fxios)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/electron/i],describe(ua){const browser={name:"Electron"};const version=Utils.getFirstMatch(/(?:electron)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/MiuiBrowser/i],describe(ua){const browser={name:"Miui"};const version=Utils.getFirstMatch(/(?:MiuiBrowser)[\s/](\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/chromium/i],describe(ua){const browser={name:"Chromium"};const version=Utils.getFirstMatch(/(?:chromium)[\s/](\d+(\.?_?\d+)+)/i,ua)||Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/chrome|crios|crmo/i],describe(ua){const browser={name:"Chrome"};const version=Utils.getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test:[/GSA/i],describe(ua){const browser={name:"Google Search"};const version=Utils.getFirstMatch(/(?:GSA)\/(\d+(\.?_?\d+)+)/i,ua);if(version){browser.version=version}return browser}},{test(parser){const notLikeAndroid=!parser.test(/like android/i);const butAndroid=parser.test(/android/i);return notLikeAndroid&&butAndroid},describe(ua){const browser={name:"Android Browser"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/playstation 4/i],describe(ua){const browser={name:"PlayStation 4"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/safari|applewebkit/i],describe(ua){const browser={name:"Safari"};const version=Utils.getFirstMatch(commonVersionIdentifier,ua);if(version){browser.version=version}return browser}},{test:[/.*/i],describe(ua){const regexpWithoutDeviceSpec=/^(.*)\/(.*) /;const regexpWithDeviceSpec=/^(.*)\/(.*)[ \t]\((.*)/;const hasDeviceSpec=ua.search("\\(")!==-1;const regexp=hasDeviceSpec?regexpWithDeviceSpec:regexpWithoutDeviceSpec;return{name:Utils.getFirstMatch(regexp,ua),version:Utils.getSecondMatch(regexp,ua)}}}];var osParsersList=[{test:[/Roku\/DVP/],describe(ua){const version=Utils.getFirstMatch(/Roku\/DVP-(\d+\.\d+)/i,ua);return{name:OS_MAP.Roku,version:version}}},{test:[/windows phone/i],describe(ua){const version=Utils.getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i,ua);return{name:OS_MAP.WindowsPhone,version:version}}},{test:[/windows /i],describe(ua){const version=Utils.getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i,ua);const versionName=Utils.getWindowsVersionName(version);return{name:OS_MAP.Windows,version:version,versionName:versionName}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(ua){const result={name:OS_MAP.iOS};const version=Utils.getSecondMatch(/(Version\/)(\d[\d.]+)/,ua);if(version){result.version=version}return result}},{test:[/macintosh/i],describe(ua){const version=Utils.getFirstMatch(/mac os x (\d+(\.?_?\d+)+)/i,ua).replace(/[_\s]/g,".");const versionName=Utils.getMacOSVersionName(version);const os={name:OS_MAP.MacOS,version:version};if(versionName){os.versionName=versionName}return os}},{test:[/(ipod|iphone|ipad)/i],describe(ua){const version=Utils.getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i,ua).replace(/[_\s]/g,".");return{name:OS_MAP.iOS,version:version}}},{test(parser){const notLikeAndroid=!parser.test(/like android/i);const butAndroid=parser.test(/android/i);return notLikeAndroid&&butAndroid},describe(ua){const version=Utils.getFirstMatch(/android[\s/-](\d+(\.\d+)*)/i,ua);const versionName=Utils.getAndroidVersionName(version);const os={name:OS_MAP.Android,version:version};if(versionName){os.versionName=versionName}return os}},{test:[/(web|hpw)[o0]s/i],describe(ua){const version=Utils.getFirstMatch(/(?:web|hpw)[o0]s\/(\d+(\.\d+)*)/i,ua);const os={name:OS_MAP.WebOS};if(version&&version.length){os.version=version}return os}},{test:[/blackberry|\bbb\d+/i,/rim\stablet/i],describe(ua){const version=Utils.getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i,ua)||Utils.getFirstMatch(/blackberry\d+\/(\d+([_\s]\d+)*)/i,ua)||Utils.getFirstMatch(/\bbb(\d+)/i,ua);return{name:OS_MAP.BlackBerry,version:version}}},{test:[/bada/i],describe(ua){const version=Utils.getFirstMatch(/bada\/(\d+(\.\d+)*)/i,ua);return{name:OS_MAP.Bada,version:version}}},{test:[/tizen/i],describe(ua){const version=Utils.getFirstMatch(/tizen[/\s](\d+(\.\d+)*)/i,ua);return{name:OS_MAP.Tizen,version:version}}},{test:[/linux/i],describe(){return{name:OS_MAP.Linux}}},{test:[/CrOS/],describe(){return{name:OS_MAP.ChromeOS}}},{test:[/PlayStation 4/],describe(ua){const version=Utils.getFirstMatch(/PlayStation 4[/\s](\d+(\.\d+)*)/i,ua);return{name:OS_MAP.PlayStation4,version:version}}}];var platformParsersList=[{test:[/googlebot/i],describe(){return{type:"bot",vendor:"Google"}}},{test:[/huawei/i],describe(ua){const model=Utils.getFirstMatch(/(can-l01)/i,ua)&&"Nova";const platform={type:PLATFORMS_MAP.mobile,vendor:"Huawei"};if(model){platform.model=model}return platform}},{test:[/nexus\s*(?:7|8|9|10).*/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Nexus"}}},{test:[/ipad/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/Macintosh(.*?) FxiOS(.*?)\//],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Apple",model:"iPad"}}},{test:[/kftt build/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Amazon",model:"Kindle Fire HD 7"}}},{test:[/silk/i],describe(){return{type:PLATFORMS_MAP.tablet,vendor:"Amazon"}}},{test:[/tablet(?! pc)/i],describe(){return{type:PLATFORMS_MAP.tablet}}},{test(parser){const iDevice=parser.test(/ipod|iphone/i);const likeIDevice=parser.test(/like (ipod|iphone)/i);return iDevice&&!likeIDevice},describe(ua){const model=Utils.getFirstMatch(/(ipod|iphone)/i,ua);return{type:PLATFORMS_MAP.mobile,vendor:"Apple",model:model}}},{test:[/nexus\s*[0-6].*/i,/galaxy nexus/i],describe(){return{type:PLATFORMS_MAP.mobile,vendor:"Nexus"}}},{test:[/[^-]mobi/i],describe(){return{type:PLATFORMS_MAP.mobile}}},{test(parser){return parser.getBrowserName(true)==="blackberry"},describe(){return{type:PLATFORMS_MAP.mobile,vendor:"BlackBerry"}}},{test(parser){return parser.getBrowserName(true)==="bada"},describe(){return{type:PLATFORMS_MAP.mobile}}},{test(parser){return parser.getBrowserName()==="windows phone"},describe(){return{type:PLATFORMS_MAP.mobile,vendor:"Microsoft"}}},{test(parser){const osMajorVersion=Number(String(parser.getOSVersion()).split(".")[0]);return parser.getOSName(true)==="android"&&osMajorVersion>=3},describe(){return{type:PLATFORMS_MAP.tablet}}},{test(parser){return parser.getOSName(true)==="android"},describe(){return{type:PLATFORMS_MAP.mobile}}},{test(parser){return parser.getOSName(true)==="macos"},describe(){return{type:PLATFORMS_MAP.desktop,vendor:"Apple"}}},{test(parser){return parser.getOSName(true)==="windows"},describe(){return{type:PLATFORMS_MAP.desktop}}},{test(parser){return parser.getOSName(true)==="linux"},describe(){return{type:PLATFORMS_MAP.desktop}}},{test(parser){return parser.getOSName(true)==="playstation 4"},describe(){return{type:PLATFORMS_MAP.tv}}},{test(parser){return parser.getOSName(true)==="roku"},describe(){return{type:PLATFORMS_MAP.tv}}}];var enginesParsersList=[{test(parser){return parser.getBrowserName(true)==="microsoft edge"},describe(ua){const isBlinkBased=/\sedg\//i.test(ua);if(isBlinkBased){return{name:ENGINE_MAP.Blink}}const version=Utils.getFirstMatch(/edge\/(\d+(\.?_?\d+)+)/i,ua);return{name:ENGINE_MAP.EdgeHTML,version:version}}},{test:[/trident/i],describe(ua){const engine={name:ENGINE_MAP.Trident};const version=Utils.getFirstMatch(/trident\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}},{test(parser){return parser.test(/presto/i)},describe(ua){const engine={name:ENGINE_MAP.Presto};const version=Utils.getFirstMatch(/presto\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}},{test(parser){const isGecko=parser.test(/gecko/i);const likeGecko=parser.test(/like gecko/i);return isGecko&&!likeGecko},describe(ua){const engine={name:ENGINE_MAP.Gecko};const version=Utils.getFirstMatch(/gecko\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}},{test:[/(apple)?webkit\/537\.36/i],describe(){return{name:ENGINE_MAP.Blink}}},{test:[/(apple)?webkit/i],describe(ua){const engine={name:ENGINE_MAP.WebKit};const version=Utils.getFirstMatch(/webkit\/(\d+(\.?_?\d+)+)/i,ua);if(version){engine.version=version}return engine}}];class Parser{constructor(UA,skipParsing=false){if(UA===void 0||UA===null||UA===""){throw new Error("UserAgent parameter can't be empty")}this._ua=UA;this.parsedResult={};if(skipParsing!==true){this.parse()}}getUA(){return this._ua}test(regex){return regex.test(this._ua)}parseBrowser(){this.parsedResult.browser={};const browserDescriptor=Utils.find(browsersList,_browser=>{if(typeof _browser.test==="function"){return _browser.test(this)}if(_browser.test instanceof Array){return _browser.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(browserDescriptor){this.parsedResult.browser=browserDescriptor.describe(this.getUA())}return this.parsedResult.browser}getBrowser(){if(this.parsedResult.browser){return this.parsedResult.browser}return this.parseBrowser()}getBrowserName(toLowerCase){if(toLowerCase){return String(this.getBrowser().name).toLowerCase()||""}return this.getBrowser().name||""}getBrowserVersion(){return this.getBrowser().version}getOS(){if(this.parsedResult.os){return this.parsedResult.os}return this.parseOS()}parseOS(){this.parsedResult.os={};const os=Utils.find(osParsersList,_os=>{if(typeof _os.test==="function"){return _os.test(this)}if(_os.test instanceof Array){return _os.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(os){this.parsedResult.os=os.describe(this.getUA())}return this.parsedResult.os}getOSName(toLowerCase){const{name:name}=this.getOS();if(toLowerCase){return String(name).toLowerCase()||""}return name||""}getOSVersion(){return this.getOS().version}getPlatform(){if(this.parsedResult.platform){return this.parsedResult.platform}return this.parsePlatform()}getPlatformType(toLowerCase=false){const{type:type}=this.getPlatform();if(toLowerCase){return String(type).toLowerCase()||""}return type||""}parsePlatform(){this.parsedResult.platform={};const platform=Utils.find(platformParsersList,_platform=>{if(typeof _platform.test==="function"){return _platform.test(this)}if(_platform.test instanceof Array){return _platform.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(platform){this.parsedResult.platform=platform.describe(this.getUA())}return this.parsedResult.platform}getEngine(){if(this.parsedResult.engine){return this.parsedResult.engine}return this.parseEngine()}getEngineName(toLowerCase){if(toLowerCase){return String(this.getEngine().name).toLowerCase()||""}return this.getEngine().name||""}parseEngine(){this.parsedResult.engine={};const engine=Utils.find(enginesParsersList,_engine=>{if(typeof _engine.test==="function"){return _engine.test(this)}if(_engine.test instanceof Array){return _engine.test.some(condition=>this.test(condition))}throw new Error("Browser's test function is not valid")});if(engine){this.parsedResult.engine=engine.describe(this.getUA())}return this.parsedResult.engine}parse(){this.parseBrowser();this.parseOS();this.parsePlatform();this.parseEngine();return this}getResult(){return Utils.assign({},this.parsedResult)}satisfies(checkTree){const platformsAndOSes={};let platformsAndOSCounter=0;const browsers={};let browsersCounter=0;const allDefinitions=Object.keys(checkTree);allDefinitions.forEach(key=>{const currentDefinition=checkTree[key];if(typeof currentDefinition==="string"){browsers[key]=currentDefinition;browsersCounter+=1}else if(typeof currentDefinition==="object"){platformsAndOSes[key]=currentDefinition;platformsAndOSCounter+=1}});if(platformsAndOSCounter>0){const platformsAndOSNames=Object.keys(platformsAndOSes);const OSMatchingDefinition=Utils.find(platformsAndOSNames,name=>this.isOS(name));if(OSMatchingDefinition){const osResult=this.satisfies(platformsAndOSes[OSMatchingDefinition]);if(osResult!==void 0){return osResult}}const platformMatchingDefinition=Utils.find(platformsAndOSNames,name=>this.isPlatform(name));if(platformMatchingDefinition){const platformResult=this.satisfies(platformsAndOSes[platformMatchingDefinition]);if(platformResult!==void 0){return platformResult}}}if(browsersCounter>0){const browserNames=Object.keys(browsers);const matchingDefinition=Utils.find(browserNames,name=>this.isBrowser(name,true));if(matchingDefinition!==void 0){return this.compareVersion(browsers[matchingDefinition])}}return undefined}isBrowser(browserName,includingAlias=false){const defaultBrowserName=this.getBrowserName().toLowerCase();let browserNameLower=browserName.toLowerCase();const alias=Utils.getBrowserTypeByAlias(browserNameLower);if(includingAlias&&alias){browserNameLower=alias.toLowerCase()}return browserNameLower===defaultBrowserName}compareVersion(version){let expectedResults=[0];let comparableVersion=version;let isLoose=false;const currentBrowserVersion=this.getBrowserVersion();if(typeof currentBrowserVersion!=="string"){return void 0}if(version[0]===">"||version[0]==="<"){comparableVersion=version.substr(1);if(version[1]==="="){isLoose=true;comparableVersion=version.substr(2)}else{expectedResults=[]}if(version[0]===">"){expectedResults.push(1)}else{expectedResults.push(-1)}}else if(version[0]==="="){comparableVersion=version.substr(1)}else if(version[0]==="~"){isLoose=true;comparableVersion=version.substr(1)}return expectedResults.indexOf(Utils.compareVersions(currentBrowserVersion,comparableVersion,isLoose))>-1}isOS(osName){return this.getOSName(true)===String(osName).toLowerCase()}isPlatform(platformType){return this.getPlatformType(true)===String(platformType).toLowerCase()}isEngine(engineName){return this.getEngineName(true)===String(engineName).toLowerCase()}is(anything,includingAlias=false){return this.isBrowser(anything,includingAlias)||this.isOS(anything)||this.isPlatform(anything)}some(anythings=[]){return anythings.some(anything=>this.is(anything))}}class Bowser{static getParser(UA,skipParsing=false){if(typeof UA!=="string"){throw new Error("UserAgent should be a string")}return new Parser(UA,skipParsing)}static parse(UA){return new Parser(UA).getResult()}static get BROWSER_MAP(){return BROWSER_MAP}static get ENGINE_MAP(){return ENGINE_MAP}static get OS_MAP(){return OS_MAP}static get PLATFORMS_MAP(){return PLATFORMS_MAP}}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t=this._data.length){return undefined}var res=this._data.slice(this._pos,this._pos+bytes);this._pos+=bytes;return res}},{key:"set",value:function set(pos,data){this._pos=pos;this._data=data}},{key:"clear",value:function clear(){this._pos=0;this._data=new Uint8Array}}])}();var PvFileIDB=function(_PvFile){function PvFileIDB(path,meta,db,mode){var _this;_classCallCheck(this,PvFileIDB);_this=_callSuper$1(this,PvFileIDB);_this._pageSize=512*1024;_this._pagePtr=0;_this._pageOffset=0;_this._path=path;_this._meta=meta;_this._db=db;_this._mode=mode;_this._cache=new PvCache;return _this}_inherits(PvFileIDB,_PvFile);return _createClass(PvFileIDB,[{key:"pageSize",get:function get(){return this._pageSize}},{key:"close",value:function(){var _close=_asyncToGenerator(_regeneratorRuntime.mark(function _callee(){return _regeneratorRuntime.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:this._db.close();case 1:case"end":return _context.stop()}},_callee,this)}));function close(){return _close.apply(this,arguments)}return close}()},{key:"read",value:function(){var _read=_asyncToGenerator(_regeneratorRuntime.mark(function _callee2(size,count){var _this2=this;return _regeneratorRuntime.wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:return _context2.abrupt("return",new Promise(function(resolve,reject){if(!_this2.exists()){reject(new Error("'".concat(_this2._path,"' doesn't exist.")));return}if(_this2._isEOF){var err=new Error("EOF");err.name="EndOfFile";reject(err);return}var copied=0;var maxToCopy=Math.min(size*count,_this2._meta.size);var totalElems=maxToCopy-maxToCopy%size;var buffer=new Uint8Array(totalElems);var res=_this2._cache.get(totalElems);if(res){copied+=res.length;_this2._pageOffset+=res.length;if(_this2._pageOffset===_this2._pageSize){_this2._pagePtr+=1;_this2._pageOffset=0}if(totalElems===copied){resolve(res);return}buffer.set(res)}var keyRange=IDBKeyRange.bound("".concat(_this2._path,"-").concat(PvFileIDB.createPage(_this2._pagePtr)),"".concat(_this2._path,"-").concat(PvFileIDB.createPage(_this2._pagePtr+Math.floor(totalElems/_this2._pageSize)+1)));var store=_this2._store;var req=store.openCursor(keyRange);req.onsuccess=function(){var cursor=req.result;if(!cursor||_this2._isEOF){return}var toCopy=Math.min(totalElems-copied,cursor.value.length-_this2._pageOffset);buffer.set(cursor.value.slice(_this2._pageOffset,_this2._pageOffset+toCopy),copied);copied+=toCopy;_this2._pageOffset+=toCopy;if(_this2._pageOffset===_this2._pageSize){_this2._pagePtr+=1;_this2._pageOffset=0}if(copied1&&_args4[1]!==undefined?_args4[1]:1;return _context4.abrupt("return",new Promise(function(){var _ref=_asyncToGenerator(_regeneratorRuntime.mark(function _callee3(resolve,reject){var _store$transaction3;var store,getCurrentPage,last,newContent,newSize,newMeta,pages,i,keyRange,_store$transaction4;return _regeneratorRuntime.wrap(function _callee3$(_context3){while(1)switch(_context3.prev=_context3.next){case 0:if(!(_this3._mode==="readonly")){_context3.next=3;break}reject(new Error("Instance is readonly mode only."));return _context3.abrupt("return");case 3:if(!(typeof version!=="number"&&version<=0)){_context3.next=6;break}reject(new Error("Version should be a positive number"));return _context3.abrupt("return");case 6:store=_this3._store;getCurrentPage=function getCurrentPage(){return new Promise(function(res){var req=store.get("".concat(_this3._path,"-").concat(PvFileIDB.createPage(_this3._pagePtr)));req.onsuccess=function(){if(req.result!==undefined){res(req.result.slice(0,_this3._pageOffset))}else{res(new Uint8Array(0))}}})};_context3.next=10;return getCurrentPage();case 10:last=_context3.sent;newContent=new Uint8Array(last.length+content.length);newContent.set(last);newContent.set(content,last.length);newSize=_this3._pagePtr*_this3._pageSize+newContent.length;newMeta={size:newSize,numPages:Math.ceil(newSize/_this3._pageSize),version:version,pageSize:_this3._pageSize};store.put(newMeta,_this3._path);pages=Math.ceil(newContent.length/_this3._pageSize);for(i=0;i=this._meta.numPages-1&&this._pageOffset>=this._meta.size%this._pageSize}},{key:"_store",get:function get(){return this._db.transaction(PV_FILE_STORE,this._mode).objectStore(PV_FILE_STORE)}}],[{key:"open",value:function open(path,mode){if(!self.indexedDB){var error=new Error("IndexedDB is not supported");error.name="IndexedDBNotSupported";throw error}return new Promise(function(){var _ref3=_asyncToGenerator(_regeneratorRuntime.mark(function _callee7(resolve,reject){var db,req,_error2;return _regeneratorRuntime.wrap(function _callee7$(_context7){while(1)switch(_context7.prev=_context7.next){case 0:_context7.prev=0;_context7.next=3;return getDB();case 3:db=_context7.sent;req=db.transaction(PV_FILE_STORE,"readwrite").objectStore(PV_FILE_STORE).get(path);req.onerror=function(){reject(req.error)};req.onsuccess=function(){var meta=req.result;var dbMode=mode.includes("r")?"readonly":"readwrite";if(meta===undefined&&dbMode==="readonly"){var _error=new Error("'".concat(path,"' doesn't exist."));_error.name="FileNotExists";reject(_error);return}var fileIDB=new PvFileIDB(path,meta,db,dbMode);if(mode.includes("a")){fileIDB.seek(0,2)}resolve(fileIDB)};_context7.next=12;break;case 9:_context7.prev=9;_context7.t0=_context7["catch"](0);if(_context7.t0.name==="InvalidStateError"){_error2=new Error("IndexedDB is not supported");_error2.name="IndexedDBNotSupported";reject(_error2)}else{reject(_context7.t0)}case 12:case"end":return _context7.stop()}},_callee7,null,[[0,9]])}));return function(_x8,_x9){return _ref3.apply(this,arguments)}}())}},{key:"createPage",value:function createPage(page){return("00000"+page).slice(-6)}}])}(PvFile);function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}var PvFileMem=function(_PvFile){function PvFileMem(path,meta,db,mode){var _this;_classCallCheck(this,PvFileMem);_this=_callSuper(this,PvFileMem);_this._pos=0;_this._path=path;_this._meta=meta;_this._mode=mode;return _this}_inherits(PvFileMem,_PvFile);return _createClass(PvFileMem,[{key:"close",value:function close(){return}},{key:"read",value:function read(size,count){if(!this.exists()){throw new Error("'".concat(this._path,"' doesn't exist."))}if(this._isEOF){var err=new Error("EOF");err.name="EndOfFile";throw err}var toCopy=Math.min(size*count,this._file.length-this._pos);var totalElems=toCopy-toCopy%size;var buffer=new Uint8Array(totalElems);buffer.set(this._file.slice(this._pos,this._pos+totalElems),0);this._pos+=totalElems;return buffer}},{key:"write",value:function write(content){var version=arguments.length>1&&arguments[1]!==undefined?arguments[1]:1;var newFile=new Uint8Array(this._pos+content.length);if(this._file!==undefined){newFile.set(this._file.slice(0,this._pos));newFile.set(content,this._pos)}else{newFile.set(content)}this._file=newFile;this._pos+=content.length}},{key:"seek",value:function seek(offset,whence){if(!this.exists()&&this._mode==="readonly"){throw new Error("'".concat(this._path,"' doesn't exist."))}if(!this.exists()){throw new Error("'".concat(this._path,"' doesn't exist."))}if(offset<0){var err=new Error("EOF");err.name="EndOfFile";throw err}var newOffset;if(whence===0){newOffset=Math.min(offset,this._file.length)}else if(whence===1){newOffset=Math.min(this._pos+offset,this._file.length)}else if(whence===2){newOffset=Math.min(this._file.length+offset,this._file.length)}else{throw new Error("Invalid operation: ".concat(whence,"."))}this._pos=newOffset}},{key:"tell",value:function tell(){if(!this.exists()){return-1}return this._pos}},{key:"remove",value:function(){var _remove=_asyncToGenerator(_regeneratorRuntime.mark(function _callee(){return _regeneratorRuntime.wrap(function _callee$(_context){while(1)switch(_context.prev=_context.next){case 0:if(this.exists()){_context.next=2;break}throw new Error("ENOENT");case 2:PvFileMem._memFiles["delete"](this._path);this._pos=0;case 4:case"end":return _context.stop()}},_callee,this)}));function remove(){return _remove.apply(this,arguments)}return remove}()},{key:"exists",value:function exists(){return this._file!==undefined}},{key:"_isEOF",get:function get(){return this._pos>=this._file.length}},{key:"_file",get:function get(){return PvFileMem._memFiles.get(this._path)},set:function set(content){PvFileMem._memFiles.set(this._path,content)}}],[{key:"open",value:function open(path,mode){var file=PvFileMem._memFiles.get(path);var dbMode=mode.includes("r")?"readonly":"readwrite";if(file===undefined&&dbMode==="readonly"){var error=new Error("'".concat(path,"' doesn't exist."));error.name="FileNotExists";throw error}var fileMem=new PvFileMem(path,undefined,undefined,dbMode);if(mode.includes("a")){fileMem.seek(0,2)}return fileMem}}])}(PvFile);PvFileMem._memFiles=new Map;function unsignedAddress(address){if(address<0){return address>>>0}return address}function _arrayWithHoles(r){if(Array.isArray(r))return r}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayLikeToArray$2(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _unsupportedIterableToArray$1(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray$1(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray$1(r,a):void 0}}function _arrayLikeToArray$1(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e=16){this.endComputePass();this.flushCommandEncoder()}}},{key:"endComputePass",value:function endComputePass(){if(this._passEncoder){this._passEncoder.end();this._passEncoder=null}}},{key:"getBuffer",value:function getBuffer(sizeBytes,usage){var mappedAtCreation=arguments.length>2&&arguments[2]!==undefined?arguments[2]:false;var label=arguments.length>3?arguments[3]:undefined;var key=this.getBufferKey(sizeBytes,usage);if(this.bufferReusePool.has(key)){var buffers=this.bufferReusePool.get(key);if(buffers&&buffers.length>0){return buffers.pop()}}return this.device.createBuffer({size:sizeBytes*Uint8Array.BYTES_PER_ELEMENT,usage:usage,mappedAtCreation:mappedAtCreation,label:label})}},{key:"scheduleUniformBufferForRelease",value:function scheduleUniformBufferForRelease(buffer){this._uniformBuffersPendingRelease.push(buffer)}},{key:"releaseBuffer",value:function releaseBuffer(buffer){var clearBuffer=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;if(clearBuffer){this.endComputePass();this.commandEncoder.clearBuffer(buffer,0,buffer.size)}var key=this.getBufferKey(buffer.size,buffer.usage);if(!this.bufferReusePool.has(key)){this.bufferReusePool.set(key,[])}this.bufferReusePool.get(key).push(buffer)}},{key:"sync",value:function(){var _sync=_asyncToGenerator(_regeneratorRuntime.mark(function _callee(){var _this=this;var _iterator,_step,k,buffers,_iterator3,_step3,b,_loop,_i,_Object$entries;return _regeneratorRuntime.wrap(function _callee$(_context3){while(1)switch(_context3.prev=_context3.next){case 0:this.endComputePass();this.flushCommandEncoder();_context3.next=4;return this.device.queue.onSubmittedWorkDone();case 4:_iterator=_createForOfIteratorHelper$1(this.bufferReusePool.keys());try{for(_iterator.s();!(_step=_iterator.n()).done;){k=_step.value;buffers=this.bufferReusePool.get(k);if(buffers&&buffers.length>0){_iterator3=_createForOfIteratorHelper$1(buffers);try{for(_iterator3.s();!(_step3=_iterator3.n()).done;){b=_step3.value;b===null||b===void 0||b.destroy()}}catch(err){_iterator3.e(err)}finally{_iterator3.f()}}}}catch(err){_iterator.e(err)}finally{_iterator.f()}this.bufferReusePool.clear();_loop=_regeneratorRuntime.mark(function _loop(){var _Object$entries$_i,shaderName,timestampBuffers,_iterator2,_step2,_loop2;return _regeneratorRuntime.wrap(function _loop$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:_Object$entries$_i=_slicedToArray(_Object$entries[_i],2),shaderName=_Object$entries$_i[0],timestampBuffers=_Object$entries$_i[1];if(!_this.shaderTimes[shaderName]){_this.shaderTimes[shaderName]=[]}_iterator2=_createForOfIteratorHelper$1(timestampBuffers);_context2.prev=3;_loop2=_regeneratorRuntime.mark(function _loop2(){var timestampBuffer;return _regeneratorRuntime.wrap(function _loop2$(_context){while(1)switch(_context.prev=_context.next){case 0:timestampBuffer=_step2.value;timestampBuffer.mapAsync(GPUMapMode.READ).then(function(){var times=new BigInt64Array(timestampBuffer.getMappedRange());var timeDif=times[1]-times[0];timestampBuffer.unmap();timestampBuffer.destroy();_this.shaderTimes[shaderName].push(timeDif)});case 2:case"end":return _context.stop()}},_loop2)});_iterator2.s();case 6:if((_step2=_iterator2.n()).done){_context2.next=10;break}return _context2.delegateYield(_loop2(),"t0",8);case 8:_context2.next=6;break;case 10:_context2.next=15;break;case 12:_context2.prev=12;_context2.t1=_context2["catch"](3);_iterator2.e(_context2.t1);case 15:_context2.prev=15;_iterator2.f();return _context2.finish(15);case 18:case"end":return _context2.stop()}},_loop,null,[[3,12,15,18]])});_i=0,_Object$entries=Object.entries(this.timestampBuffers);case 9:if(!(_i<_Object$entries.length)){_context3.next=14;break}return _context3.delegateYield(_loop(),"t0",11);case 11:_i++;_context3.next=9;break;case 14:this.timestampBuffers={};case 15:case"end":return _context3.stop()}},_callee,this)}));function sync(){return _sync.apply(this,arguments)}return sync}()},{key:"reportShaderTimes",value:function reportShaderTimes(){for(var _i2=0,_Object$entries2=Object.entries(this.shaderTimes);_i2<_Object$entries2.length;_i2++){var _Object$entries2$_i=_slicedToArray(_Object$entries2[_i2],2),shaderName=_Object$entries2$_i[0],shaderTimes=_Object$entries2$_i[1];var timeSum=0n;var _iterator4=_createForOfIteratorHelper$1(shaderTimes),_step4;try{for(_iterator4.s();!(_step4=_iterator4.n()).done;){var shaderTime=_step4.value;timeSum=timeSum+shaderTime}}catch(err){_iterator4.e(err)}finally{_iterator4.f()}var totalSeconds=Number(timeSum)*1e-9;var avgSeconds=(totalSeconds/shaderTimes.length).toFixed(7);console.log("".concat(shaderName,", ").concat(totalSeconds.toFixed(5),", ").concat(avgSeconds))}this.shaderTimes={}}},{key:"flushCommandEncoder",value:function flushCommandEncoder(){var _this2=this;this.device.queue.submit([this.commandEncoder.finish()]);this._commandEncoder=null;this._numCommandsEncoded=0;this._stageBuffersPendingMap.forEach(function(buffer){buffer.destroy()});this._stageBuffersPendingMap=[];this._uniformBuffersPendingRelease.forEach(function(buffer){_this2.releaseBuffer(buffer,false)});this._uniformBuffersPendingRelease=[]}},{key:"writeBuffer",value:function writeBuffer(sizeBytes,offset,srcArray,dstBuffer){var stagingBuffer=this.getBuffer(sizeBytes,GPUBufferUsage.MAP_WRITE|GPUBufferUsage.COPY_SRC,true);new Uint8Array(stagingBuffer.getMappedRange()).set(srcArray);stagingBuffer.unmap();this._stageBuffersPendingMap.push(stagingBuffer);this.endComputePass();this.commandEncoder.copyBufferToBuffer(stagingBuffer,0,dstBuffer,offset,sizeBytes);this.numCommandsEncoded++}},{key:"dispatchComputerShader",value:function dispatchComputerShader(bindGroup,pipeline,shaderName,workgroupCountX,workgroupCountY,workgroupCountZ){if(this.isTimerEnabled){var querySet=this.device.createQuerySet({type:"timestamp",count:2});var timestampWrites={querySet:querySet,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1};this.endComputePass();this._passEncoder=this.commandEncoder.beginComputePass({timestampWrites:timestampWrites});this._passEncoder.setBindGroup(0,bindGroup);this._passEncoder.setPipeline(pipeline);this._passEncoder.dispatchWorkgroups(workgroupCountX,workgroupCountY,workgroupCountZ);this.endComputePass();var size=2*BigInt64Array.BYTES_PER_ELEMENT;var resolveBuffer=this.device.createBuffer({size:size,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC});this.commandEncoder.resolveQuerySet(querySet,0,2,resolveBuffer,0);var resultBuffer=this.device.createBuffer({size:size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});this.commandEncoder.copyBufferToBuffer(resolveBuffer,0,resultBuffer,0,size);if(!this.timestampBuffers[shaderName]){this.timestampBuffers[shaderName]=[]}this.timestampBuffers[shaderName].push(resultBuffer);this.numCommandsEncoded+=3}else{if(!this._passEncoder){this._passEncoder=this.commandEncoder.beginComputePass()}this._passEncoder.setBindGroup(0,bindGroup);this._passEncoder.setPipeline(pipeline);this._passEncoder.dispatchWorkgroups(workgroupCountX,workgroupCountY,workgroupCountZ);this.numCommandsEncoded++}}}])}();var PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE=256;var gpuDevices=new Map;var gpuBuffers=new Map;var emptyShader="\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main_empty() {}\n";var shaderEntryPoint="main";var PRECOMPUTE_ENCODING_SHADER_NAME="pv_picollm_attention_precompute_encoding_shader";var attentionPrecomputeEncodingShaderSource="\nstruct argsStruct {\n dimension: u32,\n steps: u32,\n theta: f32,\n encoding_offset: u32,\n rope_scale: f32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar encoding: array;\n\n@group(0) @binding(2)\nvar rope_scales: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3,\n @builtin(num_workgroups) num_workgroups: vec3\n) {\n let ts = workgroup_id.x;\n let ds = local_id.x;\n \n for (var t = ts; t < args.steps; t += num_workgroups.x) {\n for (var d = ds; d < (args.dimension / 2u); d += workgroup_size_x) {\n let f = 2u * d;\n let x = f32(t) / (f32(rope_scales[f >> 1]) * pow(args.theta, f32(f) / f32(args.dimension)));\n let encoding_idx = args.encoding_offset + (t * args.dimension) + f;\n encoding[encoding_idx] = cos(x) * args.rope_scale;\n encoding[encoding_idx + 1] = sin(x) * args.rope_scale;\n }\n }\n}\n\n".concat(emptyShader);var loadAttentionPrecomputeEncodingShader=function loadAttentionPrecomputeEncodingShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention precompute encoding bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention precompute encoding pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention precompute encoding shader module",code:attentionPrecomputeEncodingShaderSource});var computePipeline=device.createComputePipeline({label:"attention precompute encoding pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ENCODE_ROPE_INTERLEAVED_SHADER_NAME="pv_picollm_attention_encode_rope_interleaved_shader";var attentionEncodeRopeInterleavedShaderSource="\nstruct argsStruct { \n n: u32,\n num_heads: u32,\n head_dimension: u32,\n rope_dimension: u32,\n position: u32,\n encoding_offset: u32,\n x_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar encoding: array;\n\n@group(0) @binding(2)\nvar x: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3,\n @builtin(num_workgroups) num_workgroups: vec3\n) {\n let ts = workgroup_id.x;\n let h = workgroup_id.y;\n let ds = local_id.x;\n\n for (var t = ts; t < args.n; t += num_workgroups.x) {\n let x_start = args.x_offset + (t * args.num_heads + h) * args.head_dimension;\n let encoding_start = args.encoding_offset + ((t + args.position) * args.rope_dimension); \n for (var d = ds; d < (args.head_dimension / 2u); d += workgroup_size_x) {\n let i = 2u * d;\n let x_idx = x_start + i;\n let encoding_idx = encoding_start + i;\n \n let re = x[x_idx];\n let im = x[x_idx + 1];\n x[x_idx] = (re * encoding[encoding_idx]) - (im * encoding[encoding_idx + 1]);\n x[x_idx + 1] = (re * encoding[encoding_idx + 1]) + (im * encoding[encoding_idx]);\n }\n }\n}\n\n".concat(emptyShader);var loadAttentionEncodeRopeInterleavedShader=function loadAttentionEncodeRopeInterleavedShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention encode rope interleave bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention encode rope interleave pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention encode rope interleave shader module",code:attentionEncodeRopeInterleavedShaderSource});var computePipeline=device.createComputePipeline({label:"attention encode rope interleave pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ENCODE_SHADER_NAME="pv_picollm_attention_encode_shader";var attentionEncodeShaderSource="\nstruct argsStruct { \n n: u32,\n num_heads: u32,\n head_dimension: u32,\n rope_dimension: u32,\n position: u32,\n encoding_offset: u32,\n x_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar encoding: array;\n\n@group(0) @binding(2)\nvar x: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3,\n @builtin(num_workgroups) num_workgroups: vec3\n) {\n let ts = workgroup_id.x;\n let h = workgroup_id.y;\n let ds = local_id.x;\n\n for (var t = ts; t < args.n; t += num_workgroups.x) {\n let half_rope = (args.rope_dimension / 2);\n let xr_start = args.x_offset + ((t * args.num_heads + h) * args.head_dimension);\n let xi_start = xr_start + half_rope;\n let encoding_start = args.encoding_offset + ((t + args.position) * args.rope_dimension); \n for (var d = ds; d < half_rope; d += workgroup_size_x) {\n let xr_idx = xr_start + d;\n let xi_idx = xi_start + d;\n let encoding_idx = encoding_start + (2 * d);\n\n let re = x[xr_idx];\n let im = x[xi_idx];\n x[xr_idx] = (re * encoding[encoding_idx]) - (im * encoding[encoding_idx + 1]);\n x[xi_idx] = (re * encoding[encoding_idx + 1]) + (im * encoding[encoding_idx]);\n }\n }\n}\n\n".concat(emptyShader);var loadAttentionEncodeShader=function loadAttentionEncodeShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention encode bind layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention encode pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention encode shader",code:attentionEncodeShaderSource});var computePipeline=device.createComputePipeline({label:"attention encode pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var DOT_PRODUCT_SHADER_NAME="pv_picollm_attention_dot_product_shader";var attentionDotProductShaderSource="\nstruct argsStruct { \n n: u32,\n tq: u32,\n head_dimension: u32,\n num_heads: u32,\n num_kv_heads: u32,\n window_length: u32,\n start: u32,\n norm: f32,\n length1: u32,\n num_keys: u32,\n query_offset: u32,\n keys_offset: u32,\n key_intercepts_offset: u32,\n key_slopes_offset: u32,\n scores_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar query: array;\n\n@group(0) @binding(2)\nvar keys: array;\n\n@group(0) @binding(3)\nvar key_intercepts: array;\n\n@group(0) @binding(4)\nvar key_slopes: array;\n\n@group(0) @binding(5)\nvar scores: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.num_heads) {\n return;\n }\n\n let head = global_id.x / (args.num_heads / args.num_kv_heads);\n \n let head_offset = head * args.window_length;\n let start_index = head_offset + args.start;\n \n let keys_local_a = args.keys_offset + (start_index * args.head_dimension);\n let key_intercepts_local_a = args.key_intercepts_offset + start_index; \n let key_slopes_local_a = args.key_slopes_offset + start_index;\n \n let keys_local_b = args.keys_offset + (head_offset * args.head_dimension);\n let key_intercepts_local_b = args.key_intercepts_offset + head_offset; \n let key_slopes_local_b = args.key_slopes_offset + head_offset;\n \n let scores_local = args.scores_offset + (global_id.x * args.num_keys);\n let query_local = args.query_offset + (((global_id.x * args.n) + args.tq) * args.head_dimension);\n \n for (var i = 0u; i < args.head_dimension; i++) { \n for (var k = 0u; k < args.num_keys; k++) {\n if (k < args.length1) { \n let key_idx = keys_local_a + (k * args.head_dimension) + i;\n let key_val = f32(extractBits(keys[key_idx / 4], (i * 8u) % 32u, 8u));\n let tmp = query[query_local + i] * (key_intercepts[key_intercepts_local_a + k] + (key_slopes[key_slopes_local_a + k] * key_val));\n scores[scores_local + k] += tmp;\n }\n else {\n let j = k - args.length1;\n let key_idx = keys_local_b + (j * args.head_dimension) + i;\n let key_val = f32(extractBits(keys[key_idx / 4], (i * 8u) % 32u, 8u));\n let tmp = query[query_local + i] * (key_intercepts[key_intercepts_local_b + j] + (key_slopes[key_slopes_local_b + j] * key_val));\n scores[scores_local + k] += tmp;\n }\n } \n }\n \n for (var k = 0u; k < args.num_keys; k++) {\n scores[scores_local + k] *= args.norm;\n }\n}\n\n".concat(emptyShader);var loadAttentionDotProductShader=function loadAttentionDotProductShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention dot product bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention dot product pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention dot product shader module",code:attentionDotProductShaderSource});var computePipeline=device.createComputePipeline({label:"attention dot product pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var SOFTMAX_SHADER_NAME="pv_picollm_attention_softmax_shader";var attentionSoftmaxShaderSource="\nstruct argsStruct { \n num_heads: u32,\n num_keys: u32,\n scores_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar scores: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.num_heads) {\n return;\n }\n\n let scores_start = args.scores_offset + (global_id.x * args.num_keys);\n \n var max_index: u32 = 0;\n for (var i = 1u; i < args.num_keys; i++) {\n if (scores[scores_start + i] > scores[scores_start + max_index]) {\n max_index = i;\n }\n }\n let max: f32 = scores[scores_start + max_index];\n\n var sum: f32 = 0.0;\n for (var i = 0u; i < args.num_keys; i++) {\n scores[scores_start + i] = exp(scores[scores_start + i] - max);\n sum += scores[scores_start + i];\n }\n\n for (var i = 0u; i < args.num_keys; i++) {\n scores[scores_start + i] /= sum;\n }\n}\n\n".concat(emptyShader);var loadAttentionSoftmaxShader=function loadAttentionSoftmaxShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention softmax bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention softmax pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention softmax shader module",code:attentionSoftmaxShaderSource});var computePipeline=device.createComputePipeline({label:"attention softmax pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var FIR_SHADER_NAME="pv_picollm_attention_fir_shader";var attentionFirShaderSource="\nstruct argsStruct { \n length1: u32,\n length2: u32,\n tq: u32,\n head_dimension: u32,\n num_heads: u32,\n num_kv_heads: u32,\n window_length: u32,\n start: u32,\n values_offset: u32,\n value_intercepts_offset: u32,\n value_slopes_offset: u32,\n scores_offset: u32,\n output_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar values: array;\n\n@group(0) @binding(2)\nvar value_intercepts: array;\n\n@group(0) @binding(3)\nvar value_slopes: array;\n\n@group(0) @binding(4)\nvar scores: array;\n\n@group(0) @binding(5)\nvar output: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.num_heads) {\n return;\n }\n\n let head = global_id.x / (args.num_heads / args.num_kv_heads);\n\n let head_offset = head * args.window_length;\n let start_index = head_offset + args.start;\n\n let values_local_a = args.values_offset + (start_index * args.head_dimension);\n let value_intercepts_local_a = args.value_intercepts_offset + start_index;\n let value_slopes_local_a = args.value_slopes_offset + start_index;\n let values_local_b = args.values_offset + (head_offset * args.head_dimension);\n let value_intercepts_local_b = args.value_intercepts_offset + head_offset;\n let value_slopes_local_b = args.value_slopes_offset + head_offset;\n let scores_local = args.scores_offset + (global_id.x * (args.length1 + args.length2));\n let output_local = args.output_offset + (((args.tq * args.num_heads) + global_id.x) * args.head_dimension);\n\n for (var i = 0u; i < args.head_dimension; i++) {\n var tmp: f32 = 0.0;\n for (var k = 0u; k < args.length1; k++) {\n let value_idx = values_local_a + (k * args.head_dimension) + i;\n let value_val = f32(extractBits(values[value_idx / 4], (i * 8u) % 32u, 8u));\n tmp += scores[scores_local + k] * (value_intercepts[value_intercepts_local_a + k] + (value_slopes[value_slopes_local_a + k] * value_val)); \n }\n for (var k = 0u; k < args.length2; k++) {\n let value_idx = values_local_b + (k * args.head_dimension) + i;\n let value_val = f32(extractBits(values[value_idx / 4], (i * 8u) % 32u, 8u));\n tmp += scores[scores_local + args.length1 + k] * (value_intercepts[value_intercepts_local_b + k] + (value_slopes[value_slopes_local_b + k] * value_val)); \n }\n output[output_local + i] = tmp;\n }\n}\n\n".concat(emptyShader);var loadAttentionFirShader=function loadAttentionFirShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention fir bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:5,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention fir pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention fir shader module",code:attentionFirShaderSource});var computePipeline=device.createComputePipeline({label:"attention fir pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var UPDATE_KV_SHADER_NAME="pv_picollm_attention_update_kv_shader";var attentionUpdateKvShaderSource="\nstruct argsStruct {\n n: u32,\n num_kv_heads: u32,\n window_length: u32,\n position: u32,\n head_dimension: u32,\n tf_offset: u32,\n kv_offset: u32,\n kv_intercepts_offset: u32,\n kv_slopes_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar tf: array;\n\n@group(0) @binding(2)\nvar kv: array;\n\n@group(0) @binding(3)\nvar kv_intercepts: array;\n\n@group(0) @binding(4)\nvar kv_slopes: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) { \n if (global_id.x >= args.num_kv_heads) {\n return;\n }\n \n for (var i = 0u; i < args.n; i++) {\n let index = (global_id.x * args.window_length) + ((args.position + i) % args.window_length);\n let tf_start = args.tf_offset + (((i * args.num_kv_heads) + global_id.x) * args.head_dimension);\n let kv_start = args.kv_offset + ((index * args.head_dimension) / 4);\n let kv_intercepts_start = args.kv_intercepts_offset + index;\n let kv_slopes_start = args.kv_slopes_offset + index;\n \n var xmax = tf[tf_start]; \n var xmin = tf[tf_start]; \n \n for (var j = 1u; j < args.head_dimension; j++) {\n xmax = max(xmax, tf[tf_start + j]);\n xmin = min(xmin, tf[tf_start + j]);\n }\n\n kv_intercepts[kv_intercepts_start] = xmin;\n kv_slopes[kv_slopes_start] = f32(xmax - xmin) / 255.0;\n\n for (var j = 0u; j < args.head_dimension; j++) {\n let kv_idx = kv_start + (j / 4);\n let kv_val = u32(round((tf[tf_start + j] - xmin) / kv_slopes[kv_slopes_start])); \n kv[kv_idx] = insertBits(kv[kv_idx], extractBits(kv_val, 0u, 8u), (j * 8u) % 32u, 8u); \n }\n }\n}\n\n".concat(emptyShader);var loadAttentionUpdateKvShader=function loadAttentionUpdateKvShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention update kv bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention update kv pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention update kv shader module",code:attentionUpdateKvShaderSource});var computePipeline=device.createComputePipeline({label:"attention update kv pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var TRANSPOSE_QUERY_SHADER_NAME="pv_picollm_attention_transpose_query_shader";var attentionTransposeQueryShaderSource="\nstruct argsStruct {\n n: u32,\n num_heads: u32,\n head_dimension: u32,\n tf_offset: u32,\n hf_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar tf: array;\n\n@group(0) @binding(2)\nvar hf: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(local_invocation_id) local_id : vec3\n) {\n\n if (workgroup_id.x >= args.num_heads || workgroup_id.y >= args.n || local_id.x >= args.head_dimension) {\n return;\n }\n \n let tf_idx = args.tf_offset + (workgroup_id.y * args.num_heads * args.head_dimension) + (workgroup_id.x * args.head_dimension) + local_id.x; \n let hf_idx = args.hf_offset + (workgroup_id.x * args.n * args.head_dimension) + (workgroup_id.y * args.head_dimension) + local_id.x; \n hf[hf_idx] = tf[tf_idx];\n}\n\n".concat(emptyShader);var loadAttentionTransposeQueryShader=function loadAttentionTransposeQueryShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"attention transpose query bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"attention transpose query pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"attention transpose query shader module",code:attentionTransposeQueryShaderSource});var computePipeline=device.createComputePipeline({label:"attention transpose query pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var attentionShaders=_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty({},PRECOMPUTE_ENCODING_SHADER_NAME,loadAttentionPrecomputeEncodingShader),ENCODE_ROPE_INTERLEAVED_SHADER_NAME,loadAttentionEncodeRopeInterleavedShader),ENCODE_SHADER_NAME,loadAttentionEncodeShader),DOT_PRODUCT_SHADER_NAME,loadAttentionDotProductShader),SOFTMAX_SHADER_NAME,loadAttentionSoftmaxShader),FIR_SHADER_NAME,loadAttentionFirShader),UPDATE_KV_SHADER_NAME,loadAttentionUpdateKvShader),TRANSPOSE_QUERY_SHADER_NAME,loadAttentionTransposeQueryShader);var SILU_SHADER_NAME="pv_picollm_feed_forward_silu_shader";var feedForwardSiluShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n x[global_id.x] = x[global_id.x] / (1.0 + exp(-x[global_id.x]));\n}\n\n".concat(emptyShader);var loadFeedForwardSiluShader=function loadFeedForwardSiluShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff silu bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff silu pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff silu shader module",code:feedForwardSiluShaderSource});var computePipeline=device.createComputePipeline({label:"ff silu pipline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var GELU_SHADER_NAME="pv_picollm_feed_forward_gelu_shader";var feedForwardGeluShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\nconst a1: f32 = 0.254829592;\nconst a2: f32 = -0.284496736;\nconst a3: f32 = 1.421413741;\nconst a4: f32 = -1.453152027;\nconst a5: f32 = 1.061405429;\nconst p: f32 = 0.3275911;\n\n// A&S formula 7.1.26\nfn erf(x: f32) -> f32 { \n var sign: f32 = 1.0;\n if (x < 0) {\n sign = -1.0;\n }\n var x_abs: f32 = abs(x);\n \n let t: f32 = 1.0 / fma(p, x_abs, 1.0);\n let y: f32 = 1.0 - (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t * exp(-x_abs * x_abs);\n\n return sign * y;\n}\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n x[global_id.x] = 0.5 * x[global_id.x] * (1.0 + erf(x[global_id.x] * 0.7071067811865475));\n}\n\n".concat(emptyShader);var loadFeedForwardGeluShader=function loadFeedForwardGeluShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff gelu bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff gelu pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff gelu shader module",code:feedForwardGeluShaderSource});var computePipeline=device.createComputePipeline({label:"ff gelu pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ALMOST_GELU_SHADER_NAME="pv_picollm_feed_forward_almost_gelu_shader";var feedForwardAlmostGeluShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n x[global_id.x] = 0.5 * x[global_id.x] * (1 + tanh(0.7978845608028654 * (x[global_id.x] + (0.044715f * x[global_id.x] * x[global_id.x] * x[global_id.x]))));\n}\n\n".concat(emptyShader);var loadFeedForwardAlmostGeluShader=function loadFeedForwardAlmostGeluShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff almost gelu bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff almost gelu pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff almost gelu shader module",code:feedForwardAlmostGeluShaderSource});var computePipeline=device.createComputePipeline({label:"ff almost gelu pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var MULTIPLY_BUFFERS_SHADER_NAME="pv_picollm_feed_forward_multiply_buffers_shader";var feedForwardMultiplyBuffersShaderSource="\nstruct argsStruct {\n n: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n y[global_id.x] *= x[global_id.x];\n}\n\n".concat(emptyShader);var loadFeedForwardMultiplyBuffersShader=function loadFeedForwardMultiplyBuffersShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"ff multiply buffers bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"ff multiply buffers pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"ff multiply buffers shader module",code:feedForwardMultiplyBuffersShaderSource});var computePipeline=device.createComputePipeline({label:"ff multiply buffers pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var feedForwardShaders=_defineProperty(_defineProperty(_defineProperty(_defineProperty({},SILU_SHADER_NAME,loadFeedForwardSiluShader),GELU_SHADER_NAME,loadFeedForwardGeluShader),ALMOST_GELU_SHADER_NAME,loadFeedForwardAlmostGeluShader),MULTIPLY_BUFFERS_SHADER_NAME,loadFeedForwardMultiplyBuffersShader);var FORWARD_SHADER_NAME$1="pv_picollm_gate_forward_shader";var gateForwardShaderSource="\n\nstruct pv_picollm_gate_ix_t {\n i: u32,\n x: f32,\n}\n\n@group(0) @binding(0)\nvar y: array;\n\n@group(0) @binding(1)\nvar indices: array;\n\n@group(0) @binding(2)\nvar weights: array;\n\noverride n: u32 = 0;\noverride k: u32 = 0;\noverride num_experts: u32 = 0;\n\noverride y_offset: u32 = 0;\noverride indices_offset: u32 = 0;\noverride weights_offset: u32 = 0;\n\nvar ixs: array;\n \noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(global_invocation_id) global_id : vec3\n) {\n if (global_id.x >= n) {\n return;\n }\n \n var y_start: u32 = y_offset + global_id.x * num_experts;\n for (var j = 0u; j < num_experts; j++) {\n ixs[j].i = j;\n ixs[j].x = y[y_start + j];\n }\n\n for (var i = 0u; i < num_experts - 1; i++) {\n for (var j = 0u; j < num_experts - i - 1; j++) {\n if (ixs[j].x < ixs[j + 1].x) {\n let tmp = ixs[j];\n ixs[j] = ixs[j + 1];\n ixs[j + 1] = tmp;\n }\n }\n }\n\n for (var j = 0u; j < k; j++) {\n indices[indices_offset + (global_id.x * k) + j] = ixs[j].i;\n weights[weights_offset + (global_id.x * k) + j] = ixs[j].x;\n }\n\n var max_weight: f32 = weights[weights_offset + (global_id.x * k)];\n for (var j = 1u; j < k; j++) {\n max_weight = max(max_weight, weights[weights_offset + (global_id.x * k) + j]);\n }\n\n var sum_weight: f32 = 0.0;\n for (var j = 0u; j < k; j++) {\n weights[weights_offset + (global_id.x * k) + j] = exp(weights[weights_offset + (global_id.x * k) + j] - max_weight);\n sum_weight += weights[weights_offset + (global_id.x * k) + j];\n }\n\n for (var j = 0u; j < k; j++) {\n weights[weights_offset + (global_id.x * k) + j] /= sum_weight;\n }\n}\n\n".concat(emptyShader);var loadGateForwardShader=function loadGateForwardShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"gate forward bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"gate forward pipeline",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"gate forward shader module",code:gateForwardShaderSource});var computePipeline=device.createComputePipeline({layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{num_experts:1}}});return{computePipeline:computePipeline,pipelineLayout:pipelineLayout,shaderModule:shaderModule}};var gateForwardShader=_defineProperty({},FORWARD_SHADER_NAME$1,loadGateForwardShader);var ADD_TO_BUFFER_SHADER_NAME$1="pv_picollm_moe_transformer_add_to_buffer_shader";var moeTransformerAddToBufferShaderSource="\nstruct argsStruct {\n n: u32, \n x_offset: u32,\n buffer_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar buffer: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n\n buffer[args.buffer_offset + global_id.x] += x[args.x_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadMoeTransformerAddToBufferShader=function loadMoeTransformerAddToBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"moe transformer add to buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"moe transformer add to buffer pipeline",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"moe transformer add to buffer shader module",code:moeTransformerAddToBufferShaderSource});var computePipeline=device.createComputePipeline({label:"moe transformer add to buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER_SHADER_NAME="pv_picollm_moe_transformer_multiply_weight_and_add_to_buffer_shader";var moeTransformerMultiplyWeightAndToBufferShaderSource="\nstruct argsStruct {\n n: u32, \n weights_index: u32,\n y_index: u32,\n weights_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weights: array;\n\n@group(0) @binding(2)\nvar x: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n y[args.y_offset + args.y_index + global_id.x] += weights[args.weights_index] + x[args.x_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadMoeTransformerMultiplyWeightAndAddToBufferShader=function loadMoeTransformerMultiplyWeightAndAddToBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"moe transformer multiply weight and add to buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"moe transformer multiply weight and add to buffer pipeline",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"moe transformer multiply weight and add to buffer shader module",code:moeTransformerMultiplyWeightAndToBufferShaderSource});var computePipeline=device.createComputePipeline({label:"moe transformer multiply weight and add to buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var ADD_BUFFERS_SHADER_NAME$1="pv_picollm_moe_transformer_add_buffers_shader";var moeTransformerAddBuffersShaderSource="\nstruct argsStruct {\n n: u32, \n buffer1_offset: u32,\n buffer2_offset: u32,\n y_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar buffer1: array;\n\n@group(0) @binding(2)\nvar buffer2: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n y[args.y_offset + global_id.x] = buffer1[args.buffer1_offset + global_id.x] + buffer2[args.buffer2_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadMoeTransformerAddBuffersShader=function loadMoeTransformerAddBuffersShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"moe transformer add buffers bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"moe transformer add buffers pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"moe transformer add buffers shader module",code:moeTransformerAddBuffersShaderSource});var computePipeline=device.createComputePipeline({label:"moe transformer add buffers pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var moeTransformerForwardShaders=_defineProperty(_defineProperty(_defineProperty({},ADD_TO_BUFFER_SHADER_NAME$1,loadMoeTransformerAddToBufferShader),MULTIPLY_WEIGHT_AND_ADD_TO_BUFFER_SHADER_NAME,loadMoeTransformerMultiplyWeightAndAddToBufferShader),ADD_BUFFERS_SHADER_NAME$1,loadMoeTransformerAddBuffersShader);var sdataReduce="\n for (var s: u32 = workgroup_size_x / 2; s > 0; s >>= 1) {\n if tid < s {\n sdata[tid] += sdata[tid + s];\n }\n workgroupBarrier();\n }\n";var dividePadFunction="\n fn divide_pad(a: u32, b: u32) -> u32 { \n return (a + b - 1) / b;\n }\n";var FORWARD_MULTI_BUFFER_SHADER_NAME$1="pv_picollm_norm_forward_multi_buffer_shader";var FORWARD_SINGLE_BUFFER_SHADER_NAME$1="pv_picollm_norm_forward_single_buffer_shader";var normForwardShaderSource=function normForwardShaderSource(isMulti){return"\nstruct argsStruct {\n n: u32,\n dimension: u32,\n remainder: u32,\n remainder_start: u32, \n eps: f32, \n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weight: array;\n\n".concat(isMulti?"\n@group(0) @binding(2)\nvar x: array;\n\n@group(0) @binding(3) \nvar y: array;\n":" \n@group(0) @binding(2)\nvar x: array;\n","\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\nvar sdata: array, workgroup_size_x>;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3\n) {\n let tid = local_id.x;\n let m = workgroup_id.x;\n let block_size = workgroup_size_x;\n \n var power_vec: vec4;\n let x_start: u32 = args.x_offset + (m * args.dimension);\n let skip = tid * 4;\n let shift = (block_size * 4);\n for (var j = 0u; j + skip < args.remainder_start; j += shift) {\n let local_index = x_start + j + skip; \n\n let x_vec = vec4(\n x[local_index],\n x[local_index + 1],\n x[local_index + 2],\n x[local_index + 3]);\n \n power_vec += x_vec * x_vec; \n } \n \n if (tid == 0 && args.remainder > 0) {\n var remainder_vec = vec4(0.0, 0.0, 0.0, 0.0);\n let x_idx = x_start + args.remainder_start;\n for (var j = 0u; j < args.remainder; j++) { \n remainder_vec[j] = x[x_idx + j];\n } \n power_vec += remainder_vec * remainder_vec;\n }\n \n sdata[tid] = power_vec;\n workgroupBarrier();\n\n ").concat(sdataReduce,"\n \n let power = sdata[0].x + sdata[0].y + sdata[0].z + sdata[0].w;\n let norm: vec4 = vec4(1.0 / sqrt((power / f32(args.dimension)) + args.eps));\n \n let y_start: u32 = args.y_offset + (m * args.dimension);\n for (var j = 0u; j + skip < args.remainder_start; j += shift) {\n let local_index = j + skip;\n let x_idx = x_start + local_index;\n let x_vec = vec4(\n x[x_idx],\n x[x_idx + 1],\n x[x_idx + 2],\n x[x_idx + 3]);\n \n let weight_vec = vec4(\n weight[local_index],\n weight[local_index + 1],\n weight[local_index + 2],\n weight[local_index + 3]);\n let y_vec = x_vec * norm * weight_vec;\n \n let y_idx = y_start + local_index;\n").concat(isMulti?" \n y[y_idx] = y_vec.x;\n y[y_idx + 1] = y_vec.y;\n y[y_idx + 2] = y_vec.z;\n y[y_idx + 3] = y_vec.w;\n":" \n x[y_idx] = y_vec.x;\n x[y_idx + 1] = y_vec.y;\n x[y_idx + 2] = y_vec.z;\n x[y_idx + 3] = y_vec.w;\n"," \n }\n \n if (tid == 0 && args.remainder > 0) {\n let x_idx = x_start + args.remainder_start;\n let weight_idx = args.remainder_start; \n let y_idx = y_start + args.remainder_start;\n for (var j = 0u; j < args.remainder; j++) {\n").concat(isMulti?" \n y[y_idx + j] = x[x_idx + j] * norm[j] * weight[weight_idx + j];\n":" \n x[y_idx + j] = x[x_idx + j] * norm[j] * weight[weight_idx + j];\n"," \n } \n }\n}\n\n").concat(emptyShader)};var loadNormForwardShader=function loadNormForwardShader(device,isMulti){var entries=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}}];if(isMulti){entries.push({binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}});entries.push({binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}})}else{entries.push({binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}})}var bindGroupLayout=device.createBindGroupLayout({label:"norm forward ".concat(isMulti?"multi":"single"," buffer bind group layout"),entries:entries});var pipelineLayout=device.createPipelineLayout({label:"norm forward ".concat(isMulti?"multi":"single"," buffer pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"norm forward ".concat(isMulti?"multi":"single"," buffer shader module"),code:normForwardShaderSource(isMulti)});var computePipeline=device.createComputePipeline({label:"norm forward ".concat(isMulti?"multi":"single"," buffer pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var normForwardShader=_defineProperty(_defineProperty({},FORWARD_SINGLE_BUFFER_SHADER_NAME$1,function(device){return loadNormForwardShader(device,false)}),FORWARD_MULTI_BUFFER_SHADER_NAME$1,function(device){return loadNormForwardShader(device,true)});var FORWARD_MULTI_BUFFER_SHADER_NAME="pv_picollm_norm_layer_forward_multi_buffer_shader";var normLayerForwardMultiBufferShaderSource="\nstruct argsStruct {\n n: u32,\n dimension: u32,\n eps: f32,\n weight_offset: u32,\n bias_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weight: array;\n\n@group(0) @binding(2)\nvar bias: array;\n\n@group(0) @binding(3)\nvar x: array;\n\n@group(0) @binding(4)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n let x_start: u32 = args.x_offset + (global_id.x * args.dimension);\n\n var mean: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean += x[x_start + j];\n }\n mean /= f32(args.dimension);\n\n var mean2: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean2 += (x[x_start + j] - mean) * (x[x_start + j] - mean);\n }\n mean2 /= f32(args.dimension);\n\n var norm: f32 = 1.0 / sqrt(mean2 + args.eps);\n\n var y_start = args.y_offset + (global_id.x * args.dimension);\n for (var j = 0u; j < args.dimension; j++) {\n y[y_start + j] = ((x[x_start + j] - mean) * norm * weight[args.weight_offset + j]) + bias[args.bias_offset + j];\n }\n}\n\n".concat(emptyShader);var loadNormLayerForwardMultiBufferShader=function loadNormLayerForwardMultiBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"norm layer forward multi buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"norm layer forward multi buffer pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"norm layer forward multi buffer shader module",code:normLayerForwardMultiBufferShaderSource});var computePipeline=device.createComputePipeline({label:"norm layer forward multi buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var FORWARD_SINGLE_BUFFER_SHADER_NAME="pv_picollm_norm_layer_forward_single_buffer_shader";var normLayerForwardSingleBufferShaderSource="\nstruct argsStruct {\n n: u32,\n dimension: u32,\n eps: f32,\n weight_offset: u32,\n bias_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar weight: array;\n\n@group(0) @binding(2)\nvar bias: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n let x_start: u32 = args.x_offset + (global_id.x * args.dimension);\n\n var mean: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean += y[x_start + j];\n }\n mean /= f32(args.dimension);\n\n var mean2: f32 = 0.0;\n for (var j = 0u; j < args.dimension; j++) {\n mean2 += (y[x_start + j] - mean) * (y[x_start + j] - mean);\n }\n mean2 /= f32(args.dimension);\n\n var norm: f32 = 1.0 / sqrt(mean2 + args.eps);\n\n var y_start = args.y_offset + (global_id.x * args.dimension);\n for (var j = 0u; j < args.dimension; j++) {\n y[y_start + j] = ((y[x_start + j] - mean) * norm * weight[args.weight_offset + j]) + bias[args.bias_offset + j];\n }\n}\n\n".concat(emptyShader);var loadNormLayerForwardSingleBufferShader=function loadNormLayerForwardSingleBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"norm layer forward single buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"norm layer forward single buffer pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"norm layer forward single buffer shader module",code:normLayerForwardSingleBufferShaderSource});var computePipeline=device.createComputePipeline({label:"norm layer forward single buffer pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var normLayerForwardShader=_defineProperty(_defineProperty({},FORWARD_SINGLE_BUFFER_SHADER_NAME,loadNormLayerForwardSingleBufferShader),FORWARD_MULTI_BUFFER_SHADER_NAME,loadNormLayerForwardMultiBufferShader);var ADD_TO_BUFFER_SHADER_NAME="pv_picollm_transformer_add_to_buffer_shader";var transformerAddToBufferShaderSource="\nstruct argsStruct {\n n: u32,\n x_offset: u32,\n buffer_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar buffer: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n buffer[args.buffer_offset + global_id.x] += x[args.x_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadTransformerAddToBufferShader=function loadTransformerAddToBufferShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"transformer add to buffer bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"transformer add to buffer pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"transformer add to buffer shader module",code:transformerAddToBufferShaderSource});var computePipeline=device.createComputePipeline({label:"transformer add to buffer compute",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var ADD_BUFFERS_SHADER_NAME="pv_picollm_transformer_add_buffers_shader";var transformerAddBuffersShaderSource="\n\nstruct argsStruct {\n n: u32,\n buffer1_offset: u32,\n buffer2_offset: u32,\n y_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar buffer1: array;\n\n@group(0) @binding(2)\nvar buffer2: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n) {\n return;\n }\n \n y[args.y_offset + global_id.x] = buffer1[args.buffer1_offset + global_id.x] + buffer2[args.buffer2_offset + global_id.x]; \n}\n\n".concat(emptyShader);var loadTransformerAddBuffersShader=function loadTransformerAddBuffersShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"transformer add buffers bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"transformer add buffers pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"transformer add buffers shader module",code:transformerAddBuffersShaderSource});var computePipeline=device.createComputePipeline({label:"transformer add buffers pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var transformerForwardShaders=_defineProperty(_defineProperty({},ADD_TO_BUFFER_SHADER_NAME,loadTransformerAddToBufferShader),ADD_BUFFERS_SHADER_NAME,loadTransformerAddBuffersShader);var FORWARD_SHADER_NAME="pv_picollm_weight_float_forward_shader";var weightFloatForwardShaderSource="\n\nstruct argsStruct {\n nr: u32,\n nc: u32,\n w_offset: u32,\n x_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar w: array;\n\n@group(0) @binding(2)\nvar x: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(workgroup_id) workgroup_id : vec3,\n @builtin(local_invocation_id) local_id : vec3\n) {\n if (local_id.x >= args.nr) {\n return;\n }\n let x_start: u32 = args.x_offset + (workgroup_id.x * args.nc);\n let y_idx: u32 = local_id.x + args.y_offset + (workgroup_id.x * args.nr);\n \n let w_start: u32 = args.w_offset + (local_id.x * args.nc);\n for (var j = 0u; j < args.nc; j++) {\n y[y_idx] += w[w_start + j] * x[x_start + j]; \n }\n}\n\n".concat(emptyShader);var loadWeightFloatForwardShader=function loadWeightFloatForwardShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight float forward bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight float forward pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight float forward shader module",code:weightFloatForwardShaderSource});var computePipeline=device.createComputePipeline({label:"weight float forward pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var weightFloatForwardShader=_defineProperty({},FORWARD_SHADER_NAME,loadWeightFloatForwardShader);var rowsPerBlock=16;var columnsPerBlock=8;var preprocessDim=16;var weightBlockSize=256;var unpackBlock128BitDepth3="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_3(packed_offset: u32) {\n let val_0 = blocks[packed_offset]; \n unpacked[0] = extractBits(val_0, 0u, 3u);\n unpacked[1] = extractBits(val_0, 3u, 3u);\n unpacked[2] = extractBits(val_0, 6u, 3u);\n unpacked[3] = extractBits(val_0, 9u, 3u);\n unpacked[4] = extractBits(val_0, 12u, 3u);\n unpacked[5] = extractBits(val_0, 15u, 3u);\n unpacked[6] = extractBits(val_0, 18u, 3u);\n unpacked[7] = extractBits(val_0, 21u, 3u);\n unpacked[8] = extractBits(val_0, 24u, 3u);\n unpacked[9] = extractBits(val_0, 27u, 3u);\n unpacked[10] = extractBits(val_0, 30u, 2u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[10] = insertBits(unpacked[10], extractBits(val_1, 0u, 1u), 2u, 1u);\n unpacked[11] = extractBits(val_1, 1u, 3u);\n unpacked[12] = extractBits(val_1, 4u, 3u);\n unpacked[13] = extractBits(val_1, 7u, 3u);\n unpacked[14] = extractBits(val_1, 10u, 3u);\n unpacked[15] = extractBits(val_1, 13u, 3u);\n unpacked[16] = extractBits(val_1, 16u, 3u);\n unpacked[17] = extractBits(val_1, 19u, 3u);\n unpacked[18] = extractBits(val_1, 22u, 3u);\n unpacked[19] = extractBits(val_1, 25u, 3u);\n unpacked[20] = extractBits(val_1, 28u, 3u);\n unpacked[21] = extractBits(val_1, 31u, 1u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[21] = insertBits(unpacked[21], extractBits(val_2, 0u, 2u), 1u, 2u); \n unpacked[22] = extractBits(val_2, 2u, 3u);\n unpacked[23] = extractBits(val_2, 5u, 3u);\n unpacked[24] = extractBits(val_2, 8u, 3u);\n unpacked[25] = extractBits(val_2, 11u, 3u);\n unpacked[26] = extractBits(val_2, 14u, 3u);\n unpacked[27] = extractBits(val_2, 17u, 3u);\n unpacked[28] = extractBits(val_2, 20u, 3u);\n unpacked[29] = extractBits(val_2, 23u, 3u);\n unpacked[30] = extractBits(val_2, 26u, 3u);\n unpacked[31] = extractBits(val_2, 29u, 3u);\n \n let val_3 = blocks[packed_offset + 3]; \n unpacked[32] = extractBits(val_3, 0u, 3u);\n unpacked[33] = extractBits(val_3, 3u, 3u);\n unpacked[34] = extractBits(val_3, 6u, 3u);\n unpacked[35] = extractBits(val_3, 9u, 3u);\n unpacked[36] = extractBits(val_3, 12u, 3u);\n unpacked[37] = extractBits(val_3, 15u, 3u);\n unpacked[38] = extractBits(val_3, 18u, 3u);\n unpacked[39] = extractBits(val_3, 21u, 3u);\n unpacked[40] = extractBits(val_3, 24u, 3u);\n unpacked[41] = extractBits(val_3, 27u, 3u);\n unpacked[42] = extractBits(val_3, 30u, 2u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[42] = insertBits(unpacked[42], extractBits(val_4, 0u, 1u), 2u, 1u);\n unpacked[43] = extractBits(val_4, 1u, 3u);\n unpacked[44] = extractBits(val_4, 4u, 3u);\n unpacked[45] = extractBits(val_4, 7u, 3u);\n unpacked[46] = extractBits(val_4, 10u, 3u);\n unpacked[47] = extractBits(val_4, 13u, 3u);\n unpacked[48] = extractBits(val_4, 16u, 3u);\n unpacked[49] = extractBits(val_4, 19u, 3u);\n unpacked[50] = extractBits(val_4, 22u, 3u);\n unpacked[51] = extractBits(val_4, 25u, 3u);\n unpacked[52] = extractBits(val_4, 28u, 3u);\n unpacked[53] = extractBits(val_4, 31u, 1u);\n \n let val_5 = blocks[packed_offset + 5];\n unpacked[53] = insertBits(unpacked[53], extractBits(val_5, 0u, 2u), 1u, 2u); \n unpacked[54] = extractBits(val_5, 2u, 3u);\n unpacked[55] = extractBits(val_5, 5u, 3u);\n unpacked[56] = extractBits(val_5, 8u, 3u);\n unpacked[57] = extractBits(val_5, 11u, 3u);\n unpacked[58] = extractBits(val_5, 14u, 3u);\n unpacked[59] = extractBits(val_5, 17u, 3u);\n unpacked[60] = extractBits(val_5, 20u, 3u);\n unpacked[61] = extractBits(val_5, 23u, 3u);\n unpacked[62] = extractBits(val_5, 26u, 3u);\n unpacked[63] = extractBits(val_5, 29u, 3u);\n \n let val_6 = blocks[packed_offset + 6];\n unpacked[64] = extractBits(val_6, 0u, 3u);\n unpacked[65] = extractBits(val_6, 3u, 3u);\n unpacked[66] = extractBits(val_6, 6u, 3u);\n unpacked[67] = extractBits(val_6, 9u, 3u);\n unpacked[68] = extractBits(val_6, 12u, 3u);\n unpacked[69] = extractBits(val_6, 15u, 3u);\n unpacked[70] = extractBits(val_6, 18u, 3u);\n unpacked[71] = extractBits(val_6, 21u, 3u);\n unpacked[72] = extractBits(val_6, 24u, 3u);\n unpacked[73] = extractBits(val_6, 27u, 3u);\n unpacked[74] = extractBits(val_6, 30u, 2u);\n \n let val_7 = blocks[packed_offset + 7];\n unpacked[74] = insertBits(unpacked[74], extractBits(val_7, 0u, 1u), 2u, 1u);\n unpacked[75] = extractBits(val_7, 1u, 3u);\n unpacked[76] = extractBits(val_7, 4u, 3u);\n unpacked[77] = extractBits(val_7, 7u, 3u);\n unpacked[78] = extractBits(val_7, 10u, 3u);\n unpacked[79] = extractBits(val_7, 13u, 3u);\n unpacked[80] = extractBits(val_7, 16u, 3u);\n unpacked[81] = extractBits(val_7, 19u, 3u);\n unpacked[82] = extractBits(val_7, 22u, 3u);\n unpacked[83] = extractBits(val_7, 25u, 3u);\n unpacked[84] = extractBits(val_7, 28u, 3u);\n unpacked[85] = extractBits(val_7, 31u, 1u);\n \n let val_8 = blocks[packed_offset + 8];\n unpacked[85] = insertBits(unpacked[85], extractBits(val_8, 0u, 2u), 1u, 2u); \n unpacked[86] = extractBits(val_8, 2u, 3u);\n unpacked[87] = extractBits(val_8, 5u, 3u);\n unpacked[88] = extractBits(val_8, 8u, 3u);\n unpacked[89] = extractBits(val_8, 11u, 3u);\n unpacked[90] = extractBits(val_8, 14u, 3u);\n unpacked[91] = extractBits(val_8, 17u, 3u);\n unpacked[92] = extractBits(val_8, 20u, 3u);\n unpacked[93] = extractBits(val_8, 23u, 3u);\n unpacked[94] = extractBits(val_8, 26u, 3u);\n unpacked[95] = extractBits(val_8, 29u, 3u);\n \n let val_9 = blocks[packed_offset + 9];\n unpacked[96] = extractBits(val_9, 0u, 3u);\n unpacked[97] = extractBits(val_9, 3u, 3u);\n unpacked[98] = extractBits(val_9, 6u, 3u);\n unpacked[99] = extractBits(val_9, 9u, 3u);\n unpacked[100] = extractBits(val_9, 12u, 3u);\n unpacked[101] = extractBits(val_9, 15u, 3u);\n unpacked[102] = extractBits(val_9, 18u, 3u);\n unpacked[103] = extractBits(val_9, 21u, 3u);\n unpacked[104] = extractBits(val_9, 24u, 3u);\n unpacked[105] = extractBits(val_9, 27u, 3u);\n unpacked[106] = extractBits(val_9, 30u, 2u);\n \n let val_10 = blocks[packed_offset + 10];\n unpacked[106] = insertBits(unpacked[106], extractBits(val_10, 0u, 1u), 2u, 1u);\n unpacked[107] = extractBits(val_10, 1u, 3u);\n unpacked[108] = extractBits(val_10, 4u, 3u);\n unpacked[109] = extractBits(val_10, 7u, 3u);\n unpacked[110] = extractBits(val_10, 10u, 3u);\n unpacked[111] = extractBits(val_10, 13u, 3u);\n unpacked[112] = extractBits(val_10, 16u, 3u);\n unpacked[113] = extractBits(val_10, 19u, 3u);\n unpacked[114] = extractBits(val_10, 22u, 3u);\n unpacked[115] = extractBits(val_10, 25u, 3u);\n unpacked[116] = extractBits(val_10, 28u, 3u);\n unpacked[117] = extractBits(val_10, 31u, 1u);\n \n let val_11 = blocks[packed_offset + 11];\n unpacked[117] = insertBits(unpacked[117], extractBits(val_11, 0u, 2u), 1u, 2u); \n unpacked[118] = extractBits(val_11, 2u, 3u);\n unpacked[119] = extractBits(val_11, 5u, 3u);\n unpacked[120] = extractBits(val_11, 8u, 3u);\n unpacked[121] = extractBits(val_11, 11u, 3u);\n unpacked[122] = extractBits(val_11, 14u, 3u);\n unpacked[123] = extractBits(val_11, 17u, 3u);\n unpacked[124] = extractBits(val_11, 20u, 3u);\n unpacked[125] = extractBits(val_11, 23u, 3u);\n unpacked[126] = extractBits(val_11, 26u, 3u);\n unpacked[127] = extractBits(val_11, 29u, 3u);\n}\n";var unpackBlock128BitDepth5="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_5(packed_offset: u32) { \n let val_0 = blocks[packed_offset];\n unpacked[0] = extractBits(val_0, 0u, 5u);\n unpacked[1] = extractBits(val_0, 5u, 5u);\n unpacked[2] = extractBits(val_0, 10u, 5u);\n unpacked[3] = extractBits(val_0, 15u, 5u);\n unpacked[4] = extractBits(val_0, 20u, 5u);\n unpacked[5] = extractBits(val_0, 25u, 5u);\n unpacked[6] = extractBits(val_0, 30u, 2u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[6] = insertBits(unpacked[6], extractBits(val_1, 0u, 3u), 2u, 3u); \n unpacked[7] = extractBits(val_1, 3u, 5u);\n unpacked[8] = extractBits(val_1, 8u, 5u);\n unpacked[9] = extractBits(val_1, 13u, 5u);\n unpacked[10] = extractBits(val_1, 18u, 5u);\n unpacked[11] = extractBits(val_1, 23u, 5u);\n unpacked[12] = extractBits(val_1, 28u, 4u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[12] = insertBits(unpacked[12], extractBits(val_2, 0u, 1u), 4u, 1u);\n unpacked[13] = extractBits(val_2, 1u, 5u);\n unpacked[14] = extractBits(val_2, 6u, 5u);\n unpacked[15] = extractBits(val_2, 11u, 5u);\n unpacked[16] = extractBits(val_2, 16u, 5u);\n unpacked[17] = extractBits(val_2, 21u, 5u);\n unpacked[18] = extractBits(val_2, 26u, 5u);\n unpacked[19] = extractBits(val_2, 31u, 1u);\n \n let val_3 = blocks[packed_offset + 3];\n unpacked[19] = insertBits(unpacked[19], extractBits(val_3, 0u, 4u), 1u, 4u);\n unpacked[20] = extractBits(val_3, 4u, 5u);\n unpacked[21] = extractBits(val_3, 9u, 5u);\n unpacked[22] = extractBits(val_3, 14u, 5u);\n unpacked[23] = extractBits(val_3, 19u, 5u);\n unpacked[24] = extractBits(val_3, 24u, 5u);\n unpacked[25] = extractBits(val_3, 29u, 3u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[25] = insertBits(unpacked[25], extractBits(val_4, 0u, 2u), 3u, 2u);\n unpacked[26] = extractBits(val_4, 2u, 5u);\n unpacked[27] = extractBits(val_4, 7u, 5u);\n unpacked[28] = extractBits(val_4, 12u, 5u);\n unpacked[29] = extractBits(val_4, 17u, 5u);\n unpacked[30] = extractBits(val_4, 22u, 5u);\n unpacked[31] = extractBits(val_4, 27u, 5u);\n \n let val_5 = blocks[packed_offset + 5];\n unpacked[32] = extractBits(val_5, 0u, 5u);\n unpacked[33] = extractBits(val_5, 5u, 5u);\n unpacked[34] = extractBits(val_5, 10u, 5u);\n unpacked[35] = extractBits(val_5, 15u, 5u);\n unpacked[36] = extractBits(val_5, 20u, 5u);\n unpacked[37] = extractBits(val_5, 25u, 5u);\n unpacked[38] = extractBits(val_5, 30u, 2u);\n\n let val_6 = blocks[packed_offset + 6];\n unpacked[38] = insertBits(unpacked[38], extractBits(val_6, 0u, 3u), 2u, 3u);\n unpacked[39] = extractBits(val_6, 3u, 5u);\n unpacked[40] = extractBits(val_6, 8u, 5u);\n unpacked[41] = extractBits(val_6, 13u, 5u);\n unpacked[42] = extractBits(val_6, 18u, 5u);\n unpacked[43] = extractBits(val_6, 23u, 5u);\n unpacked[44] = extractBits(val_6, 28u, 4u);\n\n let val_7 = blocks[packed_offset + 7];\n unpacked[44] = insertBits(unpacked[44], extractBits(val_7, 0u, 1u), 4u, 1u);\n unpacked[45] = extractBits(val_7, 1u, 5u);\n unpacked[46] = extractBits(val_7, 6u, 5u);\n unpacked[47] = extractBits(val_7, 11u, 5u);\n unpacked[48] = extractBits(val_7, 16u, 5u);\n unpacked[49] = extractBits(val_7, 21u, 5u);\n unpacked[50] = extractBits(val_7, 26u, 5u);\n unpacked[51] = extractBits(val_7, 31u, 1u);\n\n let val_8 = blocks[packed_offset + 8];\n unpacked[51] = insertBits(unpacked[51], extractBits(val_8, 0u, 4u), 1u, 4u);\n unpacked[52] = extractBits(val_8, 4u, 5u);\n unpacked[53] = extractBits(val_8, 9u, 5u);\n unpacked[54] = extractBits(val_8, 14u, 5u);\n unpacked[55] = extractBits(val_8, 19u, 5u);\n unpacked[56] = extractBits(val_8, 24u, 5u);\n unpacked[57] = extractBits(val_8, 29u, 3u);\n \n let val_9 = blocks[packed_offset + 9];\n unpacked[57] = insertBits(unpacked[57], extractBits(val_9, 0u, 2u), 3u, 2u);\n unpacked[58] = extractBits(val_9, 2u, 5u);\n unpacked[59] = extractBits(val_9, 7u, 5u);\n unpacked[60] = extractBits(val_9, 12u, 5u);\n unpacked[61] = extractBits(val_9, 17u, 5u);\n unpacked[62] = extractBits(val_9, 22u, 5u);\n unpacked[63] = extractBits(val_9, 27u, 5u);\n \n let val_10 = blocks[packed_offset + 10];\n unpacked[64] = extractBits(val_10, 0u, 5u);\n unpacked[65] = extractBits(val_10, 5u, 5u);\n unpacked[66] = extractBits(val_10, 10u, 5u);\n unpacked[67] = extractBits(val_10, 15u, 5u);\n unpacked[68] = extractBits(val_10, 20u, 5u);\n unpacked[69] = extractBits(val_10, 25u, 5u);\n unpacked[70] = extractBits(val_10, 30u, 2u);\n\n let val_11 = blocks[packed_offset + 11];\n unpacked[70] = insertBits(unpacked[70], extractBits(val_11, 0u, 3u), 2u, 3u);\n unpacked[71] = extractBits(val_11, 3u, 5u);\n unpacked[72] = extractBits(val_11, 8u, 5u);\n unpacked[73] = extractBits(val_11, 13u, 5u);\n unpacked[74] = extractBits(val_11, 18u, 5u);\n unpacked[75] = extractBits(val_11, 23u, 5u);\n unpacked[76] = extractBits(val_11, 28u, 4u);\n\n let val_12 = blocks[packed_offset + 12];\n unpacked[76] = insertBits(unpacked[76], extractBits(val_12, 0u, 1u), 4u, 1u);\n unpacked[77] = extractBits(val_12, 1u, 5u);\n unpacked[78] = extractBits(val_12, 6u, 5u);\n unpacked[79] = extractBits(val_12, 11u, 5u);\n unpacked[80] = extractBits(val_12, 16u, 5u);\n unpacked[81] = extractBits(val_12, 21u, 5u);\n unpacked[82] = extractBits(val_12, 26u, 5u);\n unpacked[83] = extractBits(val_12, 31u, 1u);\n\n let val_13 = blocks[packed_offset + 13];\n unpacked[83] = insertBits(unpacked[83], extractBits(val_13, 0u, 4u), 1u, 4u);\n unpacked[84] = extractBits(val_13, 4u, 5u);\n unpacked[85] = extractBits(val_13, 9u, 5u);\n unpacked[86] = extractBits(val_13, 14u, 5u);\n unpacked[87] = extractBits(val_13, 19u, 5u);\n unpacked[88] = extractBits(val_13, 24u, 5u);\n unpacked[89] = extractBits(val_13, 29u, 3u);\n \n let val_14 = blocks[packed_offset + 14];\n unpacked[89] = insertBits(unpacked[89], extractBits(val_14, 0u, 2u), 3u, 2u);\n unpacked[90] = extractBits(val_14, 2u, 5u);\n unpacked[91] = extractBits(val_14, 7u, 5u);\n unpacked[92] = extractBits(val_14, 12u, 5u);\n unpacked[93] = extractBits(val_14, 17u, 5u);\n unpacked[94] = extractBits(val_14, 22u, 5u);\n unpacked[95] = extractBits(val_14, 27u, 5u);\n\n let val_15 = blocks[packed_offset + 15];\n unpacked[96] = extractBits(val_15, 0u, 5u);\n unpacked[97] = extractBits(val_15, 5u, 5u);\n unpacked[98] = extractBits(val_15, 10u, 5u);\n unpacked[99] = extractBits(val_15, 15u, 5u);\n unpacked[100] = extractBits(val_15, 20u, 5u);\n unpacked[101] = extractBits(val_15, 25u, 5u);\n unpacked[102] = extractBits(val_15, 30u, 2u);\n\n let val_16 = blocks[packed_offset + 16];\n unpacked[102] = insertBits(unpacked[102], extractBits(val_16, 0u, 3u), 2u, 3u);\n unpacked[103] = extractBits(val_16, 3u, 5u);\n unpacked[104] = extractBits(val_16, 8u, 5u);\n unpacked[105] = extractBits(val_16, 13u, 5u);\n unpacked[106] = extractBits(val_16, 18u, 5u);\n unpacked[107] = extractBits(val_16, 23u, 5u);\n unpacked[108] = extractBits(val_16, 28u, 4u);\n\n let val_17 = blocks[packed_offset + 17];\n unpacked[108] = insertBits(unpacked[108], extractBits(val_17, 0u, 1u), 4u, 1u);\n unpacked[109] = extractBits(val_17, 1u, 5u);\n unpacked[110] = extractBits(val_17, 6u, 5u);\n unpacked[111] = extractBits(val_17, 11u, 5u);\n unpacked[112] = extractBits(val_17, 16u, 5u);\n unpacked[113] = extractBits(val_17, 21u, 5u);\n unpacked[114] = extractBits(val_17, 26u, 5u);\n unpacked[115] = extractBits(val_17, 31u, 1u);\n \n let val_18 = blocks[packed_offset + 18];\n unpacked[115] = insertBits(unpacked[115], extractBits(val_18, 0u, 4u), 1u, 4u);\n unpacked[116] = extractBits(val_18, 4u, 5u);\n unpacked[117] = extractBits(val_18, 9u, 5u);\n unpacked[118] = extractBits(val_18, 14u, 5u);\n unpacked[119] = extractBits(val_18, 19u, 5u);\n unpacked[120] = extractBits(val_18, 24u, 5u);\n unpacked[121] = extractBits(val_18, 29u, 3u);\n\n let val_19 = blocks[packed_offset + 19];\n unpacked[121] = insertBits(unpacked[121], extractBits(val_19, 0u, 2u), 3u, 2u);\n unpacked[122] = extractBits(val_19, 2u, 5u);\n unpacked[123] = extractBits(val_19, 7u, 5u);\n unpacked[124] = extractBits(val_19, 12u, 5u);\n unpacked[125] = extractBits(val_19, 17u, 5u);\n unpacked[126] = extractBits(val_19, 22u, 5u);\n unpacked[127] = extractBits(val_19, 27u, 5u);\n}\n";var unpackBlock128BitDepth6="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_6(packed_offset: u32) {\n let val_0 = blocks[packed_offset];\n unpacked[0] = extractBits(val_0, 0u, 6u);\n unpacked[1] = extractBits(val_0, 6u, 6u);\n unpacked[2] = extractBits(val_0, 12u, 6u);\n unpacked[3] = extractBits(val_0, 18u, 6u);\n unpacked[4] = extractBits(val_0, 24u, 6u);\n unpacked[5] = extractBits(val_0, 30u, 2u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[5] = insertBits(unpacked[5], extractBits(val_1, 0u, 4u), 2u, 4u);\n unpacked[6] = extractBits(val_1, 4u, 6u);\n unpacked[7] = extractBits(val_1, 10u, 6u);\n unpacked[8] = extractBits(val_1, 16u, 6u);\n unpacked[9] = extractBits(val_1, 22u, 6u);\n unpacked[10] = extractBits(val_1, 28u, 4u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[10] = insertBits(unpacked[10], extractBits(val_2, 0u, 2u), 4u, 2u);\n unpacked[11] = extractBits(val_2, 2u, 6u);\n unpacked[12] = extractBits(val_2, 8u, 6u);\n unpacked[13] = extractBits(val_2, 14u, 6u);\n unpacked[14] = extractBits(val_2, 20u, 6u);\n unpacked[15] = extractBits(val_2, 26u, 6u);\n \n let val_3 = blocks[packed_offset + 3];\n unpacked[16] = extractBits(val_3, 0u, 6u);\n unpacked[17] = extractBits(val_3, 6u, 6u);\n unpacked[18] = extractBits(val_3, 12u, 6u);\n unpacked[19] = extractBits(val_3, 18u, 6u);\n unpacked[20] = extractBits(val_3, 24u, 6u);\n unpacked[21] = extractBits(val_3, 30u, 2u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[21] = insertBits(unpacked[21], extractBits(val_4, 0u, 4u), 2u, 4u);\n unpacked[22] = extractBits(val_4, 4u, 6u);\n unpacked[23] = extractBits(val_4, 10u, 6u);\n unpacked[24] = extractBits(val_4, 16u, 6u);\n unpacked[25] = extractBits(val_4, 22u, 6u);\n unpacked[26] = extractBits(val_4, 28u, 4u);\n\n let val_5 = blocks[packed_offset + 5];\n unpacked[26] = insertBits(unpacked[26], extractBits(val_5, 0u, 2u), 4u, 2u);\n unpacked[27] = extractBits(val_5, 2u, 6u);\n unpacked[28] = extractBits(val_5, 8u, 6u);\n unpacked[29] = extractBits(val_5, 14u, 6u);\n unpacked[30] = extractBits(val_5, 20u, 6u);\n unpacked[31] = extractBits(val_5, 26u, 6u);\n\n let val_6 = blocks[packed_offset + 6];\n unpacked[32] = extractBits(val_6, 0u, 6u);\n unpacked[33] = extractBits(val_6, 6u, 6u);\n unpacked[34] = extractBits(val_6, 12u, 6u);\n unpacked[35] = extractBits(val_6, 18u, 6u);\n unpacked[36] = extractBits(val_6, 24u, 6u);\n unpacked[37] = extractBits(val_6, 30u, 2u);\n\n let val_7 = blocks[packed_offset + 7];\n unpacked[37] = insertBits(unpacked[37], extractBits(val_7, 0u, 4u), 2u, 4u);\n unpacked[38] = extractBits(val_7, 4u, 6u);\n unpacked[39] = extractBits(val_7, 10u, 6u);\n unpacked[40] = extractBits(val_7, 16u, 6u);\n unpacked[41] = extractBits(val_7, 22u, 6u);\n unpacked[42] = extractBits(val_7, 28u, 4u);\n \n let val_8 = blocks[packed_offset + 8];\n unpacked[42] = insertBits(unpacked[42], extractBits(val_8, 0u, 2u), 4u, 2u);\n unpacked[43] = extractBits(val_8, 2u, 6u);\n unpacked[44] = extractBits(val_8, 8u, 6u);\n unpacked[45] = extractBits(val_8, 14u, 6u);\n unpacked[46] = extractBits(val_8, 20u, 6u);\n unpacked[47] = extractBits(val_8, 26u, 6u);\n\n let val_9 = blocks[packed_offset + 9];\n unpacked[48] = extractBits(val_9, 0u, 6u);\n unpacked[49] = extractBits(val_9, 6u, 6u);\n unpacked[50] = extractBits(val_9, 12u, 6u);\n unpacked[51] = extractBits(val_9, 18u, 6u);\n unpacked[52] = extractBits(val_9, 24u, 6u);\n unpacked[53] = extractBits(val_9, 30u, 2u);\n\n let val_10 = blocks[packed_offset + 10];\n unpacked[53] = insertBits(unpacked[53], extractBits(val_10, 0u, 4u), 2u, 4u);\n unpacked[54] = extractBits(val_10, 4u, 6u);\n unpacked[55] = extractBits(val_10, 10u, 6u);\n unpacked[56] = extractBits(val_10, 16u, 6u);\n unpacked[57] = extractBits(val_10, 22u, 6u);\n unpacked[58] = extractBits(val_10, 28u, 4u);\n\n let val_11 = blocks[packed_offset + 11];\n unpacked[58] = insertBits(unpacked[58], extractBits(val_11, 0u, 2u), 4u, 2u);\n unpacked[59] = extractBits(val_11, 2u, 6u);\n unpacked[60] = extractBits(val_11, 8u, 6u);\n unpacked[61] = extractBits(val_11, 14u, 6u);\n unpacked[62] = extractBits(val_11, 20u, 6u);\n unpacked[63] = extractBits(val_11, 26u, 6u);\n \n let val_12 = blocks[packed_offset + 12];\n unpacked[64] = extractBits(val_12, 0u, 6u);\n unpacked[65] = extractBits(val_12, 6u, 6u);\n unpacked[66] = extractBits(val_12, 12u, 6u);\n unpacked[67] = extractBits(val_12, 18u, 6u);\n unpacked[68] = extractBits(val_12, 24u, 6u);\n unpacked[69] = extractBits(val_12, 30u, 2u);\n\n let val_13 = blocks[packed_offset + 13];\n unpacked[69] = insertBits(unpacked[69], extractBits(val_13, 0u, 4u), 2u, 4u);\n unpacked[70] = extractBits(val_13, 4u, 6u);\n unpacked[71] = extractBits(val_13, 10u, 6u);\n unpacked[72] = extractBits(val_13, 16u, 6u);\n unpacked[73] = extractBits(val_13, 22u, 6u);\n unpacked[74] = extractBits(val_13, 28u, 4u);\n\n let val_14 = blocks[packed_offset + 14];\n unpacked[74] = insertBits(unpacked[74], extractBits(val_14, 0u, 2u), 4u, 2u);\n unpacked[75] = extractBits(val_14, 2u, 6u);\n unpacked[76] = extractBits(val_14, 8u, 6u);\n unpacked[77] = extractBits(val_14, 14u, 6u);\n unpacked[78] = extractBits(val_14, 20u, 6u);\n unpacked[79] = extractBits(val_14, 26u, 6u);\n\n let val_15 = blocks[packed_offset + 15];\n unpacked[80] = extractBits(val_15, 0u, 6u);\n unpacked[81] = extractBits(val_15, 6u, 6u);\n unpacked[82] = extractBits(val_15, 12u, 6u);\n unpacked[83] = extractBits(val_15, 18u, 6u);\n unpacked[84] = extractBits(val_15, 24u, 6u);\n unpacked[85] = extractBits(val_15, 30u, 2u);\n \n let val_16 = blocks[packed_offset + 16];\n unpacked[85] = insertBits(unpacked[85], extractBits(val_16, 0u, 4u), 2u, 4u);\n unpacked[86] = extractBits(val_16, 4u, 6u);\n unpacked[87] = extractBits(val_16, 10u, 6u);\n unpacked[88] = extractBits(val_16, 16u, 6u);\n unpacked[89] = extractBits(val_16, 22u, 6u);\n unpacked[90] = extractBits(val_16, 28u, 4u);\n\n let val_17 = blocks[packed_offset + 17];\n unpacked[90] = insertBits(unpacked[90], extractBits(val_17, 0u, 2u), 4u, 2u);\n unpacked[91] = extractBits(val_17, 2u, 6u);\n unpacked[92] = extractBits(val_17, 8u, 6u);\n unpacked[93] = extractBits(val_17, 14u, 6u);\n unpacked[94] = extractBits(val_17, 20u, 6u);\n unpacked[95] = extractBits(val_17, 26u, 6u);\n\n let val_18 = blocks[packed_offset + 18];\n unpacked[96] = extractBits(val_18, 0u, 6u);\n unpacked[97] = extractBits(val_18, 6u, 6u);\n unpacked[98] = extractBits(val_18, 12u, 6u);\n unpacked[99] = extractBits(val_18, 18u, 6u);\n unpacked[100] = extractBits(val_18, 24u, 6u);\n unpacked[101] = extractBits(val_18, 30u, 2u);\n\n let val_19 = blocks[packed_offset + 19];\n unpacked[101] = insertBits(unpacked[101], extractBits(val_19, 0u, 4u), 2u, 4u);\n unpacked[102] = extractBits(val_19, 4u, 6u);\n unpacked[103] = extractBits(val_19, 10u, 6u);\n unpacked[104] = extractBits(val_19, 16u, 6u);\n unpacked[105] = extractBits(val_19, 22u, 6u);\n unpacked[106] = extractBits(val_19, 28u, 4u);\n \n let val_20 = blocks[packed_offset + 20];\n unpacked[106] = insertBits(unpacked[106], extractBits(val_20, 0u, 2u), 4u, 2u);\n unpacked[107] = extractBits(val_20, 2u, 6u);\n unpacked[108] = extractBits(val_20, 8u, 6u);\n unpacked[109] = extractBits(val_20, 14u, 6u);\n unpacked[110] = extractBits(val_20, 20u, 6u);\n unpacked[111] = extractBits(val_20, 26u, 6u);\n\n let val_21 = blocks[packed_offset + 21];\n unpacked[112] = extractBits(val_21, 0u, 6u);\n unpacked[113] = extractBits(val_21, 6u, 6u);\n unpacked[114] = extractBits(val_21, 12u, 6u);\n unpacked[115] = extractBits(val_21, 18u, 6u);\n unpacked[116] = extractBits(val_21, 24u, 6u);\n unpacked[117] = extractBits(val_21, 30u, 2u);\n\n let val_22 = blocks[packed_offset + 22];\n unpacked[117] = insertBits(unpacked[117], extractBits(val_22, 0u, 4u), 2u, 4u);\n unpacked[118] = extractBits(val_22, 4u, 6u);\n unpacked[119] = extractBits(val_22, 10u, 6u);\n unpacked[120] = extractBits(val_22, 16u, 6u);\n unpacked[121] = extractBits(val_22, 22u, 6u);\n unpacked[122] = extractBits(val_22, 28u, 4u);\n\n let val_23 = blocks[packed_offset + 23];\n unpacked[122] = insertBits(unpacked[122], extractBits(val_23, 0u, 2u), 4u, 2u);\n unpacked[123] = extractBits(val_23, 2u, 6u);\n unpacked[124] = extractBits(val_23, 8u, 6u);\n unpacked[125] = extractBits(val_23, 14u, 6u);\n unpacked[126] = extractBits(val_23, 20u, 6u);\n unpacked[127] = extractBits(val_23, 26u, 6u);\n}\n";var unpackBlock128BitDepth7="\nvar unpacked: array;\n\nfn unpack_block_128_bit_depth_7(packed_offset: u32) {\n let val_0 = blocks[packed_offset];\n unpacked[0] = extractBits(val_0, 0u, 7u);\n unpacked[1] = extractBits(val_0, 7u, 7u);\n unpacked[2] = extractBits(val_0, 14u, 7u);\n unpacked[3] = extractBits(val_0, 21u, 7u);\n unpacked[4] = extractBits(val_0, 28u, 4u);\n \n let val_1 = blocks[packed_offset + 1];\n unpacked[4] = insertBits(unpacked[4], extractBits(val_1, 0u, 3u), 4u, 3u);\n unpacked[5] = extractBits(val_1, 3u, 7u);\n unpacked[6] = extractBits(val_1, 10u, 7u);\n unpacked[7] = extractBits(val_1, 17u, 7u);\n unpacked[8] = extractBits(val_1, 24u, 7u);\n unpacked[9] = extractBits(val_1, 31u, 1u);\n \n let val_2 = blocks[packed_offset + 2];\n unpacked[9] = insertBits(unpacked[9], extractBits(val_2, 0u, 6u), 1u, 6u);\n unpacked[10] = extractBits(val_2, 6u, 7u);\n unpacked[11] = extractBits(val_2, 13u, 7u);\n unpacked[12] = extractBits(val_2, 20u, 7u);\n unpacked[13] = extractBits(val_2, 27u, 5u);\n \n let val_3 = blocks[packed_offset + 3];\n unpacked[13] = insertBits(unpacked[13], extractBits(val_3, 0u, 2u), 5u, 2u);\n unpacked[14] = extractBits(val_3, 2u, 7u);\n unpacked[15] = extractBits(val_3, 9u, 7u);\n unpacked[16] = extractBits(val_3, 16u, 7u);\n unpacked[17] = extractBits(val_3, 23u, 7u);\n unpacked[18] = extractBits(val_3, 30u, 2u);\n \n let val_4 = blocks[packed_offset + 4];\n unpacked[18] = insertBits(unpacked[18], extractBits(val_4, 0u, 5u), 2u, 5u);\n unpacked[19] = extractBits(val_4, 5u, 7u);\n unpacked[20] = extractBits(val_4, 12u, 7u);\n unpacked[21] = extractBits(val_4, 19u, 7u);\n unpacked[22] = extractBits(val_4, 26u, 6u);\n \n let val_5 = blocks[packed_offset + 5];\n unpacked[22] = insertBits(unpacked[22], extractBits(val_5, 0u, 1u), 6u, 1u);\n unpacked[23] = extractBits(val_5, 1u, 7u);\n unpacked[24] = extractBits(val_5, 8u, 7u);\n unpacked[25] = extractBits(val_5, 15u, 7u);\n unpacked[26] = extractBits(val_5, 22u, 7u);\n unpacked[27] = extractBits(val_5, 29u, 3u);\n \n let val_6 = blocks[packed_offset + 6];\n unpacked[27] = insertBits(unpacked[27], extractBits(val_6, 0u, 4u), 3u, 4u);\n unpacked[28] = extractBits(val_6, 4u, 7u);\n unpacked[29] = extractBits(val_6, 11u, 7u);\n unpacked[30] = extractBits(val_6, 18u, 7u);\n unpacked[31] = extractBits(val_6, 25u, 7u);\n \n let val_7 = blocks[packed_offset + 7];\n unpacked[32] = extractBits(val_7, 0u, 7u);\n unpacked[33] = extractBits(val_7, 7u, 7u);\n unpacked[34] = extractBits(val_7, 14u, 7u);\n unpacked[35] = extractBits(val_7, 21u, 7u);\n unpacked[36] = extractBits(val_7, 28u, 4u);\n \n let val_8 = blocks[packed_offset + 8];\n unpacked[36] = insertBits(unpacked[36], extractBits(val_8, 0u, 3u), 4u, 3u);\n unpacked[37] = extractBits(val_8, 3u, 7u);\n unpacked[38] = extractBits(val_8, 10u, 7u);\n unpacked[39] = extractBits(val_8, 17u, 7u);\n unpacked[40] = extractBits(val_8, 24u, 7u);\n unpacked[41] = extractBits(val_8, 31u, 1u);\n \n let val_9 = blocks[packed_offset + 9];\n unpacked[41] = insertBits(unpacked[41], extractBits(val_9, 0u, 6u), 1u, 6u);\n unpacked[42] = extractBits(val_9, 6u, 7u);\n unpacked[43] = extractBits(val_9, 13u, 7u);\n unpacked[44] = extractBits(val_9, 20u, 7u);\n unpacked[45] = extractBits(val_9, 27u, 5u);\n \n let val_10 = blocks[packed_offset + 10];\n unpacked[45] = insertBits(unpacked[45], extractBits(val_10, 0u, 2u), 5u, 2u);\n unpacked[46] = extractBits(val_10, 2u, 7u);\n unpacked[47] = extractBits(val_10, 9u, 7u);\n unpacked[48] = extractBits(val_10, 16u, 7u);\n unpacked[49] = extractBits(val_10, 23u, 7u);\n unpacked[50] = extractBits(val_10, 30u, 2u);\n \n let val_11 = blocks[packed_offset + 11];\n unpacked[50] = insertBits(unpacked[50], extractBits(val_11, 0u, 5u), 2u, 5u);\n unpacked[51] = extractBits(val_11, 5u, 7u);\n unpacked[52] = extractBits(val_11, 12u, 7u);\n unpacked[53] = extractBits(val_11, 19u, 7u);\n unpacked[54] = extractBits(val_11, 26u, 6u);\n \n let val_12 = blocks[packed_offset + 12];\n unpacked[54] = insertBits(unpacked[54], extractBits(val_12, 0u, 1u), 6u, 1u);\n unpacked[55] = extractBits(val_12, 1u, 7u);\n unpacked[56] = extractBits(val_12, 8u, 7u);\n unpacked[57] = extractBits(val_12, 15u, 7u);\n unpacked[58] = extractBits(val_12, 22u, 7u);\n unpacked[59] = extractBits(val_12, 29u, 3u);\n \n let val_13 = blocks[packed_offset + 13];\n unpacked[59] = insertBits(unpacked[59], extractBits(val_13, 0u, 4u), 3u, 4u);\n unpacked[60] = extractBits(val_13, 4u, 7u);\n unpacked[61] = extractBits(val_13, 11u, 7u);\n unpacked[62] = extractBits(val_13, 18u, 7u);\n unpacked[63] = extractBits(val_13, 25u, 7u);\n \n let val_14 = blocks[packed_offset + 14];\n unpacked[64] = extractBits(val_14, 0u, 7u);\n unpacked[65] = extractBits(val_14, 7u, 7u);\n unpacked[66] = extractBits(val_14, 14u, 7u);\n unpacked[67] = extractBits(val_14, 21u, 7u);\n unpacked[68] = extractBits(val_14, 28u, 4u);\n \n let val_15 = blocks[packed_offset + 15];\n unpacked[68] = insertBits(unpacked[68], extractBits(val_15, 0u, 3u), 4u, 3u);\n unpacked[69] = extractBits(val_15, 3u, 7u);\n unpacked[70] = extractBits(val_15, 10u, 7u);\n unpacked[71] = extractBits(val_15, 17u, 7u);\n unpacked[72] = extractBits(val_15, 24u, 7u);\n unpacked[73] = extractBits(val_15, 31u, 1u);\n \n let val_16 = blocks[packed_offset + 16];\n unpacked[73] = insertBits(unpacked[73], extractBits(val_16, 0u, 6u), 1u, 6u);\n unpacked[74] = extractBits(val_16, 6u, 7u);\n unpacked[75] = extractBits(val_16, 13u, 7u);\n unpacked[76] = extractBits(val_16, 20u, 7u);\n unpacked[77] = extractBits(val_16, 27u, 5u);\n \n let val_17 = blocks[packed_offset + 17];\n unpacked[77] = insertBits(unpacked[77], extractBits(val_17, 0u, 2u), 5u, 2u);\n unpacked[78] = extractBits(val_17, 2u, 7u);\n unpacked[79] = extractBits(val_17, 9u, 7u);\n unpacked[80] = extractBits(val_17, 16u, 7u);\n unpacked[81] = extractBits(val_17, 23u, 7u);\n unpacked[82] = extractBits(val_17, 30u, 2u);\n \n let val_18 = blocks[packed_offset + 18];\n unpacked[82] = insertBits(unpacked[82], extractBits(val_18, 0u, 5u), 2u, 5u);\n unpacked[83] = extractBits(val_18, 5u, 7u);\n unpacked[84] = extractBits(val_18, 12u, 7u);\n unpacked[85] = extractBits(val_18, 19u, 7u);\n unpacked[86] = extractBits(val_18, 26u, 6u);\n \n let val_19 = blocks[packed_offset + 19];\n unpacked[86] = insertBits(unpacked[86], extractBits(val_19, 0u, 1u), 6u, 1u);\n unpacked[87] = extractBits(val_19, 1u, 7u);\n unpacked[88] = extractBits(val_19, 8u, 7u);\n unpacked[89] = extractBits(val_19, 15u, 7u);\n unpacked[90] = extractBits(val_19, 22u, 7u);\n unpacked[91] = extractBits(val_19, 29u, 3u);\n \n let val_20 = blocks[packed_offset + 20];\n unpacked[91] = insertBits(unpacked[91], extractBits(val_20, 0u, 4u), 3u, 4u);\n unpacked[92] = extractBits(val_20, 4u, 7u);\n unpacked[93] = extractBits(val_20, 11u, 7u);\n unpacked[94] = extractBits(val_20, 18u, 7u);\n unpacked[95] = extractBits(val_20, 25u, 7u);\n \n let val_21 = blocks[packed_offset + 21];\n unpacked[96] = extractBits(val_21, 0u, 7u);\n unpacked[97] = extractBits(val_21, 7u, 7u);\n unpacked[98] = extractBits(val_21, 14u, 7u);\n unpacked[99] = extractBits(val_21, 21u, 7u);\n unpacked[100] = extractBits(val_21, 28u, 4u);\n \n let val_22 = blocks[packed_offset + 22];\n unpacked[100] = insertBits(unpacked[100], extractBits(val_22, 0u, 3u), 4u, 3u);\n unpacked[101] = extractBits(val_22, 3u, 7u);\n unpacked[102] = extractBits(val_22, 10u, 7u);\n unpacked[103] = extractBits(val_22, 17u, 7u);\n unpacked[104] = extractBits(val_22, 24u, 7u);\n unpacked[105] = extractBits(val_22, 31u, 1u);\n \n let val_23 = blocks[packed_offset + 23];\n unpacked[105] = insertBits(unpacked[105], extractBits(val_23, 0u, 6u), 1u, 6u);\n unpacked[106] = extractBits(val_23, 6u, 7u);\n unpacked[107] = extractBits(val_23, 13u, 7u);\n unpacked[108] = extractBits(val_23, 20u, 7u);\n unpacked[109] = extractBits(val_23, 27u, 5u);\n \n let val_24 = blocks[packed_offset + 24];\n unpacked[109] = insertBits(unpacked[109], extractBits(val_24, 0u, 2u), 5u, 2u);\n unpacked[110] = extractBits(val_24, 2u, 7u);\n unpacked[111] = extractBits(val_24, 9u, 7u);\n unpacked[112] = extractBits(val_24, 16u, 7u);\n unpacked[113] = extractBits(val_24, 23u, 7u);\n unpacked[114] = extractBits(val_24, 30u, 2u);\n \n let val_25 = blocks[packed_offset + 25];\n unpacked[114] = insertBits(unpacked[114], extractBits(val_25, 0u, 5u), 2u, 5u);\n unpacked[115] = extractBits(val_25, 5u, 7u);\n unpacked[116] = extractBits(val_25, 12u, 7u);\n unpacked[117] = extractBits(val_25, 19u, 7u);\n unpacked[118] = extractBits(val_25, 26u, 6u);\n \n let val_26 = blocks[packed_offset + 26];\n unpacked[118] = insertBits(unpacked[118], extractBits(val_26, 0u, 1u), 6u, 1u);\n unpacked[119] = extractBits(val_26, 1u, 7u);\n unpacked[120] = extractBits(val_26, 8u, 7u);\n unpacked[121] = extractBits(val_26, 15u, 7u);\n unpacked[122] = extractBits(val_26, 22u, 7u);\n unpacked[123] = extractBits(val_26, 29u, 3u);\n \n let val_27 = blocks[packed_offset + 27];\n unpacked[123] = insertBits(unpacked[123], extractBits(val_27, 0u, 4u), 3u, 4u);\n unpacked[124] = extractBits(val_27, 4u, 7u);\n unpacked[125] = extractBits(val_27, 11u, 7u);\n unpacked[126] = extractBits(val_27, 18u, 7u);\n unpacked[127] = extractBits(val_27, 25u, 7u); \n}\n";var fromFP510Function="\n\nconst exponents: array = array(\n 2.9103830456733704e-11, \n 5.820766091346741e-11, \n 1.1641532182693481e-10, \n 2.3283064365386963e-10,\n 4.656612873077393e-10, \n 9.313225746154785e-10, \n 1.862645149230957e-09, \n 3.725290298461914e-09,\n 7.450580596923828e-09, \n 1.4901161193847656e-08, \n 2.9802322387695312e-08, \n 5.960464477539063e-08,\n 1.1920928955078125e-07, \n 2.384185791015625e-07, \n 4.76837158203125e-07, \n 9.5367431640625e-07,\n 1.9073486328125e-06, \n 3.814697265625e-06, \n 7.62939453125e-06, \n 1.52587890625e-05, \n 3.0517578125e-05,\n 6.103515625e-05, \n 0.0001220703125, \n 0.000244140625, \n 0.00048828125, \n 0.0009765625, \n 0.001953125, \n 0.00390625,\n 0.0078125, \n 0.015625, \n 0.03125, \n 0.0625);\n\nfn from_fp510(x: u32) -> f32 {\n let exponent = f32(exponents[extractBits(x, 10u, 5u)]); \n let fractional = f32(extractBits(x, 0u, 10u)); \n let abs = exponent * fractional;\n return abs * (1.0 - (2.0 * f32(extractBits(x, 15u, 1u))));\n}\n";var preprocessBlocks3BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth3,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n \n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 12u); \n unpack_block_128_bit_depth_3(blocks_start); \n \n let b01: u32 = blocks_start;\n let b2: u32 = blocks_start + 8u;\n \n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b01_idx = b01 + (r / 2u);\n let b2_idx = b2 + (r / 4u);\n\n blocks[b01_idx] = insertBits(blocks[b01_idx], extractBits(unpacked[unpacked_idx], 0u, 2u), (r * 16u) % 32u, 16u);\n blocks[b2_idx] = insertBits(blocks[b2_idx], extractBits(unpacked[unpacked_idx], 2u, 1u), (r * 8u) % 32u, 8u); \n }\n \n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b01_idx = b01 + (r / 2u);\n let b2_idx = b2 + (r / 4u);\n \n blocks[b01_idx] = insertBits(blocks[b01_idx], extractBits(unpacked[unpacked_idx], 0u, 2u), ((r * 16u) % 32u) + (2u * c), 2u);\n blocks[b2_idx] = insertBits(blocks[b2_idx], extractBits(unpacked[unpacked_idx], 2u, 1u), ((r * 8u) % 32u) + c, 1u); \n }\n }\n}\n\n").concat(emptyShader);var preprocessBlocks5BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth5,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n\n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 20u);\n unpack_block_128_bit_depth_5(blocks_start); \n \n let b03: u32 = blocks_start;\n let b4: u32 = blocks_start + 16u;\n\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b03_idx = b03 + r;\n let b4_idx = b4 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 0u, 32u);\n blocks[b4_idx] = insertBits(blocks[b4_idx], extractBits(unpacked[unpacked_idx], 4u, 1u), (r * 8u) % 32u, 8u);\n }\n \n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b03_idx = b03 + r;\n let b4_idx = b4 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 4 * c, 4u);\n blocks[b4_idx] = insertBits(blocks[b4_idx], extractBits(unpacked[unpacked_idx], 4u, 1u), ((r * 8u) % 32u) + c, 1u);\n }\n } \n}\n\n").concat(emptyShader);var preprocessBlocks6BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth6,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n \n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 24u);\n unpack_block_128_bit_depth_6(blocks_start);\n \n let b03: u32 = blocks_start;\n let b45: u32 = blocks_start + 16u; \n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 0u, 32u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u), 16u);\n }\n\n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 4 * c, 4u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u) + (2 * c), 2u);\n }\n }\n}\n\n").concat(emptyShader);var preprocessBlocks7BitShaderSource="\n\nstruct argsStruct {\n nbr: u32,\n nbc: u32,\n blocks_offset: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar blocks: array;\n\n".concat(unpackBlock128BitDepth7,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.nbr || global_id.y >= args.nbc) {\n return;\n }\n \n let blocks_start: u32 = args.blocks_offset + ((global_id.x * args.nbc + global_id.y) * 28u);\n unpack_block_128_bit_depth_7(blocks_start);\n \n let b03: u32 = blocks_start;\n let b45: u32 = blocks_start + 16u;\n let b6: u32 = blocks_start + 24u; \n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n let b6_idx = b6 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 0, 32u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u), 16u);\n blocks[b6_idx] = insertBits(blocks[b6_idx], extractBits(unpacked[unpacked_idx], 6u, 1u), ((r * 8u) % 32u), 8u);\n }\n \n for (var c = 1u; c < ").concat(columnsPerBlock,"u; c++) {\n for (var r = 0u; r < ").concat(rowsPerBlock,"u; r++) {\n let unpacked_idx = r * ").concat(columnsPerBlock,"u + c;\n let b03_idx = b03 + r;\n let b45_idx = b45 + (r / 2u);\n let b6_idx = b6 + (r / 4u);\n \n blocks[b03_idx] = insertBits(blocks[b03_idx], extractBits(unpacked[unpacked_idx], 0u, 4u), 4 * c, 4u);\n blocks[b45_idx] = insertBits(blocks[b45_idx], extractBits(unpacked[unpacked_idx], 4u, 2u), ((r * 16u) % 32u) + (2 * c), 2u);\n blocks[b6_idx] = insertBits(blocks[b6_idx], extractBits(unpacked[unpacked_idx], 6u, 1u), ((r * 8u) % 32u) + c, 1u);\n }\n }\n}\n\n").concat(emptyShader);var preprocessShaderSources={3:preprocessBlocks3BitShaderSource,5:preprocessBlocks5BitShaderSource,6:preprocessBlocks6BitShaderSource,7:preprocessBlocks7BitShaderSource};var preprocessShaderNames={3:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_3bit_shader",5:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_5bit_shader",6:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_6bit_shader",7:"pv_picollm_weight_block_mixed_16x8_preprocess_blocks_7bit_shader"};var BM=8;var BN=32;var TM=2;var TN=16;var TC=rowsPerBlock*BM*BN/(TM*TN);var constantSnippet="\nconst BM = ".concat(BM,"u;\nconst BN = ").concat(BN,"u;\n\nconst TM = ").concat(TM,"u;\nconst TN = ").concat(TN,"u;\n\nconst TC = ").concat(TC,"u;\n\nconst ROW_PER_BLOCK = ").concat(rowsPerBlock,"u;\nconst COL_PER_BLOCK = ").concat(columnsPerBlock,"u;\n\nconst VEC_COL_PER_BLOCK = COL_PER_BLOCK / 4u;\n\nconst block_size: u32 = (COL_PER_BLOCK * ROW_PER_BLOCK * bit_depth) / 32u;\n\n");var forwardMultipleInputArgsSnippet="\nstruct argsStruct {\n n: u32,\n m: u32,\n total_nbc: u32,\n k: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array;\n";var forwardMultipleSharedPrivateMemSnippet="\nvar shared_x: array, BN * VEC_COL_PER_BLOCK>;\nvar shared_ab: array;\nvar shared_w: array, BM * ROW_PER_BLOCK * VEC_COL_PER_BLOCK>;\n\nvar local_x: array, TN * VEC_COL_PER_BLOCK>;\nvar local_x_sums: array;\nvar local_results: array;\n";var forwardMultipleLocalVarSnippet="\n let tid = local_id.x;\n let bm_idx = workgroup_id.x;\n let bn_idx = workgroup_id.y;\n\n let local_bm_idx = bm_idx * BM;\n let local_bn_idx = bn_idx * BN;\n \n let n_idx = tid % (BN / TN);\n let k_idx = tid / (BN / TN) / (BM * ROW_PER_BLOCK / TM);\n let m_idx = tid / (BN / TN) % (BM * ROW_PER_BLOCK / TM);\n";var forwardMultipleLoadW1Bit="\n let b0 = blocks[src + (row / 4u)];\n\n let b0_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b0_offset = b0_offset_base + (c * 4u); \n shared_w[dst + c] = vec4(\n f32(extractBits(b0, b0_offset, 1u)), \n f32(extractBits(b0, b0_offset + 1, 1u)),\n f32(extractBits(b0, b0_offset + 2, 1u)),\n f32(extractBits(b0, b0_offset + 3, 1u)));\n }\n";var forwardMultipleLoadW2Bit="\n let b01 = blocks[src + (row / 2u)];\n \n let b01_offset_base = (row * 16u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) { \n let b01_offset = b01_offset_base + (c * 8u);\n shared_w[dst + c] = vec4(\n f32(extractBits(b01, b01_offset, 2u)), \n f32(extractBits(b01, b01_offset + 2, 2u)),\n f32(extractBits(b01, b01_offset + 4, 2u)),\n f32(extractBits(b01, b01_offset + 6, 2u)));\n } \n";var forwardMultipleLoadW3Bit="\n let b01 = blocks[src + (row / 2u)];\n let b2 = blocks[src + 8u + (row / 4u)]; \n\n let b01_offset_base = (row * 16u) % 32u;\n let b2_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b01_offset = b01_offset_base + (c * 8u);\n let b2_offset = b2_offset_base + (c * 4u);\n\n shared_w[dst + c] = vec4(\n f32(insertBits(extractBits(b01, b01_offset, 2u), extractBits(b2, b2_offset, 1u), 2u, 1u)), \n f32(insertBits(extractBits(b01, b01_offset + 2, 2u), extractBits(b2, b2_offset + 1, 1u), 2u, 1u)),\n f32(insertBits(extractBits(b01, b01_offset + 4, 2u), extractBits(b2, b2_offset + 2, 1u), 2u, 1u)),\n f32(insertBits(extractBits(b01, b01_offset + 6, 2u), extractBits(b2, b2_offset + 3, 1u), 2u, 1u))); \n }\n";var forwardMultipleLoadW4Bit="\n let b03 = blocks[src + row];\n \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b03_offset = (c * 16u); \n shared_w[dst + c] = vec4(\n f32(extractBits(b03, b03_offset, 4u)), \n f32(extractBits(b03, b03_offset + 4, 4u)),\n f32(extractBits(b03, b03_offset + 8, 4u)),\n f32(extractBits(b03, b03_offset + 12, 4u)));\n }\n";var forwardMultipleLoadW5Bit="\n let b03 = blocks[src + row];\n let b4 = blocks[src + 16u + (row / 4u)];\n \n let b4_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b03_offset = (c * 16u);\n let b4_offset = b4_offset_base + (c * 4u);\n shared_w[dst + c] = vec4(\n f32(insertBits(extractBits(b03, b03_offset, 4u), extractBits(b4, b4_offset, 1u), 4u, 1u)), \n f32(insertBits(extractBits(b03, b03_offset + 4, 4u), extractBits(b4, b4_offset + 1, 1u), 4u, 1u)),\n f32(insertBits(extractBits(b03, b03_offset + 8, 4u), extractBits(b4, b4_offset + 2, 1u), 4u, 1u)),\n f32(insertBits(extractBits(b03, b03_offset + 12, 4u), extractBits(b4, b4_offset + 3, 1u), 4u, 1u)));\n }\n";var forwardMultipleLoadW6Bit="\n let b03 = blocks[src + row];\n let b45 = blocks[src + 16u + (row / 2u)];\n \n let b45_offset_base = (row * 16u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) { \n let b03_offset = (c * 16u);\n let b45_offset = b45_offset_base + (c * 8u);\n shared_w[dst + c] = vec4(\n f32(insertBits(extractBits(b03, b03_offset, 4u), extractBits(b45, b45_offset, 2u), 4u, 2u)), \n f32(insertBits(extractBits(b03, b03_offset + 4, 4u), extractBits(b45, b45_offset + 2, 2u), 4u, 2u)),\n f32(insertBits(extractBits(b03, b03_offset + 8, 4u), extractBits(b45, b45_offset + 4, 2u), 4u, 2u)),\n f32(insertBits(extractBits(b03, b03_offset + 12, 4u), extractBits(b45, b45_offset + 6, 2u), 4u, 2u)));\n }\n";var forwardMultipleLoadW7Bit="\n let b03 = blocks[src + row];\n let b45 = blocks[src + 16u + (row / 2u)];\n let b6 = blocks[src + 24u + (row / 4u)];\n \n let b45_offset_base = (row * 16u) % 32u;\n let b6_offset_base = (row * 8u) % 32u;\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b03_offset = (c * 16u);\n let b45_offset = b45_offset_base + (c * 8u);\n let b6_offset = b6_offset_base + (c * 4u);\n \n shared_w[dst + c] = vec4(\n f32(insertBits(insertBits(extractBits(b03, b03_offset, 4u), extractBits(b45, b45_offset, 2u), 4u, 2u), extractBits(b6, b6_offset, 1u), 6u, 1u)), \n f32(insertBits(insertBits(extractBits(b03, b03_offset + 4, 4u), extractBits(b45, b45_offset + 2, 2u), 4u, 2u), extractBits(b6, b6_offset + 1, 1u), 6u, 1u)),\n f32(insertBits(insertBits(extractBits(b03, b03_offset + 8, 4u), extractBits(b45, b45_offset + 4, 2u), 4u, 2u), extractBits(b6, b6_offset + 2, 1u), 6u, 1u)),\n f32(insertBits(insertBits(extractBits(b03, b03_offset + 12, 4u), extractBits(b45, b45_offset + 6, 2u), 4u, 2u), extractBits(b6, b6_offset + 3, 1u), 6u, 1u)));\n }\n";var forwardMultipleLoadW8Bit="\n let b07_offset = src + (row * 2);\n \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n let b07 = blocks[b07_offset + c];\n shared_w[dst + c] = vec4(\n f32(extractBits(b07, 0u, 8u)), \n f32(extractBits(b07, 8u, 8u)),\n f32(extractBits(b07, 16u, 8u)),\n f32(extractBits(b07, 24u, 8u)));\n }\n";var forwardLoadWBitDepthSnippets={1:forwardMultipleLoadW1Bit,2:forwardMultipleLoadW2Bit,3:forwardMultipleLoadW3Bit,4:forwardMultipleLoadW4Bit,5:forwardMultipleLoadW5Bit,6:forwardMultipleLoadW6Bit,7:forwardMultipleLoadW7Bit,8:forwardMultipleLoadW8Bit};var forwardMultipleLoadXSnippet="\n let total_work_x = VEC_COL_PER_BLOCK * BN;\n for (var local_idx = 0u; local_idx < divide_pad(total_work_x, TC); local_idx++) {\n let idx = local_idx * TC + tid;\n if (idx < total_work_x) { \n let n_load_idx = local_bn_idx + idx / VEC_COL_PER_BLOCK;\n let inner_idx = idx % VEC_COL_PER_BLOCK;\n \n if (bk_idx < args.k && n_load_idx < args.n) { \n let x_idx = (args.x_offset / 4u) + ((bk_idx * args.n + n_load_idx) * VEC_COL_PER_BLOCK + inner_idx); \n shared_x[idx] = x[x_idx];\n } else {\n shared_x[idx] = vec4(0.0);\n }\n }\n }\n";var forwardMultipleLoadABSnippet="\n let total_work_ab = BM * 2;\n for (var local_idx = 0u; local_idx < divide_pad(total_work_ab, TC); local_idx++) {\n let idx = local_idx * TC + tid;\n if (idx < total_work_ab) {\n let m_load_idx = local_bm_idx + idx / 2; \n let inner_idx = (idx % 2) * 16u;\n \n if (m_load_idx < args.m && bk_idx < args.k) {\n let ab_bits = extractBits(metas[args.metas_offset + (m_load_idx * args.k + bk_idx)], inner_idx, 16u);\n shared_ab[idx] = from_fp510(ab_bits); \n } else {\n shared_ab[idx] = 0.0;\n }\n }\n }\n";var forwardMultipleLoadWSnippet=function forwardMultipleLoadWSnippet(bitDepth){return"\n let total_work_w = BM * ROW_PER_BLOCK;\n for (var local_idx = 0u; local_idx < divide_pad(total_work_w, TC); local_idx++) {\n let idx = local_idx * TC + tid;\n if (idx < total_work_w) {\n let m_load_idx = local_bm_idx + idx / ROW_PER_BLOCK;\n let row = idx % ROW_PER_BLOCK;\n let dst = idx * VEC_COL_PER_BLOCK;\n\n if (m_load_idx < args.m) {\n let src = args.blocks_offset + (m_load_idx * args.k + bk_idx) * block_size;\n ".concat(forwardLoadWBitDepthSnippets[bitDepth],"\n } else { \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n shared_w[dst + c] = vec4(0.0);\n }\n }\n }\n }\n")};var forwardMultipleCopyXSnippet="\nfor (var tn_idx = 0u; tn_idx < TN; tn_idx++) { \n var x_sum_vec = vec4(0.0); \n let local_x_idx = tn_idx * VEC_COL_PER_BLOCK;\n let shared_x_idx = (n_idx * TN + tn_idx) * VEC_COL_PER_BLOCK + (k_idx * VEC_COL_PER_BLOCK);\n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) {\n local_x[local_x_idx + c] = shared_x[shared_x_idx + c];\n x_sum_vec += local_x[local_x_idx + c];\n }\n local_x_sums[tn_idx] = x_sum_vec.x + x_sum_vec.y + x_sum_vec.z + x_sum_vec.w; \n}\n";var forwardMultipleComputeResultsSnippet="\n for (var tm_idx = 0u; tm_idx < TM; tm_idx++) { \n let shared_ab_idx = ((m_idx * TM + tm_idx) / ROW_PER_BLOCK + k_idx) * 2;\n let alpha = shared_ab[shared_ab_idx];\n let beta = shared_ab[shared_ab_idx + 1]; \n let shared_w_idx = ((m_idx * TM + tm_idx) + k_idx) * VEC_COL_PER_BLOCK;\n \n for (var tn_idx = 0u; tn_idx < TN; tn_idx++) { \n let local_x_idx = tn_idx * VEC_COL_PER_BLOCK;\n \n var swx_vec = vec4(0.0); \n for (var c = 0u; c < VEC_COL_PER_BLOCK; c++) { \n swx_vec += shared_w[shared_w_idx + c] * local_x[local_x_idx + c];\n }\n let swx = swx_vec.x + swx_vec.y + swx_vec.z + swx_vec.w;\n \n let kappa = alpha * local_x_sums[tn_idx]; \n let results_idx = tm_idx * TN + tn_idx;\n local_results[results_idx] += kappa + (beta * swx);\n }\n }\n";var forwardMultipleWriteResultsSnippet="\nfor (var tm_idx = 0u; tm_idx < TM; tm_idx++) {\n let row = local_bm_idx * ROW_PER_BLOCK + (m_idx * TM + tm_idx); \n for (var tn_idx = 0u; tn_idx < TN; tn_idx++) { \n let col = local_bn_idx + (n_idx * TN + tn_idx);\n if (row < args.m * ROW_PER_BLOCK && col < args.n) {\n let y_idx = args.y_offset + ((row / ROW_PER_BLOCK) * args.n + col) * ROW_PER_BLOCK + (row % ROW_PER_BLOCK);\n let results_idx = tm_idx * TN + tn_idx;\n \n y[y_idx] += local_results[results_idx];\n }\n }\n}\n";var forwardMultipleShaderSources=function forwardMultipleShaderSources(bitDepth){return"\n\n".concat(forwardMultipleInputArgsSnippet,"\n\n").concat(constantSnippet,"\n\n").concat(forwardMultipleSharedPrivateMemSnippet,"\n\n").concat(fromFP510Function,"\n\n").concat(dividePadFunction,"\n\nconst bit_depth: u32 = ").concat(bitDepth,"u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n \n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(\n @builtin(local_invocation_id) local_id: vec3,\n @builtin(workgroup_id) workgroup_id: vec3\n) {\n ").concat(forwardMultipleLocalVarSnippet,"\n \n for (var bk_idx = 0u; bk_idx < args.k; bk_idx++) { \n ").concat(forwardMultipleLoadXSnippet,"\n ").concat(forwardMultipleLoadABSnippet," \n ").concat(forwardMultipleLoadWSnippet(bitDepth)," \n workgroupBarrier();\n \n ").concat(forwardMultipleCopyXSnippet,"\n ").concat(forwardMultipleComputeResultsSnippet,"\n workgroupBarrier();\n }\n \n ").concat(forwardMultipleWriteResultsSnippet,"\n}\n\n").concat(emptyShader,"\n")};var forwardShuffleXShaderSource="\nstruct argsStruct {\n n: u32,\n shape1: u32,\n x_offset: u32,\n indices_offset: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar indices: array;\n\n@group(0) @binding(3)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n || global_id.y >= args.shape1) {\n return;\n } \n\n let b = global_id.x;\n let i = global_id.y;\n \n let c = i / 8u;\n let j = i % 8u;\n y[((c * args.n) + b) * 8 + j] = x[args.x_offset + (b * args.shape1) + indices[args.indices_offset + i]];\n}\n\n".concat(emptyShader,"\n");var forwardSingleReduceYShaderSource="\nstruct argsStruct {\n nvr: u32,\n nbc: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar y: array>;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) { \n if (global_id.x > args.nvr) {\n return;\n }\n\n let x_start = global_id.x * args.nbc;\n var sum: vec4 = vec4(0.0, 0.0, 0.0, 0.0);\n for (var i = 0u; i < args.nbc; i++) {\n sum += x[x_start + i]; \n }\n y[global_id.x] += sum;\n}\n\n".concat(emptyShader);var forwardShuffleYShaderSource="\nstruct argsStruct {\n n: u32,\n shape0: u32, \n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array;\n\n@group(0) @binding(2)\nvar y: array;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= args.n || global_id.y >= args.shape0) {\n return;\n } \n \n let b = global_id.x;\n let i = global_id.y;\n \n let r = i / 16u;\n let j = i % 16u;\n y[(b * args.shape0) + (r * 16) + j] = x[(((r * args.n) + b) * 16) + j];\n}\n\n".concat(emptyShader);var addBiasShaderSource="\nstruct argsStruct {\n dimension: u32\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar bias: array;\n\n@group(0) @binding(2)\nvar y: array;\n\n".concat(fromFP510Function,"\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) { \n y[(global_id.x * args.dimension) + global_id.y] += bias[global_id.y];\n}\n\n").concat(emptyShader);var forwardSingleBitDepth1ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 4u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n\n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b0_start = row_blocks_start + br_offset + (bc * block_size);\n var b0_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b0 = blocks[b0_start];\n \n let w0_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w0_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w0_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w0_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 8u;\n \n let w1_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w1_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w1_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w1_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 16u;\n \n let w2_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w2_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w2_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w2_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 24u;\n \n let w3_0 = f32(extractBits(b0, b0_offset + j, 1u)); \n let w3_1 = f32(extractBits(b0, b0_offset + j + 1, 1u)); \n let w3_2 = f32(extractBits(b0, b0_offset + j + 2, 1u));\n let w3_3 = f32(extractBits(b0, b0_offset + j + 3, 1u));\n \n b0_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w; \n }\n \n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth2ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 8u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n\n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b01_start = row_blocks_start + (br_offset * 2u) + (bc * block_size);\n var b01_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b01 = blocks[b01_start];\n \n let w0_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w0_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w0_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w0_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 16u;\n \n let w1_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w1_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w1_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w1_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 0u; \n b01 = blocks[b01_start + 1u];\n \n let w2_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w2_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w2_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w2_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 16u;\n \n let w3_0 = f32(extractBits(b01, b01_offset + (2u * j), 2u)); \n let w3_1 = f32(extractBits(b01, b01_offset + (2u * (j + 1)), 2u)); \n let w3_2 = f32(extractBits(b01, b01_offset + (2u * (j + 2)), 2u));\n let w3_3 = f32(extractBits(b01, b01_offset + (2u * (j + 3)), 2u));\n \n b01_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w; \n }\n \n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth3ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 12u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id : vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n\n let x_start = ((args.x_offset + c) / 4u);\n \n var b01_start = row_blocks_start + (br_offset * 2u) + (bc * block_size);\n var b2_start = row_blocks_start + br_offset + (bc * block_size) + 8u;\n var b01_offset = 0u;\n var b2_offset = 0u;\n\n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) { \n \n var b01 = blocks[b01_start];\n var b2 = blocks[b2_start];\n \n var b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n var b2_bit = extractBits(b2, b2_offset + j, 1u);\n let w0_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w0_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w0_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w0_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 16u;\n b2_offset = 8u;\n \n b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n b2_bit = extractBits(b2, b2_offset + j, 1u); \n let w1_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w1_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w1_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w1_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 0u;\n b2_offset = 16u; \n b01 = blocks[b01_start + 1u];\n \n b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n b2_bit = extractBits(b2, b2_offset + j, 1u); \n let w2_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w2_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w2_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w2_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 16u;\n b2_offset = 24u; \n \n b01_bits = extractBits(b01, b01_offset + (2u * j), 2u);\n b2_bit = extractBits(b2, b2_offset + j, 1u); \n let w3_0 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 1)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 1), 1u);\n let w3_1 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 2)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 2), 1u);\n let w3_2 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_bits = extractBits(b01, b01_offset + (2u * (j + 3)), 2u);\n b2_bit = extractBits(b2, b2_offset + (j + 3), 1u);\n let w3_3 = f32(insertBits(b01_bits, b2_bit, 2u, 1u));\n \n b01_offset = 0u;\n b2_offset = 0u; \n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n \n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth4ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 16u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size); \n\n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n\n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start]; \n \n let w0_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w0_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w0_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w0_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n b03 = blocks[b03_start + 1];\n \n let w1_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w1_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w1_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w1_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n b03 = blocks[b03_start + 2];\n \n let w2_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w2_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w2_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w2_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n b03 = blocks[b03_start + 3];\n \n let w3_0 = f32(extractBits(b03, 4u * j, 4u)); \n let w3_1 = f32(extractBits(b03, 4u * (j + 1), 4u)); \n let w3_2 = f32(extractBits(b03, 4u * (j + 2), 4u));\n let w3_3 = f32(extractBits(b03, 4u * (j + 3), 4u));\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth5ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 20u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size);\n var b4_start = row_blocks_start + br_offset + (bc * block_size) + 16u;\n \n var b4_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start];\n var b4 = blocks[b4_start];\n \n var b03_bits = extractBits(b03, 4u * j, 4u);\n var b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w0_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w0_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w0_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w0_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03 = blocks[b03_start + 1];\n b4_offset = 8u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w1_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w1_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w1_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w1_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03 = blocks[b03_start + 2];\n b4_offset = 16u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w2_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w2_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w2_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w2_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03 = blocks[b03_start + 3];\n b4_offset = 24u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b4_bit = extractBits(b4, b4_offset + j, 1u); \n let w3_0 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 1), 1u);\n let w3_1 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 2), 1u);\n let w3_2 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b4_bit = extractBits(b4, b4_offset + (j + 3), 1u);\n let w3_3 = f32(insertBits(b03_bits, b4_bit, 4u, 1u));\n \n b4_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth6ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 24u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size);\n var b45_start = row_blocks_start + (br_offset * 2u) + (bc * block_size) + 16u;\n \n var b45_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start];\n var b45 = blocks[b45_start];\n \n var b03_bits = extractBits(b03, 4u * j, 4u);\n var b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w0_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w0_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w0_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w0_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03 = blocks[b03_start + 1];\n b45_offset = 16u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w1_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w1_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w1_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w1_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u)); \n \n b03 = blocks[b03_start + 2];\n b45 = blocks[b45_start + 1];\n b45_offset = 0u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w2_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w2_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w2_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w2_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03 = blocks[b03_start + 3];\n b45_offset = 16u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n let w3_0 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n let w3_1 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n let w3_2 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n let w3_3 = f32(insertBits(b03_bits, b45_bits, 4u, 2u));\n \n b45_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth7ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 28u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b03_start = row_blocks_start + (br_offset * 4u) + (bc * block_size);\n var b45_start = row_blocks_start + (br_offset * 2u) + (bc * block_size) + 16u;\n var b6_start = row_blocks_start + br_offset + (bc * block_size) + 24u;\n \n var b45_offset = 0u;\n var b6_offset = 0u;\n \n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n \n for (var j = 0u; j < ").concat(columnsPerBlock,"; j+=4) {\n \n var b03 = blocks[b03_start];\n var b45 = blocks[b45_start];\n var b6 = blocks[b6_start];\n \n var b03_bits = extractBits(b03, 4u * j, 4u);\n var b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n var b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w0_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w0_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w0_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w0_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03 = blocks[b03_start + 1];\n b45_offset = 16u;\n b6_offset = 8u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w1_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w1_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w1_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w1_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03 = blocks[b03_start + 2];\n b45 = blocks[b45_start + 1];\n b45_offset = 0u;\n b6_offset = 16u;\n\n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w2_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w2_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w2_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w2_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03 = blocks[b03_start + 3];\n b45_offset = 16u;\n b6_offset = 24u;\n \n b03_bits = extractBits(b03, 4u * j, 4u);\n b45_bits = extractBits(b45, b45_offset + (j * 2), 2u);\n b6_bit = extractBits(b6, b6_offset + j, 1u);\n let w3_0 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 1), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 1)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 1, 1u);\n let w3_1 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b03_bits = extractBits(b03, 4u * (j + 2), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 2)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 2, 1u);\n let w3_2 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u)); \n \n b03_bits = extractBits(b03, 4u * (j + 3), 4u);\n b45_bits = extractBits(b45, b45_offset + (2u * (j + 3)), 2u);\n b6_bit = extractBits(b6, b6_offset + j + 3, 1u);\n let w3_3 = f32(insertBits(insertBits(b03_bits, b45_bits, 4u, 2u), b6_bit, 6u, 1u));\n \n b45_offset = 0u;\n b6_offset = 0u;\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_idx = (j / 4u);\n let x_vec = x[x_start + x_idx];\n res[x_idx] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleBitDepth8ShaderSource="\n\nstruct argsStruct {\n n: u32,\n nbr: u32,\n total_nbc: u32,\n bit_depth_nbc: u32,\n x_offset: u32,\n metas_offset: u32,\n blocks_offset: u32,\n y_offset: u32,\n};\n\n@group(0) @binding(0) \nvar args: argsStruct;\n\n@group(0) @binding(1)\nvar x: array>;\n\n@group(0) @binding(2)\nvar metas: array;\n\n@group(0) @binding(3)\nvar blocks: array;\n\n@group(0) @binding(4)\nvar y: array>;\n\n".concat(fromFP510Function,"\n\nconst block_size: u32 = 32u;\n\noverride workgroup_size_x: u32 = 1;\noverride workgroup_size_y: u32 = 1;\noverride workgroup_size_z: u32 = 1;\n\n@compute @workgroup_size(workgroup_size_x, workgroup_size_y, workgroup_size_z)\nfn main(@builtin(global_invocation_id) global_id: vec3) {\n if (global_id.x >= (args.nbr * 4) || global_id.y >= args.bit_depth_nbc) {\n return;\n }\n \n let r = global_id.x * 4u;\n let c = global_id.y * ").concat(columnsPerBlock,";\n let br = global_id.x / 4u; \n let bc = global_id.y;\n let br_offset = global_id.x % 4u;\n \n let row_metas_start: u32 = args.metas_offset + (br * args.bit_depth_nbc);\n let row_blocks_start: u32 = args.blocks_offset + (br * args.bit_depth_nbc * block_size); \n \n let alpha = from_fp510(extractBits(metas[row_metas_start + bc], 0, 16u)); \n let beta = from_fp510(extractBits(metas[row_metas_start + bc], 16u, 16u));\n \n let x_start = ((args.x_offset + c) / 4u);\n \n var b07_start = row_blocks_start + (br_offset * 8u) + (bc * block_size); \n\n var res: array, 2u>;\n var x_sum: f32 = 0.0;\n\n for (var j = 0u; j < 2; j++) {\n \n var b07 = blocks[b07_start + j];\n \n let w0_0 = f32(extractBits(b07, 0u, 8u)); \n let w0_1 = f32(extractBits(b07, 8u, 8u)); \n let w0_2 = f32(extractBits(b07, 16u, 8u));\n let w0_3 = f32(extractBits(b07, 24u, 8u));\n \n b07 = blocks[b07_start + 2 + j];\n \n let w1_0 = f32(extractBits(b07, 0u, 8u)); \n let w1_1 = f32(extractBits(b07, 8u, 8u)); \n let w1_2 = f32(extractBits(b07, 16u, 8u));\n let w1_3 = f32(extractBits(b07, 24u, 8u));\n \n b07 = blocks[b07_start + 4 + j];\n \n let w2_0 = f32(extractBits(b07, 0u, 8u)); \n let w2_1 = f32(extractBits(b07, 8u, 8u)); \n let w2_2 = f32(extractBits(b07, 16u, 8u));\n let w2_3 = f32(extractBits(b07, 24u, 8u));\n \n b07 = blocks[b07_start + 6 + j];\n \n let w3_0 = f32(extractBits(b07, 0u, 8u)); \n let w3_1 = f32(extractBits(b07, 8u, 8u)); \n let w3_2 = f32(extractBits(b07, 16u, 8u));\n let w3_3 = f32(extractBits(b07, 24u, 8u));\n \n let m = mat4x4(\n w0_0, w1_0, w2_0, w3_0,\n w0_1, w1_1, w2_1, w3_1, \n w0_2, w1_2, w2_2, w3_2,\n w0_3, w1_3, w2_3, w3_3);\n\n let x_vec = x[x_start + j];\n res[j] = m * x_vec;\n \n x_sum += x_vec.x + x_vec.y + x_vec.z + x_vec.w;\n }\n let swx = res[0] + res[1];\n let kappa = alpha * x_sum;\n \n let y_start = (args.y_offset + (r * args.total_nbc)) / 4u;\n y[y_start + bc] += (swx * beta) + vec4(kappa);\n}\n\n").concat(emptyShader);var forwardSingleShaderSources={1:forwardSingleBitDepth1ShaderSource,2:forwardSingleBitDepth2ShaderSource,3:forwardSingleBitDepth3ShaderSource,4:forwardSingleBitDepth4ShaderSource,5:forwardSingleBitDepth5ShaderSource,6:forwardSingleBitDepth6ShaderSource,7:forwardSingleBitDepth7ShaderSource,8:forwardSingleBitDepth8ShaderSource};var forwardSingleShaderNames={1:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_1_shader",2:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_2_shader",3:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_3_shader",4:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_4_shader",5:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_5_shader",6:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_6_shader",7:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_7_shader",8:"pv_picollm_weight_block_mixed_16x8_forward_single_bit_depth_8_shader"};var forwardShaderSources={1:forwardMultipleShaderSources(1),2:forwardMultipleShaderSources(2),3:forwardMultipleShaderSources(3),4:forwardMultipleShaderSources(4),5:forwardMultipleShaderSources(5),6:forwardMultipleShaderSources(6),7:forwardMultipleShaderSources(7),8:forwardMultipleShaderSources(8)};var forwardShaderNames={1:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_1_shader",2:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_2_shader",3:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_3_shader",4:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_4_shader",5:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_5_shader",6:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_6_shader",7:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_7_shader",8:"pv_picollm_weight_block_mixed_16x8_forward_multiple_bit_depth_8_shader"};var forwardShuffleXShaderName="pv_picollm_weight_block_mixed_16x8_forward_shuffle_x_shader";var forwardShuffleYShaderName="pv_picollm_weight_block_mixed_16x8_forward_shuffle_y_shader";var addBiasShaderName="pv_picollm_weight_block_mixed_16x8_add_bias_shader";var forwardSingleReduceYShaderName="pv_picollm_weight_block_mixed_16x8_forward_single_reduce_y_shader";var _weightBlockMixed16x;var loadPreprocessBlocksShader=function loadPreprocessBlocksShader(device,bitDepth){var bindGroupLayout=device.createBindGroupLayout({label:"weight preprocess blocks ".concat(bitDepth," bind group layout"),entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight preprocess blocks ".concat(bitDepth," pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight preprocess blocks ".concat(bitDepth," shader module"),code:preprocessShaderSources[bitDepth]});var computePipeline=device.createComputePipeline({label:"weight preprocess blocks ".concat(bitDepth," pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:preprocessDim,workgroup_size_y:preprocessDim}}});return{computePipeline:computePipeline}};var loadForwardShuffleXShader=function loadForwardShuffleXShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight shuffle x bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight shuffle x pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight shuffle x shader module",code:forwardShuffleXShaderSource});var computePipeline=device.createComputePipeline({label:"weight shuffle x pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_y:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var loadForwardSingleReduceYShader=function loadForwardSingleReduceYShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight single reduce y bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight single reduce y pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight single reduce y shader module",code:forwardSingleReduceYShaderSource});var computePipeline=device.createComputePipeline({label:"weight single reduce y pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:PV_PICOLLM_WEBGPU_DEFAULT_WORKGROUP_SIZE}}});return{computePipeline:computePipeline}};var loadForwardShuffleYShader=function loadForwardShuffleYShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight shuffle y bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight shuffle y pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight shuffle y shader module",code:forwardShuffleYShaderSource});var computePipeline=device.createComputePipeline({label:"weight shuffle y pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var loadForwardSingleShader=function loadForwardSingleShader(device,bitDepth){var entries=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}];var bindGroupLayout=device.createBindGroupLayout({label:"weight forward single ".concat(bitDepth," bind group layout"),entries:entries});var pipelineLayout=device.createPipelineLayout({label:"weight forward single ".concat(bitDepth," pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight forward single ".concat(bitDepth," shader module"),code:forwardSingleShaderSources[bitDepth]});var computePipeline=device.createComputePipeline({label:"weight forward single ".concat(bitDepth," pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:weightBlockSize,workgroup_size_y:1}}});return{computePipeline:computePipeline}};var loadForwardShader=function loadForwardShader(device,bitDepth){var entries=[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:3,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:4,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}];var bindGroupLayout=device.createBindGroupLayout({label:"weight forward multi ".concat(bitDepth," bind group layout"),entries:entries});var pipelineLayout=device.createPipelineLayout({label:"weight forward multi ".concat(bitDepth," pipeline layout"),bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight forward multi ".concat(bitDepth," shader module"),code:forwardShaderSources[bitDepth]});var computePipeline=device.createComputePipeline({label:"weight forward multi ".concat(bitDepth," pipeline"),layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint,constants:{workgroup_size_x:TC}}});return{computePipeline:computePipeline}};var loadAddBiasShader=function loadAddBiasShader(device){var bindGroupLayout=device.createBindGroupLayout({label:"weight add bias bind group layout",entries:[{binding:0,visibility:GPUShaderStage.COMPUTE,buffer:{type:"uniform"}},{binding:1,visibility:GPUShaderStage.COMPUTE,buffer:{type:"read-only-storage"}},{binding:2,visibility:GPUShaderStage.COMPUTE,buffer:{type:"storage"}}]});var pipelineLayout=device.createPipelineLayout({label:"weight add bias pipeline layout",bindGroupLayouts:[bindGroupLayout]});var shaderModule=device.createShaderModule({label:"weight add bias shader module",code:addBiasShaderSource});var computePipeline=device.createComputePipeline({label:"weight add bias pipeline",layout:pipelineLayout,compute:{module:shaderModule,entryPoint:shaderEntryPoint}});return{computePipeline:computePipeline}};var weightBlockMixed16x8Shaders=(_weightBlockMixed16x={},_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_weightBlockMixed16x,preprocessShaderNames[3],function(device){return loadPreprocessBlocksShader(device,3)}),preprocessShaderNames[5],function(device){return loadPreprocessBlocksShader(device,5)}),preprocessShaderNames[6],function(device){return loadPreprocessBlocksShader(device,6)}),preprocessShaderNames[7],function(device){return loadPreprocessBlocksShader(device,7)}),forwardShuffleXShaderName,loadForwardShuffleXShader),forwardShuffleYShaderName,loadForwardShuffleYShader),forwardSingleReduceYShaderName,loadForwardSingleReduceYShader),forwardSingleShaderNames[1],function(device){return loadForwardSingleShader(device,1)}),forwardSingleShaderNames[2],function(device){return loadForwardSingleShader(device,2)}),forwardSingleShaderNames[3],function(device){return loadForwardSingleShader(device,3)}),_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_weightBlockMixed16x,forwardSingleShaderNames[4],function(device){return loadForwardSingleShader(device,4)}),forwardSingleShaderNames[5],function(device){return loadForwardSingleShader(device,5)}),forwardSingleShaderNames[6],function(device){return loadForwardSingleShader(device,6)}),forwardSingleShaderNames[7],function(device){return loadForwardSingleShader(device,7)}),forwardSingleShaderNames[8],function(device){return loadForwardSingleShader(device,8)}),forwardShaderNames[1],function(device){return loadForwardShader(device,1)}),forwardShaderNames[2],function(device){return loadForwardShader(device,2)}),forwardShaderNames[3],function(device){return loadForwardShader(device,3)}),forwardShaderNames[4],function(device){return loadForwardShader(device,4)}),forwardShaderNames[5],function(device){return loadForwardShader(device,5)}),_defineProperty(_defineProperty(_defineProperty(_defineProperty(_weightBlockMixed16x,forwardShaderNames[6],function(device){return loadForwardShader(device,6)}),forwardShaderNames[7],function(device){return loadForwardShader(device,7)}),forwardShaderNames[8],function(device){return loadForwardShader(device,8)}),addBiasShaderName,loadAddBiasShader));function ownKeys$1(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread$1(e){for(var r=1;r=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e1&&_args[1]!==undefined?_args[1]:{};time=_args.length>2&&_args[2]!==undefined?_args[2]:5e3;controller=new AbortController;config=_objectSpread(_objectSpread({},options),{},{signal:controller.signal});timeout=setTimeout(function(){controller.abort()},time);_context.next=7;return fetch(uri,config);case 7:response=_context.sent;clearTimeout(timeout);return _context.abrupt("return",response);case 10:case"end":return _context.stop()}},_callee)}));return _fetchWithTimeout.apply(this,arguments)}function open(_x2,_x3){return _open.apply(this,arguments)}function _open(){_open=_asyncToGenerator(_regeneratorRuntime.mark(function _callee2(path,mode){var error;return _regeneratorRuntime.wrap(function _callee2$(_context2){while(1)switch(_context2.prev=_context2.next){case 0:_context2.prev=0;_context2.next=3;return PvFileIDB.open(path,mode);case 3:return _context2.abrupt("return",_context2.sent);case 6:_context2.prev=6;_context2.t0=_context2["catch"](0);if(_context2.t0.name==="IndexedDBNotSupported"){console.warn("IndexedDB is not supported. Fallback to in-memory storage.")}else if(_context2.t0.name!=="FileNotExists"){console.warn("Unable to access IndexedDB (".concat(_context2.t0.toString(),"). Fallback to in-memory storage."))}if(!(typeof WorkerGlobalScope!=="undefined"&&self instanceof WorkerGlobalScope)){_context2.next=16;break}if(!(_context2.t0.name==="FileNotExists")){_context2.next=12;break}throw _context2.t0;case 12:console.error("In-memory storage cannot be used inside a worker.");error=new Error("Failed to start PvFile: ".concat(_context2.t0.toString()));error.name="PvFileNotSupported";throw error;case 16:return _context2.abrupt("return",PvFileMem.open(path,mode));case 17:case"end":return _context2.stop()}},_callee2,null,[[0,6]])}));return _open.apply(this,arguments)}var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=url=>{if(isFileURI(url)){return new Promise((reject,resolve)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response)}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}return fetch(url,{credentials:"same-origin"}).then(response=>{if(response.ok){return response.arrayBuffer()}return Promise.reject(new Error(response.status+" : "+response.url))})}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith("file://");function findWasmBinary(){var f="pv_orca_simd.wasm";if(!isDataURI(f)){return locateFile(f)}return f}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary){return readAsync(binaryFile).then(response=>new Uint8Array(response),()=>getBinarySync(binaryFile))}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function getWasmImports(){return{a:wasmImports}}function createWasm(){var info=getWasmImports();function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=Asyncify.instrumentWasmExports(wasmExports);wasmMemory=wasmExports["v"];updateMemoryViews();wasmTable=wasmExports["Ib"];addOnInit(wasmExports["w"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}if(!wasmBinaryFile)wasmBinaryFile=findWasmBinary();instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var noExitRuntime=Module["noExitRuntime"]||true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();function syscallGetVarargI(){var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key of Object.keys(node.contents)){entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url).then(arrayBuffer=>{onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},err=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)};var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,processData,onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:class{constructor(errno){this.name="ErrnoError";this.errno=errno}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev;this.readMode=292|73;this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;iFS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""});FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS:MEMFS}},init(input,output,error){FS.init.initialized=true;Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit(){FS.init.initialized=false;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat(func,path,buf){var stat=func(path);HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;HEAP64[buf+24>>3]=BigInt(stat.size);HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>2]=atime%1e3*1e3;HEAP64[buf+56>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>2]=mtime%1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>2]=ctime%1e3*1e3;HEAP64[buf+88>>3]=BigInt(stat.ino);return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>{abort("")};var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var __tzset_js=(timezone,daylight,std_name,dst_name)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffset2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToAscii=(str,buffer)=>{for(var i=0;i{var bufSize=0;getEnvStrings().forEach((string,i)=>{var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(string=>bufSize+=string.length+1);HEAPU32[penviron_buf_size>>2]=bufSize;return 0};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(typeof offset!="undefined"){offset+=curr}}return ret};function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _pv_console_log_wasm(index){console.log(arrayBufferToStringAtIndex(Module.HEAPU8,index))}var _pv_file_close_wasm=async function(fileAddress,statusAddress){statusAddress=unsignedAddress(statusAddress);return Asyncify.handleAsync(async()=>{try{const file=await PvFile.getPtr(fileAddress);await file.close();setInt(statusAddress,0)}catch(e){console.error("pvFileCloseWasm",e);setInt(statusAddress,-1)}})};_pv_file_close_wasm.isAsync=true;var _pv_file_open_wasm=async function(fileAddress,pathAddress,modeAddress,statusAddress){pathAddress=unsignedAddress(pathAddress);modeAddress=unsignedAddress(modeAddress);statusAddress=unsignedAddress(statusAddress);return Asyncify.handleAsync(async()=>{const path=arrayBufferToStringAtIndex(Module.HEAPU8,pathAddress);const mode=arrayBufferToStringAtIndex(Module.HEAPU8,modeAddress);try{const file=await open(path,mode);PvFile.setPtr(fileAddress,file);setInt(statusAddress,0)}catch(e){if(e.name!=="FileNotExists"){console.error("pvFileOpenWasm",e)}setInt(statusAddress,-1)}})};_pv_file_open_wasm.isAsync=true;var _pv_file_read_wasm=async function(fileAddress,contentAddress,size,count,numReadAddress){contentAddress=unsignedAddress(contentAddress);numReadAddress=unsignedAddress(numReadAddress);return Asyncify.handleAsync(async()=>{try{const file=PvFile.getPtr(fileAddress);const content=await file.read(size,count);Module.HEAPU8.set(content,contentAddress);setInt(numReadAddress,content.length/size)}catch(e){console.error("pvFileReadWasm",e);setInt(numReadAddress,-1)}})};_pv_file_read_wasm.isAsync=true;function _pv_file_seek_wasm(fileAddress,offset,whence,statusAddress){statusAddress=unsignedAddress(statusAddress);try{const file=PvFile.getPtr(fileAddress);file.seek(offset,whence);setInt(statusAddress,0)}catch(e){console.error("pvFileSeekWasm",e);setInt(statusAddress,-1)}}function _pv_file_tell_wasm(fileAddress,offsetAddress){offsetAddress=unsignedAddress(offsetAddress);try{const file=PvFile.getPtr(fileAddress);setInt(offsetAddress,file.tell())}catch(e){console.error("pvFileTellWasm",e);setInt(offsetAddress,-1)}}var _pv_file_write_wasm=function(fileAddress,contentAddress,size,count,numWriteAddress){contentAddress=unsignedAddress(contentAddress);numWriteAddress=unsignedAddress(numWriteAddress);return Asyncify.handleAsync(async()=>{try{const file=PvFile.getPtr(fileAddress);const content=new Uint8Array(size*count);content.set(Module.HEAPU8.slice(contentAddress,contentAddress+size*count),0);await file.write(content);setInt(numWriteAddress,content.length/size)}catch(e){console.error("pvFileWriteWasm",e);setInt(numWriteAddress,-1)}})};var _pv_https_request_wasm=async function(httpMethodAddress,serverNameAddress,endpointAddress,headerAddress,bodyAddress,timeoutMs,responseAddressAddress,responseSizeAddress,responseCodeAddress){httpMethodAddress=unsignedAddress(httpMethodAddress);serverNameAddress=unsignedAddress(serverNameAddress);endpointAddress=unsignedAddress(endpointAddress);headerAddress=unsignedAddress(headerAddress);bodyAddress=unsignedAddress(bodyAddress);responseAddressAddress=unsignedAddress(responseAddressAddress);responseSizeAddress=unsignedAddress(responseSizeAddress);responseCodeAddress=unsignedAddress(responseCodeAddress);return Asyncify.handleAsync(async()=>{const httpMethod=arrayBufferToStringAtIndex(Module.HEAPU8,httpMethodAddress);const serverName=arrayBufferToStringAtIndex(Module.HEAPU8,serverNameAddress);const endpoint=arrayBufferToStringAtIndex(Module.HEAPU8,endpointAddress);const header=arrayBufferToStringAtIndex(Module.HEAPU8,headerAddress);const body=arrayBufferToStringAtIndex(Module.HEAPU8,bodyAddress);const headerObject=stringHeaderToObject(header);const options={method:httpMethod};if(body.length>0){options.body=body}if(Object.keys(headerObject).length>0){options.headers=headerObject}let response;let responseText;let statusCode;try{response=await fetchWithTimeout("https://"+serverName+endpoint,options,timeoutMs);statusCode=response.status}catch(error){console.error("pvHttpsRequestWasm",`Failed to fetch: ${error}`);return}try{responseText=await response.text()}catch(error){console.error("pvHttpsRequestWasm",`Failed to get response text: ${error}`);return}const responseAddress=Module._malloc((responseText.length+1)*Int8Array.BYTES_PER_ELEMENT);if(responseAddress===0){console.error("pvMallocError","pvHttpsRequestWasm: cannot allocate memory for response");setInt(responseAddressAddress,0);return}setInt(responseSizeAddress,responseText.length+1);setInt(responseAddressAddress,responseAddress);for(let i=0;i{try{return func()}catch(e){abort(e)}};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var sigToWasmTypes=sig=>{var typeNames={i:"i32",j:"i64",f:"f32",d:"f64",e:"externref",p:"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i{runtimeKeepaliveCounter+=1};var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};var Asyncify={instrumentWasmImports(imports){var importPattern=/^(pv_https_request_wasm|pv_file_open_wasm|pv_file_close_wasm|pv_file_read_wasm|pv_file_write_wasm|pv_file_remove_wasm|pv_sleep_wasm|pv_xpu_webgpu_device_init_wasm|pv_xpu_webgpu_device_info_wasm|pv_xpu_webgpu_device_mem_copy_from_xpu_wasm|pv_xpu_webgpu_device_wait_wasm|pv_xpu_webgpu_timer_stop_wasm|invoke_.*|__asyncjs__.*)$/;for(let[x,original]of Object.entries(imports)){if(typeof original=="function"){let isAsyncifyImport=original.isAsync||importPattern.test(x)}}},instrumentWasmExports(exports){var ret={};for(let[x,original]of Object.entries(exports)){if(typeof original=="function"){ret[x]=(...args)=>{Asyncify.exportCallStack.push(x);try{return original(...args)}finally{if(!ABORT){var y=Asyncify.exportCallStack.pop();Asyncify.maybeStopUnwind()}}}}else{ret[x]=original}}return ret},State:{Normal:0,Unwinding:1,Rewinding:2,Disabled:3},state:0,StackSize:4096,currData:null,handleSleepReturnValue:0,exportCallStack:[],callStackNameToId:{},callStackIdToName:{},callStackId:0,asyncPromiseHandlers:null,sleepCallbacks:[],getCallStackId(funcName){var id=Asyncify.callStackNameToId[funcName];if(id===undefined){id=Asyncify.callStackId++;Asyncify.callStackNameToId[funcName]=id;Asyncify.callStackIdToName[id]=funcName}return id},maybeStopUnwind(){if(Asyncify.currData&&Asyncify.state===Asyncify.State.Unwinding&&Asyncify.exportCallStack.length===0){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_unwind);if(typeof Fibers!="undefined"){Fibers.trampoline()}}},whenDone(){return new Promise((resolve,reject)=>{Asyncify.asyncPromiseHandlers={resolve:resolve,reject:reject}})},allocateData(){var ptr=_malloc(12+Asyncify.StackSize);Asyncify.setDataHeader(ptr,ptr+12,Asyncify.StackSize);Asyncify.setDataRewindFunc(ptr);return ptr},setDataHeader(ptr,stack,stackSize){HEAPU32[ptr>>2]=stack;HEAPU32[ptr+4>>2]=stack+stackSize},setDataRewindFunc(ptr){var bottomOfCallStack=Asyncify.exportCallStack[0];var rewindId=Asyncify.getCallStackId(bottomOfCallStack);HEAP32[ptr+8>>2]=rewindId},getDataRewindFuncName(ptr){var id=HEAP32[ptr+8>>2];var name=Asyncify.callStackIdToName[id];return name},getDataRewindFunc(name){var func=wasmExports[name];return func},doRewind(ptr){var name=Asyncify.getDataRewindFuncName(ptr);var func=Asyncify.getDataRewindFunc(name);return func()},handleSleep(startAsync){if(ABORT)return;if(Asyncify.state===Asyncify.State.Normal){var reachedCallback=false;var reachedAfterCallback=false;startAsync((handleSleepReturnValue=0)=>{if(ABORT)return;Asyncify.handleSleepReturnValue=handleSleepReturnValue;reachedCallback=true;if(!reachedAfterCallback){return}Asyncify.state=Asyncify.State.Rewinding;runAndAbortIfError(()=>_asyncify_start_rewind(Asyncify.currData));if(typeof Browser!="undefined"&&Browser.mainLoop.func){Browser.mainLoop.resume()}var asyncWasmReturnValue,isError=false;try{asyncWasmReturnValue=Asyncify.doRewind(Asyncify.currData)}catch(err){asyncWasmReturnValue=err;isError=true}var handled=false;if(!Asyncify.currData){var asyncPromiseHandlers=Asyncify.asyncPromiseHandlers;if(asyncPromiseHandlers){Asyncify.asyncPromiseHandlers=null;(isError?asyncPromiseHandlers.reject:asyncPromiseHandlers.resolve)(asyncWasmReturnValue);handled=true}}if(isError&&!handled){throw asyncWasmReturnValue}});reachedAfterCallback=true;if(!reachedCallback){Asyncify.state=Asyncify.State.Unwinding;Asyncify.currData=Asyncify.allocateData();if(typeof Browser!="undefined"&&Browser.mainLoop.func){Browser.mainLoop.pause()}runAndAbortIfError(()=>_asyncify_start_unwind(Asyncify.currData))}}else if(Asyncify.state===Asyncify.State.Rewinding){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_rewind);_free(Asyncify.currData);Asyncify.currData=null;Asyncify.sleepCallbacks.forEach(callUserCallback)}else{abort(`invalid state: ${Asyncify.state}`)}return Asyncify.handleSleepReturnValue},handleAsync(startAsync){return Asyncify.handleSleep(wakeUp=>{startAsync().then(wakeUp)})}};var uleb128Encode=(n,target)=>{if(n<128){target.push(n)}else{target.push(n%128|128,n>>7)}};var generateFuncType=(sig,target)=>{var sigRet=sig.slice(0,1);var sigParam=sig.slice(1);var typeCodes={i:127,p:127,j:126,f:125,d:124,e:111};target.push(96);uleb128Encode(sigParam.length,target);for(var i=0;i{if(typeof WebAssembly.Function=="function"){return new WebAssembly.Function(sigToWasmTypes(sig),func)}var typeSectionBody=[1];generateFuncType(sig,typeSectionBody);var bytes=[0,97,115,109,1,0,0,0,1];uleb128Encode(typeSectionBody.length,bytes);bytes.push(...typeSectionBody);bytes.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);var module=new WebAssembly.Module(new Uint8Array(bytes));var instance=new WebAssembly.Instance(module,{e:{f:func}});var wrappedFunc=instance.exports["f"];return wrappedFunc};var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var updateTableMap=(offset,count)=>{if(functionsInTableMap){for(var i=offset;i{if(!functionsInTableMap){functionsInTableMap=new WeakMap;updateTableMap(0,wasmTable.length)}return functionsInTableMap.get(func)||0};var freeTableIndexes=[];var getEmptyTableSlot=()=>{if(freeTableIndexes.length){return freeTableIndexes.pop()}try{wasmTable.grow(1)}catch(err){if(!(err instanceof RangeError)){throw err}throw"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH."}return wasmTable.length-1};var setWasmTableEntry=(idx,func)=>{wasmTable.set(idx,func);wasmTableMirror[idx]=wasmTable.get(idx)};var addFunction=(func,sig)=>{var rtn=getFunctionAddress(func);if(rtn){return rtn}var ret=getEmptyTableSlot();try{setWasmTableEntry(ret,func)}catch(err){if(!(err instanceof TypeError)){throw err}var wrapped=convertJsFunctionToWasm(func,sig);setWasmTableEntry(ret,wrapped)}functionsInTableMap.set(func,ret);return ret};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};Module["cwrap"]=cwrap;FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();xpu_cpu_support();var wasmImports={g:___syscall_openat,h:__abort_js,s:__tzset_js,p:_emscripten_resize_heap,q:_environ_get,r:_environ_sizes_get,c:_exit,b:_fd_close,f:_fd_read,t:_fd_seek,a:_fd_write,e:_pv_console_log_wasm,n:_pv_file_close_wasm,o:_pv_file_open_wasm,d:_pv_file_read_wasm,m:_pv_file_seek_wasm,l:_pv_file_tell_wasm,j:_pv_file_write_wasm,i:_pv_https_request_wasm,u:_pv_time_wasm,k:_pv_xpu_get_max_workers_wasm};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["w"])();var __Znwm=Module["__Znwm"]=a0=>(__Znwm=Module["__Znwm"]=wasmExports["x"])(a0);var __Znam=Module["__Znam"]=a0=>(__Znam=Module["__Znam"]=wasmExports["y"])(a0);var __ZdlPv=Module["__ZdlPv"]=a0=>(__ZdlPv=Module["__ZdlPv"]=wasmExports["z"])(a0);var __ZdlPvm=Module["__ZdlPvm"]=(a0,a1)=>(__ZdlPvm=Module["__ZdlPvm"]=wasmExports["A"])(a0,a1);var __ZdaPv=Module["__ZdaPv"]=a0=>(__ZdaPv=Module["__ZdaPv"]=wasmExports["B"])(a0);var __ZdaPvm=Module["__ZdaPvm"]=(a0,a1)=>(__ZdaPvm=Module["__ZdaPvm"]=wasmExports["C"])(a0,a1);var __ZnwmSt11align_val_t=Module["__ZnwmSt11align_val_t"]=(a0,a1)=>(__ZnwmSt11align_val_t=Module["__ZnwmSt11align_val_t"]=wasmExports["D"])(a0,a1);var __ZnamSt11align_val_t=Module["__ZnamSt11align_val_t"]=(a0,a1)=>(__ZnamSt11align_val_t=Module["__ZnamSt11align_val_t"]=wasmExports["E"])(a0,a1);var __ZdlPvSt11align_val_t=Module["__ZdlPvSt11align_val_t"]=(a0,a1)=>(__ZdlPvSt11align_val_t=Module["__ZdlPvSt11align_val_t"]=wasmExports["F"])(a0,a1);var __ZdlPvmSt11align_val_t=Module["__ZdlPvmSt11align_val_t"]=(a0,a1,a2)=>(__ZdlPvmSt11align_val_t=Module["__ZdlPvmSt11align_val_t"]=wasmExports["G"])(a0,a1,a2);var __ZdaPvSt11align_val_t=Module["__ZdaPvSt11align_val_t"]=(a0,a1)=>(__ZdaPvSt11align_val_t=Module["__ZdaPvSt11align_val_t"]=wasmExports["H"])(a0,a1);var __ZdaPvmSt11align_val_t=Module["__ZdaPvmSt11align_val_t"]=(a0,a1,a2)=>(__ZdaPvmSt11align_val_t=Module["__ZdaPvmSt11align_val_t"]=wasmExports["I"])(a0,a1,a2);var __ZSt14set_unexpectedPFvvE=Module["__ZSt14set_unexpectedPFvvE"]=a0=>(__ZSt14set_unexpectedPFvvE=Module["__ZSt14set_unexpectedPFvvE"]=wasmExports["J"])(a0);var __ZSt13set_terminatePFvvE=Module["__ZSt13set_terminatePFvvE"]=a0=>(__ZSt13set_terminatePFvvE=Module["__ZSt13set_terminatePFvvE"]=wasmExports["K"])(a0);var __ZSt15set_new_handlerPFvvE=Module["__ZSt15set_new_handlerPFvvE"]=a0=>(__ZSt15set_new_handlerPFvvE=Module["__ZSt15set_new_handlerPFvvE"]=wasmExports["L"])(a0);var __ZSt14get_unexpectedv=Module["__ZSt14get_unexpectedv"]=()=>(__ZSt14get_unexpectedv=Module["__ZSt14get_unexpectedv"]=wasmExports["M"])();var __ZSt10unexpectedv=Module["__ZSt10unexpectedv"]=()=>(__ZSt10unexpectedv=Module["__ZSt10unexpectedv"]=wasmExports["N"])();var __ZSt13get_terminatev=Module["__ZSt13get_terminatev"]=()=>(__ZSt13get_terminatev=Module["__ZSt13get_terminatev"]=wasmExports["O"])();var __ZSt9terminatev=Module["__ZSt9terminatev"]=()=>(__ZSt9terminatev=Module["__ZSt9terminatev"]=wasmExports["P"])();var __ZSt15get_new_handlerv=Module["__ZSt15get_new_handlerv"]=()=>(__ZSt15get_new_handlerv=Module["__ZSt15get_new_handlerv"]=wasmExports["Q"])();var ___cxa_current_primary_exception=Module["___cxa_current_primary_exception"]=()=>(___cxa_current_primary_exception=Module["___cxa_current_primary_exception"]=wasmExports["R"])();var ___cxa_rethrow_primary_exception=Module["___cxa_rethrow_primary_exception"]=a0=>(___cxa_rethrow_primary_exception=Module["___cxa_rethrow_primary_exception"]=wasmExports["S"])(a0);var ___cxa_uncaught_exception=Module["___cxa_uncaught_exception"]=()=>(___cxa_uncaught_exception=Module["___cxa_uncaught_exception"]=wasmExports["T"])();var ___cxa_uncaught_exceptions=Module["___cxa_uncaught_exceptions"]=()=>(___cxa_uncaught_exceptions=Module["___cxa_uncaught_exceptions"]=wasmExports["U"])();var ___cxa_allocate_exception=Module["___cxa_allocate_exception"]=a0=>(___cxa_allocate_exception=Module["___cxa_allocate_exception"]=wasmExports["V"])(a0);var ___cxa_free_exception=Module["___cxa_free_exception"]=a0=>(___cxa_free_exception=Module["___cxa_free_exception"]=wasmExports["W"])(a0);var ___cxa_init_primary_exception=Module["___cxa_init_primary_exception"]=(a0,a1,a2)=>(___cxa_init_primary_exception=Module["___cxa_init_primary_exception"]=wasmExports["X"])(a0,a1,a2);var ___cxa_pure_virtual=Module["___cxa_pure_virtual"]=()=>(___cxa_pure_virtual=Module["___cxa_pure_virtual"]=wasmExports["Y"])();var ___cxa_deleted_virtual=Module["___cxa_deleted_virtual"]=()=>(___cxa_deleted_virtual=Module["___cxa_deleted_virtual"]=wasmExports["Z"])();var ___dynamic_cast=Module["___dynamic_cast"]=(a0,a1,a2,a3)=>(___dynamic_cast=Module["___dynamic_cast"]=wasmExports["_"])(a0,a1,a2,a3);var __ZNSt9exceptionD2Ev=Module["__ZNSt9exceptionD2Ev"]=a0=>(__ZNSt9exceptionD2Ev=Module["__ZNSt9exceptionD2Ev"]=wasmExports["$"])(a0);var __ZNSt9exceptionD0Ev=Module["__ZNSt9exceptionD0Ev"]=a0=>(__ZNSt9exceptionD0Ev=Module["__ZNSt9exceptionD0Ev"]=wasmExports["aa"])(a0);var __ZNSt9exceptionD1Ev=Module["__ZNSt9exceptionD1Ev"]=a0=>(__ZNSt9exceptionD1Ev=Module["__ZNSt9exceptionD1Ev"]=wasmExports["ba"])(a0);var __ZNKSt9exception4whatEv=Module["__ZNKSt9exception4whatEv"]=a0=>(__ZNKSt9exception4whatEv=Module["__ZNKSt9exception4whatEv"]=wasmExports["ca"])(a0);var __ZNSt13bad_exceptionD0Ev=Module["__ZNSt13bad_exceptionD0Ev"]=a0=>(__ZNSt13bad_exceptionD0Ev=Module["__ZNSt13bad_exceptionD0Ev"]=wasmExports["da"])(a0);var __ZNSt13bad_exceptionD1Ev=Module["__ZNSt13bad_exceptionD1Ev"]=a0=>(__ZNSt13bad_exceptionD1Ev=Module["__ZNSt13bad_exceptionD1Ev"]=wasmExports["ea"])(a0);var __ZNKSt13bad_exception4whatEv=Module["__ZNKSt13bad_exception4whatEv"]=a0=>(__ZNKSt13bad_exception4whatEv=Module["__ZNKSt13bad_exception4whatEv"]=wasmExports["fa"])(a0);var __ZNSt9bad_allocC2Ev=Module["__ZNSt9bad_allocC2Ev"]=a0=>(__ZNSt9bad_allocC2Ev=Module["__ZNSt9bad_allocC2Ev"]=wasmExports["ga"])(a0);var __ZNSt9bad_allocD0Ev=Module["__ZNSt9bad_allocD0Ev"]=a0=>(__ZNSt9bad_allocD0Ev=Module["__ZNSt9bad_allocD0Ev"]=wasmExports["ha"])(a0);var __ZNSt9bad_allocD1Ev=Module["__ZNSt9bad_allocD1Ev"]=a0=>(__ZNSt9bad_allocD1Ev=Module["__ZNSt9bad_allocD1Ev"]=wasmExports["ia"])(a0);var __ZNKSt9bad_alloc4whatEv=Module["__ZNKSt9bad_alloc4whatEv"]=a0=>(__ZNKSt9bad_alloc4whatEv=Module["__ZNKSt9bad_alloc4whatEv"]=wasmExports["ja"])(a0);var __ZNSt20bad_array_new_lengthC2Ev=Module["__ZNSt20bad_array_new_lengthC2Ev"]=a0=>(__ZNSt20bad_array_new_lengthC2Ev=Module["__ZNSt20bad_array_new_lengthC2Ev"]=wasmExports["ka"])(a0);var __ZNSt20bad_array_new_lengthD0Ev=Module["__ZNSt20bad_array_new_lengthD0Ev"]=a0=>(__ZNSt20bad_array_new_lengthD0Ev=Module["__ZNSt20bad_array_new_lengthD0Ev"]=wasmExports["la"])(a0);var __ZNSt20bad_array_new_lengthD1Ev=Module["__ZNSt20bad_array_new_lengthD1Ev"]=a0=>(__ZNSt20bad_array_new_lengthD1Ev=Module["__ZNSt20bad_array_new_lengthD1Ev"]=wasmExports["ma"])(a0);var __ZNKSt20bad_array_new_length4whatEv=Module["__ZNKSt20bad_array_new_length4whatEv"]=a0=>(__ZNKSt20bad_array_new_length4whatEv=Module["__ZNKSt20bad_array_new_length4whatEv"]=wasmExports["na"])(a0);var __ZNSt13bad_exceptionD2Ev=Module["__ZNSt13bad_exceptionD2Ev"]=a0=>(__ZNSt13bad_exceptionD2Ev=Module["__ZNSt13bad_exceptionD2Ev"]=wasmExports["oa"])(a0);var __ZNSt9bad_allocC1Ev=Module["__ZNSt9bad_allocC1Ev"]=a0=>(__ZNSt9bad_allocC1Ev=Module["__ZNSt9bad_allocC1Ev"]=wasmExports["pa"])(a0);var __ZNSt9bad_allocD2Ev=Module["__ZNSt9bad_allocD2Ev"]=a0=>(__ZNSt9bad_allocD2Ev=Module["__ZNSt9bad_allocD2Ev"]=wasmExports["qa"])(a0);var __ZNSt20bad_array_new_lengthC1Ev=Module["__ZNSt20bad_array_new_lengthC1Ev"]=a0=>(__ZNSt20bad_array_new_lengthC1Ev=Module["__ZNSt20bad_array_new_lengthC1Ev"]=wasmExports["ra"])(a0);var __ZNSt20bad_array_new_lengthD2Ev=Module["__ZNSt20bad_array_new_lengthD2Ev"]=a0=>(__ZNSt20bad_array_new_lengthD2Ev=Module["__ZNSt20bad_array_new_lengthD2Ev"]=wasmExports["sa"])(a0);var __ZNSt11logic_errorD2Ev=Module["__ZNSt11logic_errorD2Ev"]=a0=>(__ZNSt11logic_errorD2Ev=Module["__ZNSt11logic_errorD2Ev"]=wasmExports["ta"])(a0);var __ZNSt11logic_errorD0Ev=Module["__ZNSt11logic_errorD0Ev"]=a0=>(__ZNSt11logic_errorD0Ev=Module["__ZNSt11logic_errorD0Ev"]=wasmExports["ua"])(a0);var __ZNSt11logic_errorD1Ev=Module["__ZNSt11logic_errorD1Ev"]=a0=>(__ZNSt11logic_errorD1Ev=Module["__ZNSt11logic_errorD1Ev"]=wasmExports["va"])(a0);var __ZNKSt11logic_error4whatEv=Module["__ZNKSt11logic_error4whatEv"]=a0=>(__ZNKSt11logic_error4whatEv=Module["__ZNKSt11logic_error4whatEv"]=wasmExports["wa"])(a0);var __ZNSt13runtime_errorD2Ev=Module["__ZNSt13runtime_errorD2Ev"]=a0=>(__ZNSt13runtime_errorD2Ev=Module["__ZNSt13runtime_errorD2Ev"]=wasmExports["xa"])(a0);var __ZNSt13runtime_errorD0Ev=Module["__ZNSt13runtime_errorD0Ev"]=a0=>(__ZNSt13runtime_errorD0Ev=Module["__ZNSt13runtime_errorD0Ev"]=wasmExports["ya"])(a0);var __ZNSt13runtime_errorD1Ev=Module["__ZNSt13runtime_errorD1Ev"]=a0=>(__ZNSt13runtime_errorD1Ev=Module["__ZNSt13runtime_errorD1Ev"]=wasmExports["za"])(a0);var __ZNKSt13runtime_error4whatEv=Module["__ZNKSt13runtime_error4whatEv"]=a0=>(__ZNKSt13runtime_error4whatEv=Module["__ZNKSt13runtime_error4whatEv"]=wasmExports["Aa"])(a0);var __ZNSt12domain_errorD0Ev=Module["__ZNSt12domain_errorD0Ev"]=a0=>(__ZNSt12domain_errorD0Ev=Module["__ZNSt12domain_errorD0Ev"]=wasmExports["Ba"])(a0);var __ZNSt12domain_errorD1Ev=Module["__ZNSt12domain_errorD1Ev"]=a0=>(__ZNSt12domain_errorD1Ev=Module["__ZNSt12domain_errorD1Ev"]=wasmExports["Ca"])(a0);var __ZNSt16invalid_argumentD0Ev=Module["__ZNSt16invalid_argumentD0Ev"]=a0=>(__ZNSt16invalid_argumentD0Ev=Module["__ZNSt16invalid_argumentD0Ev"]=wasmExports["Da"])(a0);var __ZNSt16invalid_argumentD1Ev=Module["__ZNSt16invalid_argumentD1Ev"]=a0=>(__ZNSt16invalid_argumentD1Ev=Module["__ZNSt16invalid_argumentD1Ev"]=wasmExports["Ea"])(a0);var __ZNSt12length_errorD0Ev=Module["__ZNSt12length_errorD0Ev"]=a0=>(__ZNSt12length_errorD0Ev=Module["__ZNSt12length_errorD0Ev"]=wasmExports["Fa"])(a0);var __ZNSt12length_errorD1Ev=Module["__ZNSt12length_errorD1Ev"]=a0=>(__ZNSt12length_errorD1Ev=Module["__ZNSt12length_errorD1Ev"]=wasmExports["Ga"])(a0);var __ZNSt12out_of_rangeD0Ev=Module["__ZNSt12out_of_rangeD0Ev"]=a0=>(__ZNSt12out_of_rangeD0Ev=Module["__ZNSt12out_of_rangeD0Ev"]=wasmExports["Ha"])(a0);var __ZNSt12out_of_rangeD1Ev=Module["__ZNSt12out_of_rangeD1Ev"]=a0=>(__ZNSt12out_of_rangeD1Ev=Module["__ZNSt12out_of_rangeD1Ev"]=wasmExports["Ia"])(a0);var __ZNSt11range_errorD0Ev=Module["__ZNSt11range_errorD0Ev"]=a0=>(__ZNSt11range_errorD0Ev=Module["__ZNSt11range_errorD0Ev"]=wasmExports["Ja"])(a0);var __ZNSt11range_errorD1Ev=Module["__ZNSt11range_errorD1Ev"]=a0=>(__ZNSt11range_errorD1Ev=Module["__ZNSt11range_errorD1Ev"]=wasmExports["Ka"])(a0);var __ZNSt14overflow_errorD0Ev=Module["__ZNSt14overflow_errorD0Ev"]=a0=>(__ZNSt14overflow_errorD0Ev=Module["__ZNSt14overflow_errorD0Ev"]=wasmExports["La"])(a0);var __ZNSt14overflow_errorD1Ev=Module["__ZNSt14overflow_errorD1Ev"]=a0=>(__ZNSt14overflow_errorD1Ev=Module["__ZNSt14overflow_errorD1Ev"]=wasmExports["Ma"])(a0);var __ZNSt15underflow_errorD0Ev=Module["__ZNSt15underflow_errorD0Ev"]=a0=>(__ZNSt15underflow_errorD0Ev=Module["__ZNSt15underflow_errorD0Ev"]=wasmExports["Na"])(a0);var __ZNSt15underflow_errorD1Ev=Module["__ZNSt15underflow_errorD1Ev"]=a0=>(__ZNSt15underflow_errorD1Ev=Module["__ZNSt15underflow_errorD1Ev"]=wasmExports["Oa"])(a0);var __ZNSt12domain_errorD2Ev=Module["__ZNSt12domain_errorD2Ev"]=a0=>(__ZNSt12domain_errorD2Ev=Module["__ZNSt12domain_errorD2Ev"]=wasmExports["Pa"])(a0);var __ZNSt16invalid_argumentD2Ev=Module["__ZNSt16invalid_argumentD2Ev"]=a0=>(__ZNSt16invalid_argumentD2Ev=Module["__ZNSt16invalid_argumentD2Ev"]=wasmExports["Qa"])(a0);var __ZNSt12length_errorD2Ev=Module["__ZNSt12length_errorD2Ev"]=a0=>(__ZNSt12length_errorD2Ev=Module["__ZNSt12length_errorD2Ev"]=wasmExports["Ra"])(a0);var __ZNSt12out_of_rangeD2Ev=Module["__ZNSt12out_of_rangeD2Ev"]=a0=>(__ZNSt12out_of_rangeD2Ev=Module["__ZNSt12out_of_rangeD2Ev"]=wasmExports["Sa"])(a0);var __ZNSt11range_errorD2Ev=Module["__ZNSt11range_errorD2Ev"]=a0=>(__ZNSt11range_errorD2Ev=Module["__ZNSt11range_errorD2Ev"]=wasmExports["Ta"])(a0);var __ZNSt14overflow_errorD2Ev=Module["__ZNSt14overflow_errorD2Ev"]=a0=>(__ZNSt14overflow_errorD2Ev=Module["__ZNSt14overflow_errorD2Ev"]=wasmExports["Ua"])(a0);var __ZNSt15underflow_errorD2Ev=Module["__ZNSt15underflow_errorD2Ev"]=a0=>(__ZNSt15underflow_errorD2Ev=Module["__ZNSt15underflow_errorD2Ev"]=wasmExports["Va"])(a0);var __ZNSt9type_infoD2Ev=Module["__ZNSt9type_infoD2Ev"]=a0=>(__ZNSt9type_infoD2Ev=Module["__ZNSt9type_infoD2Ev"]=wasmExports["Wa"])(a0);var __ZNSt9type_infoD0Ev=Module["__ZNSt9type_infoD0Ev"]=a0=>(__ZNSt9type_infoD0Ev=Module["__ZNSt9type_infoD0Ev"]=wasmExports["Xa"])(a0);var __ZNSt9type_infoD1Ev=Module["__ZNSt9type_infoD1Ev"]=a0=>(__ZNSt9type_infoD1Ev=Module["__ZNSt9type_infoD1Ev"]=wasmExports["Ya"])(a0);var __ZNSt8bad_castC2Ev=Module["__ZNSt8bad_castC2Ev"]=a0=>(__ZNSt8bad_castC2Ev=Module["__ZNSt8bad_castC2Ev"]=wasmExports["Za"])(a0);var __ZNSt8bad_castD2Ev=Module["__ZNSt8bad_castD2Ev"]=a0=>(__ZNSt8bad_castD2Ev=Module["__ZNSt8bad_castD2Ev"]=wasmExports["_a"])(a0);var __ZNSt8bad_castD0Ev=Module["__ZNSt8bad_castD0Ev"]=a0=>(__ZNSt8bad_castD0Ev=Module["__ZNSt8bad_castD0Ev"]=wasmExports["$a"])(a0);var __ZNSt8bad_castD1Ev=Module["__ZNSt8bad_castD1Ev"]=a0=>(__ZNSt8bad_castD1Ev=Module["__ZNSt8bad_castD1Ev"]=wasmExports["ab"])(a0);var __ZNKSt8bad_cast4whatEv=Module["__ZNKSt8bad_cast4whatEv"]=a0=>(__ZNKSt8bad_cast4whatEv=Module["__ZNKSt8bad_cast4whatEv"]=wasmExports["bb"])(a0);var __ZNSt10bad_typeidC2Ev=Module["__ZNSt10bad_typeidC2Ev"]=a0=>(__ZNSt10bad_typeidC2Ev=Module["__ZNSt10bad_typeidC2Ev"]=wasmExports["cb"])(a0);var __ZNSt10bad_typeidD2Ev=Module["__ZNSt10bad_typeidD2Ev"]=a0=>(__ZNSt10bad_typeidD2Ev=Module["__ZNSt10bad_typeidD2Ev"]=wasmExports["db"])(a0);var __ZNSt10bad_typeidD0Ev=Module["__ZNSt10bad_typeidD0Ev"]=a0=>(__ZNSt10bad_typeidD0Ev=Module["__ZNSt10bad_typeidD0Ev"]=wasmExports["eb"])(a0);var __ZNSt10bad_typeidD1Ev=Module["__ZNSt10bad_typeidD1Ev"]=a0=>(__ZNSt10bad_typeidD1Ev=Module["__ZNSt10bad_typeidD1Ev"]=wasmExports["fb"])(a0);var __ZNKSt10bad_typeid4whatEv=Module["__ZNKSt10bad_typeid4whatEv"]=a0=>(__ZNKSt10bad_typeid4whatEv=Module["__ZNKSt10bad_typeid4whatEv"]=wasmExports["gb"])(a0);var __ZNSt8bad_castC1Ev=Module["__ZNSt8bad_castC1Ev"]=a0=>(__ZNSt8bad_castC1Ev=Module["__ZNSt8bad_castC1Ev"]=wasmExports["hb"])(a0);var __ZNSt10bad_typeidC1Ev=Module["__ZNSt10bad_typeidC1Ev"]=a0=>(__ZNSt10bad_typeidC1Ev=Module["__ZNSt10bad_typeidC1Ev"]=wasmExports["ib"])(a0);var _pv_orca_init=Module["_pv_orca_init"]=(a0,a1,a2,a3)=>(_pv_orca_init=Module["_pv_orca_init"]=wasmExports["jb"])(a0,a1,a2,a3);var _free=a0=>(_free=wasmExports["kb"])(a0);var _pv_orca_delete=Module["_pv_orca_delete"]=a0=>(_pv_orca_delete=Module["_pv_orca_delete"]=wasmExports["lb"])(a0);var _pv_orca_version=Module["_pv_orca_version"]=()=>(_pv_orca_version=Module["_pv_orca_version"]=wasmExports["mb"])();var _pv_orca_valid_characters=Module["_pv_orca_valid_characters"]=(a0,a1,a2)=>(_pv_orca_valid_characters=Module["_pv_orca_valid_characters"]=wasmExports["nb"])(a0,a1,a2);var _malloc=Module["_malloc"]=a0=>(_malloc=Module["_malloc"]=wasmExports["ob"])(a0);var _pv_orca_sample_rate=Module["_pv_orca_sample_rate"]=(a0,a1)=>(_pv_orca_sample_rate=Module["_pv_orca_sample_rate"]=wasmExports["pb"])(a0,a1);var _pv_orca_word_alignments_delete=Module["_pv_orca_word_alignments_delete"]=(a0,a1)=>(_pv_orca_word_alignments_delete=Module["_pv_orca_word_alignments_delete"]=wasmExports["qb"])(a0,a1);var _pv_orca_synthesize=Module["_pv_orca_synthesize"]=(a0,a1,a2,a3,a4,a5,a6)=>(_pv_orca_synthesize=Module["_pv_orca_synthesize"]=wasmExports["rb"])(a0,a1,a2,a3,a4,a5,a6);var _pv_orca_synthesize_to_file=Module["_pv_orca_synthesize_to_file"]=(a0,a1,a2,a3,a4,a5)=>(_pv_orca_synthesize_to_file=Module["_pv_orca_synthesize_to_file"]=wasmExports["sb"])(a0,a1,a2,a3,a4,a5);var _pv_orca_pcm_delete=Module["_pv_orca_pcm_delete"]=a0=>(_pv_orca_pcm_delete=Module["_pv_orca_pcm_delete"]=wasmExports["tb"])(a0);var _pv_orca_synthesize_params_init=Module["_pv_orca_synthesize_params_init"]=a0=>(_pv_orca_synthesize_params_init=Module["_pv_orca_synthesize_params_init"]=wasmExports["ub"])(a0);var _pv_orca_synthesize_params_delete=Module["_pv_orca_synthesize_params_delete"]=a0=>(_pv_orca_synthesize_params_delete=Module["_pv_orca_synthesize_params_delete"]=wasmExports["vb"])(a0);var _pv_orca_synthesize_params_set_speech_rate=Module["_pv_orca_synthesize_params_set_speech_rate"]=(a0,a1)=>(_pv_orca_synthesize_params_set_speech_rate=Module["_pv_orca_synthesize_params_set_speech_rate"]=wasmExports["wb"])(a0,a1);var _pv_orca_synthesize_params_get_speech_rate=Module["_pv_orca_synthesize_params_get_speech_rate"]=(a0,a1)=>(_pv_orca_synthesize_params_get_speech_rate=Module["_pv_orca_synthesize_params_get_speech_rate"]=wasmExports["xb"])(a0,a1);var _pv_orca_synthesize_params_set_random_state=Module["_pv_orca_synthesize_params_set_random_state"]=(a0,a1)=>(_pv_orca_synthesize_params_set_random_state=Module["_pv_orca_synthesize_params_set_random_state"]=wasmExports["yb"])(a0,a1);var _pv_orca_synthesize_params_get_random_state=Module["_pv_orca_synthesize_params_get_random_state"]=(a0,a1)=>(_pv_orca_synthesize_params_get_random_state=Module["_pv_orca_synthesize_params_get_random_state"]=wasmExports["zb"])(a0,a1);var _pv_orca_valid_characters_delete=Module["_pv_orca_valid_characters_delete"]=a0=>(_pv_orca_valid_characters_delete=Module["_pv_orca_valid_characters_delete"]=wasmExports["Ab"])(a0);var _pv_orca_max_character_limit=Module["_pv_orca_max_character_limit"]=(a0,a1)=>(_pv_orca_max_character_limit=Module["_pv_orca_max_character_limit"]=wasmExports["Bb"])(a0,a1);var _pv_orca_stream_open=Module["_pv_orca_stream_open"]=(a0,a1,a2)=>(_pv_orca_stream_open=Module["_pv_orca_stream_open"]=wasmExports["Cb"])(a0,a1,a2);var _pv_orca_stream_close=Module["_pv_orca_stream_close"]=a0=>(_pv_orca_stream_close=Module["_pv_orca_stream_close"]=wasmExports["Db"])(a0);var _pv_orca_stream_synthesize=Module["_pv_orca_stream_synthesize"]=(a0,a1,a2,a3)=>(_pv_orca_stream_synthesize=Module["_pv_orca_stream_synthesize"]=wasmExports["Eb"])(a0,a1,a2,a3);var _pv_orca_stream_flush=Module["_pv_orca_stream_flush"]=(a0,a1,a2)=>(_pv_orca_stream_flush=Module["_pv_orca_stream_flush"]=wasmExports["Fb"])(a0,a1,a2);var _pv_orca_list_hardware_devices=Module["_pv_orca_list_hardware_devices"]=(a0,a1)=>(_pv_orca_list_hardware_devices=Module["_pv_orca_list_hardware_devices"]=wasmExports["Gb"])(a0,a1);var _pv_orca_free_hardware_devices=Module["_pv_orca_free_hardware_devices"]=(a0,a1)=>(_pv_orca_free_hardware_devices=Module["_pv_orca_free_hardware_devices"]=wasmExports["Hb"])(a0,a1);var _pv_status_to_string=Module["_pv_status_to_string"]=a0=>(_pv_status_to_string=Module["_pv_status_to_string"]=wasmExports["Jb"])(a0);var _pv_sample_rate=Module["_pv_sample_rate"]=()=>(_pv_sample_rate=Module["_pv_sample_rate"]=wasmExports["Kb"])();var _pv_log_enable=Module["_pv_log_enable"]=()=>(_pv_log_enable=Module["_pv_log_enable"]=wasmExports["Lb"])();var _pv_log_disable=Module["_pv_log_disable"]=()=>(_pv_log_disable=Module["_pv_log_disable"]=wasmExports["Mb"])();var _aligned_alloc=Module["_aligned_alloc"]=(a0,a1)=>(_aligned_alloc=Module["_aligned_alloc"]=wasmExports["Nb"])(a0,a1);var _pv_get_sdk=Module["_pv_get_sdk"]=()=>(_pv_get_sdk=Module["_pv_get_sdk"]=wasmExports["Ob"])();var _pv_set_sdk=Module["_pv_set_sdk"]=a0=>(_pv_set_sdk=Module["_pv_set_sdk"]=wasmExports["Pb"])(a0);var _pv_free=Module["_pv_free"]=a0=>(_pv_free=Module["_pv_free"]=wasmExports["Qb"])(a0);var _pv_get_error_stack=Module["_pv_get_error_stack"]=(a0,a1)=>(_pv_get_error_stack=Module["_pv_get_error_stack"]=wasmExports["Rb"])(a0,a1);var _pv_free_error_stack=Module["_pv_free_error_stack"]=a0=>(_pv_free_error_stack=Module["_pv_free_error_stack"]=wasmExports["Sb"])(a0);var __emscripten_memcpy_bulkmem=Module["__emscripten_memcpy_bulkmem"]=(a0,a1,a2)=>(__emscripten_memcpy_bulkmem=Module["__emscripten_memcpy_bulkmem"]=wasmExports["Tb"])(a0,a1,a2);var __emscripten_memset_bulkmem=Module["__emscripten_memset_bulkmem"]=(a0,a1,a2)=>(__emscripten_memset_bulkmem=Module["__emscripten_memset_bulkmem"]=wasmExports["Ub"])(a0,a1,a2);var __emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports["Vb"])(a0);var __emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports["Wb"])(a0);var _emscripten_stack_get_current=()=>(_emscripten_stack_get_current=wasmExports["Xb"])();var _asyncify_start_unwind=a0=>(_asyncify_start_unwind=wasmExports["Yb"])(a0);var _asyncify_stop_unwind=()=>(_asyncify_stop_unwind=wasmExports["Zb"])();var _asyncify_start_rewind=a0=>(_asyncify_start_rewind=wasmExports["_b"])(a0);var _asyncify_stop_rewind=()=>(_asyncify_stop_rewind=wasmExports["$b"])();var ___cxa_unexpected_handler=Module["___cxa_unexpected_handler"]=2373932;var ___cxa_terminate_handler=Module["___cxa_terminate_handler"]=2373928;var ___cxa_new_handler=Module["___cxa_new_handler"]=2380288;var __ZTIN10__cxxabiv116__shim_type_infoE=Module["__ZTIN10__cxxabiv116__shim_type_infoE"]=52044;var __ZTIN10__cxxabiv117__class_type_infoE=Module["__ZTIN10__cxxabiv117__class_type_infoE"]=52092;var __ZTIN10__cxxabiv117__pbase_type_infoE=Module["__ZTIN10__cxxabiv117__pbase_type_infoE"]=52140;var __ZTIDn=Module["__ZTIDn"]=52488;var __ZTIN10__cxxabiv119__pointer_type_infoE=Module["__ZTIN10__cxxabiv119__pointer_type_infoE"]=52188;var __ZTIv=Module["__ZTIv"]=52436;var __ZTIN10__cxxabiv120__function_type_infoE=Module["__ZTIN10__cxxabiv120__function_type_infoE"]=52240;var __ZTIN10__cxxabiv129__pointer_to_member_type_infoE=Module["__ZTIN10__cxxabiv129__pointer_to_member_type_infoE"]=52300;var __ZTSN10__cxxabiv116__shim_type_infoE=Module["__ZTSN10__cxxabiv116__shim_type_infoE"]=52008;var __ZTVN10__cxxabiv120__si_class_type_infoE=Module["__ZTVN10__cxxabiv120__si_class_type_infoE"]=53972;var __ZTSN10__cxxabiv117__class_type_infoE=Module["__ZTSN10__cxxabiv117__class_type_infoE"]=52056;var __ZTSN10__cxxabiv117__pbase_type_infoE=Module["__ZTSN10__cxxabiv117__pbase_type_infoE"]=52104;var __ZTSN10__cxxabiv119__pointer_type_infoE=Module["__ZTSN10__cxxabiv119__pointer_type_infoE"]=52152;var __ZTSN10__cxxabiv120__function_type_infoE=Module["__ZTSN10__cxxabiv120__function_type_infoE"]=52200;var __ZTSN10__cxxabiv129__pointer_to_member_type_infoE=Module["__ZTSN10__cxxabiv129__pointer_to_member_type_infoE"]=52252;var __ZTVN10__cxxabiv116__shim_type_infoE=Module["__ZTVN10__cxxabiv116__shim_type_infoE"]=52324;var __ZTVN10__cxxabiv123__fundamental_type_infoE=Module["__ZTVN10__cxxabiv123__fundamental_type_infoE"]=52352;var __ZTIN10__cxxabiv123__fundamental_type_infoE=Module["__ZTIN10__cxxabiv123__fundamental_type_infoE"]=52420;var __ZTSN10__cxxabiv123__fundamental_type_infoE=Module["__ZTSN10__cxxabiv123__fundamental_type_infoE"]=52380;var __ZTSv=Module["__ZTSv"]=52432;var __ZTSPv=Module["__ZTSPv"]=52444;var __ZTIPv=Module["__ZTIPv"]=52448;var __ZTVN10__cxxabiv119__pointer_type_infoE=Module["__ZTVN10__cxxabiv119__pointer_type_infoE"]=54184;var __ZTSPKv=Module["__ZTSPKv"]=52464;var __ZTIPKv=Module["__ZTIPKv"]=52468;var __ZTSDn=Module["__ZTSDn"]=52484;var __ZTSPDn=Module["__ZTSPDn"]=52496;var __ZTIPDn=Module["__ZTIPDn"]=52500;var __ZTSPKDn=Module["__ZTSPKDn"]=52516;var __ZTIPKDn=Module["__ZTIPKDn"]=52524;var __ZTSb=Module["__ZTSb"]=52540;var __ZTIb=Module["__ZTIb"]=52544;var __ZTSPb=Module["__ZTSPb"]=52552;var __ZTIPb=Module["__ZTIPb"]=52556;var __ZTSPKb=Module["__ZTSPKb"]=52572;var __ZTIPKb=Module["__ZTIPKb"]=52576;var __ZTSw=Module["__ZTSw"]=52592;var __ZTIw=Module["__ZTIw"]=52596;var __ZTSPw=Module["__ZTSPw"]=52604;var __ZTIPw=Module["__ZTIPw"]=52608;var __ZTSPKw=Module["__ZTSPKw"]=52624;var __ZTIPKw=Module["__ZTIPKw"]=52628;var __ZTSc=Module["__ZTSc"]=52644;var __ZTIc=Module["__ZTIc"]=52648;var __ZTSPc=Module["__ZTSPc"]=52656;var __ZTIPc=Module["__ZTIPc"]=52660;var __ZTSPKc=Module["__ZTSPKc"]=52676;var __ZTIPKc=Module["__ZTIPKc"]=52680;var __ZTSh=Module["__ZTSh"]=52696;var __ZTIh=Module["__ZTIh"]=52700;var __ZTSPh=Module["__ZTSPh"]=52708;var __ZTIPh=Module["__ZTIPh"]=52712;var __ZTSPKh=Module["__ZTSPKh"]=52728;var __ZTIPKh=Module["__ZTIPKh"]=52732;var __ZTSa=Module["__ZTSa"]=52748;var __ZTIa=Module["__ZTIa"]=52752;var __ZTSPa=Module["__ZTSPa"]=52760;var __ZTIPa=Module["__ZTIPa"]=52764;var __ZTSPKa=Module["__ZTSPKa"]=52780;var __ZTIPKa=Module["__ZTIPKa"]=52784;var __ZTSs=Module["__ZTSs"]=52800;var __ZTIs=Module["__ZTIs"]=52804;var __ZTSPs=Module["__ZTSPs"]=52812;var __ZTIPs=Module["__ZTIPs"]=52816;var __ZTSPKs=Module["__ZTSPKs"]=52832;var __ZTIPKs=Module["__ZTIPKs"]=52836;var __ZTSt=Module["__ZTSt"]=52852;var __ZTIt=Module["__ZTIt"]=52856;var __ZTSPt=Module["__ZTSPt"]=52864;var __ZTIPt=Module["__ZTIPt"]=52868;var __ZTSPKt=Module["__ZTSPKt"]=52884;var __ZTIPKt=Module["__ZTIPKt"]=52888;var __ZTSi=Module["__ZTSi"]=52904;var __ZTIi=Module["__ZTIi"]=52908;var __ZTSPi=Module["__ZTSPi"]=52916;var __ZTIPi=Module["__ZTIPi"]=52920;var __ZTSPKi=Module["__ZTSPKi"]=52936;var __ZTIPKi=Module["__ZTIPKi"]=52940;var __ZTSj=Module["__ZTSj"]=52956;var __ZTIj=Module["__ZTIj"]=52960;var __ZTSPj=Module["__ZTSPj"]=52968;var __ZTIPj=Module["__ZTIPj"]=52972;var __ZTSPKj=Module["__ZTSPKj"]=52988;var __ZTIPKj=Module["__ZTIPKj"]=52992;var __ZTSl=Module["__ZTSl"]=53008;var __ZTIl=Module["__ZTIl"]=53012;var __ZTSPl=Module["__ZTSPl"]=53020;var __ZTIPl=Module["__ZTIPl"]=53024;var __ZTSPKl=Module["__ZTSPKl"]=53040;var __ZTIPKl=Module["__ZTIPKl"]=53044;var __ZTSm=Module["__ZTSm"]=53060;var __ZTIm=Module["__ZTIm"]=53064;var __ZTSPm=Module["__ZTSPm"]=53072;var __ZTIPm=Module["__ZTIPm"]=53076;var __ZTSPKm=Module["__ZTSPKm"]=53092;var __ZTIPKm=Module["__ZTIPKm"]=53096;var __ZTSx=Module["__ZTSx"]=53112;var __ZTIx=Module["__ZTIx"]=53116;var __ZTSPx=Module["__ZTSPx"]=53124;var __ZTIPx=Module["__ZTIPx"]=53128;var __ZTSPKx=Module["__ZTSPKx"]=53144;var __ZTIPKx=Module["__ZTIPKx"]=53148;var __ZTSy=Module["__ZTSy"]=53164;var __ZTIy=Module["__ZTIy"]=53168;var __ZTSPy=Module["__ZTSPy"]=53176;var __ZTIPy=Module["__ZTIPy"]=53180;var __ZTSPKy=Module["__ZTSPKy"]=53196;var __ZTIPKy=Module["__ZTIPKy"]=53200;var __ZTSn=Module["__ZTSn"]=53216;var __ZTIn=Module["__ZTIn"]=53220;var __ZTSPn=Module["__ZTSPn"]=53228;var __ZTIPn=Module["__ZTIPn"]=53232;var __ZTSPKn=Module["__ZTSPKn"]=53248;var __ZTIPKn=Module["__ZTIPKn"]=53252;var __ZTSo=Module["__ZTSo"]=53268;var __ZTIo=Module["__ZTIo"]=53272;var __ZTSPo=Module["__ZTSPo"]=53280;var __ZTIPo=Module["__ZTIPo"]=53284;var __ZTSPKo=Module["__ZTSPKo"]=53300;var __ZTIPKo=Module["__ZTIPKo"]=53304;var __ZTSDh=Module["__ZTSDh"]=53320;var __ZTIDh=Module["__ZTIDh"]=53324;var __ZTSPDh=Module["__ZTSPDh"]=53332;var __ZTIPDh=Module["__ZTIPDh"]=53336;var __ZTSPKDh=Module["__ZTSPKDh"]=53352;var __ZTIPKDh=Module["__ZTIPKDh"]=53360;var __ZTSf=Module["__ZTSf"]=53376;var __ZTIf=Module["__ZTIf"]=53380;var __ZTSPf=Module["__ZTSPf"]=53388;var __ZTIPf=Module["__ZTIPf"]=53392;var __ZTSPKf=Module["__ZTSPKf"]=53408;var __ZTIPKf=Module["__ZTIPKf"]=53412;var __ZTSd=Module["__ZTSd"]=53428;var __ZTId=Module["__ZTId"]=53432;var __ZTSPd=Module["__ZTSPd"]=53440;var __ZTIPd=Module["__ZTIPd"]=53444;var __ZTSPKd=Module["__ZTSPKd"]=53460;var __ZTIPKd=Module["__ZTIPKd"]=53464;var __ZTSe=Module["__ZTSe"]=53480;var __ZTIe=Module["__ZTIe"]=53484;var __ZTSPe=Module["__ZTSPe"]=53492;var __ZTIPe=Module["__ZTIPe"]=53496;var __ZTSPKe=Module["__ZTSPKe"]=53512;var __ZTIPKe=Module["__ZTIPKe"]=53516;var __ZTSg=Module["__ZTSg"]=53532;var __ZTIg=Module["__ZTIg"]=53536;var __ZTSPg=Module["__ZTSPg"]=53544;var __ZTIPg=Module["__ZTIPg"]=53548;var __ZTSPKg=Module["__ZTSPKg"]=53564;var __ZTIPKg=Module["__ZTIPKg"]=53568;var __ZTSDu=Module["__ZTSDu"]=53584;var __ZTIDu=Module["__ZTIDu"]=53588;var __ZTSPDu=Module["__ZTSPDu"]=53596;var __ZTIPDu=Module["__ZTIPDu"]=53600;var __ZTSPKDu=Module["__ZTSPKDu"]=53616;var __ZTIPKDu=Module["__ZTIPKDu"]=53624;var __ZTSDs=Module["__ZTSDs"]=53640;var __ZTIDs=Module["__ZTIDs"]=53644;var __ZTSPDs=Module["__ZTSPDs"]=53652;var __ZTIPDs=Module["__ZTIPDs"]=53656;var __ZTSPKDs=Module["__ZTSPKDs"]=53672;var __ZTIPKDs=Module["__ZTIPKDs"]=53680;var __ZTSDi=Module["__ZTSDi"]=53696;var __ZTIDi=Module["__ZTIDi"]=53700;var __ZTSPDi=Module["__ZTSPDi"]=53708;var __ZTIPDi=Module["__ZTIPDi"]=53712;var __ZTSPKDi=Module["__ZTSPKDi"]=53728;var __ZTIPKDi=Module["__ZTIPKDi"]=53736;var __ZTVN10__cxxabiv117__array_type_infoE=Module["__ZTVN10__cxxabiv117__array_type_infoE"]=53752;var __ZTIN10__cxxabiv117__array_type_infoE=Module["__ZTIN10__cxxabiv117__array_type_infoE"]=53816;var __ZTSN10__cxxabiv117__array_type_infoE=Module["__ZTSN10__cxxabiv117__array_type_infoE"]=53780;var __ZTVN10__cxxabiv120__function_type_infoE=Module["__ZTVN10__cxxabiv120__function_type_infoE"]=53828;var __ZTVN10__cxxabiv116__enum_type_infoE=Module["__ZTVN10__cxxabiv116__enum_type_infoE"]=53856;var __ZTIN10__cxxabiv116__enum_type_infoE=Module["__ZTIN10__cxxabiv116__enum_type_infoE"]=53920;var __ZTSN10__cxxabiv116__enum_type_infoE=Module["__ZTSN10__cxxabiv116__enum_type_infoE"]=53884;var __ZTVN10__cxxabiv117__class_type_infoE=Module["__ZTVN10__cxxabiv117__class_type_infoE"]=53932;var __ZTIN10__cxxabiv120__si_class_type_infoE=Module["__ZTIN10__cxxabiv120__si_class_type_infoE"]=54052;var __ZTSN10__cxxabiv120__si_class_type_infoE=Module["__ZTSN10__cxxabiv120__si_class_type_infoE"]=54012;var __ZTVN10__cxxabiv121__vmi_class_type_infoE=Module["__ZTVN10__cxxabiv121__vmi_class_type_infoE"]=54064;var __ZTIN10__cxxabiv121__vmi_class_type_infoE=Module["__ZTIN10__cxxabiv121__vmi_class_type_infoE"]=54144;var __ZTSN10__cxxabiv121__vmi_class_type_infoE=Module["__ZTSN10__cxxabiv121__vmi_class_type_infoE"]=54104;var __ZTVN10__cxxabiv117__pbase_type_infoE=Module["__ZTVN10__cxxabiv117__pbase_type_infoE"]=54156;var __ZTVN10__cxxabiv129__pointer_to_member_type_infoE=Module["__ZTVN10__cxxabiv129__pointer_to_member_type_infoE"]=54212;var __ZTVSt9bad_alloc=Module["__ZTVSt9bad_alloc"]=54240;var __ZTVSt9exception=Module["__ZTVSt9exception"]=54280;var __ZTVSt20bad_array_new_length=Module["__ZTVSt20bad_array_new_length"]=54260;var __ZTISt9bad_alloc=Module["__ZTISt9bad_alloc"]=54392;var __ZTISt20bad_array_new_length=Module["__ZTISt20bad_array_new_length"]=54432;var __ZTISt9exception=Module["__ZTISt9exception"]=54316;var __ZTSSt9exception=Module["__ZTSSt9exception"]=54300;var __ZTVSt13bad_exception=Module["__ZTVSt13bad_exception"]=54324;var __ZTISt13bad_exception=Module["__ZTISt13bad_exception"]=54364;var __ZTSSt13bad_exception=Module["__ZTSSt13bad_exception"]=54344;var __ZTSSt9bad_alloc=Module["__ZTSSt9bad_alloc"]=54376;var __ZTSSt20bad_array_new_length=Module["__ZTSSt20bad_array_new_length"]=54404;var __ZTVSt11logic_error=Module["__ZTVSt11logic_error"]=54444;var __ZTVSt13runtime_error=Module["__ZTVSt13runtime_error"]=54464;var __ZTISt11logic_error=Module["__ZTISt11logic_error"]=54540;var __ZTISt13runtime_error=Module["__ZTISt13runtime_error"]=54780;var __ZTVSt12domain_error=Module["__ZTVSt12domain_error"]=54484;var __ZTISt12domain_error=Module["__ZTISt12domain_error"]=54552;var __ZTSSt12domain_error=Module["__ZTSSt12domain_error"]=54504;var __ZTSSt11logic_error=Module["__ZTSSt11logic_error"]=54521;var __ZTVSt16invalid_argument=Module["__ZTVSt16invalid_argument"]=54564;var __ZTISt16invalid_argument=Module["__ZTISt16invalid_argument"]=54608;var __ZTSSt16invalid_argument=Module["__ZTSSt16invalid_argument"]=54584;var __ZTVSt12length_error=Module["__ZTVSt12length_error"]=54620;var __ZTISt12length_error=Module["__ZTISt12length_error"]=54660;var __ZTSSt12length_error=Module["__ZTSSt12length_error"]=54640;var __ZTVSt12out_of_range=Module["__ZTVSt12out_of_range"]=54672;var __ZTISt12out_of_range=Module["__ZTISt12out_of_range"]=54712;var __ZTSSt12out_of_range=Module["__ZTSSt12out_of_range"]=54692;var __ZTVSt11range_error=Module["__ZTVSt11range_error"]=54724;var __ZTISt11range_error=Module["__ZTISt11range_error"]=54792;var __ZTSSt11range_error=Module["__ZTSSt11range_error"]=54744;var __ZTSSt13runtime_error=Module["__ZTSSt13runtime_error"]=54760;var __ZTVSt14overflow_error=Module["__ZTVSt14overflow_error"]=54804;var __ZTISt14overflow_error=Module["__ZTISt14overflow_error"]=54844;var __ZTSSt14overflow_error=Module["__ZTSSt14overflow_error"]=54824;var __ZTVSt15underflow_error=Module["__ZTVSt15underflow_error"]=54856;var __ZTISt15underflow_error=Module["__ZTISt15underflow_error"]=54896;var __ZTSSt15underflow_error=Module["__ZTSSt15underflow_error"]=54876;var __ZTVSt8bad_cast=Module["__ZTVSt8bad_cast"]=51876;var __ZTVSt10bad_typeid=Module["__ZTVSt10bad_typeid"]=51896;var __ZTISt8bad_cast=Module["__ZTISt8bad_cast"]=51968;var __ZTISt10bad_typeid=Module["__ZTISt10bad_typeid"]=51996;var __ZTVSt9type_info=Module["__ZTVSt9type_info"]=51916;var __ZTISt9type_info=Module["__ZTISt9type_info"]=51948;var __ZTSSt9type_info=Module["__ZTSSt9type_info"]=51932;var __ZTSSt8bad_cast=Module["__ZTSSt8bad_cast"]=51956;var __ZTSSt10bad_typeid=Module["__ZTSSt10bad_typeid"]=51980;Module["addFunction"]=addFunction;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();moduleRtn=readyPromise; return moduleRtn; diff --git a/lib/wasm/pv_orca_simd.wasm b/lib/wasm/pv_orca_simd.wasm index 4d355001..54314585 100755 Binary files a/lib/wasm/pv_orca_simd.wasm and b/lib/wasm/pv_orca_simd.wasm differ diff --git a/lib/windows/amd64/libpv_orca.dll b/lib/windows/amd64/libpv_orca.dll index 1c8235a0..fdb6944c 100644 Binary files a/lib/windows/amd64/libpv_orca.dll and b/lib/windows/amd64/libpv_orca.dll differ diff --git a/lib/windows/amd64/pv_ypu_impl_cuda.dll b/lib/windows/amd64/pv_ypu_impl_cuda.dll new file mode 100644 index 00000000..2c6bc9ef Binary files /dev/null and b/lib/windows/amd64/pv_ypu_impl_cuda.dll differ diff --git a/lib/windows/arm64/libpv_orca.dll b/lib/windows/arm64/libpv_orca.dll index 26057019..03f3bbb0 100644 Binary files a/lib/windows/arm64/libpv_orca.dll and b/lib/windows/arm64/libpv_orca.dll differ diff --git a/resources/.lint/spell-check/dict.txt b/resources/.lint/spell-check/dict.txt index 45df415b..37e56f77 100644 --- a/resources/.lint/spell-check/dict.txt +++ b/resources/.lint/spell-check/dict.txt @@ -15,12 +15,14 @@ Cocoapods Compat constraintlayout copywasm +cuda cwrap downsample drwav dtype dylib editdistance +Embedder emscripten finalizer flac @@ -52,6 +54,7 @@ pltf pluginutils Podfile popleft +pthread pvbase pvcheetah pvleopard diff --git a/resources/.test/test_data.json b/resources/.test/test_data.json index 757cf6f1..10f5e230 100644 --- a/resources/.test/test_data.json +++ b/resources/.test/test_data.json @@ -73,8 +73,8 @@ "orca_params_it_male.pv" ], "random_state": 42, - "text": "Non importa quanto lentamente vai, l'importante è non fermarsi!", - "text_no_punctuation": "Non importa quanto lentamente vai l'importante è non fermarsi", + "text": "quanto lentamente vai, l'importante è non fermarsi!", + "text_no_punctuation": "quanto lentamente vai l'importante è non fermarsi", "text_custom_pronunciation": "Una pronuncia {personalizzata|a b d ddʒ dz dʒ dʣ e f g i j k l m n o p r rr s t ts tts tʃ tʧ u v w z ŋ ŋg ŋk ɔ ɛ ɲ ʃ ʎ}" }, { diff --git a/resources/.test/wav/orca_params_it_female_single.wav b/resources/.test/wav/orca_params_it_female_single.wav index 4387c6b5..f9c00a6d 100644 Binary files a/resources/.test/wav/orca_params_it_female_single.wav and b/resources/.test/wav/orca_params_it_female_single.wav differ diff --git a/resources/.test/wav/orca_params_it_female_stream.wav b/resources/.test/wav/orca_params_it_female_stream.wav index faffdbfd..12d229e9 100644 Binary files a/resources/.test/wav/orca_params_it_female_stream.wav and b/resources/.test/wav/orca_params_it_female_stream.wav differ diff --git a/resources/.test/wav/orca_params_it_male_single.wav b/resources/.test/wav/orca_params_it_male_single.wav index 9ba39605..945b9df5 100644 Binary files a/resources/.test/wav/orca_params_it_male_single.wav and b/resources/.test/wav/orca_params_it_male_single.wav differ diff --git a/resources/.test/wav/orca_params_it_male_stream.wav b/resources/.test/wav/orca_params_it_male_stream.wav index 90bc98b4..48a1d702 100644 Binary files a/resources/.test/wav/orca_params_it_male_stream.wav and b/resources/.test/wav/orca_params_it_male_stream.wav differ diff --git a/script/automation/browserstack.py b/script/automation/browserstack.py index f2c8fdf2..26714993 100644 --- a/script/automation/browserstack.py +++ b/script/automation/browserstack.py @@ -17,7 +17,6 @@ 'Google Pixel 6 Pro-15.0' ], 'ios-min-max': [ - 'iPhone SE 2022-15', 'iPhone 14 Pro-16', 'iPhone 14-18' ],