diff --git a/.github/actions/setup-build/action.yml b/.github/actions/setup-build/action.yml new file mode 100644 index 0000000..ce672f4 --- /dev/null +++ b/.github/actions/setup-build/action.yml @@ -0,0 +1,69 @@ +name: 'build tools setup action' +inputs: + github-token: + description: 'GITHUB_TOKEN' + required: true + default: '' + os: + description: 'os' + required: true + default: '' +runs: + using: "composite" + steps: + - name: Setup Python + if: needs.check-src.outputs.status + uses: actions/setup-python@v4 + with: + python-version: "3.12" + + - name: Install packaging + shell: bash + run: | + python3 -m pip install -U packaging + + - name: Install Protoc + uses: arduino/setup-protoc@v2 + with: + repo-token: ${{ inputs.github-token }} + + - name: install shaderc + shell: pwsh + if: inputs.os == 'windows-latest' + run: | + Invoke-WebRequest -URI https://storage.googleapis.com/shaderc/artifacts/prod/graphics_shader_compiler/shaderc/windows/continuous_release_2019/10/20230531-104731/install.zip -OutFile shaderc.zip + Expand-Archive -Path shaderc.zip -DestinationPath shaderc + echo "SHADERC_LIB_DIR=$Env:GITHUB_WORKSPACE/shaderc/install/lib" >> $Env:GITHUB_ENV + rm shaderc.zip + - name: install shaderc + shell: bash + if: inputs.os == 'ubuntu-latest' + run: | + curl -L https://storage.googleapis.com/shaderc/artifacts/prod/graphics_shader_compiler/shaderc/linux/continuous_clang_release/418/20230531-104531/install.tgz > shaderc.tgz + tar -xzf shaderc.tgz + echo "SHADERC_LIB_DIR=$GITHUB_WORKSPACE/install/lib" >> $GITHUB_ENV + echo "LD_LIBRARY_PATH=$GITHUB_WORKSPACE/install/lib" >> $GITHUB_ENV + rm shaderc.tgz + - name: install shaderc + shell: bash + if: inputs.os == 'macos-latest' + run: | + curl -L https://storage.googleapis.com/shaderc/artifacts/prod/graphics_shader_compiler/shaderc/macos/continuous_clang_release/426/20230531-104534/install.tgz > shaderc.tgz + tar -xzf shaderc.tgz + echo "SHADERC_LIB_DIR=$GITHUB_WORKSPACE/install/lib" >> $GITHUB_ENV + echo "DYLD_LIBRARY_PATH=$GITHUB_WORKSPACE/install/lib" >> $GITHUB_ENV + cp install/lib/*.dylib /usr/local/lib/ + rm shaderc.tgz + + - name: install aarch64 target on macos + shell: bash + if: inputs.os == 'macos-latest' + run: | + rustup target add aarch64-apple-darwin + + - name: install dependencies + shell: bash + if: inputs.os == 'ubuntu-latest' + run: | + sudo apt-get update + sudo apt-get install -y pkg-config libfreetype6-dev libfontconfig1-dev diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..50090b9 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,75 @@ +name: build + +on: + push: + branches: + - 'develop' + pull_request: + types: [opened, reopened, review_requested] + +env: + CARGO_INCREMENTAL: 0 + +jobs: + check-src: + runs-on: ubuntu-latest + name: check if server files changed + outputs: + status: ${{ steps.changed-files.outputs.modified_files }} + steps: + - uses: actions/checkout@v3 + - uses: tj-actions/changed-files@v40 + id: changed-files + with: + files: | + .github/workflows/build.yml + ./**/*.rs + ./**/*.toml + ./**/*.ts + ./**/*.svelte + ./package.json + + build-server: + needs: check-src + name: build-server + strategy: + fail-fast: false + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + + - name: Setup + if: needs.check-src.outputs.status + uses: ./.github/actions/setup-build + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + os: ${{ matrix.os }} + shaderc: true + + - name: Rust cache + if: needs.check-src.outputs.status + uses: swatinem/rust-cache@v2 + with: + workspaces: './server/src-tauri -> target' + + - name: install dependencies (ubuntu only) + if: needs.check-src.outputs.status && matrix.os == 'ubuntu-latest' + run: | + sudo apt-get update + sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev librsvg2-dev + + - name: Sync node version and setup cache + if: needs.check-src.outputs.status + uses: actions/setup-node@v3 + with: + node-version: 'lts/*' + cache: 'npm' + cache-dependency-path: server/package-lock.json + + - name: build server + if: needs.check-src.outputs.status + run: | + python3 build.py server build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..c6f3f33 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,571 @@ +name: Release + +on: + push: + tags: + - 'v*' + +env: + CARGO_INCREMENTAL: 0 + + +jobs: + license-check: + runs-on: ubuntu-latest + name: check-license + steps: + - uses: actions/checkout@v3 + - name: Sync node version and setup cache + uses: actions/setup-node@v3 + with: + node-version: 'lts/*' + cache: 'npm' + cache-dependency-path: server/package-lock.json + - name: install frontend dependencies + run: | + cd server + npm install + - name: Check license + run: | + git submodule update --init tools/autd3-license-check + cd tools/license-checker + cargo run + + build: + name: publish-src + needs: [license-check] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Setup + uses: ./.github/actions/setup-build + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + os: ubuntu-latest + + - name: publish to carate.io + run: | + git submodule update --init --recursive + cd src + cd autd3-driver + cargo publish --no-verify --dry-run + cargo publish --no-verify --token ${{ secrets.CRATEIO_TOKEN }} || true + cd .. && sleep 60 + cd autd3-derive + cargo publish --no-verify --dry-run + cargo publish --no-verify --token ${{ secrets.CRATEIO_TOKEN }} || true + cd .. && sleep 60 + cd autd3-firmware-emulator + cargo publish --no-verify --dry-run + cargo publish --no-verify --token ${{ secrets.CRATEIO_TOKEN }} || true + cd .. && sleep 60 + cd autd3 + cargo publish --no-verify --dry-run + cargo publish --no-verify --token ${{ secrets.CRATEIO_TOKEN }} || true + cd .. + cd autd3-gain-holo + cargo publish --no-verify --dry-run + cargo publish --no-verify --token ${{ secrets.CRATEIO_TOKEN }} || true + cd .. && sleep 60 + cd autd3-protobuf + cargo publish --no-verify --dry-run + cargo publish --no-verify --token ${{ secrets.CRATEIO_TOKEN }} || true + cd .. + cd autd3-link-soem + cargo publish --no-verify --dry-run + cargo publish --no-verify --token ${{ secrets.CRATEIO_TOKEN }} || true + cd .. + cd autd3-link-twincat + cargo publish --no-verify --dry-run + cargo publish --no-verify --token ${{ secrets.CRATEIO_TOKEN }} || true + cd .. + cd autd3-link-simulator + cargo publish --no-verify --dry-run + cargo publish --no-verify --token ${{ secrets.CRATEIO_TOKEN }} || true + cd .. + cd autd3-modulation-audio-file + cargo publish --no-verify --dry-run + cargo publish --no-verify --token ${{ secrets.CRATEIO_TOKEN }} || true + cd ../.. + cd capi + cd autd3capi-wrapper-generator + cargo publish --no-verify --dry-run + cargo publish --no-verify --token ${{ secrets.CRATEIO_TOKEN }} || true + cd .. && sleep 60 + cd autd3capi-def + cargo publish --no-verify --dry-run + cargo publish --no-verify --token ${{ secrets.CRATEIO_TOKEN }} || true + + release: + needs: [license-check, build] + name: create-github-release + runs-on: ubuntu-latest + steps: + - name: Create Release + id: create_release + uses: ncipollo/release-action@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + draft: false + prerelease: false + - name: Output Release URL File + run: | + echo "${{ steps.create_release.outputs.upload_url }}" > release_url.txt + echo "${{ steps.create_release.outputs.id }}" > release_id.txt + - name: Save Release URL File for publish + uses: actions/upload-artifact@v1 + with: + name: release_url + path: release_url.txt + - name: Save Release URL File for publish + uses: actions/upload-artifact@v1 + with: + name: release_id + path: release_id.txt + + publish_win: + needs: [release] + name: upload-release-asset-windows + runs-on: windows-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: "3.12" + - name: Setup + uses: ./.github/actions/setup-build + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + os: windows-latest + shaderc: false + + - name: Get the version + id: get_version + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + result-encoding: string + script: | + return 'autd3-'+context.payload.ref.replace(/refs\/tags\//, '')+'-win'; + + - name: Build project x64 + run: | + python3 build.py cpp build --release --no-examples + Compress-Archive -Path LICENSE, cpp/bin, cpp/lib, cpp/include, cpp/CMakeLists.txt, cpp/README.md, cpp/ThirdPartyNotice.txt -DestinationPath assets_x64.zip + - name: Load Release URL File from release job + uses: actions/download-artifact@v1 + with: + name: release_url + - name: Get Release File Name & Upload URL + id: get_release_info + uses: juliangruber/read-file-action@v1 + with: + path: ./release_url/release_url.txt + - name: Upload Release Asset Win x64 + id: upload-release-asset-win64 + uses: shogo82148/actions-upload-release-asset@v1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + upload_url: ${{ steps.get_release_info.outputs.content }} + asset_path: ./assets_x64.zip + asset_name: ${{ steps.get_version.outputs.result }}-x64.zip + asset_content_type: application/zip + + - name: Publish pypi + run: | + python3 -m pip install --upgrade pip + python3 -m pip install -U twine wheel build + python3 build.py python build --release --no-install + cd python + twine upload dist/* -u ${{ secrets.TWINE_USERNAME }} -p ${{ secrets.TWINE_PASS }} --non-interactive --skip-existing + + - name: Build project x64 for Unity + run: | + python3 build.py unity build --release + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '16' + registry-url: 'https://registry.npmjs.org' + - name: Publish on npmjs + continue-on-error: true + run: | + mv dotnet/unity/Assets/Samples dotnet/unity/Assets/Samples~ + rm -Force dotnet/unity/Assets/Samples.meta + cd dotnet/unity/Assets + npm install + npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + + publish_linux: + needs: [release] + name: upload-release-asset-linux + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Setup + uses: ./.github/actions/setup-build + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + os: ubuntu-latest + shaderc: false + + - name: Get the version + id: get_version + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + result-encoding: string + script: | + return 'autd3-'+context.payload.ref.replace(/refs\/tags\//, '')+'-linux'; + + - name: Build project x64 + run: | + python3 build.py cpp build --release --no-examples + cd cpp + tar -zcvf assets_x64.tar.gz bin include CMakeLists.txt LICENSE README.md ThirdPartyNotice.txt + shell: bash + - name: Load Release URL File from release job + uses: actions/download-artifact@v1 + with: + name: release_url + - name: Get Release File Name & Upload URL + id: get_release_info + run: | + value=`cat release_url/release_url.txt` + echo "upload_url=$value" >> $GITHUB_OUTPUT + - name: Upload Release Asset + id: upload-release-asset-x64 + uses: shogo82148/actions-upload-release-asset@v1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + upload_url: ${{ steps.get_release_info.outputs.upload_url }} + asset_path: ./cpp/assets_x64.tar.gz + asset_name: ${{ steps.get_version.outputs.result }}-x64.tar.gz + asset_content_type: application/octet-stream + + - name: Publish pypi + run: | + python3 -m pip install --upgrade pip + python3 -m pip install -U twine wheel build + python3 build.py python build --release --no-install + cd python + twine upload dist/* -u ${{ secrets.TWINE_USERNAME }} -p ${{ secrets.TWINE_PASS }} --non-interactive --skip-existing + + - name: Build project for Unity + run: | + python3 build.py unity build --release + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '16' + registry-url: 'https://registry.npmjs.org' + - name: Publish on npmjs + continue-on-error: true + run: | + mv dotnet/unity-linux/Assets/Samples dotnet/unity-linux/Assets/Samples~ + rm -f dotnet/unity-linux/Assets/Samples.meta + cd dotnet/unity-linux/Assets + npm install + npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + publish_linux-arm32: + needs: [release] + name: upload-release-asset-linux-arm32 + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Setup + uses: ./.github/actions/setup-build + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + os: ubuntu-latest + arch: 'arm32' + + - name: Get the version + id: get_version + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + result-encoding: string + script: | + return 'autd3-'+context.payload.ref.replace(/refs\/tags\//, '')+'-linux'; + + - name: Build project arm32 + run: | + python3 build.py cpp build --release --no-examples --arch arm32 + cd cpp + tar -zcvf assets_arm32.tar.gz bin include CMakeLists.txt LICENSE README.md ThirdPartyNotice.txt + shell: bash + - name: Load Release URL File from release job + uses: actions/download-artifact@v1 + with: + name: release_url + - name: Get Release File Name & Upload URL + id: get_release_info + run: | + value=`cat release_url/release_url.txt` + echo "upload_url=$value" >> $GITHUB_OUTPUT + - name: Upload Release Asset + id: upload-release-asset-arm32 + uses: shogo82148/actions-upload-release-asset@v1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + upload_url: ${{ steps.get_release_info.outputs.upload_url }} + asset_path: ./cpp/assets_arm32.tar.gz + asset_name: ${{ steps.get_version.outputs.result }}-armv7.tar.gz + asset_content_type: application/octet-stream + + - name: Publish pypi + run: | + python3 -m pip install --upgrade pip + python3 -m pip install -U twine wheel build + python3 build.py python build --release --no-install --arch arm32 + cd python + twine upload dist/* -u ${{ secrets.TWINE_USERNAME }} -p ${{ secrets.TWINE_PASS }} --non-interactive --skip-existing + + publish_linux-aarch64: + needs: [release] + name: upload-release-asset-linux-aarch64 + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Setup + uses: ./.github/actions/setup-build + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + os: ubuntu-latest + arch: 'aarch64' + + - name: Get the version + id: get_version + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + result-encoding: string + script: | + return 'autd3-'+context.payload.ref.replace(/refs\/tags\//, '')+'-linux'; + + - name: Build project aarch64 + run: | + python3 build.py cpp build --release --no-examples --arch aarch64 + cd cpp + tar -zcvf assets_aarch64.tar.gz bin include CMakeLists.txt LICENSE README.md ThirdPartyNotice.txt + shell: bash + - name: Load Release URL File from release job + uses: actions/download-artifact@v1 + with: + name: release_url + - name: Get Release File Name & Upload URL + id: get_release_info + run: | + value=`cat release_url/release_url.txt` + echo "upload_url=$value" >> $GITHUB_OUTPUT + - name: Upload Release Asset + id: upload-release-asset-aarch64 + uses: shogo82148/actions-upload-release-asset@v1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + upload_url: ${{ steps.get_release_info.outputs.upload_url }} + asset_path: ./cpp/assets_aarch64.tar.gz + asset_name: ${{ steps.get_version.outputs.result }}-aarch64.tar.gz + asset_content_type: application/octet-stream + + - name: Publish pypi + run: | + python3 -m pip install --upgrade pip + python3 -m pip install -U twine wheel build + python3 build.py python build --release --no-install --arch aarch64 + cd python + twine upload dist/* -u ${{ secrets.TWINE_USERNAME }} -p ${{ secrets.TWINE_PASS }} --non-interactive --skip-existing + + publish_mac: + needs: [release] + name: upload-release-asset-macos + runs-on: macos-latest + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Setup + uses: ./.github/actions/setup-build + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + os: macos-latest + shaderc: false + + - name: Get the version + id: get_version + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + result-encoding: string + script: | + return 'autd3-'+context.payload.ref.replace(/refs\/tags\//, '')+'-macos-universal.tar.gz'; + + - name: Build project + run: | + python3 build.py cpp build --release --no-examples --universal + cd cpp + tar -zcvf assets.tar.gz bin include CMakeLists.txt LICENSE README.md ThirdPartyNotice.txt + - name: Load Release URL File from release job + uses: actions/download-artifact@v1 + with: + name: release_url + - name: Get Release File Name & Upload URL + id: get_release_info + run: | + value=`cat release_url/release_url.txt` + echo "upload_url=$value" >> $GITHUB_OUTPUT + - name: Upload Release Asset + id: upload-release-asset + uses: shogo82148/actions-upload-release-asset@v1 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + upload_url: ${{ steps.get_release_info.outputs.upload_url }} + asset_path: ./cpp/assets.tar.gz + asset_name: ${{ steps.get_version.outputs.result }} + asset_content_type: application/octet-stream + + - name: Publish pypi + run: | + python3 -m pip install --upgrade pip + python3 -m pip install -U twine wheel build + python3 build.py python build --release --no-install --universal + cd python + twine upload dist/* -u ${{ secrets.TWINE_USERNAME }} -p ${{ secrets.TWINE_PASS }} --non-interactive --skip-existing + + - name: Build project for Unity + run: | + python3 build.py unity build --release + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '16' + registry-url: 'https://registry.npmjs.org' + - name: Publish on npmjs + continue-on-error: true + run: | + mv dotnet/unity-mac/Assets/Samples dotnet/unity-mac/Assets/Samples~ + rm -f dotnet/unity-mac/Assets/Samples.meta + cd dotnet/unity-mac/Assets + npm install + npm publish + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + publish_nuget: + name: publish-nuget + needs: [build, publish_win, publish_linux, publish_mac] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Setup .NET Core + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + - name: Get the version + id: get_version + run: echo "VERSION=$(echo $GITHUB_REF | cut -d / -f 3 | cut -d . -f 1,2,3)" >> $GITHUB_OUTPUT + - name: Download latest binary + run: | + wget https://github.com/shinolab/autd3/releases/download/${{ steps.get_version.outputs.VERSION }}/autd3-${{ steps.get_version.outputs.VERSION }}-linux-x64.tar.gz + wget https://github.com/shinolab/autd3/releases/download/${{ steps.get_version.outputs.VERSION }}/autd3-${{ steps.get_version.outputs.VERSION }}-macos-universal.tar.gz + wget https://github.com/shinolab/autd3/releases/download/${{ steps.get_version.outputs.VERSION }}/autd3-${{ steps.get_version.outputs.VERSION }}-win-x64.zip + - name: Replace latest binary + run: | + cp LICENSE dotnet/cs/src/LICENSE.txt + echo "\n=========================================================\n" >> dotnet/cs/src/LICENSE.txt + cat ./capi/ThirdPartyNotice.txt >> dotnet/cs/src/LICENSE.txt + tar -zxvf autd3-${{ steps.get_version.outputs.VERSION }}-linux-x64.tar.gz + rm -f ./dotnet/cs/src/native/linux/x64/* + \cp bin/*.so ./dotnet/cs/src/native/linux/x64/ + tar -zxvf autd3-${{ steps.get_version.outputs.VERSION }}-macos-universal.tar.gz + rm -f ./dotnet/cs/src/native/osx/universal/* + \cp bin/*.dylib ./dotnet/cs/src/native/osx/universal/ + unzip -o autd3-${{ steps.get_version.outputs.VERSION }}-win-x64.zip + rm -f ./dotnet/cs/src/native/windows/x64/* + \cp bin/*.dll ./dotnet/cs/src/native/windows/x64/ + - name: Build with dotnet and publish to NuGet + run: | + dotnet build -c:Release + cd bin/Release + dotnet nuget push autd3sharp.*.nupkg --source https://api.nuget.org/v3/index.json --api-key ${{ secrets.NUGET_API_KEY }} --skip-duplicate --no-symbols + working-directory: ./dotnet/cs/src + + publish-server: + name: publish-server-${{ matrix.os }} + needs: [release] + permissions: + contents: write + strategy: + fail-fast: false + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: "3.12" + - name: Setup + uses: ./.github/actions/setup-build + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + os: ${{ matrix.os }} + shaderc: true + + - name: install dependencies (ubuntu only) + if: matrix.os == 'ubuntu-latest' + run: | + sudo apt-get update + sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev librsvg2-dev + + - name: Sync node version and setup cache + uses: actions/setup-node@v3 + with: + node-version: 'lts/*' + cache: 'npm' + cache-dependency-path: server/package-lock.json + - name: build + run: | + python3 build.py server build --external-only + - name: Load Release ID File from release job + uses: actions/download-artifact@v1 + with: + name: release_id + - name: Get Release File Name & Upload URL + id: get_release_info + uses: juliangruber/read-file-action@v1 + with: + path: ./release_id/release_id.txt + - uses: tauri-apps/tauri-action@v0 + if: matrix.os == 'macos-latest' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + releaseId: ${{ steps.get_release_info.outputs.content }} + projectPath: './server' + updaterJsonKeepUniversal: true + args: '--target universal-apple-darwin' + - uses: tauri-apps/tauri-action@v0 + if: matrix.os != 'macos-latest' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + releaseId: ${{ steps.get_release_info.outputs.content }} + projectPath: './server' + releaseDraft: true + prerelease: false diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6240da8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..53aa72e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "tools/autd3-license-check"] + path = tools/autd3-license-check + url = https://github.com/shinolab/autd3-license-check.git diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7832c5e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022-2023 Shun Suzuki + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..76658da --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +# AUTD Server + + +# LICENSE + +* See [LICENSE](./LICENSE) and [ThirdPartyNotice](./ThirdPartyNotice.txt) for more information. + +# Author + +Shun Suzuki, 2023 diff --git a/SOEMAUTDServer/.cargo/config b/SOEMAUTDServer/.cargo/config new file mode 100644 index 0000000..482dbcf --- /dev/null +++ b/SOEMAUTDServer/.cargo/config @@ -0,0 +1,2 @@ +[build] +target-dir = "./../src-tauri/target" diff --git a/SOEMAUTDServer/.gitignore b/SOEMAUTDServer/.gitignore new file mode 100644 index 0000000..9f97022 --- /dev/null +++ b/SOEMAUTDServer/.gitignore @@ -0,0 +1 @@ +target/ \ No newline at end of file diff --git a/SOEMAUTDServer/Cargo.lock b/SOEMAUTDServer/Cargo.lock new file mode 100644 index 0000000..3abd605 --- /dev/null +++ b/SOEMAUTDServer/Cargo.lock @@ -0,0 +1,1899 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "SOEMAUTDServer" +version = "19.0.0" +dependencies = [ + "anyhow", + "autd3-driver", + "autd3-link-soem", + "autd3-protobuf", + "chrono", + "clap", + "ctrlc", + "tokio", + "tonic", + "tracing", + "tracing-core", + "tracing-subscriber", +] + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3a318f1f38d2418400f8209655bfd825785afd25aa30bb7ba6cc792e4596748" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-trait" +version = "0.1.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "autd3-derive" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18c0c89452c24a7dd3956fc0d8705787dd48f900028918d158e9a82f2eac6d43" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "autd3-driver" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f39dbff9102a322bfb0f9e98beadfc88c7c4f385a5e5e8b71fc5267ab797aeaf" +dependencies = [ + "async-trait", + "bitflags 2.4.1", + "bitvec", + "libc", + "nalgebra", + "thiserror", + "windows", +] + +[[package]] +name = "autd3-link-soem" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891502cae4a3b8a53ea3dac517e2fb2a86f896f6eb18e56e207266966c5e253e" +dependencies = [ + "async-trait", + "autd3-derive", + "autd3-driver", + "cc", + "crossbeam-channel", + "glob", + "thiserror", + "time", + "windows", +] + +[[package]] +name = "autd3-protobuf" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f01699db78da78e10303600b9fb3d739da13e5cb9d9dd9627762b15810a88cf6" +dependencies = [ + "autd3-driver", + "h2 0.4.0", + "prost", + "thiserror", + "tonic", + "tonic-build", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http 0.2.11", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 0.2.11", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "bytemuck" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets 0.48.5", +] + +[[package]] +name = "clap" +version = "4.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ctrlc" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e95fbd621905b854affdc67943b043a0fbb6ed7385fd5a25650d19a8a6cfdf" +dependencies = [ + "nix", + "windows-sys 0.48.0", +] + +[[package]] +name = "deranged" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures-channel" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" + +[[package]] +name = "futures-sink" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" + +[[package]] +name = "futures-task" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" + +[[package]] +name = "futures-util" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "h2" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.11", + "indexmap 2.1.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d308f63daf4181410c242d34c11f928dcb3aa105852019e043c9d1f4e4368a" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 1.0.0", + "indexmap 2.1.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" + +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "http" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http 0.2.11", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.22", + "http 0.2.11", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.4.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.51.1", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "jobserver" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "linux-raw-sys" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "matrixmultiply" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "nalgebra" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "307ed9b18cc2423f29e83f84fd23a8e73628727990181f18641a8b5dc2ab1caa" +dependencies = [ + "approx", + "matrixmultiply", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.4.1", + "cfg-if", + "libc", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-complex" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +dependencies = [ + "fixedbitset", + "indexmap 2.1.0", +] + +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "prettyplease" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" +dependencies = [ + "proc-macro2", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" +dependencies = [ + "bytes", + "heck", + "itertools", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn", + "tempfile", + "which", +] + +[[package]] +name = "prost-derive" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "prost-types" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +dependencies = [ + "prost", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustix" +version = "0.38.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "safe_arch" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "simba" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "thiserror" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +dependencies = [ + "deranged", + "powerfmt", + "serde", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "tokio" +version = "1.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "socket2 0.5.5", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tonic" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64", + "bytes", + "h2 0.3.22", + "http 0.2.11", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-build" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d021fc044c18582b9a2408cd0dd05b1596e3ecdb5c4df822bb0183545683889" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "quote", + "syn", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + +[[package]] +name = "wide" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] diff --git a/SOEMAUTDServer/Cargo.toml b/SOEMAUTDServer/Cargo.toml new file mode 100644 index 0000000..cbbe06d --- /dev/null +++ b/SOEMAUTDServer/Cargo.toml @@ -0,0 +1,25 @@ +[package] +name = "SOEMAUTDServer" +version = "19.0.0" +authors = ["shun suzuki "] +edition = "2021" +license = "MIT" + +description = "AUTDServer" +repository = "https://github.com/shinolab/autd3" +readme = "../README.md" +keywords = ["autd"] + +[dependencies] +clap = { version = "4.3.0", features = ["derive"] } +tokio = { version = "1.34.0", features = ["macros", "rt-multi-thread"] } +autd3-protobuf = { version = "19.0.0" } +autd3-link-soem = { version = "19.0.0" } +autd3-driver = { version = "19.0.0" } +anyhow = "1.0.72" +ctrlc = "3.3.0" +tonic = "0.10.0" +tracing = "0.1.37" +tracing-subscriber = "0.3.17" +chrono = "0.4.31" +tracing-core = "0.1.32" diff --git a/SOEMAUTDServer/README.md b/SOEMAUTDServer/README.md new file mode 100644 index 0000000..64ce02b --- /dev/null +++ b/SOEMAUTDServer/README.md @@ -0,0 +1,14 @@ +# AUTD Server for RemoteSOEM link + +# Dependencies + +This library depends on [tonic](https://github.com/hyperium/tonic). +To build this library, see the above link and follow the instructions. + +# LICENSE + +* See [LICENSE](../LICENSE) and [ThirdPartyNotice](./ThirdPartyNotice.txt) for more information. + +# Author + +Shun Suzuki, 2023 diff --git a/SOEMAUTDServer/ThirdPartyNotice.txt b/SOEMAUTDServer/ThirdPartyNotice.txt new file mode 100644 index 0000000..8930b19 --- /dev/null +++ b/SOEMAUTDServer/ThirdPartyNotice.txt @@ -0,0 +1,1284 @@ +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION + +This software includes the following third-party components. +The license terms for each of these components are provided later in this notice. + + +--------------------------------------------------------- + +SOEMAUTDServer 19.0.0 (MIT) +https://github.com/shinolab/autd3 +--------------------------------------------------------- + +addr2line 0.21.0 (Apache-2.0 OR MIT) +https://github.com/gimli-rs/addr2line +--------------------------------------------------------- + +adler 1.0.2 (0BSD OR Apache-2.0 OR MIT) +https://github.com/jonas-schievink/adler.git +--------------------------------------------------------- + +aho-corasick 1.1.2 (MIT OR Unlicense) +https://github.com/BurntSushi/aho-corasick +--------------------------------------------------------- + +android-tzdata 0.1.1 (Apache-2.0 OR MIT) +https://github.com/RumovZ/android-tzdata +--------------------------------------------------------- + +android_system_properties 0.1.5 (Apache-2.0 OR MIT) +https://github.com/nical/android_system_properties +--------------------------------------------------------- + +anstream 0.6.4 (Apache-2.0 OR MIT) +https://github.com/rust-cli/anstyle.git +--------------------------------------------------------- + +anstyle 1.0.4 (Apache-2.0 OR MIT) +https://github.com/rust-cli/anstyle.git +--------------------------------------------------------- + +anstyle-parse 0.2.3 (Apache-2.0 OR MIT) +https://github.com/rust-cli/anstyle.git +--------------------------------------------------------- + +anstyle-query 1.0.1 (Apache-2.0 OR MIT) +https://github.com/rust-cli/anstyle +--------------------------------------------------------- + +anstyle-wincon 3.0.2 (Apache-2.0 OR MIT) +https://github.com/rust-cli/anstyle.git +--------------------------------------------------------- + +anyhow 1.0.75 (Apache-2.0 OR MIT) +https://github.com/dtolnay/anyhow +--------------------------------------------------------- + +approx 0.5.1 (Apache-2.0) +https://github.com/brendanzab/approx +--------------------------------------------------------- + +async-stream 0.3.5 (MIT) +https://github.com/tokio-rs/async-stream +--------------------------------------------------------- + +async-stream-impl 0.3.5 (MIT) +https://github.com/tokio-rs/async-stream +--------------------------------------------------------- + +async-trait 0.1.74 (Apache-2.0 OR MIT) +https://github.com/dtolnay/async-trait +--------------------------------------------------------- + +autd3-derive 19.0.0 (MIT) +https://github.com/shinolab/autd3 +--------------------------------------------------------- + +autd3-driver 19.0.0 (MIT) +https://github.com/shinolab/autd3 +--------------------------------------------------------- + +autd3-link-soem 19.0.0 +https://github.com/shinolab/autd3 + +--- + +MIT License + +Copyright (c) 2022-2023 Shun Suzuki + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +================================== SOEM ======================================= +Simple Open EtherCAT Master Library + +Copyright (C) 2005-2017 Speciaal Machinefabriek Ketels v.o.f. +Copyright (C) 2005-2017 Arthur Ketels +Copyright (C) 2008-2009 TU/e Technische Universiteit Eindhoven +Copyright (C) 2009-2017 rt-labs AB, Sweden + +SOEM is free software; you can redistribute it and/or modify it under the terms +of the GNU General Public License version 2 as published by the Free Software +Foundation. + +SOEM is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +As a special exception, if other files instantiate templates or use macros or +inline functions from this file, or you compile this file and link it with other +works to produce a work based on this file, this file does not by itself cause +the resulting work to be covered by the GNU General Public License. However the +source code for this file must still be made available in accordance with +section (3) of the GNU General Public License. + +This exception does not invalidate any other reasons why a work based on this +file might be covered by the GNU General Public License. + +The EtherCAT Technology, the trade name and logo "EtherCAT" are the intellectual +property of, and protected by Beckhoff Automation GmbH. You can use SOEM for the +sole purpose of creating, using and/or selling or otherwise distributing an +EtherCAT network master provided that an EtherCAT Master License is obtained +from Beckhoff Automation GmbH. + +In case you did not receive a copy of the EtherCAT Master License along with +SOEM write to Beckhoff Automation GmbH, Eiserstrasse 5, D-33415 Verl, Germany +(www.beckhoff.com). +================================== SOEM ======================================= + +--------------------------------------------------------- + +autd3-protobuf 19.0.0 (MIT) +https://github.com/shinolab/autd3 +--------------------------------------------------------- + +autocfg 1.1.0 (Apache-2.0 OR MIT) +https://github.com/cuviper/autocfg +--------------------------------------------------------- + +axum 0.6.20 (MIT) +https://github.com/tokio-rs/axum +--------------------------------------------------------- + +axum-core 0.3.4 (MIT) +https://github.com/tokio-rs/axum +--------------------------------------------------------- + +backtrace 0.3.69 (Apache-2.0 OR MIT) +https://github.com/rust-lang/backtrace-rs +--------------------------------------------------------- + +base64 0.21.5 (Apache-2.0 OR MIT) +https://github.com/marshallpierce/rust-base64 +--------------------------------------------------------- + +bitflags 1.3.2 (Apache-2.0 OR MIT) +https://github.com/bitflags/bitflags +--------------------------------------------------------- + +bitflags 2.4.1 (Apache-2.0 OR MIT) +https://github.com/bitflags/bitflags +--------------------------------------------------------- + +bitvec 1.0.1 (MIT) +https://github.com/bitvecto-rs/bitvec +--------------------------------------------------------- + +bumpalo 3.14.0 (Apache-2.0 OR MIT) +https://github.com/fitzgen/bumpalo +--------------------------------------------------------- + +bytemuck 1.14.0 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Lokathor/bytemuck +--------------------------------------------------------- + +bytes 1.5.0 (MIT) +https://github.com/tokio-rs/bytes +--------------------------------------------------------- + +cc 1.0.83 (Apache-2.0 OR MIT) +https://github.com/rust-lang/cc-rs +--------------------------------------------------------- + +cfg-if 1.0.0 (Apache-2.0 OR MIT) +https://github.com/alexcrichton/cfg-if +--------------------------------------------------------- + +chrono 0.4.31 (Apache-2.0 OR MIT) +https://github.com/chronotope/chrono +--------------------------------------------------------- + +clap 4.4.11 (Apache-2.0 OR MIT) +https://github.com/clap-rs/clap +--------------------------------------------------------- + +clap_builder 4.4.11 (Apache-2.0 OR MIT) +https://github.com/clap-rs/clap +--------------------------------------------------------- + +clap_derive 4.4.7 (Apache-2.0 OR MIT) +https://github.com/clap-rs/clap/tree/master/clap_derive +--------------------------------------------------------- + +clap_lex 0.6.0 (Apache-2.0 OR MIT) +https://github.com/clap-rs/clap/tree/master/clap_lex +--------------------------------------------------------- + +colorchoice 1.0.0 (Apache-2.0 OR MIT) +https://github.com/rust-cli/anstyle +--------------------------------------------------------- + +core-foundation-sys 0.8.6 (Apache-2.0 OR MIT) +https://github.com/servo/core-foundation-rs +--------------------------------------------------------- + +crossbeam-channel 0.5.8 (Apache-2.0 OR MIT) +https://github.com/crossbeam-rs/crossbeam +--------------------------------------------------------- + +crossbeam-utils 0.8.16 (Apache-2.0 OR MIT) +https://github.com/crossbeam-rs/crossbeam +--------------------------------------------------------- + +ctrlc 3.4.1 (Apache-2.0 OR MIT) +https://github.com/Detegr/rust-ctrlc.git +--------------------------------------------------------- + +deranged 0.3.10 (Apache-2.0 OR MIT) +https://github.com/jhpratt/deranged +--------------------------------------------------------- + +either 1.9.0 (Apache-2.0 OR MIT) +https://github.com/bluss/either +--------------------------------------------------------- + +equivalent 1.0.1 (Apache-2.0 OR MIT) +https://github.com/cuviper/equivalent +--------------------------------------------------------- + +errno 0.3.8 (Apache-2.0 OR MIT) +https://github.com/lambda-fairy/rust-errno +--------------------------------------------------------- + +fastrand 2.0.1 (Apache-2.0 OR MIT) +https://github.com/smol-rs/fastrand +--------------------------------------------------------- + +fixedbitset 0.4.2 (Apache-2.0 OR MIT) +https://github.com/petgraph/fixedbitset +--------------------------------------------------------- + +fnv 1.0.7 (Apache-2.0 OR MIT) +https://github.com/servo/rust-fnv +--------------------------------------------------------- + +funty 2.0.0 (MIT) +https://github.com/myrrlyn/funty +--------------------------------------------------------- + +futures-channel 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-core 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-sink 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-task 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-util 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +getrandom 0.2.11 (Apache-2.0 OR MIT) +https://github.com/rust-random/getrandom +--------------------------------------------------------- + +gimli 0.28.1 (Apache-2.0 OR MIT) +https://github.com/gimli-rs/gimli +--------------------------------------------------------- + +glob 0.3.1 (Apache-2.0 OR MIT) +https://github.com/rust-lang/glob +--------------------------------------------------------- + +h2 0.3.22 (MIT) +https://github.com/hyperium/h2 +--------------------------------------------------------- + +h2 0.4.0 (MIT) +https://github.com/hyperium/h2 +--------------------------------------------------------- + +hashbrown 0.12.3 (Apache-2.0 OR MIT) +https://github.com/rust-lang/hashbrown +--------------------------------------------------------- + +hashbrown 0.14.3 (Apache-2.0 OR MIT) +https://github.com/rust-lang/hashbrown +--------------------------------------------------------- + +heck 0.4.1 (Apache-2.0 OR MIT) +https://github.com/withoutboats/heck +--------------------------------------------------------- + +hermit-abi 0.3.3 (Apache-2.0 OR MIT) +https://github.com/hermitcore/hermit-rs +--------------------------------------------------------- + +home 0.5.5 (Apache-2.0 OR MIT) +https://github.com/rust-lang/cargo +--------------------------------------------------------- + +http 0.2.11 (Apache-2.0 OR MIT) +https://github.com/hyperium/http +--------------------------------------------------------- + +http 1.0.0 (Apache-2.0 OR MIT) +https://github.com/hyperium/http +--------------------------------------------------------- + +http-body 0.4.5 (MIT) +https://github.com/hyperium/http-body +--------------------------------------------------------- + +httparse 1.8.0 (Apache-2.0 OR MIT) +https://github.com/seanmonstar/httparse +--------------------------------------------------------- + +httpdate 1.0.3 (Apache-2.0 OR MIT) +https://github.com/pyfisch/httpdate +--------------------------------------------------------- + +hyper 0.14.27 (MIT) +https://github.com/hyperium/hyper +--------------------------------------------------------- + +hyper-timeout 0.4.1 (Apache-2.0 OR MIT) +https://github.com/hjr3/hyper-timeout +--------------------------------------------------------- + +iana-time-zone 0.1.58 (Apache-2.0 OR MIT) +https://github.com/strawlab/iana-time-zone +--------------------------------------------------------- + +iana-time-zone-haiku 0.1.2 (Apache-2.0 OR MIT) +https://github.com/strawlab/iana-time-zone +--------------------------------------------------------- + +indexmap 1.9.3 (Apache-2.0 OR MIT) +https://github.com/bluss/indexmap +--------------------------------------------------------- + +indexmap 2.1.0 (Apache-2.0 OR MIT) +https://github.com/bluss/indexmap +--------------------------------------------------------- + +itertools 0.11.0 (Apache-2.0 OR MIT) +https://github.com/rust-itertools/itertools +--------------------------------------------------------- + +itoa 1.0.9 (Apache-2.0 OR MIT) +https://github.com/dtolnay/itoa +--------------------------------------------------------- + +jobserver 0.1.27 (Apache-2.0 OR MIT) +https://github.com/alexcrichton/jobserver-rs +--------------------------------------------------------- + +js-sys 0.3.66 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/js-sys +--------------------------------------------------------- + +lazy_static 1.4.0 (Apache-2.0 OR MIT) +https://github.com/rust-lang-nursery/lazy-static.rs +--------------------------------------------------------- + +libc 0.2.150 (Apache-2.0 OR MIT) +https://github.com/rust-lang/libc +--------------------------------------------------------- + +linux-raw-sys 0.4.12 (Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT) +https://github.com/sunfishcode/linux-raw-sys +--------------------------------------------------------- + +log 0.4.20 (Apache-2.0 OR MIT) +https://github.com/rust-lang/log +--------------------------------------------------------- + +matchit 0.7.3 (MIT AND BSD-3-Clause) +https://github.com/ibraheemdev/matchit +--------------------------------------------------------- + +matrixmultiply 0.3.8 (Apache-2.0 OR MIT) +https://github.com/bluss/matrixmultiply/ +--------------------------------------------------------- + +memchr 2.6.4 (MIT OR Unlicense) +https://github.com/BurntSushi/memchr +--------------------------------------------------------- + +mime 0.3.17 (Apache-2.0 OR MIT) +https://github.com/hyperium/mime +--------------------------------------------------------- + +miniz_oxide 0.7.1 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide +--------------------------------------------------------- + +mio 0.8.10 (MIT) +https://github.com/tokio-rs/mio +--------------------------------------------------------- + +multimap 0.8.3 (Apache-2.0 OR MIT) +https://github.com/havarnov/multimap +--------------------------------------------------------- + +nalgebra 0.32.3 (BSD-3-Clause) +https://github.com/dimforge/nalgebra +--------------------------------------------------------- + +nix 0.27.1 (MIT) +https://github.com/nix-rust/nix +--------------------------------------------------------- + +nu-ansi-term 0.46.0 (MIT) +https://github.com/nushell/nu-ansi-term +--------------------------------------------------------- + +num-complex 0.4.4 (Apache-2.0 OR MIT) +https://github.com/rust-num/num-complex +--------------------------------------------------------- + +num-integer 0.1.45 (Apache-2.0 OR MIT) +https://github.com/rust-num/num-integer +--------------------------------------------------------- + +num-rational 0.4.1 (Apache-2.0 OR MIT) +https://github.com/rust-num/num-rational +--------------------------------------------------------- + +num-traits 0.2.17 (Apache-2.0 OR MIT) +https://github.com/rust-num/num-traits +--------------------------------------------------------- + +num_cpus 1.16.0 (Apache-2.0 OR MIT) +https://github.com/seanmonstar/num_cpus +--------------------------------------------------------- + +object 0.32.1 (Apache-2.0 OR MIT) +https://github.com/gimli-rs/object +--------------------------------------------------------- + +once_cell 1.19.0 (Apache-2.0 OR MIT) +https://github.com/matklad/once_cell +--------------------------------------------------------- + +overload 0.1.1 (MIT) +https://github.com/danaugrs/overload +--------------------------------------------------------- + +paste 1.0.14 (Apache-2.0 OR MIT) +https://github.com/dtolnay/paste +--------------------------------------------------------- + +percent-encoding 2.3.1 (Apache-2.0 OR MIT) +https://github.com/servo/rust-url/ +--------------------------------------------------------- + +petgraph 0.6.4 (Apache-2.0 OR MIT) +https://github.com/petgraph/petgraph +--------------------------------------------------------- + +pin-project 1.1.3 (Apache-2.0 OR MIT) +https://github.com/taiki-e/pin-project +--------------------------------------------------------- + +pin-project-internal 1.1.3 (Apache-2.0 OR MIT) +https://github.com/taiki-e/pin-project +--------------------------------------------------------- + +pin-project-lite 0.2.13 (Apache-2.0 OR MIT) +https://github.com/taiki-e/pin-project-lite +--------------------------------------------------------- + +pin-utils 0.1.0 (Apache-2.0 OR MIT) +https://github.com/rust-lang-nursery/pin-utils +--------------------------------------------------------- + +powerfmt 0.2.0 (Apache-2.0 OR MIT) +https://github.com/jhpratt/powerfmt +--------------------------------------------------------- + +ppv-lite86 0.2.17 (Apache-2.0 OR MIT) +https://github.com/cryptocorrosion/cryptocorrosion +--------------------------------------------------------- + +prettyplease 0.2.15 (Apache-2.0 OR MIT) +https://github.com/dtolnay/prettyplease +--------------------------------------------------------- + +proc-macro2 1.0.70 (Apache-2.0 OR MIT) +https://github.com/dtolnay/proc-macro2 +--------------------------------------------------------- + +prost 0.12.3 (Apache-2.0) +https://github.com/tokio-rs/prost +--------------------------------------------------------- + +prost-build 0.12.3 (Apache-2.0) +https://github.com/tokio-rs/prost +--------------------------------------------------------- + +prost-derive 0.12.3 (Apache-2.0) +https://github.com/tokio-rs/prost +--------------------------------------------------------- + +prost-types 0.12.3 (Apache-2.0) +https://github.com/tokio-rs/prost +--------------------------------------------------------- + +quote 1.0.33 (Apache-2.0 OR MIT) +https://github.com/dtolnay/quote +--------------------------------------------------------- + +radium 0.7.0 (MIT) +https://github.com/bitvecto-rs/radium +--------------------------------------------------------- + +rand 0.8.5 (Apache-2.0 OR MIT) +https://github.com/rust-random/rand +--------------------------------------------------------- + +rand_chacha 0.3.1 (Apache-2.0 OR MIT) +https://github.com/rust-random/rand +--------------------------------------------------------- + +rand_core 0.6.4 (Apache-2.0 OR MIT) +https://github.com/rust-random/rand +--------------------------------------------------------- + +rawpointer 0.2.1 (Apache-2.0 OR MIT) +https://github.com/bluss/rawpointer/ +--------------------------------------------------------- + +redox_syscall 0.4.1 (MIT) +https://gitlab.redox-os.org/redox-os/syscall +--------------------------------------------------------- + +regex 1.10.2 (Apache-2.0 OR MIT) +https://github.com/rust-lang/regex +--------------------------------------------------------- + +regex-automata 0.4.3 (Apache-2.0 OR MIT) +https://github.com/rust-lang/regex/tree/master/regex-automata +--------------------------------------------------------- + +regex-syntax 0.8.2 (Apache-2.0 OR MIT) +https://github.com/rust-lang/regex/tree/master/regex-syntax +--------------------------------------------------------- + +rustc-demangle 0.1.23 (Apache-2.0 OR MIT) +https://github.com/alexcrichton/rustc-demangle +--------------------------------------------------------- + +rustix 0.38.26 (Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT) +https://github.com/bytecodealliance/rustix +--------------------------------------------------------- + +rustversion 1.0.14 (Apache-2.0 OR MIT) +https://github.com/dtolnay/rustversion +--------------------------------------------------------- + +safe_arch 0.7.1 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Lokathor/safe_arch +--------------------------------------------------------- + +serde 1.0.193 (Apache-2.0 OR MIT) +https://github.com/serde-rs/serde +--------------------------------------------------------- + +serde_derive 1.0.193 (Apache-2.0 OR MIT) +https://github.com/serde-rs/serde +--------------------------------------------------------- + +sharded-slab 0.1.7 (MIT) +https://github.com/hawkw/sharded-slab +--------------------------------------------------------- + +simba 0.8.1 (Apache-2.0) +https://github.com/dimforge/simba +--------------------------------------------------------- + +slab 0.4.9 (MIT) +https://github.com/tokio-rs/slab +--------------------------------------------------------- + +smallvec 1.11.2 (Apache-2.0 OR MIT) +https://github.com/servo/rust-smallvec +--------------------------------------------------------- + +socket2 0.4.10 (Apache-2.0 OR MIT) +https://github.com/rust-lang/socket2 +--------------------------------------------------------- + +socket2 0.5.5 (Apache-2.0 OR MIT) +https://github.com/rust-lang/socket2 +--------------------------------------------------------- + +strsim 0.10.0 (MIT) +https://github.com/dguo/strsim-rs +--------------------------------------------------------- + +syn 2.0.39 (Apache-2.0 OR MIT) +https://github.com/dtolnay/syn +--------------------------------------------------------- + +sync_wrapper 0.1.2 (Apache-2.0) +https://github.com/Actyx/sync_wrapper +--------------------------------------------------------- + +tap 1.0.1 (MIT) +https://github.com/myrrlyn/tap +--------------------------------------------------------- + +tempfile 3.8.1 (Apache-2.0 OR MIT) +https://github.com/Stebalien/tempfile +--------------------------------------------------------- + +thiserror 1.0.50 (Apache-2.0 OR MIT) +https://github.com/dtolnay/thiserror +--------------------------------------------------------- + +thiserror-impl 1.0.50 (Apache-2.0 OR MIT) +https://github.com/dtolnay/thiserror +--------------------------------------------------------- + +thread_local 1.1.7 (Apache-2.0 OR MIT) +https://github.com/Amanieu/thread_local-rs +--------------------------------------------------------- + +time 0.3.30 (Apache-2.0 OR MIT) +https://github.com/time-rs/time +--------------------------------------------------------- + +time-core 0.1.2 (Apache-2.0 OR MIT) +https://github.com/time-rs/time +--------------------------------------------------------- + +tokio 1.34.0 (MIT) +https://github.com/tokio-rs/tokio +--------------------------------------------------------- + +tokio-io-timeout 1.2.0 (Apache-2.0 OR MIT) +https://github.com/sfackler/tokio-io-timeout +--------------------------------------------------------- + +tokio-macros 2.2.0 (MIT) +https://github.com/tokio-rs/tokio +--------------------------------------------------------- + +tokio-stream 0.1.14 (MIT) +https://github.com/tokio-rs/tokio +--------------------------------------------------------- + +tokio-util 0.7.10 (MIT) +https://github.com/tokio-rs/tokio +--------------------------------------------------------- + +tonic 0.10.2 (MIT) +https://github.com/hyperium/tonic +--------------------------------------------------------- + +tonic-build 0.10.2 (MIT) +https://github.com/hyperium/tonic +--------------------------------------------------------- + +tower 0.4.13 (MIT) +https://github.com/tower-rs/tower +--------------------------------------------------------- + +tower-layer 0.3.2 (MIT) +https://github.com/tower-rs/tower +--------------------------------------------------------- + +tower-service 0.3.2 (MIT) +https://github.com/tower-rs/tower +--------------------------------------------------------- + +tracing 0.1.40 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +tracing-attributes 0.1.27 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +tracing-core 0.1.32 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +tracing-log 0.2.0 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +tracing-subscriber 0.3.18 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +try-lock 0.2.5 (MIT) +https://github.com/seanmonstar/try-lock +--------------------------------------------------------- + +typenum 1.17.0 (Apache-2.0 OR MIT) +https://github.com/paholg/typenum +--------------------------------------------------------- + +unicode-ident 1.0.12 ((MIT OR Apache-2.0) AND Unicode-DFS-2016) +https://github.com/dtolnay/unicode-ident +--------------------------------------------------------- + +utf8parse 0.2.1 (Apache-2.0 OR MIT) +https://github.com/alacritty/vte +--------------------------------------------------------- + +valuable 0.1.0 (MIT) +https://github.com/tokio-rs/valuable +--------------------------------------------------------- + +want 0.3.1 (MIT) +https://github.com/seanmonstar/want +--------------------------------------------------------- + +wasi 0.11.0+wasi-snapshot-preview1 (Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT) +https://github.com/bytecodealliance/wasi +--------------------------------------------------------- + +wasm-bindgen 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen +--------------------------------------------------------- + +wasm-bindgen-backend 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/backend +--------------------------------------------------------- + +wasm-bindgen-macro 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro +--------------------------------------------------------- + +wasm-bindgen-macro-support 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro-support +--------------------------------------------------------- + +wasm-bindgen-shared 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/shared +--------------------------------------------------------- + +which 4.4.2 (MIT) +https://github.com/harryfei/which-rs.git +--------------------------------------------------------- + +wide 0.7.13 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Lokathor/wide +--------------------------------------------------------- + +winapi 0.3.9 (Apache-2.0 OR MIT) +https://github.com/retep998/winapi-rs +--------------------------------------------------------- + +winapi-i686-pc-windows-gnu 0.4.0 (Apache-2.0 OR MIT) +https://github.com/retep998/winapi-rs +--------------------------------------------------------- + +winapi-x86_64-pc-windows-gnu 0.4.0 (Apache-2.0 OR MIT) +https://github.com/retep998/winapi-rs +--------------------------------------------------------- + +windows 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-core 0.51.1 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-core 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-sys 0.48.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-sys 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-targets 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-targets 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_gnullvm 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_gnullvm 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_msvc 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_msvc 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_gnu 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_gnu 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_msvc 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_msvc 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnu 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnu 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnullvm 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnullvm 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_msvc 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_msvc 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +wyz 0.5.1 (MIT) +https://github.com/myrrlyn/wyz + +--------------------------------------------------------- + +0BSD + +--- + +Permission to use, copy, modify, and/or distribute this software for +any purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE +FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY +DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN +AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +--------------------------------------------------------- + +Apache-2.0 + +--- + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + 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. +--------------------------------------------------------- + +BSD-3-Clause + +--- + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------- + +LLVM-exception + +--- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. + +============================================================================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2019 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. +--------------------------------------------------------- + +MIT + +--- + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +Unicode-DFS-2016 + +--- + +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + +See Terms of Use +for definitions of Unicode Inc.'s Data Files and Software. + +NOTICE TO USER: Carefully read the following legal agreement. +BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S +DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), +YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. +IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE +THE DATA FILES OR SOFTWARE. + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2023 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in https://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Unicode data files and any associated documentation +(the "Data Files") or Unicode software and any associated documentation +(the "Software") to deal in the Data Files or Software +without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that either +(a) this copyright and permission notice appear with all copies +of the Data Files or Software, or +(b) this copyright and permission notice appear in associated +Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in these Data Files or Software without prior +written authorization of the copyright holder. +--------------------------------------------------------- + +Zlib + +--- + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. +--------------------------------------------------------- diff --git a/SOEMAUTDServer/src/log_formatter.rs b/SOEMAUTDServer/src/log_formatter.rs new file mode 100644 index 0000000..22d0a0c --- /dev/null +++ b/SOEMAUTDServer/src/log_formatter.rs @@ -0,0 +1,62 @@ +/* + * File: log_formatter.rs + * Project: autd-server + * Created Date: 14/10/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 14/10/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +use tracing_core::{Event, Subscriber}; +use tracing_subscriber::fmt::{ + format::{self, FormatEvent, FormatFields}, + FmtContext, FormattedFields, +}; +use tracing_subscriber::registry::LookupSpan; + +pub struct LogFormatter; + +impl FormatEvent for LogFormatter +where + S: Subscriber + for<'a> LookupSpan<'a>, + N: for<'a> FormatFields<'a> + 'static, +{ + fn format_event( + &self, + ctx: &FmtContext<'_, S, N>, + mut writer: format::Writer<'_>, + event: &Event<'_>, + ) -> std::fmt::Result { + let metadata = event.metadata(); + write!( + &mut writer, + " {} {:<6}", + chrono::Local::now().format("%Y-%m-%d %H:%M:%S"), + metadata.level(), + )?; + + if let Some(scope) = ctx.event_scope() { + for span in scope.from_root() { + write!(writer, "{}", span.name())?; + + let ext = span.extensions(); + let fields = &ext + .get::>() + .expect("will never be `None`"); + + if !fields.is_empty() { + write!(writer, "{{{}}}", fields)?; + } + write!(writer, ": ")?; + } + } + + ctx.field_format().format_fields(writer.by_ref(), event)?; + + writeln!(writer) + } +} diff --git a/SOEMAUTDServer/src/main.rs b/SOEMAUTDServer/src/main.rs new file mode 100644 index 0000000..03cf7ed --- /dev/null +++ b/SOEMAUTDServer/src/main.rs @@ -0,0 +1,231 @@ +/* + * File: main.rs + * Project: autd-server + * Created Date: 27/09/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 06/11/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +#![allow(non_snake_case)] + +mod log_formatter; + +use log_formatter::LogFormatter; + +use autd3_driver::{ + cpu::TxDatagram, + link::{Link, LinkBuilder}, + timer_strategy::TimerStrategy, +}; +use autd3_link_soem::{SyncMode, SOEM}; +use autd3_protobuf::*; + +use clap::{Args, Parser, Subcommand, ValueEnum}; + +use tokio::{ + runtime::Runtime, + sync::{mpsc, RwLock}, +}; +use tonic::{transport::Server, Request, Response, Status}; + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)] +enum SyncModeArg { + /// DC Sync + DC, + /// FreeRun mode + FreeRun, +} + +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)] +enum TimerStrategyArg { + /// use native timer + NativeTimer, + /// use sleep + Sleep, + /// use busy wait + BusyWait, +} + +#[derive(Parser)] +#[command(author, version, about, long_about = None)] +#[command( + help_template = "Author: {author-with-newline} {about-section}Version: {version} \n\n {usage-heading} {usage} \n\n {all-args} {tab}" +)] +struct Cli { + #[command(subcommand)] + command: Commands, +} + +#[derive(Args)] +struct Arg { + /// Interface name + #[clap(short = 'i', long = "ifname", default_value = "")] + ifname: String, + /// Client port + #[clap(short = 'p', long = "port")] + port: u16, + /// Sync0 cycle time in units of 500us + #[clap(short = 's', long = "sync0", default_value = "2")] + sync0: u64, + /// Send cycle time in units of 500us + #[clap(short = 'c', long = "send", default_value = "2")] + send: u64, + /// Buffer size + #[clap(short = 'b', long = "buffer_size", default_value = "32")] + buf_size: usize, + /// Sync mode + #[clap(short = 'm', long = "sync_mode", default_value = "free-run")] + sync_mode: SyncModeArg, + /// Timer strategy + #[clap(short = 'w', long = "timer", default_value = "sleep")] + timer_strategy: TimerStrategyArg, + /// State check interval in ms + #[clap(short = 'e', long = "state_check_interval", default_value = "500")] + state_check_interval: u64, + /// Timeout in ms + #[clap(short = 't', long = "timeout", default_value = "20")] + timeout: u64, +} + +#[derive(Subcommand)] +enum Commands { + Run(Arg), + /// List available interfaces + List, +} + +struct SOEMServer { + num_dev: usize, + soem: RwLock, +} + +#[tonic::async_trait] +impl ecat_server::Ecat for SOEMServer { + async fn send_data( + &self, + request: Request, + ) -> Result, Status> { + let tx = TxDatagram::from_msg(&request.into_inner()); + Ok(Response::new(SendResponse { + success: Link::send(&mut *self.soem.write().await, &tx) + .await + .unwrap_or(false), + })) + } + + async fn read_data(&self, _: Request) -> Result, Status> { + let mut rx = vec![autd3_driver::cpu::RxMessage { ack: 0, data: 0 }; self.num_dev]; + Link::receive(&mut *self.soem.write().await, &mut rx) + .await + .unwrap_or(false); + Ok(Response::new(rx.to_msg())) + } + + async fn close(&self, _: Request) -> Result, Status> { + self.soem.write().await.clear_iomap(); + Ok(Response::new(CloseResponse { success: true })) + } +} + +async fn main_() -> anyhow::Result<()> { + let cli = Cli::parse(); + + match &cli.command { + Commands::List => { + println!("Available interfaces:"); + let adapters = autd3_link_soem::EthernetAdapters::new(); + let name_len = adapters + .into_iter() + .map(|adapter| adapter.name().len()) + .max() + .unwrap_or(0); + adapters.into_iter().for_each(|adapter| { + println!("\t{:name_len$}\t{}", adapter.name(), adapter.desc()); + }); + } + Commands::Run(args) => { + let port = args.port; + let ifname = args.ifname.to_string(); + let sync0_cycle = args.sync0; + let send_cycle = args.send; + let state_check_interval = args.state_check_interval; + let sync_mode = match args.sync_mode { + SyncModeArg::DC => SyncMode::DC, + SyncModeArg::FreeRun => SyncMode::FreeRun, + }; + let timer_strategy = match args.timer_strategy { + TimerStrategyArg::NativeTimer => TimerStrategy::NativeTimer, + TimerStrategyArg::Sleep => TimerStrategy::Sleep, + TimerStrategyArg::BusyWait => TimerStrategy::BusyWait, + }; + let buf_size = args.buf_size; + let timeout = args.timeout; + let f = move || -> autd3_link_soem::local::link_soem::SOEMBuilder { + autd3_link_soem::SOEM::builder() + .with_buf_size(buf_size) + .with_ifname(ifname.clone()) + .with_send_cycle(send_cycle) + .with_state_check_interval(std::time::Duration::from_millis( + state_check_interval, + )) + .with_sync0_cycle(sync0_cycle) + .with_timer_strategy(timer_strategy) + .with_sync_mode(sync_mode) + .with_timeout(std::time::Duration::from_millis(timeout)) + .with_on_lost(|msg| { + tracing::error!("{}", msg); + std::process::exit(-1); + }) + }; + let (tx, mut rx) = mpsc::channel(1); + ctrlc::set_handler(move || { + let rt = Runtime::new().expect("failed to obtain a new Runtime object"); + rt.block_on(tx.send(())).unwrap(); + }) + .expect("Error setting Ctrl-C handler"); + + let addr = format!("0.0.0.0:{}", port).parse()?; + tracing::info!("Waiting for client connection on {}", addr); + let rt = Runtime::new().expect("failed to obtain a new Runtime object"); + + tracing::info!("Starting SOEM server..."); + + let soem = f() + .open(&autd3_driver::geometry::Geometry::new(vec![])) + .await?; + let num_dev = SOEM::num_devices(); + + tracing::info!("{} AUTDs found", num_dev); + + let server_future = Server::builder() + .add_service(ecat_server::EcatServer::new(SOEMServer { + num_dev, + soem: RwLock::new(soem), + })) + .serve_with_shutdown(addr, async { + let _ = rx.recv().await; + }); + rt.block_on(server_future)?; + } + } + + Ok(()) +} + +#[tokio::main] +async fn main() { + tracing_subscriber::fmt().event_format(LogFormatter).init(); + + match main_().await { + Ok(_) => {} + Err(e) => { + tracing::error!("{}", e); + std::process::exit(-1); + } + } +} diff --git a/ThirdPartyNotice.txt b/ThirdPartyNotice.txt new file mode 100644 index 0000000..7bd2aa7 --- /dev/null +++ b/ThirdPartyNotice.txt @@ -0,0 +1,769 @@ +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION + +This software includes the following third-party components. +The license terms for each of these components are provided later in this notice. + + +--------------------------------------------------------- + +@ampproject/remapping 2.2.1 Apache-2.0 +git+https://github.com/ampproject/remapping.git +--------------------------------------------------------- + +@babel/code-frame 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/compat-data 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/core 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/generator 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/helper-compilation-targets 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/helper-environment-visitor 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/helper-function-name 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/helper-hoist-variables 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/helper-module-imports 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/helper-module-transforms 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/helper-simple-access 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/helper-split-export-declaration 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/helper-string-parser 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/helper-validator-identifier 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/helper-validator-option 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/helpers 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/highlight 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/parser 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/template 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/traverse 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@babel/types 7.22.5 MIT +https://github.com/babel/babel.git +--------------------------------------------------------- + +@jridgewell/gen-mapping 0.3.3 MIT +https://github.com/jridgewell/gen-mapping +--------------------------------------------------------- + +@jridgewell/resolve-uri 3.1.0 MIT +https://github.com/jridgewell/resolve-uri +--------------------------------------------------------- + +@jridgewell/set-array 1.1.2 MIT +https://github.com/jridgewell/set-array +--------------------------------------------------------- + +@jridgewell/sourcemap-codec 1.4.15 MIT +git+https://github.com/jridgewell/sourcemap-codec.git +--------------------------------------------------------- + +@jridgewell/sourcemap-codec 1.4.14 MIT +git+https://github.com/jridgewell/sourcemap-codec.git +--------------------------------------------------------- + +@jridgewell/trace-mapping 0.3.18 MIT +git+https://github.com/jridgewell/trace-mapping.git +--------------------------------------------------------- + +magic-string 0.30.1 MIT +https://github.com/rich-harris/magic-string +--------------------------------------------------------- + +@sveltejs/vite-plugin-svelte 2.4.2 MIT +git+https://github.com/sveltejs/vite-plugin-svelte.git +--------------------------------------------------------- + +@sveltejs/vite-plugin-svelte-inspector 1.0.3 MIT +git+https://github.com/sveltejs/vite-plugin-svelte.git +--------------------------------------------------------- + +aria-query 5.3.0 Apache-2.0 +git+https://github.com/A11yance/aria-query.git +--------------------------------------------------------- + +axobject-query 3.2.1 Apache-2.0 +git+https://github.com/A11yance/axobject-query.git +--------------------------------------------------------- + +braces 3.0.2 MIT +micromatch/braces +--------------------------------------------------------- + +browserslist 4.21.9 MIT +browserslist/browserslist +--------------------------------------------------------- + +buffer-crc32 0.2.13 MIT +git://github.com/brianloveswords/buffer-crc32.git +--------------------------------------------------------- + +chokidar 3.5.3 MIT +git+https://github.com/paulmillr/chokidar.git +--------------------------------------------------------- + +estree-walker 3.0.3 MIT +https://github.com/Rich-Harris/estree-walker +--------------------------------------------------------- + +color-convert 1.9.3 MIT +Qix-/color-convert +--------------------------------------------------------- + +color-name 1.1.3 MIT +git@github.com:dfcreative/color-name.git +--------------------------------------------------------- + +css-tree 2.3.1 MIT +csstree/csstree +--------------------------------------------------------- + +debug 4.3.4 MIT +git://github.com/debug-js/debug.git +--------------------------------------------------------- + +electron-to-chromium 1.4.449 ISC +https://github.com/kilian/electron-to-chromium/ +--------------------------------------------------------- + +es6-promise 3.3.1 MIT +git://github.com/stefanpenner/es6-promise.git +--------------------------------------------------------- + +estree-walker 3.0.0 MIT +https://github.com/Rich-Harris/estree-walker +--------------------------------------------------------- + +fastq 1.15.0 ISC +git+https://github.com/mcollina/fastq.git +--------------------------------------------------------- + +fill-range 7.0.1 MIT +jonschlinkert/fill-range +--------------------------------------------------------- + +fs.realpath 1.0.0 ISC +git+https://github.com/isaacs/fs.realpath.git +--------------------------------------------------------- + +gensync 1.0.0-beta.2 MIT +https://github.com/loganfsmyth/gensync.git +--------------------------------------------------------- + +glob 7.2.3 ISC +git://github.com/isaacs/node-glob.git +--------------------------------------------------------- + +glob-parent 5.1.2 ISC +gulpjs/glob-parent +--------------------------------------------------------- + +inflight 1.0.6 ISC +https://github.com/npm/inflight.git +--------------------------------------------------------- + +is-extglob 2.1.1 MIT +jonschlinkert/is-extglob +--------------------------------------------------------- + +is-glob 4.0.3 MIT +micromatch/is-glob +--------------------------------------------------------- + +is-number 7.0.0 MIT +jonschlinkert/is-number +--------------------------------------------------------- + +is-reference 3.0.1 MIT +git+https://github.com/Rich-Harris/is-reference.git +--------------------------------------------------------- + +js-tokens 4.0.0 MIT +lydell/js-tokens +--------------------------------------------------------- + +json5 2.2.3 MIT +git+https://github.com/json5/json5.git +--------------------------------------------------------- + +locate-character 3.0.0 MIT +git+https://gitlab.com/Rich-Harris/locate-character.git +--------------------------------------------------------- + +lru-cache 5.1.1 ISC +git://github.com/isaacs/node-lru-cache.git +--------------------------------------------------------- + +magic-string 0.27.0 MIT +https://github.com/rich-harris/magic-string +--------------------------------------------------------- + +mdn-data 2.0.30 CC0-1.0 +https://github.com/mdn/data.git +--------------------------------------------------------- + +micromatch 4.0.5 MIT +micromatch/micromatch +--------------------------------------------------------- + +minimatch 3.1.2 ISC +git://github.com/isaacs/minimatch.git +--------------------------------------------------------- + +mkdirp 0.5.6 MIT +https://github.com/substack/node-mkdirp.git +--------------------------------------------------------- + +nanoid 3.3.6 MIT +ai/nanoid +--------------------------------------------------------- + +node-releases 2.0.12 MIT +chicoxyzzy/node-releases +--------------------------------------------------------- + +normalize-path 3.0.0 MIT +jonschlinkert/normalize-path +--------------------------------------------------------- + +once 1.4.0 ISC +git://github.com/isaacs/once +--------------------------------------------------------- + +picocolors 1.0.0 ISC +alexeyraspopov/picocolors +--------------------------------------------------------- + +picomatch 2.3.1 MIT +micromatch/picomatch +--------------------------------------------------------- + +postcss 8.4.27 MIT +postcss/postcss +--------------------------------------------------------- + +readdirp 3.6.0 MIT +git://github.com/paulmillr/readdirp.git +--------------------------------------------------------- + +reusify 1.0.4 MIT +git+https://github.com/mcollina/reusify.git +--------------------------------------------------------- + +rimraf 2.7.1 ISC +git://github.com/isaacs/rimraf.git +--------------------------------------------------------- + +rollup 3.26.0 MIT +rollup/rollup +--------------------------------------------------------- + +sander 0.5.1 MIT +https://github.com/rich-harris/sander +--------------------------------------------------------- + +sorcery 0.11.0 MIT +https://github.com/Rich-Harris/sorcery +--------------------------------------------------------- + +source-map-js 1.0.2 BSD-3-Clause +7rulnik/source-map-js +--------------------------------------------------------- + +estree-walker 3.0.3 MIT +https://github.com/Rich-Harris/estree-walker +--------------------------------------------------------- + +magic-string 0.30.1 MIT +https://github.com/rich-harris/magic-string +--------------------------------------------------------- + +svelte 4.1.1 MIT +https://github.com/sveltejs/svelte.git +--------------------------------------------------------- + +svelte-check 3.4.6 MIT +git+https://github.com/sveltejs/language-tools.git +--------------------------------------------------------- + +svelte-hmr 0.15.2 ISC +https://github.com/sveltejs/svelte-hmr +--------------------------------------------------------- + +svelte-preprocess 5.0.4 MIT +https://github.com/sveltejs/svelte-preprocess +--------------------------------------------------------- + +svelte-simple-modal 1.6.1 MIT +git+https://github.com/flekschas/svelte-simple-modal.git +--------------------------------------------------------- + +the-new-css-reset 1.9.0 MIT +git+https://github.com/elad2412/the-new-css-reset.git +--------------------------------------------------------- + +to-regex-range 5.0.1 MIT +micromatch/to-regex-range +--------------------------------------------------------- + +tslib 2.6.0 0BSD +https://github.com/Microsoft/tslib.git +--------------------------------------------------------- + +typescript 5.1.6 Apache-2.0 +https://github.com/Microsoft/TypeScript.git +--------------------------------------------------------- + +update-browserslist-db 1.0.11 MIT +browserslist/update-db +--------------------------------------------------------- + +vite 4.4.6 MIT +git+https://github.com/vitejs/vite.git +--------------------------------------------------------- + +wrappy 1.0.2 ISC +https://github.com/npm/wrappy +--------------------------------------------------------- + +yallist 3.1.1 ISC +git+https://github.com/isaacs/yallist.git + +--------------------------------------------------------- + +0BSD + +--- + +Permission to use, copy, modify, and/or distribute this software for +any purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE +FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY +DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN +AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +--------------------------------------------------------- + +Apache-2.0 + +--- + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + 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. +--------------------------------------------------------- + +BSD-3-Clause + +--- + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------- + +CC0-1.0 + +--- + +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. +--------------------------------------------------------- + +ISC + +--- + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +--------------------------------------------------------- + +MIT + +--- + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- diff --git a/TwinCATAUTDServer/.gitignore b/TwinCATAUTDServer/.gitignore new file mode 100644 index 0000000..611428f --- /dev/null +++ b/TwinCATAUTDServer/.gitignore @@ -0,0 +1,353 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ +[Ll]ogs/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Coverlet is a free, cross platform Code Coverage Tool +coverage*[.json, .xml, .info] + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# Ionide (cross platform F# VS Code tools) working folder +.ionide/ diff --git a/TwinCATAUTDServer/AUTDServer.sln b/TwinCATAUTDServer/AUTDServer.sln new file mode 100644 index 0000000..5af8d13 --- /dev/null +++ b/TwinCATAUTDServer/AUTDServer.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.40629.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TwinCATAUTDServer", "TwinCATAUTDServer\TwinCATAUTDServer.csproj", "{99789BFC-DB1F-47E0-AD97-6E348ECC2BA5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {99789BFC-DB1F-47E0-AD97-6E348ECC2BA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {99789BFC-DB1F-47E0-AD97-6E348ECC2BA5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {99789BFC-DB1F-47E0-AD97-6E348ECC2BA5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {99789BFC-DB1F-47E0-AD97-6E348ECC2BA5}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/TwinCATAUTDServer/LICENSE b/TwinCATAUTDServer/LICENSE new file mode 100644 index 0000000..fb07ded --- /dev/null +++ b/TwinCATAUTDServer/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Shun Suzuki + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/TwinCATAUTDServer/TwinCATAUTDServer/App.config b/TwinCATAUTDServer/TwinCATAUTDServer/App.config new file mode 100644 index 0000000..4bfa005 --- /dev/null +++ b/TwinCATAUTDServer/TwinCATAUTDServer/App.config @@ -0,0 +1,6 @@ + + + + + + diff --git a/TwinCATAUTDServer/TwinCATAUTDServer/ItemTypes.cs b/TwinCATAUTDServer/TwinCATAUTDServer/ItemTypes.cs new file mode 100644 index 0000000..09efe11 --- /dev/null +++ b/TwinCATAUTDServer/TwinCATAUTDServer/ItemTypes.cs @@ -0,0 +1,2456 @@ +using System.ComponentModel; +using System; +using TCatSysManagerLib; + + +namespace TwinCAT.SystemManager +{ + + + /// + /// Tree Item Type for the Tree Item + /// + /// This is the CLS-compliant, corresponding type to TCatSysManagerLibs TREEITEMTYPE + public enum TreeItemType + { + /// + /// NotProcessed Tree Item object (Uninitialized, 0) + /// + [Description("Uninitialized / Unknown item.")] + None = TREEITEMTYPES.TREEITEMTYPE_UNKNOWN, + /// + /// System configuration Tree Item ("SYSTEM-Konfiguration") TIRC (Has no valid Type at the moment == 0) + /// + [Description("System configuration Item.")] + SystemConfiguration = 0, + /// + /// Task item (Task, 1) + /// + [Description("Task item.")] + Task = TREEITEMTYPES.TREEITEMTYPE_TASK, + /// + /// Device item (Device, 2) + /// + [Description("Device item.")] + Device = TREEITEMTYPES.TREEITEMTYPE_DEVICE, + /// + /// Process-Image (Image, 3) + /// + [Description("Process-Image item.")] + Image = TREEITEMTYPES.TREEITEMTYPE_IMAGE, + /// + /// Mapping (Mapping, 4) + /// + [Description("Mapping item.")] + Mapping = TREEITEMTYPES.TREEITEMTYPE_MAPPING, + /// + /// Box item (Box, 5) + /// + [Description("Box item.")] + Box = TREEITEMTYPES.TREEITEMTYPE_BOX, + + /// + /// Terminal item (Term, 6) + /// + [Description("Terminal item.")] + Terminal = TREEITEMTYPES.TREEITEMTYPE_TERM, + /// + /// Variable / Symbol item (Var, 7) + /// + [Description("Variable / Symbol item.")] + Variable = TREEITEMTYPES.TREEITEMTYPE_VAR, + /// + /// Variable group item (VarGrp, 8) or Channels in Terminals + /// + + [Description("Variable group item or Channels in Terminals")] + VariableGroup = TREEITEMTYPES.TREEITEMTYPE_VARGRP, + /// + /// PlcControl project item (IecPrj, 9) + /// + + [Description("PlcControl project item.")] + IecProject = TREEITEMTYPES.TREEITEMTYPE_IECPRJ, + /// + /// Cnc Project Item. (CncPrj, 10) + /// + + [Description("Cnc Project Item.")] + CncProject = TREEITEMTYPES.TREEITEMTYPE_CNCPRJ, + /// + /// GSD Described Module + /// + + [Description("GSD Description Module.")] + GsdModule = TREEITEMTYPES.TREEITEMTYPE_GSDMOD, + /// + /// CDL Item. + /// + + [Description("CDL")] + Cdl = TREEITEMTYPES.TREEITEMTYPE_CDL, + /// + /// PLC Runtime item (IecLzs, 13) + /// + [Description("PLC Runtime item")] + PlcRuntime = TREEITEMTYPES.TREEITEMTYPE_IECLZS, + /// + /// + /// + [Obsolete("User PlcRuntime instead,false")] + PlcProject = 13, + /// + /// Plc configuration (LzsGrp) + /// + + [Description("Plc configuration Item.")] + PlcConfiguration = TREEITEMTYPES.TREEITEMTYPE_LZSGRP, + /// + /// IO configuration + /// + + [Description("IO configuration Item.")] + IOConfiguration = TREEITEMTYPES.TREEITEMTYPE_IODEF, + /// + /// Additional Tasks (AddTasks, 16) + /// + + [Description("Additional Tasks Item.")] + AdditionalTasks = TREEITEMTYPES.TREEITEMTYPE_ADDTASKS, + /// + /// Device Group Item + /// + + [Description("Device Group Item.")] + DeviceGroup = TREEITEMTYPES.TREEITEMTYPE_DEVICEGRP, + /// + /// Map Group + /// + + [Description("Map Group Item.")] + MapGroup = TREEITEMTYPES.TREEITEMTYPE_MAPGRP, + /// + /// NC Configuration (NCDEF, 19) + /// + + [Description("NC Configuration Item")] + NCConfiguration = TREEITEMTYPES.TREEITEMTYPE_NCDEF, + /// + /// NC Axes + /// + + [Description("NC Axes item.")] + [Obsolete("Not supported, use TreeItemType.NCChannel instead!",true)] + [EditorBrowsable(EditorBrowsableState.Never)] + NCAxes = TREEITEMTYPES.TREEITEMTYPE_NCAXISES, + + /// + /// NC Channel (e.g. the Node 'Axes') (NCChannel, 21) + /// + [Description("NC Channel (e.g. the Node 'Axes') Item.")] + NCChannel = 21, + /// + /// NC Axis + /// + [Description("NC Axis Item.")] + NCAxis = 22, + /// + /// Axis Encoder (ID: 23) + /// + [Description("Axis Encoder Item.")] + NCEncoder = 23, + /// + /// Axis drive (ID: 24) + /// + NCDrive = 24, + /// + /// Axis controller + /// + [Description("Axis controller Item.")] + NCController = 25, + /// + /// NC Group + /// + + [Description("NC Group Item.")] + NCGroup = 26, + /// + /// NC Interpreter + /// + + [Description("NC Interpreter Item")] + NCInterpreter = 27, + /// + /// CanPDO + /// + + [Description("CanPDO Item.")] + CanPdo = 30, + /// + ///Real time Settings ATTENTION THE TYPE IS IDENTICAL TO RouteSettings(RTimeSet, 31) + /// + + [Description("Real time Settings Item.)")] + RealTimeSettings = 31, + /// + /// Route Settings (RTimeSet, 31) + /// + + [Description("Route Settings Item.")] + RouteSettings = 31, + /// + /// PLC Variables of the BC + /// + + [Description("PLC Variables Item of the BC")] + BcPlcVariables = 32, + /// + /// File Name item. + /// + + [Description("File Name Item.")] + FileName = 33, + /// + /// DnetConnect. + /// + + [Description("DnetConnect Item.")] + DnetConnect = 34, + /// + /// Network variable publisher + /// + [Description("Network variable publisher Item.")] + NVPublisherVar = 35, + /// + /// Network variable subscriber + /// + [Description("Network variable subscriber Item.")] + NVSubscriberVar = 36, + /// + /// FlbCmd + /// + + [Description("FlbCmd Item.")] + FlbCmd = 37, + /// + /// NC Table Group Item + /// + + [Description("NC Table Group Item.")] + NCTableGroup = 40, + /// + /// NC Table + /// + + [Description("NC Table Item.")] + NCTable = 41, + /// + /// NC Table Slave Item. + /// + + [Description("NC Table Slave Item.")] + NCTableSlave = 42, + + /// + /// EipConnection item. + /// + [Description("EipConnection Item.")] + EipConnection = 43, + /// + /// PnIoApi Item. + /// + [Description("PnIoApi Item.")] + PnIoApi = 44, + /// + /// PnIoMod Item. + /// + [Description("PnIoMod Item.")] + PnIoMod = 45, + /// + /// PnIoSubMod item. + /// + [Description("PnIoSubMod Item.")] + PnIoSubMod = 46, + /// + /// Ethernet Protocol Item. + /// + [Description("Ethernet Protocol Item.")] + EthernetProtocol = 47, + /// + /// TCOM object (48) + /// x0d\x0a + [Description("TCOM object Item.")] + TComObject = 48, + /// + /// TCOM Object group (49) + /// + [Description("TCOM Object group Item.")] + TComObjectGroup = 49, + /// + /// UdpIpSendData Item. + /// + [Description("UdpIpSendData Item.")] + UdpIpSendData = 50, + /// + /// UdpIpReceiveData Item. + /// + [Description("UdpIpReceiveData Item.")] + UdpIpReceiveData = 51, + + /// + /// + /// + TComMapping = 52, + /// + /// + /// + ModuleCfgEditGrp = 53, + /// + /// + /// + ModuleCfgEdit = 54, + /// + /// + /// + CCatSlot = 55, + /// + /// Nested Plc Project (56) + /// + PlcProjectDef = TREEITEMTYPES.TREEITEMTYPE_PLCPROJECTDEF, + /// + /// + /// + TComPlcObject = 57, + /// + /// + /// + HierarchyNode = 58, + /// + /// + /// + License = 59, + + /// + /// "TIAC" CAM Configuration + /// + /// Path: "TIAC" + [Description("CAM Configuration Item.")] + CamDef = 200, + /// + /// CamGroup item. + /// + + [Description("CamGroup Item.")] + CamGroup = 201, + /// + /// Cam Item. + /// + + [Description("Cam Item.")] + Cam = 202, + /// + /// CamEncoder Item. + /// + + [Description("CamEncoder Item.")] + CamEncoder = 203, + /// + /// CamToolGroup Item. + /// + + [Description("CamToolGroup Item.")] + CamToolGroup = 204, + /// + /// CamTool Item. + /// + + [Description("CamTool Item.")] + CamTool = 205, + /// + /// LineDef Item. + /// + + [Description("LineDef Item.")] + LineDef = 300, + /// + /// CNC Configuration (400) + /// + + [Description("CNC Configuration Item.")] + CncConfiguration = 400, + /// + /// ISG Channel item + /// + + [Description("ISG Channel Item")] + CncChannel = 401, + /// + /// CNC Axis Group Item + /// + + [Description("CNC Axis Group Item")] + CncAxisGroup = 402, + /// + /// CNC Axis (ISG, 403) + /// + + [Description("CNC Axis Item.")] + CncAxis = 403, + + /// + /// + /// + RtsConfig = 500, + /// + /// + /// + RtsApp = 501, + /// + /// + /// + RtsAppTask = 502, + /// + /// + /// + RtsAdi = 503, + /// + /// + /// + CppConfig = 504, + /// + /// + /// + SplcConfig = 505, + + /// + /// Plc Application (Root Plc Object, 600) + /// + PlcApplication = TREEITEMTYPES.TREEITEMTYPE_PLCAPP, + /// + /// Plc Folder object (601) + /// + PlcFolder = TREEITEMTYPES.TREEITEMTYPE_PLCFOLDER, + + /// + /// Plc POU Program (602) + /// + PlcPouProgram = TREEITEMTYPES.TREEITEMTYPE_PLCPOUPROG, + /// + /// Plc POU Function (603) + /// + PlcPouFunction = TREEITEMTYPES.TREEITEMTYPE_PLCPOUFUNC, + /// + /// Plc POU Function Block (604) + /// + PlcPouFunctionBlock = TREEITEMTYPES.TREEITEMTYPE_PLCPOUFB, + + /// + /// Plc Enum Datatype (605) + /// + PlcDutEnum = TREEITEMTYPES.TREEITEMTYPE_PLCDUTENUM, + /// + /// Plc Struct DataType (606) + /// + PlcDutStruct = TREEITEMTYPES.TREEITEMTYPE_PLCDUTSTRUCT, + /// + /// Plc Union DataType (607) + /// + PlcDutUnion = TREEITEMTYPES.TREEITEMTYPE_PLCDUTUNION, + + /// + /// Plc Action (608) + /// + PlcAction = TREEITEMTYPES.TREEITEMTYPE_PLCACTION, + /// + /// Plc Method (609) + /// + PlcMethod = TREEITEMTYPES.TREEITEMTYPE_PLCMETHOD, + /// + /// Plc Interface Method (610) + /// + PlcItfMethod = TREEITEMTYPES.TREEITEMTYPE_PLCITFMETH, + /// + /// Plc Property (611) + /// + PlcProperty = TREEITEMTYPES.TREEITEMTYPE_PLCPROP, + /// + /// Plc InterfaceProperty (612) + /// + PlcItfProperty = TREEITEMTYPES.TREEITEMTYPE_PLCITFPROP, + /// + /// Plc Property Getter (613) + /// + PlcPropertyGet = TREEITEMTYPES.TREEITEMTYPE_PLCPROPGET, + /// + /// Plc Property Setter (614) + /// + PlcPropertySet = TREEITEMTYPES.TREEITEMTYPE_PLCPROPSET, + /// + /// Plc Global Variables List (615) + /// + PlcGvl = TREEITEMTYPES.TREEITEMTYPE_PLCGVL, + /// + /// Plc Transient Object (616) + /// + PlcTransition = TREEITEMTYPES.TREEITEMTYPE_PLCTRANSITION, + /// + /// Plc Library Manager (617) + /// + PlcLibraryManager = TREEITEMTYPES.TREEITEMTYPE_PLCLIBMAN, + /// + /// Plc Interface (618) + /// + PlcInterface = TREEITEMTYPES.TREEITEMTYPE_PLCITF, + /// + /// Plc Visual Object (619) + /// + PlcVisualObject = TREEITEMTYPES.TREEITEMTYPE_PLCVISOBJ, + /// + /// Plc Visual Manager (620) + /// + PlcVisualManager = TREEITEMTYPES.TREEITEMTYPE_PLCVISMAN, + + /// + /// Plc Task object (621) + /// + PlcTask = TREEITEMTYPES.TREEITEMTYPE_PLCTASK, + + ///// + ///// Plc Project Information (622) + ///// + //PlcProjectInfo = TREEITEMTYPES.TREEITEMTYPE_PLCPROJECTINFO, + + /// + /// Plc DataType Alias (623) + /// + PlcDutAlias = TREEITEMTYPES.TREEITEMTYPE_PLCDUTALIAS, + + /// + /// Target Visu (624) + /// + PlcTargetVisualization = TREEITEMTYPES.TREEITEMTYPE_PLCTARGETVISU, // TargetVisualization + /// + /// Global Text List (625) + /// + PlcGlobalTextList = TREEITEMTYPES.TREEITEMTYPE_PLCGLOBALTEXTLIST, // Global Text List for Visu + /// + /// Text List (626) + /// + PlcTextList = TREEITEMTYPES.TREEITEMTYPE_PLCTEXTLIST, // Text List for Visu + /// + /// Global Image Pool (627) + /// + PlcGlobalImagePool = TREEITEMTYPES.TREEITEMTYPE_PLCGLOBALIMAGEPOOL, // Global Image Pool for Visu + /// + /// Image Pool (628) + /// + PlcImagePool = TREEITEMTYPES.TREEITEMTYPE_PLCIMAGEPOOL, // Image Pool for Visu + /// + /// Parameter List (629) + /// + PlcGvlParameters = TREEITEMTYPES.TREEITEMTYPE_PLCGVLPARAMLIST, // Global ParameterList + + // Non codesys objects + + /// + /// Plc Program Reference (650) + /// + PlcProgramReference = TREEITEMTYPES.TREEITEMTYPE_PLCPROGREF, + /// + /// Plc External Data Type (Defined in System Manager) (651) + /// + PlcExternalDataType = TREEITEMTYPES.TREEITEMTYPE_PLCEXTDATATYPE, + /// + /// Plc External Data Type Container (652) + /// + PlcExternalDataTypeContainer = TREEITEMTYPES.TREEITEMTYPE_PLCEXTDATATYPECONT, + /// + /// Plc Tmc Description File (653) + /// + PlcTmcDescription = TREEITEMTYPES.TREEITEMTYPE_PLCTMCDESCRIPTION, + + /// + /// Plc interface property getter (654) + /// + PlcItfPropGet = TREEITEMTYPES.TREEITEMTYPE_PLCITFPROPGET, + + /// + /// Plc Interface property setter (655) + /// + PlcItfPropSet = TREEITEMTYPES.TREEITEMTYPE_PLCITFPROPSET, + + /// + /// Nested SAFETY Project Root (800) + /// + SafProjectDef = TREEITEMTYPES.TREEITEMTYPE_SAF_PROJECTDEF, + + /// + /// "Safety Application (801) + /// + SafApplication = TREEITEMTYPES.TREEITEMTYPE_SAF_APP, + /// + /// "Safety Alias Device Folder (802) + /// + SafAliasDevices = TREEITEMTYPES.TREEITEMTYPE_SAF_ALIASDEV, + /// + /// "Safety Group Folder (803) + /// + SafGroup = TREEITEMTYPES.TREEITEMTYPE_SAF_GROUP, + /// + /// "Safety Generated Code Folder (804) + /// + SafGeneratedCode = TREEITEMTYPES.TREEITEMTYPE_SAF_GENERATEDCODE, + /// + /// "Safety Application Language File (805) + /// + SafSALFile = TREEITEMTYPES.TREEITEMTYPE_SAF_SAL_FILE, + /// + /// "Safety C Header File File (806) + /// + SafHFile = TREEITEMTYPES.TREEITEMTYPE_SAF_H_FILE, + /// + /// "Safety C Implementation File File (807) + /// + SafCFile = TREEITEMTYPES.TREEITEMTYPE_SAF_C_FILE, + /// + /// "Nested SAFETY Project Root (808) + /// + SafSDSFile = TREEITEMTYPES.TREEITEMTYPE_SAF_SDS_FILE, + /// + /// Safety target System config file (*.xml) (809)) + /// + SafTargetConfigFile = TREEITEMTYPES.TREEITEMTYPE_SAF_SYSTEMCONFIG, + /// + /// Safety dependent file node (809)) + /// + SafDependentFile = TREEITEMTYPES.TREEITEMTYPE_SAF_DEPENDENTFILE, + + // EndSection Safety + + // Section CPP Nested Projects + /// + /// "Nested CPP Project Root (900) + /// + Cpp_ProjectDef = TREEITEMTYPES.TREEITEMTYPE_CPP_PROJECTDEF // Nested Project Root + // EndSection Safety + + // Non Codesys Objects + } + + /// + /// Box Type + /// + public enum BoxType + { + /// + /// NotProcessed Box Type (BOXTYPE_UNKNOWN) + /// + [Description("NotProcessed Box Type (BOXTYPE_UNKNOWN)")] + Unknown = 0, + /// + /// Lightbus-Buskoppler für bis zu 64 Busklemmen (BK2000) (BOXTYPE_BK2000) + /// + [Description("Lightbus-Buskoppler für bis zu 64 Busklemmen (BK2000) (BOXTYPE_BK2000)")] + Lightbus_BK2000 = 1, + /// + /// Lightbus-Modul, 32 Bit Digital-Ein-/Ausgabemodul, 24 V DC (32Bit Box)(BOXTYPE_M1400) + /// + [Description("Lightbus-Modul, 32 Bit Digital-Ein-/Ausgabemodul, 24 V DC (32Bit Box)(BOXTYPE_M1400)")] + Lightbus_M1400 = 2, + /// + /// Lightbus Modul, 4 Analog-Eingabe und 16 digitale E/A-Kanäle (M2400) (BOXTYPE_M2400) + /// + [Description("Lightbus Modul, 4 Analog-Eingabe und 16 digitale E/A-Kanäle (M2400) (BOXTYPE_M2400)")] + Lightbus_M2400 = 3, + /// + /// Lightbus Modul, Mehrkanal-Inkremental-Encoder (M3xx0)(BOXTYPE_M3120_1) + /// + [Description("Lightbus Modul, Mehrkanal-Inkremental-Encoder (M3xx0)(BOXTYPE_M3120_1)")] + Lightbus_M3xx0 = 4, + /// + /// Lightbus Modul, Mehrkanal-Inkremental-Encoder (M3120-2)(BOXTYPE_M3120_2) + /// + [Description("Lightbus Modul, Mehrkanal-Inkremental-Encoder (M3120-2)(BOXTYPE_M3120_2)")] + Lightbus_M3120_2 = 5, + /// + /// Lightbus Modul, Mehrkanal-Inkremental-Encoder (M3120_3)(BOXTYPE_M3120_3) + /// + [Description("Lightbus Modul, Mehrkanal-Inkremental-Encoder (M3120_3)(BOXTYPE_M3120_3)")] + Lightbus_M3120_3 = 6, + /// + /// Lightbus Modul, Mehrkanal-Inkremental-Encoder (M3120_4)(BOXTYPE_M3120_4) + /// + [Description("Lightbus Modul, Mehrkanal-Inkremental-Encoder (M3120_4)(BOXTYPE_M3120_4)")] + Lightbus_M3120_4 = 7, + /// + /// Lightbus Modul, Absolut-Encoder (M3000) (BOXTYPE_M3000) + /// + [Description("Lightbus Modul, Absolut-Encoder (M3000) (BOXTYPE_M3000)")] + Lightbus_M3000 = 8, + /// + /// C1120 Slave Module (in S5-Rack) (C1120-Slave) (BOXTYPE_C1120) + /// + [Description("C1120 Slave Module (in S5-Rack) (C1120-Slave) (BOXTYPE_C1120)")] + Lightbus_C1120 = 9, + /// + /// Lightbus-Buskoppler für bis zu 64 digitale Busklemmen (BK2010)(BOXTYPE_BK2010) + /// + [Description("Lightbus-Buskoppler für bis zu 64 digitale Busklemmen (BK2010)(BOXTYPE_BK2010)")] + Lightbus_BK2010 = 10, + /// + /// Antriebstechnik: Digital Kompakt Servoverstärker(BOXTYPE_AX2000_B200) + /// + [Description("Antriebstechnik: Digital Kompakt Servoverstärker(BOXTYPE_AX2000_B200)")] + Lightbus_AX2xxx_B200 = 11, // Seidel Antrieb + /// + /// Lightbus Modul, 4 Analog-Eingabemodul (M2510)(BOXTYPE_M2510) + /// + [Description("Lightbus Modul, 4 Analog-Eingabemodul (M2510)(BOXTYPE_M2510)")] + Lightbus_M2510 = 12, + /// + /// Programable CDL (Lightbus) (Prog-CDL)(BOXTYPE_PROG_CDL) + /// + [Description("Programable CDL (Lightbus) (Prog-CDL)(BOXTYPE_PROG_CDL)")] + Lightbus_ProgCDL = 13, + /// + /// Lightbus-"Economy plus"-Buskoppler für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung) (BK2020)(BOXTYPE_BK2020) + /// + [Description("Lightbus-Economy plus-Buskoppler für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung) (BK2020)(BOXTYPE_BK2020)")] + Lightbus_BK2020 = 20, + /// + /// Lightbus-Busklemmen Controller (BC2000) (BOXTYPE_BC2000) + /// + [Description("Lightbus-Busklemmen Controller (BC2000) (BOXTYPE_BC2000)")] + Lightbus_BC2000 = 21, + /// + /// Fox-Module FOX-20 (FOX20) (BOXTYPE_FOX20) + /// + [Description("Fox-Module FOX-20 (FOX20) (BOXTYPE_FOX20)")] + Lightbus_Fox20 = 31, + /// + /// TR Fox 50 Modul (24 Bit Absolut (SSI)) (FOX50) (BOXTYPE_FOX50) + /// + [Description("TR Fox 50 Modul (24 Bit Absolut (SSI)) (FOX50) (BOXTYPE_FOX50)")] + Lightbus_Fox50 = 32, + /// + /// Fox-Module FOX-RK001 (FOXRK001)(BOXTYPE_FOXRK001) + /// + [Description("Fox-Module FOX-RK001 (FOXRK001)(BOXTYPE_FOXRK001)")] + Lightbus_FoxRK001 = 33, + /// + /// Fox-Module FOX-RK002 (FOXRK002)(BOXTYPE_FOXRK002) + /// + [Description("Fox-Module FOX-RK002 (FOXRK002)(BOXTYPE_FOXRK002)")] + Lightbus_FOXRK002 = 34, + /// + /// CP10x1 (Folientasten 8 Kanal, LightBus) (CP10x1) (BOXTYPE_CP1001) + /// + [Description("CP10x1 (Folientasten 8 Kanal, LightBus) (CP10x1) (BOXTYPE_CP1001)")] + Lightbus_CP10x1 = 35, + /// + /// IPxxxx-B200 (compact box, LightBus)(IPx-B200)(BOXTYPE_IPXB2) + /// + [Description("IPxxxx-B200 (compact box, LightBus)(IPx-B200)(BOXTYPE_IPXB2)")] + Lightbus_IPx_B200 = 40, + /// + /// ILxxxx-B200 (coupler box, LightBus)(ILx-B200)(BOXTYPE_ILXB2) + /// + [Description("ILxxxx-B200 (coupler box, LightBus)(ILx-B200)(BOXTYPE_ILXB2)")] + Lightbus_ILx_B200 = 41, + /// + /// ILxxxx-C200 (plc box, LightBus) (ILx-C200) (BOXTYPE_ILXC2) + /// + [Description("ILxxxx-C200 (plc box, LightBus) (ILx-C200) (BOXTYPE_ILXC2)")] + Lightbus_ILx_C200 = 42, + + //TSMBOX_200 = 50, // RH, Not used in System Manager + //BX2000 = 51, // RH, Not used in System Manager + /// + /// CX1500-B200 (CX1500-B200)(BOXTYPE_CX1500_B200) + /// + [Description("CX1500-B200 (CX1500-B200)(BOXTYPE_CX1500_B200)")] + Lightbus_CX1500_B200 = 52, + /// + /// Profibus DP/FMS-Buskoppler für bis zu 64 Busklemmen, 1,5 MBaud (BK3000) (BOXTYPE_BK3000) + /// + [Description("Profibus DP/FMS-Buskoppler für bis zu 64 Busklemmen, 1,5 MBaud (BK3000) (BOXTYPE_BK3000)")] + Profibus_BK3000 = 1001, + /// + /// Profibus DP/FMS-Buskoppler für bis zu 64 Busklemmen, 12 MBaud (BK3100) (BOXTYPE_BK3100) + /// + [Description("Profibus DP/FMS-Buskoppler für bis zu 64 Busklemmen, 12 MBaud (BK3100) (BOXTYPE_BK3100)")] + Profibus_BK3100 = 1002, + /// + /// GSD Box (GSD Box)(BOXTYPE_PBDP_GSD) + /// + [Description("GSD Box (GSD Box)(BOXTYPE_PBDP_GSD)")] + Profibus__GsdBox = 1003, + /// + /// Profibus DP-Buskoppler für bis zu 64 digitale Busklemmen, 1,5 MBaud (BK3010)(BOXTYPE_BK3010) + /// + [Description("Profibus DP-Buskoppler für bis zu 64 digitale Busklemmen, 1,5 MBaud (BK3010)(BOXTYPE_BK3010)")] + Profibus_BK3010 = 1004, + /// + /// Profibus DP-Buskoppler für bis zu 64 digitale Busklemmen, 12 MBaud (BK3110)(BOXTYPE_BK3110) + /// + [Description("Profibus DP-Buskoppler für bis zu 64 digitale Busklemmen, 12 MBaud (BK3110)(BOXTYPE_BK3110)")] + Profibus_BK3110 = 1005, + /// + /// Profibus DP-Buskoppler mit LWL-Anschluss, 1,5 MBaud (BK3500)(BOXTYPE_BK3500) + /// + [Description("Profibus DP-Buskoppler mit LWL-Anschluss, 1,5 MBaud (BK3500)(BOXTYPE_BK3500)")] + Profibus_BK3500 = 1006, + /// + /// Profibus DP-"Low Cost"-Buskoppler für bis zu 64 digitale Busklemmen, 12 MBaud (LC3100) (BOXTYPE_LC3100) + /// + [Description("Profibus DP-Low Cost-Buskoppler für bis zu 64 digitale Busklemmen, 12 MBaud (LC3100) (BOXTYPE_LC3100)")] + Profibus_LC3100 = 1007, + /// + /// ProfiDrive MC (ProfiDrive MC) (BOXTYPE_PBDP_DRIVE) + /// + [Description("ProfiDrive MC (ProfiDrive MC) (BOXTYPE_PBDP_DRIVE)")] + Profibus_ProfidriveMC = 1008, + + //BK3020 = 1009,(BOXTYPE_BK3120) + /// + /// Profibus DP-"Economy Plus"-Buskoppler für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung), 12 MBaud (BK3120)(BOXTYPE_BK3120) + /// + [Description("Profibus DP-Economy Plus-Buskoppler für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung), 12 MBaud (BK3120)(BOXTYPE_BK3120)")] + Profibus_BK3120 = 1010, + /// + /// Profibus DP-Busklemmen Controller (BC3100) (BOXTYPE_BC3100) + /// + [Description("Profibus DP-Busklemmen Controller (BC3100) (BOXTYPE_BC3100)")] + Profibus_BC3100 = 1011, + /// + /// Profidrive MC (double) (ProfiDrive2 MC) (BOXTYPE_PBDP_DRIVE2) + /// + [Description("Profidrive MC (double) (ProfiDrive2 MC) (BOXTYPE_PBDP_DRIVE2)")] + Profibus_ProfiDrive2MC = 1012, + /// + /// Profidrive MC (triple)(ProfiDrive3 MC)(BOXTYPE_PBDP_DRIVE3) + /// + [Description("Profidrive MC (triple)(ProfiDrive3 MC)(BOXTYPE_PBDP_DRIVE3)")] + Profibus_ProfiDrive3MC = 1013, + /// + /// Profidrive MC (fourfold)(ProfiDrive4 MC)(BOXTYPE_PBDP_DRIVE4) + /// + [Description("Profidrive MC (fourfold)(ProfiDrive4 MC)(BOXTYPE_PBDP_DRIVE4)")] + Profibus_ProfiDrive4MC = 1014, + /// + /// Profidrive MC (fivefold)(ProfiDrive5 MC)(BOXTYPE_PBDP_DRIVE5) + /// + [Description("Profidrive MC (fivefold)(ProfiDrive5 MC)(BOXTYPE_PBDP_DRIVE5)")] + Profibus_ProfiDrive5MC = 1015, + /// + /// Profidrive MC (sixfold)(ProfiDrive6 MC)(BOXTYPE_PBDP_DRIVE6) + /// + [Description("Profidrive MC (sixfold)(ProfiDrive6 MC)(BOXTYPE_PBDP_DRIVE6)")] + Profibus_ProfiDrive6MC = 1016, + /// + /// Profidrive MC (sevenfold)(ProfiDrive7 MC)(BOXTYPE_PBDP_DRIVE7) + /// + [Description(" Profidrive MC (sevenfold)(ProfiDrive7 MC)(BOXTYPE_PBDP_DRIVE7)")] + Profibus_ProfiDrive7MC = 1017, + /// + /// Profidrive MC (eightfold)(ProfiDrive8 MC)(BOXTYPE_PBDP_DRIVE8) + /// + [Description("Profidrive MC (eightfold)(ProfiDrive8 MC)(BOXTYPE_PBDP_DRIVE8)")] + Profibus_ProfiDrive8MC = 1018, + /// + /// Profibus DP-"Compact"-Buskoppler für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung), 12 MBaud (BK3150)(BOXTYPE_BK3150) + /// + [Description("Profibus DP-Compact-Buskoppler für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung), 12 MBaud (BK3150)(BOXTYPE_BK3150)")] + Profibus_BK3150 = 1019, + /// + /// Profibus Slave BC3150 (BC3150) (BOXTYPE_BC3150) + /// + [Description("Profibus Slave BC3150 (BC3150) (BOXTYPE_BC3150)")] + Profibus_BC3150 = 1020, + // /// + // /// BOXTYPE_BK3XXX(BOXTYPE_BK3XXX) + // /// + // // [DeviceManufacturer("Beckhoff")] + // BK3XXX = 1021, + // /// + // /// BOXTYPE_BC3XXX(BOXTYPE_BC3XXX) + // /// + // // [DeviceManufacturer("Beckhoff")] + // BC3XXX = 1022, + /// + /// IPxxxx-B3xx (compact box, Profibus)(IPx-B3xx)(BOXTYPE_IPXB3) + /// + [Description("Profibus Slave BC3150 (BC3150) (BOXTYPE_BC3150)")] + Profibus_IPx_B3xx = 1030, + /// + /// ILxxxx-B3xx (coupler box, Profibus)(ILB3xx)(BOXTYPE_ILXB3) + /// + [Description("ILxxxx-B3xx (coupler box, Profibus)(ILB3xx)(BOXTYPE_ILXB3)")] + Profibus_ILB3xx = 1031, + /// + /// ILxxxx-C3xx (plc box, Profibus)(ILC3xx)(BOXTYPE_ILXC3) + /// + [Description("ILxxxx-C3xx (plc box, Profibus)(ILC3xx)(BOXTYPE_ILXC3)")] + Profibus_ILC3xx = 1032, + /// + /// TwinCAT Slave (Profibus)(TSMBOX_310)(BOXTYPE_TSMBOX_310) + /// + [Description("TwinCAT Slave (Profibus)(TSMBOX_310)(BOXTYPE_TSMBOX_310)")] + Profibus_TsmBox_310 = 1040, + /// + /// Profibus DP-Busklemmen Controller(BX3100)(BOXTYPE_BX3100) + /// + [Description("Profibus DP-Busklemmen Controller(BX3100)(BOXTYPE_BX3100)")] + Profibus_BX3100 = 1041, + /// + /// Profibus Slave CX1500-B310, PC104 (CX1500-B310)(BOXTYPE_CX1500_B310) + /// + [Description("Profibus Slave CX1500-B310, PC104 (CX1500-B310)(BOXTYPE_CX1500_B310)")] + Profibus_CX1500_B310 = 1042, + /// + /// FC310x-Slave (FC310x-Slave)(BOXTYPE_FC310X_SLAVE) + /// + [Description("FC310x-Slave (FC310x-Slave)(BOXTYPE_FC310X_SLAVE)")] + Profibus_FC310x_SLAVE = 1043, + /// + /// Antriebstechnik: Digital Kompakt Servoverstärker (Profibus) (AX2xxx-B310)(BOXTYPE_AX2000_B310) + /// + [Description("Antriebstechnik: Digital Kompakt Servoverstärker (Profibus) (AX2xxx-B310)(BOXTYPE_AX2000_B310)")] + Profibus_AX2xxx_B310 = 1051, + // /// + // /// (BOXTYPE_TCPBDPSLAVE) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TCPBDPSLAVE = 1100, + // /// + // /// (BOXTYPE_TCFDLAGAG) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TCFDLAGAG = 1101, + // /// + // /// (BOXTYPE_TCMPI) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TCMPI = 1102, + // /// + // /// (BOXTYPE_TCPBMCSLAVE) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TCPBMCSLAVE = 1103, + // /// + // /// (BOXTYPE_TCPBMCSLAVE2) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TCPBMCSLAVE2 = 1104, + // /// + // /// (BOXTYPE_TCPBMCSLAVE3) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TCPBMCSLAVE3 = 1105, + // /// + // /// (BOXTYPE_TCPBMCSLAVE4) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TCPBMCSLAVE4 = 1106, + // /// + // /// (BOXTYPE_TCPBMCSLAVE5) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TCPBMCSLAVE5 = 1107, + // /// + // /// (BOXTYPE_TCPBMCSLAVE6) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TCPBMCSLAVE6 = 1108, + // /// + // /// (BOXTYPE_TCPBMCSLAVE7) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TCPBMCSLAVE7 = 1109, + // /// + // /// (BOXTYPE_TCPBMCSLAVE8) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TCPBMCSLAVE8 = 1110, + // /// + // /// (BOXTYPE_TCPBMONSLAVE) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TCPBMONSLAVE = 1111, + + /// + /// Interbus-Buskoppler für bis zu 64 Busklemmen (BK4000)(BOXTYPE_BK4000) + /// + [Description("Interbus-Buskoppler für bis zu 64 Busklemmen (BK4000)(BOXTYPE_BK4000)")] + Interbus_BK4000 = 2001, + /// + /// IBS Box (IBS Box)(BOXTYPE_IBS_GENERIC) + /// + [Description("IBS Box (IBS Box)(BOXTYPE_IBS_GENERIC)")] + Interbus_Generic = 2002, + // /// + // /// (BOXTYPE_IBS_BK) + // /// + // // [DeviceManufacturer("Beckhoff")] + // IBS_BK = 2003, + /// + /// Interbus-Buskoppler für bis zu 64 digitale Busklemmen (BK4010)(BOXTYPE_BK4010) + /// + [Description("Interbus-Buskoppler für bis zu 64 digitale Busklemmen (BK4010)(BOXTYPE_BK4010)")] + Interbus_BK4010 = 2004, + /// + /// Interbus-Buskoppler mit LWL-Anschluss für bis zu 64 Busklemmen (BK4500)(BOXTYPE_BK4500) + /// + [Description("Interbus-Buskoppler mit LWL-Anschluss für bis zu 64 Busklemmen (BK4500)(BOXTYPE_BK4500)")] + Interbus_BK4500 = 2005, + /// + /// BK4510 (economy fieldbus coupler, InterBus-S Fiber)("BK4510)(BOXTYPE_BK4510) + /// + [Description("BK4510 (economy fieldbus coupler, InterBus-S Fiber)(BK4510)(BOXTYPE_BK4510)")] + Interbus_BK4510 = 2006, + // /// + // /// IBS Slave(BOXTYPE_IBS_SLAVEBOX) + // /// + // // [DeviceManufacturer("Beckhoff")] + // IBS_SLAVEBOX = 2007, + /// + /// Interbus-Busklemmen Controller (BC4000)(BOXTYPE_BC4000) + /// + [Description("Interbus-Busklemmen Controller (BC4000)(BOXTYPE_BC4000)")] + Interbus_BC4000 = 2008, + /// + /// Interbus-"Economy plus"-Buskoppler für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung)(BK4020)(BOXTYPE_BK4020) + /// + [Description("Interbus-Economy plus-Buskoppler für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung)(BK4020)(BOXTYPE_BK4020)")] + Interbus_BK4020 = 2009, + /// + /// IPxxxx-B400 (compact box, InterBus-S)(IPx-B400)(BOXTYPE_IPXB4) + /// + [Description("IPxxxx-B400 (compact box, InterBus-S)(IPx-B400)(BOXTYPE_IPXB4)")] + Interbus_IPx_B400 = 2030, + /// + /// ILxxxx-B400 (coupler box, InterBus-S)(ILx-B400)(BOXTYPE_ILXB4) + /// + [Description("ILxxxx-B400 (coupler box, InterBus-S)(ILx-B400)(BOXTYPE_ILXB4)")] + Interbus_ILx_B400 = 2031, + /// + /// ILxxxx-C400 (plc box, InterBus-S)(ILx-C400)(BOXTYPE_ILXC4) + /// + [Description("ILxxxx-C400 (plc box, InterBus-S)(ILx-C400)(BOXTYPE_ILXC4)")] + Interbus_ILx_C400 = 2032, + /// + /// CP9020 ('fieldbus coupler', Control Panel)(CP9020)(BOXTYPE_CP2020) + /// + [Description("CP9020 ('fieldbus coupler', Control Panel)(CP9020)(BOXTYPE_CP2020)")] + LocalKBus_CP9020 = 2020, + /// + /// Sercos Drive (Sercos Drive)(BOXTYPE_SERCOSAXIS) + /// + [Description("Sercos Drive (Sercos Drive)(BOXTYPE_SERCOSAXIS)")] + Sercos_Drive = 3001, + /// + /// Antriebstechnik: Digital Kompakt Servoverstärker (SERCOS)(AX2xxx-B750)(BOXTYPE_AX2000_B750) + /// + [Description("Antriebstechnik: Digital Kompakt Servoverstärker (SERCOS)(AX2xxx-B750)(BOXTYPE_AX2000_B750)")] + Sercos_AX2xxx_B750 = 3002, + /// + /// BK7500 (fieldbus coupler, SERCOS 2/4 MBaud)" (BK7500)(BOXTYPE_BK7500) + /// + [Description("BK7500 (fieldbus coupler, SERCOS 2/4 MBaud) (BK7500)(BOXTYPE_BK7500)")] + Sercos_BK7500 = 3011, + /// + /// BK7510 (economy fieldbus coupler, SERCOS 2/4/8/16 MBaud)(BK7510)(BOXTYPE_BK7510) + /// + [Description("BK7510 (economy fieldbus coupler, SERCOS 2/4/8/16 MBaud)(BK7510)(BOXTYPE_BK7510)")] + Sercos_BK7510 = 3012, + /// + /// BK7520 (economy plus fieldbus coupler, SERCOS 2/4/8/16 MBaud)(BK7520)(BOXTYPE_BK7520) + /// + [Description("BK7520 (economy plus fieldbus coupler, SERCOS 2/4/8/16 MBaud)(BK7520)(BOXTYPE_BK7520)")] + Sercos_BK7520 = 3013, + // /// + // /// Sercos Box M(BOXTYPE_SERCOSMASTERBOX) + // /// + // // [DeviceManufacturer("Beckhoff")] + // SERCOSMASTERBOX = 3021, + // /// + // /// Sercos Slave S(BOXTYPE_SERCOSSLAVEBOX) + // /// + // // [DeviceManufacturer("Beckhoff")] + // SERCOSSLAVEBOX = 3031, + /// + /// BK8100 (fieldbus coupler, COM Port, RS232)(BK8100)(BOXTYPE_BK8100) + /// + [Description(" BK8100 (fieldbus coupler, COM Port, RS232)(BK8100)(BOXTYPE_BK8100)")] + RS232_BK8100 = 4001, + // /// + // /// BK8110 (economy fieldbus coupler, COM Port, RS232)(BOXTYPE_BK8110) + // /// + // // [DeviceManufacturer("Beckhoff")] + // BK8110 = 4002, + /// + /// RS485-Buskoppler für bis zu 64 Busklemmen(BK8000)(BOXTYPE_BK8000) + /// + [Description("RS485-Buskoppler für bis zu 64 Busklemmen(BK8000)(BOXTYPE_BK8000)")] + RS485_BK8000 = 4003, + // /// + // /// BK8010 (economy fieldbus coupler, COM Port, RS485)(BOXTYPE_BK8010) + // /// + // // [DeviceManufacturer("Beckhoff")] + // BK8010 = 4004, + /// + /// CP9040 ('fieldbus coupler', Control Panel)(CP9040)(BOXTYPE_CP9040) + /// + [Description("CP9040 ('fieldbus coupler', Control Panel)(CP9040)(BOXTYPE_CP9040)")] + RS232_CP9040 = 4005, + /// + /// RS485-Busklemmen Controller (BC8000)(BOXTYPE_BC8000) + /// + [Description("RS485-Busklemmen Controller (BC8000)(BOXTYPE_BC8000)")] + RS485_BC8000 = 4011, + /// + /// RS232-Busklemmen Controller (BC8100)(BOXTYPE_BC8100) + /// + [Description("RS232-Busklemmen Controller (BC8100)(BOXTYPE_BC8100)")] + RS232_BC8100 = 4012, + /// + /// IPxxxx-B800 (compact box, COM Port, RS485)(IPx-B800)(BOXTYPE_IPXB80) + /// + [Description("IPxxxx-B800 (compact box, COM Port, RS485)(IPx-B800)(BOXTYPE_IPXB80)")] + RS485_IPx_B800 = 4030, + /// + /// ILxxxx-B800 (coupler box, COM Port, RS485)(ILx-B800)(BOXTYPE_ILXB80) + /// + [Description("ILxxxx-B800 (coupler box, COM Port, RS485)(ILx-B800)(BOXTYPE_ILXB80)")] + RS485_ILx_B800 = 4031, + /// + /// ILxxxx-C800 (plc box, COM Port, RS485)(ILx-C800)(BOXTYPE_ILXC80) + /// + [Description("ILxxxx-C800 (plc box, COM Port, RS485)(ILx-C800)(BOXTYPE_ILXC80)")] + RS485_ILx_C800 = 4032, + /// + /// IPxxxx-B810 (compact box, COM Port, RS232)(IPx-B810)(BOXTYPE_IPXB81) + /// + [Description("IPxxxx-B810 (compact box, COM Port, RS232)(IPx-B810)(BOXTYPE_IPXB81)")] + RS232_IPx_B810 = 4040, + /// + /// ILxxxx-B810 (coupler box, COM Port, RS232)(ILx-B810)(BOXTYPE_ILXB81) + /// + [Description("ILxxxx-B810 (coupler box, COM Port, RS232)(ILx-B810)(BOXTYPE_ILXB81)")] + RS232_ILx_B810 = 4041, + /// + /// ILxxxx-C810 (plc box, COM Port, RS232)(ILx-C810)(BOXTYPE_ILXC81) + /// + [Description("ILxxxx-C810 (plc box, COM Port, RS232)(ILx-C810)(BOXTYPE_ILXC81)")] + RS232_ILx_C810 = 4042, + + /// + /// CANopen Buskoppler Lowcost (BK5100)(BOXTYPE_BK5100) + /// + [Description("CANopen Buskoppler Lowcost (BK5100)(BOXTYPE_BK5100)")] + CANOpen_BK5100 = 5001, + /// + /// CAN CAL-Buskoppler für bis zu 64 Busklemmen (BK5110)(BOXTYPE_BK5110) + /// + [Description("CAN CAL-Buskoppler für bis zu 64 Busklemmen (BK5110)(BOXTYPE_BK5110)")] + CANOpen_BK5110 = 5002, + /// + /// CANopen Node (CANopen Node)(BOXTYPE_CANNODE) (ItemType 5003) + /// + [Description("CANopen Node (CANopen Node)(BOXTYPE_CANNODE) (ItemType 5003)")] + CANOpen_Node = 5003, + /// + /// CANopen-Buskoppler „Economy plus“ für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung (BK5120)(BOXTYPE_BK5120) + /// + [Description("CANopen-Buskoppler „Economy plus“ für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung (BK5120)(BOXTYPE_BK5120)")] + CANOpen_BK5120 = 5004, + /// + /// CANopen-„Low Cost“-Buskoppler für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung)(LC5100)(BOXTYPE_LC5100) + /// + [Description("CANopen-„Low Cost“-Buskoppler für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung)(LC5100)(BOXTYPE_LC5100)")] + CANOpen_LC5100 = 5005, + /// + /// CANopen Drive (CANopen Drive)(BOXTYPE_CANDRIVE) + /// + [Description("CANopen Drive (CANopen Drive)(BOXTYPE_CANDRIVE)")] + CANOpen_Drive = 5006, + /// + /// Antriebstechnik: Digital Kompakt Servoverstärker (CANOpen) (AX2xxx-B510)(BOXTYPE_AX2000_B510) + /// + [Description("Antriebstechnik: Digital Kompakt Servoverstärker (CANOpen) (AX2xxx-B510)(BOXTYPE_AX2000_B510)")] + CANOpen_AX2xxx_B510 = 5007, + /// + /// CANopen-„Compact“-Buskoppler für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung)(BK5150)(BOXTYPE_BK5150) + /// + [Description("CANopen-„Compact“-Buskoppler für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung)(BK5150)(BOXTYPE_BK5150)")] + CANOpen_BK5150 = 5008, + /// + /// CANopen-Busklemmen Controller(BC5150)(BOXTYPE_BC5150) + /// + [Description("CANopen-Busklemmen Controller(BC5150)(BOXTYPE_BC5150)")] + CANOpen_BC5150 = 5011, + /// + /// IPxxxx-B51x (compact box, CANopen)(IPx-B51x)(BOXTYPE_IPXB51) + /// + [Description("IPxxxx-B51x (compact box, CANopen)(IPx-B51x)(BOXTYPE_IPXB51)")] + CANOpen_IPx_B51x = 5030, + /// + /// ILxxxx-B51x (coupler box, CANopen)(ILx-B51x)(BOXTYPE_ILXB51) + /// + [Description("ILxxxx-B51x (coupler box, CANopen)(ILx-B51x)(BOXTYPE_ILXB51)")] + CANOpen_ILx_B51x = 5031, + /// + /// ILxxxx-C51x (plc box, CANopen)(ILx-C51x)(BOXTYPE_ILXC51) + /// + [Description("ILxxxx-C51x (plc box, CANopen)(ILx-C51x)(BOXTYPE_ILXC51)")] + CANOpen_ILx_C51x = 5032, + /// + /// TwinCAT Slave (CANopen)(TSMBOX_510)(BOXTYPE_TSMBOX_510) + /// + [Description("TwinCAT Slave (CANopen)(TSMBOX_510)(BOXTYPE_TSMBOX_510)")] + CANOpen_TsmBox_510 = 5040, + /// + /// BX5100 (CANopen Slave)(BX5100)(BOXTYPE_BX5100) + /// + [Description("BX5100 (CANopen Slave)(BX5100)(BOXTYPE_BX5100)")] + CANOpen_BX5100 = 5041, + /// + /// CX1500-B510 (CX1500-B510)(BOXTYPE_CX1500_B510) + /// + [Description("CX1500-B510 (CX1500-B510)(BOXTYPE_CX1500_B510)")] + CANOpen_CX1500_B510 = 5042, + /// + /// FC510x Slave (FC510x Slave)(BOXTYPE_FC510XSLV) + /// + [Description("FC510x Slave (FC510x Slave)(BOXTYPE_FC510XSLV)")] + CANOpen_FC510xSlave = 5043, + // /// + // /// (BOXTYPE_TCCANSLAVE) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TCCANSLAVE = 5050, + /// + /// DeviceNet-Buskoppler für bis zu 64 Busklemmen (BK5200)(BOXTYPE_BK5200) + /// + [Description("DeviceNet-Buskoppler für bis zu 64 Busklemmen (BK5200)(BOXTYPE_BK5200)")] + DeviceNet_BK5200 = 5201, + /// + /// DeviceNet-Buskoppler für bis zu 64 digitale Busklemmen (BK5210)(BOXTYPE_BK5210) + /// + [Description("DeviceNet-Buskoppler für bis zu 64 digitale Busklemmen (BK5210)(BOXTYPE_BK5210)")] + DeviceNet_BK5210 = 5202, + /// + /// DeviceNet Node (DN Node) (BOXTYPE_DEVICENET) + /// + [Description("DeviceNet Node (DN Node) (BOXTYPE_DEVICENET)")] + DeviceNet_Node = 5203, + /// + /// DeviceNet-„Compact“-Buskoppler für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung) (BK5220)(BOXTYPE_BK5220) + /// + [Description("DeviceNet-„Compact“-Buskoppler für bis zu 64 Busklemmen (255 mit K-Bus-Verlängerung) (BK5220)(BOXTYPE_BK5220)")] + DeviceNet_BK5220 = 5204, + /// + /// DeviceNet-„Low Cost“-Buskoppler für bis zu 64 digitale Busklemmen (255 mit K-Bus-Verlängerung) (LC5200)(BOXTYPE_LC5200) + /// + [Description("DeviceNet-„Low Cost“-Buskoppler für bis zu 64 digitale Busklemmen (255 mit K-Bus-Verlängerung) (LC5200)(BOXTYPE_LC5200)")] + DeviceNet_LC5200 = 5205, + // /// + // /// (BOXTYPE_BK52XX) + // /// + // // [DeviceManufacturer("Beckhoff")] + // BK52XX = 5211, + // /// + // /// DeviceNet-Busklemmen Controller(BOXTYPE_BC52XX) + // /// + // // [DeviceManufacturer("Beckhoff")] + // BC52XX = 5212, + /// + /// IPxxxx-B52x (compact box, DeviceNet)(IPx-B52x)(BOXTYPE_IPXB52) + /// + [Description("IPxxxx-B52x (compact box, DeviceNet)(IPx-B52x)(BOXTYPE_IPXB52)")] + DeviceNet_IPx_B52x = 5230, + /// + /// ILxxxx-B52x (coupler box, DeviceNet)(ILx-B52x)(BOXTYPE_ILXB52) + /// + [Description("ILxxxx-B52x (coupler box, DeviceNet)(ILx-B52x)(BOXTYPE_ILXB52)")] + DeviceNet_ILx_B52x = 5231, + /// + /// ILxxxx-C52x (plc box, DeviceNet)(ILx-C52x)(BOXTYPE_ILXC52) + /// + [Description("ILxxxx-C52x (plc box, DeviceNet)(ILx-C52x)(BOXTYPE_ILXC52)")] + DeviceNet_ILx_C52x = 5232, + // /// + // /// (BOXTYPE_TSMBOX_520) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TSMBOX_520 = 5240, + /// + /// DeviceNet-Busklemmen Controller(BX5200)(BOXTYPE_BX5200) + /// + [Description("DeviceNet-Busklemmen Controller(BX5200)(BOXTYPE_BX5200)")] + DeviceNet_BX5200 = 5241, + /// + /// CX1500-B520(CX1500-B520)(BOXTYPE_CX1500_B520) + /// + [Description("CX1500-B520(CX1500-B520)(BOXTYPE_CX1500_B520)")] + DeviceNet_CX1500_B520 = 5242, + /// + /// FC5201 Slave (FC5201 Slave) (BOXTYPE_FC520XSLV) + /// + [Description("FC5201 Slave (FC5201 Slave) (BOXTYPE_FC520XSLV)")] + DeviceNet_FC5201Slave = 5243, + // /// + // /// (BOXTYPE_TCDNSLAVE) + // /// + // // [DeviceManufacturer("Beckhoff")] + // TCDNSLAVE = 5250, + + /// + /// Safety PLC EL6900 + /// + [Description("Safety PLC EL6900")] + EtherCAT_EL6900 = 6900, + /// + /// Safety Digital Inputs + /// + [Description("Safety Digital Inputs")] + EtherCAT_EL1904 = 1904, + /// + /// Safety Digital Outputs + /// + [Description("Safety Digital Outputs")] + EtherCAT_EL2904 = 2904, + + /// + /// Ethernet TCP/IP Bus Coupler up to 64 Terminals (BOXTYPE_BK9000) + /// + [Description("Ethernet TCP/IP Bus Coupler up to 64 Terminals (BOXTYPE_BK9000)")] + Ethernet_BK9000 = 9001, + /// + /// Ethernet-TCP/IP Bus Coupler up to 64 Terminals and integrated 2-Channel Switch (BK9100) + /// + [Description("Ethernet-TCP/IP Bus Coupler up to 64 Terminals and integrated 2-Channel Switch (BK9100)")] + Ethernet_BK9100 = 9002, + /// + /// Ethernet TCP/IP "Compact" Bus Coupler BK9050 + /// + [Description("Ethernet TCP/IP Compact Bus Coupler BK9050")] + Ethernet_BK9050 = 9005, + /// + /// Ethernet TCP/IP-Busklemmen Controller(BOXTYPE_BC9000) + /// + [Description("Ethernet TCP/IP-Busklemmen Controller(BOXTYPE_BC9000)")] + Ethernet_BC9000 = 9011, + /// + /// Ethernet TCP/IP-Busklemmen Controller(BOXTYPE_BC9000) + /// + [Description("Ethernet TCP/IP-Busklemmen Controller(BOXTYPE_BC9000)")] + Ethernet_BC9100 = 9012, + /// + /// Ethernet TCP/IP-Busklemmen Controller(BOXTYPE_BC9000) + /// + [Description("Ethernet TCP/IP-Busklemmen Controller(BOXTYPE_BC9000)")] + Ethernet_BX9000 = 9013, + /// + /// Ethernet TCP/IP-Busklemmen Controller(BOXTYPE_BC9000) + /// + [Description("Ethernet TCP/IP-Busklemmen Controller(BOXTYPE_BC9000)")] + Ethernet_BX9000SLV = 9014, + /// + /// IPxxxx-B900 (compact box, Ethernet)(IPx-B900)(BOXTYPE_IPXB9) + /// + [Description("IPxxxx-B900 (compact box, Ethernet)(IPx-B900)(BOXTYPE_IPXB9)")] + Ethernet_IPx_B900 = 9030, + /// + /// ILxxxx-B900 (coupler box, Ethernet)(ILx-B900)(BOXTYPE_ILXB9) + /// + [Description("ILxxxx-B900 (coupler box, Ethernet)(ILx-B900)(BOXTYPE_ILXB9)")] + Ethernet_ILx_B900 = 9031, + /// + /// ILxxxx-C900 (plc box, Ethernet)(ILx-C900)(BOXTYPE_ILXC9) + /// + [Description("ILxxxx-C900 (plc box, Ethernet)(ILx-C900)(BOXTYPE_ILXC9)")] + Ethernet_ILx_C900 = 9032, + /// + /// Remote TwinCAT Task (RemoteTask)(BOXTYPE_REMOTETASK) + /// + [Description("Remote TwinCAT Task (RemoteTask)(BOXTYPE_REMOTETASK)")] + Ethernet_RemoteTask = 9041, + /// + /// Netzwerkvariable Publisher(Publisher)(BOXTYPE_NV_PUB) + /// + [Description("Netzwerkvariable Publisher(Publisher)(BOXTYPE_NV_PUB)")] + Ethernet_Publisher = 9051, + /// + /// Netzwerkvariablen Subscriber(Subscriber)(BOXTYPE_NV_SUB) + /// + [Description("Netzwerkvariablen Subscriber(Subscriber)(BOXTYPE_NV_SUB)")] + Ethernet_Subscriber = 9052, + /// + /// Antriebstechnik: Digital Kompakt Servoverstärker (Ethernet)(AX2xxx-B900)(BOXTYPE_AX2000_B900) + /// + [Description("Antriebstechnik: Digital Kompakt Servoverstärker (Ethernet)(AX2xxx-B900)(BOXTYPE_AX2000_B900)")] + Ethernet_AX2xxx_B900 = 9061, + /// + /// EtherCAT Frame (EtherCAT Frame)(BOXTYPE_FLB_FRAME) + /// + [Description("therCAT Frame (EtherCAT Frame)(BOXTYPE_FLB_FRAME)")] + Ethernet_EtherCATFrame = 9071, + /// + /// BK1120 (economy plus fieldbus coupler, EtherCAT)(BOXTYPE_BK1120) + /// + [Description("BK1120 (economy plus fieldbus coupler, EtherCAT)(BOXTYPE_BK1120)")] + EtherCAT_BK1120 = 9081, + // /// + // /// Antriebstechnik: Digital Kompakt Servoverstärker (???)(BOXTYPE_AX2000_B100) + // /// + // // [DeviceManufacturer("Beckhoff")] + // AX2000_B100 = 9085, + /// + /// EK1000 Ethernet Bridge (Ethernet/EtherCAT)(EK1000)(BOXTYPE_EK1000) + /// + [Description("EK1000 Ethernet Bridge (Ethernet/EtherCAT)(EK1000)(BOXTYPE_EK1000)")] + Ethernet_EK1000 = 9091, + /// + /// EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EK1100) + /// + /// Should not be inserted directly + [Description("EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EK1100)")] + [EditorBrowsable(EditorBrowsableState.Never)] + [Obsolete("Use the Generic Type EtherCAT_EXXXXX instead")] + EtherCAT_EK1100 = 9092, + /// + /// EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EL6731) + /// + [Description("EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EL6731)")] + EtherCAT_EL6731 = 9093, + /// + /// EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EL6751) + /// + [Description("EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EL6751)")] + EtherCAT_EL6751 = 9094, + /// + /// EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EL6752) + /// + [Description("EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EL6752)")] + EtherCAT_EL6752 = 9095, + /// + /// EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EL6731SLV) + /// + [Description("EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EL6731SLV)")] + EtherCAT_EL6731SLV = 9096, + /// + /// EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EL6751SLV) + /// + [Description("EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EL6751SLV)")] + EtherCAT_EL6751SLV = 9097, + /// + /// EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EL6752SLV) + /// + [Description("EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EL6752SLV)")] + EtherCAT_EL6752SLV = 9098, + /// + /// EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EXXXXX = 9099) + /// + [Description("EK1100 Ethernet Coupler (EtherCAT)(BOXTYPE_EXXXXX)")] + EtherCAT_EXXXXX = 9099, + + /// + /// BOXTYPE_EL6601 = 9100, + /// + [Description("BOXTYPE_EL6601 = 9100,")] + EtherCAT_EL6601 = 9100, + + /// + /// BOXTYPE_EL6001 = 9101, + /// + [Description("BOXTYPE_EL6001 = 9101,")] + EtherCAT_EL6001 = 9101, + + /// + /// BOXTYPE_EL69XX = 9102, + /// + [Description("BOXTYPE_EL69XX = 9102,")] + EtherCAT_EL69XX = 9102, + + /// + /// BOXTYPE_EL6021 = 9103 + /// + [Description("BOXTYPE_EL6021 = 9103")] + EtherCAT_EL6021 = 9103, + + /// + /// BOXTYPE_EL6720 = 9104 + /// + [Description("BOXTYPE_EL6720 = 9104")] + EtherCAT_EL6720 = 9104, + + /// + /// BOXTYPE_FSOESLAVE = 9105 + /// + [Description("BOXTYPE_FSOESLAVE = 9105")] + EtherCAT_FSOESLAVE = 9105, + + /// + /// BOXTYPE_EL6631 = 9106 + /// + [Description("BOXTYPE_EL6631 = 9106")] + EtherCAT_EL6631 = 9106, + + /// + /// BOXTYPE_EL6631SLV = 9107 + /// + [Description("BOXTYPE_EL6631SLV = 9107")] + EtherCAT_EL6631SLV = 9107, + + //BOXTYPE_PNIODEVICE = 9121, + //BOXTYPE_PNIOTCDEVICE = 9122, + //BOXTYPE_PNIODEVICEINTF = 9123, + //BOXTYPE_PNIO_DRIVE = 9124, + //BOXTYPE_PNIOBK9103 = 9125, + //BOXTYPE_PNIOILB903 = 9126, + //BOXTYPE_PNIOEL6631SLV = 9127, + //BOXTYPE_PNIOEK9300 = 9128, + //BOXTYPE_PNIOEK9300INTF = 9129, + //BOXTYPE_PNIOEL6631 = 9130, + + //BOXTYPE_EIPSLAVEINTF = 9133, + + //BOXTYPE_PTPSLAVEINTF = 9143, + + //BOXTYPE_RAWUDPINTF = 9151, + + + /// + /// USB-Buskoppler für bis zu 64 Busklemmen(BK9500)(BOXTYPE_BK9500) + /// + [Description("USB-Buskoppler für bis zu 64 Busklemmen(BK9500)(BOXTYPE_BK9500)")] + USB_BK9500 = 9500, + // /// + // /// (BOXTYPE_BK9510) + // /// + // // [DeviceManufacturer("Beckhoff")] + // BK9510 = 9510, + // /// + // /// (BOXTYPE_BK9520) + // /// + // // [DeviceManufacturer("Beckhoff")] + // BK9520 = 9520, + /// + /// Control Panel (USB)(CPX8XX)(BOXTYPE_CPX8XX) + /// + [Description("Control Panel (USB)(CPX8XX)(BOXTYPE_CPX8XX)")] + USB_CPX8XX = 9591, + /// + /// CX1100 or CX9100 KBus extension('terminal coupler', CX1100-0002)(CX1100-BK)(BOXTYPE_CX1102) (SubType 9700) + /// + [Description("CX1100 or CX9100 KBus extension('terminal coupler', CX1100-0002)(CX1100-BK)(BOXTYPE_CX1102) (SubType 9700)")] + KBus_CX1100_BK = 9700, + /// + /// CX9000 KBus extension('terminal coupler') (SubType: 9700) + /// + [Description("CX9000 KBus extension('terminal coupler') (SubType: 9700)")] + KBus_CX9000_BK = 9700, + /// + /// CX1100 ('ip-link coupler', CX1100-0003)(CX1100-IP)(BOXTYPE_CX1103) (SubType 9701) + /// + [Description("CX1100 ('ip-link coupler', CX1100-0003)(CX1100-IP)(BOXTYPE_CX1103) (SubType 9701)")] + KBus_CX1100_IP = 9701, + /// + /// CX1190 UPS ('uninterruptable power supplier')(CX1190-UPS)(BOXTYPE_CX1190) (Subtype 9702) + /// + [Description("CX1190 UPS ('uninterruptable power supplier')(CX1190-UPS)(BOXTYPE_CX1190) (Subtype 9702)")] + KBus_CX1190 = 9702 + } + + /// + /// Type of the Device + /// + public enum DeviceType + { + /// + /// + /// + [Description("Unknown or uninitialized device type.")] + Unknown = 0, + /// + /// Lightbus ISA interface card C1220 with communications processor (IODEVICETYPE_C1220, ID: 1) + /// + [Description("Lightbus ISA interface card C1220 with communications processor (IODEVICETYPE_C1220, ID: 1)")] + Lightbus_C1220 = 1, + /// + /// Lightbus ISA interface card C1200 (IODEVICETYPE_C1200, ID: 2) + /// + [Description("Lightbus ISA interface card C1200 (IODEVICETYPE_C1200, ID: 2)")] + Lightbus_C1200 = 2, + /// + /// ProfiBus Slave SPC3/IM182 (Siemens-Karte, IODEVICETYPE_SPC3, ID: 3) + /// + [Description("ProfiBus Slave SPC3/IM182 (Siemens, IODEVICETYPE_SPC3, ID: 3)")] + Profibus_SPC3_IM182 = 3, + /// + /// ISA ProfiBus-Master CIF30 DPM(Hilscher-Karte, IODEVICETYPE_CIF30DPM, ID: 4) + /// + [Description("ISA ProfiBus-Master CIF30 DPM(Hilscher, IODEVICETYPE_CIF30DPM, ID: 4)")] + Profibus_CIF30DPM = 4, + /// + /// ISA Interbus-S-Master CIF40 IBSM (Hilscher-Karte, IODEVICETYPE_CIF40IBSM, ID: 5) + /// + [Description("ISA Interbus-S-Master CIF40 IBSM (Hilscher-Karte, IODEVICETYPE_CIF40IBSM, ID: 5)")] + Interbus_CIF40ISBM = 5, + /// + /// Beckhoff PC C2001 (IODEVICETYPE_BKHFPC, ID: 6) + /// + [Description("Beckhoff PC C2001 (IODEVICETYPE_BKHFPC, ID: 6)")] + Beckhoff_C2001 = 6, + /// + /// ProfiBus-Master CP5412 (Siemens-Karte,IODEVICETYPE_CP5412A2, ID: 7) + /// + [Description("ProfiBus-Master CP5412 (Siemens-Karte,IODEVICETYPE_CP5412A2, ID: 7) ")] + Profibus_CP5412 = 7, + /// + /// Sercos Master SERCOS ISA (Indramat,IODEVICETYPE_SERCANSISA, ID: 8) + /// + [Description("Sercos Master SERCOS ISA (Indramat,IODEVICETYPE_SERCANSISA, ID: 8)")] + Sercos_ISA = 8, + /// + /// Lpt Port (IODEVICETYPE_LPTPORT, ID: 9) + /// + [Description("Lpt Port (IODEVICETYPE_LPTPORT, ID: 9)")] + Misc_LptPort = 9, + /// + /// Generic DPRAM NOV/DP-RAM (IODEVICETYPE_DPRAM, ID: 10) + /// + [Description("Generic DPRAM NOV/DP-RAM (IODEVICETYPE_DPRAM, ID: 10)")] + Misc_NOV_DPRAM = 10, + /// + /// COM Port (IODEVICETYPE_COMPORT, ID: 11) + /// + [Description("COM Port (IODEVICETYPE_COMPORT, ID: 11)")] + Misc_ComPort = 11, + /// + /// ISA CANopen-Master CIF30 CAN (Hilscher-Karte, IODEVICETYPE_CIF30CAN, ID:12) + /// + [Description("ISA CANopen-Master CIF30 CAN (Hilscher-Karte, IODEVICETYPE_CIF30CAN, ID:12)")] + CanOpen_CIF30CAN = 12, + /// + /// ISA ProfiBus-Master CIF30 PB (Hilscher-Karte, IODEVICETYPE_CIF30PB, ID:13) + /// + [Description("ISA ProfiBus-Master CIF30 PB (Hilscher-Karte, IODEVICETYPE_CIF30PB, ID:13)")] + Profibus_CIF30PB = 13, + /// + /// Beckhoff CP2030 (v1.0)(Beckhoff Panel Link (V1.0), IODEVICETYPE_BKHFCP2030, ID:14) + /// + [Description("Beckhoff CP2030 (v1.0)(Beckhoff Panel Link (V1.0), IODEVICETYPE_BKHFCP2030, ID:14)")] + Beckhoff_CP2030 = 14, + // /// + // /// Interbus-S-Master (Phoenix-Karte, IODEVICETYPE_IBSSCIT) + // /// + // [DevGroup(DeviceGroup.Interbus)] + // IIBSSCIT = 15, + /// + /// ISA Interbus-S-Master CIF30 IBM (Hilscher-Karte, IODEVICETYPE_CIF30IBM, ID:16) + /// + [Description("ISA Interbus-S-Master CIF30 IBM (Hilscher-Karte, IODEVICETYPE_CIF30IBM, ID:16)")] + Interbus_CIF30IBM = 16, + /// + /// ISA DeviceNet-Master CIF30 DNM(Hilscher-Karte, IODEVICETYPE_CIF30DNM, ID:17) + /// + [Description("ISA DeviceNet-Master CIF30 DNM(Hilscher-Karte, IODEVICETYPE_CIF30DNM, ID:17)")] + DeviceNet_CIF30DNM = 17, + // /// + // /// Beckhoff-Feldbuskarte (IODEVICETYPE_FCXXXX) + // /// + // [DevGroup(DeviceGroup.NotProcessed)] + // FCXXXX = 18, + /// + /// PCI ProfiBus-Master CIF50 PB (Hilscher-Karte, IODEVICETYPE_CIF50PB, ID:19) + /// + [Description("PCI ProfiBus-Master CIF50 PB (Hilscher-Karte, IODEVICETYPE_CIF50PB, ID:19)")] + Profibus_CIF50PB = 19, + /// + /// PCI Interbus-S-Master CIF50 IBM (Hilscher-Karte, IODEVICETYPE_CIF50IBM) + /// + [Description("PCI Interbus-S-Master CIF50 IBM (Hilscher-Karte, IODEVICETYPE_CIF50IBM)")] + Interbus_CIF50IBM = 20, + /// + /// PCI DeviceNet-Master CIF50 DNM (Hilscher-Karte, IODEVICETYPE_CIF50DNM) + /// + [Description("PCI DeviceNet-Master CIF50 DNM (Hilscher-Karte, IODEVICETYPE_CIF50DNM)")] + DeviceNet_CIF50DNM = 21, + /// + /// PCI CANopen-Master CIF50 CAN (Hilscher-Karte, IODEVICETYPE_CIF50CAN) + /// + [Description("PCI CANopen-Master CIF50 CAN (Hilscher-Karte, IODEVICETYPE_CIF50CAN)")] + CANOpen_CIF50CAN = 22, + /// + /// PCMCIA ProfiBus-Master CIF60 PB (Hilscher-Karte, IODEVICETYPE_CIF60PB) + /// + [Description("PCMCIA ProfiBus-Master CIF60 PB (Hilscher-Karte, IODEVICETYPE_CIF60PB)")] + Profibus_CIF60PB = 23, + /// + /// PCMCIA DeviceNet-Master CIF60 DNM(Hilscher-Karte, IODEVICETYPE_CIF60DNM) + /// + [Description("PCMCIA DeviceNet-Master CIF60 DNM(Hilscher-Karte, IODEVICETYPE_CIF60DNM)")] + DeviceNet_CIF60DNM = 24, + /// + /// PCMCIA CANopen-Master CIF60 CAN(Hilscher-Karte, IODEVICETYPE_CIF60CAN) + /// + [Description("PCMCIA CANopen-Master CIF60 CAN(Hilscher-Karte, IODEVICETYPE_CIF60CAN)")] + CANOpen_CIF60CAN = 25, + /// + /// PC104 ProfiBus-Master CIF104 DPM (Hilscher-Karte, IODEVICETYPE_CIF104DP) + /// + [Description("PC104 ProfiBus-Master CIF104 DPM (Hilscher-Karte, IODEVICETYPE_CIF104DP)")] + Profibus_CIF104_DPM = 26, + /// + /// PC104 ProfiBus-Master CIF104 PB (Hilscher-Karte, IODEVICETYPE_C104PB) + /// + [Description("PC104 ProfiBus-Master CIF104 PB (Hilscher-Karte, IODEVICETYPE_C104PB)")] + Profibus_CIF104PB = 27, + /// + /// PC104 Interbus-S-Master CIF104 IBM (Hilscher-Karte, IODEVICETYPE_C104IBM) + /// + [Description("PC104 Interbus-S-Master CIF104 IBM (Hilscher-Karte, IODEVICETYPE_C104IBM)")] + Interbus_CIF104IBM = 28, + /// + /// PC104 CANopen-Master CIF104 CAN (Hilscher-Karte, IODEVICETYPE_C104CAN) + /// + [Description("PC104 CANopen-Master CIF104 CAN (Hilscher-Karte, IODEVICETYPE_C104CAN)")] + CANOpen_C104CAN = 29, + /// + /// PC104 DeviceNet-Master CIF104 DNM (Hilscher-Karte, IODEVICETYPE_C104DNM) + /// + [Description("PC104 DeviceNet-Master CIF104 DNM (Hilscher-Karte, IODEVICETYPE_C104DNM)")] + DeviceNet_CIF104DNM = 30, + /// + /// Beckhoff CP9030 Beckhoff Link (ISA, Panel-Link with UPS, IODEVICETYPE_BKHFCP9030) + /// + [Description("Beckhoff CP9030 Beckhoff Link (ISA, Panel-Link with UPS, IODEVICETYPE_BKHFCP9030)")] + Beckhoff_CP9030 = 31, + /// + /// Motherboard System Management Bus SMB (IODEVICETYPE_SMB) + /// + [Description("Motherboard System Management Bus SMB (IODEVICETYPE_SMB)")] + Misc_SystemManagementBus = 32, + // /// + // /// Beckhoff-PROFIBUS-Monitor (IODEVICETYPE_PBMON) + // /// + // [DevGroup(DeviceGroup.NotProcessed)] + // PBMON = 33, + /// + /// PCI ProfiBus-Master CP5613 (Siemens-Karte, IODEVICETYPE_CP5613) + /// + [Description("PCI ProfiBus-Master CP5613 (Siemens-Karte, IODEVICETYPE_CP5613)")] + Profibus_CP5613 = 34, + /// + /// PCMCIA Interbus-S-Master CIF60 IBM (Hilscher-Karte, IODEVICETYPE_CIF60IBM) + /// + [Description("PCMCIA Interbus-S-Master CIF60 IBM (Hilscher-Karte, IODEVICETYPE_CIF60IBM)")] + Interbus_CIF60IBM = 35, + /// + /// Beckhoff-Lightbus-I/II-PCI-Karte FC200x (IODEVICETYPE_FC200X) + /// + [Description("Beckhoff-Lightbus-I/II-PCI-Karte FC200x (IODEVICETYPE_FC200X)")] + Lightbus_FC200X = 36, + // + // nicht mehr benutzen (IODEVICETYPE_FC3100_OLD) + // + //FC3100_OLD = 37, + + /// + /// Beckhoff-Profibus-PCI-Karte FC310x (IODEVICETYPE_FC3100) (ItemType 38) + /// + [Description("Beckhoff-Profibus-PCI-Karte FC310x (IODEVICETYPE_FC3100) (ItemType 38)")] + Profibus_FC310x = 38, + /// + /// Beckhoff-CanOpen-PCI-Karte FC510x (IODEVICETYPE_FC5100) (ItemType 39) + /// + [Description("Beckhoff-CanOpen-PCI-Karte FC510x (IODEVICETYPE_FC5100) (ItemType 39)")] + CANOpen_FC510x = 39, + /// + /// Beckhoff-DeviceNet-PCI-Karte FC520x (IODEVICETYPE_FC5200) (ItemType 41) + /// + [Description("Beckhoff-DeviceNet-PCI-Karte FC520x (IODEVICETYPE_FC5200) (ItemType 41)")] + DeviceNet_FC520x = 41, + /// + /// Beckhoff NC Rückwand Beckhoff NcBp (IODEVICETYPE_BKHFNCBP) (ItemType 43) + /// + [Description("Beckhoff NC Rückwand Beckhoff NcBp (IODEVICETYPE_BKHFNCBP) (ItemType 43)")] + Beckhoff_NcBackPlane = 43, + /// + /// Sercos Master PCI SICAN/IAM PCI(, IODEVICETYPE_SERCANSPCI) + /// + [Description("Sercos Master PCI SICAN/IAM PCI(, IODEVICETYPE_SERCANSPCI)")] + Sercos_PCIMaster = 44, + /// + /// Virtuelles Ethernet Device (IODEVICETYPE_ETHERNET) + /// + [Description("Virtuelles Ethernet Device (IODEVICETYPE_ETHERNET)")] + Ethernet_VirtualEthernet = 45, + /// + /// Sercon 410B oder 816 Chip Master oder Slave (PCI) SERCONCHIP (IODEVICETYPE_SERCONPCI) + /// + [Description("ercon 410B oder 816 Chip Master oder Slave (PCI) SERCONCHIP (IODEVICETYPE_SERCONPCI)")] + Sercos_SerconPCI = 46, + // /// + // /// Interbus-S-Master mit Slave-Teil auf LWL Basis (Phoenix-Karte, IODEVICETYPE_IBSSCRIRTLK) + // /// + // [DevGroup(DeviceGroup.Interbus)] + // Interbus_IBSSCRIRTLK = 47, + /// + /// Beckhoff-SERCOS-PCI-Karte FC750x (IODEVICETYPE_FC7500) + /// + [Description("eckhoff-SERCOS-PCI-Karte FC750x (IODEVICETYPE_FC7500)")] + Sercos_FC750x = 48, + /// + /// ISA Interbus-S-Slave (Hilscher-Karte,IODEVICETYPE_CIF30IBS) + /// + [Description("ISA Interbus-S-Slave (Hilscher-Karte,IODEVICETYPE_CIF30IBS)")] + Interbus_CIF30IBS = 49, + /// + /// PCI Interbus-S-Slave CIF50 IBS (Hilscher-Karte, IODEVICETYPE_CIF50IBS) + /// + [Description("PCI Interbus-S-Slave CIF50 IBS (Hilscher-Karte, IODEVICETYPE_CIF50IBS)")] + Interbus_CIF50IBS = 50, + /// + /// PC104 Interbus-S-Slave (Hilscher-Karte, IODEVICETYPE_C104IBS) + /// + [Description("PC104 Interbus-S-Slave (Hilscher-Karte, IODEVICETYPE_C104IBS)")] + Interbus_CIF104IBS = 51, + /// + /// Beckhoff CP9040 Beckhoff CP PC (CP-PC, IODEVICETYPE_BKHFCP9040) + /// + [Description("Beckhoff CP9040 Beckhoff CP PC (CP-PC, IODEVICETYPE_BKHFCP9040)")] + Beckhoff_CP9040 = 52, + /// + /// Beckhoff AH2000 (Hydraulik Backplane, IODEVICETYPE_BKHFAH2000, ID:53) + /// + [Description("Beckhoff AH2000 (Hydraulik Backplane, IODEVICETYPE_BKHFAH2000, ID:53)")] + Beckhoff_AH2000 = 53, + /// + /// Beckhoff CP9035 (PCI, Panel-Link with UPS, IODEVICETYPE_BKHFCP9035, ID:54) + /// + [Description("Beckhoff CP9035 (PCI, Panel-Link with UPS, IODEVICETYPE_BKHFCP9035, ID:54)")] + Beckhoff_CP9035 = 54, + /// + /// Beckhoff-AH2000 mit Profibus-MC (IODEVICETYPE_AH2000MC, ID:55) + /// + [Description("eckhoff-AH2000 mit Profibus-MC (IODEVICETYPE_AH2000MC, ID:55)")] + Profibus_AH2000MC = 55, + /// + /// Beckhoff-Profibus-Monitor-PCI-Karte FC310x-Monitor (IODEVICETYPE_FC3100MON, ID:56) + /// + [Description("Beckhoff-Profibus-Monitor-PCI-Karte FC310x-Monitor (IODEVICETYPE_FC3100MON, ID:56)")] + Profibus_FC310xMonitor = 56, + /// + /// Virtuelles USB Device (IODEVICETYPE_USB, ID:57) + /// + [Description("Virtuelles USB Device (IODEVICETYPE_USB, ID:57")] + USB_Virtual = 57, + /// + /// Beckhoff-CANopen-Monitor-PCI-Karte FC510x-Monitor (IODEVICETYPE_FC5100MON, ID: 58) + /// + [Description("Beckhoff-CANopen-Monitor-PCI-Karte FC510x-Monitor (IODEVICETYPE_FC5100MON, ID: 58)")] + CANOpen_FC510xMonitor = 58, + /// + /// Beckhoff-DeviceNet-Monitor-PCI-Karte FC520x-Monitor (IODEVICETYPE_FC5200MON) + /// + [Description("Beckhoff-DeviceNet-Monitor-PCI-Karte FC520x-Monitor (IODEVICETYPE_FC5200MON)")] + DeviceNet_FC520xMonitor = 59, + /// + /// Beckhoff-Profibus-PCI-Karte als Slave FC310x-Slave (IODEVICETYPE_FC3100SLV) + /// + [Description("Beckhoff-Profibus-PCI-Karte als Slave FC310x-Slave (IODEVICETYPE_FC3100SLV)")] + Profibus_FC310xSlave = 60, + /// + /// Beckhoff-CanOpen-PCI-Karte als Slave FC510x-Slave (IODEVICETYPE_FC5100SLV) + /// + [Description("Beckhoff-CanOpen-PCI-Karte als Slave FC510x-Slave (IODEVICETYPE_FC5100SLV)")] + CANOpen_FC510xSlave = 61, + /// + /// Beckhoff-DeviceNet-PCI-Karte als Slave FC520x-Slave (IODEVICETYPE_FC5200SLV) + /// + [Description("Beckhoff-DeviceNet-PCI-Karte als Slave FC520x-Slave (IODEVICETYPE_FC5200SLV)")] + DeviceNet_FC520xSlave = 62, + /// + /// PCI Interbus-S-Master IBS PCI SC/I-T (Phoenix-Karte, IODEVICETYPE_IBSSCITPCI) + /// + [Description("PCI Interbus-S-Master IBS PCI SC/I-T (Phoenix-Karte, IODEVICETYPE_IBSSCITPCI)")] + Interbus_SCITPCI = 63, + // /// + // /// PCIInterbus-S-Master mit Slave-Teil auf LWL Basis (Phoenix-Karte, IODEVICETYPE_IBSSCRIRTLKPCI) + // /// + // [DevGroup(DeviceGroup.Interbus)] + // Interbus_SCRIRTLKPCI= 64, + /// + /// Beckhoff-CX1100 Klemmenbus Netzteil CX1100 (IODEVICETYPE_CX1100_BK, 65) + /// + [Description("Beckhoff-CX1100 Klemmenbus Netzteil CX1100 (IODEVICETYPE_CX1100_BK, 65)")] + Beckhoff_CX1100 = 65, + /// + /// Ethernet Real Time Miniport RT-Ethernet (IODEVICETYPE_ENETRTMP, 66) + /// + [Description("Ethernet Real Time Miniport RT-Ethernet (IODEVICETYPE_ENETRTMP, 66)")] + Ethernet_RTEthernet_TC2 = 66, + /// + /// + /// + [Obsolete("Use only for TwinCAT 2.xx. For TC3 use EtherCAT_AutomationProtocol instead!", false)] + Ethernet_RTEthernet = 66, + + /// + /// PC104 Lightbus-Master CX1500-M200 (IODEVICETYPE_CX1500_M200, 67) + /// + [Description("PC104 Lightbus-Master CX1500-M200 (IODEVICETYPE_CX1500_M200, 67)")] + Lightbus_CX1500_M200 = 67, + /// + /// PC104 Lightbus-Slave CX1500-B200 (IODEVICETYPE_CX1500_B200) + /// + [Description("PC104 Lightbus-Slave CX1500-B200 (IODEVICETYPE_CX1500_B200)")] + Lightbus_CX1500_B200 = 68, + /// + /// PC104 ProfiBus-Master CX1500-M310 (IODEVICETYPE_CX1500_M310) + /// + [Description("PC104 ProfiBus-Master CX1500-M310 (IODEVICETYPE_CX1500_M310)")] + Profibus_CX1500_M310 = 69, + /// + /// PC104 ProfiBus-Slave CX1500-B310 (IODEVICETYPE_CX1500_B310) + /// + [Description("PC104 ProfiBus-Slave CX1500-B310 (IODEVICETYPE_CX1500_B310)")] + Profibus_CX1500_B310 = 70, + /// + /// PC104 CANopen-Master CX1500-M510 (IODEVICETYPE_CX1500_M510) + /// + [Description("PC104 CANopen-Master CX1500-M510 (IODEVICETYPE_CX1500_M510)")] + CANOpen_CX1500_M510 = 71, + /// + /// PC104 CANopen-Slave CX1500-B510 (IODEVICETYPE_CX1500_B510) + /// + [Description("PC104 CANopen-Slave CX1500-B510 (IODEVICETYPE_CX1500_B510)")] + CANOpen_CX1500_B510 = 72, + /// + /// PC104 DeviceNet-Master CX1500-M520 (IODEVICETYPE_CX1500_M520) + /// + [Description("PC104 DeviceNet-Master CX1500-M520 (IODEVICETYPE_CX1500_M520)")] + DeviceNet_CX1500_M520 = 73, + /// + /// PC104 DeviceNet-Slave CX1500-B520 (IODEVICETYPE_CX1500_B520) + /// + [Description("PC104 DeviceNet-Slave CX1500-B520 (IODEVICETYPE_CX1500_B520)")] + DeviceNet_CX1500_B520 = 74, + /// + /// PC104 Sercos-Master CX1500-M750 (IODEVICETYPE_CX1500_M750) + /// + [Description("PC104 Sercos-Master CX1500-M750 (IODEVICETYPE_CX1500_M750)")] + Sercos_CX1500_M750 = 75, + /// + /// PC104 Sercos-Slave (IODEVICETYPE_CX1500_B750) + /// + [Description("PC104 Sercos-Slave (IODEVICETYPE_CX1500_B750)")] + Sercos_CX1500_B750 = 76, + /// + /// BX Klemmenbus Interface BX-BK (IODEVICETYPE_BX_BK) + /// + [Description("BX Klemmenbus Interface BX-BK (IODEVICETYPE_BX_BK)")] + Beckhoff_BX_BK = 77, + /// + /// BX SSB-Master BX-M510(IODEVICETYPE_BX_M510) + /// + [Description("BX SSB-Master BX-M510(IODEVICETYPE_BX_M510)")] + CANOpen_BX_M510 = 78, + /// + /// BX ProfiBus-Slave BX-B310 (IODEVICETYPE_BX_B310) + /// + [Description("BX ProfiBus-Slave BX-B310 (IODEVICETYPE_BX_B310)")] + Profibus_BX_B310 = 79, + /// + /// PCIInterbus-S-Master mit Slave-Teil auf Kupfer Basis IBS PCI SC/RI/I-T (Phoenix-Karte, IODEVICETYPE_IBSSCRIRTPCI) + /// + [Description("PCIInterbus-S-Master mit Slave-Teil auf Kupfer Basis IBS PCI SC/RI/I-T (Phoenix-Karte, IODEVICETYPE_IBSSCRIRTPCI)")] + Interbus_SCRIRTPCI = 80, + /// + /// BX CANopen-Slave BX-B510 (IODEVICETYPE_BX_B510) + /// + [Description("BX CANopen-Slave BX-B510 (IODEVICETYPE_BX_B510)")] + CANOpen_BX_B510 = 81, + /// + /// BX DeviceNet-Slave BX-B520 (IODEVICETYPE_BX_B520) + /// + [Description("BX DeviceNet-Slave BX-B520 (IODEVICETYPE_BX_B520)")] + DeviceNet_BX_B520 = 82, + /// + /// BCxx50 ProfiBus-Slave BC3150 (IODEVICETYPE_BC3150) + /// + [Description("BCxx50 ProfiBus-Slave BC3150 (IODEVICETYPE_BC3150)")] + Profibus_BC3150 = 83, + /// + /// BCxx50 CANopen-Slave (IODEVICETYPE_BC5150) + /// + [Description("BCxx50 CANopen-Slave (IODEVICETYPE_BC5150)")] + CANOpen_BC5150 = 84, + /// + /// BCxx50 DeviceNet-Slave BC5250 (IODEVICETYPE_BC5250) + /// + [Description("BCxx50 DeviceNet-Slave BC5250 (IODEVICETYPE_BC5250)")] + DeviceNet_BC5250 = 85, + + /// + /// Beckhoff-Profibus-EtherCAT-Klemme (IODEVICETYPE_EL6731) + /// + [Description("Beckhoff - Profibus - EtherCAT - Klemme(IODEVICETYPE_EL6731))")] + EtherCAT_EL6731 = 86, // Beckhoff-Profibus-EtherCAT-Klemme + /// + /// Beckhoff-CanOpen-EtherCAT-Klemme (IODEVICETYPE_EL6751) + /// + [Description("Beckhoff-CanOpen-EtherCAT-Klemme (IODEVICETYPE_EL6751)")] + EtherCAT_EL6751 = 87, // Beckhoff-CanOpen-EtherCAT-Klemme + /// + /// Beckhoff-DeviceNet-EtherCAT-Klemme (IODEVICETYPE_EL6752) + /// + [Description("Beckhoff-DeviceNet-EtherCAT-Klemme (IODEVICETYPE_EL6752)")] + EtherCAT_EL6752 = 88, // Beckhoff-DeviceNet-EtherCAT-Klemme + /// + /// COM ProfiBus-Master 8 kByte (Hilscher-Karte)(IODEVICETYPE_COMPB) + /// + [Description("COM ProfiBus-Master 8 kByte (Hilscher-Karte)(IODEVICETYPE_COMPB)")] + Profibus_COMPB = 89, // COM ProfiBus-Master 8 kByte (Hilscher-Karte) + /// + /// COM Interbus-S-Master (Hilscher-Karte)(IODEVICETYPE_COMIBM) + /// + [Description("COM Interbus-S-Master (Hilscher-Karte)(IODEVICETYPE_COMIBM)")] + Interbus_COMIBM = 90, // COM Interbus-S-Master (Hilscher-Karte) + /// + /// COM DeviceNet-Master (Hilscher-Karte)(IODEVICETYPE_COMDNM) + /// + [Description("COM DeviceNet-Master (Hilscher-Karte)(IODEVICETYPE_COMDNM)")] + DeviceNet_COMDNM = 91, // COM DeviceNet-Master (Hilscher-Karte) + /// + /// COM CANopen-Master (Hilscher-Karte)(IODEVICETYPE_COMCAN) + /// + [Description("COM CANopen-Master (Hilscher-Karte)(IODEVICETYPE_COMCAN)")] + CANOpen_COMCAN = 92, // COM CANopen-Master (Hilscher-Karte) + /// + /// COM CANopen-Slave (Hilscher-Karte)(IODEVICETYPE_COMIBS) + /// + [Description("COM CANopen-Slave (Hilscher-Karte)(IODEVICETYPE_COMIBS)")] + CANOpen_COMIBS = 93, // COM CANopen-Slave (Hilscher-Karte) + /// + /// EtherCAT in direct mode (v2.10 only) (IODEVICETYPE_ETHERCAT) + /// + [Description("EtherCAT in direct mode (v2.10 only) (IODEVICETYPE_ETHERCAT)")] + EtherCAT_DirectModeV210 = 94, // EtherCAT in direct mode (V2.10 Version) + /// + /// PROFINET Master (IODEVICETYPE_PROFINETIOCONTROLLER) + /// + [Description("PROFINET Master (IODEVICETYPE_PROFINETIOCONTROLLER)")] + Profinet_IOCONTROLLER = 95, // PROFINET Master + /// + /// PROFINET Slave (IODEVICETYPE_PROFINETIODEVICE) + /// + [Description("PROFINET Slave (IODEVICETYPE_PROFINETIODEVICE)")] + Profinet_IODEVICE = 96, // PROFINET Slave + /// + /// Beckhoff-Profibus-Slave-EtherCAT-Klemme (IODEVICETYPE_EL6731SLV) + /// + [Description("Beckhoff-Profibus-Slave-EtherCAT-Klemme (IODEVICETYPE_EL6731SLV)")] + Profibus_EL6731SLV = 97, // Beckhoff-Profibus-Slave-EtherCAT-Klemme + /// + /// Beckhoff-CanOpen-Slave-EtherCAT-Klemme (IODEVICETYPE_EL6751SLV) + /// + [Description("Beckhoff-CanOpen-Slave-EtherCAT-Klemme (IODEVICETYPE_EL6751SLV)")] + CANOpen_EL6751SLV = 98, // Beckhoff-CanOpen-Slave-EtherCAT-Klemme + /// + /// Beckhoff-DeviceNet-Slave-EtherCAT-Klemme (IODEVICETYPE_EL6752SLV) + /// + [Description("Beckhoff-DeviceNet-Slave-EtherCAT-Klemme (IODEVICETYPE_EL6752SLV)")] + DeviceNet_EL6752SLV = 99, // Beckhoff-DeviceNet-Slave-EtherCAT-Klemme + /// + /// PC104+ ProfiBus-Master 8 kByte (Hilscher-Karte) (IODEVICETYPE_C104PPB) + /// + [Description("PC104+ ProfiBus-Master 8 kByte (Hilscher-Karte) (IODEVICETYPE_C104PPB)")] + Profibus_C104PPB = 100, // PC104+ ProfiBus-Master 8 kByte (Hilscher-Karte) + /// + /// PC104+ CANopen-Master (Hilscher-Karte) (IODEVICETYPE_C104PCAN) + /// + [Description("PC104+ CANopen-Master (Hilscher-Karte) (IODEVICETYPE_C104PCAN)")] + CANOpen_C104PCAN = 101, // PC104+ CANopen-Master (Hilscher-Karte) + /// + /// PC104+ DeviceNet-Master (Hilscher-Karte) (IODEVICETYPE_C104PDNM) + /// + [Description("PC104+ DeviceNet-Master (Hilscher-Karte) (IODEVICETYPE_C104PDNM)")] + DeviceNet_C104PDNM = 102, // PC104+ DeviceNet-Master (Hilscher-Karte) + /// + /// BCxx50 serieller Slave (IODEVICETYPE_BC8150) + /// + [Description("BCxx50 serieller Slave (IODEVICETYPE_BC8150)")] + Serial_BC8150 = 103, // BCxx50 serieller Slave + /// + /// BX9000 Ethernet Slave (IODEVICETYPE_BX9000) + /// + [Description("BX9000 Ethernet Slave (IODEVICETYPE_BX9000)")] + Ethernet_BX9000 = 104, // BX9000 Ethernet Slave + /// + /// CX9000 Terminal Device (K-BUS) + /// + [Description("CX9000 Terminal Device (K-BUS)")] + Ethernet_CX9000 = 105, // BX9000 Ethernet Slave + /// + /// EtherCAT Automation Protocol, EL6601 (IODEVICETYPE_EL6601 = 106) + /// + [Description("EtherCAT Automation Protocol, EL6601 (IODEVICETYPE_EL6601 = 106)")] + RTEthernet_EL6601 = 106, // Beckhoff-RT-Ethernet-EtherCAT-Klemme + /// + /// BC9050 Etherent Slave (IODEVICETYPE_BC9050 = 107) + /// + [Description("BC9050 Etherent Slave (IODEVICETYPE_BC9050 = 107)")] + Ethernet_BC9050 = 107, // BC9050 Etherent Slave + /// + /// RT-Ethernet Adapter (BC9120 Ethernet Slave) IODEVICETYPE_BC9120 = 108) + /// + [Description("RT-Ethernet Adapter (BC9120 Ethernet Slave) IODEVICETYPE_BC9120 = 108)")] + Ethernet_BC9120 = 108, // BC9120 Ethernet Slave + /// + /// RT-Ethernet Multiple Protocol Handler, Ethernet Miniport Adapter (IODEVICETYPE_ENETADAPTER = 109) + /// + [Description("Ethernet Miniport Adapter (IODEVICETYPE_ENETADAPTER = 109)")] + Ethernet_RTMultipleProtocol = 109, // Ethernet Miniport Adapter + /// + /// + /// + [Obsolete("Use Ethernet_RTMultipleProtocol instead!", false)] + Ethernet_MiniportAdapter = 109, // Ethernet Miniport Adapter + /// + /// BC9020 Ethernet Slave (IODEVICETYPE_BC9020 = 110) + /// + [Description("BC9020 Ethernet Slave (IODEVICETYPE_BC9020 = 110)")] + Ethernet_BC9020 = 110, // BC9020 Ethernet Slave + /// + /// EtherCAT Protocol in Direct mode (IODEVICETYPE_ETHERCATPROT = 111) + /// + [Description("EtherCAT Protocol in Direct mode (IODEVICETYPE_ETHERCATPROT = 111)")] + EtherCAT_DirectMode = 111, // EtherCAT Protocol in direct mode + /// + /// EtherCAT Network Variables (Automation protocol, IODEVICETYPE_ETHERNETNVPROT = 112) + /// + [Description("EtherCAT Network Variables (Automation protocol, IODEVICETYPE_ETHERNETNVPROT = 112)")] + EtherCAT_AutomationProtocol = 112, // + /// + /// + /// + [Obsolete("Renamed to ETherCAT_AutomationProtocol", false)] + Ethernet_NetworkVariables = 112, // + + /// + /// Profinet Controller (IODEVICETYPE_ETHERNETPNMPROT = 113) + /// + [Description("Profinet Controller (IODEVICETYPE_ETHERNETPNMPROT = 113)")] + Profinet_Controller = 113, // + /// + /// Beckhoff-Lightbus-EtherCAT-Klemme (IODEVICETYPE_EL6720 = 114) + /// + [Description("Beckhoff-Lightbus-EtherCAT-Klemme (IODEVICETYPE_EL6720 = 114)")] + Lightbus_EL6720 = 114, // Beckhoff-Lightbus-EtherCAT-Klemme + /// + /// Profinet Device (IODEVICETYPE_ETHERNETPNSPROT = 115) + /// + [Description("Profinet Device (IODEVICETYPE_ETHERNETPNSPROT = 115)")] + Profinet_Device = 115, // + /// + /// Beckhoff CP PC (Beckhoff CP6608(IXP PC), IODEVICETYPE_BKHFCP6608 = 116) + /// + [Description("Beckhoff CP PC (Beckhoff CP6608(IXP PC), IODEVICETYPE_BKHFCP6608 = 116)")] + Beckhoff_CP6608 = 116, // Beckhoff CP6608(IXP PC) + /// + /// IEEE 1588 (PTP) (IODEVICETYPE_PTP_IEEE1588 = 117) + /// + [Description("IEEE 1588 (PTP) (IODEVICETYPE_PTP_IEEE1588 = 117)")] + Ethernet_PTP_IEEE1588 = 117, + /// + /// EL6631-0010 (IODEVICETYPE_EL6631SLV = 118) + /// + [Description("EL6631-0010 (IODEVICETYPE_EL6631SLV = 118)")] + Profinet_EL6631SLV = 118, // EL6631-0010 + /// + /// EL6631 (IODEVICETYPE_EL6631 = 119) + /// + [Description("EL6631 (IODEVICETYPE_EL6631 = 119)")] + Profinet_EL6631 = 119, // EL6631 + /// + /// CX5000-BK (Beckhoff-CX5100 Klemmenbus Netzteil, IODEVICETYPE_CX5000_BK = 120) + /// + [Description("CX5000-BK (Beckhoff-CX5100 Klemmenbus Netzteil, IODEVICETYPE_CX5000_BK = 120)")] + Beckhoff_CX5000_BK = 120, // Beckhoff-CX5100 Klemmenbus Netzteil + /// + /// PCI DP-RAM (Generic PCI DPRAM (TCOM), IODEVICETYPE_PCIDEVICE = 121) + /// + [Description("PCI DP-RAM (Generic PCI DPRAM (TCOM), IODEVICETYPE_PCIDEVICE = 121)")] + Misc_PciDevice = 121, // Generic PCI DPRAM (TCOM) + + /// + /// IODEVICETYPE_ETHERNETEAPPOLL = 122, // EtherCAT Automation Protocoll polled connection + /// + Ethernet_AutomationProtocolPolled = 122, + /// + /// IODEVICETYPE_ETHERNETAUTOPROT = 123, // Automation Protocol + /// + Ethernet_AutomationProtocol = 123, + /// + /// IODEVICETYPE_CCAT = 124, // CCAT + /// + CCAT = 124, + /// + /// IODEVICETYPE_CPLINK3 = 125, // Virtuelles USB Device (remote via CPLINK3) + /// + CPLink3_VirtualUSB = 125, + /// + /// IODEVICETYPE_EL6632 = 126, // EL6632 + /// + EL6632 = 123, + /// + /// IODEVICETYPE_CCAT_PBM = 127, // CCAT Profibus Master + /// + Profibus_CCATMaster = 127, + /// + /// IODEVICETYPE_CCAT_PBS = 128, // CCAT Profibus Slave + /// + Profibus_CCATSlave = 128, + /// + /// IODEVICETYPE_CCAT_CNM = 129, // CCAT CANopen Master + /// + CANOpen_CCATMaster = 129, + /// + /// IODEVICETYPE_ETHERCATSLAVE = 130, // EtherCAT Slave + /// + EtherCAT_Slave = 130, + /// + /// IODEVICETYPE_BACNET = 131, // BACnet device + /// + BACnet_Device = 131, + /// + /// IODEVICETYPE_CCAT_CNS = 132, // CCAT CANopen Slave + /// + CANOpen_CCATSlave = 132, + /// + /// IODEVICETYPE_ETHIP_SCANNER = 133, // ETHERNET IP Master + /// + EThernetIP_Master = 133, + /// + /// IODEVICETYPE_ETHIP_ADAPTER = 134, // ETHERNET IP Slave + /// + EthernetIP_Slave = 134, + /// + /// IODEVICETYPE_CX8000_BK = 135, // Beckhoff-CX8100 Klemmenbus Netzteil + /// + CX8000_BK = 135, + /// + /// IODEVICETYPE_ETHERNETUDPPROT = 136, // Upd Protocol + /// + Ethernet_UDPProtocol = 136, + /// + /// IODEVICETYPE_BC9191 = 137, // BC9191 Etherent Slave + /// + BC9191 = 137, + /// + /// IODEVICETYPE_ENETPROTOCOL = 138, // Real-Time Ethernet Protocol (BK90xx, AX2000-B900) + /// + RTEThernet_BK90xx_AX2000B900 = 138 + } + + /// + /// Disabled state type for the TreeItem + /// + /// + /// This is the CLS-compliant, corresponding type to TCatSysManagerLibs DISABLED_STATE + /// + public enum DisabledState + { + /// + /// The state is unknown/not initialized + /// + Unknown = -1, + /// + /// The item is not disabled + /// + NotDisabled = 0, + /// + /// The item is disabled itself + /// + Disabled = 1, + /// + /// A parent of the item is disabled (and implicitely the item itself) + /// + ParentDisabled = 2 + } + + /// + /// + /// + public enum IECLanguageType + { + /// + /// + /// + None = IECLANGUAGETYPES.IECLANGUAGE_NONE, + + /// + /// + /// + ST = IECLANGUAGETYPES.IECLANGUAGE_ST, + /// + /// + /// + IL = IECLANGUAGETYPES.IECLANGUAGE_IL, + /// + /// + /// + SFC = IECLANGUAGETYPES.IECLANGUAGE_SFC, + /// + /// + /// + FBD = IECLANGUAGETYPES.IECLANGUAGE_FBD, + /// + /// + /// + CFC = IECLANGUAGETYPES.IECLANGUAGE_CFC, + + /// + /// + /// + LD = IECLANGUAGETYPES.IECLANGUAGE_LD + } + + /// + /// Extension class for the + /// + public static class IECLanguageTypeExtension + { + /// + /// Converts the to an Int32 + /// + /// The type. + /// + public static int AsInt32(this IECLanguageType type) + { + return (int)type; + } + + /// + /// Converts the to string identifyer + /// + /// The type. + /// + public static string AsString(this IECLanguageType type) + { + return type.ToString(); + } + } + + /// + /// Extension class for the . + /// + public static class TreeItemTypeExtension + { + /// + /// Gets the description of the + /// + /// The type. + /// + public static string GetDescription(this TreeItemType type) + { + var field = type.GetType().GetField(type.ToString()); + var attributes = (DescriptionAttribute[])field.GetCustomAttributes(typeof(DescriptionAttribute), false); + return attributes.Length > 0 ? attributes[0].Description : type.ToString(); + } + + /// + /// Converts the to Int32. + /// + /// The type. + /// + public static int AsInt32(this TreeItemType type) + { + return (int)type; + } + } + + /// + /// Extension class for the . + /// + public static class DeviceTypeExtension + { + /// + /// Gets the description of the + /// + /// The type. + /// + public static string GetDescription(this DeviceType type) + { + var field = type.GetType().GetField(type.ToString()); + var attributes = (DescriptionAttribute[])field.GetCustomAttributes(typeof(DescriptionAttribute), false); + return attributes.Length > 0 ? attributes[0].Description : type.ToString(); + } + + /// + /// Converts the to Int32. + /// + /// The type. + /// + public static int AsInt32(this DeviceType type) + { + return (int)type; + } + } + + /// + /// Extension class for + /// + public static class BoxTypeExtension + { + /// + /// Gets the description of the . + /// + /// The type. + /// + public static string GetDescription(this BoxType type) + { + var field = type.GetType().GetField(type.ToString()); + var attributes = (DescriptionAttribute[])field.GetCustomAttributes(typeof(DescriptionAttribute), false); + return attributes.Length > 0 ? attributes[0].Description : type.ToString(); + } + + /// + /// Gets the as Int32. + /// + /// The type. + /// + public static int AsInt32(this BoxType type) + { + return (int)type; + } + } + + /// + /// Group type of variables + /// + public enum VarGroupType + { + /// + /// Variable Group is unknown + /// + Unknown = 0, + /// + /// Input variable group + /// + Input = 1, + /// + /// Output variable group + /// + Output = 2, + /// + /// Channel variable group + /// + Channel = 3 + } +} + diff --git a/TwinCATAUTDServer/TwinCATAUTDServer/Program.cs b/TwinCATAUTDServer/TwinCATAUTDServer/Program.cs new file mode 100644 index 0000000..ae05796 --- /dev/null +++ b/TwinCATAUTDServer/TwinCATAUTDServer/Program.cs @@ -0,0 +1,76 @@ +/* + * File: Program.cs + * Project: TwinCATAUTDServer + * Created Date: 05/08/2022 + * Author: Shun Suzuki + * ----- + * Last Modified: 26/10/2022 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2022 Shun Suzuki. All rights reserved. + * + */ + +using System; +using System.CommandLine; + +namespace TwinCATAUTDServer +{ + internal class Program + { + [STAThread] + private static int Main(string[] args) + { + Console.OutputEncoding = System.Text.Encoding.UTF8; + + var clientIpAddr = new Option( + aliases: new[] { "--client", "-c" }, + description: "Client IP address", + getDefaultValue: () => "" + ); + var sync0CycleTime = new Option( + aliases: new[] { "--sync0", "-s" }, + description: "Sync0 cycle time in units of 500us", + getDefaultValue: () => 2 + ); + var taskCycleTime = new Option( + aliases: new[] { "--task", "-t" }, + description: "Send task cycle time in units of 500us", + getDefaultValue: () => 2 + ); + var cpuBaseTime = new Option( + aliases: new[] { "--base", "-b" }, + description: "CPU base time in units of 500us", + getDefaultValue: () => 1 + ); + var syncMode = new Option( + aliases: new[] { "--mode", "-m" }, + description: "Sync mode", + getDefaultValue: () => SyncMode.DC + ); + var keep = new Option( + aliases: new[] { "--keep", "-k" }, + description: "Keep TwinCAT config window open", + getDefaultValue: () => false + ); + + var rootCommand = new RootCommand("TwinCAT AUTD3 server"); + rootCommand.AddOption(clientIpAddr); + rootCommand.AddOption(sync0CycleTime); + rootCommand.AddOption(taskCycleTime); + rootCommand.AddOption(cpuBaseTime); + rootCommand.AddOption(syncMode); + rootCommand.AddOption(keep); + + rootCommand.SetHandler(Setup, clientIpAddr, sync0CycleTime, taskCycleTime, cpuBaseTime, syncMode, keep); + + return rootCommand.Invoke(args); + } + + [STAThread] + private static void Setup(string clientIpAddr, int sync0CycleTime, int taskCycleTime, int cpuBaseTime, SyncMode syncMode, bool keep) + { + (new SetupTwinCAT(clientIpAddr, syncMode, 5000 * taskCycleTime, 5000 * cpuBaseTime, 500000 * sync0CycleTime, keep)).Run(); + } + } +} diff --git a/TwinCATAUTDServer/TwinCATAUTDServer/Properties/AssemblyInfo.cs b/TwinCATAUTDServer/TwinCATAUTDServer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e665ac3 --- /dev/null +++ b/TwinCATAUTDServer/TwinCATAUTDServer/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("TwinCATAUTDServer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("TwinCATAUTDServer")] +[assembly: AssemblyCopyright("Copyright © 2022 Shinoda-Makino Laboratory")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7907a571-a76a-4071-a7cd-da2cb6ee261b")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("2.3.0.0")] +[assembly: AssemblyFileVersion("2.3.0.0")] diff --git a/TwinCATAUTDServer/TwinCATAUTDServer/SetupTwinCAT.cs b/TwinCATAUTDServer/TwinCATAUTDServer/SetupTwinCAT.cs new file mode 100644 index 0000000..ffba7fa --- /dev/null +++ b/TwinCATAUTDServer/TwinCATAUTDServer/SetupTwinCAT.cs @@ -0,0 +1,506 @@ +/* + * File: SetupTwinCATcs + * Project: TwinCATAUTDServer + * Created Date: 05/08/2022 + * Author: Shun Suzuki + * ----- + * Last Modified: 15/07/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2022 Shun Suzuki. All rights reserved. + * + */ + +using System; +using System.Collections.Generic; +using System.Xml; +using TCatSysManagerLib; +using TwinCAT.SystemManager; +using EnvDTE; +using EnvDTE80; +using System.IO; +using System.Linq; +using System.Net; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; +using System.Xml.Linq; +using TwinCAT.Ads; +using System.Text.RegularExpressions; + +namespace TwinCATAUTDServer +{ + internal class SetupTwinCAT + { + private const string SolutionName = "TwinCATAUTDServer"; + private const int HeadSize = 64; + private const int BodySize = 249; + + private readonly string _clientIpAddr; + private readonly SyncMode _syncMode; + private readonly int _taskCycleTime; + private readonly int _cpuBaseTime; + private readonly int _sync0CycleTime; + private readonly bool _keep; + + internal SetupTwinCAT(string clientIpAddr, SyncMode syncMode, int taskCycleTime, int cpuBaseTime, int sync0CycleTime, bool keep) + { + _clientIpAddr = clientIpAddr; + _syncMode = syncMode; + _taskCycleTime = taskCycleTime; + _cpuBaseTime = cpuBaseTime; + _sync0CycleTime = sync0CycleTime; + _keep = keep; + } + + [STAThread] + public void Run() + { + var solutionPath = Path.Combine(Environment.GetEnvironmentVariable("temp") ?? string.Empty, SolutionName); + MessageFilter.Register(); + try + { + // Close all TwinCAT Autd Server solutions currently opened + var processes = System.Diagnostics.Process.GetProcesses().Where(x => x.MainWindowTitle.StartsWith(SolutionName) && x.ProcessName.Contains("devenv")); + foreach (var process in processes) GetDte(process.Id)?.Quit(); + + IPAddress.TryParse(_clientIpAddr ?? string.Empty, out var ipAddr); + + Console.WriteLine("Connecting to TcXaeShell DTE..."); + var t = Type.GetTypeFromProgID("TcXaeShell.DTE.15.0"); + var dte = (DTE2)Activator.CreateInstance(t); + + dte.SuppressUI = false; + dte.MainWindow.Visible = true; + dte.UserControl = true; + + Console.WriteLine("Switching TwinCAT3 to Config Mode..."); + SetConfigMode(); + System.Threading.Thread.Sleep(1000); + Console.WriteLine("Creating a Project..."); + var project = CreateProject(dte, solutionPath); + ITcSysManager sysManager = project.Object; + if (ipAddr != null) + { + Console.WriteLine("Setting up the Routing Table to " + ipAddr); + AddRoute(sysManager, ipAddr); + } + Console.WriteLine("Scanning Devices..."); + var autds = ScanAutDs(sysManager); + AssignCpuCores(sysManager); + SetupTask(sysManager, autds); + Console.WriteLine("Activating and Restarting TwinCAT3..."); + sysManager.ActivateConfiguration(); + sysManager.StartRestartTwinCAT(); + + if (ipAddr != null) + { + var system = sysManager.LookupTreeItem("SYSTEM"); + var systemXml = system.ProduceXml(true); + var amsNetIdReg = Regex.Match(systemXml, @"(?.*)").Groups["AmsNetId"].Value; + Console.WriteLine($"Server AmsNetId: {amsNetIdReg}"); + Console.WriteLine($"Client AmsNetId: {ipAddr}.1.1"); + } + + Console.WriteLine($"Saving the Project..."); + SaveProject(dte, project, solutionPath); + if (!_keep) dte.Quit(); + } + catch (Exception e) + { + Console.Write("Error: "); + Console.WriteLine(e.Message); + } + + MessageFilter.Revoke(); + } + + [DllImport("ole32.dll")] + private static extern int CreateBindCtx(uint reserved, out IBindCtx ppbc); + + public static DTE GetDte(int processId) + { + var progId = "!TcXaeShell.DTE.15.0:" + processId; + object runningObject = null; + + IBindCtx bindCtx = null; + IRunningObjectTable rot = null; + IEnumMoniker enumMonikers = null; + + try + { + Marshal.ThrowExceptionForHR(CreateBindCtx(0, out bindCtx)); + bindCtx.GetRunningObjectTable(out rot); + rot.EnumRunning(out enumMonikers); + + var moniker = new IMoniker[1]; + var numberFetched = IntPtr.Zero; + while (enumMonikers.Next(1, moniker, numberFetched) == 0) + { + var runningObjectMoniker = moniker[0]; + string name = null; + try + { + runningObjectMoniker?.GetDisplayName(bindCtx, null, out name); + } + catch (UnauthorizedAccessException) + { + // Do nothing, there is something in the ROT that we do not have access to. + } + + if (string.IsNullOrEmpty(name) || !string.Equals(name, progId, StringComparison.Ordinal)) continue; + Marshal.ThrowExceptionForHR(rot.GetObject(runningObjectMoniker, out runningObject)); + break; + } + } + finally + { + if (enumMonikers != null) Marshal.ReleaseComObject(enumMonikers); + if (rot != null) Marshal.ReleaseComObject(rot); + if (bindCtx != null) Marshal.ReleaseComObject(bindCtx); + } + return (DTE)runningObject; + } + + private static void SetConfigMode() + { + var client = new TcAdsClient(); + var mode = new StateInfo(); + + client.Connect((int)AmsPort.SystemService); + mode.AdsState = client.ReadState().AdsState; + mode.AdsState = AdsState.Reconfig; + client.WriteControl(mode); + client.Dispose(); + } + + private static void DeleteDirectory(string path) + { + foreach (var directory in Directory.GetDirectories(path)) + DeleteDirectory(directory); + + try + { + Directory.Delete(path, true); + } + catch (IOException) + { + Directory.Delete(path, true); + } + catch (UnauthorizedAccessException) + { + Directory.Delete(path, true); + } + } + + private static Project CreateProject(DTE2 dte, string path) + { + if (Directory.Exists(path)) + DeleteDirectory(path); + Directory.CreateDirectory(path); + + var solution = dte.Solution as Solution2; + solution.Create(path, SolutionName); + solution.SaveAs(Path.Combine(path, SolutionName + ".sln")); + + const string template = @"C:\TwinCAT\3.1\Components\Base\PrjTemplate\TwinCAT Project.tsproj"; //path to project template + return solution.AddFromTemplate(template, path, SolutionName); + } + + private static void SaveProject(DTE2 dte, Project project, string path) + { + project.Save(); + dte.Solution.SaveAs(Path.Combine(path, SolutionName + ".sln")); + Console.WriteLine("The Solution was saved at " + path + "."); + } + + private static void AddRoute(ITcSysManager sysManager, IPAddress ipAddr) + { + var routeConfiguration = sysManager.LookupTreeItem("TIRR"); + var addProjectRouteIp = @" + + + " + ipAddr + @" + " + ipAddr + @".1.1" + @" + " + ipAddr + @" + + + "; + + routeConfiguration.ConsumeXml(addProjectRouteIp); + } + + private List ScanAutDs(ITcSysManager sysManager) + { + var devices = (ITcSmTreeItem3)sysManager.LookupTreeItem("TIID"); + var doc = new XmlDocument(); + var xml = devices.ProduceXml(false); + doc.LoadXml(xml); + var nodes = doc.SelectNodes("TreeItem/DeviceGrpDef/FoundDevices/Device"); + var ethernetNodes = (from XmlNode node in nodes let typeNode = node.SelectSingleNode("ItemSubType") let subType = int.Parse(typeNode.InnerText) where subType == (int)DeviceType.EtherCAT_AutomationProtocol || subType == (int)DeviceType.EtherCAT_DirectMode || subType == (int)DeviceType.EtherCAT_DirectModeV210 select node).ToList(); + + if (ethernetNodes.Count == 0) + throw new Exception("No devices were found. Check if TwinCAT3 is in Config Mode"); + + Console.WriteLine("Scan found a RT-compatible Ethernet device."); + var device = (ITcSmTreeItem3)devices.CreateChild("EtherCAT Master", (int)DeviceType.EtherCAT_DirectMode, null); + + // Taking only the first found Ethernet Adapter + var ethernetNode = ethernetNodes[0]; + var addressInfoNode = ethernetNode.SelectSingleNode("AddressInfo"); + addressInfoNode.SelectSingleNode("Pnp/DeviceDesc").InnerText = "TwincatEthernetDevice"; + // Set the Address Info + var xml2 = $"{addressInfoNode.OuterXml}"; + device.ConsumeXml(xml2); + + const string scanXml = "1"; + device.ConsumeXml(scanXml); + var autds = new List(); + foreach (ITcSmTreeItem box in device) + { + if (box.ItemSubTypeName != "AUTD") continue; + var bdoc = new XmlDocument(); + var bxml = box.ProduceXml(false); + bdoc.LoadXml(bxml); + + // set DC + if (_syncMode == SyncMode.DC) + { + var dcOpmodes = bdoc.SelectNodes("TreeItem/EtherCAT/Slave/DC/OpMode"); + foreach (XmlNode item in dcOpmodes) + { + if (item.SelectSingleNode("Name")?.InnerText == "DC") + { + var attr = bdoc.CreateAttribute("Selected"); + attr.Value = "true"; + item.Attributes?.SetNamedItem(attr); + + item.SelectSingleNode("CycleTimeSync0").InnerText = _sync0CycleTime.ToString(); + attr = bdoc.CreateAttribute("Factor"); + attr.Value = "0"; + item.Attributes?.SetNamedItem(attr); + item.SelectSingleNode("CycleTimeSync0").Attributes?.SetNamedItem(attr); + } + else + { + item.Attributes?.RemoveAll(); + } + } + } + else + { + var dcOpmodes = bdoc.SelectNodes("TreeItem/EtherCAT/Slave/DC/OpMode"); + foreach (XmlNode item in dcOpmodes) + { + if (item.SelectSingleNode("Name")?.InnerText == "Synchron") + { + var attr = bdoc.CreateAttribute("Selected"); + attr.Value = "true"; + item.Attributes?.SetNamedItem(attr); + + item.SelectSingleNode("AssignActivate").InnerText = "#x300"; + + item.SelectSingleNode("CycleTimeSync0").InnerText = _sync0CycleTime.ToString(); + attr = bdoc.CreateAttribute("Factor"); + attr.Value = "0"; + item.Attributes?.SetNamedItem(attr); + item.SelectSingleNode("CycleTimeSync0").Attributes?.SetNamedItem(attr); + } + else + { + item.Attributes?.RemoveAll(); + } + } + } + + box.ConsumeXml(bdoc.OuterXml); + + autds.Add(box); + } + + Console.WriteLine($"{autds.Count} AUTDs are found and added."); + + return autds; + } + + private void SetupTask(ITcSysManager sysManager, IReadOnlyCollection autds) + { + var tasks = sysManager.LookupTreeItem("TIRT"); + var task1 = tasks.CreateChild("Task 1", 0, null); + var doc = new XmlDocument(); + var xml = task1.ProduceXml(false); + doc.LoadXml(xml); + + doc.SelectSingleNode("TreeItem/TaskDef/CycleTime").InnerText = _taskCycleTime.ToString(); + task1.ConsumeXml(doc.OuterXml); + + var task1Out = sysManager.LookupTreeItem("TIRT^Task 1^Outputs"); + // make gain body + for (var id = 0; id < autds.Count; id++) + { + for (var i = 0; i < HeadSize; i++) + { + var name = $"header[{id}][{i}]"; + task1Out.CreateChild(name, -1, null, "WORD"); + } + for (var i = 0; i < BodySize; i++) + { + var name = $"gbody[{id}][{i}]"; + task1Out.CreateChild(name, -1, null, "WORD"); + } + } + var task1In = sysManager.LookupTreeItem("TIRT^Task 1^Inputs"); + for (var id = 0; id < autds.Count; id++) + { + var name = $"input[{id}]"; + task1In.CreateChild(name, -1, null, "WORD"); + } + // connect links + for (var id = 0; id < autds.Count; id++) + { + for (var i = 0; i < HeadSize; i++) + { + var source = $"TIRT^Task 1^Outputs^header[{id}][{i}]"; + var destination = $"TIID^EtherCAT Master^Box {id + 1} (AUTD)^RxPdo0^data[{i}]"; + sysManager.LinkVariables(source, destination); + } + for (var i = 0; i < BodySize - HeadSize; i++) + { + var source = $"TIRT^Task 1^Outputs^gbody[{id}][{i}]"; + var destination = $"TIID^EtherCAT Master^Box {id + 1} (AUTD)^RxPdo0^data[{HeadSize + i}]"; + sysManager.LinkVariables(source, destination); + } + for (var i = 0; i < HeadSize; i++) + { + var source = $"TIRT^Task 1^Outputs^gbody[{id}][{BodySize - HeadSize + i}]"; + var destination = $"TIID^EtherCAT Master^Box {id + 1} (AUTD)^RxPdo1^data[{i}]"; + sysManager.LinkVariables(source, destination); + } + { + var source = $"TIRT^Task 1^Inputs^input[{id}]"; + var destination = $"TIID^EtherCAT Master^Box {id + 1} (AUTD)^TxPdo^dummy"; + sysManager.LinkVariables(source, destination); + } + } + } + + [Flags] + public enum CpuAffinity : ulong + { + Cpu1 = 0x0000000000000001, + Cpu2 = 0x0000000000000002, + Cpu3 = 0x0000000000000004, + Cpu4 = 0x0000000000000008, + Cpu5 = 0x0000000000000010, + Cpu6 = 0x0000000000000020, + Cpu7 = 0x0000000000000040, + Cpu8 = 0x0000000000000080, + None = 0x0000000000000000, + MaskSingle = Cpu1, + MaskDual = Cpu1 | Cpu2, + MaskQuad = MaskDual | Cpu3 | Cpu4, + MaskHexa = MaskQuad | Cpu5 | Cpu6, + MaskOct = MaskHexa | Cpu7 | Cpu8, + MaskAll = 0xFFFFFFFFFFFFFFFF + } + + public void AssignCpuCores(ITcSysManager sysManager) + { + var realtimeSettings = sysManager.LookupTreeItem("TIRS"); + var stringWriter = new StringWriter(); + using (var writer = XmlWriter.Create(stringWriter)) + { + writer.WriteStartElement("TreeItem"); + writer.WriteStartElement("RTimeSetDef"); + writer.WriteElementString("MaxCPUs", "1"); + writer.WriteStartElement("CPUs"); + WriteCpuProperties(writer, 0); + writer.WriteEndElement(); // CPUs      + writer.WriteEndElement(); // RTimeSetDef      + writer.WriteEndElement(); // TreeItem + } + var xml = stringWriter.ToString(); + realtimeSettings.ConsumeXml(xml); + } + + private void WriteCpuProperties(XmlWriter writer, int id) + { + writer.WriteStartElement("CPU"); + writer.WriteAttributeString("id", id.ToString()); + writer.WriteElementString("BaseTime", _cpuBaseTime.ToString()); + writer.WriteEndElement(); + } + } + + public class MessageFilter : IOleMessageFilter + { + // + // Class containing the IOleMessageFilter + // thread error-handling functions. + + // Start the filter. + public static void Register() + { + IOleMessageFilter newFilter = new MessageFilter(); + CoRegisterMessageFilter(newFilter, out _); + } + + // Done with the filter, close it. + public static void Revoke() + { + CoRegisterMessageFilter(null, out _); + } + + // + // IOleMessageFilter functions. + // Handle incoming thread requests. + int IOleMessageFilter.HandleInComingCall(int dwCallType, + IntPtr hTaskCaller, int dwTickCount, IntPtr + lpInterfaceInfo) + { + return 0; + } + + // Thread call was rejected, so try again. + int IOleMessageFilter.RetryRejectedCall(IntPtr + hTaskCallee, int dwTickCount, int dwRejectType) + { + return dwRejectType == 2 ? 99 : -1; + } + + int IOleMessageFilter.MessagePending(IntPtr hTaskCallee, + int dwTickCount, int dwPendingType) + { + return 2; + } + + // Implement the IOleMessageFilter interface. + [DllImport("Ole32.dll")] + private static extern int + CoRegisterMessageFilter(IOleMessageFilter newFilter, out + IOleMessageFilter oldFilter); + } + + [ComImport, Guid("00000016-0000-0000-C000-000000000046"), + InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)] + internal interface IOleMessageFilter + { + [PreserveSig] + int HandleInComingCall( + int dwCallType, + IntPtr hTaskCaller, + int dwTickCount, + IntPtr lpInterfaceInfo); + + [PreserveSig] + int RetryRejectedCall( + IntPtr hTaskCallee, + int dwTickCount, + int dwRejectType); + + [PreserveSig] + int MessagePending( + IntPtr hTaskCallee, + int dwTickCount, + int dwPendingType); + } +} diff --git a/TwinCATAUTDServer/TwinCATAUTDServer/SyncMode.cs b/TwinCATAUTDServer/TwinCATAUTDServer/SyncMode.cs new file mode 100644 index 0000000..f6f60ab --- /dev/null +++ b/TwinCATAUTDServer/TwinCATAUTDServer/SyncMode.cs @@ -0,0 +1,21 @@ +/* + * File: SyncMode.cs + * Project: TwinCATAUTDServer + * Created Date: 05/08/2022 + * Author: Shun Suzuki + * ----- + * Last Modified: 26/10/2022 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2022 Shun Suzuki. All rights reserved. + * + */ + +namespace TwinCATAUTDServer +{ + internal enum SyncMode + { + FreeRun, + DC + } +} diff --git a/TwinCATAUTDServer/TwinCATAUTDServer/TwinCATAUTDServer.csproj b/TwinCATAUTDServer/TwinCATAUTDServer/TwinCATAUTDServer.csproj new file mode 100644 index 0000000..a1eba05 --- /dev/null +++ b/TwinCATAUTDServer/TwinCATAUTDServer/TwinCATAUTDServer.csproj @@ -0,0 +1,132 @@ + + + + + Debug + AnyCPU + {99789BFC-DB1F-47E0-AD97-6E348ECC2BA5} + Exe + Properties + TwinCATAUTDServer + TwinCATAUTDServer + v4.8 + 512 + + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 2.4.4 + false + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + MinimumRecommendedRules.ruleset + false + + + + True + + + True + + + True + + + True + + + True + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + ..\packages\System.CommandLine.2.0.0-beta4.22272.1\lib\netstandard2.0\System.CommandLine.dll + + + + ..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.3\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + + + + + + False + True + ..\..\..\..\..\..\..\..\Windows\assembly\GAC_MSIL\TCatSysManagerLib\2.1.0.0__180016cd49e5e8c3\TCatSysManagerLib.dll + + + False + ..\..\..\..\..\..\..\..\TwinCAT\AdsApi\.NET\v4.0.30319\TwinCAT.Ads.dll + + + + + + + + + + + + + + + + False + Microsoft .NET Framework 4.8 %28x86 and x64%29 + true + + + False + .NET Framework 3.5 SP1 + false + + + + + \ No newline at end of file diff --git a/TwinCATAUTDServer/TwinCATAUTDServer/packages.config b/TwinCATAUTDServer/TwinCATAUTDServer/packages.config new file mode 100644 index 0000000..ff0b3a0 --- /dev/null +++ b/TwinCATAUTDServer/TwinCATAUTDServer/packages.config @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/build.py b/build.py new file mode 100644 index 0000000..babcc11 --- /dev/null +++ b/build.py @@ -0,0 +1,375 @@ +#!/usr/bin/env python3 + +""" +File: build.py +Project: autd3 +Created Date: 16/10/2023 +Author: Shun Suzuki +----- +Last Modified: 19/10/2023 +Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) +----- +Copyright (c) 2023 Shun Suzuki. All rights reserved. + +""" + +import argparse +import contextlib +import glob +import os +import platform +import re +import shutil +import subprocess +import sys + +from packaging import version + + +def err(msg: str): + print("\033[91mERR \033[0m: " + msg) + + +def warn(msg: str): + print("\033[93mWARN\033[0m: " + msg) + + +def info(msg: str): + print("\033[92mINFO\033[0m: " + msg) + + +def rm_f(path): + try: + os.remove(path) + except FileNotFoundError: + pass + + +def onexc(func, path, exeption): + import stat + + if not os.access(path, os.W_OK): + os.chmod(path, stat.S_IWUSR) + func(path) + else: + raise + + +def rmtree_f(path): + try: + if version.parse(platform.python_version()) >= version.parse("3.12"): + shutil.rmtree(path, onexc=onexc) + else: + shutil.rmtree(path, onerror=onexc) + except FileNotFoundError: + pass + + +def glob_norm(path, recursive): + return list( + map(lambda p: os.path.normpath(p), glob.glob(path, recursive=recursive)) + ) + + +def rm_glob_f(path, exclude=None, recursive=True): + if exclude is not None: + for f in list( + set(glob_norm(path, recursive=recursive)) + - set(glob_norm(exclude, recursive=recursive)) + ): + rm_f(f) + else: + for f in glob.glob(path, recursive=recursive): + rm_f(f) + + +@contextlib.contextmanager +def working_dir(path): + cwd = os.getcwd() + os.chdir(path) + try: + yield + finally: + os.chdir(cwd) + + +def env_exists(value): + return value in os.environ and os.environ[value] != "" + + +class Config: + _platform: str + shaderc: bool + + def __init__(self, args): + self._platform = platform.system() + + if not self.is_windows() and not self.is_macos() and not self.is_linux(): + err(f'platform "{platform.system()}" is not supported.') + sys.exit(-1) + + if self.is_shaderc_available(): + self.shaderc = True + else: + self.shaderc = False + + def is_windows(self): + return self._platform == "Windows" + + def is_macos(self): + return self._platform == "Darwin" + + def is_linux(self): + return self._platform == "Linux" + + def exe_ext(self): + return ".exe" if self.is_windows() else "" + + def is_shaderc_available(self): + shaderc_lib_name = ( + "shaderc_combined.lib" if self.is_windows() else "libshaderc_combined.a" + ) + if env_exists("SHADERC_LIB_DIR"): + if os.path.isfile(f"{os.environ['SHADERC_LIB_DIR']}/{shaderc_lib_name}"): + return True + if env_exists("VULKAN_SDK"): + if os.path.isfile(f"{os.environ['VULKAN_SDK']}/lib/{shaderc_lib_name}"): + return True + if not self.is_windows(): + if os.path.isfile(f"/usr/local/lib/{shaderc_lib_name}"): + return True + return False + + +def server_build(args): + config = Config(args) + + if not config.shaderc: + err("shaderc is not installed. Cannot build simulator.") + sys.exit(-1) + + with working_dir("."): + if config.is_windows(): + subprocess.run(["npm", "install"], shell=True).check_returncode() + else: + subprocess.run(["npm", "install"]).check_returncode() + + if config.is_macos(): + command_x86 = [ + "cargo", + "build", + "--release", + "--target=x86_64-apple-darwin", + ] + command_aarch64 = [ + "cargo", + "build", + "--release", + "--target=aarch64-apple-darwin", + ] + + with working_dir("simulator"): + subprocess.run(command_x86).check_returncode() + subprocess.run(command_aarch64).check_returncode() + + with working_dir("SOEMAUTDServer"): + subprocess.run(command_x86).check_returncode() + subprocess.run(command_aarch64).check_returncode() + + if not args.external_only: + subprocess.run( + [ + "npm", + "run", + "tauri", + "build", + "--", + "--target", + "universal-apple-darwin", + ] + ).check_returncode() + else: + command = ["cargo", "build", "--release"] + + with working_dir("simulator"): + subprocess.run(command).check_returncode() + + with working_dir("SOEMAUTDServer"): + subprocess.run(command).check_returncode() + + if not args.external_only: + if config.is_windows(): + subprocess.run( + ["npm", "run", "tauri", "build"], shell=True + ).check_returncode() + else: + subprocess.run(["npm", "run", "tauri", "build"]).check_returncode() + + +def server_clear(args): + config = Config(args) + + with working_dir("."): + if config.is_windows(): + subprocess.run( + ["npm", "cache", "clean", "--force"], shell=True + ).check_returncode() + else: + subprocess.run(["npm", "cache", "clean", "--force"]).check_returncode() + rmtree_f("node_modules") + rmtree_f("dist") + + with working_dir("src-tauri"): + rmtree_f("assets") + rm_f("NOTICE") + rm_glob_f("LICENSE*") + rm_glob_f("simulator*") + rm_glob_f("SOEMAUTDServer*") + subprocess.run(["cargo", "clean"]).check_returncode() + + +def util_update_ver(args): + config = Config(args) + version = args.version + + with working_dir("."): + for toml in glob.glob("./**/*/Cargo.toml", recursive=True): + with open(toml, "r") as f: + content = f.read() + content = re.sub( + r'^version = "(.*?)"', + f'version = "{version}"', + content, + flags=re.MULTILINE, + ) + content = re.sub( + r'^autd3(.*)version = "(.*?)"', + f'autd3\\1version = "{version}"', + content, + flags=re.MULTILINE, + ) + with open(toml, "w") as f: + f.write(content) + + for notice in glob.glob("./**/*/ThirdPartyNotice.txt", recursive=True): + with open(notice, "r") as f: + content = f.read() + content = re.sub( + r"^autd3(.*) (.*) \((.*)\)", + f"autd3\\1 {version} (MIT)", + content, + flags=re.MULTILINE, + ) + content = re.sub( + r"^autd3-link-soem (.*)", + f"autd3-link-soem {version}", + content, + flags=re.MULTILINE, + ) + content = re.sub( + r"^autd3-link-twincat (.*)", + f"autd3-link-twincat {version}", + content, + flags=re.MULTILINE, + ) + content = re.sub( + r"^SOEMAUTDServer (.*) \(MIT\)", + f"SOEMAUTDServer {version} (MIT)", + content, + flags=re.MULTILINE, + ) + content = re.sub( + r"^simulator (.*) \(MIT\)", + f"simulator {version} (MIT)", + content, + flags=re.MULTILINE, + ) + with open(notice, "w") as f: + f.write(content) + + with open("package.json", "r") as f: + content = f.read() + content = re.sub( + r'"version": "(.*)"', + f'"version": "{version}"', + content, + flags=re.MULTILINE, + ) + with open("package.json", "w") as f: + f.write(content) + + with open("src-tauri/tauri.conf.json", "r") as f: + content = f.read() + content = re.sub( + r'"version": "(.*)"', + f'"version": "{version}"', + content, + flags=re.MULTILINE, + ) + content = re.sub( + r'"title": "AUTD Server v(.*)"', + f'"title": "AUTD Server v{version}"', + content, + flags=re.MULTILINE, + ) + with open("src-tauri/tauri.conf.json", "w") as f: + f.write(content) + + with working_dir("SOEMAUTDServer"): + subprocess.run(["cargo", "update"]).check_returncode() + + with working_dir("simulator"): + subprocess.run(["cargo", "update"]).check_returncode() + + with working_dir("src-tauri"): + subprocess.run(["cargo", "update"]).check_returncode() + + if config.is_windows(): + subprocess.run(["npm", "i"], shell=True).check_returncode() + else: + subprocess.run(["npm", "i"]).check_returncode() + + +def command_help(args): + print(parser.parse_args([args.command, "--help"])) + + +if __name__ == "__main__": + with working_dir(os.path.dirname(os.path.abspath(__file__))): + parser = argparse.ArgumentParser(description="autd3 library build script") + subparsers = parser.add_subparsers() + + # build + parser_server_build = subparsers.add_parser("build", help="see `build -h`") + parser_server_build.add_argument( + "--external-only", + action="store_true", + help="build external dependencies only", + ) + parser_server_build.set_defaults(handler=server_build) + + # server clear + parser_server_clear = subparsers.add_parser("clear", help="see `clear -h`") + parser_server_clear.set_defaults(handler=server_clear) + + # util + parser_util = subparsers.add_parser("util", help="see `util -h`") + subparsers_util = parser_util.add_subparsers() + + # util update version + parser_util_upver = subparsers_util.add_parser( + "upver", help="see `util upver -h`" + ) + parser_util_upver.add_argument("version", help="version") + parser_util_upver.set_defaults(handler=util_update_ver) + + # help + parser_help = subparsers.add_parser("help", help="see `help -h`") + parser_help.add_argument("command", help="command name which help is shown") + parser_help.set_defaults(handler=command_help) + + args = parser.parse_args() + if hasattr(args, "handler"): + args.handler(args) + else: + parser.print_help() diff --git a/index.html b/index.html new file mode 100644 index 0000000..8568adf --- /dev/null +++ b/index.html @@ -0,0 +1,29 @@ + + + + + + + + + + AUTD Server + + + +
+ + + + \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ec4211d --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2470 @@ +{ + "name": "autd3-server", + "version": "19.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "autd3-server", + "version": "19.0.0", + "dependencies": { + "@tauri-apps/api": "^1.4.0", + "svelte-simple-modal": "^1.6.1", + "svelte-tabs": "^1.1.0", + "the-new-css-reset": "^1.9.0" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.4.2", + "@tauri-apps/cli": "^1.4.0", + "@tsconfig/svelte": "^5.0.0", + "svelte": "^4.0.5", + "svelte-check": "^3.4.6", + "svelte-preprocess": "^5.0.0", + "tslib": "^2.6.0", + "typescript": "^5.0.2", + "vite": "^4.4.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", + "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", + "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", + "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-2.4.2.tgz", + "integrity": "sha512-ePfcC48ftMKhkT0OFGdOyycYKnnkT6i/buzey+vHRTR/JpQvuPzzhf1PtKqCDQfJRgoPSN2vscXs6gLigx/zGw==", + "dev": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^1.0.3", + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.0", + "svelte-hmr": "^0.15.2", + "vitefu": "^0.2.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.54.0 || ^4.0.0", + "vite": "^4.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-1.0.3.tgz", + "integrity": "sha512-Khdl5jmmPN6SUsVuqSXatKpQTMIifoQPDanaxC84m9JxIibWvSABJyHpyys0Z+1yYrxY5TTEQm+6elh0XCMaOA==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": "^14.18.0 || >= 16" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.2.0", + "svelte": "^3.54.0 || ^4.0.0", + "vite": "^4.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte/node_modules/magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@tauri-apps/api": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.4.0.tgz", + "integrity": "sha512-Jd6HPoTM1PZSFIzq7FB8VmMu3qSSyo/3lSwLpoapW+lQ41CL5Dow2KryLg+gyazA/58DRWI9vu/XpEeHK4uMdw==", + "engines": { + "node": ">= 14.6.0", + "npm": ">= 6.6.0", + "yarn": ">= 1.19.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-1.4.0.tgz", + "integrity": "sha512-VXYr2i2iVFl98etQSQsqLzXgX96bnWiNZd1YADgatqwy/qecbd6Kl5ZAPB5R4ynsgE8A1gU7Fbzh7dCEQYFfmA==", + "dev": true, + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "1.4.0", + "@tauri-apps/cli-darwin-x64": "1.4.0", + "@tauri-apps/cli-linux-arm-gnueabihf": "1.4.0", + "@tauri-apps/cli-linux-arm64-gnu": "1.4.0", + "@tauri-apps/cli-linux-arm64-musl": "1.4.0", + "@tauri-apps/cli-linux-x64-gnu": "1.4.0", + "@tauri-apps/cli-linux-x64-musl": "1.4.0", + "@tauri-apps/cli-win32-arm64-msvc": "1.4.0", + "@tauri-apps/cli-win32-ia32-msvc": "1.4.0", + "@tauri-apps/cli-win32-x64-msvc": "1.4.0" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-1.4.0.tgz", + "integrity": "sha512-nA/ml0SfUt6/CYLVbHmT500Y+ijqsuv5+s9EBnVXYSLVg9kbPUZJJHluEYK+xKuOj6xzyuT/+rZFMRapmJD3jQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-1.4.0.tgz", + "integrity": "sha512-ov/F6Zr+dg9B0PtRu65stFo2G0ow2TUlneqYYrkj+vA3n+moWDHfVty0raDjMLQbQt3rv3uayFMXGPMgble9OA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-1.4.0.tgz", + "integrity": "sha512-zwjbiMncycXDV7doovymyKD7sCg53ouAmfgpUqEBOTY3vgBi9TwijyPhJOqoG5vUVWhouNBC08akGmE4dja15g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-1.4.0.tgz", + "integrity": "sha512-5MCBcziqXC72mMXnkZU68mutXIR6zavDxopArE2gQtK841IlE06bIgtLi0kUUhlFJk2nhPRgiDgdLbrPlyt7fw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.4.0.tgz", + "integrity": "sha512-7J3pRB6n6uNYgIfCeKt2Oz8J7oSaz2s8GGFRRH2HPxuTHrBNCinzVYm68UhVpJrL3bnGkU0ziVZLsW/iaOGfUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-1.4.0.tgz", + "integrity": "sha512-Zh5gfAJxOv5AVWxcwuueaQ2vIAhlg0d6nZui6nMyfIJ8dbf3aZQ5ZzP38sYow5h/fbvgL+3GSQxZRBIa3c2E1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-1.4.0.tgz", + "integrity": "sha512-OLAYoICU3FaYiTdBsI+lQTKnDHeMmFMXIApN0M+xGiOkoIOQcV9CConMPjgmJQ867+NHRNgUGlvBEAh9CiJodQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-1.4.0.tgz", + "integrity": "sha512-gZ05GENFbI6CB5MlOUsLlU0kZ9UtHn9riYtSXKT6MYs8HSPRffPHaHSL0WxsJweWh9nR5Hgh/TUU8uW3sYCzCg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-1.4.0.tgz", + "integrity": "sha512-JsetT/lTx/Zq98eo8T5CiRyF1nKeX04RO8JlJrI3ZOYsZpp/A5RJvMd/szQ17iOzwiHdge+tx7k2jHysR6oBlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-1.4.0.tgz", + "integrity": "sha512-z8Olcnwp5aYhzqUAarFjqF+oELCjuYWnB2HAJHlfsYNfDCAORY5kct3Fklz8PSsubC3U2EugWn8n42DwnThurg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tsconfig/svelte": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.0.tgz", + "integrity": "sha512-iu5BqFjU0+OcLTNQp7fHe6Bf6zdNeJ9IZjLZMqWLuGzVFm/xx+lm//Tf6koPyRmxo55/Snm6RRQ990n89cRKFw==", + "dev": true + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "node_modules/@types/pug": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.6.tgz", + "integrity": "sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "optional": true, + "peer": true, + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001512", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001512.tgz", + "integrity": "sha512-2S9nK0G/mE+jasCUsMPlARhRCts1ebcp2Ji8Y8PWi4NDE1iRdLCnEPHkEfeBrGC45L4isBx5ur3IQ6yTE2mRZw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "optional": true, + "peer": true + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/code-red": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.3.tgz", + "integrity": "sha512-kVwJELqiILQyG5aeuyKFbdsI1fmQy1Cmf7dQ8eGmVuJoaRVdwey7WaMknr2ZFeVSYSKT0rExsa8EGw0aoI/1QQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.14", + "@types/estree": "^1.0.0", + "acorn": "^8.8.2", + "estree-walker": "^3.0.3", + "periscopic": "^3.1.0" + } + }, + "node_modules/code-red/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.449", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.449.tgz", + "integrity": "sha512-TxLRpRUj/107ATefeP8VIUWNOv90xJxZZbCW/eIbSZQiuiFANCx2b7u+GbVc9X4gU+xnbvypNMYVM/WArE1DNQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.0.tgz", + "integrity": "sha512-s6ceX0NFiU/vKPiKvFdR83U1Zffu7upwZsGwpoqfg5rbbq1l50WQ5hCeIvM6E6oD4shUHCYMsiFPns4Jk0YfMQ==" + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.1.tgz", + "integrity": "sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", + "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.4.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.27.tgz", + "integrity": "sha512-gY/ACJtJPSmUFPDCHtX78+01fHa64FaU4zaaWfuh1MhGJISufJAH4cun6k/8fwsHYeK4UQmENQK+tRLCFJE8JQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rollup": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.0.tgz", + "integrity": "sha512-YzJH0eunH2hr3knvF3i6IkLO/jTjAEwU4HoMUbQl4//Tnl3ou0e7P5SjxdDr8HQJdeUJShlbEHXrrnEHy1l7Yg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/sorcery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", + "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.14", + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0" + }, + "bin": { + "sorcery": "bin/sorcery" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svelte": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.1.1.tgz", + "integrity": "sha512-Enick5fPFISLoVy0MFK45cG+YlQt6upw8skEK9zzTpJnH1DqEv8xOZwizCGSo3Q6HZ7KrZTM0J18poF7aQg5zw==", + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@jridgewell/trace-mapping": "^0.3.18", + "acorn": "^8.9.0", + "aria-query": "^5.3.0", + "axobject-query": "^3.2.1", + "code-red": "^1.0.3", + "css-tree": "^2.3.1", + "estree-walker": "^3.0.3", + "is-reference": "^3.0.1", + "locate-character": "^3.0.0", + "magic-string": "^0.30.0", + "periscopic": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/svelte-check": { + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.4.6.tgz", + "integrity": "sha512-OBlY8866Zh1zHQTkBMPS6psPi7o2umTUyj6JWm4SacnIHXpWFm658pG32m3dKvKFL49V4ntAkfFHKo4ztH07og==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^5.0.4", + "typescript": "^5.0.3" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "peerDependencies": { + "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0" + } + }, + "node_modules/svelte-hmr": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.2.tgz", + "integrity": "sha512-q/bAruCvFLwvNbeE1x3n37TYFb3mTBJ6TrCq6p2CoFbSTNhDE9oAtEfpy+wmc9So8AG0Tja+X0/mJzX9tSfvIg==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.19.0 || ^4.0.0-next.0" + } + }, + "node_modules/svelte-preprocess": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz", + "integrity": "sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.6", + "detect-indent": "^6.1.0", + "magic-string": "^0.27.0", + "sorcery": "^0.11.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 14.10.0" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0", + "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/svelte-simple-modal": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/svelte-simple-modal/-/svelte-simple-modal-1.6.1.tgz", + "integrity": "sha512-D4/Z7LQ6ThawYb7FlAeS/qGbcwVlqzRHn1zZgWPlEK0cp4l2UMcscqel58mp+gTuk4UX9gl516GYXcHFvuyslA==", + "peerDependencies": { + "svelte": "^3.30.0 || ^4.0.0" + } + }, + "node_modules/svelte-tabs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/svelte-tabs/-/svelte-tabs-1.1.0.tgz", + "integrity": "sha512-bCynxgET2uvqpB6xf/dVyqHjzmumRURQyh2QqXlrki8NxzO7h2WghF8qgpb5qeB5NTX1bMU+9Q5Hf5ey2WLaMg==" + }, + "node_modules/svelte/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/svelte/node_modules/magic-string": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/the-new-css-reset": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/the-new-css-reset/-/the-new-css-reset-1.9.0.tgz", + "integrity": "sha512-bKM9xgiVFTqSuWle952Xu/YWE7qYMzPHWxerO0edxjBfPIm2T4k2tRpIJ45IU7knY35Jr6Fb5P/TVm2RIsB//Q==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true + }, + "node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "optional": true, + "peer": true, + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.6.tgz", + "integrity": "sha512-EY6Mm8vJ++S3D4tNAckaZfw3JwG3wa794Vt70M6cNJ6NxT87yhq7EC8Rcap3ahyHdo8AhCmV9PTk+vG1HiYn1A==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.26", + "rollup": "^3.25.2" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.3" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.16.tgz", + "integrity": "sha512-gCHjjQmA8L0soklKbLKA6pgsLk1byULuHe94lkZDzcO3/Ta+bbeewJioEn1Fr7kgy9NWNFy/C+MrBwC6I/WCug==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.16.tgz", + "integrity": "sha512-wsCqSPqLz+6Ov+OM4EthU43DyYVVyfn15S4j1bJzylDpc1r1jZFFfJQNfDuT8SlgwuqpmpJXK4uPlHGw6ve7eA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.16.tgz", + "integrity": "sha512-ldsTXolyA3eTQ1//4DS+E15xl0H/3DTRJaRL0/0PgkqDsI0fV/FlOtD+h0u/AUJr+eOTlZv4aC9gvfppo3C4sw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.16.tgz", + "integrity": "sha512-aBxruWCII+OtluORR/KvisEw0ALuw/qDQWvkoosA+c/ngC/Kwk0lLaZ+B++LLS481/VdydB2u6tYpWxUfnLAIw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.16.tgz", + "integrity": "sha512-6w4Dbue280+rp3LnkgmriS1icOUZDyPuZo/9VsuMUTns7SYEiOaJ7Ca1cbhu9KVObAWfmdjUl4gwy9TIgiO5eA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.16.tgz", + "integrity": "sha512-x35fCebhe9s979DGKbVAwXUOcTmCIE32AIqB9CB1GralMIvxdnMLAw5CnID17ipEw9/3MvDsusj/cspYt2ZLNQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.16.tgz", + "integrity": "sha512-YM98f+PeNXF3GbxIJlUsj+McUWG1irguBHkszCIwfr3BXtXZsXo0vqybjUDFfu9a8Wr7uUD/YSmHib+EeGAFlg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.16.tgz", + "integrity": "sha512-b5ABb+5Ha2C9JkeZXV+b+OruR1tJ33ePmv9ZwMeETSEKlmu/WJ45XTTG+l6a2KDsQtJJ66qo/hbSGBtk0XVLHw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.16.tgz", + "integrity": "sha512-XIqhNUxJiuy+zsR77+H5Z2f7s4YRlriSJKtvx99nJuG5ATuJPjmZ9n0ANgnGlPCpXGSReFpgcJ7O3SMtzIFeiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.16.tgz", + "integrity": "sha512-no+pfEpwnRvIyH+txbBAWtjxPU9grslmTBfsmDndj7bnBmr55rOo/PfQmRfz7Qg9isswt1FP5hBbWb23fRWnow==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.16.tgz", + "integrity": "sha512-Zbnczs9ZXjmo0oZSS0zbNlJbcwKXa/fcNhYQjahDs4Xg18UumpXG/lwM2lcSvHS3mTrRyCYZvJbmzYc4laRI1g==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.16.tgz", + "integrity": "sha512-YMF7hih1HVR/hQVa/ot4UVffc5ZlrzEb3k2ip0nZr1w6fnYypll9td2qcoMLvd3o8j3y6EbJM3MyIcXIVzXvQQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.16.tgz", + "integrity": "sha512-Wkz++LZ29lDwUyTSEnzDaaP5OveOgTU69q9IyIw9WqLRxM4BjTBjz9un4G6TOvehWpf/J3gYVFN96TjGHrbcNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.16.tgz", + "integrity": "sha512-LFMKZ30tk78/mUv1ygvIP+568bwf4oN6reG/uczXnz6SvFn4e2QUFpUpZY9iSJT6Qpgstrhef/nMykIXZtZWGQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.16.tgz", + "integrity": "sha512-3ZC0BgyYHYKfZo3AV2/66TD/I9tlSBaW7eWTEIkrQQKfJIifKMMttXl9FrAg+UT0SGYsCRLI35Gwdmm96vlOjg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.16.tgz", + "integrity": "sha512-xu86B3647DihHJHv/wx3NCz2Dg1gjQ8bbf9cVYZzWKY+gsvxYmn/lnVlqDRazObc3UMwoHpUhNYaZset4X8IPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.16.tgz", + "integrity": "sha512-uVAgpimx9Ffw3xowtg/7qQPwHFx94yCje+DoBx+LNm2ePDpQXHrzE+Sb0Si2VBObYz+LcRps15cq+95YM7gkUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.16.tgz", + "integrity": "sha512-6OjCQM9wf7z8/MBi6BOWaTL2AS/SZudsZtBziXMtNI8r/U41AxS9x7jn0ATOwVy08OotwkPqGRMkpPR2wcTJXA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.16.tgz", + "integrity": "sha512-ZoNkruFYJp9d1LbUYCh8awgQDvB9uOMZqlQ+gGEZR7v6C+N6u7vPr86c+Chih8niBR81Q/bHOSKGBK3brJyvkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.16.tgz", + "integrity": "sha512-+j4anzQ9hrs+iqO+/wa8UE6TVkKua1pXUb0XWFOx0FiAj6R9INJ+WE//1/Xo6FG1vB5EpH3ko+XcgwiDXTxcdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.16.tgz", + "integrity": "sha512-5PFPmq3sSKTp9cT9dzvI67WNfRZGvEVctcZa1KGjDDu4n3H8k59Inbk0du1fz0KrAbKKNpJbdFXQMDUz7BG4rQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.16.tgz", + "integrity": "sha512-sCIVrrtcWN5Ua7jYXNG1xD199IalrbfV2+0k/2Zf2OyV2FtnQnMgdzgpRAbi4AWlKJj1jkX+M+fEGPQj6BQB4w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.18.16", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.16.tgz", + "integrity": "sha512-1xLsOXrDqwdHxyXb/x/SOyg59jpf/SH7YMvU5RNSU7z3TInaASNJWNFJ6iRvLvLETZMasF3d1DdZLg7sgRimRQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.16", + "@esbuild/android-arm64": "0.18.16", + "@esbuild/android-x64": "0.18.16", + "@esbuild/darwin-arm64": "0.18.16", + "@esbuild/darwin-x64": "0.18.16", + "@esbuild/freebsd-arm64": "0.18.16", + "@esbuild/freebsd-x64": "0.18.16", + "@esbuild/linux-arm": "0.18.16", + "@esbuild/linux-arm64": "0.18.16", + "@esbuild/linux-ia32": "0.18.16", + "@esbuild/linux-loong64": "0.18.16", + "@esbuild/linux-mips64el": "0.18.16", + "@esbuild/linux-ppc64": "0.18.16", + "@esbuild/linux-riscv64": "0.18.16", + "@esbuild/linux-s390x": "0.18.16", + "@esbuild/linux-x64": "0.18.16", + "@esbuild/netbsd-x64": "0.18.16", + "@esbuild/openbsd-x64": "0.18.16", + "@esbuild/sunos-x64": "0.18.16", + "@esbuild/win32-arm64": "0.18.16", + "@esbuild/win32-ia32": "0.18.16", + "@esbuild/win32-x64": "0.18.16" + } + }, + "node_modules/vitefu": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", + "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==", + "dev": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "optional": true, + "peer": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..2b91748 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "autd3-server", + "type": "module", + "version": "19.0.0", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-check --tsconfig ./tsconfig.json", + "tauri": "tauri" + }, + "dependencies": { + "@tauri-apps/api": "^1.4.0", + "svelte-simple-modal": "^1.6.1", + "svelte-tabs": "^1.1.0", + "the-new-css-reset": "^1.9.0" + }, + "devDependencies": { + "@sveltejs/vite-plugin-svelte": "^2.4.2", + "@tsconfig/svelte": "^5.0.0", + "svelte": "^4.0.5", + "svelte-check": "^3.4.6", + "svelte-preprocess": "^5.0.0", + "tslib": "^2.6.0", + "typescript": "^5.0.2", + "vite": "^4.4.4", + "@tauri-apps/cli": "^1.4.0" + } +} \ No newline at end of file diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..cf521cf --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/simulator/.cargo/config b/simulator/.cargo/config new file mode 100644 index 0000000..482dbcf --- /dev/null +++ b/simulator/.cargo/config @@ -0,0 +1,2 @@ +[build] +target-dir = "./../src-tauri/target" diff --git a/simulator/.gitignore b/simulator/.gitignore new file mode 100644 index 0000000..f1cf283 --- /dev/null +++ b/simulator/.gitignore @@ -0,0 +1,3 @@ +target/ +imgui.ini +settings.json diff --git a/simulator/Cargo.lock b/simulator/Cargo.lock new file mode 100644 index 0000000..b5c9078 --- /dev/null +++ b/simulator/Cargo.lock @@ -0,0 +1,3557 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ab_glyph" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80179d7dd5d7e8c285d67c4a1e652972a92de7475beddfb92028c76463b13225" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +dependencies = [ + "cfg-if", + "getrandom", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "android-activity" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64529721f27c2314ced0890ce45e469574a73e5e6fdd6e9da1860eb29285f5e0" +dependencies = [ + "android-properties", + "bitflags 1.3.2", + "cc", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum 0.6.1", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3a318f1f38d2418400f8209655bfd825785afd25aa30bb7ba6cc792e4596748" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + +[[package]] +name = "approx" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f2a05fd1bd10b2527e20a2cd32d8873d115b8b39fe219ee25f42a8aca6ba278" +dependencies = [ + "num-traits", +] + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ash" +version = "0.37.3+1.3.251" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" +dependencies = [ + "libloading 0.7.4", +] + +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "async-trait" +version = "0.1.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + +[[package]] +name = "autd3" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "272e524aaedc294f1af52fe6f0aeff554f963c7d64bd1ef732395df715e5774b" +dependencies = [ + "async-trait", + "autd3-derive", + "autd3-driver", + "autd3-firmware-emulator", + "bitvec", + "num", + "thiserror", +] + +[[package]] +name = "autd3-derive" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18c0c89452c24a7dd3956fc0d8705787dd48f900028918d158e9a82f2eac6d43" +dependencies = [ + "quote", + "syn 2.0.39", +] + +[[package]] +name = "autd3-driver" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f39dbff9102a322bfb0f9e98beadfc88c7c4f385a5e5e8b71fc5267ab797aeaf" +dependencies = [ + "async-trait", + "bitflags 2.4.1", + "bitvec", + "libc", + "nalgebra", + "thiserror", + "windows", +] + +[[package]] +name = "autd3-firmware-emulator" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f53b4fbd1067d64f7d8a4c313173244521a48442c727186251d3efd056c8f0e" +dependencies = [ + "autd3-driver", + "num-integer", + "thiserror", +] + +[[package]] +name = "autd3-protobuf" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f01699db78da78e10303600b9fb3d739da13e5cb9d9dd9627762b15810a88cf6" +dependencies = [ + "autd3-driver", + "h2 0.4.0", + "prost", + "thiserror", + "tonic", + "tonic-build", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http 0.2.11", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http 0.2.11", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block-sys" +version = "0.1.0-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" +dependencies = [ + "objc-sys", +] + +[[package]] +name = "block2" +version = "0.2.0-alpha.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" +dependencies = [ + "block-sys", + "objc2-encode", +] + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "bytemuck" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "calloop" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e0d00eb1ea24371a97d2da6201c6747a633dc6dc1988ef503403b4c59504a8" +dependencies = [ + "bitflags 1.3.2", + "log", + "nix 0.25.1", + "slotmap", + "thiserror", + "vec_map", +] + +[[package]] +name = "camera_controllers" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe8de983c50c02a7bb9d174abcef9920534d5751658c17278988407bb36e9dd0" +dependencies = [ + "bitflags 2.4.1", + "piston3d-cam", + "pistoncore-input", + "quaternion", + "vecmath", +] + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "cgmath" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a98d30140e3296250832bbaaff83b27dcd6fa3cc70fb6f1f3e5c9c0023b5317" +dependencies = [ + "approx 0.4.0", + "num-traits", +] + +[[package]] +name = "chlorine" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75476fe966a8af7c0ceae2a3e514afa87d4451741fcdfab8bfaa07ad301842ec" + +[[package]] +name = "chrono" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets 0.48.5", +] + +[[package]] +name = "clap" +version = "4.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfaff671f6b22ca62406885ece523383b9b64022e341e53e009a62ebc47a45f2" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a216b506622bb1d316cd51328dce24e07bdff4a6128a47c7e7fad11878d5adbb" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "clap_lex" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" + +[[package]] +name = "cmake" +version = "0.1.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31c789563b815f77f4250caee12365734369f942439b7defd71e18a48197130" +dependencies = [ + "cc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "critical-section" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7059fff8937831a9ae6f0fe4d658ffabf58f2ca96aa9dec1c889f936f705f216" + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset 0.9.0", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "csv" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +dependencies = [ + "csv-core", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "csv-core" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +dependencies = [ + "memchr", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.1", +] + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "earcutr" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79127ed59a85d7687c409e9978547cffb7dc79675355ed22da6b66fd5f6ead01" +dependencies = [ + "itertools", + "num-traits", +] + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "exr" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279d3efcc55e19917fff7ab3ddd6c14afb6a90881a0078465196fe2f99d08c56" +dependencies = [ + "bit_field", + "flume", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "fdeflate" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d6dafc854908ff5da46ff3f8f473c6984119a2876a383a860246dd7841a868" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + +[[package]] +name = "float_next_after" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" + +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "pin-project", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures-channel" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" + +[[package]] +name = "futures-macro" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "futures-sink" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" + +[[package]] +name = "futures-task" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" + +[[package]] +name = "futures-util" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +dependencies = [ + "futures-core", + "futures-macro", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "geo" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d07d2288645058f3c78bc64eadd615335791cd5adb632e9865840afbc13dad" +dependencies = [ + "earcutr", + "float_next_after", + "geo-types", + "geographiclib-rs", + "log", + "num-traits", + "robust", + "rstar", +] + +[[package]] +name = "geo-types" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567495020b114f1ce9bed679b29975aa0bfae06ac22beacd5cfde5dabe7b05d6" +dependencies = [ + "approx 0.5.1", + "num-traits", + "rstar", + "serde", +] + +[[package]] +name = "geographiclib-rs" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea804e7bd3c6a4ca6a01edfa35231557a8a81d4d3f3e1e2b650d028c42592be" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gif" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "gltf" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad2dcfb6dd7a66f9eb3d181a29dcfb22d146b0bcdc2e1ed1713cbf03939a88ea" +dependencies = [ + "base64 0.13.1", + "byteorder", + "gltf-json", + "image", + "lazy_static", + "urlencoding", +] + +[[package]] +name = "gltf-derive" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cbcea5dd47e7ad4e9ee6f040384fcd7204bbf671aa4f9e7ca7dfc9bfa1de20" +dependencies = [ + "inflections", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "gltf-json" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5b810806b78dde4b71a95cc0e6fdcab34c4c617da3574df166f9987be97d03" +dependencies = [ + "gltf-derive", + "serde", + "serde_derive", + "serde_json", +] + +[[package]] +name = "h2" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 0.2.11", + "indexmap 2.1.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d308f63daf4181410c242d34c11f928dcb3aa105852019e043c9d1f4e4368a" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http 1.0.0", + "indexmap 2.1.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +dependencies = [ + "bytemuck", + "cfg-if", + "crunchy", +] + +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "spin", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" + +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys 0.48.0", +] + +[[package]] +name = "http" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http 0.2.11", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.3.22", + "http 0.2.11", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2 0.4.10", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.51.1", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "image" +version = "0.24.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "jpeg-decoder", + "num-rational", + "num-traits", + "png", + "qoi", + "tiff", +] + +[[package]] +name = "imgui" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "122d677d0efcd64ca15f12907beaf46b26bbd2cdc855ee5b227f29cf50f75bb5" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "imgui-sys", + "mint", + "parking_lot", +] + +[[package]] +name = "imgui-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d785272a57cb8058a53a1e6f376f48e2ec4f40fbc6a9bb197dabf7b6b59c03bf" +dependencies = [ + "cc", + "cfg-if", + "chlorine", + "mint", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + +[[package]] +name = "inflections" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a257582fdcde896fd96463bf2d40eefea0580021c0712a0e2b028b60b47a837a" + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +dependencies = [ + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" +dependencies = [ + "rayon", +] + +[[package]] +name = "js-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + +[[package]] +name = "libc" +version = "0.2.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libloading" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall 0.4.1", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "matrixmultiply" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "mint" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" + +[[package]] +name = "mio" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "nalgebra" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "307ed9b18cc2423f29e83f84fd23a8e73628727990181f18641a8b5dc2ab1caa" +dependencies = [ + "approx 0.5.1", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom", +] + +[[package]] +name = "ndk" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "451422b7e4718271c8b5b3aadf5adedba43dc76312454b387e98fae0fc951aa0" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum 0.5.11", + "raw-window-handle", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.4.1+23.1.7779620" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cf2aae958bd232cac5069850591667ad422d263686d75b52a065f9badeee5a3" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nix" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nix" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.6.5", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive 0.5.11", +] + +[[package]] +name = "num_enum" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num_enum_derive" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "objc-sys" +version = "0.2.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" + +[[package]] +name = "objc2" +version = "0.3.0-beta.3.patch-leaks.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" +dependencies = [ + "block2", + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-encode" +version = "2.0.0-pre.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" +dependencies = [ + "objc-sys", +] + +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "orbclient" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +dependencies = [ + "libredox", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "owned_ttf_parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +dependencies = [ + "fixedbitset", + "indexmap 2.1.0", +] + +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piston-float" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad78bf43dcf80e8f950c92b84f938a0fc7590b7f6866fbcbeca781609c115590" + +[[package]] +name = "piston-viewport" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ecaf8ae0d71dd9cdbbd8662b47659621c09430ff3cb880d154858d3b8ac001" +dependencies = [ + "piston-float", +] + +[[package]] +name = "piston3d-cam" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94bbbab0d808e9523b9e5b147265eaac64a4bc5a3e5ff0e0ec55630802bb4e29" +dependencies = [ + "quaternion", + "vecmath", +] + +[[package]] +name = "pistoncore-input" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2977fed6eb16c554fd445a09a50c8a0c250f4c50f752be46a7bd9dcc5ba471f0" +dependencies = [ + "bitflags 1.3.2", + "piston-viewport", + "serde", + "serde_derive", +] + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "png" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "prettyplease" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" +dependencies = [ + "proc-macro2", + "syn 2.0.39", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" +dependencies = [ + "bytes", + "heck", + "itertools", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.39", + "tempfile", + "which", +] + +[[package]] +name = "prost-derive" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "prost-types" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" +dependencies = [ + "prost", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quaternion" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f228fdb4cf3d4f76c98dc318b73f23df2bd7cbed8319e9ee28696aaf4737c0b3" +dependencies = [ + "vecmath", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "rayon" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "robust" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5864e7ef1a6b7bcf1d6ca3f655e65e724ed3b52546a0d0a663c991522f552ea" + +[[package]] +name = "roxmltree" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "rstar" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f39465655a1e3d8ae79c6d9e007f4953bfc5d55297602df9dc38f9ae9f1359a" +dependencies = [ + "heapless", + "num-traits", + "smallvec", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "safe_arch" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "scarlet" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13cb09bc048d6e1730ebf974d25db5f3dc7daa120bfe76138e06d93ca98831c0" +dependencies = [ + "csv", + "float-cmp", + "geo", + "lazy_static", + "maplit", + "nalgebra", + "num", + "regex", + "serde", + "serde_derive", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sctk-adwaita" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda4e97be1fd174ccc2aae81c8b694e803fa99b34e8fd0f057a9d70698e3ed09" +dependencies = [ + "ab_glyph", + "log", + "memmap2", + "smithay-client-toolkit", + "tiny-skia", +] + +[[package]] +name = "semver" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "shaderc" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27e07913ada18607bb60d12431cbe3358d3bbebbe95948e1618851dc01e63b7b" +dependencies = [ + "libc", + "shaderc-sys", +] + +[[package]] +name = "shaderc-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73120d240fe22196300f39ca8547ca2d014960f27b19b47b21288b396272f7f7" +dependencies = [ + "cmake", + "libc", + "roxmltree", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "simba" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" +dependencies = [ + "approx 0.5.1", + "num-complex", + "num-traits", + "paste", + "wide", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simulator" +version = "19.0.0" +dependencies = [ + "anyhow", + "autd3", + "autd3-driver", + "autd3-firmware-emulator", + "autd3-protobuf", + "bitflags 2.4.1", + "bytemuck", + "camera_controllers", + "cgmath", + "chrono", + "clap", + "crossbeam-channel", + "futures-util", + "gltf", + "image", + "imgui", + "png", + "scarlet", + "serde", + "serde_json", + "tokio", + "tonic", + "tracing", + "tracing-core", + "tracing-subscriber", + "vulkano", + "vulkano-shaders", + "winit", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + +[[package]] +name = "smithay-client-toolkit" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" +dependencies = [ + "bitflags 1.3.2", + "calloop", + "dlib", + "lazy_static", + "log", + "memmap2", + "nix 0.24.3", + "pkg-config", + "wayland-client", + "wayland-cursor", + "wayland-protocols", +] + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall 0.4.1", + "rustix", + "windows-sys 0.48.0", +] + +[[package]] +name = "thiserror" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tiff" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] +name = "tiny-skia" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8493a203431061e901613751931f047d1971337153f96d0e5e363d6dbf6a67" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "png", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adbfb5d3f3dd57a0e11d12f4f13d4ebbbc1b5c15b7ab0a156d030b21da5f677c" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tokio" +version = "1.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "socket2 0.5.5", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.1.0", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tonic" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d560933a0de61cf715926b9cac824d4c883c2c43142f787595e48280c40a1d0e" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.21.5", + "bytes", + "h2 0.3.22", + "http 0.2.11", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-build" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d021fc044c18582b9a2408cd0dd05b1596e3ecdb5c4df822bb0183545683889" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "vecmath" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "956ae1e0d85bca567dee1dcf87fb1ca2e792792f66f87dced8381f99cd91156a" +dependencies = [ + "piston-float", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vk-parse" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81086c28be67a8759cd80cbb3c8f7b520e0874605fc5eb74d5a1c9c2d1878e79" +dependencies = [ + "xml-rs", +] + +[[package]] +name = "vulkano" +version = "0.34.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70f4278f76307b3c388679234b397b4f90de29cdba53873c26b624ed82653d75" +dependencies = [ + "ahash", + "ash", + "bytemuck", + "core-graphics-types", + "crossbeam-queue", + "half", + "heck", + "indexmap 2.1.0", + "libloading 0.8.1", + "objc", + "once_cell", + "parking_lot", + "proc-macro2", + "quote", + "raw-window-handle", + "regex", + "serde", + "serde_json", + "smallvec", + "thread_local", + "vk-parse", + "vulkano-macros", +] + +[[package]] +name = "vulkano-macros" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52be622d364272fd77e298e7f68e8547ae66e7687cb86eb85335412cee7e3965" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "vulkano-shaders" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1f63401297565d74afb96e9add12587d8e46235140cee325a8eb6ba4602f4ee" +dependencies = [ + "ahash", + "heck", + "proc-macro2", + "quote", + "shaderc", + "syn 2.0.39", + "vulkano", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.39", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" + +[[package]] +name = "wayland-client" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" +dependencies = [ + "bitflags 1.3.2", + "downcast-rs", + "libc", + "nix 0.24.3", + "scoped-tls", + "wayland-commons", + "wayland-scanner", + "wayland-sys", +] + +[[package]] +name = "wayland-commons" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" +dependencies = [ + "nix 0.24.3", + "once_cell", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-cursor" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" +dependencies = [ + "nix 0.24.3", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" +dependencies = [ + "bitflags 1.3.2", + "wayland-client", + "wayland-commons", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +dependencies = [ + "proc-macro2", + "quote", + "xml-rs", +] + +[[package]] +name = "wayland-sys" +version = "0.29.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" +dependencies = [ + "dlib", + "lazy_static", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "weezl" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + +[[package]] +name = "wide" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "winit" +version = "0.28.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9596d90b45384f5281384ab204224876e8e8bf7d58366d9b795ad99aa9894b94" +dependencies = [ + "android-activity", + "bitflags 1.3.2", + "cfg_aliases", + "core-foundation", + "core-graphics", + "dispatch", + "instant", + "libc", + "log", + "mio", + "ndk", + "objc2", + "once_cell", + "orbclient", + "percent-encoding", + "raw-window-handle", + "redox_syscall 0.3.5", + "sctk-adwaita", + "smithay-client-toolkit", + "wasm-bindgen", + "wayland-client", + "wayland-commons", + "wayland-protocols", + "wayland-scanner", + "web-sys", + "windows-sys 0.45.0", + "x11-dl", +] + +[[package]] +name = "winnow" +version = "0.5.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff" +dependencies = [ + "memchr", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "xcursor" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" +dependencies = [ + "nom", +] + +[[package]] +name = "xml-rs" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" + +[[package]] +name = "xmlparser" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" + +[[package]] +name = "zerocopy" +version = "0.7.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d075cf85bbb114e933343e087b92f2146bac0d55b534cbb8188becf0039948e" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86cd5ca076997b97ef09d3ad65efe811fa68c9e874cb636ccb211223a813b0c2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] diff --git a/simulator/Cargo.toml b/simulator/Cargo.toml new file mode 100644 index 0000000..2df4a29 --- /dev/null +++ b/simulator/Cargo.toml @@ -0,0 +1,46 @@ +[package] +name = "simulator" +version = "19.0.0" +edition = "2021" +authors = ["shun suzuki "] + +license = "MIT" +description = "AUTD Simulator" +repository = "https://github.com/shinolab/autd3" +keywords = ["autd"] + +[dependencies] +autd3 = { version = "19.0.0" } +autd3-driver = { version = "19.0.0" } +autd3-firmware-emulator = { version = "19.0.0" } +autd3-protobuf = { version = "19.0.0" } +bitflags = "2.3.1" +bytemuck = { version = "1.13.1", features = ["derive", "extern_crate_std", "min_const_generics"] } +camera_controllers = "0.34.0" +cgmath = "0.18.0" +clap = { version = "4.3.0", features = ["derive"] } +png = "0.17.8" +imgui = "0.11.0" +scarlet = "1.2.0" +serde = { version = "1.0.174", features = ["derive"] } +serde_json = "1.0.96" +vulkano = "0.34.1" +vulkano-shaders = "0.34.0" +winit = "0.28.6" +crossbeam-channel = "0.5.8" +image = "0.24.6" +tokio = { version = "1.34.0", features = ["rt-multi-thread"] } +futures-util = "0.3.28" +tonic = "0.10.0" +anyhow = "1.0.72" +chrono = "0.4.31" +gltf = "1.1.0" +tracing-subscriber = "0.3.17" +tracing = "0.1.37" +tracing-core = "0.1.31" + +[features] +default = [] +use_meter = ["autd3/use_meter"] +left_handed = [] +enable_debug = [] diff --git a/simulator/README.md b/simulator/README.md new file mode 100644 index 0000000..82832ee --- /dev/null +++ b/simulator/README.md @@ -0,0 +1,14 @@ +# AUTD Simulator + +# Dependencies + +This library depends on [tonic](https://github.com/hyperium/tonic). +To build this library, see the above link and follow the instructions. + +# LICENSE + +* See [LICENSE](../LICENSE) and [ThirdPartyNotice](./ThirdPartyNotice.txt) for more information. + +# Author + +Shun Suzuki, 2023 diff --git a/simulator/ThirdPartyNotice.txt b/simulator/ThirdPartyNotice.txt new file mode 100644 index 0000000..1153224 --- /dev/null +++ b/simulator/ThirdPartyNotice.txt @@ -0,0 +1,2031 @@ +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION + +This software includes the following third-party components. +The license terms for each of these components are provided later in this notice. + + +--------------------------------------------------------- + +ab_glyph 0.2.23 (Apache-2.0) +https://github.com/alexheretic/ab-glyph +--------------------------------------------------------- + +ab_glyph_rasterizer 0.1.8 (Apache-2.0) +https://github.com/alexheretic/ab-glyph +--------------------------------------------------------- + +addr2line 0.21.0 (Apache-2.0 OR MIT) +https://github.com/gimli-rs/addr2line +--------------------------------------------------------- + +adler 1.0.2 (0BSD OR Apache-2.0 OR MIT) +https://github.com/jonas-schievink/adler.git +--------------------------------------------------------- + +ahash 0.8.6 (Apache-2.0 OR MIT) +https://github.com/tkaitchuck/ahash +--------------------------------------------------------- + +aho-corasick 1.1.2 (MIT OR Unlicense) +https://github.com/BurntSushi/aho-corasick +--------------------------------------------------------- + +android-activity 0.4.3 (Apache-2.0 OR MIT) +https://github.com/rust-mobile/android-activity +--------------------------------------------------------- + +android-properties 0.2.2 (MIT) +https://github.com/miklelappo/android-properties +--------------------------------------------------------- + +android-tzdata 0.1.1 (Apache-2.0 OR MIT) +https://github.com/RumovZ/android-tzdata +--------------------------------------------------------- + +android_system_properties 0.1.5 (Apache-2.0 OR MIT) +https://github.com/nical/android_system_properties +--------------------------------------------------------- + +anstream 0.6.4 (Apache-2.0 OR MIT) +https://github.com/rust-cli/anstyle.git +--------------------------------------------------------- + +anstyle 1.0.4 (Apache-2.0 OR MIT) +https://github.com/rust-cli/anstyle.git +--------------------------------------------------------- + +anstyle-parse 0.2.3 (Apache-2.0 OR MIT) +https://github.com/rust-cli/anstyle.git +--------------------------------------------------------- + +anstyle-query 1.0.1 (Apache-2.0 OR MIT) +https://github.com/rust-cli/anstyle +--------------------------------------------------------- + +anstyle-wincon 3.0.2 (Apache-2.0 OR MIT) +https://github.com/rust-cli/anstyle.git +--------------------------------------------------------- + +anyhow 1.0.75 (Apache-2.0 OR MIT) +https://github.com/dtolnay/anyhow +--------------------------------------------------------- + +approx 0.4.0 (Apache-2.0) +https://github.com/brendanzab/approx +--------------------------------------------------------- + +approx 0.5.1 (Apache-2.0) +https://github.com/brendanzab/approx +--------------------------------------------------------- + +arrayref 0.3.7 (BSD-2-Clause) +https://github.com/droundy/arrayref +--------------------------------------------------------- + +arrayvec 0.7.4 (Apache-2.0 OR MIT) +https://github.com/bluss/arrayvec +--------------------------------------------------------- + +ash 0.37.3+1.3.251 (Apache-2.0 OR MIT) +https://github.com/MaikKlein/ash +--------------------------------------------------------- + +async-stream 0.3.5 (MIT) +https://github.com/tokio-rs/async-stream +--------------------------------------------------------- + +async-stream-impl 0.3.5 (MIT) +https://github.com/tokio-rs/async-stream +--------------------------------------------------------- + +async-trait 0.1.74 (Apache-2.0 OR MIT) +https://github.com/dtolnay/async-trait +--------------------------------------------------------- + +atomic-polyfill 1.0.3 (Apache-2.0 OR MIT) +https://github.com/embassy-rs/atomic-polyfill +--------------------------------------------------------- + +autd3 19.0.0 (MIT) +https://github.com/shinolab/autd3 +--------------------------------------------------------- + +autd3-derive 19.0.0 (MIT) +https://github.com/shinolab/autd3 +--------------------------------------------------------- + +autd3-driver 19.0.0 (MIT) +https://github.com/shinolab/autd3 +--------------------------------------------------------- + +autd3-firmware-emulator 19.0.0 (MIT) +https://github.com/shinolab/autd3 +--------------------------------------------------------- + +autd3-protobuf 19.0.0 (MIT) +https://github.com/shinolab/autd3 +--------------------------------------------------------- + +autocfg 1.1.0 (Apache-2.0 OR MIT) +https://github.com/cuviper/autocfg +--------------------------------------------------------- + +axum 0.6.20 (MIT) +https://github.com/tokio-rs/axum +--------------------------------------------------------- + +axum-core 0.3.4 (MIT) +https://github.com/tokio-rs/axum +--------------------------------------------------------- + +backtrace 0.3.69 (Apache-2.0 OR MIT) +https://github.com/rust-lang/backtrace-rs +--------------------------------------------------------- + +base64 0.13.1 (Apache-2.0 OR MIT) +https://github.com/marshallpierce/rust-base64 +--------------------------------------------------------- + +base64 0.21.5 (Apache-2.0 OR MIT) +https://github.com/marshallpierce/rust-base64 +--------------------------------------------------------- + +bit_field 0.10.2 (Apache-2.0 OR MIT) +https://github.com/phil-opp/rust-bit-field +--------------------------------------------------------- + +bitflags 1.3.2 (Apache-2.0 OR MIT) +https://github.com/bitflags/bitflags +--------------------------------------------------------- + +bitflags 2.4.1 (Apache-2.0 OR MIT) +https://github.com/bitflags/bitflags +--------------------------------------------------------- + +bitvec 1.0.1 (MIT) +https://github.com/bitvecto-rs/bitvec +--------------------------------------------------------- + +block-sys 0.1.0-beta.1 (MIT) +https://github.com/madsmtm/objc2 +--------------------------------------------------------- + +block2 0.2.0-alpha.6 (MIT) +https://github.com/madsmtm/objc2 +--------------------------------------------------------- + +bumpalo 3.14.0 (Apache-2.0 OR MIT) +https://github.com/fitzgen/bumpalo +--------------------------------------------------------- + +bytemuck 1.14.0 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Lokathor/bytemuck +--------------------------------------------------------- + +bytemuck_derive 1.5.0 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Lokathor/bytemuck +--------------------------------------------------------- + +byteorder 1.5.0 (MIT OR Unlicense) +https://github.com/BurntSushi/byteorder +--------------------------------------------------------- + +bytes 1.5.0 (MIT) +https://github.com/tokio-rs/bytes +--------------------------------------------------------- + +calloop 0.10.6 (MIT) +https://github.com/Smithay/calloop +--------------------------------------------------------- + +camera_controllers 0.34.0 (MIT) +https://github.com/PistonDevelopers/camera_controllers.git +--------------------------------------------------------- + +cc 1.0.83 (Apache-2.0 OR MIT) +https://github.com/rust-lang/cc-rs +--------------------------------------------------------- + +cfg-if 1.0.0 (Apache-2.0 OR MIT) +https://github.com/alexcrichton/cfg-if +--------------------------------------------------------- + +cfg_aliases 0.1.1 (MIT) +https://github.com/katharostech/cfg_aliases +--------------------------------------------------------- + +cgmath 0.18.0 (Apache-2.0) +https://github.com/rustgd/cgmath +--------------------------------------------------------- + +chlorine 1.0.10 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Lokathor/chlorine +--------------------------------------------------------- + +chrono 0.4.31 (Apache-2.0 OR MIT) +https://github.com/chronotope/chrono +--------------------------------------------------------- + +clap 4.4.11 (Apache-2.0 OR MIT) +https://github.com/clap-rs/clap +--------------------------------------------------------- + +clap_builder 4.4.11 (Apache-2.0 OR MIT) +https://github.com/clap-rs/clap +--------------------------------------------------------- + +clap_derive 4.4.7 (Apache-2.0 OR MIT) +https://github.com/clap-rs/clap/tree/master/clap_derive +--------------------------------------------------------- + +clap_lex 0.6.0 (Apache-2.0 OR MIT) +https://github.com/clap-rs/clap/tree/master/clap_lex +--------------------------------------------------------- + +cmake 0.1.50 (Apache-2.0 OR MIT) +https://github.com/rust-lang/cmake-rs +--------------------------------------------------------- + +color_quant 1.1.0 (MIT) +https://github.com/image-rs/color_quant.git +--------------------------------------------------------- + +colorchoice 1.0.0 (Apache-2.0 OR MIT) +https://github.com/rust-cli/anstyle +--------------------------------------------------------- + +core-foundation 0.9.4 (Apache-2.0 OR MIT) +https://github.com/servo/core-foundation-rs +--------------------------------------------------------- + +core-foundation-sys 0.8.6 (Apache-2.0 OR MIT) +https://github.com/servo/core-foundation-rs +--------------------------------------------------------- + +core-graphics 0.22.3 (Apache-2.0 OR MIT) +https://github.com/servo/core-foundation-rs +--------------------------------------------------------- + +core-graphics-types 0.1.3 (Apache-2.0 OR MIT) +https://github.com/servo/core-foundation-rs +--------------------------------------------------------- + +crc32fast 1.3.2 (Apache-2.0 OR MIT) +https://github.com/srijs/rust-crc32fast +--------------------------------------------------------- + +critical-section 1.1.2 (Apache-2.0 OR MIT) +https://github.com/rust-embedded/critical-section +--------------------------------------------------------- + +crossbeam-channel 0.5.8 (Apache-2.0 OR MIT) +https://github.com/crossbeam-rs/crossbeam +--------------------------------------------------------- + +crossbeam-deque 0.8.3 (Apache-2.0 OR MIT) +https://github.com/crossbeam-rs/crossbeam +--------------------------------------------------------- + +crossbeam-epoch 0.9.15 (Apache-2.0 OR MIT) +https://github.com/crossbeam-rs/crossbeam +--------------------------------------------------------- + +crossbeam-queue 0.3.8 (Apache-2.0 OR MIT) +https://github.com/crossbeam-rs/crossbeam +--------------------------------------------------------- + +crossbeam-utils 0.8.16 (Apache-2.0 OR MIT) +https://github.com/crossbeam-rs/crossbeam +--------------------------------------------------------- + +crunchy 0.2.2 (MIT) +--------------------------------------------------------- + +csv 1.3.0 (MIT OR Unlicense) +https://github.com/BurntSushi/rust-csv +--------------------------------------------------------- + +csv-core 0.1.11 (MIT OR Unlicense) +https://github.com/BurntSushi/rust-csv +--------------------------------------------------------- + +dispatch 0.2.0 (MIT) +http://github.com/SSheldon/rust-dispatch +--------------------------------------------------------- + +dlib 0.5.2 (MIT) +https://github.com/elinorbgr/dlib +--------------------------------------------------------- + +downcast-rs 1.2.0 (Apache-2.0 OR MIT) +https://github.com/marcianx/downcast-rs +--------------------------------------------------------- + +earcutr 0.4.3 (ISC) +https://github.com/frewsxcv/earcutr/ +--------------------------------------------------------- + +either 1.9.0 (Apache-2.0 OR MIT) +https://github.com/bluss/either +--------------------------------------------------------- + +equivalent 1.0.1 (Apache-2.0 OR MIT) +https://github.com/cuviper/equivalent +--------------------------------------------------------- + +errno 0.3.8 (Apache-2.0 OR MIT) +https://github.com/lambda-fairy/rust-errno +--------------------------------------------------------- + +exr 1.6.4 (BSD-3-Clause) +https://github.com/johannesvollmer/exrs +--------------------------------------------------------- + +fastrand 2.0.1 (Apache-2.0 OR MIT) +https://github.com/smol-rs/fastrand +--------------------------------------------------------- + +fdeflate 0.3.1 (Apache-2.0 OR MIT) +https://github.com/image-rs/fdeflate +--------------------------------------------------------- + +fixedbitset 0.4.2 (Apache-2.0 OR MIT) +https://github.com/petgraph/fixedbitset +--------------------------------------------------------- + +flate2 1.0.28 (Apache-2.0 OR MIT) +https://github.com/rust-lang/flate2-rs +--------------------------------------------------------- + +float-cmp 0.9.0 (MIT) +https://github.com/mikedilger/float-cmp +--------------------------------------------------------- + +float_next_after 1.0.0 (MIT) +https://gitlab.com/bronsonbdevost/next_afterf +--------------------------------------------------------- + +flume 0.10.14 (Apache-2.0 OR MIT) +https://github.com/zesterer/flume +--------------------------------------------------------- + +fnv 1.0.7 (Apache-2.0 OR MIT) +https://github.com/servo/rust-fnv +--------------------------------------------------------- + +foreign-types 0.3.2 (Apache-2.0 OR MIT) +https://github.com/sfackler/foreign-types +--------------------------------------------------------- + +foreign-types-shared 0.1.1 (Apache-2.0 OR MIT) +https://github.com/sfackler/foreign-types +--------------------------------------------------------- + +funty 2.0.0 (MIT) +https://github.com/myrrlyn/funty +--------------------------------------------------------- + +futures-channel 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-core 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-macro 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-sink 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-task 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-util 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +geo 0.25.1 (Apache-2.0 OR MIT) +https://github.com/georust/geo +--------------------------------------------------------- + +geo-types 0.7.12 (Apache-2.0 OR MIT) +https://github.com/georust/geo +--------------------------------------------------------- + +geographiclib-rs 0.2.3 (MIT) +https://github.com/georust/geographiclib-rs +--------------------------------------------------------- + +getrandom 0.2.11 (Apache-2.0 OR MIT) +https://github.com/rust-random/getrandom +--------------------------------------------------------- + +gif 0.12.0 (Apache-2.0 OR MIT) +https://github.com/image-rs/image-gif +--------------------------------------------------------- + +gimli 0.28.1 (Apache-2.0 OR MIT) +https://github.com/gimli-rs/gimli +--------------------------------------------------------- + +gltf 1.3.0 (Apache-2.0 OR MIT) +https://github.com/gltf-rs/gltf +--------------------------------------------------------- + +gltf-derive 1.3.0 (Apache-2.0 OR MIT) +https://github.com/gltf-rs/gltf +--------------------------------------------------------- + +gltf-json 1.3.0 (Apache-2.0 OR MIT) +https://github.com/gltf-rs/gltf +--------------------------------------------------------- + +h2 0.3.22 (MIT) +https://github.com/hyperium/h2 +--------------------------------------------------------- + +h2 0.4.0 (MIT) +https://github.com/hyperium/h2 +--------------------------------------------------------- + +half 2.3.1 (Apache-2.0 OR MIT) +https://github.com/starkat99/half-rs +--------------------------------------------------------- + +hash32 0.2.1 (Apache-2.0 OR MIT) +https://github.com/japaric/hash32 +--------------------------------------------------------- + +hashbrown 0.12.3 (Apache-2.0 OR MIT) +https://github.com/rust-lang/hashbrown +--------------------------------------------------------- + +hashbrown 0.14.3 (Apache-2.0 OR MIT) +https://github.com/rust-lang/hashbrown +--------------------------------------------------------- + +heapless 0.7.17 (Apache-2.0 OR MIT) +https://github.com/japaric/heapless +--------------------------------------------------------- + +heck 0.4.1 (Apache-2.0 OR MIT) +https://github.com/withoutboats/heck +--------------------------------------------------------- + +hermit-abi 0.3.3 (Apache-2.0 OR MIT) +https://github.com/hermitcore/hermit-rs +--------------------------------------------------------- + +home 0.5.5 (Apache-2.0 OR MIT) +https://github.com/rust-lang/cargo +--------------------------------------------------------- + +http 0.2.11 (Apache-2.0 OR MIT) +https://github.com/hyperium/http +--------------------------------------------------------- + +http 1.0.0 (Apache-2.0 OR MIT) +https://github.com/hyperium/http +--------------------------------------------------------- + +http-body 0.4.5 (MIT) +https://github.com/hyperium/http-body +--------------------------------------------------------- + +httparse 1.8.0 (Apache-2.0 OR MIT) +https://github.com/seanmonstar/httparse +--------------------------------------------------------- + +httpdate 1.0.3 (Apache-2.0 OR MIT) +https://github.com/pyfisch/httpdate +--------------------------------------------------------- + +hyper 0.14.27 (MIT) +https://github.com/hyperium/hyper +--------------------------------------------------------- + +hyper-timeout 0.4.1 (Apache-2.0 OR MIT) +https://github.com/hjr3/hyper-timeout +--------------------------------------------------------- + +iana-time-zone 0.1.58 (Apache-2.0 OR MIT) +https://github.com/strawlab/iana-time-zone +--------------------------------------------------------- + +iana-time-zone-haiku 0.1.2 (Apache-2.0 OR MIT) +https://github.com/strawlab/iana-time-zone +--------------------------------------------------------- + +image 0.24.7 (MIT) +https://github.com/image-rs/image +--------------------------------------------------------- + +imgui 0.11.0 (Apache-2.0 OR MIT) +https://github.com/imgui-rs/imgui-rs +--------------------------------------------------------- + +imgui-sys 0.11.0 (Apache-2.0 OR MIT) +https://github.com/imgui-rs/imgui-rs +--------------------------------------------------------- + +indexmap 1.9.3 (Apache-2.0 OR MIT) +https://github.com/bluss/indexmap +--------------------------------------------------------- + +indexmap 2.1.0 (Apache-2.0 OR MIT) +https://github.com/bluss/indexmap +--------------------------------------------------------- + +inflections 1.1.1 (MIT) +https://docs.rs/inflections +--------------------------------------------------------- + +instant 0.1.12 (BSD-3-Clause) +https://github.com/sebcrozet/instant +--------------------------------------------------------- + +itertools 0.11.0 (Apache-2.0 OR MIT) +https://github.com/rust-itertools/itertools +--------------------------------------------------------- + +itoa 1.0.9 (Apache-2.0 OR MIT) +https://github.com/dtolnay/itoa +--------------------------------------------------------- + +jni-sys 0.3.0 (Apache-2.0 OR MIT) +https://github.com/sfackler/rust-jni-sys +--------------------------------------------------------- + +jobserver 0.1.27 (Apache-2.0 OR MIT) +https://github.com/alexcrichton/jobserver-rs +--------------------------------------------------------- + +jpeg-decoder 0.3.0 (Apache-2.0 OR MIT) +https://github.com/image-rs/jpeg-decoder +--------------------------------------------------------- + +js-sys 0.3.66 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/js-sys +--------------------------------------------------------- + +lazy_static 1.4.0 (Apache-2.0 OR MIT) +https://github.com/rust-lang-nursery/lazy-static.rs +--------------------------------------------------------- + +lebe 0.5.2 (BSD-3-Clause) +https://github.com/johannesvollmer/lebe +--------------------------------------------------------- + +libc 0.2.150 (Apache-2.0 OR MIT) +https://github.com/rust-lang/libc +--------------------------------------------------------- + +libloading 0.7.4 (ISC) +https://github.com/nagisa/rust_libloading/ +--------------------------------------------------------- + +libloading 0.8.1 (ISC) +https://github.com/nagisa/rust_libloading/ +--------------------------------------------------------- + +libm 0.2.8 (Apache-2.0 OR MIT) +https://github.com/rust-lang/libm +--------------------------------------------------------- + +libredox 0.0.2 (MIT) +https://gitlab.redox-os.org/redox-os/libredox.git +--------------------------------------------------------- + +linux-raw-sys 0.4.12 (Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT) +https://github.com/sunfishcode/linux-raw-sys +--------------------------------------------------------- + +lock_api 0.4.11 (Apache-2.0 OR MIT) +https://github.com/Amanieu/parking_lot +--------------------------------------------------------- + +log 0.4.20 (Apache-2.0 OR MIT) +https://github.com/rust-lang/log +--------------------------------------------------------- + +malloc_buf 0.0.6 (MIT) +https://github.com/SSheldon/malloc_buf +--------------------------------------------------------- + +maplit 1.0.2 (Apache-2.0 OR MIT) +https://github.com/bluss/maplit +--------------------------------------------------------- + +matchit 0.7.3 (MIT AND BSD-3-Clause) +https://github.com/ibraheemdev/matchit +--------------------------------------------------------- + +matrixmultiply 0.3.8 (Apache-2.0 OR MIT) +https://github.com/bluss/matrixmultiply/ +--------------------------------------------------------- + +memchr 2.6.4 (MIT OR Unlicense) +https://github.com/BurntSushi/memchr +--------------------------------------------------------- + +memmap2 0.5.10 (Apache-2.0 OR MIT) +https://github.com/RazrFalcon/memmap2-rs +--------------------------------------------------------- + +memoffset 0.6.5 (MIT) +https://github.com/Gilnaa/memoffset +--------------------------------------------------------- + +memoffset 0.9.0 (MIT) +https://github.com/Gilnaa/memoffset +--------------------------------------------------------- + +mime 0.3.17 (Apache-2.0 OR MIT) +https://github.com/hyperium/mime +--------------------------------------------------------- + +minimal-lexical 0.2.1 (Apache-2.0 OR MIT) +https://github.com/Alexhuszagh/minimal-lexical +--------------------------------------------------------- + +miniz_oxide 0.7.1 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide +--------------------------------------------------------- + +mint 0.5.9 (MIT) +https://github.com/kvark/mint +--------------------------------------------------------- + +mio 0.8.10 (MIT) +https://github.com/tokio-rs/mio +--------------------------------------------------------- + +multimap 0.8.3 (Apache-2.0 OR MIT) +https://github.com/havarnov/multimap +--------------------------------------------------------- + +nalgebra 0.32.3 (BSD-3-Clause) +https://github.com/dimforge/nalgebra +--------------------------------------------------------- + +nalgebra-macros 0.2.1 (Apache-2.0) +https://github.com/dimforge/nalgebra +--------------------------------------------------------- + +nanorand 0.7.0 (Zlib) +https://github.com/Absolucy/nanorand-rs +--------------------------------------------------------- + +ndk 0.7.0 (Apache-2.0 OR MIT) +https://github.com/rust-windowing/android-ndk-rs +--------------------------------------------------------- + +ndk-context 0.1.1 (Apache-2.0 OR MIT) +https://github.com/rust-windowing/android-ndk-rs +--------------------------------------------------------- + +ndk-sys 0.4.1+23.1.7779620 (Apache-2.0 OR MIT) +https://github.com/rust-windowing/android-ndk-rs +--------------------------------------------------------- + +nix 0.24.3 (MIT) +https://github.com/nix-rust/nix +--------------------------------------------------------- + +nix 0.25.1 (MIT) +https://github.com/nix-rust/nix +--------------------------------------------------------- + +nom 7.1.3 (MIT) +https://github.com/Geal/nom +--------------------------------------------------------- + +nu-ansi-term 0.46.0 (MIT) +https://github.com/nushell/nu-ansi-term +--------------------------------------------------------- + +num 0.4.1 (Apache-2.0 OR MIT) +https://github.com/rust-num/num +--------------------------------------------------------- + +num-bigint 0.4.4 (Apache-2.0 OR MIT) +https://github.com/rust-num/num-bigint +--------------------------------------------------------- + +num-complex 0.4.4 (Apache-2.0 OR MIT) +https://github.com/rust-num/num-complex +--------------------------------------------------------- + +num-integer 0.1.45 (Apache-2.0 OR MIT) +https://github.com/rust-num/num-integer +--------------------------------------------------------- + +num-iter 0.1.43 (Apache-2.0 OR MIT) +https://github.com/rust-num/num-iter +--------------------------------------------------------- + +num-rational 0.4.1 (Apache-2.0 OR MIT) +https://github.com/rust-num/num-rational +--------------------------------------------------------- + +num-traits 0.2.17 (Apache-2.0 OR MIT) +https://github.com/rust-num/num-traits +--------------------------------------------------------- + +num_cpus 1.16.0 (Apache-2.0 OR MIT) +https://github.com/seanmonstar/num_cpus +--------------------------------------------------------- + +num_enum 0.5.11 (Apache-2.0 OR BSD-3-Clause OR MIT) +https://github.com/illicitonion/num_enum +--------------------------------------------------------- + +num_enum 0.6.1 (Apache-2.0 OR BSD-3-Clause OR MIT) +https://github.com/illicitonion/num_enum +--------------------------------------------------------- + +num_enum_derive 0.5.11 (Apache-2.0 OR BSD-3-Clause OR MIT) +https://github.com/illicitonion/num_enum +--------------------------------------------------------- + +num_enum_derive 0.6.1 (Apache-2.0 OR BSD-3-Clause OR MIT) +https://github.com/illicitonion/num_enum +--------------------------------------------------------- + +objc 0.2.7 (MIT) +http://github.com/SSheldon/rust-objc +--------------------------------------------------------- + +objc-sys 0.2.0-beta.2 (MIT) +https://github.com/madsmtm/objc2 +--------------------------------------------------------- + +objc2 0.3.0-beta.3.patch-leaks.3 (MIT) +https://github.com/madsmtm/objc2 +--------------------------------------------------------- + +objc2-encode 2.0.0-pre.2 (MIT) +https://github.com/madsmtm/objc2 +--------------------------------------------------------- + +object 0.32.1 (Apache-2.0 OR MIT) +https://github.com/gimli-rs/object +--------------------------------------------------------- + +once_cell 1.19.0 (Apache-2.0 OR MIT) +https://github.com/matklad/once_cell +--------------------------------------------------------- + +orbclient 0.3.47 (MIT) +https://gitlab.redox-os.org/redox-os/orbclient +--------------------------------------------------------- + +overload 0.1.1 (MIT) +https://github.com/danaugrs/overload +--------------------------------------------------------- + +owned_ttf_parser 0.20.0 (Apache-2.0) +https://github.com/alexheretic/owned-ttf-parser +--------------------------------------------------------- + +parking_lot 0.12.1 (Apache-2.0 OR MIT) +https://github.com/Amanieu/parking_lot +--------------------------------------------------------- + +parking_lot_core 0.9.9 (Apache-2.0 OR MIT) +https://github.com/Amanieu/parking_lot +--------------------------------------------------------- + +paste 1.0.14 (Apache-2.0 OR MIT) +https://github.com/dtolnay/paste +--------------------------------------------------------- + +percent-encoding 2.3.1 (Apache-2.0 OR MIT) +https://github.com/servo/rust-url/ +--------------------------------------------------------- + +petgraph 0.6.4 (Apache-2.0 OR MIT) +https://github.com/petgraph/petgraph +--------------------------------------------------------- + +pin-project 1.1.3 (Apache-2.0 OR MIT) +https://github.com/taiki-e/pin-project +--------------------------------------------------------- + +pin-project-internal 1.1.3 (Apache-2.0 OR MIT) +https://github.com/taiki-e/pin-project +--------------------------------------------------------- + +pin-project-lite 0.2.13 (Apache-2.0 OR MIT) +https://github.com/taiki-e/pin-project-lite +--------------------------------------------------------- + +pin-utils 0.1.0 (Apache-2.0 OR MIT) +https://github.com/rust-lang-nursery/pin-utils +--------------------------------------------------------- + +piston-float 1.0.1 (MIT) +https://github.com/pistondevelopers/float.git +--------------------------------------------------------- + +piston-viewport 1.0.2 (MIT) +https://github.com/PistonDevelopers/viewport.git +--------------------------------------------------------- + +piston3d-cam 0.6.0 (MIT) +https://github.com/pistondevelopers/cam.git +--------------------------------------------------------- + +pistoncore-input 1.0.1 (MIT) +https://github.com/PistonDevelopers/piston.git +--------------------------------------------------------- + +pkg-config 0.3.27 (Apache-2.0 OR MIT) +https://github.com/rust-lang/pkg-config-rs +--------------------------------------------------------- + +png 0.17.10 (Apache-2.0 OR MIT) +https://github.com/image-rs/image-png.git +--------------------------------------------------------- + +ppv-lite86 0.2.17 (Apache-2.0 OR MIT) +https://github.com/cryptocorrosion/cryptocorrosion +--------------------------------------------------------- + +prettyplease 0.2.15 (Apache-2.0 OR MIT) +https://github.com/dtolnay/prettyplease +--------------------------------------------------------- + +proc-macro-crate 1.3.1 (Apache-2.0 OR MIT) +https://github.com/bkchr/proc-macro-crate +--------------------------------------------------------- + +proc-macro2 1.0.70 (Apache-2.0 OR MIT) +https://github.com/dtolnay/proc-macro2 +--------------------------------------------------------- + +prost 0.12.3 (Apache-2.0) +https://github.com/tokio-rs/prost +--------------------------------------------------------- + +prost-build 0.12.3 (Apache-2.0) +https://github.com/tokio-rs/prost +--------------------------------------------------------- + +prost-derive 0.12.3 (Apache-2.0) +https://github.com/tokio-rs/prost +--------------------------------------------------------- + +prost-types 0.12.3 (Apache-2.0) +https://github.com/tokio-rs/prost +--------------------------------------------------------- + +qoi 0.4.1 (Apache-2.0 OR MIT) +https://github.com/aldanor/qoi-rust +--------------------------------------------------------- + +quaternion 1.0.0 (Apache-2.0 OR MIT) +https://github.com/PistonDevelopers/quaternion.git +--------------------------------------------------------- + +quote 1.0.33 (Apache-2.0 OR MIT) +https://github.com/dtolnay/quote +--------------------------------------------------------- + +radium 0.7.0 (MIT) +https://github.com/bitvecto-rs/radium +--------------------------------------------------------- + +rand 0.8.5 (Apache-2.0 OR MIT) +https://github.com/rust-random/rand +--------------------------------------------------------- + +rand_chacha 0.3.1 (Apache-2.0 OR MIT) +https://github.com/rust-random/rand +--------------------------------------------------------- + +rand_core 0.6.4 (Apache-2.0 OR MIT) +https://github.com/rust-random/rand +--------------------------------------------------------- + +raw-window-handle 0.5.2 (Apache-2.0 OR MIT OR Zlib) +https://github.com/rust-windowing/raw-window-handle +--------------------------------------------------------- + +rawpointer 0.2.1 (Apache-2.0 OR MIT) +https://github.com/bluss/rawpointer/ +--------------------------------------------------------- + +rayon 1.8.0 (Apache-2.0 OR MIT) +https://github.com/rayon-rs/rayon +--------------------------------------------------------- + +rayon-core 1.12.0 (Apache-2.0 OR MIT) +https://github.com/rayon-rs/rayon +--------------------------------------------------------- + +redox_syscall 0.3.5 (MIT) +https://gitlab.redox-os.org/redox-os/syscall +--------------------------------------------------------- + +redox_syscall 0.4.1 (MIT) +https://gitlab.redox-os.org/redox-os/syscall +--------------------------------------------------------- + +regex 1.10.2 (Apache-2.0 OR MIT) +https://github.com/rust-lang/regex +--------------------------------------------------------- + +regex-automata 0.4.3 (Apache-2.0 OR MIT) +https://github.com/rust-lang/regex/tree/master/regex-automata +--------------------------------------------------------- + +regex-syntax 0.8.2 (Apache-2.0 OR MIT) +https://github.com/rust-lang/regex/tree/master/regex-syntax +--------------------------------------------------------- + +robust 0.2.3 (Apache-2.0 OR MIT) +--------------------------------------------------------- + +roxmltree 0.14.1 (Apache-2.0 OR MIT) +https://github.com/RazrFalcon/roxmltree +--------------------------------------------------------- + +rstar 0.10.0 (Apache-2.0 OR MIT) +https://github.com/georust/rstar +--------------------------------------------------------- + +rustc-demangle 0.1.23 (Apache-2.0 OR MIT) +https://github.com/alexcrichton/rustc-demangle +--------------------------------------------------------- + +rustc_version 0.4.0 (Apache-2.0 OR MIT) +https://github.com/Kimundi/rustc-version-rs +--------------------------------------------------------- + +rustix 0.38.26 (Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT) +https://github.com/bytecodealliance/rustix +--------------------------------------------------------- + +rustversion 1.0.14 (Apache-2.0 OR MIT) +https://github.com/dtolnay/rustversion +--------------------------------------------------------- + +ryu 1.0.15 (Apache-2.0 OR BSL-1.0) +https://github.com/dtolnay/ryu +--------------------------------------------------------- + +safe_arch 0.7.1 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Lokathor/safe_arch +--------------------------------------------------------- + +scarlet 1.2.0 (Apache-2.0) +https://github.com/nicholas-miklaucic/scarlet +--------------------------------------------------------- + +scoped-tls 1.0.1 (Apache-2.0 OR MIT) +https://github.com/alexcrichton/scoped-tls +--------------------------------------------------------- + +scopeguard 1.2.0 (Apache-2.0 OR MIT) +https://github.com/bluss/scopeguard +--------------------------------------------------------- + +sctk-adwaita 0.5.4 (MIT) +https://github.com/PolyMeilex/sctk-adwaita +--------------------------------------------------------- + +semver 1.0.20 (Apache-2.0 OR MIT) +https://github.com/dtolnay/semver +--------------------------------------------------------- + +serde 1.0.193 (Apache-2.0 OR MIT) +https://github.com/serde-rs/serde +--------------------------------------------------------- + +serde_derive 1.0.193 (Apache-2.0 OR MIT) +https://github.com/serde-rs/serde +--------------------------------------------------------- + +serde_json 1.0.108 (Apache-2.0 OR MIT) +https://github.com/serde-rs/json +--------------------------------------------------------- + +shaderc 0.8.3 (Apache-2.0) +https://github.com/google/shaderc-rs +--------------------------------------------------------- + +shaderc-sys 0.8.3 (Apache-2.0) +https://github.com/google/shaderc-rs +--------------------------------------------------------- + +sharded-slab 0.1.7 (MIT) +https://github.com/hawkw/sharded-slab +--------------------------------------------------------- + +simba 0.8.1 (Apache-2.0) +https://github.com/dimforge/simba +--------------------------------------------------------- + +simd-adler32 0.3.7 (MIT) +https://github.com/mcountryman/simd-adler32 +--------------------------------------------------------- + +simulator 19.0.0 (MIT) +https://github.com/shinolab/autd3 +--------------------------------------------------------- + +slab 0.4.9 (MIT) +https://github.com/tokio-rs/slab +--------------------------------------------------------- + +slotmap 1.0.7 (Zlib) +https://github.com/orlp/slotmap +--------------------------------------------------------- + +smallvec 1.11.2 (Apache-2.0 OR MIT) +https://github.com/servo/rust-smallvec +--------------------------------------------------------- + +smithay-client-toolkit 0.16.1 (MIT) +https://github.com/smithay/client-toolkit +--------------------------------------------------------- + +socket2 0.4.10 (Apache-2.0 OR MIT) +https://github.com/rust-lang/socket2 +--------------------------------------------------------- + +socket2 0.5.5 (Apache-2.0 OR MIT) +https://github.com/rust-lang/socket2 +--------------------------------------------------------- + +spin 0.9.8 (MIT) +https://github.com/mvdnes/spin-rs.git +--------------------------------------------------------- + +stable_deref_trait 1.2.0 (Apache-2.0 OR MIT) +https://github.com/storyyeller/stable_deref_trait +--------------------------------------------------------- + +strict-num 0.1.1 (MIT) +https://github.com/RazrFalcon/strict-num +--------------------------------------------------------- + +strsim 0.10.0 (MIT) +https://github.com/dguo/strsim-rs +--------------------------------------------------------- + +syn 1.0.109 (Apache-2.0 OR MIT) +https://github.com/dtolnay/syn +--------------------------------------------------------- + +syn 2.0.39 (Apache-2.0 OR MIT) +https://github.com/dtolnay/syn +--------------------------------------------------------- + +sync_wrapper 0.1.2 (Apache-2.0) +https://github.com/Actyx/sync_wrapper +--------------------------------------------------------- + +tap 1.0.1 (MIT) +https://github.com/myrrlyn/tap +--------------------------------------------------------- + +tempfile 3.8.1 (Apache-2.0 OR MIT) +https://github.com/Stebalien/tempfile +--------------------------------------------------------- + +thiserror 1.0.50 (Apache-2.0 OR MIT) +https://github.com/dtolnay/thiserror +--------------------------------------------------------- + +thiserror-impl 1.0.50 (Apache-2.0 OR MIT) +https://github.com/dtolnay/thiserror +--------------------------------------------------------- + +thread_local 1.1.7 (Apache-2.0 OR MIT) +https://github.com/Amanieu/thread_local-rs +--------------------------------------------------------- + +tiff 0.9.0 (MIT) +https://github.com/image-rs/image-tiff +--------------------------------------------------------- + +tiny-skia 0.8.4 (BSD-3-Clause) +https://github.com/RazrFalcon/tiny-skia +--------------------------------------------------------- + +tiny-skia-path 0.8.4 (BSD-3-Clause) +https://github.com/RazrFalcon/tiny-skia/path +--------------------------------------------------------- + +tokio 1.34.0 (MIT) +https://github.com/tokio-rs/tokio +--------------------------------------------------------- + +tokio-io-timeout 1.2.0 (Apache-2.0 OR MIT) +https://github.com/sfackler/tokio-io-timeout +--------------------------------------------------------- + +tokio-stream 0.1.14 (MIT) +https://github.com/tokio-rs/tokio +--------------------------------------------------------- + +tokio-util 0.7.10 (MIT) +https://github.com/tokio-rs/tokio +--------------------------------------------------------- + +toml_datetime 0.6.5 (Apache-2.0 OR MIT) +https://github.com/toml-rs/toml +--------------------------------------------------------- + +toml_edit 0.19.15 (Apache-2.0 OR MIT) +https://github.com/toml-rs/toml +--------------------------------------------------------- + +tonic 0.10.2 (MIT) +https://github.com/hyperium/tonic +--------------------------------------------------------- + +tonic-build 0.10.2 (MIT) +https://github.com/hyperium/tonic +--------------------------------------------------------- + +tower 0.4.13 (MIT) +https://github.com/tower-rs/tower +--------------------------------------------------------- + +tower-layer 0.3.2 (MIT) +https://github.com/tower-rs/tower +--------------------------------------------------------- + +tower-service 0.3.2 (MIT) +https://github.com/tower-rs/tower +--------------------------------------------------------- + +tracing 0.1.40 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +tracing-attributes 0.1.27 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +tracing-core 0.1.32 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +tracing-log 0.2.0 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +tracing-subscriber 0.3.18 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +try-lock 0.2.5 (MIT) +https://github.com/seanmonstar/try-lock +--------------------------------------------------------- + +ttf-parser 0.20.0 (Apache-2.0 OR MIT) +https://github.com/RazrFalcon/ttf-parser +--------------------------------------------------------- + +typenum 1.17.0 (Apache-2.0 OR MIT) +https://github.com/paholg/typenum +--------------------------------------------------------- + +unicode-ident 1.0.12 ((MIT OR Apache-2.0) AND Unicode-DFS-2016) +https://github.com/dtolnay/unicode-ident +--------------------------------------------------------- + +urlencoding 2.1.3 (MIT) +https://github.com/kornelski/rust_urlencoding +--------------------------------------------------------- + +utf8parse 0.2.1 (Apache-2.0 OR MIT) +https://github.com/alacritty/vte +--------------------------------------------------------- + +valuable 0.1.0 (MIT) +https://github.com/tokio-rs/valuable +--------------------------------------------------------- + +vec_map 0.8.2 (Apache-2.0 OR MIT) +https://github.com/contain-rs/vec-map +--------------------------------------------------------- + +vecmath 1.0.0 (MIT) +https://github.com/pistondevelopers/vecmath.git +--------------------------------------------------------- + +version_check 0.9.4 (Apache-2.0 OR MIT) +https://github.com/SergioBenitez/version_check +--------------------------------------------------------- + +vk-parse 0.12.0 (Apache-2.0 OR MIT) +https://github.com/krolli/vk-parse +--------------------------------------------------------- + +vulkano 0.34.1 (Apache-2.0 OR MIT) +https://github.com/vulkano-rs/vulkano +--------------------------------------------------------- + +vulkano-macros 0.34.0 (Apache-2.0 OR MIT) +https://github.com/vulkano-rs/vulkano +--------------------------------------------------------- + +vulkano-shaders 0.34.0 (Apache-2.0 OR MIT) +https://github.com/vulkano-rs/vulkano +--------------------------------------------------------- + +want 0.3.1 (MIT) +https://github.com/seanmonstar/want +--------------------------------------------------------- + +wasi 0.11.0+wasi-snapshot-preview1 (Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT) +https://github.com/bytecodealliance/wasi +--------------------------------------------------------- + +wasm-bindgen 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen +--------------------------------------------------------- + +wasm-bindgen-backend 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/backend +--------------------------------------------------------- + +wasm-bindgen-macro 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro +--------------------------------------------------------- + +wasm-bindgen-macro-support 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro-support +--------------------------------------------------------- + +wasm-bindgen-shared 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/shared +--------------------------------------------------------- + +wayland-client 0.29.5 (MIT) +https://github.com/smithay/wayland-rs +--------------------------------------------------------- + +wayland-commons 0.29.5 (MIT) +https://github.com/smithay/wayland-rs +--------------------------------------------------------- + +wayland-cursor 0.29.5 (MIT) +https://github.com/smithay/wayland-rs +--------------------------------------------------------- + +wayland-protocols 0.29.5 (MIT) +https://github.com/smithay/wayland-rs +--------------------------------------------------------- + +wayland-scanner 0.29.5 (MIT) +https://github.com/smithay/wayland-rs +--------------------------------------------------------- + +wayland-sys 0.29.5 (MIT) +https://github.com/smithay/wayland-rs +--------------------------------------------------------- + +web-sys 0.3.66 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/web-sys +--------------------------------------------------------- + +weezl 0.1.7 (Apache-2.0 OR MIT) +https://github.com/image-rs/lzw.git +--------------------------------------------------------- + +which 4.4.2 (MIT) +https://github.com/harryfei/which-rs.git +--------------------------------------------------------- + +wide 0.7.13 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Lokathor/wide +--------------------------------------------------------- + +winapi 0.3.9 (Apache-2.0 OR MIT) +https://github.com/retep998/winapi-rs +--------------------------------------------------------- + +winapi-i686-pc-windows-gnu 0.4.0 (Apache-2.0 OR MIT) +https://github.com/retep998/winapi-rs +--------------------------------------------------------- + +winapi-x86_64-pc-windows-gnu 0.4.0 (Apache-2.0 OR MIT) +https://github.com/retep998/winapi-rs +--------------------------------------------------------- + +windows 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-core 0.51.1 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-core 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-sys 0.45.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-sys 0.48.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-sys 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-targets 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-targets 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-targets 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_gnullvm 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_gnullvm 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_gnullvm 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_msvc 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_msvc 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_msvc 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_gnu 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_gnu 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_gnu 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_msvc 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_msvc 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_msvc 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnu 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnu 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnu 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnullvm 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnullvm 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnullvm 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_msvc 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_msvc 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_msvc 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +winit 0.28.7 (Apache-2.0) +https://github.com/rust-windowing/winit +--------------------------------------------------------- + +winnow 0.5.26 (MIT) +https://github.com/winnow-rs/winnow +--------------------------------------------------------- + +wyz 0.5.1 (MIT) +https://github.com/myrrlyn/wyz +--------------------------------------------------------- + +x11-dl 2.21.0 (MIT) +https://github.com/AltF02/x11-rs.git +--------------------------------------------------------- + +xcursor 0.3.4 (MIT) +https://github.com/esposm03/xcursor-rs +--------------------------------------------------------- + +xml-rs 0.8.19 (MIT) +https://github.com/kornelski/xml-rs +--------------------------------------------------------- + +xmlparser 0.13.6 (Apache-2.0 OR MIT) +https://github.com/RazrFalcon/xmlparser +--------------------------------------------------------- + +zerocopy 0.7.29 (Apache-2.0 OR BSD-2-Clause OR MIT) +https://github.com/google/zerocopy +--------------------------------------------------------- + +zerocopy-derive 0.7.29 (Apache-2.0 OR BSD-2-Clause OR MIT) +https://github.com/google/zerocopy +--------------------------------------------------------- + +zune-inflate 0.2.54 (Apache-2.0 OR MIT OR Zlib) +--------------------------------------------------------- + +imgui-vulkano-renderer 0.9.0 (MIT) +https://github.com/Tenebryo/imgui-vulkano-renderer +Modification of the original version by Shun Suzuki +--------------------------------------------------------- + +imgui-winit-support 0.11.0 (MIT) +https://github.com/imgui-rs/imgui-rs +--------------------------------------------------------- + +Noto Sans v2.012 (OFL) + +--------------------------------------------------------- + +0BSD + +--- + +Permission to use, copy, modify, and/or distribute this software for +any purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE +FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY +DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN +AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +--------------------------------------------------------- + +Apache-2.0 + +--- + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + 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. +--------------------------------------------------------- + +BSD-2-Clause + +--- + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------- + +BSD-3-Clause + +--- + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------- + +BSL-1.0 + +--- + +Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +ISC + +--- + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +--------------------------------------------------------- + +LLVM-exception + +--- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. + +============================================================================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2019 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. +--------------------------------------------------------- + +MIT + +--- + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +OFL + +--- + +Copyright (c) , (), +with Reserved Font Name . +Copyright (c) , (), +with Reserved Font Name . +Copyright (c) , (). + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. +--------------------------------------------------------- + +Unicode-DFS-2016 + +--- + +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + +See Terms of Use +for definitions of Unicode Inc.'s Data Files and Software. + +NOTICE TO USER: Carefully read the following legal agreement. +BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S +DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), +YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. +IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE +THE DATA FILES OR SOFTWARE. + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2023 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in https://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Unicode data files and any associated documentation +(the "Data Files") or Unicode software and any associated documentation +(the "Software") to deal in the Data Files or Software +without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that either +(a) this copyright and permission notice appear with all copies +of the Data Files or Software, or +(b) this copyright and permission notice appear in associated +Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in these Data Files or Software without prior +written authorization of the copyright holder. +--------------------------------------------------------- + +Zlib + +--- + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. +--------------------------------------------------------- diff --git a/simulator/assets/autd3.glb b/simulator/assets/autd3.glb new file mode 100644 index 0000000..d9ee328 Binary files /dev/null and b/simulator/assets/autd3.glb differ diff --git a/simulator/assets/fonts/LICENSE b/simulator/assets/fonts/LICENSE new file mode 100644 index 0000000..c82d72e --- /dev/null +++ b/simulator/assets/fonts/LICENSE @@ -0,0 +1,94 @@ +Copyright 2018 The Noto Project Authors (github.com/googlei18n/noto-fonts) + +This Font Software is licensed under the SIL Open Font License, +Version 1.1. + +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font +creation efforts of academic and linguistic communities, and to +provide a free and open framework in which fonts may be shared and +improved in partnership with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply to +any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software +components as distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, +deleting, or substituting -- in part or in whole -- any of the +components of the Original Version, by changing formats or by porting +the Font Software to a new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, +modify, redistribute, and sell modified and unmodified copies of the +Font Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, in +Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the +corresponding Copyright Holder. This restriction only applies to the +primary font name as presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created using +the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/simulator/assets/fonts/NotoSans-Regular.ttf b/simulator/assets/fonts/NotoSans-Regular.ttf new file mode 100644 index 0000000..2d0097d Binary files /dev/null and b/simulator/assets/fonts/NotoSans-Regular.ttf differ diff --git a/simulator/assets/shaders/base.frag b/simulator/assets/shaders/base.frag new file mode 100644 index 0000000..ceca264 --- /dev/null +++ b/simulator/assets/shaders/base.frag @@ -0,0 +1,100 @@ +/* + * File: base.frag + * Project: shaders + * Created Date: 24/05/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 25/05/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +#version 450 + +layout(set = 0, binding = 0) uniform sampler2D samplerColorMap; + +layout(location = 0) in vec3 inNormal; +layout(location = 1) in vec2 inUV; +layout(location = 2) in vec3 inViewVec; +layout(location = 3) in vec3 inLightVec; + +layout(location = 0) out vec4 outFragColor; + +layout(push_constant) uniform PushConsts { + mat4 proj_view; + mat4 model; + vec4 lightPos; + vec4 viewPos; + float ambient; + float specular; + float lightPower; + float roughness; + float metallic; + float baseColorR; + float baseColorG; + float baseColorB; + bool hasTexture; +} +pcf; + +const float PI = 3.1415926535897932384626433832795; + +float diffuse(float ndotv, float ndotl, float ldoth, float roughness) { + float fd90 = 0.5 + 2 * ldoth * ldoth * roughness; + float lightScatter = (1 + (fd90 - 1) * pow(1 - ndotl, 5)); + float viewScatter = (1 + (fd90 - 1) * pow(1 - ndotv, 5)); + return lightScatter * viewScatter / PI; +} + +float smith(float ndotl, float ndotv, float alpha) { + float lambdaV = ndotl * (ndotv * (1 - alpha) + alpha); + float lambdaL = ndotv * (ndotl * (1 - alpha) + alpha); + return 0.5f / (lambdaV + lambdaL + 0.0001); +} + +float ggx(float perceptualRoughness, float ndoth) { + float a = ndoth * perceptualRoughness; + float k = perceptualRoughness / (1.0 - ndoth * ndoth + a * a); + return k * k / PI; +} + +vec3 fresnel(vec3 f0, float cos) { return f0 + (1 - f0) * pow(1 - cos, 5); } + +void main() { + vec4 color = pcf.hasTexture + ? texture(samplerColorMap, inUV) + : vec4(pcf.baseColorR, pcf.baseColorG, pcf.baseColorB, 1.0f); + + vec3 lightColor = vec3(pcf.lightPower, pcf.lightPower, pcf.lightPower); + + vec3 N = normalize(inNormal); + vec3 L = normalize(inLightVec); + vec3 V = normalize(inViewVec); + vec3 R = reflect(-L, N); + vec3 indirectDiffuse = max(dot(N, L), pcf.ambient).rrr; + indirectDiffuse = + indirectDiffuse * color.rgb + pow(max(dot(R, V), 0.0), pcf.specular), + color.a; + + vec3 halfDir = normalize(inLightVec + inViewVec); + float ndotv = abs(dot(inNormal, inViewVec)); + float ndotl = max(0, dot(inNormal, inLightVec)); + float ndoth = max(0, dot(inNormal, halfDir)); + float ldoth = max(0, dot(inLightVec, halfDir)); + float reflectivity = mix(0.04, 1.0, pcf.metallic); + vec3 f0 = mix(vec3(0.04, 0.04, 0.04), color.xyz, pcf.metallic); + + vec3 diffusev = color.xyz * (1 - reflectivity) * lightColor * + diffuse(ndotv, ndotl, ldoth, pcf.roughness) * ndotl + + color.xyz * (1 - reflectivity) * indirectDiffuse; + + float alpha = pcf.roughness * pcf.roughness; + float D = ggx(pcf.roughness, ndotv); + vec3 F = fresnel(f0, ldoth); + vec3 specular = smith(ndotl, ndotv, alpha) * D * F * ndotl * lightColor; + specular = max(vec3(0, 0, 0), specular); + + outFragColor = vec4(diffusev + specular, color.a); +} diff --git a/simulator/assets/shaders/base.vert b/simulator/assets/shaders/base.vert new file mode 100644 index 0000000..eb635a2 --- /dev/null +++ b/simulator/assets/shaders/base.vert @@ -0,0 +1,42 @@ +/* + * File: base.vert + * Project: shaders + * Created Date: 24/05/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 23/09/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +#version 450 + +layout (location = 0) in vec3 position; +layout (location = 1) in vec3 norm; +layout (location = 2) in vec2 uv; + +layout(push_constant) uniform PushConsts { + mat4 proj_view; + mat4 model; + vec4 lightPos; + vec4 viewPos; +} primitive; + +layout (location = 0) out vec3 outNormal; +layout (location = 1) out vec2 outUV; +layout (location = 2) out vec3 outViewVec; +layout (location = 3) out vec3 outLightVec; + +void main() +{ + vec4 pos = primitive.model * vec4(position, 1.0); + + outUV = uv; + outNormal = mat3(primitive.model) * norm; + outLightVec = primitive.lightPos.xyz - pos.xyz; + outViewVec = primitive.viewPos.xyz - pos.xyz; + + gl_Position = primitive.proj_view * pos; +} diff --git a/simulator/assets/shaders/circle.frag b/simulator/assets/shaders/circle.frag new file mode 100644 index 0000000..28d8d92 --- /dev/null +++ b/simulator/assets/shaders/circle.frag @@ -0,0 +1,25 @@ +/* + * File: circle.frag + * Project: shaders + * Created Date: 26/11/2021 + * Author: Shun Suzuki + * ----- + * Last Modified: 23/05/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2021 Hapis Lab. All rights reserved. + * + */ + +#version 450 core + +layout(location = 0) in vec2 v_tex_coords; +layout(location = 1) in vec4 i_color; + +layout(location = 0) out vec4 o_color; + +layout(set = 0, binding = 0) uniform sampler2D t_color; + +void main() { + o_color = i_color * texture(t_color, v_tex_coords); +} diff --git a/simulator/assets/shaders/circle.vert b/simulator/assets/shaders/circle.vert new file mode 100644 index 0000000..209cf0d --- /dev/null +++ b/simulator/assets/shaders/circle.vert @@ -0,0 +1,32 @@ +/* + * File: circle.vert + * Project: shaders + * Created Date: 26/11/2021 + * Author: Shun Suzuki + * ----- + * Last Modified: 25/05/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2021 Hapis Lab. All rights reserved. + * + */ + +#version 450 core + +layout(location = 0) in vec4 position; +layout(location = 1) in vec2 tex_coords; +layout(location = 2) in mat4 model; +layout(location = 6) in vec4 color; + +layout(location = 0) out vec2 o_tex_coords; +layout(location = 1) out vec4 o_color; + +layout(push_constant) uniform PushConsts { + mat4 proj_view; +} primitive; + +void main() { + o_tex_coords = tex_coords; + o_color = color; + gl_Position = primitive.proj_view * model * position; +} diff --git a/simulator/assets/shaders/pressure.comp b/simulator/assets/shaders/pressure.comp new file mode 100644 index 0000000..1ebd4f6 --- /dev/null +++ b/simulator/assets/shaders/pressure.comp @@ -0,0 +1,74 @@ +/* + * File: pressure.comp + * Project: shaders + * Created Date: 22/05/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 23/05/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +#version 450 core + +layout(local_size_x = 32, local_size_y = 32, local_size_z = 1) in; + +layout(set = 0, binding = 0) buffer Data { + vec4 data[]; +} data; + +layout(set = 1, binding = 0) buffer SourcePos { + vec4 pos[]; +} source_pos; + +layout(set = 2, binding = 0) buffer SourceAmp { + vec4 drive[]; +} source_drive; + +layout(set = 3, binding = 0) uniform sampler1D color_map; + +layout(push_constant) uniform Config { + uint source_num; + float _wave_num; + float color_scale; + uint width; + uint height; + float pixel_size; + float scale; + uint _dummy_1; + mat4 world; +} config; + +const float PI = 3.1415926535897932384626433832795; + +vec4 coloring(float t) +{ + return texture(color_map, clamp(t, 0.0, 1.0)); +} + +void main() { + if(gl_GlobalInvocationID.x >= config.width || gl_GlobalInvocationID.y >= config.height) return; + float x = (gl_GlobalInvocationID.x - config.width / 2.0) * config.pixel_size; + float y = (gl_GlobalInvocationID.y - config.height / 2.0) * config.pixel_size; + vec3 point = vec3(config.world * vec4(x, y, 0.0, 1.0)); + float re = 0.0; + float im = 0.0; + for(uint idx = 0; idx < 65536; idx++){ + if(idx >= config.source_num) break; + vec3 tp = vec3(source_pos.pos[idx]); + float r = length(point - tp); + float p = source_drive.drive[idx].y - source_drive.drive[idx].w * r; + float amp = source_drive.drive[idx].z * source_drive.drive[idx].x / r * config.scale; + re += amp * cos(p); + im += amp * sin(p); + } +#ifdef RADIATION + float c = re*re+im*im; +#else + float c = sqrt(re*re+im*im); +#endif + vec4 write_color = coloring(c / config.color_scale); + data.data[gl_GlobalInvocationID.x + config.width * gl_GlobalInvocationID.y] = write_color; +} diff --git a/simulator/assets/shaders/slice.frag b/simulator/assets/shaders/slice.frag new file mode 100644 index 0000000..bbcb676 --- /dev/null +++ b/simulator/assets/shaders/slice.frag @@ -0,0 +1,35 @@ +/* + * File: slice.frag + * Project: shaders + * Created Date: 05/10/2022 + * Author: Shun Suzuki + * ----- + * Last Modified: 25/05/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2022 Shun Suzuki. All rights reserved. + * + */ + +#version 450 + +layout(location = 0) in vec2 v_tex_coords; + +layout(location = 0) out vec4 f_color; + +layout(set = 0, binding = 0) buffer Data { + vec4 data[]; +} data; + +layout(push_constant) uniform PushConstsConfig { + mat4 pvm; + uint width; + uint height; +} config; + +void main() { + uint w = uint(floor(v_tex_coords.x * config.width)); + uint h = uint(floor(v_tex_coords.y * config.height)); + uint idx = w + config.width * h; + f_color = data.data[idx]; +} diff --git a/simulator/assets/shaders/slice.vert b/simulator/assets/shaders/slice.vert new file mode 100644 index 0000000..bb65002 --- /dev/null +++ b/simulator/assets/shaders/slice.vert @@ -0,0 +1,29 @@ +/* + * File: slice.vert + * Project: shaders + * Created Date: 05/10/2022 + * Author: Shun Suzuki + * ----- + * Last Modified: 25/05/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2022 Shun Suzuki. All rights reserved. + * + */ + +#version 450 + +layout(location = 0) in vec4 position; +layout(location = 1) in vec2 tex_coords; + +layout(location = 0) out vec2 o_tex_coords; + +layout(push_constant) uniform PushConstsConfig { + mat4 pvm; +} pc; + +void main() { + gl_Position = pc.pvm * position; + o_tex_coords = tex_coords; +} + \ No newline at end of file diff --git a/simulator/assets/textures/circle.png b/simulator/assets/textures/circle.png new file mode 100644 index 0000000..00a9da6 Binary files /dev/null and b/simulator/assets/textures/circle.png differ diff --git a/simulator/src/camera_helper.rs b/simulator/src/camera_helper.rs new file mode 100644 index 0000000..593c03c --- /dev/null +++ b/simulator/src/camera_helper.rs @@ -0,0 +1,35 @@ +/* + * File: camera_helper.rs + * Project: src + * Created Date: 26/11/2021 + * Author: Shun Suzuki + * ----- + * Last Modified: 30/05/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2021 Hapis Lab. All rights reserved. + * + */ + +use camera_controllers::Camera; +use cgmath::{Deg, Euler}; + +use crate::{ + common::transform::{to_gl_pos, to_gl_rot}, + Quaternion, Vector3, +}; + +pub fn set_camera(camera: &mut Camera, pos: Vector3, angle: Vector3) { + let pos = to_gl_pos(pos); + camera.position = [pos.x, pos.y, pos.z]; + + let rotation = Quaternion::from(Euler { + x: Deg(angle.x), + y: Deg(angle.y), + z: Deg(angle.z), + }); + let rotation = to_gl_rot(rotation); + camera.right = (rotation * Vector3::unit_x()).into(); + camera.up = (rotation * Vector3::unit_y()).into(); + camera.forward = (rotation * Vector3::unit_z()).into(); +} diff --git a/simulator/src/common/color.rs b/simulator/src/common/color.rs new file mode 100644 index 0000000..86ff870 --- /dev/null +++ b/simulator/src/common/color.rs @@ -0,0 +1,56 @@ +/* + * File: color.rs + * Project: common + * Created Date: 22/05/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 22/05/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +pub trait Color { + fn rgba(&self) -> [f32; 4]; + fn hsva(&self) -> [f32; 4]; +} + +pub struct Hsv { + pub h: f32, + pub s: f32, + pub v: f32, + pub a: f32, +} + +impl Color for Hsv { + #[allow(clippy::many_single_char_names)] + fn rgba(&self) -> [f32; 4] { + let h = self.h % 1.0; + let s = self.s; + let v = self.v; + let alpha = self.a; + + if s == 0.0 { + return [v, v, v, alpha]; + } + let i = (h * 6.0).floor(); + let f = h * 6.0 - i; + let p = v * (1. - s); + let q = v * (1. - (s * f)); + let t = v * (1. - (s * (1. - f))); + match i as i32 { + 0 => [v, t, p, alpha], + 1 => [q, v, p, alpha], + 2 => [p, v, t, alpha], + 3 => [p, q, v, alpha], + 4 => [t, p, v, alpha], + 5 => [v, p, q, alpha], + _ => unreachable!(), + } + } + + fn hsva(&self) -> [f32; 4] { + [self.h, self.s, self.v, self.a] + } +} diff --git a/simulator/src/common/coloring_method.rs b/simulator/src/common/coloring_method.rs new file mode 100644 index 0000000..06e89e3 --- /dev/null +++ b/simulator/src/common/coloring_method.rs @@ -0,0 +1,22 @@ +/* + * File: coloring_method.rs + * Project: common + * Created Date: 22/05/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 22/05/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +use super::color::Color; +use super::color::Hsv; + +pub type ColoringMethod = fn(f32, f32, f32) -> [f32; 4]; + +pub fn coloring_hsv(h: f32, v: f32, a: f32) -> [f32; 4] { + let hsv = Hsv { h, s: 1., v, a }; + hsv.rgba() +} diff --git a/simulator/src/common/mod.rs b/simulator/src/common/mod.rs new file mode 100644 index 0000000..06feb8e --- /dev/null +++ b/simulator/src/common/mod.rs @@ -0,0 +1,16 @@ +/* + * File: mod.rs + * Project: common + * Created Date: 22/05/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 30/05/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +pub mod color; +pub mod coloring_method; +pub mod transform; diff --git a/simulator/src/common/transform.rs b/simulator/src/common/transform.rs new file mode 100644 index 0000000..6b6364c --- /dev/null +++ b/simulator/src/common/transform.rs @@ -0,0 +1,53 @@ +/* + * File: transform.rs + * Project: common + * Created Date: 30/05/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 15/06/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +use cgmath::InnerSpace; + +use crate::{Quaternion, Vector3}; + +pub fn to_gl_pos(v: Vector3) -> Vector3 { + if cfg!(feature = "left_handed") { + Vector3::new(v.x, v.y, -v.z) + } else { + v + } +} + +pub fn to_gl_rot(v: Quaternion) -> Quaternion { + if cfg!(feature = "left_handed") { + Quaternion::new(v.s, -v.v.x, -v.v.y, v.v.z) + } else { + v + } +} + +pub fn quaternion_to(v: Vector3, to: Vector3) -> Quaternion { + let a = v.normalize(); + let b = to.normalize(); + let c = b.cross(a).normalize(); + if c.x.is_nan() || c.y.is_nan() || c.z.is_nan() { + return Quaternion::new(1., 0., 0., 0.); + } + let ip = a.dot(b); + const EPS: f32 = 1e-4; + if c.magnitude() < EPS || 1. < ip { + if ip < EPS - 1. { + let a2 = Vector3::new(-a.y, a.z, a.x); + let c2 = a2.cross(a).normalize(); + return Quaternion::new(0., c2.x, c2.y, c2.z); + } + return Quaternion::new(1., 0., 0., 0.); + } + let e = c * (0.5 * (1. - ip)).sqrt(); + Quaternion::new((0.5 * (1. + ip)).sqrt(), e.x, e.y, e.z) +} diff --git a/simulator/src/device_viewer/mod.rs b/simulator/src/device_viewer/mod.rs new file mode 100644 index 0000000..6584722 --- /dev/null +++ b/simulator/src/device_viewer/mod.rs @@ -0,0 +1,18 @@ +/* + * File: mod.rs + * Project: autd-server + * Created Date: 23/09/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 24/09/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +mod model; +mod viewer; + +pub use model::Model; +pub use viewer::DeviceViewer; diff --git a/simulator/src/device_viewer/model.rs b/simulator/src/device_viewer/model.rs new file mode 100644 index 0000000..469613c --- /dev/null +++ b/simulator/src/device_viewer/model.rs @@ -0,0 +1,220 @@ +/* + * File: model.rs + * Project: autd-server + * Created Date: 23/09/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 30/10/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +use bytemuck::{Pod, Zeroable}; +use gltf::{buffer::Data, Document, Node, Semantic}; +use vulkano::pipeline::graphics::vertex_input::Vertex; + +#[repr(C)] +#[derive(Default, Debug, Copy, Clone, Zeroable, Pod, Vertex)] +pub struct ModelVertex { + #[format(R32G32B32_SFLOAT)] + position: [f32; 3], + #[format(R32G32B32_SFLOAT)] + norm: [f32; 3], + #[format(R32G32_SFLOAT)] + uv: [f32; 2], +} +pub struct Primitive { + pub first_index: u32, + pub index_count: u32, + pub material_index: usize, +} + +pub struct Material { + pub base_color_factor: [f32; 4], + pub base_color_texture_idx: Option, + pub metallic_factor: f32, + pub roughness_factor: f32, +} + +pub struct Model { + pub vertices: Vec, + pub indices: Vec, + pub primitives: Vec, + pub image: gltf::image::Data, + pub materials: Vec, +} + +impl Model { + fn load_autd3_model() -> anyhow::Result> { + Ok(std::fs::read("assets/autd3.glb")?) + } + + pub fn new() -> anyhow::Result { + let glb = Self::load_autd3_model()?; + let (document, buffers, images) = gltf::import_slice(glb)?; + let node = document.scenes().next().unwrap().nodes().next().unwrap(); + + let materials = Self::load_materials(&document); + + let mut indices = Vec::new(); + let mut vertices = Vec::new(); + let mut primitives = Vec::new(); + Self::load_node(node, &buffers, &mut indices, &mut vertices, &mut primitives); + + Ok(Self { + indices, + vertices, + primitives, + image: images[0].clone(), + materials, + }) + } + + fn load_node( + node: Node, + buffers: &[Data], + indices: &mut Vec, + vertices: &mut Vec, + primitives: &mut Vec, + ) { + node.children().for_each(|child| { + Self::load_node(child, buffers, indices, vertices, primitives); + }); + + if let Some(mesh) = node.mesh() { + primitives.extend(mesh.primitives().map(|primitive| { + let first_index = indices.len() as _; + let vertex_start = vertices.len() as _; + Self::load_vertices(&primitive, buffers, vertices); + let index_count = + Self::load_indices(&primitive, vertex_start, buffers, indices) as _; + Primitive { + first_index, + index_count, + material_index: primitive.material().index().unwrap(), + } + })); + } + } + + fn load_vertices( + primitive: &gltf::Primitive, + buffers: &[Data], + vertices: &mut Vec, + ) { + let vertex_count = primitive + .attributes() + .find(|attr| attr.0 == Semantic::Positions) + .map(|attr| attr.1.count()) + .unwrap_or(0); + + unsafe { + let load = |key: Semantic| -> Option<*const f32> { + primitive + .attributes() + .find(|attr| attr.0 == key) + .map(|attr| { + let offset = attr.1.offset(); + let buffer_view = attr.1.view().unwrap(); + let buffer = buffer_view.buffer().index(); + let offset = offset + buffer_view.offset(); + buffers[buffer].as_ptr().add(offset) as _ + }) + }; + + let position_buffer = load(Semantic::Positions).unwrap(); + let normals_buffer = load(Semantic::Normals); + let tex_coords_buffer = load(Semantic::TexCoords(0)); + + vertices.extend((0..vertex_count).map(|v| { + let position = [ + std::ptr::read(position_buffer.add(v * 3)) / 100., + std::ptr::read(position_buffer.add(v * 3 + 1)) / 100., + std::ptr::read(position_buffer.add(v * 3 + 2)) / 100., + ]; + let position = [position[0], -position[2], position[1]]; + let norm = if let Some(buf) = normals_buffer { + [ + std::ptr::read(buf.add(v * 3)), + std::ptr::read(buf.add(v * 3 + 1)), + std::ptr::read(buf.add(v * 3 + 2)), + ] + } else { + [0., 0., 0.] + }; + let norm = [norm[0], -norm[2], norm[1]]; + let uv = if let Some(buf) = tex_coords_buffer { + [ + std::ptr::read(buf.add(v * 2)), + std::ptr::read(buf.add(v * 2 + 1)), + ] + } else { + [0., 0.] + }; + + ModelVertex { position, norm, uv } + })); + } + } + + fn load_indices( + primitive: &gltf::Primitive, + vertex_start: u32, + buffers: &[Data], + indices: &mut Vec, + ) -> usize { + let component_type = primitive.indices().unwrap().data_type(); + let buffer_view = primitive.indices().unwrap().view().unwrap(); + let offset = primitive.indices().unwrap().offset(); + let count = primitive.indices().unwrap().count(); + let buffer_idx = buffer_view.buffer().index(); + let offset = offset + buffer_view.offset(); + + let data = &buffers[buffer_idx].0; + unsafe { + match component_type { + gltf::accessor::DataType::U8 => { + indices.extend( + data[offset..] + .iter() + .take(count) + .map(|&b| b as u32 + vertex_start), + ); + } + gltf::accessor::DataType::U16 => { + indices.extend( + std::slice::from_raw_parts(data[offset..].as_ptr() as *const u16, count) + .iter() + .map(|&b| b as u32 + vertex_start), + ); + } + gltf::accessor::DataType::U32 => { + indices.extend( + std::slice::from_raw_parts(data[offset..].as_ptr() as *const u32, count) + .iter() + .map(|&b| b + vertex_start), + ); + } + _ => unimplemented!(), + } + } + count + } + + fn load_materials(document: &Document) -> Vec { + document + .materials() + .map(|m| Material { + base_color_factor: m.pbr_metallic_roughness().base_color_factor(), + base_color_texture_idx: m + .pbr_metallic_roughness() + .base_color_texture() + .map(|t| t.texture().index()), + metallic_factor: m.pbr_metallic_roughness().metallic_factor(), + roughness_factor: m.pbr_metallic_roughness().roughness_factor(), + }) + .collect() + } +} diff --git a/simulator/src/device_viewer/viewer.rs b/simulator/src/device_viewer/viewer.rs new file mode 100644 index 0000000..80cfb76 --- /dev/null +++ b/simulator/src/device_viewer/viewer.rs @@ -0,0 +1,357 @@ +/* + * File: viewer.rs + * Project: autd-server + * Created Date: 23/09/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 06/11/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +use std::sync::Arc; + +use autd3::prelude::Geometry; +use vulkano::{ + buffer::{Buffer, BufferCreateInfo, BufferUsage, Subbuffer}, + command_buffer::{ + AutoCommandBufferBuilder, CommandBufferUsage, CopyBufferToImageInfo, + PrimaryAutoCommandBuffer, PrimaryCommandBufferAbstract, + }, + descriptor_set::{PersistentDescriptorSet, WriteDescriptorSet}, + format::Format, + image::{ + sampler::{Filter, Sampler, SamplerAddressMode, SamplerCreateInfo, SamplerMipmapMode}, + view::ImageView, + Image, ImageCreateInfo, ImageType, ImageUsage, + }, + memory::allocator::{AllocationCreateInfo, MemoryTypeFilter}, + pipeline::{ + graphics::{ + color_blend::{AttachmentBlend, ColorBlendAttachmentState, ColorBlendState}, + depth_stencil::{DepthState, DepthStencilState}, + input_assembly::{InputAssemblyState, PrimitiveTopology}, + multisample::MultisampleState, + rasterization::RasterizationState, + vertex_input::{Vertex, VertexDefinition}, + viewport::ViewportState, + GraphicsPipelineCreateInfo, + }, + layout::PipelineDescriptorSetLayoutCreateInfo, + DynamicState, GraphicsPipeline, Pipeline, PipelineBindPoint, PipelineLayout, + PipelineShaderStageCreateInfo, + }, + render_pass::Subpass, + sync::GpuFuture, + DeviceSize, +}; + +use super::model::{Model, ModelVertex}; +use crate::{ + common::transform::{to_gl_pos, to_gl_rot}, + renderer::Renderer, + viewer_settings::ViewerSettings, + Matrix4, Quaternion, Vector3, +}; + +#[allow(clippy::needless_question_mark)] +mod vs { + vulkano_shaders::shader! { + ty: "vertex", + path: "./assets/shaders/base.vert" + } +} + +#[allow(clippy::needless_question_mark)] +mod fs { + vulkano_shaders::shader! { + ty: "fragment", + path: "./assets/shaders/base.frag" + } +} + +pub struct DeviceViewer { + vertices: Subbuffer<[ModelVertex]>, + indices: Subbuffer<[u32]>, + texture_desc_set: Arc, + pipeline: Arc, + pos_rot: Vec<(Vector3, Quaternion)>, +} + +impl DeviceViewer { + pub fn new(renderer: &Renderer, model: &Model) -> anyhow::Result { + let device = renderer.device(); + let vertices = Self::create_vertices(renderer, &model.vertices)?; + let indices = Self::create_indices(renderer, &model.indices)?; + + let vs = vs::load(device.clone())?.entry_point("main").unwrap(); + let fs = fs::load(device.clone())?.entry_point("main").unwrap(); + + let vertex_input_state = + ModelVertex::per_vertex().definition(&vs.info().input_interface)?; + let stages = [ + PipelineShaderStageCreateInfo::new(vs), + PipelineShaderStageCreateInfo::new(fs), + ]; + let layout = PipelineLayout::new( + device.clone(), + PipelineDescriptorSetLayoutCreateInfo::from_stages(&stages) + .into_pipeline_layout_create_info(device.clone())?, + )?; + let subpass = Subpass::from(renderer.render_pass(), 0).unwrap(); + + let pipeline = GraphicsPipeline::new( + device.clone(), + None, + GraphicsPipelineCreateInfo { + stages: stages.into_iter().collect(), + vertex_input_state: Some(vertex_input_state), + input_assembly_state: Some(InputAssemblyState { + topology: PrimitiveTopology::TriangleStrip, + ..Default::default() + }), + viewport_state: Some(ViewportState::default()), + rasterization_state: Some(RasterizationState::default()), + multisample_state: Some(MultisampleState { + rasterization_samples: renderer.sample_count(), + ..MultisampleState::default() + }), + color_blend_state: Some(ColorBlendState::with_attachment_states( + subpass.num_color_attachments(), + ColorBlendAttachmentState { + blend: Some(AttachmentBlend::alpha()), + ..Default::default() + }, + )), + depth_stencil_state: Some(DepthStencilState { + depth: Some(DepthState::simple()), + ..Default::default() + }), + dynamic_state: [DynamicState::Viewport].into_iter().collect(), + subpass: Some(subpass.into()), + ..GraphicsPipelineCreateInfo::layout(layout) + }, + )?; + let texture_desc_set = + Self::create_texture_desc_set(pipeline.clone(), renderer, &model.image)?; + + Ok(Self { + vertices, + indices, + texture_desc_set, + pipeline, + pos_rot: Vec::new(), + }) + } + + pub fn init(&mut self, geometry: &Geometry) { + self.pos_rot = geometry + .iter() + .map(|dev| { + let p = dev[0].position(); + let r = dev[0].rotation(); + ( + to_gl_pos(Vector3::new(p.x as _, p.y as _, p.z as _)), + to_gl_rot(Quaternion::new(r.w as _, r.i as _, r.j as _, r.k as _)), + ) + }) + .collect(); + } + + pub fn render( + &mut self, + model: &Model, + view_proj: (Matrix4, Matrix4), + setting: &ViewerSettings, + visible: &[bool], + builder: &mut AutoCommandBufferBuilder, + ) -> anyhow::Result<()> { + builder + .bind_vertex_buffers(0, self.vertices.clone())? + .bind_index_buffer(self.indices.clone())? + .bind_descriptor_sets( + PipelineBindPoint::Graphics, + self.pipeline.layout().clone(), + 0, + self.texture_desc_set.clone(), + )?; + + let (mut view, proj) = view_proj; + view[3][0] /= crate::METER; + view[3][1] /= crate::METER; + view[3][2] /= crate::METER; + + self.pos_rot + .iter() + .zip(visible.iter()) + .filter(|&(_, &s)| s) + .try_for_each(|(&(pos, rot), _)| -> anyhow::Result<()> { + model + .primitives + .iter() + .try_for_each(|primitive| -> anyhow::Result<()> { + let material = &model.materials[primitive.material_index]; + let pcf = fs::PushConsts { + proj_view: (proj * view).into(), + model: (Matrix4::from_translation(pos / crate::METER) + * Matrix4::from(rot)) + .into(), + lightPos: [ + setting.light_pos_x / crate::METER, + setting.light_pos_y / crate::METER, + setting.light_pos_z / crate::METER, + 1., + ], + viewPos: [ + setting.camera_pos_x / crate::METER, + setting.camera_pos_y / crate::METER, + setting.camera_pos_z / crate::METER, + 1., + ], + ambient: setting.ambient, + specular: setting.specular, + lightPower: setting.light_power, + metallic: material.metallic_factor, + roughness: material.roughness_factor, + baseColorR: material.base_color_factor[0], + baseColorG: material.base_color_factor[1], + baseColorB: material.base_color_factor[2], + hasTexture: if material.base_color_texture_idx.is_some() { + 1 + } else { + 0 + }, + }; + + builder + .bind_pipeline_graphics(self.pipeline.clone())? + .push_constants(self.pipeline.layout().clone(), 0, pcf)? + .draw_indexed(primitive.index_count, 1, primitive.first_index, 0, 0)?; + + Ok(()) + }) + })?; + + Ok(()) + } + + fn create_vertices( + renderer: &Renderer, + vertices: &[ModelVertex], + ) -> anyhow::Result> { + Ok(Buffer::from_iter( + renderer.memory_allocator(), + BufferCreateInfo { + usage: BufferUsage::VERTEX_BUFFER, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_DEVICE + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + vertices.iter().cloned(), + )?) + } + + fn create_indices(renderer: &Renderer, indices: &[u32]) -> anyhow::Result> { + Ok(Buffer::from_iter( + renderer.memory_allocator(), + BufferCreateInfo { + usage: BufferUsage::INDEX_BUFFER, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_DEVICE + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + indices.iter().cloned(), + )?) + } + + fn create_texture_desc_set( + pipeline: Arc, + renderer: &Renderer, + image: &gltf::image::Data, + ) -> anyhow::Result> { + let (uploads, texture) = Self::load_image(renderer, image)?; + let sampler = Sampler::new( + pipeline.device().clone(), + SamplerCreateInfo { + mag_filter: Filter::Linear, + min_filter: Filter::Linear, + mipmap_mode: SamplerMipmapMode::Linear, + address_mode: [SamplerAddressMode::Repeat; 3], + mip_lod_bias: 0.0, + lod: 0.0..=texture.image().mip_levels() as f32, + ..Default::default() + }, + )?; + let layout = pipeline.layout().set_layouts().get(0).unwrap(); + + uploads + .execute(renderer.queue())? + .then_signal_fence_and_flush()? + .wait(None)?; + + Ok(PersistentDescriptorSet::new( + renderer.descriptor_set_allocator(), + layout.clone(), + [WriteDescriptorSet::image_view_sampler(0, texture, sampler)], + [], + )?) + } + + fn load_image( + renderer: &Renderer, + image: &gltf::image::Data, + ) -> anyhow::Result<(Arc, Arc)> { + let extent = [image.width, image.height, 1]; + let upload_buffer = Buffer::new_slice( + renderer.memory_allocator(), + BufferCreateInfo { + usage: BufferUsage::TRANSFER_SRC, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_HOST + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + (image.width * image.height * 4) as DeviceSize, + )?; + + upload_buffer.write()?.copy_from_slice(&image.pixels); + + let mut uploads = AutoCommandBufferBuilder::primary( + renderer.command_buffer_allocator(), + renderer.queue().queue_family_index(), + CommandBufferUsage::OneTimeSubmit, + )?; + + let image = Image::new( + renderer.memory_allocator(), + ImageCreateInfo { + image_type: ImageType::Dim2d, + format: Format::R8G8B8A8_SRGB, + extent, + usage: ImageUsage::TRANSFER_DST | ImageUsage::SAMPLED, + mip_levels: (image.width.min(image.height) as f32).log2().ceil() as u32, + ..Default::default() + }, + AllocationCreateInfo::default(), + )?; + + uploads.copy_buffer_to_image(CopyBufferToImageInfo::buffer_image( + upload_buffer, + image.clone(), + ))?; + + let image = ImageView::new_default(image)?; + + Ok((uploads.build()?, image)) + } +} diff --git a/simulator/src/field_compute_pipeline.rs b/simulator/src/field_compute_pipeline.rs new file mode 100644 index 0000000..54de93f --- /dev/null +++ b/simulator/src/field_compute_pipeline.rs @@ -0,0 +1,389 @@ +/* + * File: field_compute_pipeline.rs + * Project: src + * Created Date: 28/11/2021 + * Author: Shun Suzuki + * ----- + * Last Modified: 30/10/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2021 Hapis Lab. All rights reserved. + * + */ + +use std::sync::Arc; + +use bytemuck::{Pod, Zeroable}; +use scarlet::{colormap::ColorMap, prelude::*}; +use vulkano::{ + buffer::{Buffer, BufferCreateInfo, BufferUsage, Subbuffer}, + command_buffer::{ + AutoCommandBufferBuilder, CommandBufferUsage, CopyBufferToImageInfo, + PrimaryCommandBufferAbstract, + }, + descriptor_set::{PersistentDescriptorSet, WriteDescriptorSet}, + format::Format, + image::{ + sampler::{Filter, Sampler, SamplerAddressMode, SamplerCreateInfo, SamplerMipmapMode}, + view::ImageView, + Image, ImageCreateInfo, ImageType, ImageUsage, + }, + memory::allocator::{AllocationCreateInfo, MemoryTypeFilter}, + pipeline::{ + compute::ComputePipelineCreateInfo, layout::PipelineDescriptorSetLayoutCreateInfo, + ComputePipeline, Pipeline, PipelineBindPoint, PipelineLayout, + PipelineShaderStageCreateInfo, + }, + sync::GpuFuture, + DeviceSize, +}; + +use crate::{ + renderer::Renderer, + sound_sources::{Drive, SoundSources}, + update_flag::UpdateFlag, + viewer_settings::ViewerSettings, +}; + +#[repr(C)] +#[derive(Default, Debug, Copy, Clone, Pod, Zeroable)] +pub struct Config { + pub source_num: u32, + pub _wave_num: f32, + pub color_scale: f32, + pub width: u32, + pub height: u32, + pub pixel_size: f32, + pub scale: f32, + pub _dummy_0: u32, + pub model: [[f32; 4]; 4], +} + +pub struct FieldComputePipeline { + pipeline_pressure: Arc, + pipeline_radiation: Arc, + source_drive_buf: Option>, + source_pos_buf: Option>, + color_map_desc_set_pressure: Arc, + color_map_desc_set_radiation: Arc, +} + +impl FieldComputePipeline { + pub fn new(renderer: &Renderer, settings: &ViewerSettings) -> anyhow::Result { + let pipeline_pressure = { + let shader = cs_pressure::load(renderer.device())?; + let cs = shader.entry_point("main").unwrap(); + let stage = PipelineShaderStageCreateInfo::new(cs); + let layout = PipelineLayout::new( + renderer.device(), + PipelineDescriptorSetLayoutCreateInfo::from_stages([&stage]) + .into_pipeline_layout_create_info(renderer.device())?, + )?; + ComputePipeline::new( + renderer.device(), + None, + ComputePipelineCreateInfo::stage_layout(stage, layout), + )? + }; + let color_map_desc_set_pressure = + Self::create_color_map_desc_set(renderer, pipeline_pressure.clone(), settings)?; + + let pipeline_radiation = { + let shader = cs_radiation::load(renderer.device())?; + let cs = shader.entry_point("main").unwrap(); + let stage = PipelineShaderStageCreateInfo::new(cs); + let layout = PipelineLayout::new( + renderer.device(), + PipelineDescriptorSetLayoutCreateInfo::from_stages([&stage]) + .into_pipeline_layout_create_info(renderer.device())?, + )?; + ComputePipeline::new( + renderer.device(), + None, + ComputePipelineCreateInfo::stage_layout(stage, layout), + )? + }; + let color_map_desc_set_radiation = + Self::create_color_map_desc_set(renderer, pipeline_radiation.clone(), settings)?; + + Ok(Self { + pipeline_pressure, + pipeline_radiation, + source_pos_buf: None, + source_drive_buf: None, + color_map_desc_set_pressure, + color_map_desc_set_radiation, + }) + } + + fn create_color_map_desc_set( + renderer: &Renderer, + pipeline: Arc, + settings: &ViewerSettings, + ) -> anyhow::Result> { + let color_map_size = 100; + let iter = (0..color_map_size).map(|x| x as f64 / color_map_size as f64); + let mut uploads = AutoCommandBufferBuilder::primary( + renderer.command_buffer_allocator(), + renderer.queue().queue_family_index(), + CommandBufferUsage::OneTimeSubmit, + )?; + let texture = { + let color_map: Vec = match settings.color_map_type { + crate::viewer_settings::ColorMapType::Viridis => { + scarlet::colormap::ListedColorMap::viridis().transform(iter) + } + crate::viewer_settings::ColorMapType::Magma => { + scarlet::colormap::ListedColorMap::magma().transform(iter) + } + crate::viewer_settings::ColorMapType::Inferno => { + scarlet::colormap::ListedColorMap::inferno().transform(iter) + } + crate::viewer_settings::ColorMapType::Plasma => { + scarlet::colormap::ListedColorMap::plasma().transform(iter) + } + }; + + let extent = [color_map_size, 1, 1]; + let alpha = (settings.slice_alpha * 255.) as u8; + let texels = color_map + .iter() + .flat_map(|color| { + [ + (color.r * 255.) as u8, + (color.g * 255.) as u8, + (color.b * 255.) as u8, + alpha, + ] + }) + .collect::>(); + + let upload_buffer = Buffer::new_slice( + renderer.memory_allocator(), + BufferCreateInfo { + usage: BufferUsage::TRANSFER_SRC, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_HOST + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + (extent[0] * 4) as DeviceSize, + )?; + + upload_buffer.write()?.copy_from_slice(&texels); + + let image = Image::new( + renderer.memory_allocator(), + ImageCreateInfo { + image_type: ImageType::Dim1d, + format: Format::R8G8B8A8_UNORM, + extent, + usage: ImageUsage::TRANSFER_DST | ImageUsage::SAMPLED, + ..Default::default() + }, + AllocationCreateInfo::default(), + )?; + + uploads.copy_buffer_to_image(CopyBufferToImageInfo::buffer_image( + upload_buffer, + image.clone(), + ))?; + + ImageView::new_default(image)? + }; + + uploads + .build()? + .execute(renderer.queue())? + .then_signal_fence_and_flush()? + .wait(None)?; + + let sampler = Sampler::new( + renderer.device(), + SamplerCreateInfo { + mag_filter: Filter::Linear, + min_filter: Filter::Linear, + mipmap_mode: SamplerMipmapMode::Nearest, + address_mode: [SamplerAddressMode::ClampToEdge; 3], + mip_lod_bias: 0.0, + ..Default::default() + }, + )?; + + let layout = pipeline.layout().set_layouts().get(3).unwrap(); + Ok(PersistentDescriptorSet::new( + renderer.descriptor_set_allocator(), + layout.clone(), + [WriteDescriptorSet::image_view_sampler(0, texture, sampler)], + [], + )?) + } + + pub fn init(&mut self, renderer: &Renderer, sources: &SoundSources) -> anyhow::Result<()> { + self.source_drive_buf = Some(Buffer::from_iter( + renderer.memory_allocator(), + BufferCreateInfo { + usage: BufferUsage::STORAGE_BUFFER, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_DEVICE + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + sources.drives().copied(), + )?); + self.source_pos_buf = Some(Buffer::from_iter( + renderer.memory_allocator(), + BufferCreateInfo { + usage: BufferUsage::STORAGE_BUFFER, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_DEVICE + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + sources.positions().copied().map(|p| p.into()), + )?); + Ok(()) + } + + pub fn update( + &mut self, + renderer: &Renderer, + sources: &SoundSources, + settings: &ViewerSettings, + update_flag: &UpdateFlag, + ) -> anyhow::Result<()> { + if update_flag.contains(UpdateFlag::UPDATE_SOURCE_DRIVE) + || update_flag.contains(UpdateFlag::UPDATE_SOURCE_FLAG) + { + self.update_source(sources)?; + } + + if update_flag.contains(UpdateFlag::UPDATE_COLOR_MAP) { + self.color_map_desc_set_pressure = Self::create_color_map_desc_set( + renderer, + self.pipeline_pressure.clone(), + settings, + )?; + } + + Ok(()) + } + + pub fn compute( + &mut self, + renderer: &Renderer, + config: Config, + image: Subbuffer<[[f32; 4]]>, + settings: &ViewerSettings, + ) -> anyhow::Result> { + let pipeline = if settings.show_radiation_pressure { + self.pipeline_radiation.clone() + } else { + self.pipeline_pressure.clone() + }; + + let pipeline_layout = pipeline.layout(); + let layout = pipeline_layout.set_layouts().get(0).unwrap(); + let set_0 = PersistentDescriptorSet::new( + renderer.descriptor_set_allocator(), + layout.clone(), + [WriteDescriptorSet::buffer(0, image)], + [], + )?; + + let layout = pipeline_layout.set_layouts().get(1).unwrap(); + let set_1 = PersistentDescriptorSet::new( + renderer.descriptor_set_allocator(), + layout.clone(), + [WriteDescriptorSet::buffer( + 0, + self.source_pos_buf.clone().unwrap(), + )], + [], + )?; + + let layout = pipeline_layout.set_layouts().get(1).unwrap(); + let set_2 = PersistentDescriptorSet::new( + renderer.descriptor_set_allocator(), + layout.clone(), + [WriteDescriptorSet::buffer( + 0, + self.source_drive_buf.clone().unwrap(), + )], + [], + )?; + + let set_3 = if settings.show_radiation_pressure { + self.color_map_desc_set_radiation.clone() + } else { + self.color_map_desc_set_pressure.clone() + }; + + let mut builder = AutoCommandBufferBuilder::primary( + renderer.command_buffer_allocator(), + renderer.queue().queue_family_index(), + CommandBufferUsage::OneTimeSubmit, + )?; + + builder + .bind_pipeline_compute(pipeline.clone())? + .bind_descriptor_sets( + PipelineBindPoint::Compute, + pipeline_layout.clone(), + 0, + (set_0, set_1, set_2, set_3), + )? + .push_constants(pipeline_layout.clone(), 0, config)? + .dispatch([(config.width - 1) / 32 + 1, (config.height - 1) / 32 + 1, 1])?; + let command_buffer = builder.build()?; + let finished = command_buffer.execute(renderer.queue())?; + Ok(finished.then_signal_fence_and_flush()?.boxed()) + } + + fn update_source(&mut self, sources: &SoundSources) -> anyhow::Result<()> { + if let Some(data) = &mut self.source_drive_buf { + data.write()? + .iter_mut() + .zip(sources.drives()) + .for_each(|(d, &drive)| { + *d = drive; + }); + } + Ok(()) + } + + pub fn update_source_pos(&mut self, sources: &SoundSources) -> anyhow::Result<()> { + if let Some(data) = &mut self.source_pos_buf { + data.write()? + .iter_mut() + .zip(sources.positions()) + .for_each(|(d, &pos)| { + *d = pos.into(); + }); + } + Ok(()) + } +} + +#[allow(clippy::needless_question_mark)] +mod cs_pressure { + vulkano_shaders::shader! { + ty: "compute", + path: "./assets/shaders/pressure.comp" + } +} + +#[allow(clippy::needless_question_mark)] +mod cs_radiation { + vulkano_shaders::shader! { + ty: "compute", + path: "./assets/shaders/pressure.comp", + define: [("RADIATION", "1")] + } +} diff --git a/simulator/src/imgui_renderer.rs b/simulator/src/imgui_renderer.rs new file mode 100644 index 0000000..036630d --- /dev/null +++ b/simulator/src/imgui_renderer.rs @@ -0,0 +1,988 @@ +/* + * File: imgui_renderer.rs + * Project: src + * Created Date: 23/05/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 06/12/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +use std::{ffi::CString, path::PathBuf, time::Instant}; + +use crate::patch::imgui_winit_support::{HiDpiMode, WinitPlatform}; +use autd3_driver::fpga::FPGA_CLK_FREQ; +use autd3_firmware_emulator::CPUEmulator; +use cgmath::{Deg, Euler}; +use chrono::{Local, TimeZone, Utc}; +use imgui::{ + sys::{igDragFloat, igDragFloat2}, + Context, FontConfig, FontGlyphRanges, FontSource, TreeNodeFlags, +}; +use vulkano::{ + command_buffer::{AutoCommandBufferBuilder, PrimaryAutoCommandBuffer}, + image::view::ImageView, +}; +use winit::{event::Event, window::Window}; + +use crate::{ + common::transform::quaternion_to, + patch::imgui_vulkano_renderer, + renderer::Renderer, + sound_sources::SoundSources, + update_flag::UpdateFlag, + viewer_settings::{ColorMapType, ViewerSettings}, + Matrix4, Quaternion, Vector3, Vector4, MILLIMETER, ZPARITY, +}; + +fn get_current_ec_time() -> u64 { + (Local::now().time() - Utc.with_ymd_and_hms(2000, 1, 1, 0, 0, 0).unwrap().time()) + .num_nanoseconds() + .unwrap() as _ +} + +pub struct ImGuiRenderer { + imgui: Context, + platform: WinitPlatform, + imgui_renderer: imgui_vulkano_renderer::Renderer, + last_frame: Instant, + font_size: f32, + hidpi_factor: f32, + do_update_font: bool, + visible: Vec, + enable: Vec, + thermal: Vec, + show_mod_plot: Vec, + mod_plot_size: Vec<[f32; 2]>, + real_time: u64, + time_step: i32, + initial_settings: ViewerSettings, +} + +impl ImGuiRenderer { + pub fn new( + initial_settings: ViewerSettings, + config_path: &Option, + renderer: &Renderer, + ) -> anyhow::Result { + let mut imgui = Context::create(); + if let Some(path) = config_path { + imgui.set_ini_filename(path.join("imgui.ini")); + } + + let mut platform = WinitPlatform::init(&mut imgui); + platform.attach_window(imgui.io_mut(), renderer.window(), HiDpiMode::Default); + + let hidpi_factor = platform.hidpi_factor(); + let font_size = 16.0; + + imgui.io_mut().font_global_scale = (1.0 / hidpi_factor) as f32; + + let imgui_renderer = imgui_vulkano_renderer::Renderer::init( + &mut imgui, + renderer.device(), + renderer.queue(), + renderer.image_format(), + )?; + + Ok(Self { + imgui, + platform, + imgui_renderer, + last_frame: Instant::now(), + font_size, + hidpi_factor: hidpi_factor as _, + do_update_font: true, + visible: Vec::new(), + enable: Vec::new(), + thermal: Vec::new(), + real_time: get_current_ec_time(), + time_step: 1000000, + show_mod_plot: Vec::new(), + mod_plot_size: Vec::new(), + initial_settings, + }) + } + + pub fn init(&mut self, dev_num: usize) { + self.visible = vec![true; dev_num]; + self.enable = vec![true; dev_num]; + self.thermal = vec![false; dev_num]; + self.show_mod_plot = vec![false; dev_num]; + self.mod_plot_size = vec![[200., 50.]; dev_num]; + } + + pub fn resized(&mut self, window: &Window, event: &Event) { + self.platform + .handle_event(self.imgui.io_mut(), window, event); + } + + pub fn prepare_frame(&mut self, window: &Window) -> anyhow::Result<()> { + Ok(self.platform.prepare_frame(self.imgui.io_mut(), window)?) + } + + pub fn update_delta_time(&mut self) { + let now = Instant::now(); + self.imgui + .io_mut() + .update_delta_time(now.duration_since(self.last_frame)); + self.last_frame = now; + } + + pub fn handle_event(&mut self, window: &Window, event: &Event) { + self.platform + .handle_event(self.imgui.io_mut(), window, event); + } + + pub fn update( + &mut self, + cpus: &mut [CPUEmulator], + sources: &mut SoundSources, + body_pointer: &[usize], + render: &Renderer, + builder: &mut AutoCommandBufferBuilder, + settings: &mut ViewerSettings, + ) -> anyhow::Result { + let mut update_flag = UpdateFlag::empty(); + + self.update_font(render)?; + + let io = self.imgui.io_mut(); + + let fps = io.framerate; + + self.platform.prepare_frame(io, render.window())?; + + let system_time = self.system_time(); + let ui = self.imgui.new_frame(); + + { + let rotation = Quaternion::from(Euler { + x: Deg(settings.camera_rot_x), + y: Deg(settings.camera_rot_y), + z: Deg(settings.camera_rot_z), + }); + + let r = rotation * Vector3::unit_x(); + let u = rotation * Vector3::unit_y(); + let f = rotation * Vector3::unit_z(); + + if !ui.io().want_capture_mouse { + let mouse_wheel = ui.io().mouse_wheel; + let trans = -f * mouse_wheel * settings.camera_move_speed * ZPARITY; + settings.camera_pos_x += trans.x; + settings.camera_pos_y += trans.y; + settings.camera_pos_z += trans.z; + } + + if !ui.io().want_capture_mouse { + let mouse_delta = ui.io().mouse_delta; + if ui.io().mouse_down[0] { + if ui.io().key_shift { + let delta_x = mouse_delta[0] * settings.camera_move_speed / 3000.; + let delta_y = mouse_delta[1] * settings.camera_move_speed / 3000.; + let to = -r * delta_x + u * delta_y + f; + let rot = Euler::from(quaternion_to(f, to) * rotation); + settings.camera_rot_x = Deg::from(rot.x).0; + settings.camera_rot_y = Deg::from(rot.y).0; + settings.camera_rot_z = Deg::from(rot.z).0; + } else { + let delta_x = mouse_delta[0] * settings.camera_move_speed / 10.; + let delta_y = mouse_delta[1] * settings.camera_move_speed / 10.; + let trans = -r * delta_x + u * delta_y; + settings.camera_pos_x += trans.x; + settings.camera_pos_y += trans.y; + settings.camera_pos_z += trans.z; + } + } + } + } + + let mut font_size = self.font_size; + let mut update_font = false; + ui.window("Dear ImGui").build(|| { + if let Some(tab_bar) = ui.tab_bar("Settings") { + if let Some(tab) = ui.tab_item("Slice") { + ui.text("Position"); + unsafe { + if igDragFloat( + CString::new("X##Slice").unwrap().as_c_str().as_ptr(), + &mut settings.slice_pos_x as _, + 1. * MILLIMETER, + f32::MIN / 2., + f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ) { + update_flag.set(UpdateFlag::UPDATE_SLICE_POS, true); + } + if igDragFloat( + CString::new("Y##Slice").unwrap().as_c_str().as_ptr(), + &mut settings.slice_pos_y as _, + 1. * MILLIMETER, + f32::MIN / 2., + f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ) { + update_flag.set(UpdateFlag::UPDATE_SLICE_POS, true); + } + if igDragFloat( + CString::new("Z##Slice").unwrap().as_c_str().as_ptr(), + &mut settings.slice_pos_z as _, + 1. * MILLIMETER, + f32::MIN / 2., + f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ) { + update_flag.set(UpdateFlag::UPDATE_SLICE_POS, true); + } + } + ui.separator(); + + ui.text("Rotation"); + unsafe { + if igDragFloat( + CString::new("RX##Slice").unwrap().as_c_str().as_ptr(), + &mut settings.slice_rot_x as _, + 1., + -180., + 180., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ) { + update_flag.set(UpdateFlag::UPDATE_SLICE_POS, true); + } + if igDragFloat( + CString::new("RY##Slice").unwrap().as_c_str().as_ptr(), + &mut settings.slice_rot_y as _, + 1., + -180., + 180., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ) { + update_flag.set(UpdateFlag::UPDATE_SLICE_POS, true); + } + if igDragFloat( + CString::new("RZ##Slice").unwrap().as_c_str().as_ptr(), + &mut settings.slice_rot_z as _, + 1., + -180., + 180., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ) { + update_flag.set(UpdateFlag::UPDATE_SLICE_POS, true); + } + } + ui.separator(); + + ui.text("Size"); + unsafe { + if igDragFloat( + CString::new("Width##Slice").unwrap().as_c_str().as_ptr(), + &mut settings.slice_width as _, + 1. * MILLIMETER, + 1. * MILLIMETER, + 2000. * MILLIMETER, + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ) { + if settings.slice_width < 1. * MILLIMETER { + settings.slice_width = 1. * MILLIMETER; + } + update_flag.set(UpdateFlag::UPDATE_SLICE_SIZE, true); + } + if igDragFloat( + CString::new("Height##Slice").unwrap().as_c_str().as_ptr(), + &mut settings.slice_height as _, + 1. * MILLIMETER, + 1. * MILLIMETER, + 2000. * MILLIMETER, + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ) { + if settings.slice_height < 1. * MILLIMETER { + settings.slice_height = 1. * MILLIMETER; + } + update_flag.set(UpdateFlag::UPDATE_SLICE_SIZE, true); + } + if igDragFloat( + CString::new("Pixel size##Slice") + .unwrap() + .as_c_str() + .as_ptr(), + &mut settings.slice_pixel_size as _, + 1. * MILLIMETER, + 0.1 * MILLIMETER, + 8. * MILLIMETER, + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ) { + if settings.slice_pixel_size < 0.1 * MILLIMETER { + settings.slice_height = 0.1 * MILLIMETER; + } + update_flag.set(UpdateFlag::UPDATE_SLICE_SIZE, true); + } + } + ui.separator(); + + if ui.radio_button_bool("Acoustic", !settings.show_radiation_pressure) { + settings.show_radiation_pressure = false; + } + if ui.radio_button_bool("Radiation", settings.show_radiation_pressure) { + settings.show_radiation_pressure = true; + } + ui.separator(); + + ui.text("Color settings"); + let items = ["Viridis", "Magma", "Inferno", "Plasma"]; + let selected_idx = match settings.color_map_type { + ColorMapType::Viridis => 0, + ColorMapType::Magma => 1, + ColorMapType::Inferno => 2, + ColorMapType::Plasma => 3, + }; + let mut selected = &items[selected_idx]; + if let Some(cb) = ui.begin_combo("Coloring", selected) { + items.iter().for_each(|cur| { + if selected == cur { + ui.set_item_default_focus(); + } + let clicked = + ui.selectable_config(cur).selected(selected == cur).build(); + if clicked { + selected = cur; + } + }); + match *selected { + "Viridis" => { + settings.color_map_type = ColorMapType::Viridis; + update_flag.set(UpdateFlag::UPDATE_COLOR_MAP, true); + } + "Magma" => { + settings.color_map_type = ColorMapType::Magma; + update_flag.set(UpdateFlag::UPDATE_COLOR_MAP, true); + } + "Inferno" => { + settings.color_map_type = ColorMapType::Inferno; + update_flag.set(UpdateFlag::UPDATE_COLOR_MAP, true); + } + "Plasma" => { + settings.color_map_type = ColorMapType::Magma; + update_flag.set(UpdateFlag::UPDATE_COLOR_MAP, true); + } + _ => { + settings.color_map_type = ColorMapType::Inferno; + update_flag.set(UpdateFlag::UPDATE_COLOR_MAP, true); + } + } + cb.end(); + } + unsafe { + igDragFloat( + CString::new("Scale##Slice").unwrap().as_c_str().as_ptr(), + &mut settings.slice_color_scale as _, + 0.1, + 0.0, + std::f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + if igDragFloat( + CString::new("Alpha##Slice").unwrap().as_c_str().as_ptr(), + &mut settings.slice_alpha as _, + 0.01, + 0.0, + 1., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ) { + update_flag.set(UpdateFlag::UPDATE_COLOR_MAP, true); + } + } + ui.separator(); + + if ui.small_button("xy") { + settings.slice_rot_x = 0.; + settings.slice_rot_y = 0.; + settings.slice_rot_z = 0.; + update_flag.set(UpdateFlag::UPDATE_SLICE_POS, true); + } + ui.same_line(); + if ui.small_button("yz") { + settings.slice_rot_x = 0.; + settings.slice_rot_y = 90.; + settings.slice_rot_z = 0.; + update_flag.set(UpdateFlag::UPDATE_SLICE_POS, true); + } + ui.same_line(); + if ui.small_button("zx") { + settings.slice_rot_x = 90.; + settings.slice_rot_y = 0.; + settings.slice_rot_z = 0.; + update_flag.set(UpdateFlag::UPDATE_SLICE_POS, true); + } + + tab.end(); + } + + if let Some(tab) = ui.tab_item("Camera") { + ui.text("Position"); + unsafe { + igDragFloat( + CString::new("X##Camera").unwrap().as_c_str().as_ptr(), + &mut settings.camera_pos_x as _, + 1. * MILLIMETER, + f32::MIN / 2., + f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + igDragFloat( + CString::new("Y##Camera").unwrap().as_c_str().as_ptr(), + &mut settings.camera_pos_y as _, + 1. * MILLIMETER, + f32::MIN / 2., + f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + igDragFloat( + CString::new("Z##Camera").unwrap().as_c_str().as_ptr(), + &mut settings.camera_pos_z as _, + 1. * MILLIMETER, + f32::MIN / 2., + f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + } + ui.separator(); + + ui.text("Rotation"); + unsafe { + igDragFloat( + CString::new("RX##Camera").unwrap().as_c_str().as_ptr(), + &mut settings.camera_rot_x as _, + 1., + -180., + 180., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + igDragFloat( + CString::new("RY##Camera").unwrap().as_c_str().as_ptr(), + &mut settings.camera_rot_y as _, + 1., + -180., + 180., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + igDragFloat( + CString::new("RZ##Camera").unwrap().as_c_str().as_ptr(), + &mut settings.camera_rot_z as _, + 1., + -180., + 180., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + } + ui.separator(); + + unsafe { + igDragFloat( + CString::new("Move speed").unwrap().as_c_str().as_ptr(), + &mut settings.camera_move_speed as _, + 1., + 1. * MILLIMETER, + 100. * MILLIMETER, + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + } + + ui.separator(); + + ui.text("Perspective"); + unsafe { + igDragFloat( + CString::new("FOV").unwrap().as_c_str().as_ptr(), + &mut settings.camera_fov as _, + 1., + 0., + 180., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + igDragFloat( + CString::new("Near clip").unwrap().as_c_str().as_ptr(), + &mut settings.camera_near_clip as _, + 1. * MILLIMETER, + 0., + std::f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + igDragFloat( + CString::new("Far clip").unwrap().as_c_str().as_ptr(), + &mut settings.camera_far_clip as _, + 1. * MILLIMETER, + 0., + std::f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + } + tab.end(); + } + + if let Some(tab) = ui.tab_item("Config") { + unsafe { + if igDragFloat( + CString::new("Sound speed").unwrap().as_c_str().as_ptr(), + &mut settings.sound_speed as _, + 1. * MILLIMETER, + 0., + std::f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ) { + cpus.iter().for_each(|cpu| { + sources + .drives_mut() + .skip(body_pointer[cpu.idx()]) + .for_each(|s| { + s.set_wave_number(40e3, settings.sound_speed); + }); + }); + update_flag.set(UpdateFlag::UPDATE_SOURCE_DRIVE, true); + } + } + ui.separator(); + + unsafe { + if igDragFloat( + CString::new("Font size").unwrap().as_c_str().as_ptr(), + &mut font_size as _, + 1., + 1., + 256., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ) { + update_font = true; + } + } + ui.separator(); + + ui.text("Device index: show/enable/overheat"); + cpus.iter_mut().enumerate().for_each(|(i, cpu)| { + ui.text(format!("Device {}: ", i)); + ui.same_line(); + if ui.checkbox(format!("##show{}", i), &mut self.visible[i]) { + update_flag.set(UpdateFlag::UPDATE_SOURCE_FLAG, true); + let v = if self.visible[i] { 1. } else { 0. }; + sources + .visibilities_mut() + .skip(body_pointer[i]) + .for_each(|s| *s = v); + } + ui.same_line(); + if ui.checkbox(format!("##enable{}", i), &mut self.enable[i]) { + update_flag.set(UpdateFlag::UPDATE_SOURCE_FLAG, true); + let v = if self.enable[i] { 1. } else { 0. }; + sources + .drives_mut() + .skip(body_pointer[i]) + .for_each(|s| s.enable = v); + } + ui.same_line(); + if ui.checkbox(format!("##overheat{}", i), &mut self.thermal[i]) { + update_flag.set(UpdateFlag::UPDATE_DEVICE_INFO, true); + if self.thermal[i] { + cpu.fpga_mut().assert_thermal_sensor(); + } else { + cpu.fpga_mut().deassert_thermal_sensor(); + } + } + }); + ui.separator(); + + if ui.checkbox(format!("View as device"), &mut settings.view_device) {} + if settings.view_device { + ui.text("Light position"); + unsafe { + igDragFloat( + CString::new("X##Light").unwrap().as_c_str().as_ptr(), + &mut settings.light_pos_x as _, + 1. * MILLIMETER, + f32::MIN / 2., + f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + igDragFloat( + CString::new("Y##Light").unwrap().as_c_str().as_ptr(), + &mut settings.light_pos_y as _, + 1. * MILLIMETER, + f32::MIN / 2., + f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + igDragFloat( + CString::new("Z##Light").unwrap().as_c_str().as_ptr(), + &mut settings.light_pos_z as _, + 1. * MILLIMETER, + f32::MIN / 2., + f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + } + ui.separator(); + + ui.text("Light properties"); + unsafe { + igDragFloat( + CString::new("Power").unwrap().as_c_str().as_ptr(), + &mut settings.light_power as _, + 0.1, + 0., + std::f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + igDragFloat( + CString::new("Ambient").unwrap().as_c_str().as_ptr(), + &mut settings.ambient as _, + 0.1, + 0., + std::f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + igDragFloat( + CString::new("Specular").unwrap().as_c_str().as_ptr(), + &mut settings.specular as _, + 0.1, + 0., + std::f32::MAX / 2., + CString::new("%.3f").unwrap().as_c_str().as_ptr(), + 0, + ); + } + } + ui.separator(); + + ui.color_picker4("Background", &mut settings.background); + + tab.end(); + } + + if let Some(tab) = ui.tab_item("Info") { + ui.text(format!("FPS: {:4.2}", fps)); + ui.separator(); + + cpus.iter().for_each(|cpu| { + if ui.collapsing_header( + format!("Device {}", cpu.idx()), + TreeNodeFlags::DEFAULT_OPEN, + ) { + ui.text("Silencer"); + ui.text(format!( + "Step intensity: {}", + cpu.fpga().silencer_step_intensity() + )); + ui.text(format!("Step phase: {}", cpu.fpga().silencer_step_phase())); + + { + ui.separator(); + let m = cpu.fpga().modulation(); + ui.text("Modulation"); + + let mod_size = m.len(); + ui.text(format!("Size: {}", mod_size)); + ui.text(format!( + "Frequency division: {}", + cpu.fpga().modulation_frequency_division() + )); + let sampling_freq = FPGA_CLK_FREQ as f32 + / cpu.fpga().modulation_frequency_division() as f32; + ui.text(format!("Sampling Frequency: {:.3} [Hz]", sampling_freq)); + let sampling_period = 1000000.0 + * cpu.fpga().modulation_frequency_division() as f32 + / FPGA_CLK_FREQ as f32; + ui.text(format!("Sampling period: {:.3} [us]", sampling_period)); + let period = sampling_period * mod_size as f32; + ui.text(format!("Period: {:.3} [us]", period)); + + ui.text(format!( + "Current Index: {}", + Self::mod_idx(system_time, cpu) + )); + + if !m.is_empty() { + ui.text(format!("mod[0]: {}", m[0])); + } + if mod_size == 2 || mod_size == 3 { + ui.text(format!("mod[1]: {}", m[1])); + } else if mod_size > 3 { + ui.text("..."); + } + if mod_size >= 3 { + ui.text(format!("mod[{}]: {}", mod_size - 1, m[mod_size - 1])); + } + + if ui.radio_button_bool( + format!("Show mod plot##{}", cpu.idx()), + self.show_mod_plot[cpu.idx()], + ) { + self.show_mod_plot[cpu.idx()] = !self.show_mod_plot[cpu.idx()]; + } + if self.show_mod_plot[cpu.idx()] { + let mod_v: Vec = + m.iter().map(|&v| v as f32 / 255.0).collect(); + ui.plot_lines(format!("##mod plot{}", cpu.idx()), &mod_v) + .graph_size(self.mod_plot_size[cpu.idx()]) + .scale_min(0.) + .scale_max(1.) + .build(); + } + + if self.show_mod_plot[cpu.idx()] { + unsafe { + igDragFloat2( + CString::new(format!("plot size##{}", cpu.idx())) + .unwrap() + .as_c_str() + .as_ptr(), + self.mod_plot_size[cpu.idx()].as_mut_ptr(), + 1., + 0., + std::f32::MAX / 2., + CString::new("%.0f").unwrap().as_c_str().as_ptr(), + 0, + ); + } + } + } + + if cpu.fpga().is_stm_mode() { + ui.separator(); + + if cpu.fpga().is_stm_gain_mode() { + ui.text("Gain STM"); + } else { + ui.text("Focus STM"); + #[cfg(feature = "use_meter")] + ui.text(format!( + "Sound speed: {:.3} [m/s]", + cpu.fpga().sound_speed() as f32 / 1024.0 + )); + #[cfg(not(feature = "use_meter"))] + ui.text(format!( + "Sound speed: {:.3} [mm/s]", + cpu.fpga().sound_speed() as f32 * 1000. / 1024.0 + )); + } + + if let Some(start_idx) = cpu.fpga().stm_start_idx() { + ui.text(format!("Start idx: {}", start_idx)); + } + if let Some(finish_idx) = cpu.fpga().stm_finish_idx() { + ui.text(format!("Finish idx: {}", finish_idx)); + } + + let stm_size = cpu.fpga().stm_cycle(); + ui.text(format!("Size: {}", stm_size)); + ui.text(format!( + "Frequency division: {}", + cpu.fpga().stm_frequency_division() + )); + let sampling_freq = FPGA_CLK_FREQ as f32 + / cpu.fpga().stm_frequency_division() as f32; + ui.text(format!("Sampling Frequency: {:.3} [Hz]", sampling_freq)); + let sampling_period = 1000000.0 + * cpu.fpga().stm_frequency_division() as f32 + / FPGA_CLK_FREQ as f32; + ui.text(format!("Sampling period: {:.3} [us]", sampling_period)); + let period = sampling_period / stm_size as f32; + ui.text(format!("Period: {:.3} [us]", period)); + + ui.text(format!( + "Current Index: {}", + Self::stm_idx(system_time, cpu) + )); + } + } + }); + + ui.separator(); + + if ui.checkbox("Mod enable", &mut settings.mod_enable) { + update_flag.set(UpdateFlag::UPDATE_SOURCE_DRIVE, true); + } + + ui.checkbox("Auto play", &mut settings.auto_play); + + ui.text(format!("System time: {} [ns]", self.real_time)); + if settings.auto_play { + unsafe { + igDragFloat( + CString::new("Time scale").unwrap().as_c_str().as_ptr(), + &mut settings.time_scale as _, + 0.1, + 0., + std::f32::MAX, + std::ptr::null(), + 0, + ); + } + } else { + ui.same_line(); + if ui.button("+") { + self.real_time = + self.real_time.wrapping_add_signed(self.time_step as _); + update_flag.set(UpdateFlag::UPDATE_SOURCE_DRIVE, true); + } + ui.input_int("time step", &mut self.time_step) + .always_insert_mode(true) + .build(); + } + + tab.end(); + } + + tab_bar.end(); + } + + ui.separator(); + ui.text("Save image as file"); + ui.input_text("path to image", &mut settings.image_save_path) + .build(); + if ui.small_button("save") { + update_flag.set(UpdateFlag::SAVE_IMAGE, true); + } + + ui.separator(); + + if ui.small_button("Auto") { + let rot = settings.slice_rotation(); + let sr = Matrix4::from(rot); + let srf = sr * Vector4::new(0.0, 0.0, 1.0 * ZPARITY, 1.0); + + let camera_pos = settings.slice_pos() + srf.truncate() * 600.0 * MILLIMETER; + settings.set_camera_pos(camera_pos); + settings.set_camera_rot(settings.slice_rotation()); + } + ui.same_line(); + if ui.small_button("Reset") { + update_flag.set(UpdateFlag::all(), true); + update_flag.remove(UpdateFlag::SAVE_IMAGE); + *settings = self.initial_settings.clone(); + } + ui.same_line(); + if ui.small_button("Default") { + update_flag.set(UpdateFlag::all(), true); + update_flag.remove(UpdateFlag::SAVE_IMAGE); + *settings = Default::default(); + } + }); + + if settings.auto_play { + update_flag.set(UpdateFlag::UPDATE_SOURCE_DRIVE, true); + self.real_time = (get_current_ec_time() as f64 * settings.time_scale as f64) as _; + } + + self.font_size = font_size; + self.do_update_font = update_font; + + self.platform.prepare_render(ui, render.window()); + let draw_data = self.imgui.render(); + self.imgui_renderer.draw_commands( + builder, + render.queue(), + ImageView::new_default(render.image())?, + draw_data, + )?; + + Ok(update_flag) + } + + pub(crate) fn waiting( + &mut self, + render: &Renderer, + builder: &mut AutoCommandBufferBuilder, + ) -> anyhow::Result<()> { + self.update_font(render)?; + + let io = self.imgui.io_mut(); + + self.platform.prepare_frame(io, render.window())?; + + let ui = self.imgui.new_frame(); + + ui.window("Dear ImGui").build(|| { + ui.text("Waiting for client connection..."); + }); + + self.platform.prepare_render(ui, render.window()); + let draw_data = self.imgui.render(); + self.imgui_renderer.draw_commands( + builder, + render.queue(), + ImageView::new_default(render.image())?, + draw_data, + )?; + + Ok(()) + } + + fn update_font(&mut self, render: &Renderer) -> anyhow::Result<()> { + if self.do_update_font { + self.imgui.fonts().clear(); + self.imgui.fonts().add_font(&[FontSource::TtfData { + data: include_bytes!("../assets/fonts/NotoSans-Regular.ttf"), + size_pixels: self.font_size * self.hidpi_factor, + config: Some(FontConfig { + rasterizer_multiply: 1., + glyph_ranges: FontGlyphRanges::default(), + ..FontConfig::default() + }), + }]); + self.imgui_renderer.reload_font_texture( + &mut self.imgui, + render.device(), + render.queue(), + )?; + self.do_update_font = false; + } + Ok(()) + } + + pub(crate) const fn system_time(&self) -> u64 { + ((self.real_time as u128 * autd3_driver::fpga::FPGA_CLK_FREQ as u128) / 1000000000) as _ + } + + pub(crate) fn stm_idx(system_time: u64, cpu: &CPUEmulator) -> usize { + (system_time / cpu.fpga().stm_frequency_division() as u64) as usize % cpu.fpga().stm_cycle() + } + + pub(crate) fn mod_idx(system_time: u64, cpu: &CPUEmulator) -> usize { + (system_time / cpu.fpga().modulation_frequency_division() as u64) as usize + % cpu.fpga().modulation_cycle() + } + + pub(crate) fn visible(&self) -> &[bool] { + &self.visible + } +} diff --git a/simulator/src/lib.rs b/simulator/src/lib.rs new file mode 100644 index 0000000..b9b5c1d --- /dev/null +++ b/simulator/src/lib.rs @@ -0,0 +1,48 @@ +/* + * File: lib.rs + * Project: src + * Created Date: 17/12/2021 + * Author: Shun Suzuki + * ----- + * Last Modified: 14/10/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2022 Hapis Lab. All rights reserved. + * + */ + +mod camera_helper; +mod common; +mod device_viewer; +mod field_compute_pipeline; +mod imgui_renderer; +mod log_formatter; +mod patch; +mod renderer; +mod simulator; +mod slice_viewer; +mod sound_sources; +mod trans_viewer; +mod update_flag; +mod viewer_settings; + +pub use log_formatter::LogFormatter; +pub use simulator::Simulator; +pub use viewer_settings::ViewerSettings; + +pub use renderer::available_gpus; + +pub type Vector2 = cgmath::Vector2; +pub type Vector3 = cgmath::Vector3; +pub type Vector4 = cgmath::Vector4; +pub type Quaternion = cgmath::Quaternion; +pub type Matrix3 = cgmath::Matrix3; +pub type Matrix4 = cgmath::Matrix4; + +const METER: f32 = autd3::prelude::METER as f32; +const MILLIMETER: f32 = autd3::prelude::MILLIMETER as f32; + +#[cfg(feature = "left_handed")] +pub(crate) const ZPARITY: f32 = -1.; +#[cfg(not(feature = "left_handed"))] +pub(crate) const ZPARITY: f32 = 1.; diff --git a/simulator/src/log_formatter.rs b/simulator/src/log_formatter.rs new file mode 100644 index 0000000..238a844 --- /dev/null +++ b/simulator/src/log_formatter.rs @@ -0,0 +1,60 @@ +/* + * File: log_formatter.rs + * Project: autd-server + * Created Date: 14/10/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 30/10/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +use tracing_core::{Event, Subscriber}; +use tracing_subscriber::fmt::{ + format::{self, FormatEvent, FormatFields}, + FmtContext, FormattedFields, +}; +use tracing_subscriber::registry::LookupSpan; + +pub struct LogFormatter; + +impl FormatEvent for LogFormatter +where + S: Subscriber + for<'a> LookupSpan<'a>, + N: for<'a> FormatFields<'a> + 'static, +{ + fn format_event( + &self, + ctx: &FmtContext<'_, S, N>, + mut writer: format::Writer<'_>, + event: &Event<'_>, + ) -> std::fmt::Result { + let metadata = event.metadata(); + write!( + &mut writer, + " {} {:<6}", + chrono::Local::now().format("%Y-%m-%d %H:%M:%S"), + metadata.level(), + )?; + + if let Some(scope) = ctx.event_scope() { + for span in scope.from_root() { + write!(writer, "{}", span.name())?; + + let ext = span.extensions(); + let fields = &ext.get::>().unwrap(); + + if !fields.is_empty() { + write!(writer, "{{{}}}", fields)?; + } + write!(writer, ": ")?; + } + } + + ctx.field_format().format_fields(writer.by_ref(), event)?; + + writeln!(writer) + } +} diff --git a/simulator/src/main.rs b/simulator/src/main.rs new file mode 100644 index 0000000..170321c --- /dev/null +++ b/simulator/src/main.rs @@ -0,0 +1,170 @@ +/* + * File: main.rs + * Project: src + * Created Date: 28/05/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 30/10/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +use std::{ + error::Error, + fs::{self, File, OpenOptions}, + io::{BufReader, Write}, + path::Path, +}; + +use simulator::{LogFormatter, Simulator, ViewerSettings}; + +use clap::{Args, Parser, Subcommand}; + +fn parse_key_val(s: &str) -> Result<(T, U), Box> +where + T: std::str::FromStr, + T::Err: Error + Send + Sync + 'static, + U: std::str::FromStr, + U::Err: Error + Send + Sync + 'static, +{ + let pos = s + .find(',') + .ok_or_else(|| format!("no `,` found in `{s}`"))?; + Ok((s[..pos].parse()?, s[pos + 1..].parse()?)) +} + +#[derive(Parser)] +#[command(author, version, about, long_about = None)] +#[command( + help_template = "Author: {author-with-newline} {about-section}Version: {version} \n\n {usage-heading} {usage} \n\n {all-args} {tab}" +)] +struct Cli { + #[command(subcommand)] + command: Commands, +} + +#[derive(Args)] +struct Arg { + /// Windows Size (Optional, if set, overrides settings from file) + #[arg(short = 'w', long = "window_size", value_name = "Width,Height" , value_parser = parse_key_val::)] + window_size: Option<(u32, u32)>, + + /// Port (Optional, if set, overrides settings from file) + #[arg(short = 'p', long = "port")] + port: Option, + + /// Vsync (Optional, if set, overrides settings from file) + #[arg(short = 'v', long = "vsync")] + vsync: Option, + + /// GPU index (Optional, if set, overrides settings from file.) + #[arg(short = 'g', long = "gpu_idx")] + index: Option, + + /// Config file path + #[arg(long = "config_path")] + config_path: Option, + + /// Setting file name + #[arg(short = 's', long = "setting", default_value = "settings.json")] + setting: String, + + /// Debug mode + #[arg(short = 'd', long = "debug", default_value = "false")] + debug: bool, +} + +#[derive(Subcommand)] +enum Commands { + /// Run simulator + Run(Arg), + /// List available GPUs + List, +} + +fn main() -> anyhow::Result<()> { + let cli = Cli::parse(); + + match &cli.command { + Commands::List => { + simulator::available_gpus()? + .iter() + .for_each(|(idx, name, ty)| { + println!("\t{}: {} (type {:?})", idx, name, ty); + }); + } + Commands::Run(arg) => { + let port = arg.port; + let gpu_idx = arg.index; + let window_size = arg.window_size; + let settings_path = if let Some(path) = &arg.config_path { + Path::new(path).join(&arg.setting) + } else { + Path::new(&arg.setting).to_owned() + }; + let vsync = arg.vsync; + + let mut fmt = tracing_subscriber::fmt(); + if arg.debug { + fmt = fmt.with_max_level(tracing::Level::DEBUG); + } + fmt.event_format(LogFormatter).init(); + + let settings: ViewerSettings = if settings_path.exists() { + let file = File::open(&settings_path)?; + let reader = BufReader::new(file); + serde_json::from_reader(reader)? + } else { + Default::default() + }; + + let mut simulator = Simulator::new().with_settings(settings); + + if let Some(port) = port { + simulator = simulator.with_port(port); + } + + if let Some(gpu_idx) = gpu_idx { + simulator = simulator.with_gpu_idx(gpu_idx); + } + + if let Some((width, height)) = window_size { + simulator = simulator.with_window_size(width, height); + } + + if let Some(vsync) = vsync { + simulator = simulator.with_vsync(vsync); + } + + if let Some(path) = &arg.config_path { + simulator = simulator.with_config_path(path); + } + + simulator.run()?; + + { + let settings = simulator.get_settings(); + + let settings_str = serde_json::to_string_pretty(settings)?; + + if settings_path.exists() { + fs::remove_file(&settings_path)?; + } + + std::fs::create_dir_all(settings_path.parent().unwrap())?; + + let mut file = OpenOptions::new() + .create_new(true) + .write(true) + .append(false) + .open(&settings_path)?; + + write!(file, "{}", settings_str)?; + } + } + } + + Ok(()) +} diff --git a/simulator/src/patch/imgui_vulkano_renderer/mod.rs b/simulator/src/patch/imgui_vulkano_renderer/mod.rs new file mode 100644 index 0000000..bef58bf --- /dev/null +++ b/simulator/src/patch/imgui_vulkano_renderer/mod.rs @@ -0,0 +1,498 @@ +mod shader; + +use std::{convert::TryInto, fmt, sync::Arc}; + +use bytemuck::{Pod, Zeroable}; +use imgui::{internal::RawWrapper, DrawCmd, DrawCmdParams, DrawIdx, DrawVert, TextureId, Textures}; +use vulkano::{ + buffer::{ + allocator::{SubbufferAllocator, SubbufferAllocatorCreateInfo}, + Buffer, BufferCreateInfo, BufferUsage, Subbuffer, + }, + command_buffer::{ + allocator::StandardCommandBufferAllocator, AutoCommandBufferBuilder, CommandBufferUsage, + CopyBufferToImageInfo, PrimaryAutoCommandBuffer, PrimaryCommandBufferAbstract, + RenderPassBeginInfo, SubpassBeginInfo, + }, + descriptor_set::{ + allocator::StandardDescriptorSetAllocator, PersistentDescriptorSet, WriteDescriptorSet, + }, + device::{Device, Queue}, + format::Format, + image::{ + sampler::{Sampler, SamplerCreateInfo}, + view::ImageView, + Image, ImageCreateInfo, ImageType, ImageUsage, + }, + memory::allocator::{AllocationCreateInfo, MemoryTypeFilter, StandardMemoryAllocator}, + pipeline::{ + graphics::{ + color_blend::{AttachmentBlend, ColorBlendAttachmentState, ColorBlendState}, + input_assembly::InputAssemblyState, + multisample::MultisampleState, + rasterization::RasterizationState, + vertex_input::{Vertex, VertexDefinition}, + viewport::{Scissor, Viewport, ViewportState}, + GraphicsPipelineCreateInfo, + }, + layout::PipelineDescriptorSetLayoutCreateInfo, + DynamicState, GraphicsPipeline, Pipeline, PipelineBindPoint, PipelineLayout, + PipelineShaderStageCreateInfo, + }, + render_pass::{Framebuffer, FramebufferCreateInfo, RenderPass, Subpass}, + sync::GpuFuture, + DeviceSize, +}; + +#[repr(C)] +#[derive(Default, Debug, Clone, Copy, Pod, Zeroable, Vertex)] +struct ImguiVertex { + #[format(R32G32_SFLOAT)] + pub pos: [f32; 2], + #[format(R32G32_SFLOAT)] + pub uv: [f32; 2], + #[format(R32_UINT)] + pub col: u32, +} + +impl From for ImguiVertex { + fn from(v: DrawVert) -> ImguiVertex { + unsafe { std::mem::transmute(v) } + } +} + +#[derive(Debug)] +pub enum RendererError { + BadTexture(TextureId), +} + +impl fmt::Display for RendererError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::BadTexture(ref t) => { + write!(f, "The Texture ID could not be found: {:?}", t) + } + } + } +} + +impl std::error::Error for RendererError {} + +pub type Texture = (Arc, Arc); + +pub struct Renderer { + render_pass: Arc, + pipeline: Arc, + font_texture: Texture, + textures: Textures, + vrt_buffer_pool: SubbufferAllocator, + idx_buffer_pool: SubbufferAllocator, + transform_buffer_pool: SubbufferAllocator, +} + +impl Renderer { + /// Initialize the renderer object, including vertex buffers, ImGui font textures, + /// and the Vulkan graphics pipeline. + /// + /// --- + /// + /// `ctx`: the ImGui `Context` object + /// + /// `device`: the Vulkano `Device` object for the device you want to render the UI on. + /// + /// `queue`: the Vulkano `Queue` object for the queue the font atlas texture will be created on. + /// + /// `format`: the Vulkano `Format` that the render pass will use when storing the frame in the target image. + pub fn init( + ctx: &mut imgui::Context, + device: Arc, + queue: Arc, + format: Format, + ) -> anyhow::Result { + let vs = shader::vs::load(device.clone())? + .entry_point("main") + .unwrap(); + let fs = shader::fs::load(device.clone())? + .entry_point("main") + .unwrap(); + + let render_pass = vulkano::single_pass_renderpass!( + device.clone(), + attachments: { + color: { + format: format, + samples: 1, + load_op: Load, + store_op: Store, + } + }, + pass: { + color: [color], + depth_stencil: {} + } + )?; + + let vertex_input_state = + ImguiVertex::per_vertex().definition(&vs.info().input_interface)?; + let stages = [ + PipelineShaderStageCreateInfo::new(vs), + PipelineShaderStageCreateInfo::new(fs), + ]; + let layout = PipelineLayout::new( + device.clone(), + PipelineDescriptorSetLayoutCreateInfo::from_stages(&stages) + .into_pipeline_layout_create_info(device.clone())?, + )?; + let subpass = Subpass::from(render_pass.clone(), 0).unwrap(); + let pipeline = GraphicsPipeline::new( + device.clone(), + None, + GraphicsPipelineCreateInfo { + stages: stages.into_iter().collect(), + vertex_input_state: Some(vertex_input_state), + input_assembly_state: Some(InputAssemblyState { + ..Default::default() + }), + viewport_state: Some(ViewportState::default()), + rasterization_state: Some(RasterizationState::default()), + color_blend_state: Some(ColorBlendState::with_attachment_states( + subpass.num_color_attachments(), + ColorBlendAttachmentState { + blend: Some(AttachmentBlend::alpha()), + ..Default::default() + }, + )), + multisample_state: Some(MultisampleState { + ..MultisampleState::default() + }), + dynamic_state: [DynamicState::Viewport, DynamicState::Scissor] + .into_iter() + .collect(), + subpass: Some(subpass.into()), + ..GraphicsPipelineCreateInfo::layout(layout) + }, + )?; + + let textures = Textures::new(); + + let font_texture = Self::upload_font_texture(ctx.fonts(), device.clone(), queue)?; + + ctx.set_renderer_name(Some(format!( + "imgui-vulkano-renderer {}", + env!("CARGO_PKG_VERSION") + ))); + + let memory_allocator = Arc::new(StandardMemoryAllocator::new_default(device.clone())); + let vrt_buffer_pool = SubbufferAllocator::new( + memory_allocator.clone(), + SubbufferAllocatorCreateInfo { + buffer_usage: BufferUsage::VERTEX_BUFFER, + memory_type_filter: MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..SubbufferAllocatorCreateInfo::default() + }, + ); + let idx_buffer_pool = SubbufferAllocator::new( + memory_allocator.clone(), + SubbufferAllocatorCreateInfo { + buffer_usage: BufferUsage::INDEX_BUFFER, + memory_type_filter: MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..SubbufferAllocatorCreateInfo::default() + }, + ); + let transform_buffer_pool = SubbufferAllocator::new( + memory_allocator.clone(), + SubbufferAllocatorCreateInfo { + buffer_usage: BufferUsage::UNIFORM_BUFFER, + memory_type_filter: MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..SubbufferAllocatorCreateInfo::default() + }, + ); + + Ok(Renderer { + render_pass, + pipeline, + font_texture, + textures, + vrt_buffer_pool, + idx_buffer_pool, + transform_buffer_pool, + }) + } + + /// Appends the draw commands for the UI frame to an `AutoCommandBufferBuilder`. + /// + /// --- + /// + /// `cmd_buf_builder`: An `AutoCommandBufferBuilder` from vulkano to add commands to + /// + /// `device`: the Vulkano `Device` object for the device you want to render the UI on + /// + /// `queue`: the Vulkano `Queue` object for buffer creation + /// + /// `target`: the target image to render to + /// + /// `draw_data`: the ImGui `DrawData` that each UI frame creates + pub fn draw_commands( + &mut self, + cmd_buf_builder: &mut AutoCommandBufferBuilder, + queue: Arc, + target: Arc, + draw_data: &imgui::DrawData, + ) -> anyhow::Result<()> { + let fb_width = draw_data.display_size[0] * draw_data.framebuffer_scale[0]; + let fb_height = draw_data.display_size[1] * draw_data.framebuffer_scale[1]; + if !(fb_width > 0.0 && fb_height > 0.0) { + return Ok(()); + } + let left = draw_data.display_pos[0]; + let right = draw_data.display_pos[0] + draw_data.display_size[0]; + let top = draw_data.display_pos[1]; + let bottom = draw_data.display_pos[1] + draw_data.display_size[1]; + + let descriptor_set_allocator = + StandardDescriptorSetAllocator::new(queue.device().clone(), Default::default()); + + let transform_data = [ + [(2.0 / (right - left)), 0.0, 0.0, 0.0], + [0.0, (2.0 / (bottom - top)), 0.0, 0.0], + [0.0, 0.0, -1.0, 0.0], + [ + (right + left) / (left - right), + (top + bottom) / (top - bottom), + 0.0, + 1.0, + ], + ]; + + let transform_subbuffer = self.transform_buffer_pool.allocate_sized()?; + *transform_subbuffer.write()? = transform_data; + + let extent = target.image().extent(); + + let clip_off = draw_data.display_pos; + let clip_scale = draw_data.framebuffer_scale; + + let layout = self.pipeline.layout().set_layouts()[0].clone(); + + let framebuffer = Framebuffer::new( + self.render_pass.clone(), + FramebufferCreateInfo { + attachments: vec![target], + ..Default::default() + }, + )?; + + cmd_buf_builder.begin_render_pass( + RenderPassBeginInfo { + clear_values: vec![None], + ..RenderPassBeginInfo::framebuffer(framebuffer) + }, + SubpassBeginInfo::default(), + )?; + + for draw_list in draw_data.draw_lists() { + let vertex_subbuffer: Subbuffer<[ImguiVertex]> = self + .vrt_buffer_pool + .allocate_unsized(draw_list.vtx_buffer().len() as _)?; + for (b, v) in vertex_subbuffer + .write()? + .iter_mut() + .zip(draw_list.vtx_buffer().iter()) + { + *b = ImguiVertex::from(*v); + } + + let index_subbuffer: Subbuffer<[DrawIdx]> = self + .idx_buffer_pool + .allocate_unsized(draw_list.idx_buffer().len() as _)?; + for (b, &v) in index_subbuffer + .write()? + .iter_mut() + .zip(draw_list.idx_buffer().iter()) + { + *b = v; + } + + for cmd in draw_list.commands() { + match cmd { + DrawCmd::Elements { + count, + cmd_params: + DrawCmdParams { + clip_rect, + texture_id, + vtx_offset, + idx_offset, + .. + }, + } => { + let clip_rect = [ + (clip_rect[0] - clip_off[0]) * clip_scale[0], + (clip_rect[1] - clip_off[1]) * clip_scale[1], + (clip_rect[2] - clip_off[0]) * clip_scale[0], + (clip_rect[3] - clip_off[1]) * clip_scale[1], + ]; + + if clip_rect[0] < fb_width + && clip_rect[1] < fb_height + && clip_rect[2] >= 0.0 + && clip_rect[3] >= 0.0 + { + let tex = self.lookup_texture(texture_id)?; + + let set = PersistentDescriptorSet::new( + &descriptor_set_allocator, + layout.clone(), + [ + WriteDescriptorSet::buffer(0, transform_subbuffer.clone()), + WriteDescriptorSet::image_view_sampler( + 1, + tex.0.clone(), + tex.1.clone(), + ), + ], + [], + )?; + + let viewports = vec![Viewport { + offset: [0.0, 0.0], + extent: [extent[0] as f32, extent[1] as f32], + depth_range: 0.0..=1.0, + }]; + let scissors = vec![Scissor { + offset: [ + f32::max(0.0, clip_rect[0]).floor() as u32, + f32::max(0.0, clip_rect[1]).floor() as u32, + ], + extent: [ + (clip_rect[2] - clip_rect[0]).abs().ceil() as u32, + (clip_rect[3] - clip_rect[1]).abs().ceil() as u32, + ], + }]; + cmd_buf_builder + .set_viewport(0, viewports.into_iter().collect())? + .bind_pipeline_graphics(self.pipeline.clone())? + .bind_descriptor_sets( + PipelineBindPoint::Graphics, + self.pipeline.layout().clone(), + 0, + set.clone(), + )? + .bind_vertex_buffers(0, vertex_subbuffer.clone())? + .bind_index_buffer(index_subbuffer.clone())? + .set_scissor(0, scissors.into_iter().collect())? + .draw_indexed(count as _, 1, idx_offset as _, vtx_offset as _, 0)?; + } + } + DrawCmd::ResetRenderState => (), // TODO + DrawCmd::RawCallback { callback, raw_cmd } => unsafe { + callback(draw_list.raw(), raw_cmd) + }, + } + } + } + cmd_buf_builder.end_render_pass(Default::default())?; + + Ok(()) + } + + /// Update the ImGui font atlas texture. + /// + /// --- + /// + /// `ctx`: the ImGui `Context` object + /// + /// `device`: the Vulkano `Device` object for the device you want to render the UI on. + /// + /// `queue`: the Vulkano `Queue` object for the queue the font atlas texture will be created on. + pub fn reload_font_texture( + &mut self, + ctx: &mut imgui::Context, + device: Arc, + queue: Arc, + ) -> anyhow::Result<()> { + self.font_texture = Self::upload_font_texture(ctx.fonts(), device, queue)?; + Ok(()) + } + + /// Get the texture library that the renderer uses + pub fn textures(&mut self) -> &mut Textures { + &mut self.textures + } + + fn upload_font_texture( + fonts: &mut imgui::FontAtlas, + device: Arc, + queue: Arc, + ) -> anyhow::Result { + let command_buffer_allocator = + StandardCommandBufferAllocator::new(queue.device().clone(), Default::default()); + + let memory_allocator = + Arc::new(StandardMemoryAllocator::new_default(queue.device().clone())); + + let texture = fonts.build_rgba32_texture(); + + let upload_buffer = Buffer::new_slice( + memory_allocator.clone(), + BufferCreateInfo { + usage: BufferUsage::TRANSFER_SRC, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_HOST + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + (texture.width * texture.height * 4) as DeviceSize, + )?; + + upload_buffer.write()?.copy_from_slice(&texture.data); + + let mut uploads = AutoCommandBufferBuilder::primary( + &command_buffer_allocator, + queue.queue_family_index(), + CommandBufferUsage::OneTimeSubmit, + )?; + + let extent = [texture.width, texture.height, 1]; + let image = Image::new( + memory_allocator, + ImageCreateInfo { + image_type: ImageType::Dim2d, + format: Format::R8G8B8A8_SRGB, + extent, + usage: ImageUsage::TRANSFER_DST | ImageUsage::SAMPLED, + mip_levels: 1, + ..Default::default() + }, + AllocationCreateInfo::default(), + )?; + + uploads.copy_buffer_to_image(CopyBufferToImageInfo::buffer_image( + upload_buffer, + image.clone(), + ))?; + + uploads + .build()? + .execute(queue.clone())? + .then_signal_fence_and_flush()? + .wait(None)?; + + let sampler = Sampler::new(device, SamplerCreateInfo::simple_repeat_linear())?; + + fonts.tex_id = TextureId::from(usize::MAX); + Ok((ImageView::new_default(image)?, sampler)) + } + + fn lookup_texture(&self, texture_id: TextureId) -> Result<&Texture, RendererError> { + if texture_id.id() == usize::MAX { + Ok(&self.font_texture) + } else if let Some(texture) = self.textures.get(texture_id) { + Ok(texture) + } else { + Err(RendererError::BadTexture(texture_id)) + } + } +} diff --git a/simulator/src/patch/imgui_vulkano_renderer/shader.rs b/simulator/src/patch/imgui_vulkano_renderer/shader.rs new file mode 100644 index 0000000..e291a71 --- /dev/null +++ b/simulator/src/patch/imgui_vulkano_renderer/shader.rs @@ -0,0 +1,13 @@ +pub mod vs { + vulkano_shaders::shader! { + ty: "vertex", + path: "src/patch/imgui_vulkano_renderer/shaders/shader.vert", + } +} + +pub mod fs { + vulkano_shaders::shader! { + ty: "fragment", + path: "src/patch/imgui_vulkano_renderer/shaders/shader.frag", + } +} diff --git a/simulator/src/patch/imgui_vulkano_renderer/shaders/shader.frag b/simulator/src/patch/imgui_vulkano_renderer/shaders/shader.frag new file mode 100644 index 0000000..49ec5e9 --- /dev/null +++ b/simulator/src/patch/imgui_vulkano_renderer/shaders/shader.frag @@ -0,0 +1,12 @@ +#version 450 + +layout(set=0, binding=1) uniform sampler2D tex; + +layout(location = 0) in vec2 f_uv; +layout(location = 1) in vec4 f_color; + +layout(location = 0) out vec4 Target0; + +void main() { + Target0 = f_color * texture(tex, f_uv.st); +} \ No newline at end of file diff --git a/simulator/src/patch/imgui_vulkano_renderer/shaders/shader.vert b/simulator/src/patch/imgui_vulkano_renderer/shaders/shader.vert new file mode 100644 index 0000000..e13fbb1 --- /dev/null +++ b/simulator/src/patch/imgui_vulkano_renderer/shaders/shader.vert @@ -0,0 +1,21 @@ +#version 450 + +layout(set=0, binding=0) uniform VertPC { + mat4 matrix; +}; + +layout(location = 0) in vec2 pos; +layout(location = 1) in vec2 uv; +layout(location = 2) in uint col; + +layout(location = 0) out vec2 f_uv; +layout(location = 1) out vec4 f_color; + +// Built-in: +// vec4 gl_Position + +void main() { + f_uv = uv; + f_color = unpackUnorm4x8(col); + gl_Position = matrix * vec4(pos.xy, 0, 1); +} \ No newline at end of file diff --git a/simulator/src/patch/imgui_winit_support.rs b/simulator/src/patch/imgui_winit_support.rs new file mode 100644 index 0000000..39e2900 --- /dev/null +++ b/simulator/src/patch/imgui_winit_support.rs @@ -0,0 +1,508 @@ +use imgui::{self, BackendFlags, ConfigFlags, Context, Io, Key, Ui}; +use std::cmp::Ordering; + +// Re-export winit to make it easier for users to use the correct version. +pub use winit; +use winit::dpi::{LogicalPosition, LogicalSize}; + +use winit::{ + error::ExternalError, + event::{ + DeviceEvent, ElementState, Event, KeyboardInput, MouseButton, MouseScrollDelta, TouchPhase, + VirtualKeyCode, WindowEvent, + }, + window::{CursorIcon as MouseCursor, Window}, +}; + +/// winit backend platform state +#[derive(Debug)] +pub struct WinitPlatform { + hidpi_mode: ActiveHiDpiMode, + hidpi_factor: f64, + cursor_cache: Option, +} + +#[derive(Debug, Copy, Clone, Eq, PartialEq)] +struct CursorSettings { + cursor: Option, + draw_cursor: bool, +} + +fn to_winit_cursor(cursor: imgui::MouseCursor) -> MouseCursor { + match cursor { + imgui::MouseCursor::Arrow => MouseCursor::Default, + imgui::MouseCursor::TextInput => MouseCursor::Text, + imgui::MouseCursor::ResizeAll => MouseCursor::Move, + imgui::MouseCursor::ResizeNS => MouseCursor::NsResize, + imgui::MouseCursor::ResizeEW => MouseCursor::EwResize, + imgui::MouseCursor::ResizeNESW => MouseCursor::NeswResize, + imgui::MouseCursor::ResizeNWSE => MouseCursor::NwseResize, + imgui::MouseCursor::Hand => MouseCursor::Hand, + imgui::MouseCursor::NotAllowed => MouseCursor::NotAllowed, + } +} + +impl CursorSettings { + fn apply(&self, window: &Window) { + match self.cursor { + Some(mouse_cursor) if !self.draw_cursor => { + window.set_cursor_visible(true); + window.set_cursor_icon(to_winit_cursor(mouse_cursor)); + } + _ => window.set_cursor_visible(false), + } + } +} + +#[derive(Copy, Clone, Debug, PartialEq)] +enum ActiveHiDpiMode { + Default, + Rounded, + Locked, +} + +/// DPI factor handling mode. +/// +/// Applications that use imgui-rs might want to customize the used DPI factor and not use +/// directly the value coming from winit. +/// +/// **Note: if you use a mode other than default and the DPI factor is adjusted, winit and imgui-rs +/// will use different logical coordinates, so be careful if you pass around logical size or +/// position values.** +#[derive(Copy, Clone, Debug, PartialEq)] +pub enum HiDpiMode { + /// The DPI factor from winit is used directly without adjustment + Default, + /// The DPI factor from winit is rounded to an integer value. + /// + /// This prevents the user interface from becoming blurry with non-integer scaling. + Rounded, + /// The DPI factor from winit is ignored, and the included value is used instead. + /// + /// This is useful if you want to force some DPI factor (e.g. 1.0) and not care about the value + /// coming from winit. + Locked(f64), +} + +impl HiDpiMode { + fn apply(&self, hidpi_factor: f64) -> (ActiveHiDpiMode, f64) { + match *self { + HiDpiMode::Default => (ActiveHiDpiMode::Default, hidpi_factor), + HiDpiMode::Rounded => (ActiveHiDpiMode::Rounded, hidpi_factor.round()), + HiDpiMode::Locked(value) => (ActiveHiDpiMode::Locked, value), + } + } +} + +fn to_imgui_mouse_button(button: MouseButton) -> Option { + match button { + MouseButton::Left | MouseButton::Other(0) => Some(imgui::MouseButton::Left), + MouseButton::Right | MouseButton::Other(1) => Some(imgui::MouseButton::Right), + MouseButton::Middle | MouseButton::Other(2) => Some(imgui::MouseButton::Middle), + MouseButton::Other(3) => Some(imgui::MouseButton::Extra1), + MouseButton::Other(4) => Some(imgui::MouseButton::Extra2), + _ => None, + } +} + +fn to_imgui_key(keycode: VirtualKeyCode) -> Option { + match keycode { + VirtualKeyCode::Tab => Some(Key::Tab), + VirtualKeyCode::Left => Some(Key::LeftArrow), + VirtualKeyCode::Right => Some(Key::RightArrow), + VirtualKeyCode::Up => Some(Key::UpArrow), + VirtualKeyCode::Down => Some(Key::DownArrow), + VirtualKeyCode::PageUp => Some(Key::PageUp), + VirtualKeyCode::PageDown => Some(Key::PageDown), + VirtualKeyCode::Home => Some(Key::Home), + VirtualKeyCode::End => Some(Key::End), + VirtualKeyCode::Insert => Some(Key::Insert), + VirtualKeyCode::Delete => Some(Key::Delete), + VirtualKeyCode::Back => Some(Key::Backspace), + VirtualKeyCode::Space => Some(Key::Space), + VirtualKeyCode::Return => Some(Key::Enter), + VirtualKeyCode::Escape => Some(Key::Escape), + VirtualKeyCode::LControl => Some(Key::LeftCtrl), + VirtualKeyCode::LShift => Some(Key::LeftShift), + VirtualKeyCode::LAlt => Some(Key::LeftAlt), + VirtualKeyCode::LWin => Some(Key::LeftSuper), + VirtualKeyCode::RControl => Some(Key::RightCtrl), + VirtualKeyCode::RShift => Some(Key::RightShift), + VirtualKeyCode::RAlt => Some(Key::RightAlt), + VirtualKeyCode::RWin => Some(Key::RightSuper), + //VirtualKeyCode::Menu => Some(Key::Menu), // TODO: find out if there is a Menu key in winit + VirtualKeyCode::Key0 => Some(Key::Alpha0), + VirtualKeyCode::Key1 => Some(Key::Alpha1), + VirtualKeyCode::Key2 => Some(Key::Alpha2), + VirtualKeyCode::Key3 => Some(Key::Alpha3), + VirtualKeyCode::Key4 => Some(Key::Alpha4), + VirtualKeyCode::Key5 => Some(Key::Alpha5), + VirtualKeyCode::Key6 => Some(Key::Alpha6), + VirtualKeyCode::Key7 => Some(Key::Alpha7), + VirtualKeyCode::Key8 => Some(Key::Alpha8), + VirtualKeyCode::Key9 => Some(Key::Alpha9), + VirtualKeyCode::A => Some(Key::A), + VirtualKeyCode::B => Some(Key::B), + VirtualKeyCode::C => Some(Key::C), + VirtualKeyCode::D => Some(Key::D), + VirtualKeyCode::E => Some(Key::E), + VirtualKeyCode::F => Some(Key::F), + VirtualKeyCode::G => Some(Key::G), + VirtualKeyCode::H => Some(Key::H), + VirtualKeyCode::I => Some(Key::I), + VirtualKeyCode::J => Some(Key::J), + VirtualKeyCode::K => Some(Key::K), + VirtualKeyCode::L => Some(Key::L), + VirtualKeyCode::M => Some(Key::M), + VirtualKeyCode::N => Some(Key::N), + VirtualKeyCode::O => Some(Key::O), + VirtualKeyCode::P => Some(Key::P), + VirtualKeyCode::Q => Some(Key::Q), + VirtualKeyCode::R => Some(Key::R), + VirtualKeyCode::S => Some(Key::S), + VirtualKeyCode::T => Some(Key::T), + VirtualKeyCode::U => Some(Key::U), + VirtualKeyCode::V => Some(Key::V), + VirtualKeyCode::W => Some(Key::W), + VirtualKeyCode::X => Some(Key::X), + VirtualKeyCode::Y => Some(Key::Y), + VirtualKeyCode::Z => Some(Key::Z), + VirtualKeyCode::F1 => Some(Key::F1), + VirtualKeyCode::F2 => Some(Key::F2), + VirtualKeyCode::F3 => Some(Key::F3), + VirtualKeyCode::F4 => Some(Key::F4), + VirtualKeyCode::F5 => Some(Key::F5), + VirtualKeyCode::F6 => Some(Key::F6), + VirtualKeyCode::F7 => Some(Key::F7), + VirtualKeyCode::F8 => Some(Key::F8), + VirtualKeyCode::F9 => Some(Key::F9), + VirtualKeyCode::F10 => Some(Key::F10), + VirtualKeyCode::F11 => Some(Key::F11), + VirtualKeyCode::F12 => Some(Key::F12), + VirtualKeyCode::Apostrophe => Some(Key::Apostrophe), + VirtualKeyCode::Comma => Some(Key::Comma), + VirtualKeyCode::Minus => Some(Key::Minus), + VirtualKeyCode::Period => Some(Key::Period), + VirtualKeyCode::Slash => Some(Key::Slash), + VirtualKeyCode::Semicolon => Some(Key::Semicolon), + VirtualKeyCode::Equals => Some(Key::Equal), + VirtualKeyCode::LBracket => Some(Key::LeftBracket), + VirtualKeyCode::Backslash => Some(Key::Backslash), + VirtualKeyCode::RBracket => Some(Key::RightBracket), + VirtualKeyCode::Grave => Some(Key::GraveAccent), + VirtualKeyCode::Capital => Some(Key::CapsLock), + VirtualKeyCode::Scroll => Some(Key::ScrollLock), + VirtualKeyCode::Numlock => Some(Key::NumLock), + VirtualKeyCode::Snapshot => Some(Key::PrintScreen), + VirtualKeyCode::Pause => Some(Key::Pause), + VirtualKeyCode::Numpad0 => Some(Key::Keypad0), + VirtualKeyCode::Numpad1 => Some(Key::Keypad1), + VirtualKeyCode::Numpad2 => Some(Key::Keypad2), + VirtualKeyCode::Numpad3 => Some(Key::Keypad3), + VirtualKeyCode::Numpad4 => Some(Key::Keypad4), + VirtualKeyCode::Numpad5 => Some(Key::Keypad5), + VirtualKeyCode::Numpad6 => Some(Key::Keypad6), + VirtualKeyCode::Numpad7 => Some(Key::Keypad7), + VirtualKeyCode::Numpad8 => Some(Key::Keypad8), + VirtualKeyCode::Numpad9 => Some(Key::Keypad9), + VirtualKeyCode::NumpadDecimal => Some(Key::KeypadDecimal), + VirtualKeyCode::NumpadDivide => Some(Key::KeypadDivide), + VirtualKeyCode::NumpadMultiply => Some(Key::KeypadMultiply), + VirtualKeyCode::NumpadSubtract => Some(Key::KeypadSubtract), + VirtualKeyCode::NumpadAdd => Some(Key::KeypadAdd), + VirtualKeyCode::NumpadEnter => Some(Key::KeypadEnter), + VirtualKeyCode::NumpadEquals => Some(Key::KeypadEqual), + _ => None, + } +} + +fn handle_key_modifier(io: &mut Io, key: VirtualKeyCode, down: bool) { + if key == VirtualKeyCode::LShift || key == VirtualKeyCode::RShift { + io.add_key_event(imgui::Key::ModShift, down); + } else if key == VirtualKeyCode::LControl || key == VirtualKeyCode::RControl { + io.add_key_event(imgui::Key::ModCtrl, down); + } else if key == VirtualKeyCode::LAlt || key == VirtualKeyCode::RAlt { + io.add_key_event(imgui::Key::ModAlt, down); + } else if key == VirtualKeyCode::LWin || key == VirtualKeyCode::RWin { + io.add_key_event(imgui::Key::ModSuper, down); + } +} + +impl WinitPlatform { + /// Initializes a winit platform instance and configures imgui. + /// + /// This function configures imgui-rs in the following ways: + /// + /// * backend flags are updated + /// * keys are configured + /// * platform name is set + pub fn init(imgui: &mut Context) -> WinitPlatform { + let io = imgui.io_mut(); + io.backend_flags.insert(BackendFlags::HAS_MOUSE_CURSORS); + io.backend_flags.insert(BackendFlags::HAS_SET_MOUSE_POS); + imgui.set_platform_name(Some(format!( + "imgui-winit-support {}", + env!("CARGO_PKG_VERSION") + ))); + WinitPlatform { + hidpi_mode: ActiveHiDpiMode::Default, + hidpi_factor: 1.0, + cursor_cache: None, + } + } + /// Attaches the platform instance to a winit window. + /// + /// This function configures imgui-rs in the following ways: + /// + /// * framebuffer scale (= DPI factor) is set + /// * display size is set + pub fn attach_window(&mut self, io: &mut Io, window: &Window, hidpi_mode: HiDpiMode) { + let (hidpi_mode, hidpi_factor) = hidpi_mode.apply(window.scale_factor()); + self.hidpi_mode = hidpi_mode; + self.hidpi_factor = hidpi_factor; + io.display_framebuffer_scale = [hidpi_factor as f32, hidpi_factor as f32]; + let logical_size = window.inner_size().to_logical(hidpi_factor); + let logical_size = self.scale_size_from_winit(window, logical_size); + io.display_size = [logical_size.width as f32, logical_size.height as f32]; + } + /// Returns the current DPI factor. + /// + /// The value might not be the same as the winit DPI factor (depends on the used DPI mode) + pub fn hidpi_factor(&self) -> f64 { + self.hidpi_factor + } + /// Scales a logical size coming from winit using the current DPI mode. + /// + /// This utility function is useful if you are using a DPI mode other than default, and want + /// your application to use the same logical coordinates as imgui-rs. + pub fn scale_size_from_winit( + &self, + window: &Window, + logical_size: LogicalSize, + ) -> LogicalSize { + match self.hidpi_mode { + ActiveHiDpiMode::Default => logical_size, + _ => logical_size + .to_physical::(window.scale_factor()) + .to_logical(self.hidpi_factor), + } + } + /// Scales a logical position coming from winit using the current DPI mode. + /// + /// This utility function is useful if you are using a DPI mode other than default, and want + /// your application to use the same logical coordinates as imgui-rs. + pub fn scale_pos_from_winit( + &self, + window: &Window, + logical_pos: LogicalPosition, + ) -> LogicalPosition { + match self.hidpi_mode { + ActiveHiDpiMode::Default => logical_pos, + _ => logical_pos + .to_physical::(window.scale_factor()) + .to_logical(self.hidpi_factor), + } + } + /// Scales a logical position for winit using the current DPI mode. + /// + /// This utility function is useful if you are using a DPI mode other than default, and want + /// your application to use the same logical coordinates as imgui-rs. + pub fn scale_pos_for_winit( + &self, + window: &Window, + logical_pos: LogicalPosition, + ) -> LogicalPosition { + match self.hidpi_mode { + ActiveHiDpiMode::Default => logical_pos, + _ => logical_pos + .to_physical::(self.hidpi_factor) + .to_logical(window.scale_factor()), + } + } + /// Handles a winit event. + /// + /// This function performs the following actions (depends on the event): + /// + /// * window size / dpi factor changes are applied + /// * keyboard state is updated + /// * mouse state is updated + pub fn handle_event(&mut self, io: &mut Io, window: &Window, event: &Event) { + match *event { + Event::WindowEvent { + window_id, + ref event, + } if window_id == window.id() => { + self.handle_window_event(io, window, event); + } + // Track key release events outside our window. If we don't do this, + // we might never see the release event if some other window gets focus. + Event::DeviceEvent { + event: + DeviceEvent::Key(KeyboardInput { + state: ElementState::Released, + virtual_keycode: Some(key), + .. + }), + .. + } => { + if let Some(key) = to_imgui_key(key) { + io.add_key_event(key, false); + } + } + _ => (), + } + } + fn handle_window_event(&mut self, io: &mut Io, window: &Window, event: &WindowEvent) { + match *event { + WindowEvent::Resized(physical_size) => { + let logical_size = physical_size.to_logical(window.scale_factor()); + let logical_size = self.scale_size_from_winit(window, logical_size); + io.display_size = [logical_size.width as f32, logical_size.height as f32]; + } + WindowEvent::ScaleFactorChanged { scale_factor, .. } => { + let hidpi_factor = match self.hidpi_mode { + ActiveHiDpiMode::Default => scale_factor, + ActiveHiDpiMode::Rounded => scale_factor.round(), + _ => return, + }; + // Mouse position needs to be changed while we still have both the old and the new + // values + if io.mouse_pos[0].is_finite() && io.mouse_pos[1].is_finite() { + io.mouse_pos = [ + io.mouse_pos[0] * (hidpi_factor / self.hidpi_factor) as f32, + io.mouse_pos[1] * (hidpi_factor / self.hidpi_factor) as f32, + ]; + } + self.hidpi_factor = hidpi_factor; + io.display_framebuffer_scale = [hidpi_factor as f32, hidpi_factor as f32]; + // Window size might change too if we are using DPI rounding + let logical_size = window.inner_size().to_logical(scale_factor); + let logical_size = self.scale_size_from_winit(window, logical_size); + io.display_size = [logical_size.width as f32, logical_size.height as f32]; + } + WindowEvent::ModifiersChanged(modifiers) => { + // We need to track modifiers separately because some system like macOS, will + // not reliably send modifier states during certain events like ScreenCapture. + // Gotta let the people show off their pretty imgui widgets! + io.add_key_event(Key::ModShift, modifiers.shift()); + io.add_key_event(Key::ModCtrl, modifiers.ctrl()); + io.add_key_event(Key::ModAlt, modifiers.alt()); + io.add_key_event(Key::ModSuper, modifiers.logo()); + } + WindowEvent::KeyboardInput { + input: + KeyboardInput { + virtual_keycode: Some(key), + state, + .. + }, + .. + } => { + let pressed = state == ElementState::Pressed; + + // We map both left and right ctrl to `ModCtrl`, etc. + // imgui is told both "left control is pressed" and + // "consider the control key is pressed". Allows + // applications to use either general "ctrl" or a + // specific key. Same applies to other modifiers. + // https://github.com/ocornut/imgui/issues/5047 + handle_key_modifier(io, key, pressed); + + // Add main key event + if let Some(key) = to_imgui_key(key) { + io.add_key_event(key, pressed); + } + } + WindowEvent::ReceivedCharacter(ch) => { + // Exclude the backspace key ('\u{7f}'). Otherwise we will insert this char and then + // delete it. + if ch != '\u{7f}' { + io.add_input_character(ch) + } + } + WindowEvent::CursorMoved { position, .. } => { + let position = position.to_logical(window.scale_factor()); + let position = self.scale_pos_from_winit(window, position); + io.add_mouse_pos_event([position.x as f32, position.y as f32]); + } + WindowEvent::MouseWheel { + delta, + phase: TouchPhase::Moved, + .. + } => { + let (h, v) = match delta { + MouseScrollDelta::LineDelta(h, v) => (h, v), + MouseScrollDelta::PixelDelta(pos) => { + let pos = pos.to_logical::(self.hidpi_factor); + let h = match pos.x.partial_cmp(&0.0) { + Some(Ordering::Greater) => 1.0, + Some(Ordering::Less) => -1.0, + _ => 0.0, + }; + let v = match pos.y.partial_cmp(&0.0) { + Some(Ordering::Greater) => 1.0, + Some(Ordering::Less) => -1.0, + _ => 0.0, + }; + (h, v) + } + }; + io.add_mouse_wheel_event([h, v]); + } + WindowEvent::MouseInput { state, button, .. } => { + if let Some(mb) = to_imgui_mouse_button(button) { + let pressed = state == ElementState::Pressed; + io.add_mouse_button_event(mb, pressed); + } + } + WindowEvent::Focused(newly_focused) => { + if !newly_focused { + // Set focus-lost to avoid stuck keys (like 'alt' + // when alt-tabbing) + io.app_focus_lost = true; + } + } + _ => (), + } + } + /// Frame preparation callback. + /// + /// Call this before calling the imgui-rs context `frame` function. + /// This function performs the following actions: + /// + /// * mouse cursor is repositioned (if requested by imgui-rs) + pub fn prepare_frame(&self, io: &mut Io, window: &Window) -> Result<(), ExternalError> { + if io.want_set_mouse_pos { + let logical_pos = self.scale_pos_for_winit( + window, + LogicalPosition::new(f64::from(io.mouse_pos[0]), f64::from(io.mouse_pos[1])), + ); + window.set_cursor_position(logical_pos) + } else { + Ok(()) + } + } + + /// Render preparation callback. + /// + /// Call this before calling the imgui-rs UI `render_with`/`render` function. + /// This function performs the following actions: + /// + /// * mouse cursor is changed and/or hidden (if requested by imgui-rs) + pub fn prepare_render(&mut self, ui: &Ui, window: &Window) { + let io = ui.io(); + if !io + .config_flags + .contains(ConfigFlags::NO_MOUSE_CURSOR_CHANGE) + { + let cursor = CursorSettings { + cursor: ui.mouse_cursor(), + draw_cursor: io.mouse_draw_cursor, + }; + if self.cursor_cache != Some(cursor) { + cursor.apply(window); + self.cursor_cache = Some(cursor); + } + } + } +} diff --git a/simulator/src/patch/mod.rs b/simulator/src/patch/mod.rs new file mode 100644 index 0000000..4fa8809 --- /dev/null +++ b/simulator/src/patch/mod.rs @@ -0,0 +1,8 @@ +// Following mod is downloaded from https://github.com/imgui-rs/imgui-rs.git for winit 0.28 +#[allow(dead_code)] +pub mod imgui_winit_support; + +// Following mod is downloaded from https://github.com/Tenebryo/imgui-vulkano-renderer +// Modified for Vulkano 0.33.0 +#[allow(dead_code)] +pub mod imgui_vulkano_renderer; diff --git a/simulator/src/renderer.rs b/simulator/src/renderer.rs new file mode 100644 index 0000000..9798d3c --- /dev/null +++ b/simulator/src/renderer.rs @@ -0,0 +1,699 @@ +/* + * File: renderer.rs + * Project: src + * Created Date: 11/11/2021 + * Author: Shun Suzuki + * ----- + * Last Modified: 30/10/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2021 Hapis Lab. All rights reserved. + * + */ + +use std::sync::Arc; + +use camera_controllers::{Camera, CameraPerspective, FirstPerson, FirstPersonSettings}; + +use vulkano::{ + command_buffer::allocator::StandardCommandBufferAllocator, + descriptor_set::allocator::StandardDescriptorSetAllocator, + device::{ + physical::{PhysicalDevice, PhysicalDeviceType}, + Device, DeviceCreateInfo, DeviceExtensions, Features, Queue, QueueCreateInfo, QueueFlags, + }, + format::{Format, FormatFeatures}, + image::{view::ImageView, Image, ImageCreateInfo, ImageUsage, SampleCount, SampleCounts}, + instance::{ + debug::{ + DebugUtilsMessageSeverity, DebugUtilsMessageType, DebugUtilsMessenger, + DebugUtilsMessengerCallback, DebugUtilsMessengerCreateInfo, + }, + Instance, InstanceCreateFlags, InstanceCreateInfo, + }, + memory::allocator::{AllocationCreateInfo, StandardMemoryAllocator}, + pipeline::graphics::viewport::Viewport, + render_pass::{Framebuffer, FramebufferCreateInfo, RenderPass}, + swapchain::{ + self, ColorSpace, FullScreenExclusive, PresentMode, Surface, SurfaceTransform, Swapchain, + SwapchainCreateInfo, SwapchainPresentInfo, + }, + sync::{self, GpuFuture}, + Validated, VulkanError, VulkanLibrary, +}; +use winit::{ + event_loop::{EventLoop, EventLoopBuilder}, + window::{Window, WindowBuilder}, +}; + +use crate::{camera_helper, viewer_settings::ViewerSettings, Matrix4, Vector3}; + +/// List available GPUs +pub fn available_gpus() -> anyhow::Result> { + let event_loop = EventLoopBuilder::<()>::new().build(); + + let library = VulkanLibrary::new()?; + let required_extensions = Surface::required_extensions(&event_loop); + let instance = Instance::new( + library, + InstanceCreateInfo { + flags: InstanceCreateFlags::ENUMERATE_PORTABILITY, + enabled_extensions: required_extensions, + ..Default::default() + }, + )?; + + let window = Arc::new( + WindowBuilder::new() + .with_inner_size(winit::dpi::LogicalSize::new(1, 1)) + .with_title("tmp") + .with_visible(false) + .build(&event_loop)?, + ); + let surface = Surface::from_window(instance.clone(), window.clone())?; + + let device_extensions = DeviceExtensions { + khr_swapchain: true, + ..DeviceExtensions::default() + }; + + let available_properties = instance + .enumerate_physical_devices()? + .filter(|p| p.supported_extensions().contains(&device_extensions)) + .filter_map(|p| { + p.queue_family_properties() + .iter() + .enumerate() + .position(|(i, q)| { + q.queue_flags.intersects(QueueFlags::GRAPHICS) + && p.surface_support(i as u32, &surface).unwrap_or(false) + }) + .map(|i| (p, i as u32)) + }) + .collect::>(); + + Ok(available_properties + .iter() + .map(|(p, idx)| { + ( + *idx, + p.properties().device_name.to_owned(), + p.properties().device_type, + ) + }) + .collect()) +} + +pub struct Renderer { + device: Arc, + surface: Arc, + queue: Arc, + swap_chain: Arc, + image_index: u32, + images: Vec>, + recreate_swapchain: bool, + previous_frame_end: Option>, + frame_buffers: Vec>, + render_pass: Arc, + viewport: Viewport, + command_buffer_allocator: StandardCommandBufferAllocator, + descriptor_set_allocator: StandardDescriptorSetAllocator, + memory_allocator: Arc, + camera: Camera, + _debug_callback: Option, + msaa_sample: SampleCounts, + depth_format: Format, +} + +impl Renderer { + pub fn new( + event_loop: &EventLoop<()>, + title: &str, + width: f64, + height: f64, + v_sync: bool, + gpu_idx: i32, + ) -> anyhow::Result { + let library = VulkanLibrary::new()?; + let mut required_extensions = Surface::required_extensions(&event_loop); + if cfg!(feature = "enable_debug") { + required_extensions.ext_debug_utils = true; + } + + let instance = Instance::new( + library, + InstanceCreateInfo { + enabled_extensions: required_extensions, + flags: InstanceCreateFlags::ENUMERATE_PORTABILITY, + ..Default::default() + }, + )?; + + let _debug_callback = if cfg!(feature = "enable_debug") { + unsafe { + DebugUtilsMessenger::new( + instance.clone(), + DebugUtilsMessengerCreateInfo { + message_severity: DebugUtilsMessageSeverity::ERROR + | DebugUtilsMessageSeverity::WARNING + | DebugUtilsMessageSeverity::INFO + | DebugUtilsMessageSeverity::VERBOSE, + message_type: DebugUtilsMessageType::GENERAL + | DebugUtilsMessageType::VALIDATION + | DebugUtilsMessageType::PERFORMANCE, + ..DebugUtilsMessengerCreateInfo::user_callback( + DebugUtilsMessengerCallback::new( + |message_severity, message_type, callback_data| { + let severity = if message_severity + .intersects(DebugUtilsMessageSeverity::ERROR) + { + "error" + } else if message_severity + .intersects(DebugUtilsMessageSeverity::WARNING) + { + "warning" + } else if message_severity + .intersects(DebugUtilsMessageSeverity::INFO) + { + "information" + } else if message_severity + .intersects(DebugUtilsMessageSeverity::VERBOSE) + { + "verbose" + } else { + panic!("no-impl"); + }; + + let ty = if message_type + .intersects(DebugUtilsMessageType::GENERAL) + { + "general" + } else if message_type + .intersects(DebugUtilsMessageType::VALIDATION) + { + "validation" + } else if message_type + .intersects(DebugUtilsMessageType::PERFORMANCE) + { + "performance" + } else { + panic!("no-impl"); + }; + + println!( + "{} {} {}: {}", + callback_data.message_id_name.unwrap_or("unknown"), + ty, + severity, + callback_data.message + ); + }, + ), + ) + }, + ) + .ok() + } + } else { + None + }; + + let window = Arc::new( + WindowBuilder::new() + .with_inner_size(winit::dpi::LogicalSize::new(width, height)) + .with_title(title) + .build(&event_loop)?, + ); + let surface = Surface::from_window(instance.clone(), window.clone())?; + + let (device, queue) = Self::create_device(gpu_idx, instance, surface.clone())?; + + let msaa_sample = Self::get_max_usable_sample_count(device.physical_device().clone()); + + let mut viewport = Viewport { + offset: [0.0, 0.0], + extent: [0.0, 0.0], + depth_range: 0.0..=1.0, + }; + let (swap_chain, images) = Self::create_swap_chain( + surface.clone(), + device.physical_device().clone(), + device.clone(), + if v_sync { + PresentMode::Fifo + } else { + PresentMode::Immediate + }, + )?; + let depth_format = [ + Format::D32_SFLOAT, + Format::D32_SFLOAT_S8_UINT, + Format::D24_UNORM_S8_UINT, + Format::D32_SFLOAT, + ] + .into_iter() + .find(|&f| { + if let Ok(props) = device.physical_device().format_properties(f) { + props + .optimal_tiling_features + .contains(FormatFeatures::DEPTH_STENCIL_ATTACHMENT) + } else { + false + } + }) + .unwrap_or(Format::D16_UNORM); + + let render_pass = vulkano::single_pass_renderpass!( + device.clone(), + attachments: { + intermediary: { + format: swap_chain.image_format(), + samples: msaa_sample.max_count(), + load_op: Clear, + store_op: DontCare, + }, + depth_stencil: { + format: depth_format, + samples: msaa_sample.max_count(), + load_op: Clear, + store_op: DontCare, + }, + color: { + format: swap_chain.image_format(), + samples: 1, + load_op: DontCare, + store_op: Store, + } + }, + pass: { + color: [intermediary], + color_resolve: [color], + depth_stencil: {depth_stencil}, + } + )?; + let memory_allocator = Arc::new(StandardMemoryAllocator::new_default(device.clone())); + let frame_buffers = Self::window_size_dependent_setup( + memory_allocator, + &images, + render_pass.clone(), + &mut viewport, + swap_chain.image_format(), + depth_format, + msaa_sample.max_count(), + )?; + + let mut camera = + FirstPerson::new([0., -500.0, 120.0], FirstPersonSettings::keyboard_wasd()).camera(0.); + camera.set_yaw_pitch(0., -std::f32::consts::PI / 2.0); + + let command_buffer_allocator = + StandardCommandBufferAllocator::new(queue.device().clone(), Default::default()); + let descriptor_set_allocator = + StandardDescriptorSetAllocator::new(queue.device().clone(), Default::default()); + let memory_allocator = + Arc::new(StandardMemoryAllocator::new_default(queue.device().clone())); + + let previous_frame_end = Some(sync::now(device.clone()).boxed()); + Ok(Renderer { + device, + surface, + queue, + swap_chain, + image_index: 0, + images, + previous_frame_end, + recreate_swapchain: false, + frame_buffers, + render_pass, + viewport, + command_buffer_allocator, + descriptor_set_allocator, + memory_allocator, + depth_format, + camera, + _debug_callback, + msaa_sample, + }) + } + + fn get_max_usable_sample_count(physical: Arc) -> SampleCounts { + let properties = physical.properties(); + let counts = + properties.framebuffer_color_sample_counts & properties.framebuffer_depth_sample_counts; + [ + SampleCounts::SAMPLE_64, + SampleCounts::SAMPLE_32, + SampleCounts::SAMPLE_16, + SampleCounts::SAMPLE_8, + SampleCounts::SAMPLE_4, + SampleCounts::SAMPLE_2, + ] + .into_iter() + .find(|c| counts.contains(*c)) + .unwrap_or(SampleCounts::SAMPLE_1) + } + + pub fn get_projection(&self, settings: &ViewerSettings) -> Matrix4 { + let draw_size = self.window().inner_size(); + Matrix4::from({ + let mut projection = CameraPerspective { + fov: settings.camera_fov, + near_clip: settings.camera_near_clip, + far_clip: settings.camera_far_clip, + aspect_ratio: (draw_size.width as f32) / (draw_size.height as f32), + } + .projection(); + projection[0][1] = -projection[0][1]; + projection[1][1] = -projection[1][1]; + projection[2][1] = -projection[2][1]; + projection + }) + } + + pub fn get_view(&self) -> Matrix4 { + Matrix4::from(self.camera.orthogonal()) + } + + fn create_device( + gpu_idx: i32, + instance: Arc, + surface: Arc, + ) -> anyhow::Result<(Arc, Arc)> { + let device_extensions = DeviceExtensions { + khr_swapchain: true, + ..DeviceExtensions::default() + }; + + let available_properties = instance + .enumerate_physical_devices()? + .filter(|p| p.supported_extensions().contains(&device_extensions)) + .filter_map(|p| { + p.queue_family_properties() + .iter() + .enumerate() + .position(|(i, q)| { + q.queue_flags.intersects(QueueFlags::GRAPHICS) + && p.surface_support(i as u32, &surface).unwrap_or(false) + }) + .map(|i| (p, i as u32)) + }) + .collect::>(); + + let (physical_device, queue_family) = match gpu_idx { + idx if idx < 0 => available_properties + .into_iter() + .min_by_key(|(p, _)| match p.properties().device_type { + PhysicalDeviceType::DiscreteGpu => 0, + PhysicalDeviceType::IntegratedGpu => 1, + PhysicalDeviceType::VirtualGpu => 2, + PhysicalDeviceType::Cpu => 3, + PhysicalDeviceType::Other => 4, + _ => 5, + }) + .unwrap(), + idx if (idx as usize) < available_properties.len() => { + available_properties[gpu_idx as usize].clone() + } + _ => { + tracing::warn!("GPU {} not found. Using default GPU.", gpu_idx); + available_properties + .into_iter() + .min_by_key(|(p, _)| match p.properties().device_type { + PhysicalDeviceType::DiscreteGpu => 0, + PhysicalDeviceType::IntegratedGpu => 1, + PhysicalDeviceType::VirtualGpu => 2, + PhysicalDeviceType::Cpu => 3, + PhysicalDeviceType::Other => 4, + _ => 5, + }) + .unwrap() + } + }; + + tracing::info!( + "Using device: {} (type: {:?})", + physical_device.properties().device_name, + physical_device.properties().device_type, + ); + + let features = Features::default(); + let (device, mut queues) = { + Device::new( + physical_device, + DeviceCreateInfo { + enabled_extensions: device_extensions, + enabled_features: features, + queue_create_infos: vec![QueueCreateInfo { + queue_family_index: queue_family, + ..Default::default() + }], + ..Default::default() + }, + )? + }; + Ok((device, queues.next().unwrap())) + } + + fn create_swap_chain( + surface: Arc, + physical: Arc, + device: Arc, + present_mode: PresentMode, + ) -> anyhow::Result<(Arc, Vec>)> { + let caps = physical.surface_capabilities(&surface, Default::default())?; + let alpha = caps.supported_composite_alpha.into_iter().next().unwrap(); + let format = physical + .surface_formats(&surface, Default::default())? + .into_iter() + .find(|&(f, c)| f == Format::B8G8R8A8_UNORM && c == ColorSpace::SrgbNonLinear); + let image_extent: [u32; 2] = surface + .object() + .unwrap() + .downcast_ref::() + .unwrap() + .inner_size() + .into(); + Ok(Swapchain::new( + device, + surface, + SwapchainCreateInfo { + min_image_count: caps.min_image_count, + image_format: format.map_or(Format::B8G8R8A8_UNORM, |f| f.0), + image_color_space: format.map_or(ColorSpace::SrgbNonLinear, |f| f.1), + image_extent, + image_array_layers: 1, + image_usage: ImageUsage::COLOR_ATTACHMENT | ImageUsage::TRANSFER_DST, + pre_transform: SurfaceTransform::Identity, + composite_alpha: alpha, + present_mode, + clipped: true, + full_screen_exclusive: FullScreenExclusive::Default, + ..Default::default() + }, + )?) + } + + pub fn device(&self) -> Arc { + self.device.clone() + } + + pub fn window(&self) -> &Window { + self.surface + .object() + .unwrap() + .downcast_ref::() + .unwrap() + } + + pub fn queue(&self) -> Arc { + self.queue.clone() + } + + pub fn frame_buffer(&self) -> Arc { + self.frame_buffers[self.image_index as usize].clone() + } + + pub fn image(&self) -> Arc { + self.images[self.image_index as usize].clone() + } + + pub fn render_pass(&self) -> Arc { + self.render_pass.clone() + } + + pub fn viewport(&self) -> Viewport { + self.viewport.clone() + } + + pub const fn command_buffer_allocator(&self) -> &StandardCommandBufferAllocator { + &self.command_buffer_allocator + } + + pub const fn descriptor_set_allocator(&self) -> &StandardDescriptorSetAllocator { + &self.descriptor_set_allocator + } + + pub fn memory_allocator(&self) -> Arc { + self.memory_allocator.clone() + } + + pub fn resize(&mut self) { + self.recreate_swapchain = true + } + + pub fn color_format(&self) -> Format { + self.swap_chain.image_format() + } + + pub const fn sample_count(&self) -> SampleCount { + self.msaa_sample.max_count() + } + + pub fn start_frame(&mut self) -> anyhow::Result> { + if self.recreate_swapchain { + self.recreate_swapchain_and_views()?; + } + + let (image_num, suboptimal, acquire_future) = + match swapchain::acquire_next_image(self.swap_chain.clone(), None) { + Ok(r) => r, + Err(Validated::Error(VulkanError::OutOfDate)) => { + self.recreate_swapchain = true; + return Err(VulkanError::OutOfDate.into()); + } + Err(e) => panic!("Failed to acquire next image: {:?}", e), + }; + if suboptimal { + self.recreate_swapchain = true; + } + self.image_index = image_num as _; + + let future = self.previous_frame_end.take().unwrap().join(acquire_future); + + Ok(future.boxed()) + } + + pub fn finish_frame(&mut self, after_future: Box) { + let future = after_future + .then_swapchain_present( + self.queue.clone(), + SwapchainPresentInfo::swapchain_image_index( + self.swap_chain.clone(), + self.image_index, + ), + ) + .then_signal_fence_and_flush(); + match future { + Ok(future) => { + match future.wait(None) { + Ok(x) => x, + Err(err) => println!("{:?}", err), + } + self.previous_frame_end = Some(future.boxed()); + } + Err(Validated::Error(VulkanError::OutOfDate)) => { + self.recreate_swapchain = true; + self.previous_frame_end = Some(sync::now(self.device.clone()).boxed()); + } + Err(e) => { + println!("Failed to flush future: {:?}", e); + self.previous_frame_end = Some(sync::now(self.device.clone()).boxed()); + } + } + } + + fn recreate_swapchain_and_views(&mut self) -> anyhow::Result<()> { + let dimensions: [u32; 2] = self.window().inner_size().into(); + let (new_swapchain, new_images) = self.swap_chain.recreate(SwapchainCreateInfo { + image_extent: dimensions, + ..self.swap_chain.create_info() + })?; + + self.swap_chain = new_swapchain; + let memory_allocator = Arc::new(StandardMemoryAllocator::new_default(self.device.clone())); + let format = self.color_format(); + self.frame_buffers = Self::window_size_dependent_setup( + memory_allocator, + &new_images, + self.render_pass.clone(), + &mut self.viewport, + format, + self.depth_format, + self.msaa_sample.max_count(), + )?; + self.images = new_images; + self.recreate_swapchain = false; + Ok(()) + } + + fn window_size_dependent_setup( + memory_allocator: Arc, + images: &[Arc], + render_pass: Arc, + viewport: &mut Viewport, + color_format: Format, + depth_format: Format, + samples: SampleCount, + ) -> anyhow::Result>> { + let extent = images[0].extent(); + viewport.extent = [extent[0] as f32, extent[1] as f32]; + + let color_image = ImageView::new_default(Image::new( + memory_allocator.clone(), + ImageCreateInfo { + usage: ImageUsage::COLOR_ATTACHMENT | ImageUsage::TRANSFER_DST, + format: color_format, + extent, + samples, + ..Default::default() + }, + AllocationCreateInfo::default(), + )?)?; + + let depth_buffer = ImageView::new_default(Image::new( + memory_allocator.clone(), + ImageCreateInfo { + usage: ImageUsage::DEPTH_STENCIL_ATTACHMENT | ImageUsage::TRANSFER_DST, + format: depth_format, + extent, + samples, + ..Default::default() + }, + AllocationCreateInfo::default(), + )?)?; + + Ok(images + .iter() + .map(|image| { + let view = ImageView::new_default(image.clone())?; + Framebuffer::new( + render_pass.clone(), + FramebufferCreateInfo { + attachments: vec![color_image.clone(), depth_buffer.clone(), view], + ..Default::default() + }, + ) + }) + .collect::, _>>()?) + } + + pub fn move_camera(&mut self, viewer_settings: &ViewerSettings) { + camera_helper::set_camera( + &mut self.camera, + Vector3::new( + viewer_settings.camera_pos_x, + viewer_settings.camera_pos_y, + viewer_settings.camera_pos_z, + ), + Vector3::new( + viewer_settings.camera_rot_x, + viewer_settings.camera_rot_y, + viewer_settings.camera_rot_z, + ), + ); + } + + pub(crate) fn image_format(&self) -> Format { + self.swap_chain.image_format() + } +} diff --git a/simulator/src/simulator.rs b/simulator/src/simulator.rs new file mode 100644 index 0000000..29e4c05 --- /dev/null +++ b/simulator/src/simulator.rs @@ -0,0 +1,629 @@ +/* + * File: simulator.rs + * Project: src + * Created Date: 24/05/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 22/11/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +use std::{ + error::Error, + f32::consts::PI, + ffi::OsStr, + net::ToSocketAddrs, + path::{Path, PathBuf}, + sync::{Arc, RwLock}, +}; + +use crate::{ + common::transform::{to_gl_pos, to_gl_rot}, + field_compute_pipeline::{Config, FieldComputePipeline}, + imgui_renderer::ImGuiRenderer, + renderer::Renderer, + slice_viewer::SliceViewer, + sound_sources::{Drive, SoundSources}, + trans_viewer::TransViewer, + update_flag::UpdateFlag, + viewer_settings::ViewerSettings, + Quaternion, Vector3, MILLIMETER, +}; +use autd3_driver::cpu::TxDatagram; +use autd3_firmware_emulator::{CPUEmulator, FPGAEmulator}; +use crossbeam_channel::{bounded, Receiver, Sender, TryRecvError}; +use vulkano::{ + command_buffer::{AutoCommandBufferBuilder, CommandBufferUsage, RenderPassBeginInfo}, + sync::GpuFuture, +}; +use winit::{ + event::{Event, WindowEvent}, + event_loop::{ControlFlow, EventLoopBuilder}, + platform::run_return::EventLoopExtRunReturn, +}; + +use futures_util::future::FutureExt; +use tokio::{runtime::Builder, sync::oneshot}; +use tonic::{transport::Server, Request, Response, Status}; + +use autd3_protobuf::*; + +enum Signal { + ConfigGeometry(Geometry), + UpdateGeometry(Geometry), + Send(TxRawData), + Close, +} + +struct SimulatorServer { + rx_buf: Arc>>, + sender: Sender, +} + +#[tonic::async_trait] +impl simulator_server::Simulator for SimulatorServer { + async fn config_geomety( + &self, + req: Request, + ) -> Result, Status> { + if self + .sender + .send(Signal::ConfigGeometry(req.into_inner())) + .is_err() + { + return Err(Status::unavailable("Simulator is closed")); + } + Ok(Response::new(GeometryResponse {})) + } + + async fn update_geomety( + &self, + req: Request, + ) -> Result, Status> { + if self + .sender + .send(Signal::UpdateGeometry(req.into_inner())) + .is_err() + { + return Err(Status::unavailable("Simulator is closed")); + } + Ok(Response::new(GeometryResponse {})) + } + + async fn send_data(&self, req: Request) -> Result, Status> { + if self.sender.send(Signal::Send(req.into_inner())).is_err() { + return Err(Status::unavailable("Simulator is closed")); + } + Ok(Response::new(SendResponse { success: true })) + } + + async fn read_data(&self, _: Request) -> Result, Status> { + let rx = self.rx_buf.read().unwrap(); + Ok(Response::new(RxMessage { + data: rx.iter().flat_map(|c| [c.data, c.ack]).collect(), + })) + } + + async fn close(&self, _: Request) -> Result, Status> { + if self.sender.send(Signal::Close).is_err() { + return Err(Status::unavailable("Simulator is closed")); + } + Ok(Response::new(CloseResponse { success: true })) + } +} + +/// AUTD Simulator +#[derive(Default)] +pub struct Simulator { + window_width: Option, + window_height: Option, + vsync: Option, + port: Option, + gpu_idx: Option, + settings: ViewerSettings, + config_path: Option, +} + +impl Simulator { + pub fn new() -> Self { + Self { + window_width: None, + window_height: None, + vsync: None, + port: None, + gpu_idx: None, + settings: ViewerSettings::default(), + config_path: None, + } + } + + /// Set window size + pub const fn with_window_size(mut self, width: u32, height: u32) -> Self { + self.window_width = Some(width); + self.window_height = Some(height); + self + } + + /// Set vsync + pub const fn with_vsync(mut self, vsync: bool) -> Self { + self.vsync = Some(vsync); + self + } + + /// Set port + pub const fn with_port(mut self, port: u16) -> Self { + self.port = Some(port); + self + } + + /// Set GPU index + /// + /// # Arguments + /// + /// * `gpu_idx` - GPU index. If -1, use the most suitable GPU. + /// + pub const fn with_gpu_idx(mut self, gpu_idx: i32) -> Self { + self.gpu_idx = Some(gpu_idx); + self + } + + /// Set viewer settings + pub fn with_settings(mut self, settings: ViewerSettings) -> Self { + self.settings = settings; + self + } + + /// Set config path where settings are saved + pub fn with_config_path + Sized>(mut self, config_path: S) -> Self { + self.config_path = Some(Path::new(&config_path).to_owned()); + self + } + + /// Get viewer settings + pub const fn get_settings(&self) -> &ViewerSettings { + &self.settings + } + + /// Run Simulator + /// + /// # Returns + /// + /// ## Platform-specific + /// + /// X11 / Wayland: This function returns 1 upon disconnection from the display server. + pub fn run(&mut self) -> anyhow::Result { + tracing::info!("Initializing window..."); + + let (tx, rx) = bounded(32); + + let (tx_shutdown, rx_shutdown) = oneshot::channel::<()>(); + let port = self.port.unwrap_or(self.settings.port); + + let rx_buf = Arc::new(RwLock::new(vec![])); + let server_th = std::thread::spawn({ + let rx_buf = rx_buf.clone(); + move || { + tracing::info!("Waiting for client connection on http://0.0.0.0:{}", port); + let body = async { + Server::builder() + .add_service(simulator_server::SimulatorServer::new(SimulatorServer { + rx_buf, + sender: tx, + })) + .serve_with_shutdown( + format!("0.0.0.0:{port}") + .to_socket_addrs() + .unwrap() + .next() + .unwrap(), + rx_shutdown.map(drop), + ) + .await + }; + Builder::new_multi_thread() + .enable_all() + .build() + .unwrap() + .block_on(body) + } + }); + + self.run_simulator(server_th, rx_buf, rx, tx_shutdown) + } + + fn run_simulator( + &mut self, + server_th: std::thread::JoinHandle>, + rx_buf: Arc>>, + receiver: Receiver, + shutdown: tokio::sync::oneshot::Sender<()>, + ) -> anyhow::Result { + let mut event_loop = EventLoopBuilder::<()>::with_user_event().build(); + + let mut render = Renderer::new( + &event_loop, + "AUTD Simulator", + self.window_width.unwrap_or(self.settings.window_width) as _, + self.window_height.unwrap_or(self.settings.window_height) as _, + self.vsync.unwrap_or(self.settings.vsync), + self.gpu_idx.unwrap_or(self.settings.gpu_idx), + )?; + + render.move_camera(&self.settings); + + let mut sources = SoundSources::new(); + let mut cpus: Vec = Vec::new(); + let mut body_pointer = vec![]; + + let mut field_compute_pipeline = FieldComputePipeline::new(&render, &self.settings)?; + let mut slice_viewer = SliceViewer::new(&render, &self.settings)?; + let model = crate::device_viewer::Model::new()?; + let mut device_viewer = crate::device_viewer::DeviceViewer::new(&render, &model)?; + let mut imgui = ImGuiRenderer::new(self.settings.clone(), &self.config_path, &render)?; + let mut trans_viewer = TransViewer::new(&render)?; + + let mut is_initialized = false; + let mut is_source_update = false; + let mut is_running = true; + + let server_th_ref = &server_th; + + let res = event_loop.run_return(move |event, _, control_flow| { + let mut run_loop = |event, control_flow: &mut ControlFlow| -> anyhow::Result<()> { + cpus.iter_mut().for_each(CPUEmulator::update); + if cpus.iter().any(CPUEmulator::should_update) { + rx_buf + .write() + .unwrap() + .iter_mut() + .zip(cpus.iter()) + .for_each(|(d, s)| { + d.ack = s.ack(); + d.data = s.rx_data(); + }); + } + + match receiver.try_recv() { + Ok(Signal::ConfigGeometry(geometry)) => { + sources.clear(); + cpus.clear(); + + let geometry = autd3_driver::geometry::Geometry::from_msg(&geometry); + geometry.iter().for_each(|dev| { + dev.iter().for_each(|tr| { + let p = tr.position(); + let r = tr.rotation(); + sources.add( + to_gl_pos(Vector3::new(p.x as _, p.y as _, p.z as _)), + to_gl_rot(Quaternion::new( + r.w as _, r.i as _, r.j as _, r.k as _, + )), + Drive::new(1.0, 0.0, 1.0, 40e3, self.settings.sound_speed), + 1.0, + ); + }); + }); + + cpus = geometry + .iter() + .map(|dev| CPUEmulator::new(dev.idx(), dev.num_transducers())) + .collect(); + + body_pointer = [0usize] + .into_iter() + .chain(geometry.iter().map(|dev| dev.num_transducers())) + .scan(0, |state, tr_num| { + *state += tr_num; + Some(*state) + }) + .collect::>(); + + *rx_buf.write().unwrap() = + vec![ + autd3_driver::cpu::RxMessage { ack: 0, data: 0 }; + geometry.num_devices() + ]; + + field_compute_pipeline.init(&render, &sources)?; + trans_viewer.init(&render, &sources)?; + slice_viewer.init(&self.settings); + device_viewer.init(&geometry); + imgui.init(geometry.num_devices()); + + is_initialized = true; + } + Ok(Signal::UpdateGeometry(geometry)) => { + let geometry = autd3_driver::geometry::Geometry::from_msg(&geometry); + geometry + .iter() + .flat_map(|dev| { + dev.iter().map(|tr| { + let p = tr.position(); + let r = tr.rotation(); + ( + Vector3::new(p.x as _, p.y as _, p.z as _), + Quaternion::new(r.w as _, r.i as _, r.j as _, r.k as _), + ) + }) + }) + .enumerate() + .for_each(|(i, (p, r))| sources.update_geometry(i, p, r)); + + device_viewer.init(&geometry); + field_compute_pipeline.update_source_pos(&sources)?; + trans_viewer.update_source_pos(&sources)?; + } + Ok(Signal::Send(raw)) => { + let tx = TxDatagram::from_msg(&raw); + cpus.iter_mut().for_each(|cpu| { + cpu.send(&tx); + }); + rx_buf + .write() + .unwrap() + .iter_mut() + .zip(cpus.iter()) + .for_each(|(d, s)| { + d.ack = s.ack(); + d.data = s.rx_data(); + }); + + is_source_update = true; + } + Ok(Signal::Close) => { + is_initialized = false; + sources.clear(); + cpus.clear(); + } + Err(TryRecvError::Empty) => {} + _ => {} + } + + match event { + Event::WindowEvent { + event: WindowEvent::CloseRequested, + .. + } => { + is_running = false; + *control_flow = ControlFlow::Exit; + } + Event::WindowEvent { + event: WindowEvent::Resized(..), + window_id, + } if window_id == render.window().id() => { + render.resize(); + imgui.resized(render.window(), &event); + } + Event::WindowEvent { + event: + WindowEvent::ScaleFactorChanged { + scale_factor, + new_inner_size, + }, + window_id, + } if window_id == render.window().id() => { + *new_inner_size = render + .window() + .inner_size() + .to_logical::(render.window().scale_factor()) + .to_physical(scale_factor); + render.resize(); + let event_imgui: Event<'_, ()> = Event::WindowEvent { + window_id, + event: WindowEvent::ScaleFactorChanged { + scale_factor, + new_inner_size, + }, + }; + imgui.resized(render.window(), &event_imgui); + } + Event::MainEventsCleared => { + imgui.prepare_frame(render.window())?; + render.window().request_redraw(); + } + Event::NewEvents(_) => { + imgui.update_delta_time(); + render.window().request_redraw(); + } + Event::RedrawRequested(_) => { + let before_pipeline_future = render.start_frame()?; + + let after_future = { + let framebuffer = render.frame_buffer(); + + let mut builder = AutoCommandBufferBuilder::primary( + render.command_buffer_allocator(), + render.queue().queue_family_index(), + CommandBufferUsage::OneTimeSubmit, + )?; + + let clear_values = vec![ + Some(self.settings.background.into()), + Some(1f32.into()), + None, + ]; + builder + .begin_render_pass( + RenderPassBeginInfo { + clear_values, + ..RenderPassBeginInfo::framebuffer(framebuffer) + }, + Default::default(), + )? + .set_viewport( + 0, + [render.viewport().clone()].into_iter().collect(), + )?; + + if is_initialized { + render.move_camera(&self.settings); + let view = render.get_view(); + let proj = render.get_projection(&self.settings); + let slice_model = slice_viewer.model(); + if self.settings.view_device { + device_viewer.render( + &model, + (view, proj), + &self.settings, + &imgui.visible(), + &mut builder, + )?; + } else { + trans_viewer.render(view, proj, &mut builder)?; + } + slice_viewer.render( + &render, + view, + proj, + &self.settings, + &mut builder, + )?; + builder.end_render_pass(Default::default())?; + + let mut update_flag = imgui.update( + &mut cpus, + &mut sources, + &body_pointer, + &render, + &mut builder, + &mut self.settings, + )?; + if is_source_update { + update_flag.set(UpdateFlag::UPDATE_SOURCE_DRIVE, true); + is_source_update = false; + } + + if update_flag.contains(UpdateFlag::UPDATE_SOURCE_DRIVE) { + cpus.iter().for_each(|cpu| { + let idx = if cpu.fpga().is_stm_mode() { + ImGuiRenderer::stm_idx(imgui.system_time(), cpu) + } else { + 0 + }; + let drives = cpu.fpga().intensities_and_phases(idx); + let m = if self.settings.mod_enable { + let mod_idx = + ImGuiRenderer::mod_idx(imgui.system_time(), cpu); + cpu.fpga().modulation_at(mod_idx) + } else { + 0xFF + }; + sources + .drives_mut() + .skip(body_pointer[cpu.idx()]) + .take(cpu.num_transducers()) + .enumerate() + .for_each(|(i, d)| { + d.amp = (PI + * FPGAEmulator::to_pulse_width(drives[i].0, m) + as f32 + / 512.0) + .sin(); + d.phase = 2. * PI * (drives[i].1 as f32) / 256.0; + d.set_wave_number(40e3, self.settings.sound_speed); + }); + }); + } + + field_compute_pipeline.update( + &render, + &sources, + &self.settings, + &update_flag, + )?; + slice_viewer.update(&render, &self.settings, &update_flag)?; + trans_viewer.update(&sources, &update_flag)?; + let command_buffer = builder.build()?; + + let field_image = slice_viewer.field_image_view(); + + if update_flag.contains(UpdateFlag::SAVE_IMAGE) { + let image_buffer_content = field_image.read()?; + let img_x = (self.settings.slice_width + / self.settings.slice_pixel_size) + as u32; + let img_y = (self.settings.slice_height + / self.settings.slice_pixel_size) + as u32; + let mut img_buf = image::ImageBuffer::new(img_x, img_y); + img_buf + .enumerate_pixels_mut() + .zip(image_buffer_content.iter()) + .for_each(|((_, _, pixel), [r, g, b, a])| { + let r = (r * 255.0) as u8; + let g = (g * 255.0) as u8; + let b = (b * 255.0) as u8; + let a = (a * 255.0) as u8; + *pixel = image::Rgba([r, g, b, a]); + }); + image::imageops::flip_vertical(&img_buf) + .save(&self.settings.image_save_path)?; + } + + let config = Config { + source_num: sources.len() as _, + color_scale: self.settings.slice_color_scale, + width: (self.settings.slice_width + / self.settings.slice_pixel_size) + as _, + height: (self.settings.slice_height + / self.settings.slice_pixel_size) + as _, + pixel_size: self.settings.slice_pixel_size as _, + scale: MILLIMETER, + model: slice_model.into(), + ..Default::default() + }; + let after_compute = field_compute_pipeline + .compute(&render, config, field_image, &self.settings)? + .join(before_pipeline_future); + let future = + after_compute.then_execute(render.queue(), command_buffer)?; + + future.boxed() + } else { + builder.end_render_pass(Default::default())?; + imgui.waiting(&render, &mut builder)?; + + let command_buffer = builder.build()?; + + let future = before_pipeline_future + .then_execute(render.queue(), command_buffer)?; + + future.boxed() + } + }; + + render.finish_frame(after_future); + } + event => { + imgui.handle_event(render.window(), &event); + } + } + + if server_th_ref.is_finished() || !is_running { + *control_flow = ControlFlow::Exit; + } + + Ok(()) + }; + if let Err(e) = run_loop(event, control_flow) { + tracing::error!("{}", e); + *control_flow = ControlFlow::Exit; + } + }); + + let _ = shutdown.send(()); + if let Err(e) = server_th.join().unwrap() { + match e.source() { + Some(e) => tracing::error!("Server error: {}", e), + None => tracing::error!("Server error: {}", e), + } + } + + Ok(res) + } +} diff --git a/simulator/src/slice_viewer.rs b/simulator/src/slice_viewer.rs new file mode 100644 index 0000000..e1924ca --- /dev/null +++ b/simulator/src/slice_viewer.rs @@ -0,0 +1,320 @@ +/* + * File: slice_viewer.rs + * Project: src + * Created Date: 11/11/2021 + * Author: Shun Suzuki + * ----- + * Last Modified: 30/10/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2021 Hapis Lab. All rights reserved. + * + */ + +use std::sync::Arc; + +use bytemuck::{Pod, Zeroable}; +use vulkano::{ + buffer::{Buffer, BufferCreateInfo, BufferUsage, Subbuffer}, + command_buffer::{AutoCommandBufferBuilder, PrimaryAutoCommandBuffer}, + descriptor_set::{PersistentDescriptorSet, WriteDescriptorSet}, + memory::allocator::{AllocationCreateInfo, MemoryTypeFilter}, + pipeline::{ + graphics::{ + color_blend::{AttachmentBlend, ColorBlendAttachmentState, ColorBlendState}, + depth_stencil::{DepthState, DepthStencilState}, + input_assembly::{InputAssemblyState, PrimitiveTopology}, + multisample::MultisampleState, + rasterization::RasterizationState, + vertex_input::{Vertex, VertexDefinition}, + viewport::ViewportState, + GraphicsPipelineCreateInfo, + }, + layout::PipelineDescriptorSetLayoutCreateInfo, + DynamicState, GraphicsPipeline, Pipeline, PipelineBindPoint, PipelineLayout, + PipelineShaderStageCreateInfo, + }, + render_pass::Subpass, +}; + +use crate::{ + common::transform::{to_gl_pos, to_gl_rot}, + renderer::Renderer, + update_flag::UpdateFlag, + viewer_settings::ViewerSettings, + Matrix4, +}; + +#[repr(C)] +#[derive(Default, Debug, Copy, Clone, Zeroable, Pod, Vertex)] +struct SliceVertex { + #[format(R32G32B32A32_SFLOAT)] + position: [f32; 4], + #[format(R32G32_SFLOAT)] + tex_coords: [f32; 2], +} + +#[repr(C)] +#[derive(Default, Debug, Copy, Clone, Zeroable, Pod)] +struct Data { + world: [[f32; 4]; 4], + view: [[f32; 4]; 4], + proj: [[f32; 4]; 4], + width: u32, + height: u32, + _dummy_0: u32, + _dummy_1: u32, +} + +#[allow(clippy::needless_question_mark)] +mod vs { + vulkano_shaders::shader! { + ty: "vertex", + path: "./assets/shaders/slice.vert" + } +} + +#[allow(clippy::needless_question_mark)] +mod fs { + vulkano_shaders::shader! { + ty: "fragment", + path: "./assets/shaders/slice.frag" + } +} + +pub struct SliceViewer { + vertices: Subbuffer<[SliceVertex]>, + indices: Subbuffer<[u32]>, + pipeline: Arc, + model: Matrix4, + field_image_view: Subbuffer<[[f32; 4]]>, +} + +impl SliceViewer { + pub fn new(renderer: &Renderer, settings: &ViewerSettings) -> anyhow::Result { + let device = renderer.device(); + let vertices = Self::create_vertices(renderer, settings)?; + let indices = Self::create_indices(renderer)?; + + let vs = vs::load(device.clone())?.entry_point("main").unwrap(); + let fs = fs::load(device.clone())?.entry_point("main").unwrap(); + + let vertex_input_state = + SliceVertex::per_vertex().definition(&vs.info().input_interface)?; + let stages = [ + PipelineShaderStageCreateInfo::new(vs), + PipelineShaderStageCreateInfo::new(fs), + ]; + let layout = PipelineLayout::new( + device.clone(), + PipelineDescriptorSetLayoutCreateInfo::from_stages(&stages) + .into_pipeline_layout_create_info(device.clone())?, + )?; + let subpass = Subpass::from(renderer.render_pass(), 0).unwrap(); + + let pipeline = GraphicsPipeline::new( + device.clone(), + None, + GraphicsPipelineCreateInfo { + stages: stages.into_iter().collect(), + vertex_input_state: Some(vertex_input_state), + input_assembly_state: Some(InputAssemblyState { + topology: PrimitiveTopology::TriangleStrip, + ..Default::default() + }), + viewport_state: Some(ViewportState::default()), + rasterization_state: Some(RasterizationState::default()), + multisample_state: Some(MultisampleState { + rasterization_samples: renderer.sample_count(), + ..MultisampleState::default() + }), + color_blend_state: Some(ColorBlendState::with_attachment_states( + subpass.num_color_attachments(), + ColorBlendAttachmentState { + blend: Some(AttachmentBlend::alpha()), + ..Default::default() + }, + )), + depth_stencil_state: Some(DepthStencilState { + depth: Some(DepthState::simple()), + ..Default::default() + }), + dynamic_state: [DynamicState::Viewport].into_iter().collect(), + subpass: Some(subpass.into()), + ..GraphicsPipelineCreateInfo::layout(layout) + }, + )?; + + let width = (settings.slice_width / settings.slice_pixel_size) as u32; + let height = (settings.slice_height / settings.slice_pixel_size) as u32; + let field_image_view = Self::create_field_image_view(renderer, [width, height])?; + + Ok(Self { + vertices, + indices, + pipeline, + model: Matrix4::from_scale(1.), + field_image_view, + }) + } + + pub fn init(&mut self, settings: &ViewerSettings) { + self.update_pos(settings); + } + + fn update_pos(&mut self, settings: &ViewerSettings) { + let rotation = to_gl_rot(settings.slice_rotation()); + let mut model = Matrix4::from(rotation); + model[3] = to_gl_pos(settings.slice_pos()).extend(1.); + self.model = model; + } + + pub const fn model(&self) -> Matrix4 { + self.model + } + + pub fn field_image_view(&self) -> Subbuffer<[[f32; 4]]> { + self.field_image_view.clone() + } + + pub fn update( + &mut self, + renderer: &Renderer, + settings: &ViewerSettings, + update_flag: &UpdateFlag, + ) -> anyhow::Result<()> { + if update_flag.contains(UpdateFlag::UPDATE_SLICE_POS) { + self.update_pos(settings); + } + + if update_flag.contains(UpdateFlag::UPDATE_SLICE_SIZE) { + let width = (settings.slice_width / settings.slice_pixel_size) as u32; + let height = (settings.slice_height / settings.slice_pixel_size) as u32; + self.field_image_view = Self::create_field_image_view(renderer, [width, height])?; + self.vertices = Self::create_vertices(renderer, settings)?; + self.indices = Self::create_indices(renderer)?; + } + + Ok(()) + } + + pub fn render( + &mut self, + renderer: &Renderer, + view: Matrix4, + proj: Matrix4, + settings: &ViewerSettings, + builder: &mut AutoCommandBufferBuilder, + ) -> anyhow::Result<()> { + let pc = fs::PushConstsConfig { + pvm: (proj * view * self.model).into(), + width: (settings.slice_width / settings.slice_pixel_size) as _, + height: (settings.slice_height / settings.slice_pixel_size) as _, + }; + + let layout = self.pipeline.layout().set_layouts().get(0).unwrap(); + let desc_set = PersistentDescriptorSet::new( + renderer.descriptor_set_allocator(), + layout.clone(), + [WriteDescriptorSet::buffer(0, self.field_image_view())], + [], + )?; + + builder + .bind_pipeline_graphics(self.pipeline.clone())? + .bind_descriptor_sets( + PipelineBindPoint::Graphics, + self.pipeline.layout().clone(), + 0, + desc_set, + )? + .push_constants(self.pipeline.layout().clone(), 0, pc)? + .bind_vertex_buffers(0, self.vertices.clone())? + .bind_index_buffer(self.indices.clone())? + .draw_indexed(self.indices.len() as u32, 1, 0, 0, 0)?; + + Ok(()) + } + + fn create_field_image_view( + renderer: &Renderer, + view_size: [u32; 2], + ) -> anyhow::Result> { + let data_iter = vec![[0., 0., 0., 1.]; view_size[0] as usize * view_size[1] as usize]; + let buffer = Buffer::from_iter( + renderer.memory_allocator(), + BufferCreateInfo { + usage: BufferUsage::STORAGE_BUFFER, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_DEVICE + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + data_iter, + )?; + Ok(buffer) + } + + fn create_vertices( + renderer: &Renderer, + settings: &ViewerSettings, + ) -> anyhow::Result> { + let width = settings.slice_width; + let height = settings.slice_height; + let buffer = Buffer::from_iter( + renderer.memory_allocator(), + BufferCreateInfo { + usage: BufferUsage::VERTEX_BUFFER, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_DEVICE + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + [ + SliceVertex { + position: [-width / 2.0, -height / 2.0, 0.0, 1.0], + tex_coords: [0.0, 0.0], + }, + SliceVertex { + position: [width / 2.0, -height / 2.0, 0.0, 1.0], + tex_coords: [1.0, 0.0], + }, + SliceVertex { + position: [width / 2.0, height / 2.0, 0.0, 1.0], + tex_coords: [1.0, 1.0], + }, + SliceVertex { + position: [-width / 2.0, height / 2.0, 0.0, 1.0], + tex_coords: [0.0, 1.0], + }, + ] + .iter() + .cloned(), + )?; + + Ok(buffer) + } + + fn create_indices(renderer: &Renderer) -> anyhow::Result> { + let indices: Vec = vec![0, 2, 1, 0, 3, 2]; + let buffer = Buffer::from_iter( + renderer.memory_allocator(), + BufferCreateInfo { + usage: BufferUsage::INDEX_BUFFER, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_DEVICE + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + indices, + )?; + + Ok(buffer) + } +} diff --git a/simulator/src/sound_sources.rs b/simulator/src/sound_sources.rs new file mode 100644 index 0000000..3e7105a --- /dev/null +++ b/simulator/src/sound_sources.rs @@ -0,0 +1,117 @@ +/* + * File: sound_sources.rs + * Project: src + * Created Date: 22/05/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 04/10/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +use std::f32::consts::PI; + +use bytemuck::{Pod, Zeroable}; + +use crate::{Quaternion, Vector3, Vector4}; + +#[repr(C)] +#[derive(Clone, Copy, Debug, Default, Zeroable, Pod)] +pub struct Drive { + pub amp: f32, + pub phase: f32, + pub enable: f32, + pub wave_num: f32, +} + +impl Drive { + pub fn new(amp: f32, phase: f32, enable: f32, frequency: f32, sound_speed: f32) -> Self { + Self { + amp, + phase, + enable, + wave_num: Self::to_wave_number(frequency, sound_speed), + } + } + + pub fn set_wave_number(&mut self, frequency: f32, sound_speed: f32) { + self.wave_num = Self::to_wave_number(frequency, sound_speed); + } + + fn to_wave_number(frequency: f32, sound_speed: f32) -> f32 { + 2.0 * PI * frequency / sound_speed + } +} + +pub struct SoundSources { + pos: Vec, + rot: Vec, + drive: Vec, + visibilities: Vec, +} + +impl SoundSources { + pub const fn new() -> Self { + Self { + pos: vec![], + rot: vec![], + drive: vec![], + visibilities: vec![], + } + } + + pub fn add(&mut self, pos: Vector3, rot: Quaternion, drive: Drive, visibility: f32) { + self.pos.push(pos.extend(0.)); + self.rot.push(rot); + self.drive.push(drive); + self.visibilities.push(visibility); + } + + pub fn clear(&mut self) { + self.pos.clear(); + self.rot.clear(); + self.drive.clear(); + self.visibilities.clear(); + } + + pub fn len(&self) -> usize { + self.pos.len() + } + + pub fn positions(&self) -> impl ExactSizeIterator { + self.pos.iter() + } + + pub fn rotations(&self) -> impl ExactSizeIterator { + self.rot.iter() + } + + pub fn drives(&self) -> impl ExactSizeIterator { + self.drive.iter() + } + + pub fn drives_mut(&mut self) -> impl ExactSizeIterator { + self.drive.iter_mut() + } + + pub fn visibilities(&self) -> impl ExactSizeIterator { + self.visibilities.iter() + } + + pub fn visibilities_mut(&mut self) -> impl ExactSizeIterator { + self.visibilities.iter_mut() + } + + pub fn update_geometry(&mut self, i: usize, pos: Vector3, rot: Quaternion) { + self.pos[i] = pos.extend(0.); + self.rot[i] = rot; + } +} + +impl Default for SoundSources { + fn default() -> Self { + Self::new() + } +} diff --git a/simulator/src/trans_viewer.rs b/simulator/src/trans_viewer.rs new file mode 100644 index 0000000..312ee66 --- /dev/null +++ b/simulator/src/trans_viewer.rs @@ -0,0 +1,470 @@ +/* + * File: trans_viewer.rs + * Project: src + * Created Date: 30/11/2021 + * Author: Shun Suzuki + * ----- + * Last Modified: 30/10/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2021 Hapis Lab. All rights reserved. + * + */ + +use std::{f32::consts::PI, sync::Arc}; + +use autd3_driver::autd3_device::AUTD3; +use bytemuck::{Pod, Zeroable}; +use vulkano::{ + buffer::{Buffer, BufferCreateInfo, BufferUsage, Subbuffer}, + command_buffer::{ + AutoCommandBufferBuilder, CommandBufferUsage, CopyBufferToImageInfo, + PrimaryAutoCommandBuffer, PrimaryCommandBufferAbstract, + }, + descriptor_set::{PersistentDescriptorSet, WriteDescriptorSet}, + format::Format, + image::{ + sampler::{Filter, Sampler, SamplerAddressMode, SamplerCreateInfo, SamplerMipmapMode}, + view::ImageView, + Image, ImageCreateInfo, ImageType, ImageUsage, + }, + memory::allocator::{AllocationCreateInfo, MemoryTypeFilter}, + pipeline::{ + graphics::{ + color_blend::{AttachmentBlend, ColorBlendAttachmentState, ColorBlendState}, + depth_stencil::{DepthState, DepthStencilState}, + input_assembly::{InputAssemblyState, PrimitiveTopology}, + multisample::MultisampleState, + rasterization::RasterizationState, + vertex_input::{Vertex, VertexDefinition}, + viewport::ViewportState, + GraphicsPipelineCreateInfo, + }, + layout::PipelineDescriptorSetLayoutCreateInfo, + DynamicState, GraphicsPipeline, Pipeline, PipelineBindPoint, PipelineLayout, + PipelineShaderStageCreateInfo, + }, + render_pass::Subpass, + sync::GpuFuture, + DeviceSize, +}; + +use crate::{ + common::coloring_method::{coloring_hsv, ColoringMethod}, + renderer::Renderer, + sound_sources::SoundSources, + update_flag::UpdateFlag, + Matrix4, +}; + +#[repr(C)] +#[derive(Default, Debug, Copy, Clone, Zeroable, Pod, Vertex)] +struct CircleVertex { + #[format(R32G32B32A32_SFLOAT)] + position: [f32; 4], + #[format(R32G32_SFLOAT)] + tex_coords: [f32; 2], +} + +#[repr(C)] +#[derive(Default, Debug, Copy, Clone, Zeroable, Pod, Vertex)] +struct ModelInstanceData { + #[format(R32G32B32A32_SFLOAT)] + model: [[f32; 4]; 4], +} + +#[repr(C)] +#[derive(Default, Debug, Copy, Clone, Zeroable, Pod, Vertex)] +struct ColorInstanceData { + #[format(R32G32B32A32_SFLOAT)] + color: [f32; 4], +} + +#[allow(clippy::needless_question_mark)] +mod vs { + vulkano_shaders::shader! { + ty: "vertex", + path: "./assets/shaders/circle.vert" + } +} + +#[allow(clippy::needless_question_mark)] +mod fs { + vulkano_shaders::shader! { + ty: "fragment", + path: "./assets/shaders/circle.frag" + } +} + +pub struct TransViewer { + vertices: Subbuffer<[CircleVertex]>, + indices: Subbuffer<[u32]>, + model_instance_data: Option>, + color_instance_data: Option>, + pipeline: Arc, + texture_desc_set: Arc, + coloring_method: ColoringMethod, +} + +impl TransViewer { + pub fn new(renderer: &Renderer) -> anyhow::Result { + let device = renderer.device(); + let vertices = Self::create_vertices(renderer)?; + let indices = Self::create_indices(renderer)?; + + let vs = vs::load(device.clone())?.entry_point("main").unwrap(); + let fs = fs::load(device.clone())?.entry_point("main").unwrap(); + + let vertex_input_state = [ + CircleVertex::per_vertex(), + ModelInstanceData::per_instance(), + ColorInstanceData::per_instance(), + ] + .definition(&vs.info().input_interface)?; + let stages = [ + PipelineShaderStageCreateInfo::new(vs), + PipelineShaderStageCreateInfo::new(fs), + ]; + let layout = PipelineLayout::new( + device.clone(), + PipelineDescriptorSetLayoutCreateInfo::from_stages(&stages) + .into_pipeline_layout_create_info(device.clone())?, + )?; + let subpass = Subpass::from(renderer.render_pass(), 0).unwrap(); + let pipeline = GraphicsPipeline::new( + device.clone(), + None, + GraphicsPipelineCreateInfo { + stages: stages.into_iter().collect(), + vertex_input_state: Some(vertex_input_state), + input_assembly_state: Some(InputAssemblyState { + topology: PrimitiveTopology::TriangleStrip, + ..Default::default() + }), + viewport_state: Some(ViewportState::default()), + rasterization_state: Some(RasterizationState::default()), + multisample_state: Some(MultisampleState { + rasterization_samples: renderer.sample_count(), + ..MultisampleState::default() + }), + color_blend_state: Some(ColorBlendState::with_attachment_states( + subpass.num_color_attachments(), + ColorBlendAttachmentState { + blend: Some(AttachmentBlend::alpha()), + ..Default::default() + }, + )), + depth_stencil_state: Some(DepthStencilState { + depth: Some(DepthState::simple()), + ..Default::default() + }), + dynamic_state: [DynamicState::Viewport].into_iter().collect(), + subpass: Some(subpass.into()), + ..GraphicsPipelineCreateInfo::layout(layout) + }, + )?; + + let texture_desc_set = Self::create_texture_desc_set(pipeline.clone(), renderer)?; + Ok(Self { + vertices, + indices, + model_instance_data: None, + color_instance_data: None, + pipeline, + texture_desc_set, + coloring_method: coloring_hsv, + }) + } + + pub fn init(&mut self, renderer: &Renderer, sources: &SoundSources) -> anyhow::Result<()> { + self.color_instance_data = Some(Self::create_color_instance_data( + renderer, + sources, + self.coloring_method, + )?); + self.model_instance_data = Some(Self::create_model_instance_data(renderer, sources)?); + Ok(()) + } + + pub fn update( + &mut self, + sources: &SoundSources, + update_flag: &UpdateFlag, + ) -> anyhow::Result<()> { + if update_flag.contains(UpdateFlag::UPDATE_SOURCE_DRIVE) + || update_flag.contains(UpdateFlag::UPDATE_SOURCE_ALPHA) + || update_flag.contains(UpdateFlag::UPDATE_SOURCE_FLAG) + { + self.update_color_instance_data(sources)?; + } + + Ok(()) + } + + pub fn update_source_pos(&mut self, sources: &SoundSources) -> anyhow::Result<()> { + self.update_model_instance_data(sources) + } + + pub fn render( + &mut self, + view: Matrix4, + proj: Matrix4, + builder: &mut AutoCommandBufferBuilder, + ) -> anyhow::Result<()> { + let pc = vs::PushConsts { + proj_view: (proj * view).into(), + }; + + if let (Some(model), Some(color)) = (&self.model_instance_data, &self.color_instance_data) { + builder + .bind_pipeline_graphics(self.pipeline.clone())? + .bind_descriptor_sets( + PipelineBindPoint::Graphics, + self.pipeline.layout().clone(), + 0, + self.texture_desc_set.clone(), + )? + .push_constants(self.pipeline.layout().clone(), 0, pc)? + .bind_vertex_buffers(0, (self.vertices.clone(), model.clone(), color.clone()))? + .bind_index_buffer(self.indices.clone())? + .draw_indexed(self.indices.len() as u32, model.len() as u32, 0, 0, 0)?; + } + + Ok(()) + } + + fn create_model_instance_data( + renderer: &Renderer, + sources: &SoundSources, + ) -> anyhow::Result> { + let buffer = Buffer::from_iter( + renderer.memory_allocator(), + BufferCreateInfo { + usage: BufferUsage::STORAGE_BUFFER | BufferUsage::VERTEX_BUFFER, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_DEVICE + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + sources + .positions() + .zip(sources.rotations()) + .map(|(pos, rot)| { + #[allow(clippy::unnecessary_cast)] + let s = 0.5 * AUTD3::TRANS_SPACING as f32; + let mut m = Matrix4::from_scale(s); + m[3][0] = pos[0]; + m[3][1] = pos[1]; + m[3][2] = pos[2]; + let rotm = Matrix4::from(*rot); + ModelInstanceData { + model: (m * rotm).into(), + } + }), + )?; + + Ok(buffer) + } + + fn create_color_instance_data( + renderer: &Renderer, + sources: &SoundSources, + coloring_method: ColoringMethod, + ) -> anyhow::Result> { + let buffer = Buffer::from_iter( + renderer.memory_allocator(), + BufferCreateInfo { + usage: BufferUsage::STORAGE_BUFFER | BufferUsage::VERTEX_BUFFER, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_DEVICE + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + sources + .drives() + .zip(sources.visibilities()) + .map(|(drive, &v)| { + let color = coloring_method(drive.phase / (2.0 * PI), drive.amp, v); + ColorInstanceData { color } + }), + )?; + + Ok(buffer) + } + + fn create_vertices(renderer: &Renderer) -> anyhow::Result> { + let buffer = Buffer::from_iter( + renderer.memory_allocator(), + BufferCreateInfo { + usage: BufferUsage::VERTEX_BUFFER, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_DEVICE + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + [ + CircleVertex { + position: [-1.0, -1.0, 0.0, 1.0], + tex_coords: [0.0, 1.0], + }, + CircleVertex { + position: [1.0, -1.0, 0.0, 1.0], + tex_coords: [1.0, 1.0], + }, + CircleVertex { + position: [1.0, 1.0, 0.0, 1.0], + tex_coords: [1.0, 0.0], + }, + CircleVertex { + position: [-1.0, 1.0, 0.0, 1.0], + tex_coords: [0.0, 0.0], + }, + ] + .iter() + .cloned(), + )?; + + Ok(buffer) + } + + fn create_indices(renderer: &Renderer) -> anyhow::Result> { + let indices: Vec = vec![0, 1, 2, 2, 3, 0]; + let buffer = Buffer::from_iter( + renderer.memory_allocator(), + BufferCreateInfo { + usage: BufferUsage::INDEX_BUFFER, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_DEVICE + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + indices, + )?; + + Ok(buffer) + } + + fn create_texture_desc_set( + pipeline: Arc, + renderer: &Renderer, + ) -> anyhow::Result> { + let (uploads, texture) = Self::load_image(renderer)?; + let sampler = Sampler::new( + pipeline.device().clone(), + SamplerCreateInfo { + mag_filter: Filter::Linear, + min_filter: Filter::Linear, + mipmap_mode: SamplerMipmapMode::Nearest, + address_mode: [SamplerAddressMode::Repeat; 3], + mip_lod_bias: 0.0, + ..Default::default() + }, + )?; + let layout = pipeline.layout().set_layouts().get(0).unwrap(); + + uploads + .execute(renderer.queue())? + .then_signal_fence_and_flush()? + .wait(None)?; + + let set = PersistentDescriptorSet::new( + renderer.descriptor_set_allocator(), + layout.clone(), + [WriteDescriptorSet::image_view_sampler(0, texture, sampler)], + [], + )?; + Ok(set) + } + + fn load_image( + renderer: &Renderer, + ) -> anyhow::Result<(Arc, Arc)> { + let png_bytes = include_bytes!("../assets/textures/circle.png").as_slice(); + let decoder = png::Decoder::new(png_bytes); + let mut reader = decoder.read_info()?; + let info = reader.info(); + let extent = [info.width, info.height, 1]; + + let upload_buffer = Buffer::new_slice( + renderer.memory_allocator(), + BufferCreateInfo { + usage: BufferUsage::TRANSFER_SRC, + ..Default::default() + }, + AllocationCreateInfo { + memory_type_filter: MemoryTypeFilter::PREFER_HOST + | MemoryTypeFilter::HOST_SEQUENTIAL_WRITE, + ..Default::default() + }, + (info.width * info.height * 4) as DeviceSize, + )?; + + reader.next_frame(&mut upload_buffer.write()?)?; + + let image = Image::new( + renderer.memory_allocator(), + ImageCreateInfo { + image_type: ImageType::Dim2d, + format: Format::R8G8B8A8_SRGB, + extent, + usage: ImageUsage::TRANSFER_DST | ImageUsage::SAMPLED, + ..Default::default() + }, + AllocationCreateInfo::default(), + )?; + + let mut uploads = AutoCommandBufferBuilder::primary( + renderer.command_buffer_allocator(), + renderer.queue().queue_family_index(), + CommandBufferUsage::OneTimeSubmit, + )?; + + uploads.copy_buffer_to_image(CopyBufferToImageInfo::buffer_image( + upload_buffer, + image.clone(), + ))?; + + let image = ImageView::new_default(image)?; + + Ok((uploads.build()?, image)) + } + + fn update_color_instance_data(&mut self, sources: &SoundSources) -> anyhow::Result<()> { + if let Some(data) = &mut self.color_instance_data { + data.write()? + .iter_mut() + .zip(sources.drives().zip(sources.visibilities())) + .for_each(|(d, (drive, &v))| { + d.color = (self.coloring_method)(drive.phase / (2.0 * PI), drive.amp, v); + }); + } + Ok(()) + } + + fn update_model_instance_data(&mut self, sources: &SoundSources) -> anyhow::Result<()> { + if let Some(data) = &mut self.model_instance_data { + data.write()? + .iter_mut() + .zip(sources.positions().zip(sources.rotations())) + .for_each(|(d, (pos, rot))| { + #[allow(clippy::unnecessary_cast)] + let s = 0.5 * AUTD3::TRANS_SPACING as f32; + let mut m = Matrix4::from_scale(s); + m[3][0] = pos[0]; + m[3][1] = pos[1]; + m[3][2] = pos[2]; + let rotm = Matrix4::from(*rot); + d.model = (m * rotm).into(); + }); + } + Ok(()) + } +} diff --git a/simulator/src/update_flag.rs b/simulator/src/update_flag.rs new file mode 100644 index 0000000..dae8c63 --- /dev/null +++ b/simulator/src/update_flag.rs @@ -0,0 +1,25 @@ +/* + * File: update_flag.rs + * Project: src + * Created Date: 26/11/2021 + * Author: Shun Suzuki + * ----- + * Last Modified: 23/05/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2021 Hapis Lab. All rights reserved. + * + */ + +bitflags::bitflags! { + pub struct UpdateFlag: u32 { + const UPDATE_SOURCE_DRIVE = 1 << 0; + const UPDATE_COLOR_MAP = 1 << 1; + const UPDATE_SLICE_POS = 1 << 3; + const UPDATE_SLICE_SIZE = 1 << 4; + const UPDATE_SOURCE_ALPHA = 1 << 5; + const UPDATE_SOURCE_FLAG = 1 << 6; + const SAVE_IMAGE = 1 << 7; + const UPDATE_DEVICE_INFO = 1 << 8; + } +} diff --git a/simulator/src/viewer_settings.rs b/simulator/src/viewer_settings.rs new file mode 100644 index 0000000..30307ab --- /dev/null +++ b/simulator/src/viewer_settings.rs @@ -0,0 +1,187 @@ +/* + * File: viewer_settings.rs + * Project: src + * Created Date: 26/11/2021 + * Author: Shun Suzuki + * ----- + * Last Modified: 04/12/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2021 Hapis Lab. All rights reserved. + * + */ + +use crate::{Quaternion, Vector3, MILLIMETER, ZPARITY}; +use cgmath::{Deg, Euler}; +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub enum ColorMapType { + Viridis, + Magma, + Inferno, + Plasma, +} + +/// Viewer settings +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct ViewerSettings { + pub window_width: u32, + pub window_height: u32, + pub vsync: bool, + pub gpu_idx: i32, + pub slice_pos_x: f32, + pub slice_pos_y: f32, + pub slice_pos_z: f32, + pub slice_width: f32, + pub slice_height: f32, + pub slice_pixel_size: f32, + pub camera_pos_x: f32, + pub camera_pos_y: f32, + pub camera_pos_z: f32, + pub camera_near_clip: f32, + pub camera_far_clip: f32, + pub sound_speed: f32, + pub slice_rot_x: f32, + pub slice_rot_y: f32, + pub slice_rot_z: f32, + pub slice_color_scale: f32, + pub slice_alpha: f32, + pub color_map_type: ColorMapType, + pub show_radiation_pressure: bool, + pub camera_rot_x: f32, + pub camera_rot_y: f32, + pub camera_rot_z: f32, + pub camera_fov: f32, + pub font_size: f32, + pub background: [f32; 4], + pub mod_enable: bool, + pub auto_play: bool, + pub image_save_path: String, + pub port: u16, + pub camera_move_speed: f32, + #[serde(default)] + pub view_device: bool, + #[serde(default = "default_ambient")] + pub ambient: f32, + #[serde(default = "default_specular")] + pub specular: f32, + #[serde(default = "default_light_pos_x")] + pub light_pos_x: f32, + #[serde(default = "default_light_pos_y")] + pub light_pos_y: f32, + #[serde(default = "default_light_pos_z")] + pub light_pos_z: f32, + #[serde(default = "default_light_power")] + pub light_power: f32, + #[serde(default = "default_time_scale")] + pub time_scale: f32, +} + +fn default_ambient() -> f32 { + 60. +} + +fn default_specular() -> f32 { + 80. +} + +fn default_light_pos_x() -> f32 { + 86.6252 * MILLIMETER +} + +fn default_light_pos_y() -> f32 { + -533.2867 * MILLIMETER +} + +fn default_light_pos_z() -> f32 { + 150.0 * MILLIMETER * ZPARITY +} + +fn default_light_power() -> f32 { + 5. +} + +fn default_time_scale() -> f32 { + 1. +} + +impl ViewerSettings { + pub fn new() -> ViewerSettings { + Self::default() + } + + pub(crate) const fn slice_pos(&self) -> Vector3 { + Vector3::new(self.slice_pos_x, self.slice_pos_y, self.slice_pos_z) + } + + pub(crate) fn slice_rotation(&self) -> Quaternion { + Quaternion::from(Euler { + x: Deg(self.slice_rot_x), + y: Deg(self.slice_rot_y), + z: Deg(self.slice_rot_z), + }) + } + + pub(crate) fn set_camera_pos(&mut self, v: Vector3) { + self.camera_pos_x = v.x; + self.camera_pos_y = v.y; + self.camera_pos_z = v.z; + } + + pub(crate) fn set_camera_rot(&mut self, rot: Quaternion) { + let euler = Euler::from(rot); + self.camera_rot_x = Deg::from(euler.x).0; + self.camera_rot_y = Deg::from(euler.y).0; + self.camera_rot_z = Deg::from(euler.z).0; + } +} + +impl Default for ViewerSettings { + fn default() -> Self { + ViewerSettings { + window_width: 800, + window_height: 600, + vsync: true, + gpu_idx: 0, + slice_pos_x: 86.6252 * MILLIMETER, + slice_pos_y: 66.7133 * MILLIMETER, + slice_pos_z: 150.0 * MILLIMETER * ZPARITY, + slice_width: 300.0 * MILLIMETER, + slice_height: 300.0 * MILLIMETER, + slice_pixel_size: 1.0 * MILLIMETER, + camera_pos_x: 86.6252 * MILLIMETER, + camera_pos_y: -533.2867 * MILLIMETER, + camera_pos_z: 150.0 * MILLIMETER * ZPARITY, + camera_near_clip: 0.1 * MILLIMETER, + camera_far_clip: 1000. * MILLIMETER, + sound_speed: 340.0e3 * MILLIMETER, + slice_rot_x: 90.0 * ZPARITY, + slice_rot_y: 0., + slice_rot_z: 0., + slice_color_scale: 2., + slice_alpha: 1., + color_map_type: ColorMapType::Inferno, + show_radiation_pressure: false, + camera_rot_x: 90.0 * ZPARITY, + camera_rot_y: 0., + camera_rot_z: 0., + camera_fov: 45., + font_size: 16., + background: [0.3, 0.3, 0.3, 1.], + mod_enable: false, + auto_play: false, + image_save_path: "image.png".to_string(), + port: 8080, + camera_move_speed: 10. * MILLIMETER, + view_device: false, + ambient: 60., + specular: 80., + light_pos_x: 86.6252 * MILLIMETER, + light_pos_y: -533.2867 * MILLIMETER, + light_pos_z: 150.0 * MILLIMETER * ZPARITY, + light_power: 5., + time_scale: 1.0, + } + } +} diff --git a/src-tauri/.gitignore b/src-tauri/.gitignore new file mode 100644 index 0000000..8bfa033 --- /dev/null +++ b/src-tauri/.gitignore @@ -0,0 +1,8 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ +simulator-* +SOEMAUTDServer-* +NOTICE* +LICENSE* +assets/ diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock new file mode 100644 index 0000000..b5d387d --- /dev/null +++ b/src-tauri/Cargo.lock @@ -0,0 +1,4786 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" + +[[package]] +name = "approx" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "async-broadcast" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +dependencies = [ + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" +dependencies = [ + "concurrent-queue", + "event-listener 4.0.0", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" +dependencies = [ + "async-lock 3.2.0", + "async-task", + "concurrent-queue", + "fastrand 2.0.1", + "futures-lite 2.1.0", + "slab", +] + +[[package]] +name = "async-fs" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "blocking", + "futures-lite 1.13.0", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.27", + "slab", + "socket2", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6d3b15875ba253d1110c740755e246537483f152fa334f91abd7fe84c88b3ff" +dependencies = [ + "async-lock 3.2.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.1.0", + "parking", + "polling 3.3.1", + "rustix 0.38.26", + "slab", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c" +dependencies = [ + "event-listener 4.0.0", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +dependencies = [ + "async-io 1.13.0", + "async-lock 2.8.0", + "async-signal", + "blocking", + "cfg-if", + "event-listener 3.1.0", + "futures-lite 1.13.0", + "rustix 0.38.26", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-recursion" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "async-signal" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" +dependencies = [ + "async-io 2.2.1", + "async-lock 2.8.0", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 0.38.26", + "signal-hook-registry", + "slab", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-task" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" + +[[package]] +name = "async-trait" +version = "0.1.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "atk" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.0", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autd3-driver" +version = "19.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f39dbff9102a322bfb0f9e98beadfc88c7c4f385a5e5e8b71fc5267ab797aeaf" +dependencies = [ + "async-trait", + "bitflags 2.4.1", + "bitvec", + "libc", + "nalgebra", + "serde", + "thiserror", + "windows 0.52.0", +] + +[[package]] +name = "autd3-server" +version = "19.0.0" +dependencies = [ + "autd3-driver", + "libloading", + "serde", + "serde_json", + "tauri", + "tauri-build", + "tokio", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +dependencies = [ + "async-channel", + "async-lock 3.2.0", + "async-task", + "fastrand 2.0.1", + "futures-io", + "futures-lite 2.1.0", + "piper", + "tracing", +] + +[[package]] +name = "brotli" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bstr" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "bytemuck" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "cairo-rs" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "glib", + "libc", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.2.0", +] + +[[package]] +name = "cargo_toml" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" +dependencies = [ + "serde", + "toml 0.7.8", +] + +[[package]] +name = "cc" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-expr" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03915af431787e6ffdcc74c645077518c6b6e01f80b761e0fbbfa288536311b3" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.48.5", +] + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "libc", + "objc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset 0.9.0", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa 0.4.8", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.39", +] + +[[package]] +name = "ctor" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37e366bff8cd32dd8754b0991fb66b279dc48f598c3a18914852a6673deef583" +dependencies = [ + "quote", + "syn 2.0.39", +] + +[[package]] +name = "darling" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.39", +] + +[[package]] +name = "darling_macro" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "deranged" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "embed-resource" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f54cc3e827ee1c3812239a9a41dede7b4d7d5d5464faa32d71bd7cba28ce2cb2" +dependencies = [ + "cc", + "rustc_version", + "toml 0.8.8", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enumflags2" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5998b4f30320c9d93aed72f63af821bfdac50465b75428fce77b48ec482c3939" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "770d968249b5d99410d61f5bf89057f3199a077a04d087092f58e7d10692baae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.0", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "fdeflate" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d6dafc854908ff5da46ff3f8f473c6984119a2876a383a860246dd7841a868" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset 0.9.0", + "rustc_version", +] + +[[package]] +name = "filetime" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "windows-sys 0.52.0", +] + +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" + +[[package]] +name = "futures-executor" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeee267a1883f7ebef3700f262d2d54de95dfaf38189015a74fdc4e0c7ad8143" +dependencies = [ + "fastrand 2.0.1", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "futures-sink" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" + +[[package]] +name = "futures-task" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" + +[[package]] +name = "futures-util" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +dependencies = [ + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +dependencies = [ + "bitflags 1.3.2", + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.0", +] + +[[package]] +name = "gdk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps 6.2.0", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps 6.2.0", +] + +[[package]] +name = "gdkx11-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps 6.2.0", + "x11", +] + +[[package]] +name = "generator" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows 0.48.0", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "gio" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.0", + "winapi", +] + +[[package]] +name = "glib" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.15.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "glib-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +dependencies = [ + "libc", + "system-deps 6.2.0", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "globset" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", +] + +[[package]] +name = "gobject-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.2.0", +] + +[[package]] +name = "gtk" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +dependencies = [ + "atk", + "bitflags 1.3.2", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "once_cell", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps 6.2.0", +] + +[[package]] +name = "gtk3-macros" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" +dependencies = [ + "anyhow", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "hermit-abi" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "html5ever" +version = "0.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" +dependencies = [ + "log", + "mac", + "markup5ever 0.10.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "html5ever" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" +dependencies = [ + "log", + "mac", + "markup5ever 0.11.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "http" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.9", +] + +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + +[[package]] +name = "iana-time-zone" +version = "0.1.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core 0.51.1", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "ignore" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "747ad1b4ae841a78e8aba0d63adbfbeaea26b517b63705d47856b73015d27060" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata 0.4.3", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "image" +version = "0.24.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-rational", + "num-traits", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", + "serde", +] + +[[package]] +name = "infer" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc" +dependencies = [ + "cfb", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + +[[package]] +name = "javascriptcore-rs" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ff1e1486799e3f64129f8ccad108b38290df9cd7015cd31bed17239f0789d6" +dependencies = [ + "serde", + "serde_json", + "thiserror", + "treediff", +] + +[[package]] +name = "kuchiki" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" +dependencies = [ + "cssparser", + "html5ever 0.25.2", + "matches", + "selectors", +] + +[[package]] +name = "kuchikiki" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" +dependencies = [ + "cssparser", + "html5ever 0.26.0", + "indexmap 1.9.3", + "matches", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.150" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" + +[[package]] +name = "libloading" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "libredox" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +dependencies = [ + "bitflags 2.4.1", + "libc", + "redox_syscall", +] + +[[package]] +name = "line-wrap" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" +dependencies = [ + "safemem", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" + +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "mac-notification-sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51fca4d74ff9dbaac16a01b924bc3693fa2bba0862c2c633abc73f9a8ea21f64" +dependencies = [ + "cc", + "dirs-next", + "objc-foundation", + "objc_id", + "time", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" +dependencies = [ + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "markup5ever" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" +dependencies = [ + "log", + "phf 0.10.1", + "phf_codegen 0.10.0", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matrixmultiply" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "memchr" +version = "2.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "nalgebra" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "307ed9b18cc2423f29e83f84fd23a8e73628727990181f18641a8b5dc2ab1caa" +dependencies = [ + "approx", + "matrixmultiply", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "ndk" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "notify-rust" +version = "4.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "827c5edfa80235ded4ab3fe8e9dc619b4f866ef16fe9b1c6b8a7f8692c0f2226" +dependencies = [ + "log", + "mac-notification-sys", + "serde", + "tauri-winrt-notification", + "zbus", +] + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-complex" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "os_info" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "006e42d5b888366f1880eda20371fedde764ed2213dc8496f49622fa0c99cd5e" +dependencies = [ + "log", + "serde", + "winapi", +] + +[[package]] +name = "os_pipe" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae859aa07428ca9a929b936690f8b12dc5f11dd8c6992a18ca93919f28bc177" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pango" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +dependencies = [ + "bitflags 1.3.2", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.0", +] + +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros 0.11.2", + "phf_shared 0.11.2", +] + +[[package]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "rand 0.8.5", +] + +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand 2.0.1", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "plist" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef" +dependencies = [ + "base64 0.21.5", + "indexmap 2.1.0", + "line-wrap", + "quick-xml 0.31.0", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e" +dependencies = [ + "cfg-if", + "concurrent-queue", + "pin-project-lite", + "rustix 0.38.26", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-xml" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" +dependencies = [ + "memchr", +] + +[[package]] +name = "quick-xml" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.11", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_users" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +dependencies = [ + "getrandom 0.2.11", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "rfd" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0149778bd99b6959285b0933288206090c50e2327f47a9c463bfdbf45c8823ea" +dependencies = [ + "block", + "dispatch", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "lazy_static", + "log", + "objc", + "objc-foundation", + "objc_id", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows 0.37.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys 0.4.12", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + +[[package]] +name = "safe_arch" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "safemem" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + +[[package]] +name = "semver" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.193" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa 1.0.9", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "serde_spanned" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_with" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +dependencies = [ + "base64 0.21.5", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.1.0", + "serde", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shared_child" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "simba" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "061507c94fc6ab4ba1c9a0305018408e312e17c041eb63bef8aa726fa33aceae" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "soup2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +dependencies = [ + "bitflags 1.3.2", + "gio", + "glib", + "libc", + "once_cell", + "soup2-sys", +] + +[[package]] +name = "soup2-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +dependencies = [ + "bitflags 1.3.2", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +dependencies = [ + "loom", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sys-locale" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8a11bd9c338fdba09f7881ab41551932ad42e405f61d01e8406baea71c07aee" +dependencies = [ + "js-sys", + "libc", + "wasm-bindgen", + "web-sys", + "windows-sys 0.45.0", +] + +[[package]] +name = "system-deps" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" +dependencies = [ + "cfg-expr 0.9.1", + "heck 0.3.3", + "pkg-config", + "toml 0.5.11", + "version-compare 0.0.11", +] + +[[package]] +name = "system-deps" +version = "6.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2d580ff6a20c55dfb86be5f9c238f67835d0e81cbdea8bf5680e0897320331" +dependencies = [ + "cfg-expr 0.15.5", + "heck 0.4.1", + "pkg-config", + "toml 0.8.8", + "version-compare 0.1.1", +] + +[[package]] +name = "tao" +version = "0.16.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75f5aefd6be4cd3ad3f047442242fd9f57cbfb3e565379f66b5e14749364fa4f" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "cc", + "cocoa", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "gdk", + "gdk-pixbuf", + "gdk-sys", + "gdkwayland-sys", + "gdkx11-sys", + "gio", + "glib", + "glib-sys", + "gtk", + "image", + "instant", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc", + "once_cell", + "parking_lot", + "png", + "raw-window-handle", + "scopeguard", + "serde", + "tao-macros", + "unicode-segmentation", + "uuid", + "windows 0.39.0", + "windows-implement", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tar" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-lexicon" +version = "0.12.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" + +[[package]] +name = "tauri" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32d563b672acde8d0cc4c1b1f5b855976923f67e8d6fe1eba51df0211e197be2" +dependencies = [ + "anyhow", + "cocoa", + "dirs-next", + "embed_plist", + "encoding_rs", + "flate2", + "futures-util", + "glib", + "glob", + "gtk", + "heck 0.4.1", + "http", + "ignore", + "notify-rust", + "objc", + "once_cell", + "os_info", + "os_pipe", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "regex", + "rfd", + "semver", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "shared_child", + "state", + "sys-locale", + "tar", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "tempfile", + "thiserror", + "tokio", + "url", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-build" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defbfc551bd38ab997e5f8e458f87396d2559d05ce32095076ad6c30f7fc5f9c" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs-next", + "heck 0.4.1", + "json-patch", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b3475e55acec0b4a50fb96435f19631fb58cbcd31923e1a213de5c382536bbb" +dependencies = [ + "base64 0.21.5", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "regex", + "semver", + "serde", + "serde_json", + "sha2", + "tauri-utils", + "thiserror", + "time", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acea6445eececebd72ed7720cfcca46eee3b5bad8eb408be8f7ef2e3f7411500" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07f8e9e53e00e9f41212c115749e87d5cd2a9eebccafca77a19722eeecd56d43" +dependencies = [ + "gtk", + "http", + "http-range", + "rand 0.8.5", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "url", + "uuid", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-runtime-wry" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "803a01101bc611ba03e13329951a1bde44287a54234189b9024b78619c1bc206" +dependencies = [ + "cocoa", + "gtk", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "tauri-runtime", + "tauri-utils", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a52165bb340e6f6a75f1f5eeeab1bb49f861c12abe3a176067d53642b5454986" +dependencies = [ + "brotli", + "ctor", + "dunce", + "glob", + "heck 0.4.1", + "html5ever 0.26.0", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.2", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "serde_with", + "thiserror", + "url", + "walkdir", + "windows-version", +] + +[[package]] +name = "tauri-winres" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" +dependencies = [ + "embed-resource", + "toml 0.7.8", +] + +[[package]] +name = "tauri-winrt-notification" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "006851c9ccefa3c38a7646b8cec804bb429def3da10497bfa977179869c3e8e2" +dependencies = [ + "quick-xml 0.30.0", + "windows 0.51.1", +] + +[[package]] +name = "tempfile" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +dependencies = [ + "cfg-if", + "fastrand 2.0.1", + "redox_syscall", + "rustix 0.38.26", + "windows-sys 0.48.0", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + +[[package]] +name = "thiserror" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +dependencies = [ + "deranged", + "itoa 1.0.9", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +dependencies = [ + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "pin-project-lite", + "signal-hook-registry", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.19.15", +] + +[[package]] +name = "toml" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.21.0", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.1.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +dependencies = [ + "indexmap 2.1.0", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "treediff" +version = "4.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303" +dependencies = [ + "serde_json", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "uds_windows" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" +dependencies = [ + "tempfile", + "winapi", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +dependencies = [ + "getrandom 0.2.11", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + +[[package]] +name = "version-compare" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579a42fc0b8e0c63b76519a339be31bed574929511fa53c1a3acae26eb258f29" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "waker-fn" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" + +[[package]] +name = "walkdir" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.39", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" + +[[package]] +name = "web-sys" +version = "0.3.66" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webkit2gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup2", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pango-sys", + "pkg-config", + "soup2-sys", + "system-deps 6.2.0", +] + +[[package]] +name = "webview2-com" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "webview2-com-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "webview2-com-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +dependencies = [ + "regex", + "serde", + "serde_json", + "thiserror", + "windows 0.39.0", + "windows-bindgen", + "windows-metadata", +] + +[[package]] +name = "wide" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c68938b57b33da363195412cfc5fc37c9ed49aa9cfe2156fde64b8d2c9498242" +dependencies = [ + "bytemuck", + "safe_arch", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b543186b344cc61c85b5aab0d2e3adf4e0f99bc076eff9aa5927bcc0b8a647" +dependencies = [ + "windows_aarch64_msvc 0.37.0", + "windows_i686_gnu 0.37.0", + "windows_i686_msvc 0.37.0", + "windows_x86_64_gnu 0.37.0", + "windows_x86_64_msvc 0.37.0", +] + +[[package]] +name = "windows" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +dependencies = [ + "windows-implement", + "windows_aarch64_msvc 0.39.0", + "windows_i686_gnu 0.39.0", + "windows_i686_msvc 0.39.0", + "windows_x86_64_gnu 0.39.0", + "windows_x86_64_msvc 0.39.0", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" +dependencies = [ + "windows-core 0.51.1", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core 0.52.0", + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-bindgen" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +dependencies = [ + "windows-metadata", + "windows-tokens", +] + +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-implement" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +dependencies = [ + "syn 1.0.109", + "windows-tokens", +] + +[[package]] +name = "windows-metadata" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + +[[package]] +name = "windows-tokens" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" + +[[package]] +name = "windows-version" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75aa004c988e080ad34aff5739c39d0312f4684699d6d71fc8a198d057b8b9b4" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2623277cb2d1c216ba3b578c0f3cf9cdebeddb6e66b1b218bb33596ea7769c3a" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + +[[package]] +name = "windows_i686_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3925fd0b0b804730d44d4b6278c50f9699703ec49bcd628020f46f4ba07d9e1" + +[[package]] +name = "windows_i686_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + +[[package]] +name = "windows_i686_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce907ac74fe331b524c1298683efbf598bb031bc84d5e274db2083696d07c57c" + +[[package]] +name = "windows_i686_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2babfba0828f2e6b32457d5341427dcbb577ceef556273229959ac23a10af33d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4dd6dc7df2d84cf7b33822ed5b86318fb1781948e9663bacd047fc9dd52259d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "winnow" +version = "0.5.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67b5f0a4e7a27a64c651977932b9dc5667ca7fc31ac44b03ed37a0cf42fdfff" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "937f3df7948156640f46aacef17a70db0de5917bda9c92b0f751f3a955b588fc" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wry" +version = "0.24.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a70547e8f9d85da0f5af609143f7bde3ac7457a6e1073104d9b73d6c5ac744" +dependencies = [ + "base64 0.13.1", + "block", + "cocoa", + "core-graphics", + "crossbeam-channel", + "dunce", + "gdk", + "gio", + "glib", + "gtk", + "html5ever 0.25.2", + "http", + "kuchiki", + "libc", + "log", + "objc", + "objc_id", + "once_cell", + "serde", + "serde_json", + "sha2", + "soup2", + "tao", + "thiserror", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "xattr" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985" +dependencies = [ + "libc", +] + +[[package]] +name = "xdg-home" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd" +dependencies = [ + "nix", + "winapi", +] + +[[package]] +name = "zbus" +version = "3.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io 1.13.0", + "async-lock 2.8.0", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "byteorder", + "derivative", + "enumflags2", + "event-listener 2.5.3", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix", + "once_cell", + "ordered-stream", + "rand 0.8.5", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "winapi", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "3.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "regex", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb80bb776dbda6e23d705cf0123c3b95df99c4ebeaec6c2599d4a5419902b4a9" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zvariant" +version = "3.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44b291bee0d960c53170780af148dca5fa260a63cdd24f1962fa82e03e53338c" +dependencies = [ + "byteorder", + "enumflags2", + "libc", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "3.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml new file mode 100644 index 0000000..9f4e7ed --- /dev/null +++ b/src-tauri/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "autd3-server" +version = "19.0.0" +description = "AUTD Server app" +authors = ["shun suzuki "] +edition = "2021" +repository = "https://github.com/shinolab/autd3" +keywords = ["autd"] + +license = "MIT" +default-run = "autd3-server" + +rust-version = "1.60" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] +tauri-build = { version = "1.4.0", features = [] } + +[dependencies] +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } +tauri = { version = "1.4.0", features = ["window-all", "shell-sidecar", "dialog-all", "notification-all", "os-all", "path-all"] } +tokio = { version = "1.34.0", features = ["macros", "rt-multi-thread", "time", "process"] } +autd3-driver = { version = "19.0.0", features = ["serde"] } + +[target.'cfg(windows)'.dependencies] +libloading = "0.8.0" + +[features] +# this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled. +# If you use cargo directly instead of tauri's cli you can use this feature flag to switch between tauri's `dev` and `build` modes. +# DO NOT REMOVE!! +custom-protocol = ["tauri/custom-protocol"] diff --git a/src-tauri/ThirdPartyNotice.txt b/src-tauri/ThirdPartyNotice.txt new file mode 100644 index 0000000..15177d0 --- /dev/null +++ b/src-tauri/ThirdPartyNotice.txt @@ -0,0 +1,2798 @@ +THIRD-PARTY SOFTWARE NOTICES AND INFORMATION + +This software includes the following third-party components. +The license terms for each of these components are provided later in this notice. + + +--------------------------------------------------------- + +addr2line 0.21.0 (Apache-2.0 OR MIT) +https://github.com/gimli-rs/addr2line +--------------------------------------------------------- + +adler 1.0.2 (0BSD OR Apache-2.0 OR MIT) +https://github.com/jonas-schievink/adler.git +--------------------------------------------------------- + +aho-corasick 1.1.2 (MIT OR Unlicense) +https://github.com/BurntSushi/aho-corasick +--------------------------------------------------------- + +alloc-no-stdlib 2.0.4 (BSD-3-Clause) +https://github.com/dropbox/rust-alloc-no-stdlib +--------------------------------------------------------- + +alloc-stdlib 0.2.2 (BSD-3-Clause) +https://github.com/dropbox/rust-alloc-no-stdlib +--------------------------------------------------------- + +android-tzdata 0.1.1 (Apache-2.0 OR MIT) +https://github.com/RumovZ/android-tzdata +--------------------------------------------------------- + +android_system_properties 0.1.5 (Apache-2.0 OR MIT) +https://github.com/nical/android_system_properties +--------------------------------------------------------- + +anyhow 1.0.75 (Apache-2.0 OR MIT) +https://github.com/dtolnay/anyhow +--------------------------------------------------------- + +approx 0.5.1 (Apache-2.0) +https://github.com/brendanzab/approx +--------------------------------------------------------- + +async-broadcast 0.5.1 (Apache-2.0 OR MIT) +https://github.com/smol-rs/async-broadcast +--------------------------------------------------------- + +async-channel 2.1.1 (Apache-2.0 OR MIT) +https://github.com/smol-rs/async-channel +--------------------------------------------------------- + +async-executor 1.8.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/async-executor +--------------------------------------------------------- + +async-fs 1.6.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/async-fs +--------------------------------------------------------- + +async-io 1.13.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/async-io +--------------------------------------------------------- + +async-io 2.2.1 (Apache-2.0 OR MIT) +https://github.com/smol-rs/async-io +--------------------------------------------------------- + +async-lock 2.8.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/async-lock +--------------------------------------------------------- + +async-lock 3.2.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/async-lock +--------------------------------------------------------- + +async-process 1.8.1 (Apache-2.0 OR MIT) +https://github.com/smol-rs/async-process +--------------------------------------------------------- + +async-recursion 1.0.5 (Apache-2.0 OR MIT) +https://github.com/dcchut/async-recursion +--------------------------------------------------------- + +async-signal 0.2.5 (Apache-2.0 OR MIT) +https://github.com/smol-rs/async-signal +--------------------------------------------------------- + +async-task 4.5.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/async-task +--------------------------------------------------------- + +async-trait 0.1.74 (Apache-2.0 OR MIT) +https://github.com/dtolnay/async-trait +--------------------------------------------------------- + +atk 0.15.1 (MIT) +https://github.com/gtk-rs/gtk3-rs +--------------------------------------------------------- + +atk-sys 0.15.1 (MIT) +https://github.com/gtk-rs/gtk3-rs +--------------------------------------------------------- + +atomic-waker 1.1.2 (Apache-2.0 OR MIT) +https://github.com/smol-rs/atomic-waker +--------------------------------------------------------- + +autd3-driver 19.0.0 (MIT) +https://github.com/shinolab/autd3 +--------------------------------------------------------- + +autd3-server 19.0.0 (MIT) +https://github.com/shinolab/autd3 +--------------------------------------------------------- + +autocfg 1.1.0 (Apache-2.0 OR MIT) +https://github.com/cuviper/autocfg +--------------------------------------------------------- + +backtrace 0.3.69 (Apache-2.0 OR MIT) +https://github.com/rust-lang/backtrace-rs +--------------------------------------------------------- + +base64 0.13.1 (Apache-2.0 OR MIT) +https://github.com/marshallpierce/rust-base64 +--------------------------------------------------------- + +base64 0.21.5 (Apache-2.0 OR MIT) +https://github.com/marshallpierce/rust-base64 +--------------------------------------------------------- + +bitflags 1.3.2 (Apache-2.0 OR MIT) +https://github.com/bitflags/bitflags +--------------------------------------------------------- + +bitflags 2.4.1 (Apache-2.0 OR MIT) +https://github.com/bitflags/bitflags +--------------------------------------------------------- + +bitvec 1.0.1 (MIT) +https://github.com/bitvecto-rs/bitvec +--------------------------------------------------------- + +block 0.1.6 (MIT) +http://github.com/SSheldon/rust-block +--------------------------------------------------------- + +block-buffer 0.10.4 (Apache-2.0 OR MIT) +https://github.com/RustCrypto/utils +--------------------------------------------------------- + +blocking 1.5.1 (Apache-2.0 OR MIT) +https://github.com/smol-rs/blocking +--------------------------------------------------------- + +brotli 3.4.0 (BSD-3-Clause OR MIT) +https://github.com/dropbox/rust-brotli +--------------------------------------------------------- + +brotli-decompressor 2.5.1 (BSD-3-Clause OR MIT) +https://github.com/dropbox/rust-brotli-decompressor +--------------------------------------------------------- + +bstr 1.8.0 (Apache-2.0 OR MIT) +https://github.com/BurntSushi/bstr +--------------------------------------------------------- + +bumpalo 3.14.0 (Apache-2.0 OR MIT) +https://github.com/fitzgen/bumpalo +--------------------------------------------------------- + +bytemuck 1.14.0 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Lokathor/bytemuck +--------------------------------------------------------- + +byteorder 1.5.0 (MIT OR Unlicense) +https://github.com/BurntSushi/byteorder +--------------------------------------------------------- + +bytes 1.5.0 (MIT) +https://github.com/tokio-rs/bytes +--------------------------------------------------------- + +cairo-rs 0.15.12 (MIT) +https://github.com/gtk-rs/gtk-rs-core +--------------------------------------------------------- + +cairo-sys-rs 0.15.1 (MIT) +https://github.com/gtk-rs/gtk-rs-core +--------------------------------------------------------- + +cargo_toml 0.15.3 (Apache-2.0 OR MIT) +https://gitlab.com/crates.rs/cargo_toml +--------------------------------------------------------- + +cc 1.0.83 (Apache-2.0 OR MIT) +https://github.com/rust-lang/cc-rs +--------------------------------------------------------- + +cesu8 1.1.0 (Apache-2.0 OR MIT) +https://github.com/emk/cesu8-rs +--------------------------------------------------------- + +cfb 0.7.3 (MIT) +https://github.com/mdsteele/rust-cfb +--------------------------------------------------------- + +cfg-expr 0.9.1 (Apache-2.0 OR MIT) +https://github.com/EmbarkStudios/cfg-expr +--------------------------------------------------------- + +cfg-expr 0.15.5 (Apache-2.0 OR MIT) +https://github.com/EmbarkStudios/cfg-expr +--------------------------------------------------------- + +cfg-if 1.0.0 (Apache-2.0 OR MIT) +https://github.com/alexcrichton/cfg-if +--------------------------------------------------------- + +chrono 0.4.31 (Apache-2.0 OR MIT) +https://github.com/chronotope/chrono +--------------------------------------------------------- + +cocoa 0.24.1 (Apache-2.0 OR MIT) +https://github.com/servo/core-foundation-rs +--------------------------------------------------------- + +cocoa-foundation 0.1.2 (Apache-2.0 OR MIT) +https://github.com/servo/core-foundation-rs +--------------------------------------------------------- + +color_quant 1.1.0 (MIT) +https://github.com/image-rs/color_quant.git +--------------------------------------------------------- + +combine 4.6.6 (MIT) +https://github.com/Marwes/combine +--------------------------------------------------------- + +concurrent-queue 2.4.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/concurrent-queue +--------------------------------------------------------- + +convert_case 0.4.0 (MIT) +https://github.com/rutrum/convert-case +--------------------------------------------------------- + +core-foundation 0.9.4 (Apache-2.0 OR MIT) +https://github.com/servo/core-foundation-rs +--------------------------------------------------------- + +core-foundation-sys 0.8.6 (Apache-2.0 OR MIT) +https://github.com/servo/core-foundation-rs +--------------------------------------------------------- + +core-graphics 0.22.3 (Apache-2.0 OR MIT) +https://github.com/servo/core-foundation-rs +--------------------------------------------------------- + +core-graphics-types 0.1.3 (Apache-2.0 OR MIT) +https://github.com/servo/core-foundation-rs +--------------------------------------------------------- + +cpufeatures 0.2.11 (Apache-2.0 OR MIT) +https://github.com/RustCrypto/utils +--------------------------------------------------------- + +crc32fast 1.3.2 (Apache-2.0 OR MIT) +https://github.com/srijs/rust-crc32fast +--------------------------------------------------------- + +crossbeam-channel 0.5.8 (Apache-2.0 OR MIT) +https://github.com/crossbeam-rs/crossbeam +--------------------------------------------------------- + +crossbeam-deque 0.8.3 (Apache-2.0 OR MIT) +https://github.com/crossbeam-rs/crossbeam +--------------------------------------------------------- + +crossbeam-epoch 0.9.15 (Apache-2.0 OR MIT) +https://github.com/crossbeam-rs/crossbeam +--------------------------------------------------------- + +crossbeam-utils 0.8.16 (Apache-2.0 OR MIT) +https://github.com/crossbeam-rs/crossbeam +--------------------------------------------------------- + +crypto-common 0.1.6 (Apache-2.0 OR MIT) +https://github.com/RustCrypto/traits +--------------------------------------------------------- + +cssparser 0.27.2 (MPL-2.0) +https://github.com/servo/rust-cssparser +--------------------------------------------------------- + +cssparser-macros 0.6.1 (MPL-2.0) +https://github.com/servo/rust-cssparser +--------------------------------------------------------- + +ctor 0.2.5 (Apache-2.0 OR MIT) +https://github.com/mmastrac/rust-ctor +--------------------------------------------------------- + +darling 0.20.3 (MIT) +https://github.com/TedDriggs/darling +--------------------------------------------------------- + +darling_core 0.20.3 (MIT) +https://github.com/TedDriggs/darling +--------------------------------------------------------- + +darling_macro 0.20.3 (MIT) +https://github.com/TedDriggs/darling +--------------------------------------------------------- + +deranged 0.3.10 (Apache-2.0 OR MIT) +https://github.com/jhpratt/deranged +--------------------------------------------------------- + +derivative 2.2.0 (Apache-2.0 OR MIT) +https://github.com/mcarton/rust-derivative +--------------------------------------------------------- + +derive_more 0.99.17 (MIT) +https://github.com/JelteF/derive_more +--------------------------------------------------------- + +digest 0.10.7 (Apache-2.0 OR MIT) +https://github.com/RustCrypto/traits +--------------------------------------------------------- + +dirs-next 2.0.0 (Apache-2.0 OR MIT) +https://github.com/xdg-rs/dirs +--------------------------------------------------------- + +dirs-sys-next 0.1.2 (Apache-2.0 OR MIT) +https://github.com/xdg-rs/dirs/tree/master/dirs-sys +--------------------------------------------------------- + +dispatch 0.2.0 (MIT) +http://github.com/SSheldon/rust-dispatch +--------------------------------------------------------- + +dtoa 1.0.9 (Apache-2.0 OR MIT) +https://github.com/dtolnay/dtoa +--------------------------------------------------------- + +dtoa-short 0.3.4 (MPL-2.0) +https://github.com/upsuper/dtoa-short +--------------------------------------------------------- + +dunce 1.0.4 (Apache-2.0 OR CC0-1.0 OR MIT-0) +https://gitlab.com/kornelski/dunce +--------------------------------------------------------- + +embed-resource 2.4.0 (MIT) +https://github.com/nabijaczleweli/rust-embed-resource +--------------------------------------------------------- + +embed_plist 1.2.2 (Apache-2.0 OR MIT) +https://github.com/nvzqz/embed-plist-rs +--------------------------------------------------------- + +encoding_rs 0.8.33 ((Apache-2.0 OR MIT) AND BSD-3-Clause) +https://github.com/hsivonen/encoding_rs +--------------------------------------------------------- + +enumflags2 0.7.8 (Apache-2.0 OR MIT) +https://github.com/meithecatte/enumflags2 +--------------------------------------------------------- + +enumflags2_derive 0.7.8 (Apache-2.0 OR MIT) +https://github.com/meithecatte/enumflags2 +--------------------------------------------------------- + +equivalent 1.0.1 (Apache-2.0 OR MIT) +https://github.com/cuviper/equivalent +--------------------------------------------------------- + +errno 0.3.8 (Apache-2.0 OR MIT) +https://github.com/lambda-fairy/rust-errno +--------------------------------------------------------- + +event-listener 2.5.3 (Apache-2.0 OR MIT) +https://github.com/smol-rs/event-listener +--------------------------------------------------------- + +event-listener 3.1.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/event-listener +--------------------------------------------------------- + +event-listener 4.0.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/event-listener +--------------------------------------------------------- + +event-listener-strategy 0.4.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/event-listener +--------------------------------------------------------- + +fastrand 1.9.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/fastrand +--------------------------------------------------------- + +fastrand 2.0.1 (Apache-2.0 OR MIT) +https://github.com/smol-rs/fastrand +--------------------------------------------------------- + +fdeflate 0.3.1 (Apache-2.0 OR MIT) +https://github.com/image-rs/fdeflate +--------------------------------------------------------- + +field-offset 0.3.6 (Apache-2.0 OR MIT) +https://github.com/Diggsey/rust-field-offset +--------------------------------------------------------- + +filetime 0.2.23 (Apache-2.0 OR MIT) +https://github.com/alexcrichton/filetime +--------------------------------------------------------- + +flate2 1.0.28 (Apache-2.0 OR MIT) +https://github.com/rust-lang/flate2-rs +--------------------------------------------------------- + +fnv 1.0.7 (Apache-2.0 OR MIT) +https://github.com/servo/rust-fnv +--------------------------------------------------------- + +foreign-types 0.3.2 (Apache-2.0 OR MIT) +https://github.com/sfackler/foreign-types +--------------------------------------------------------- + +foreign-types-shared 0.1.1 (Apache-2.0 OR MIT) +https://github.com/sfackler/foreign-types +--------------------------------------------------------- + +form_urlencoded 1.2.1 (Apache-2.0 OR MIT) +https://github.com/servo/rust-url +--------------------------------------------------------- + +funty 2.0.0 (MIT) +https://github.com/myrrlyn/funty +--------------------------------------------------------- + +futf 0.1.5 (Apache-2.0 OR MIT) +https://github.com/servo/futf +--------------------------------------------------------- + +futures-channel 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-core 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-executor 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-io 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-lite 1.13.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/futures-lite +--------------------------------------------------------- + +futures-lite 2.1.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/futures-lite +--------------------------------------------------------- + +futures-macro 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-sink 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-task 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +futures-util 0.3.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/futures-rs +--------------------------------------------------------- + +fxhash 0.2.1 (Apache-2.0 OR MIT) +https://github.com/cbreeden/fxhash +--------------------------------------------------------- + +gdk 0.15.4 (MIT) +https://github.com/gtk-rs/gtk3-rs +--------------------------------------------------------- + +gdk-pixbuf 0.15.11 (MIT) +https://github.com/gtk-rs/gtk-rs-core +--------------------------------------------------------- + +gdk-pixbuf-sys 0.15.10 (MIT) +https://github.com/gtk-rs/gtk-rs-core +--------------------------------------------------------- + +gdk-sys 0.15.1 (MIT) +https://github.com/gtk-rs/gtk3-rs +--------------------------------------------------------- + +gdkwayland-sys 0.15.3 (MIT) +https://github.com/gtk-rs/gtk3-rs +--------------------------------------------------------- + +gdkx11-sys 0.15.1 (MIT) +https://github.com/gtk-rs/gtk3-rs +--------------------------------------------------------- + +generator 0.7.5 (Apache-2.0 OR MIT) +https://github.com/Xudong-Huang/generator-rs.git +--------------------------------------------------------- + +generic-array 0.14.7 (MIT) +https://github.com/fizyk20/generic-array.git +--------------------------------------------------------- + +getrandom 0.1.16 (Apache-2.0 OR MIT) +https://github.com/rust-random/getrandom +--------------------------------------------------------- + +getrandom 0.2.11 (Apache-2.0 OR MIT) +https://github.com/rust-random/getrandom +--------------------------------------------------------- + +gimli 0.28.1 (Apache-2.0 OR MIT) +https://github.com/gimli-rs/gimli +--------------------------------------------------------- + +gio 0.15.12 (MIT) +https://github.com/gtk-rs/gtk-rs-core +--------------------------------------------------------- + +gio-sys 0.15.10 (MIT) +https://github.com/gtk-rs/gtk-rs-core +--------------------------------------------------------- + +glib 0.15.12 (MIT) +https://github.com/gtk-rs/gtk-rs-core +--------------------------------------------------------- + +glib-macros 0.15.13 (MIT) +https://github.com/gtk-rs/gtk-rs-core +--------------------------------------------------------- + +glib-sys 0.15.10 (MIT) +https://github.com/gtk-rs/gtk-rs-core +--------------------------------------------------------- + +glob 0.3.1 (Apache-2.0 OR MIT) +https://github.com/rust-lang/glob +--------------------------------------------------------- + +globset 0.4.14 (MIT OR Unlicense) +https://github.com/BurntSushi/ripgrep/tree/master/crates/globset +--------------------------------------------------------- + +gobject-sys 0.15.10 (MIT) +https://github.com/gtk-rs/gtk-rs-core +--------------------------------------------------------- + +gtk 0.15.5 (MIT) +https://github.com/gtk-rs/gtk3-rs +--------------------------------------------------------- + +gtk-sys 0.15.3 (MIT) +https://github.com/gtk-rs/gtk3-rs +--------------------------------------------------------- + +gtk3-macros 0.15.6 (MIT) +https://github.com/gtk-rs/gtk3-rs +--------------------------------------------------------- + +hashbrown 0.12.3 (Apache-2.0 OR MIT) +https://github.com/rust-lang/hashbrown +--------------------------------------------------------- + +hashbrown 0.14.3 (Apache-2.0 OR MIT) +https://github.com/rust-lang/hashbrown +--------------------------------------------------------- + +heck 0.3.3 (Apache-2.0 OR MIT) +https://github.com/withoutboats/heck +--------------------------------------------------------- + +heck 0.4.1 (Apache-2.0 OR MIT) +https://github.com/withoutboats/heck +--------------------------------------------------------- + +hermit-abi 0.3.3 (Apache-2.0 OR MIT) +https://github.com/hermitcore/hermit-rs +--------------------------------------------------------- + +hex 0.4.3 (Apache-2.0 OR MIT) +https://github.com/KokaKiwi/rust-hex +--------------------------------------------------------- + +html5ever 0.25.2 (Apache-2.0 OR MIT) +https://github.com/servo/html5ever +--------------------------------------------------------- + +html5ever 0.26.0 (Apache-2.0 OR MIT) +https://github.com/servo/html5ever +--------------------------------------------------------- + +http 0.2.11 (Apache-2.0 OR MIT) +https://github.com/hyperium/http +--------------------------------------------------------- + +http-range 0.1.5 (MIT) +https://github.com/bancek/rust-http-range.git +--------------------------------------------------------- + +iana-time-zone 0.1.58 (Apache-2.0 OR MIT) +https://github.com/strawlab/iana-time-zone +--------------------------------------------------------- + +iana-time-zone-haiku 0.1.2 (Apache-2.0 OR MIT) +https://github.com/strawlab/iana-time-zone +--------------------------------------------------------- + +ico 0.3.0 (MIT) +https://github.com/mdsteele/rust-ico +--------------------------------------------------------- + +ident_case 1.0.1 (Apache-2.0 OR MIT) +https://github.com/TedDriggs/ident_case +--------------------------------------------------------- + +idna 0.5.0 (Apache-2.0 OR MIT) +https://github.com/servo/rust-url/ +--------------------------------------------------------- + +ignore 0.4.21 (MIT OR Unlicense) +https://github.com/BurntSushi/ripgrep/tree/master/crates/ignore +--------------------------------------------------------- + +image 0.24.7 (MIT) +https://github.com/image-rs/image +--------------------------------------------------------- + +indexmap 1.9.3 (Apache-2.0 OR MIT) +https://github.com/bluss/indexmap +--------------------------------------------------------- + +indexmap 2.1.0 (Apache-2.0 OR MIT) +https://github.com/bluss/indexmap +--------------------------------------------------------- + +infer 0.13.0 (MIT) +https://github.com/bojand/infer +--------------------------------------------------------- + +instant 0.1.12 (BSD-3-Clause) +https://github.com/sebcrozet/instant +--------------------------------------------------------- + +io-lifetimes 1.0.11 (Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT) +https://github.com/sunfishcode/io-lifetimes +--------------------------------------------------------- + +itoa 0.4.8 (Apache-2.0 OR MIT) +https://github.com/dtolnay/itoa +--------------------------------------------------------- + +itoa 1.0.9 (Apache-2.0 OR MIT) +https://github.com/dtolnay/itoa +--------------------------------------------------------- + +javascriptcore-rs 0.16.0 (MIT) +https://github.com/tauri-apps/javascriptcore-rs +--------------------------------------------------------- + +javascriptcore-rs-sys 0.4.0 (MIT) +https://github.com/tauri-apps/javascriptcore-rs +--------------------------------------------------------- + +jni 0.20.0 (Apache-2.0 OR MIT) +https://github.com/jni-rs/jni-rs +--------------------------------------------------------- + +jni-sys 0.3.0 (Apache-2.0 OR MIT) +https://github.com/sfackler/rust-jni-sys +--------------------------------------------------------- + +js-sys 0.3.66 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/js-sys +--------------------------------------------------------- + +json-patch 1.2.0 (Apache-2.0 OR MIT) +https://github.com/idubrov/json-patch +--------------------------------------------------------- + +kuchiki 0.8.1 (MIT) +https://github.com/SimonSapin/kuchiki +--------------------------------------------------------- + +kuchikiki 0.8.2 (MIT) +https://github.com/brave/kuchikiki +--------------------------------------------------------- + +lazy_static 1.4.0 (Apache-2.0 OR MIT) +https://github.com/rust-lang-nursery/lazy-static.rs +--------------------------------------------------------- + +libc 0.2.150 (Apache-2.0 OR MIT) +https://github.com/rust-lang/libc +--------------------------------------------------------- + +libloading 0.8.1 (ISC) +https://github.com/nagisa/rust_libloading/ +--------------------------------------------------------- + +libredox 0.0.1 (MIT) +https://gitlab.redox-os.org/redox-os/libredox.git +--------------------------------------------------------- + +line-wrap 0.1.1 (Apache-2.0) +https://bitbucket.org/marshallpierce/line-wrap-rs/src +--------------------------------------------------------- + +linux-raw-sys 0.3.8 (Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT) +https://github.com/sunfishcode/linux-raw-sys +--------------------------------------------------------- + +linux-raw-sys 0.4.12 (Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT) +https://github.com/sunfishcode/linux-raw-sys +--------------------------------------------------------- + +lock_api 0.4.11 (Apache-2.0 OR MIT) +https://github.com/Amanieu/parking_lot +--------------------------------------------------------- + +log 0.4.20 (Apache-2.0 OR MIT) +https://github.com/rust-lang/log +--------------------------------------------------------- + +loom 0.5.6 (MIT) +https://github.com/tokio-rs/loom +--------------------------------------------------------- + +mac 0.1.1 (Apache-2.0 OR MIT) +https://github.com/reem/rust-mac.git +--------------------------------------------------------- + +mac-notification-sys 0.6.1 (MIT) +https://github.com/h4llow3En/mac-notification-sys +--------------------------------------------------------- + +malloc_buf 0.0.6 (MIT) +https://github.com/SSheldon/malloc_buf +--------------------------------------------------------- + +markup5ever 0.10.1 (Apache-2.0 OR MIT) +https://github.com/servo/html5ever +--------------------------------------------------------- + +markup5ever 0.11.0 (Apache-2.0 OR MIT) +https://github.com/servo/html5ever +--------------------------------------------------------- + +matchers 0.1.0 (MIT) +https://github.com/hawkw/matchers +--------------------------------------------------------- + +matches 0.1.10 (MIT) +https://github.com/SimonSapin/rust-std-candidates +--------------------------------------------------------- + +matrixmultiply 0.3.8 (Apache-2.0 OR MIT) +https://github.com/bluss/matrixmultiply/ +--------------------------------------------------------- + +memchr 2.6.4 (MIT OR Unlicense) +https://github.com/BurntSushi/memchr +--------------------------------------------------------- + +memoffset 0.7.1 (MIT) +https://github.com/Gilnaa/memoffset +--------------------------------------------------------- + +memoffset 0.9.0 (MIT) +https://github.com/Gilnaa/memoffset +--------------------------------------------------------- + +miniz_oxide 0.7.1 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide +--------------------------------------------------------- + +mio 0.8.10 (MIT) +https://github.com/tokio-rs/mio +--------------------------------------------------------- + +nalgebra 0.32.3 (BSD-3-Clause) +https://github.com/dimforge/nalgebra +--------------------------------------------------------- + +ndk 0.6.0 (Apache-2.0 OR MIT) +https://github.com/rust-windowing/android-ndk-rs +--------------------------------------------------------- + +ndk-context 0.1.1 (Apache-2.0 OR MIT) +https://github.com/rust-windowing/android-ndk-rs +--------------------------------------------------------- + +ndk-sys 0.3.0 (Apache-2.0 OR MIT) +https://github.com/rust-windowing/android-ndk-rs +--------------------------------------------------------- + +new_debug_unreachable 1.0.4 (MIT) +https://github.com/mbrubeck/rust-debug-unreachable +--------------------------------------------------------- + +nix 0.26.4 (MIT) +https://github.com/nix-rust/nix +--------------------------------------------------------- + +nodrop 0.1.14 (Apache-2.0 OR MIT) +https://github.com/bluss/arrayvec +--------------------------------------------------------- + +notify-rust 4.10.0 (Apache-2.0 OR MIT) +https://github.com/hoodie/notify-rust +--------------------------------------------------------- + +nu-ansi-term 0.46.0 (MIT) +https://github.com/nushell/nu-ansi-term +--------------------------------------------------------- + +num-complex 0.4.4 (Apache-2.0 OR MIT) +https://github.com/rust-num/num-complex +--------------------------------------------------------- + +num-integer 0.1.45 (Apache-2.0 OR MIT) +https://github.com/rust-num/num-integer +--------------------------------------------------------- + +num-rational 0.4.1 (Apache-2.0 OR MIT) +https://github.com/rust-num/num-rational +--------------------------------------------------------- + +num-traits 0.2.17 (Apache-2.0 OR MIT) +https://github.com/rust-num/num-traits +--------------------------------------------------------- + +num_cpus 1.16.0 (Apache-2.0 OR MIT) +https://github.com/seanmonstar/num_cpus +--------------------------------------------------------- + +num_enum 0.5.11 (Apache-2.0 OR BSD-3-Clause OR MIT) +https://github.com/illicitonion/num_enum +--------------------------------------------------------- + +num_enum_derive 0.5.11 (Apache-2.0 OR BSD-3-Clause OR MIT) +https://github.com/illicitonion/num_enum +--------------------------------------------------------- + +objc 0.2.7 (MIT) +http://github.com/SSheldon/rust-objc +--------------------------------------------------------- + +objc-foundation 0.1.1 (MIT) +http://github.com/SSheldon/rust-objc-foundation +--------------------------------------------------------- + +objc_exception 0.1.2 (MIT) +http://github.com/SSheldon/rust-objc-exception +--------------------------------------------------------- + +objc_id 0.1.1 (MIT) +http://github.com/SSheldon/rust-objc-id +--------------------------------------------------------- + +object 0.32.1 (Apache-2.0 OR MIT) +https://github.com/gimli-rs/object +--------------------------------------------------------- + +once_cell 1.19.0 (Apache-2.0 OR MIT) +https://github.com/matklad/once_cell +--------------------------------------------------------- + +ordered-stream 0.2.0 (Apache-2.0 OR MIT) +https://github.com/danieldg/ordered-stream +--------------------------------------------------------- + +os_info 3.7.0 (MIT) +https://github.com/stanislav-tkach/os_info +--------------------------------------------------------- + +os_pipe 1.1.4 (MIT) +https://github.com/oconnor663/os_pipe.rs +--------------------------------------------------------- + +overload 0.1.1 (MIT) +https://github.com/danaugrs/overload +--------------------------------------------------------- + +pango 0.15.10 (MIT) +https://github.com/gtk-rs/gtk-rs-core +--------------------------------------------------------- + +pango-sys 0.15.10 (MIT) +https://github.com/gtk-rs/gtk-rs-core +--------------------------------------------------------- + +parking 2.2.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/parking +--------------------------------------------------------- + +parking_lot 0.12.1 (Apache-2.0 OR MIT) +https://github.com/Amanieu/parking_lot +--------------------------------------------------------- + +parking_lot_core 0.9.9 (Apache-2.0 OR MIT) +https://github.com/Amanieu/parking_lot +--------------------------------------------------------- + +paste 1.0.14 (Apache-2.0 OR MIT) +https://github.com/dtolnay/paste +--------------------------------------------------------- + +percent-encoding 2.3.1 (Apache-2.0 OR MIT) +https://github.com/servo/rust-url/ +--------------------------------------------------------- + +phf 0.8.0 (MIT) +https://github.com/sfackler/rust-phf +--------------------------------------------------------- + +phf 0.10.1 (MIT) +https://github.com/sfackler/rust-phf +--------------------------------------------------------- + +phf 0.11.2 (MIT) +https://github.com/rust-phf/rust-phf +--------------------------------------------------------- + +phf_codegen 0.8.0 (MIT) +https://github.com/sfackler/rust-phf +--------------------------------------------------------- + +phf_codegen 0.10.0 (MIT) +https://github.com/sfackler/rust-phf +--------------------------------------------------------- + +phf_generator 0.8.0 (MIT) +https://github.com/sfackler/rust-phf +--------------------------------------------------------- + +phf_generator 0.10.0 (MIT) +https://github.com/sfackler/rust-phf +--------------------------------------------------------- + +phf_generator 0.11.2 (MIT) +https://github.com/rust-phf/rust-phf +--------------------------------------------------------- + +phf_macros 0.8.0 (MIT) +https://github.com/sfackler/rust-phf +--------------------------------------------------------- + +phf_macros 0.11.2 (MIT) +https://github.com/rust-phf/rust-phf +--------------------------------------------------------- + +phf_shared 0.8.0 (MIT) +https://github.com/sfackler/rust-phf +--------------------------------------------------------- + +phf_shared 0.10.0 (MIT) +https://github.com/sfackler/rust-phf +--------------------------------------------------------- + +phf_shared 0.11.2 (MIT) +https://github.com/rust-phf/rust-phf +--------------------------------------------------------- + +pin-project-lite 0.2.13 (Apache-2.0 OR MIT) +https://github.com/taiki-e/pin-project-lite +--------------------------------------------------------- + +pin-utils 0.1.0 (Apache-2.0 OR MIT) +https://github.com/rust-lang-nursery/pin-utils +--------------------------------------------------------- + +piper 0.2.1 (Apache-2.0 OR MIT) +https://github.com/notgull/piper +--------------------------------------------------------- + +pkg-config 0.3.27 (Apache-2.0 OR MIT) +https://github.com/rust-lang/pkg-config-rs +--------------------------------------------------------- + +plist 1.6.0 (MIT) +https://github.com/ebarnard/rust-plist/ +--------------------------------------------------------- + +png 0.17.10 (Apache-2.0 OR MIT) +https://github.com/image-rs/image-png.git +--------------------------------------------------------- + +polling 2.8.0 (Apache-2.0 OR MIT) +https://github.com/smol-rs/polling +--------------------------------------------------------- + +polling 3.3.1 (Apache-2.0 OR MIT) +https://github.com/smol-rs/polling +--------------------------------------------------------- + +powerfmt 0.2.0 (Apache-2.0 OR MIT) +https://github.com/jhpratt/powerfmt +--------------------------------------------------------- + +ppv-lite86 0.2.17 (Apache-2.0 OR MIT) +https://github.com/cryptocorrosion/cryptocorrosion +--------------------------------------------------------- + +precomputed-hash 0.1.1 (MIT) +https://github.com/emilio/precomputed-hash +--------------------------------------------------------- + +proc-macro-crate 1.3.1 (Apache-2.0 OR MIT) +https://github.com/bkchr/proc-macro-crate +--------------------------------------------------------- + +proc-macro-error 1.0.4 (Apache-2.0 OR MIT) +https://gitlab.com/CreepySkeleton/proc-macro-error +--------------------------------------------------------- + +proc-macro-error-attr 1.0.4 (Apache-2.0 OR MIT) +https://gitlab.com/CreepySkeleton/proc-macro-error +--------------------------------------------------------- + +proc-macro-hack 0.5.20+deprecated (Apache-2.0 OR MIT) +https://github.com/dtolnay/proc-macro-hack +--------------------------------------------------------- + +proc-macro2 1.0.70 (Apache-2.0 OR MIT) +https://github.com/dtolnay/proc-macro2 +--------------------------------------------------------- + +quick-xml 0.30.0 (MIT) +https://github.com/tafia/quick-xml +--------------------------------------------------------- + +quick-xml 0.31.0 (MIT) +https://github.com/tafia/quick-xml +--------------------------------------------------------- + +quote 1.0.33 (Apache-2.0 OR MIT) +https://github.com/dtolnay/quote +--------------------------------------------------------- + +radium 0.7.0 (MIT) +https://github.com/bitvecto-rs/radium +--------------------------------------------------------- + +rand 0.7.3 (Apache-2.0 OR MIT) +https://github.com/rust-random/rand +--------------------------------------------------------- + +rand 0.8.5 (Apache-2.0 OR MIT) +https://github.com/rust-random/rand +--------------------------------------------------------- + +rand_chacha 0.2.2 (Apache-2.0 OR MIT) +https://github.com/rust-random/rand +--------------------------------------------------------- + +rand_chacha 0.3.1 (Apache-2.0 OR MIT) +https://github.com/rust-random/rand +--------------------------------------------------------- + +rand_core 0.5.1 (Apache-2.0 OR MIT) +https://github.com/rust-random/rand +--------------------------------------------------------- + +rand_core 0.6.4 (Apache-2.0 OR MIT) +https://github.com/rust-random/rand +--------------------------------------------------------- + +rand_hc 0.2.0 (Apache-2.0 OR MIT) +https://github.com/rust-random/rand +--------------------------------------------------------- + +rand_pcg 0.2.1 (Apache-2.0 OR MIT) +https://github.com/rust-random/rand +--------------------------------------------------------- + +raw-window-handle 0.5.2 (Apache-2.0 OR MIT OR Zlib) +https://github.com/rust-windowing/raw-window-handle +--------------------------------------------------------- + +rawpointer 0.2.1 (Apache-2.0 OR MIT) +https://github.com/bluss/rawpointer/ +--------------------------------------------------------- + +redox_syscall 0.4.1 (MIT) +https://gitlab.redox-os.org/redox-os/syscall +--------------------------------------------------------- + +redox_users 0.4.4 (MIT) +https://gitlab.redox-os.org/redox-os/users +--------------------------------------------------------- + +regex 1.10.2 (Apache-2.0 OR MIT) +https://github.com/rust-lang/regex +--------------------------------------------------------- + +regex-automata 0.1.10 (MIT OR Unlicense) +https://github.com/BurntSushi/regex-automata +--------------------------------------------------------- + +regex-automata 0.4.3 (Apache-2.0 OR MIT) +https://github.com/rust-lang/regex/tree/master/regex-automata +--------------------------------------------------------- + +regex-syntax 0.6.29 (Apache-2.0 OR MIT) +https://github.com/rust-lang/regex +--------------------------------------------------------- + +regex-syntax 0.8.2 (Apache-2.0 OR MIT) +https://github.com/rust-lang/regex/tree/master/regex-syntax +--------------------------------------------------------- + +rfd 0.10.0 (MIT) +https://github.com/PolyMeilex/rfd +--------------------------------------------------------- + +rustc-demangle 0.1.23 (Apache-2.0 OR MIT) +https://github.com/alexcrichton/rustc-demangle +--------------------------------------------------------- + +rustc_version 0.4.0 (Apache-2.0 OR MIT) +https://github.com/Kimundi/rustc-version-rs +--------------------------------------------------------- + +rustix 0.37.27 (Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT) +https://github.com/bytecodealliance/rustix +--------------------------------------------------------- + +rustix 0.38.26 (Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT) +https://github.com/bytecodealliance/rustix +--------------------------------------------------------- + +rustversion 1.0.14 (Apache-2.0 OR MIT) +https://github.com/dtolnay/rustversion +--------------------------------------------------------- + +ryu 1.0.15 (Apache-2.0 OR BSL-1.0) +https://github.com/dtolnay/ryu +--------------------------------------------------------- + +safe_arch 0.7.1 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Lokathor/safe_arch +--------------------------------------------------------- + +safemem 0.3.3 (Apache-2.0 OR MIT) +https://github.com/abonander/safemem +--------------------------------------------------------- + +same-file 1.0.6 (MIT OR Unlicense) +https://github.com/BurntSushi/same-file +--------------------------------------------------------- + +scoped-tls 1.0.1 (Apache-2.0 OR MIT) +https://github.com/alexcrichton/scoped-tls +--------------------------------------------------------- + +scopeguard 1.2.0 (Apache-2.0 OR MIT) +https://github.com/bluss/scopeguard +--------------------------------------------------------- + +selectors 0.22.0 (MPL-2.0) +https://github.com/servo/servo +--------------------------------------------------------- + +semver 1.0.20 (Apache-2.0 OR MIT) +https://github.com/dtolnay/semver +--------------------------------------------------------- + +serde 1.0.193 (Apache-2.0 OR MIT) +https://github.com/serde-rs/serde +--------------------------------------------------------- + +serde_derive 1.0.193 (Apache-2.0 OR MIT) +https://github.com/serde-rs/serde +--------------------------------------------------------- + +serde_json 1.0.108 (Apache-2.0 OR MIT) +https://github.com/serde-rs/json +--------------------------------------------------------- + +serde_repr 0.1.17 (Apache-2.0 OR MIT) +https://github.com/dtolnay/serde-repr +--------------------------------------------------------- + +serde_spanned 0.6.4 (Apache-2.0 OR MIT) +https://github.com/toml-rs/toml +--------------------------------------------------------- + +serde_with 3.4.0 (Apache-2.0 OR MIT) +https://github.com/jonasbb/serde_with/ +--------------------------------------------------------- + +serde_with_macros 3.4.0 (Apache-2.0 OR MIT) +https://github.com/jonasbb/serde_with/ +--------------------------------------------------------- + +serialize-to-javascript 0.1.1 (Apache-2.0 OR MIT) +https://github.com/chippers/serialize-to-javascript +--------------------------------------------------------- + +serialize-to-javascript-impl 0.1.1 (Apache-2.0 OR MIT) +https://github.com/chippers/serialize-to-javascript +--------------------------------------------------------- + +servo_arc 0.1.1 (Apache-2.0 OR MIT) +https://github.com/servo/servo +--------------------------------------------------------- + +sha1 0.10.6 (Apache-2.0 OR MIT) +https://github.com/RustCrypto/hashes +--------------------------------------------------------- + +sha2 0.10.8 (Apache-2.0 OR MIT) +https://github.com/RustCrypto/hashes +--------------------------------------------------------- + +sharded-slab 0.1.7 (MIT) +https://github.com/hawkw/sharded-slab +--------------------------------------------------------- + +shared_child 1.0.0 (MIT) +https://github.com/oconnor663/shared_child.rs +--------------------------------------------------------- + +signal-hook-registry 1.4.1 (Apache-2.0 OR MIT) +https://github.com/vorner/signal-hook +--------------------------------------------------------- + +simba 0.8.1 (Apache-2.0) +https://github.com/dimforge/simba +--------------------------------------------------------- + +simd-adler32 0.3.7 (MIT) +https://github.com/mcountryman/simd-adler32 +--------------------------------------------------------- + +siphasher 0.3.11 (Apache-2.0 OR MIT) +https://github.com/jedisct1/rust-siphash +--------------------------------------------------------- + +slab 0.4.9 (MIT) +https://github.com/tokio-rs/slab +--------------------------------------------------------- + +smallvec 1.11.2 (Apache-2.0 OR MIT) +https://github.com/servo/rust-smallvec +--------------------------------------------------------- + +socket2 0.4.10 (Apache-2.0 OR MIT) +https://github.com/rust-lang/socket2 +--------------------------------------------------------- + +soup2 0.2.1 (MIT) +--------------------------------------------------------- + +soup2-sys 0.2.0 (MIT) +--------------------------------------------------------- + +stable_deref_trait 1.2.0 (Apache-2.0 OR MIT) +https://github.com/storyyeller/stable_deref_trait +--------------------------------------------------------- + +state 0.5.3 (Apache-2.0 OR MIT) +https://github.com/SergioBenitez/state +--------------------------------------------------------- + +static_assertions 1.1.0 (Apache-2.0 OR MIT) +https://github.com/nvzqz/static-assertions-rs +--------------------------------------------------------- + +string_cache 0.8.7 (Apache-2.0 OR MIT) +https://github.com/servo/string-cache +--------------------------------------------------------- + +string_cache_codegen 0.5.2 (Apache-2.0 OR MIT) +https://github.com/servo/string-cache +--------------------------------------------------------- + +strsim 0.10.0 (MIT) +https://github.com/dguo/strsim-rs +--------------------------------------------------------- + +syn 1.0.109 (Apache-2.0 OR MIT) +https://github.com/dtolnay/syn +--------------------------------------------------------- + +syn 2.0.39 (Apache-2.0 OR MIT) +https://github.com/dtolnay/syn +--------------------------------------------------------- + +sys-locale 0.2.4 (Apache-2.0 OR MIT) +https://github.com/1Password/sys-locale +--------------------------------------------------------- + +system-deps 5.0.0 (Apache-2.0 OR MIT) +https://github.com/gdesmott/system-deps +--------------------------------------------------------- + +system-deps 6.2.0 (Apache-2.0 OR MIT) +https://github.com/gdesmott/system-deps +--------------------------------------------------------- + +tao 0.16.5 (Apache-2.0) +https://github.com/tauri-apps/tao +--------------------------------------------------------- + +tao-macros 0.1.2 (Apache-2.0 OR MIT) +https://github.com/tauri-apps/tao +--------------------------------------------------------- + +tap 1.0.1 (MIT) +https://github.com/myrrlyn/tap +--------------------------------------------------------- + +tar 0.4.40 (Apache-2.0 OR MIT) +https://github.com/alexcrichton/tar-rs +--------------------------------------------------------- + +target-lexicon 0.12.12 (Apache-2.0 WITH LLVM-exception) +https://github.com/bytecodealliance/target-lexicon +--------------------------------------------------------- + +tauri 1.5.3 (Apache-2.0 OR MIT) +https://github.com/tauri-apps/tauri +--------------------------------------------------------- + +tauri-build 1.5.0 (Apache-2.0 OR MIT) +https://github.com/tauri-apps/tauri/tree/dev/core/tauri-build +--------------------------------------------------------- + +tauri-codegen 1.4.1 (Apache-2.0 OR MIT) +https://github.com/tauri-apps/tauri/tree/dev/core/tauri-codegen +--------------------------------------------------------- + +tauri-macros 1.4.2 (Apache-2.0 OR MIT) +https://github.com/tauri-apps/tauri +--------------------------------------------------------- + +tauri-runtime 0.14.1 (Apache-2.0 OR MIT) +https://github.com/tauri-apps/tauri +--------------------------------------------------------- + +tauri-runtime-wry 0.14.2 (Apache-2.0 OR MIT) +https://github.com/tauri-apps/tauri +--------------------------------------------------------- + +tauri-utils 1.5.1 (Apache-2.0 OR MIT) +https://github.com/tauri-apps/tauri +--------------------------------------------------------- + +tauri-winres 0.1.1 (MIT) +https://github.com/tauri-apps/winres +--------------------------------------------------------- + +tauri-winrt-notification 0.1.3 (Apache-2.0 OR MIT) +https://github.com/tauri-apps/winrt-notification +--------------------------------------------------------- + +tempfile 3.8.1 (Apache-2.0 OR MIT) +https://github.com/Stebalien/tempfile +--------------------------------------------------------- + +tendril 0.4.3 (Apache-2.0 OR MIT) +https://github.com/servo/tendril +--------------------------------------------------------- + +thin-slice 0.1.1 (MPL-2.0) +https://github.com/heycam/thin-slice +--------------------------------------------------------- + +thiserror 1.0.50 (Apache-2.0 OR MIT) +https://github.com/dtolnay/thiserror +--------------------------------------------------------- + +thiserror-impl 1.0.50 (Apache-2.0 OR MIT) +https://github.com/dtolnay/thiserror +--------------------------------------------------------- + +thread_local 1.1.7 (Apache-2.0 OR MIT) +https://github.com/Amanieu/thread_local-rs +--------------------------------------------------------- + +time 0.3.30 (Apache-2.0 OR MIT) +https://github.com/time-rs/time +--------------------------------------------------------- + +time-core 0.1.2 (Apache-2.0 OR MIT) +https://github.com/time-rs/time +--------------------------------------------------------- + +time-macros 0.2.15 (Apache-2.0 OR MIT) +https://github.com/time-rs/time +--------------------------------------------------------- + +tinyvec 1.6.0 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Lokathor/tinyvec +--------------------------------------------------------- + +tinyvec_macros 0.1.1 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Soveu/tinyvec_macros +--------------------------------------------------------- + +tokio 1.34.0 (MIT) +https://github.com/tokio-rs/tokio +--------------------------------------------------------- + +tokio-macros 2.2.0 (MIT) +https://github.com/tokio-rs/tokio +--------------------------------------------------------- + +toml 0.5.11 (Apache-2.0 OR MIT) +https://github.com/toml-rs/toml +--------------------------------------------------------- + +toml 0.7.8 (Apache-2.0 OR MIT) +https://github.com/toml-rs/toml +--------------------------------------------------------- + +toml 0.8.8 (Apache-2.0 OR MIT) +https://github.com/toml-rs/toml +--------------------------------------------------------- + +toml_datetime 0.6.5 (Apache-2.0 OR MIT) +https://github.com/toml-rs/toml +--------------------------------------------------------- + +toml_edit 0.19.15 (Apache-2.0 OR MIT) +https://github.com/toml-rs/toml +--------------------------------------------------------- + +toml_edit 0.21.0 (Apache-2.0 OR MIT) +https://github.com/toml-rs/toml +--------------------------------------------------------- + +tracing 0.1.40 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +tracing-attributes 0.1.27 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +tracing-core 0.1.32 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +tracing-log 0.2.0 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +tracing-subscriber 0.3.18 (MIT) +https://github.com/tokio-rs/tracing +--------------------------------------------------------- + +treediff 4.0.2 (Apache-2.0 OR MIT) +https://github.com/Byron/treediff-rs +--------------------------------------------------------- + +typenum 1.17.0 (Apache-2.0 OR MIT) +https://github.com/paholg/typenum +--------------------------------------------------------- + +uds_windows 1.0.2 (MIT) +https://github.com/haraldh/rust_uds_windows +--------------------------------------------------------- + +unicode-bidi 0.3.14 (Apache-2.0 OR MIT) +https://github.com/servo/unicode-bidi +--------------------------------------------------------- + +unicode-ident 1.0.12 ((MIT OR Apache-2.0) AND Unicode-DFS-2016) +https://github.com/dtolnay/unicode-ident +--------------------------------------------------------- + +unicode-normalization 0.1.22 (Apache-2.0 OR MIT) +https://github.com/unicode-rs/unicode-normalization +--------------------------------------------------------- + +unicode-segmentation 1.10.1 (Apache-2.0 OR MIT) +https://github.com/unicode-rs/unicode-segmentation +--------------------------------------------------------- + +url 2.5.0 (Apache-2.0 OR MIT) +https://github.com/servo/rust-url +--------------------------------------------------------- + +utf-8 0.7.6 (Apache-2.0 OR MIT) +https://github.com/SimonSapin/rust-utf8 +--------------------------------------------------------- + +uuid 1.6.1 (Apache-2.0 OR MIT) +https://github.com/uuid-rs/uuid +--------------------------------------------------------- + +valuable 0.1.0 (MIT) +https://github.com/tokio-rs/valuable +--------------------------------------------------------- + +version-compare 0.0.11 (MIT) +https://github.com/timvisee/version-compare +--------------------------------------------------------- + +version-compare 0.1.1 (MIT) +https://gitlab.com/timvisee/version-compare +--------------------------------------------------------- + +version_check 0.9.4 (Apache-2.0 OR MIT) +https://github.com/SergioBenitez/version_check +--------------------------------------------------------- + +vswhom 0.1.0 (MIT) +https://github.com/nabijaczleweli/vswhom.rs +--------------------------------------------------------- + +vswhom-sys 0.1.2 (MIT) +https://github.com/nabijaczleweli/vswhom-sys.rs +--------------------------------------------------------- + +waker-fn 1.1.1 (Apache-2.0 OR MIT) +https://github.com/smol-rs/waker-fn +--------------------------------------------------------- + +walkdir 2.4.0 (MIT OR Unlicense) +https://github.com/BurntSushi/walkdir +--------------------------------------------------------- + +wasi 0.9.0+wasi-snapshot-preview1 (Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT) +https://github.com/bytecodealliance/wasi +--------------------------------------------------------- + +wasi 0.11.0+wasi-snapshot-preview1 (Apache-2.0 OR Apache-2.0 WITH LLVM-exception OR MIT) +https://github.com/bytecodealliance/wasi +--------------------------------------------------------- + +wasm-bindgen 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen +--------------------------------------------------------- + +wasm-bindgen-backend 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/backend +--------------------------------------------------------- + +wasm-bindgen-futures 0.4.39 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/futures +--------------------------------------------------------- + +wasm-bindgen-macro 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro +--------------------------------------------------------- + +wasm-bindgen-macro-support 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/macro-support +--------------------------------------------------------- + +wasm-bindgen-shared 0.2.89 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/shared +--------------------------------------------------------- + +web-sys 0.3.66 (Apache-2.0 OR MIT) +https://github.com/rustwasm/wasm-bindgen/tree/master/crates/web-sys +--------------------------------------------------------- + +webkit2gtk 0.18.2 (MIT) +https://github.com/tauri-apps/webkit2gtk-rs +--------------------------------------------------------- + +webkit2gtk-sys 0.18.0 (MIT) +https://github.com/tauri-apps/webkit2gtk-rs +--------------------------------------------------------- + +webview2-com 0.19.1 (MIT) +https://github.com/wravery/webview2-rs +--------------------------------------------------------- + +webview2-com-macros 0.6.0 (MIT) +https://github.com/wravery/webview2-rs +--------------------------------------------------------- + +webview2-com-sys 0.19.0 (MIT) +https://github.com/wravery/webview2-rs +--------------------------------------------------------- + +wide 0.7.13 (Apache-2.0 OR MIT OR Zlib) +https://github.com/Lokathor/wide +--------------------------------------------------------- + +winapi 0.3.9 (Apache-2.0 OR MIT) +https://github.com/retep998/winapi-rs +--------------------------------------------------------- + +winapi-i686-pc-windows-gnu 0.4.0 (Apache-2.0 OR MIT) +https://github.com/retep998/winapi-rs +--------------------------------------------------------- + +winapi-util 0.1.6 (MIT OR Unlicense) +https://github.com/BurntSushi/winapi-util +--------------------------------------------------------- + +winapi-x86_64-pc-windows-gnu 0.4.0 (Apache-2.0 OR MIT) +https://github.com/retep998/winapi-rs +--------------------------------------------------------- + +windows 0.37.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows 0.39.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows 0.48.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows 0.51.1 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-bindgen 0.39.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-core 0.51.1 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-core 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-implement 0.39.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-metadata 0.39.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-sys 0.45.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-sys 0.48.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-sys 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-targets 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-targets 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-targets 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-tokens 0.39.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows-version 0.1.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_gnullvm 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_gnullvm 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_gnullvm 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_msvc 0.37.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_msvc 0.39.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_msvc 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_msvc 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_aarch64_msvc 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_gnu 0.37.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_gnu 0.39.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_gnu 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_gnu 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_gnu 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_msvc 0.37.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_msvc 0.39.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_msvc 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_msvc 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_i686_msvc 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnu 0.37.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnu 0.39.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnu 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnu 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnu 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnullvm 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnullvm 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_gnullvm 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_msvc 0.37.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_msvc 0.39.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_msvc 0.42.2 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_msvc 0.48.5 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +windows_x86_64_msvc 0.52.0 (Apache-2.0 OR MIT) +https://github.com/microsoft/windows-rs +--------------------------------------------------------- + +winnow 0.5.26 (MIT) +https://github.com/winnow-rs/winnow +--------------------------------------------------------- + +winreg 0.51.0 (MIT) +https://github.com/gentoo90/winreg-rs +--------------------------------------------------------- + +wry 0.24.6 (Apache-2.0 OR MIT) +https://github.com/tauri-apps/wry +--------------------------------------------------------- + +wyz 0.5.1 (MIT) +https://github.com/myrrlyn/wyz +--------------------------------------------------------- + +x11 2.21.0 (MIT) +https://github.com/AltF02/x11-rs.git +--------------------------------------------------------- + +x11-dl 2.21.0 (MIT) +https://github.com/AltF02/x11-rs.git +--------------------------------------------------------- + +xattr 1.0.1 (Apache-2.0 OR MIT) +https://github.com/Stebalien/xattr +--------------------------------------------------------- + +xdg-home 1.0.0 (MIT) +https://github.com/zeenix/xdg-home +--------------------------------------------------------- + +zbus 3.14.1 (MIT) +https://github.com/dbus2/zbus/ +--------------------------------------------------------- + +zbus_macros 3.14.1 (MIT) +https://github.com/dbus2/zbus/ +--------------------------------------------------------- + +zbus_names 2.6.0 (MIT) +https://github.com/dbus2/zbus/ +--------------------------------------------------------- + +zvariant 3.15.0 (MIT) +https://github.com/dbus2/zbus/ +--------------------------------------------------------- + +zvariant_derive 3.15.0 (MIT) +https://github.com/dbus2/zbus/ +--------------------------------------------------------- + +zvariant_utils 1.0.1 (MIT) +https://github.com/dbus2/zbus/ + +--------------------------------------------------------- + +0BSD + +--- + +Permission to use, copy, modify, and/or distribute this software for +any purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL +WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES +OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE +FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY +DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN +AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +--------------------------------------------------------- + +Apache-2.0 + +--- + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + 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. +--------------------------------------------------------- + +BSD-3-Clause + +--- + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +--------------------------------------------------------- + +BSL-1.0 + +--- + +Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license (the "Software") to use, reproduce, display, distribute, execute, and transmit the Software, and to prepare derivative works of the Software, and to permit third-parties to whom the Software is furnished to do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including the above license grant, this restriction and the following disclaimer, must be included in all copies of the Software, in whole or in part, and all derivative works of the Software, unless such copies or derivative works are solely in the form of machine-executable object code generated by a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +CC0-1.0 + +--- + +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. +--------------------------------------------------------- + +ISC + +--- + +Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +--------------------------------------------------------- + +LLVM-exception + +--- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into an Object form of such source code, you +may redistribute such embedded portions in such Object form without complying +with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + +In addition, if you combine or link compiled forms of this Software with +software that is licensed under the GPLv2 ("Combined Software") and if a +court of competent jurisdiction determines that the patent provision (Section +3), the indemnity provision (Section 9) or other Section of the License +conflicts with the conditions of the GPLv2, you may retroactively and +prospectively choose to deem waived or otherwise exclude such Section(s) of +the License, but only in their entirety and only with respect to the Combined +Software. + +============================================================================== +Software from third parties included in the LLVM Project: +============================================================================== +The LLVM Project contains third party software which is under different license +terms. All such code will be identified clearly using at least one of two +mechanisms: +1) It will be in a separate directory tree with its own `LICENSE.txt` or + `LICENSE` file at the top containing the specific license and restrictions + which apply to that software, or +2) It will contain specific license and restriction terms at the top of every + file. + +============================================================================== +Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy): +============================================================================== +University of Illinois/NCSA +Open Source License + +Copyright (c) 2003-2019 University of Illinois at Urbana-Champaign. +All rights reserved. + +Developed by: + + LLVM Team + + University of Illinois at Urbana-Champaign + + http://llvm.org + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal with +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimers. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimers in the + documentation and/or other materials provided with the distribution. + + * Neither the names of the LLVM Team, University of Illinois at + Urbana-Champaign, nor the names of its contributors may be used to + endorse or promote products derived from this Software without specific + prior written permission. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE +SOFTWARE. +--------------------------------------------------------- + +MIT + +--- + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +--------------------------------------------------------- + +MPL-2.0 + +--- + +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. +--------------------------------------------------------- + +Unicode-DFS-2016 + +--- + +UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + +See Terms of Use +for definitions of Unicode Inc.'s Data Files and Software. + +NOTICE TO USER: Carefully read the following legal agreement. +BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S +DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), +YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE +TERMS AND CONDITIONS OF THIS AGREEMENT. +IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE +THE DATA FILES OR SOFTWARE. + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2023 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in https://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Unicode data files and any associated documentation +(the "Data Files") or Unicode software and any associated documentation +(the "Software") to deal in the Data Files or Software +without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that either +(a) this copyright and permission notice appear with all copies +of the Data Files or Software, or +(b) this copyright and permission notice appear in associated +Documentation. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in these Data Files or Software without prior +written authorization of the copyright holder. +--------------------------------------------------------- + +Zlib + +--- + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + + 3. This notice may not be removed or altered from any source distribution. +--------------------------------------------------------- diff --git a/src-tauri/TwinCATAUTDServer/AUTD.xml b/src-tauri/TwinCATAUTDServer/AUTD.xml new file mode 100644 index 0000000..ce5f651 --- /dev/null +++ b/src-tauri/TwinCATAUTDServer/AUTD.xml @@ -0,0 +1,3040 @@ + + + + #x000008A9 + Shinko Shoji + + + + + AUTD + AUTD + 424DDE000000000000007600000028000000100000000D000000010004000000000068000000000000000000000000000000000000000000000000008000008000000080800080000000800080008080000080808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF007777777777777777888888888088888788888888008888878888888000000087888888000000008788888000000000878888888888888887899999999999998789999999999998878999999999998887888888888998888788888888898888878888888888888887 + + + + + AUTD + AUTD + + + + 5000 + 2000 + 1000 + 200 + + + + + 100 + 1000 + + + + + AUTD + + + 5001 + + + + + BOOL + 1 + + + DINT + 32 + + + INT + 16 + + + UDINT + 32 + + + UINT + 16 + + + USINT + 8 + + + STRING(11) + 88 + + + STRING(9) + 72 + + + STRING(4) + 32 + + + DT1018 + 144 + + 0 + SubIndex 000 + USINT + 8 + 0 + + ro + o + + + + 1 + Vendor ID + UDINT + 32 + 16 + + ro + o + + + + 2 + Product code + UDINT + 32 + 48 + + ro + o + + + + 3 + Revision + UDINT + 32 + 80 + + ro + o + + + + 4 + Serial number + UDINT + 32 + 112 + + ro + o + + + + + DT1C00ARR + USINT + 32 + + 1 + 4 + + + + DT1C00 + 48 + + 0 + SubIndex 000 + USINT + 8 + 0 + + ro + o + + + + Elements + DT1C00ARR + 32 + 16 + + ro + o + + + + + DT1C32 + 400 + + 0 + SubIndex 000 + USINT + 8 + 0 + + ro + o + + + + 1 + Sync mode + UINT + 16 + 16 + + rw + o + + + + 2 + Cycle time + UDINT + 32 + 32 + + rw + o + + + + 4 + Sync modes supported + UINT + 16 + 96 + + ro + o + + + + 5 + Minimum cycle time + UDINT + 32 + 112 + + ro + o + + + + 6 + Calc and copy time + UDINT + 32 + 144 + + ro + o + + + + 8 + Get cycle time + UINT + 16 + 208 + + rw + c + + + + 9 + Delay time + UDINT + 32 + 224 + + ro + c + + + + 10 + Sync0 time + UDINT + 32 + 256 + + rw + o + + + + 11 + SM event missed counter + UINT + 16 + 288 + + ro + c + + + + 12 + Cycle exceeded counter + UINT + 16 + 304 + + ro + c + + + + 32 + Sync error + BOOL + 1 + 480 + + ro + c + + + + + DT1C33 + 400 + + 0 + SubIndex 000 + USINT + 8 + 0 + + ro + o + + + + 1 + Sync mode + UINT + 16 + 16 + + rw + o + + + + 2 + Cycle time + UDINT + 32 + 32 + + rw + o + + + + 4 + Sync modes supported + UINT + 16 + 96 + + ro + o + + + + 5 + Minimum cycle time + UDINT + 32 + 112 + + ro + o + + + + 6 + Calc and copy time + UDINT + 32 + 144 + + ro + o + + + + 8 + Get cycle time + UINT + 16 + 208 + + rw + c + + + + 9 + Delay time + UDINT + 32 + 224 + + ro + c + + + + 10 + Sync0 time + UDINT + 32 + 256 + + rw + o + + + + 11 + SM event missed counter + UINT + 16 + 288 + + ro + c + + + + 12 + Cycle exceeded counter + UINT + 16 + 304 + + ro + c + + + + 32 + Sync error + BOOL + 1 + 480 + + ro + c + + + + + + + #x1000 + Device type + UDINT + 32 + + 5001 + + + ro + o + + + + #x1001 + Error Register + USINT + 8 + + 00 + + + ro + o + + + + #x1008 + Device name + STRING(4) + 32 + + AUTD + + + ro + o + + + + #x1009 + Hardware version + STRING(9) + 72 + + JSL-ESC.1 + + + ro + o + + + + #x100a + Software version + STRING(4) + 32 + + 5.11 + + + ro + o + + + + #x1c00 + Sync manager type + DT1C00 + 48 + + + SubIndex 000 + + 04 + + + + SubIndex 001 + + 01 + + + + SubIndex 002 + + 02 + + + + SubIndex 003 + + 03 + + + + SubIndex 004 + + 04 + + + + + ro + o + + + + #x1018 + Identity + DT1018 + 144 + + + SubIndex 000 + + 04 + + + + Vendor ID + + #x0000000B + + + + Product code + + #x00000125 + + + + Revision + + #x00000001 + + + + Serial number + + #x00000000 + + + + + ro + o + + + + #x1c32 + SM output parameter + DT1C32 + 400 + + + SubIndex 000 + + 20 + + + + Sync mode + + 0100 + + + + Cycle time + + 00000000 + + + + Shift time + + 00000000 + + + + Sync modes supported + + 0740 + + + + Minimum cycle time + + 00000000 + + + + Calc and copy time + + 00000000 + + + + Get cycle time + + 0000 + + + + Delay time + + 00000000 + + + + Sync0 time + + 00000000 + + + + SM event missed counter + + 00000000 + + + + Cycle exceeded counter + + 00000000 + + + + Shift too short counter + + 00000000 + + + + Sync error + + 00 + + + + + ro + o + + + + #x1c33 + SM input parameter + DT1C33 + 400 + + + SubIndex 000 + + 20 + + + + Sync mode + + 2200 + + + + Cycle time + + 00000000 + + + + Shift time + + 00000000 + + + + Sync modes supported + + 0740 + + + + Minimum cycle time + + 00000000 + + + + Calc and copy time + + 00000000 + + + + Get cycle time + + 0000 + + + + Delay time + + 00000000 + + + + Sync0 time + + 00000000 + + + + SM event missed counter + + 00000000 + + + + Cycle exceeded counter + + 00000000 + + + + Shift too short counter + + 00000000 + + + + Sync error + + 00 + + + + + ro + o + + + + + + Outputs + Inputs + MBoxState + MBoxOut + MBoxIn + Outputs + Inputs + + #x1600 + RxPdo0 + + #x7000 + 1 + 16 + data[0] + UINT + + + #x7000 + 2 + 16 + data[1] + UINT + + + #x7000 + 3 + 16 + data[2] + UINT + + + #x7000 + 4 + 16 + data[3] + UINT + + + #x7000 + 5 + 16 + data[4] + UINT + + + #x7000 + 6 + 16 + data[5] + UINT + + + #x7000 + 7 + 16 + data[6] + UINT + + + #x7000 + 8 + 16 + data[7] + UINT + + + #x7000 + 9 + 16 + data[8] + UINT + + + #x7000 + 10 + 16 + data[9] + UINT + + + #x7000 + 11 + 16 + data[10] + UINT + + + #x7000 + 12 + 16 + data[11] + UINT + + + #x7000 + 13 + 16 + data[12] + UINT + + + #x7000 + 14 + 16 + data[13] + UINT + + + #x7000 + 15 + 16 + data[14] + UINT + + + #x7000 + 16 + 16 + data[15] + UINT + + + #x7000 + 17 + 16 + data[16] + UINT + + + #x7000 + 18 + 16 + data[17] + UINT + + + #x7000 + 19 + 16 + data[18] + UINT + + + #x7000 + 20 + 16 + data[19] + UINT + + + #x7000 + 21 + 16 + data[20] + UINT + + + #x7000 + 22 + 16 + data[21] + UINT + + + #x7000 + 23 + 16 + data[22] + UINT + + + #x7000 + 24 + 16 + data[23] + UINT + + + #x7000 + 25 + 16 + data[24] + UINT + + + #x7000 + 26 + 16 + data[25] + UINT + + + #x7000 + 27 + 16 + data[26] + UINT + + + #x7000 + 28 + 16 + data[27] + UINT + + + #x7000 + 29 + 16 + data[28] + UINT + + + #x7000 + 30 + 16 + data[29] + UINT + + + #x7000 + 31 + 16 + data[30] + UINT + + + #x7000 + 32 + 16 + data[31] + UINT + + + #x7000 + 33 + 16 + data[32] + UINT + + + #x7000 + 34 + 16 + data[33] + UINT + + + #x7000 + 35 + 16 + data[34] + UINT + + + #x7000 + 36 + 16 + data[35] + UINT + + + #x7000 + 37 + 16 + data[36] + UINT + + + #x7000 + 38 + 16 + data[37] + UINT + + + #x7000 + 39 + 16 + data[38] + UINT + + + #x7000 + 40 + 16 + data[39] + UINT + + + #x7000 + 41 + 16 + data[40] + UINT + + + #x7000 + 42 + 16 + data[41] + UINT + + + #x7000 + 43 + 16 + data[42] + UINT + + + #x7000 + 44 + 16 + data[43] + UINT + + + #x7000 + 45 + 16 + data[44] + UINT + + + #x7000 + 46 + 16 + data[45] + UINT + + + #x7000 + 47 + 16 + data[46] + UINT + + + #x7000 + 48 + 16 + data[47] + UINT + + + #x7000 + 49 + 16 + data[48] + UINT + + + #x7000 + 50 + 16 + data[49] + UINT + + + #x7000 + 51 + 16 + data[50] + UINT + + + #x7000 + 52 + 16 + data[51] + UINT + + + #x7000 + 53 + 16 + data[52] + UINT + + + #x7000 + 54 + 16 + data[53] + UINT + + + #x7000 + 55 + 16 + data[54] + UINT + + + #x7000 + 56 + 16 + data[55] + UINT + + + #x7000 + 57 + 16 + data[56] + UINT + + + #x7000 + 58 + 16 + data[57] + UINT + + + #x7000 + 59 + 16 + data[58] + UINT + + + #x7000 + 60 + 16 + data[59] + UINT + + + #x7000 + 61 + 16 + data[60] + UINT + + + #x7000 + 62 + 16 + data[61] + UINT + + + #x7000 + 63 + 16 + data[62] + UINT + + + #x7000 + 64 + 16 + data[63] + UINT + + + #x7000 + 65 + 16 + data[64] + UINT + + + #x7000 + 66 + 16 + data[65] + UINT + + + #x7000 + 67 + 16 + data[66] + UINT + + + #x7000 + 68 + 16 + data[67] + UINT + + + #x7000 + 69 + 16 + data[68] + UINT + + + #x7000 + 70 + 16 + data[69] + UINT + + + #x7000 + 71 + 16 + data[70] + UINT + + + #x7000 + 72 + 16 + data[71] + UINT + + + #x7000 + 73 + 16 + data[72] + UINT + + + #x7000 + 74 + 16 + data[73] + UINT + + + #x7000 + 75 + 16 + data[74] + UINT + + + #x7000 + 76 + 16 + data[75] + UINT + + + #x7000 + 77 + 16 + data[76] + UINT + + + #x7000 + 78 + 16 + data[77] + UINT + + + #x7000 + 79 + 16 + data[78] + UINT + + + #x7000 + 80 + 16 + data[79] + UINT + + + #x7000 + 81 + 16 + data[80] + UINT + + + #x7000 + 82 + 16 + data[81] + UINT + + + #x7000 + 83 + 16 + data[82] + UINT + + + #x7000 + 84 + 16 + data[83] + UINT + + + #x7000 + 85 + 16 + data[84] + UINT + + + #x7000 + 86 + 16 + data[85] + UINT + + + #x7000 + 87 + 16 + data[86] + UINT + + + #x7000 + 88 + 16 + data[87] + UINT + + + #x7000 + 89 + 16 + data[88] + UINT + + + #x7000 + 90 + 16 + data[89] + UINT + + + #x7000 + 91 + 16 + data[90] + UINT + + + #x7000 + 92 + 16 + data[91] + UINT + + + #x7000 + 93 + 16 + data[92] + UINT + + + #x7000 + 94 + 16 + data[93] + UINT + + + #x7000 + 95 + 16 + data[94] + UINT + + + #x7000 + 96 + 16 + data[95] + UINT + + + #x7000 + 97 + 16 + data[96] + UINT + + + #x7000 + 98 + 16 + data[97] + UINT + + + #x7000 + 99 + 16 + data[98] + UINT + + + #x7000 + 100 + 16 + data[99] + UINT + + + #x7000 + 101 + 16 + data[100] + UINT + + + #x7000 + 102 + 16 + data[101] + UINT + + + #x7000 + 103 + 16 + data[102] + UINT + + + #x7000 + 104 + 16 + data[103] + UINT + + + #x7000 + 105 + 16 + data[104] + UINT + + + #x7000 + 106 + 16 + data[105] + UINT + + + #x7000 + 107 + 16 + data[106] + UINT + + + #x7000 + 108 + 16 + data[107] + UINT + + + #x7000 + 109 + 16 + data[108] + UINT + + + #x7000 + 110 + 16 + data[109] + UINT + + + #x7000 + 111 + 16 + data[110] + UINT + + + #x7000 + 112 + 16 + data[111] + UINT + + + #x7000 + 113 + 16 + data[112] + UINT + + + #x7000 + 114 + 16 + data[113] + UINT + + + #x7000 + 115 + 16 + data[114] + UINT + + + #x7000 + 116 + 16 + data[115] + UINT + + + #x7000 + 117 + 16 + data[116] + UINT + + + #x7000 + 118 + 16 + data[117] + UINT + + + #x7000 + 119 + 16 + data[118] + UINT + + + #x7000 + 120 + 16 + data[119] + UINT + + + #x7000 + 121 + 16 + data[120] + UINT + + + #x7000 + 122 + 16 + data[121] + UINT + + + #x7000 + 123 + 16 + data[122] + UINT + + + #x7000 + 124 + 16 + data[123] + UINT + + + #x7000 + 125 + 16 + data[124] + UINT + + + #x7000 + 126 + 16 + data[125] + UINT + + + #x7000 + 127 + 16 + data[126] + UINT + + + #x7000 + 128 + 16 + data[127] + UINT + + + #x7000 + 129 + 16 + data[128] + UINT + + + #x7000 + 130 + 16 + data[129] + UINT + + + #x7000 + 131 + 16 + data[130] + UINT + + + #x7000 + 132 + 16 + data[131] + UINT + + + #x7000 + 133 + 16 + data[132] + UINT + + + #x7000 + 134 + 16 + data[133] + UINT + + + #x7000 + 135 + 16 + data[134] + UINT + + + #x7000 + 136 + 16 + data[135] + UINT + + + #x7000 + 137 + 16 + data[136] + UINT + + + #x7000 + 138 + 16 + data[137] + UINT + + + #x7000 + 139 + 16 + data[138] + UINT + + + #x7000 + 140 + 16 + data[139] + UINT + + + #x7000 + 141 + 16 + data[140] + UINT + + + #x7000 + 142 + 16 + data[141] + UINT + + + #x7000 + 143 + 16 + data[142] + UINT + + + #x7000 + 144 + 16 + data[143] + UINT + + + #x7000 + 145 + 16 + data[144] + UINT + + + #x7000 + 146 + 16 + data[145] + UINT + + + #x7000 + 147 + 16 + data[146] + UINT + + + #x7000 + 148 + 16 + data[147] + UINT + + + #x7000 + 149 + 16 + data[148] + UINT + + + #x7000 + 150 + 16 + data[149] + UINT + + + #x7000 + 151 + 16 + data[150] + UINT + + + #x7000 + 152 + 16 + data[151] + UINT + + + #x7000 + 153 + 16 + data[152] + UINT + + + #x7000 + 154 + 16 + data[153] + UINT + + + #x7000 + 155 + 16 + data[154] + UINT + + + #x7000 + 156 + 16 + data[155] + UINT + + + #x7000 + 157 + 16 + data[156] + UINT + + + #x7000 + 158 + 16 + data[157] + UINT + + + #x7000 + 159 + 16 + data[158] + UINT + + + #x7000 + 160 + 16 + data[159] + UINT + + + #x7000 + 161 + 16 + data[160] + UINT + + + #x7000 + 162 + 16 + data[161] + UINT + + + #x7000 + 163 + 16 + data[162] + UINT + + + #x7000 + 164 + 16 + data[163] + UINT + + + #x7000 + 165 + 16 + data[164] + UINT + + + #x7000 + 166 + 16 + data[165] + UINT + + + #x7000 + 167 + 16 + data[166] + UINT + + + #x7000 + 168 + 16 + data[167] + UINT + + + #x7000 + 169 + 16 + data[168] + UINT + + + #x7000 + 170 + 16 + data[169] + UINT + + + #x7000 + 171 + 16 + data[170] + UINT + + + #x7000 + 172 + 16 + data[171] + UINT + + + #x7000 + 173 + 16 + data[172] + UINT + + + #x7000 + 174 + 16 + data[173] + UINT + + + #x7000 + 175 + 16 + data[174] + UINT + + + #x7000 + 176 + 16 + data[175] + UINT + + + #x7000 + 177 + 16 + data[176] + UINT + + + #x7000 + 178 + 16 + data[177] + UINT + + + #x7000 + 179 + 16 + data[178] + UINT + + + #x7000 + 180 + 16 + data[179] + UINT + + + #x7000 + 181 + 16 + data[180] + UINT + + + #x7000 + 182 + 16 + data[181] + UINT + + + #x7000 + 183 + 16 + data[182] + UINT + + + #x7000 + 184 + 16 + data[183] + UINT + + + #x7000 + 185 + 16 + data[184] + UINT + + + #x7000 + 186 + 16 + data[185] + UINT + + + #x7000 + 187 + 16 + data[186] + UINT + + + #x7000 + 188 + 16 + data[187] + UINT + + + #x7000 + 189 + 16 + data[188] + UINT + + + #x7000 + 190 + 16 + data[189] + UINT + + + #x7000 + 191 + 16 + data[190] + UINT + + + #x7000 + 192 + 16 + data[191] + UINT + + + #x7000 + 193 + 16 + data[192] + UINT + + + #x7000 + 194 + 16 + data[193] + UINT + + + #x7000 + 195 + 16 + data[194] + UINT + + + #x7000 + 196 + 16 + data[195] + UINT + + + #x7000 + 197 + 16 + data[196] + UINT + + + #x7000 + 198 + 16 + data[197] + UINT + + + #x7000 + 199 + 16 + data[198] + UINT + + + #x7000 + 200 + 16 + data[199] + UINT + + + #x7000 + 201 + 16 + data[200] + UINT + + + #x7000 + 202 + 16 + data[201] + UINT + + + #x7000 + 203 + 16 + data[202] + UINT + + + #x7000 + 204 + 16 + data[203] + UINT + + + #x7000 + 205 + 16 + data[204] + UINT + + + #x7000 + 206 + 16 + data[205] + UINT + + + #x7000 + 207 + 16 + data[206] + UINT + + + #x7000 + 208 + 16 + data[207] + UINT + + + #x7000 + 209 + 16 + data[208] + UINT + + + #x7000 + 210 + 16 + data[209] + UINT + + + #x7000 + 211 + 16 + data[210] + UINT + + + #x7000 + 212 + 16 + data[211] + UINT + + + #x7000 + 213 + 16 + data[212] + UINT + + + #x7000 + 214 + 16 + data[213] + UINT + + + #x7000 + 215 + 16 + data[214] + UINT + + + #x7000 + 216 + 16 + data[215] + UINT + + + #x7000 + 217 + 16 + data[216] + UINT + + + #x7000 + 218 + 16 + data[217] + UINT + + + #x7000 + 219 + 16 + data[218] + UINT + + + #x7000 + 220 + 16 + data[219] + UINT + + + #x7000 + 221 + 16 + data[220] + UINT + + + #x7000 + 222 + 16 + data[221] + UINT + + + #x7000 + 223 + 16 + data[222] + UINT + + + #x7000 + 224 + 16 + data[223] + UINT + + + #x7000 + 225 + 16 + data[224] + UINT + + + #x7000 + 226 + 16 + data[225] + UINT + + + #x7000 + 227 + 16 + data[226] + UINT + + + #x7000 + 228 + 16 + data[227] + UINT + + + #x7000 + 229 + 16 + data[228] + UINT + + + #x7000 + 230 + 16 + data[229] + UINT + + + #x7000 + 231 + 16 + data[230] + UINT + + + #x7000 + 232 + 16 + data[231] + UINT + + + #x7000 + 233 + 16 + data[232] + UINT + + + #x7000 + 234 + 16 + data[233] + UINT + + + #x7000 + 235 + 16 + data[234] + UINT + + + #x7000 + 236 + 16 + data[235] + UINT + + + #x7000 + 237 + 16 + data[236] + UINT + + + #x7000 + 238 + 16 + data[237] + UINT + + + #x7000 + 239 + 16 + data[238] + UINT + + + #x7000 + 240 + 16 + data[239] + UINT + + + #x7000 + 241 + 16 + data[240] + UINT + + + #x7000 + 242 + 16 + data[241] + UINT + + + #x7000 + 243 + 16 + data[242] + UINT + + + #x7000 + 244 + 16 + data[243] + UINT + + + #x7000 + 245 + 16 + data[244] + UINT + + + #x7000 + 246 + 16 + data[245] + UINT + + + #x7000 + 247 + 16 + data[246] + UINT + + + #x7000 + 248 + 16 + data[247] + UINT + + + #x7000 + 249 + 16 + data[248] + UINT + + + + #x1601 + RxPdo1 + + #x7001 + 1 + 16 + data[0] + UINT + + + #x7001 + 2 + 16 + data[1] + UINT + + + #x7001 + 3 + 16 + data[2] + UINT + + + #x7001 + 4 + 16 + data[3] + UINT + + + #x7001 + 5 + 16 + data[4] + UINT + + + #x7001 + 6 + 16 + data[5] + UINT + + + #x7001 + 7 + 16 + data[6] + UINT + + + #x7001 + 8 + 16 + data[7] + UINT + + + #x7001 + 9 + 16 + data[8] + UINT + + + #x7001 + 10 + 16 + data[9] + UINT + + + #x7001 + 11 + 16 + data[10] + UINT + + + #x7001 + 12 + 16 + data[11] + UINT + + + #x7001 + 13 + 16 + data[12] + UINT + + + #x7001 + 14 + 16 + data[13] + UINT + + + #x7001 + 15 + 16 + data[14] + UINT + + + #x7001 + 16 + 16 + data[15] + UINT + + + #x7001 + 17 + 16 + data[16] + UINT + + + #x7001 + 18 + 16 + data[17] + UINT + + + #x7001 + 19 + 16 + data[18] + UINT + + + #x7001 + 20 + 16 + data[19] + UINT + + + #x7001 + 21 + 16 + data[20] + UINT + + + #x7001 + 22 + 16 + data[21] + UINT + + + #x7001 + 23 + 16 + data[22] + UINT + + + #x7001 + 24 + 16 + data[23] + UINT + + + #x7001 + 25 + 16 + data[24] + UINT + + + #x7001 + 26 + 16 + data[25] + UINT + + + #x7001 + 27 + 16 + data[26] + UINT + + + #x7001 + 28 + 16 + data[27] + UINT + + + #x7001 + 29 + 16 + data[28] + UINT + + + #x7001 + 30 + 16 + data[29] + UINT + + + #x7001 + 31 + 16 + data[30] + UINT + + + #x7001 + 32 + 16 + data[31] + UINT + + + #x7001 + 33 + 16 + data[32] + UINT + + + #x7001 + 34 + 16 + data[33] + UINT + + + #x7001 + 35 + 16 + data[34] + UINT + + + #x7001 + 36 + 16 + data[35] + UINT + + + #x7001 + 37 + 16 + data[36] + UINT + + + #x7001 + 38 + 16 + data[37] + UINT + + + #x7001 + 39 + 16 + data[38] + UINT + + + #x7001 + 40 + 16 + data[39] + UINT + + + #x7001 + 41 + 16 + data[40] + UINT + + + #x7001 + 42 + 16 + data[41] + UINT + + + #x7001 + 43 + 16 + data[42] + UINT + + + #x7001 + 44 + 16 + data[43] + UINT + + + #x7001 + 45 + 16 + data[44] + UINT + + + #x7001 + 46 + 16 + data[45] + UINT + + + #x7001 + 47 + 16 + data[46] + UINT + + + #x7001 + 48 + 16 + data[47] + UINT + + + #x7001 + 49 + 16 + data[48] + UINT + + + #x7001 + 50 + 16 + data[49] + UINT + + + #x7001 + 51 + 16 + data[50] + UINT + + + #x7001 + 52 + 16 + data[51] + UINT + + + #x7001 + 53 + 16 + data[52] + UINT + + + #x7001 + 54 + 16 + data[53] + UINT + + + #x7001 + 55 + 16 + data[54] + UINT + + + #x7001 + 56 + 16 + data[55] + UINT + + + #x7001 + 57 + 16 + data[56] + UINT + + + #x7001 + 58 + 16 + data[57] + UINT + + + #x7001 + 59 + 16 + data[58] + UINT + + + #x7001 + 60 + 16 + data[59] + UINT + + + #x7001 + 61 + 16 + data[60] + UINT + + + #x7001 + 62 + 16 + data[61] + UINT + + + #x7001 + 63 + 16 + data[62] + UINT + + + #x7001 + 64 + 16 + data[63] + UINT + + + + #x1a00 + TxPdo + + #x6000 + 1 + 16 + dummy + UINT + + + + + + + + + Synchron + Free Run/SM Synchronous + #x0000 + 0 + 0 + 0 + 0 + + + DC + DC-Synchronous + #x0300 + 0 + 0 + 0 + 0 + + + + 2048 + 803E00AA00000100000000000000 + 0010800000148000 + + 424DDE000000000000007600000028000000100000000D000000010004000000000068000000000000000000000000000000000000000000000000008000008000000080800080000000800080008080000080808000C0C0C0000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFFFF007777777777777777600000666666688766666666666668876666666666B668876B6B6000066666676666600006B668870066600006666887006B60000666688766666666666666676666666666B6B667886B6000066666678866600006B6B6676666666666666667 + + + + diff --git a/src-tauri/TwinCATAUTDServer/README.md b/src-tauri/TwinCATAUTDServer/README.md new file mode 100644 index 0000000..1a2f94c --- /dev/null +++ b/src-tauri/TwinCATAUTDServer/README.md @@ -0,0 +1,19 @@ +# TwinCATAUTDServer + +TwinCAT AUTD Server for `link::TwinCAT` and `link::RemoteTwinCAT`. + +# Usage + +``` + TwinCATAUTDServer.exe [options] +``` + +## Options +* -c, --client Client IP address [default: ""] +* -s, --sync0 Sync0 cycle time in units of 500us [default: 2] +* -t, --task Send task cycle time in units of 500us [default: 2] +* -b, --base CPU base time in units of 500us [default: 1] +* -m, --mode Sync mode [default: DC] +* -k, --keep Keep TwinCAT XAE Shell window open [default: False] +* --version Show version information +* -?, -h, --help Show help and usage information diff --git a/src-tauri/TwinCATAUTDServer/System.Buffers.dll b/src-tauri/TwinCATAUTDServer/System.Buffers.dll new file mode 100644 index 0000000..f2d83c5 Binary files /dev/null and b/src-tauri/TwinCATAUTDServer/System.Buffers.dll differ diff --git a/src-tauri/TwinCATAUTDServer/System.CommandLine.dll b/src-tauri/TwinCATAUTDServer/System.CommandLine.dll new file mode 100644 index 0000000..501f32f Binary files /dev/null and b/src-tauri/TwinCATAUTDServer/System.CommandLine.dll differ diff --git a/src-tauri/TwinCATAUTDServer/System.Memory.dll b/src-tauri/TwinCATAUTDServer/System.Memory.dll new file mode 100644 index 0000000..5d19470 Binary files /dev/null and b/src-tauri/TwinCATAUTDServer/System.Memory.dll differ diff --git a/src-tauri/TwinCATAUTDServer/System.Numerics.Vectors.dll b/src-tauri/TwinCATAUTDServer/System.Numerics.Vectors.dll new file mode 100644 index 0000000..0865972 Binary files /dev/null and b/src-tauri/TwinCATAUTDServer/System.Numerics.Vectors.dll differ diff --git a/src-tauri/TwinCATAUTDServer/System.Runtime.CompilerServices.Unsafe.dll b/src-tauri/TwinCATAUTDServer/System.Runtime.CompilerServices.Unsafe.dll new file mode 100644 index 0000000..de9e124 Binary files /dev/null and b/src-tauri/TwinCATAUTDServer/System.Runtime.CompilerServices.Unsafe.dll differ diff --git a/src-tauri/TwinCATAUTDServer/TwinCAT.Ads.dll b/src-tauri/TwinCATAUTDServer/TwinCAT.Ads.dll new file mode 100644 index 0000000..fe83ef0 Binary files /dev/null and b/src-tauri/TwinCATAUTDServer/TwinCAT.Ads.dll differ diff --git a/src-tauri/TwinCATAUTDServer/TwinCATAUTDServer.exe b/src-tauri/TwinCATAUTDServer/TwinCATAUTDServer.exe new file mode 100644 index 0000000..59e94c1 Binary files /dev/null and b/src-tauri/TwinCATAUTDServer/TwinCATAUTDServer.exe differ diff --git a/src-tauri/build.rs b/src-tauri/build.rs new file mode 100644 index 0000000..6ea7487 --- /dev/null +++ b/src-tauri/build.rs @@ -0,0 +1,196 @@ +/* + * File: build.rs + * Project: AUTD Server + * Created Date: 07/07/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 10/12/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +use std::{ + fs::File, + io::{BufReader, BufWriter, Read, Write}, + path::Path, + process::Command, +}; + +fn main() -> Result<(), Box> { + let manifest_dir = Path::new(env!("CARGO_MANIFEST_DIR")); + + let ext = if cfg!(target_os = "windows") { + ".exe" + } else { + "" + }; + + std::fs::create_dir_all(manifest_dir.join("assets"))?; + std::fs::copy( + manifest_dir.join("../simulator/assets/autd3.glb"), + manifest_dir.join("assets/autd3.glb"), + )?; + + if cfg!(target_os = "macos") { + std::fs::copy( + manifest_dir.join("./target/x86_64-apple-darwin/release/simulator"), + manifest_dir.join("simulator-x86_64-apple-darwin"), + )?; + std::fs::copy( + manifest_dir.join("./target/aarch64-apple-darwin/release/simulator"), + manifest_dir.join("simulator-aarch64-apple-darwin"), + )?; + Command::new("lipo") + .current_dir(manifest_dir) + .args([ + "-create", + "simulator-x86_64-apple-darwin", + "simulator-aarch64-apple-darwin", + "-output", + "simulator-universal-apple-darwin", + ]) + .spawn()? + .wait()?; + + std::fs::copy( + manifest_dir.join("./target/x86_64-apple-darwin/release/SOEMAUTDServer"), + manifest_dir.join("SOEMAUTDServer-x86_64-apple-darwin"), + )?; + std::fs::copy( + manifest_dir.join("./target/aarch64-apple-darwin/release/SOEMAUTDServer"), + manifest_dir.join("SOEMAUTDServer-aarch64-apple-darwin"), + )?; + Command::new("lipo") + .current_dir(manifest_dir) + .args([ + "-create", + "SOEMAUTDServer-x86_64-apple-darwin", + "SOEMAUTDServer-aarch64-apple-darwin", + "-output", + "SOEMAUTDServer-universal-apple-darwin", + ]) + .spawn()? + .wait()?; + } else { + std::fs::copy( + manifest_dir.join(format!("./target/release/simulator{}", ext)), + manifest_dir.join(format!("simulator-{}{}", std::env::var("TARGET")?, ext)), + )?; + std::fs::copy( + manifest_dir.join(format!("./target/release/SOEMAUTDServer{}", ext)), + manifest_dir.join(format!( + "SOEMAUTDServer-{}{}", + std::env::var("TARGET")?, + ext + )), + )?; + }; + + // NOTICE + let notice_path = manifest_dir.join("NOTICE"); + if notice_path.exists() { + std::fs::remove_file(¬ice_path)?; + } + let mut writer = BufWriter::new(File::create(¬ice_path)?); + + { + let mut file_content = String::new(); + File::open(manifest_dir.join("../ThirdPartyNotice.txt")) + .map(BufReader::new)? + .read_to_string(&mut file_content)?; + writer.write_all(file_content.as_bytes())?; + } + { + let mut file_content = String::new(); + File::open(manifest_dir.join("ThirdPartyNotice.txt")) + .map(BufReader::new)? + .read_to_string(&mut file_content)?; + writeln!(writer)?; + writeln!( + writer, + "=========================================================" + )?; + writeln!(writer)?; + writer.write_all(file_content.as_bytes())?; + } + { + let mut file_content = String::new(); + File::open(manifest_dir.join("../simulator/ThirdPartyNotice.txt")) + .map(BufReader::new)? + .read_to_string(&mut file_content)?; + writeln!(writer)?; + writeln!( + writer, + "=========================================================" + )?; + writeln!(writer)?; + write!(writer, "AUTD SIMULATOR ")?; + writer.write_all(file_content.as_bytes())?; + } + { + let mut file_content = String::new(); + File::open(manifest_dir.join("../SOEMAUTDServer/ThirdPartyNotice.txt")) + .map(BufReader::new)? + .read_to_string(&mut file_content)?; + writeln!(writer)?; + writeln!( + writer, + "=========================================================" + )?; + writeln!(writer)?; + write!(writer, "SOEMAUTDServer ")?; + writer.write_all(file_content.as_bytes())?; + } + + writer.flush()?; + + // LICENSE + let license_path = manifest_dir.join("LICENSE"); + if license_path.exists() { + std::fs::remove_file(&license_path)?; + } + std::fs::copy(manifest_dir.join("../LICENSE"), license_path)?; + + // Installer + let license_path = manifest_dir.join("LICENSE.txt"); + if license_path.exists() { + std::fs::remove_file(&license_path)?; + } + let mut writer = BufWriter::new(File::create(&license_path)?); + { + let mut file_content = String::new(); + File::open(manifest_dir.join("../LICENSE")) + .map(BufReader::new)? + .read_to_string(&mut file_content)?; + writer.write_all(file_content.as_bytes())?; + } + { + let mut file_content = String::new(); + File::open(manifest_dir.join("NOTICE")) + .map(BufReader::new)? + .read_to_string(&mut file_content)?; + writeln!(writer)?; + writeln!( + writer, + "=========================================================" + )?; + writeln!(writer)?; + writer.write_all(file_content.as_bytes())?; + } + + // Wix + let mut file_content = String::new(); + File::open(manifest_dir.join("LICENSE.txt")) + .map(BufReader::new)? + .read_to_string(&mut file_content)?; + let mut writer = BufWriter::new(File::create(manifest_dir.join("LICENSE.rtf"))?); + writer.write_all(file_content.as_bytes())?; + + writer.flush()?; + + tauri_build::build(); + + Ok(()) +} diff --git a/src-tauri/icons/128x128.png b/src-tauri/icons/128x128.png new file mode 100644 index 0000000..0e75b3d Binary files /dev/null and b/src-tauri/icons/128x128.png differ diff --git a/src-tauri/icons/128x128@2x.png b/src-tauri/icons/128x128@2x.png new file mode 100644 index 0000000..694546d Binary files /dev/null and b/src-tauri/icons/128x128@2x.png differ diff --git a/src-tauri/icons/16x16.png b/src-tauri/icons/16x16.png new file mode 100644 index 0000000..88d3771 Binary files /dev/null and b/src-tauri/icons/16x16.png differ diff --git a/src-tauri/icons/256x256.png b/src-tauri/icons/256x256.png new file mode 100644 index 0000000..135a0ae Binary files /dev/null and b/src-tauri/icons/256x256.png differ diff --git a/src-tauri/icons/32x32.png b/src-tauri/icons/32x32.png new file mode 100644 index 0000000..f059acc Binary files /dev/null and b/src-tauri/icons/32x32.png differ diff --git a/src-tauri/icons/512x512.png b/src-tauri/icons/512x512.png new file mode 100644 index 0000000..7519105 Binary files /dev/null and b/src-tauri/icons/512x512.png differ diff --git a/src-tauri/icons/Square107x107Logo.png b/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 0000000..5caf56b Binary files /dev/null and b/src-tauri/icons/Square107x107Logo.png differ diff --git a/src-tauri/icons/Square142x142Logo.png b/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 0000000..664f0c1 Binary files /dev/null and b/src-tauri/icons/Square142x142Logo.png differ diff --git a/src-tauri/icons/Square150x150Logo.png b/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 0000000..0ff2ce9 Binary files /dev/null and b/src-tauri/icons/Square150x150Logo.png differ diff --git a/src-tauri/icons/Square284x284Logo.png b/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 0000000..e74f76d Binary files /dev/null and b/src-tauri/icons/Square284x284Logo.png differ diff --git a/src-tauri/icons/Square30x30Logo.png b/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 0000000..81174a8 Binary files /dev/null and b/src-tauri/icons/Square30x30Logo.png differ diff --git a/src-tauri/icons/Square310x310Logo.png b/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 0000000..93b53ce Binary files /dev/null and b/src-tauri/icons/Square310x310Logo.png differ diff --git a/src-tauri/icons/Square44x44Logo.png b/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 0000000..e91860c Binary files /dev/null and b/src-tauri/icons/Square44x44Logo.png differ diff --git a/src-tauri/icons/Square71x71Logo.png b/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 0000000..b7be4e3 Binary files /dev/null and b/src-tauri/icons/Square71x71Logo.png differ diff --git a/src-tauri/icons/Square89x89Logo.png b/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 0000000..f41ffc6 Binary files /dev/null and b/src-tauri/icons/Square89x89Logo.png differ diff --git a/src-tauri/icons/StoreLogo.png b/src-tauri/icons/StoreLogo.png new file mode 100644 index 0000000..e5d84b8 Binary files /dev/null and b/src-tauri/icons/StoreLogo.png differ diff --git a/src-tauri/icons/icon.icns b/src-tauri/icons/icon.icns new file mode 100644 index 0000000..38b86ca Binary files /dev/null and b/src-tauri/icons/icon.icns differ diff --git a/src-tauri/icons/icon.ico b/src-tauri/icons/icon.ico new file mode 100644 index 0000000..77f6eb2 Binary files /dev/null and b/src-tauri/icons/icon.ico differ diff --git a/src-tauri/icons/icon.iconset/icon_128x128.png b/src-tauri/icons/icon.iconset/icon_128x128.png new file mode 100644 index 0000000..05dbaa3 Binary files /dev/null and b/src-tauri/icons/icon.iconset/icon_128x128.png differ diff --git a/src-tauri/icons/icon.iconset/icon_128x128@2x.png b/src-tauri/icons/icon.iconset/icon_128x128@2x.png new file mode 100644 index 0000000..3441a91 Binary files /dev/null and b/src-tauri/icons/icon.iconset/icon_128x128@2x.png differ diff --git a/src-tauri/icons/icon.iconset/icon_16x16.png b/src-tauri/icons/icon.iconset/icon_16x16.png new file mode 100644 index 0000000..d471d5b Binary files /dev/null and b/src-tauri/icons/icon.iconset/icon_16x16.png differ diff --git a/src-tauri/icons/icon.iconset/icon_16x16@2x.png b/src-tauri/icons/icon.iconset/icon_16x16@2x.png new file mode 100644 index 0000000..311d316 Binary files /dev/null and b/src-tauri/icons/icon.iconset/icon_16x16@2x.png differ diff --git a/src-tauri/icons/icon.iconset/icon_256x256.png b/src-tauri/icons/icon.iconset/icon_256x256.png new file mode 100644 index 0000000..466234a Binary files /dev/null and b/src-tauri/icons/icon.iconset/icon_256x256.png differ diff --git a/src-tauri/icons/icon.iconset/icon_256x256@2x.png b/src-tauri/icons/icon.iconset/icon_256x256@2x.png new file mode 100644 index 0000000..e7f96e6 Binary files /dev/null and b/src-tauri/icons/icon.iconset/icon_256x256@2x.png differ diff --git a/src-tauri/icons/icon.iconset/icon_32x32.png b/src-tauri/icons/icon.iconset/icon_32x32.png new file mode 100644 index 0000000..8ac07bc Binary files /dev/null and b/src-tauri/icons/icon.iconset/icon_32x32.png differ diff --git a/src-tauri/icons/icon.iconset/icon_32x32@2x.png b/src-tauri/icons/icon.iconset/icon_32x32@2x.png new file mode 100644 index 0000000..4310b7a Binary files /dev/null and b/src-tauri/icons/icon.iconset/icon_32x32@2x.png differ diff --git a/src-tauri/icons/icon.iconset/icon_512x512.png b/src-tauri/icons/icon.iconset/icon_512x512.png new file mode 100644 index 0000000..9f3d8a8 Binary files /dev/null and b/src-tauri/icons/icon.iconset/icon_512x512.png differ diff --git a/src-tauri/icons/icon.iconset/icon_512x512@2x.png b/src-tauri/icons/icon.iconset/icon_512x512@2x.png new file mode 100644 index 0000000..42445b7 Binary files /dev/null and b/src-tauri/icons/icon.iconset/icon_512x512@2x.png differ diff --git a/src-tauri/icons/icon.png b/src-tauri/icons/icon.png new file mode 100644 index 0000000..9f3d8a8 Binary files /dev/null and b/src-tauri/icons/icon.png differ diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs new file mode 100644 index 0000000..2300506 --- /dev/null +++ b/src-tauri/src/main.rs @@ -0,0 +1,266 @@ +/* + * File: main.rs + * Project: AUTD Server + * Created Date: 07/07/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 06/09/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +mod options; + +use options::Options; + +use std::{path::PathBuf, process::Stdio}; + +use tauri::Manager; + +use tokio::{ + fs::{File, OpenOptions}, + io::{AsyncBufReadExt, AsyncReadExt, AsyncWriteExt, BufReader}, + process::Command, + sync::mpsc::{channel, Sender}, +}; + +const SETTINGS_PATH: &str = "settings.json"; + +fn get_settings_file_path(handle: &tauri::AppHandle) -> std::io::Result { + let mut path = handle + .app_handle() + .path_resolver() + .app_config_dir() + .unwrap_or_default(); + if !path.exists() { + std::fs::create_dir_all(&path)?; + } + path.push(SETTINGS_PATH); + Ok(path) +} + +#[tauri::command] +async fn load_settings(handle: tauri::AppHandle) -> Result { + let options: Options = if let Ok(mut file) = + File::open(get_settings_file_path(&handle).map_err(|e| e.to_string())?).await + { + let mut contents = String::new(); + file.read_to_string(&mut contents) + .await + .map_err(|e| e.to_string())?; + serde_json::from_str(&contents).map_err(|e| e.to_string())? + } else { + Default::default() + }; + Ok(options) +} + +#[tauri::command] +async fn save_settings(handle: tauri::AppHandle, options: &str) -> Result<(), String> { + let options: Options = serde_json::from_str(options).map_err(|e| e.to_string())?; + let json = serde_json::to_string_pretty(&options).map_err(|e| e.to_string())?; + let mut file = match OpenOptions::new() + .write(true) + .create_new(true) + .open(get_settings_file_path(&handle).map_err(|e| e.to_string())?) + .await + { + Ok(file) => file, + Err(_) => File::create(get_settings_file_path(&handle).map_err(|e| e.to_string())?) + .await + .map_err(|e| e.to_string())?, + }; + file.write_all(json.as_bytes()) + .await + .map_err(|e| e.to_string())?; + Ok(()) +} + +#[tauri::command] +async fn wpcap_installed() -> bool { + #[cfg(target_os = "windows")] + { + unsafe { + if libloading::Library::new("wpcap.dll").is_err() { + return false; + } + } + } + true +} + +#[tauri::command] +async fn twincat_installed() -> bool { + std::path::Path::new("C:/TwinCAT/3.1/Config/Io/EtherCAT").exists() +} + +#[tauri::command] +async fn copy_autd_xml( + handle: tauri::AppHandle, + console_emu_input_tx: tauri::State<'_, Sender>, +) -> Result<(), String> { + let dst = std::path::Path::new("C:/TwinCAT/3.1/Config/Io/EtherCAT/AUTD.xml"); + + if dst.exists() { + console_emu_input_tx + .send("AUTD.xml is already exists".to_string()) + .await + .map_err(|e| e.to_string())?; + return Ok(()); + } + + if dst.parent().map_or(false, |p| !p.exists()) { + return Err("TwinCAT is not installed".to_string()); + } + + let autd_xml_path = handle + .path_resolver() + .resolve_resource("TwinCATAUTDServer/AUTD.xml") + .ok_or("Can't find AUTD.xml")?; + + tokio::fs::copy(autd_xml_path, dst) + .await + .map_err(|e| e.to_string())?; + + console_emu_input_tx + .send("AUTD.xml is successfully copied".to_string()) + .await + .map_err(|e| e.to_string())?; + + Ok(()) +} + +#[tauri::command] +async fn run_twincat_server( + twincat_options: &str, + handle: tauri::AppHandle, + console_emu_input_tx: tauri::State<'_, Sender>, +) -> Result<(), String> { + let twincat_autd_server_path = handle + .path_resolver() + .resolve_resource("TwinCATAUTDServer/TwinCATAUTDServer.exe") + .ok_or("Can't find TwinCATAUTDServer.exe")?; + + let twincat_options: options::TwinCATOptions = + serde_json::from_str(twincat_options).map_err(|e| e.to_string())?; + + let mut args = vec![ + "-c".to_string(), + twincat_options.client, + "-s".to_string(), + twincat_options.sync0.to_string(), + "-t".to_string(), + twincat_options.task.to_string(), + "-b".to_string(), + twincat_options.base.to_string(), + "-m".to_string(), + match twincat_options.mode { + autd3_driver::sync_mode::SyncMode::DC => "DC".to_string(), + autd3_driver::sync_mode::SyncMode::FreeRun => "FreeRun".to_string(), + }, + ]; + if twincat_options.keep { + args.push("-k".to_string()); + } + + #[cfg(target_os = "windows")] + let mut child = Command::new(&twincat_autd_server_path) + .args(args) + .stdout(Stdio::piped()) + .creation_flags(0x08000000) // CREATE_NO_WINDOW + .spawn() + .map_err(|e| e.to_string())?; + #[cfg(not(target_os = "windows"))] + let mut child = Command::new(&twincat_autd_server_path) + .args(args) + .stdout(Stdio::piped()) + .spawn() + .map_err(|e| e.to_string())?; + + let stdout = child.stdout.take().ok_or("Failed to open stdout")?; + let mut reader = BufReader::new(stdout); + + loop { + let mut buf = String::new(); + if reader.read_line(&mut buf).await.unwrap() == 0 { + break; + } + console_emu_input_tx + .send(buf.trim().to_string()) + .await + .map_err(|e| e.to_string())?; + } + + Ok(()) +} + +#[tauri::command] +async fn open_xae_shell() -> Result<(), String> { + let path = std::env::var("TEMP").unwrap_or_default(); + let path = std::path::Path::new(&path) + .join("TwinCATAUTDServer") + .join("TwinCATAUTDServer.sln"); + + let xae_shell = std::path::Path::new("C:\\") + .join("Program Files (x86)") + .join("Beckhoff") + .join("TcXaeShell") + .join("Common7") + .join("IDE") + .join("TcXaeShell.exe"); + + if path.exists() { + Command::new(&xae_shell).arg(&path).spawn() + } else { + Command::new(&xae_shell).spawn() + } + .map_err(|e| e.to_string())? + .wait() + .await + .map_err(|e| e.to_string())?; + + Ok(()) +} + +#[tokio::main] +async fn main() { + tauri::async_runtime::set(tokio::runtime::Handle::current()); + + let (console_emu_input_tx, mut console_emu_input_rx) = channel::(32); + + tauri::Builder::default() + .manage(console_emu_input_tx) + .setup(|app| { + #[cfg(debug_assertions)] + { + let window = app.get_window("main").unwrap(); + window.open_devtools(); + window.close_devtools(); + } + + let app_handle = app.app_handle(); + tokio::spawn(async move { + while let Some(s) = console_emu_input_rx.recv().await { + app_handle.emit_all("console-emu", s).unwrap(); + } + }); + + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + load_settings, + save_settings, + copy_autd_xml, + run_twincat_server, + open_xae_shell, + twincat_installed, + wpcap_installed + ]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/src-tauri/src/options.rs b/src-tauri/src/options.rs new file mode 100644 index 0000000..dc37243 --- /dev/null +++ b/src-tauri/src/options.rs @@ -0,0 +1,98 @@ +/* + * File: options.rs + * Project: AUTD Server + * Created Date: 06/07/2023 + * Author: Shun Suzuki + * ----- + * Last Modified: 25/10/2023 + * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp) + * ----- + * Copyright (c) 2023 Shun Suzuki. All rights reserved. + * + */ + +use serde::{Deserialize, Serialize}; + +use autd3_driver::{sync_mode::SyncMode, timer_strategy::TimerStrategy}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct TwinCATOptions { + pub client: String, + pub sync0: u32, + pub task: u32, + pub base: u32, + pub mode: SyncMode, + pub keep: bool, +} + +impl Default for TwinCATOptions { + fn default() -> Self { + Self { + client: "".to_string(), + sync0: 2, + task: 2, + base: 1, + mode: SyncMode::DC, + keep: false, + } + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct SOEMOptions { + pub ifname: String, + pub port: u16, + pub sync0: u32, + pub send: u32, + pub buf_size: usize, + pub mode: SyncMode, + pub timer_strategy: TimerStrategy, + pub state_check_interval: std::time::Duration, + pub timeout: std::time::Duration, + pub debug: bool, +} + +impl Default for SOEMOptions { + fn default() -> Self { + Self { + ifname: "".to_string(), + port: 8080, + sync0: 2, + send: 2, + buf_size: 32, + mode: SyncMode::FreeRun, + timer_strategy: TimerStrategy::Sleep, + state_check_interval: std::time::Duration::from_millis(500), + timeout: std::time::Duration::from_millis(200), + debug: false, + } + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct SimulatorOptions { + pub vsync: bool, + pub port: u16, + pub gpu_idx: i32, + pub window_width: u32, + pub window_height: u32, +} + +impl Default for SimulatorOptions { + fn default() -> Self { + Self { + vsync: true, + port: 8080, + gpu_idx: -1, + window_width: 800, + window_height: 600, + } + } +} + +#[derive(Default, Debug, Serialize, Deserialize)] +pub struct Options { + pub twincat: TwinCATOptions, + pub soem: SOEMOptions, + pub simulator: SimulatorOptions, +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json new file mode 100644 index 0000000..2b22e2d --- /dev/null +++ b/src-tauri/tauri.conf.json @@ -0,0 +1,135 @@ +{ + "$schema": "../node_modules/@tauri-apps/cli/schema.json", + "build": { + "beforeBuildCommand": "npm run build", + "beforeDevCommand": "npm run dev", + "devPath": "http://localhost:1420", + "distDir": "../dist" + }, + "package": { + "productName": "AUTD Server", + "version": "19.0.0" + }, + "tauri": { + "allowlist": { + "fs": { + "scope": [ + "$RESOURCE/*" + ] + }, + "path": { + "all": true + }, + "os": { + "all": true + }, + "notification": { + "all": true + }, + "dialog": { + "all": true, + "ask": true, + "confirm": true, + "message": true, + "open": true, + "save": true + }, + "shell": { + "sidecar": true, + "scope": [ + { + "name": "simulator", + "sidecar": true, + "args": true + }, + { + "name": "SOEMAUTDServer", + "sidecar": true, + "args": true + } + ] + }, + "window": { + "all": true + } + }, + "bundle": { + "active": true, + "targets": [ + "msi", + "deb", + "dmg" + ], + "identifier": "com.shinolab.autd3-server", + "publisher": "Shun Suzuki", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "resources": [ + "./LICENSE", + "./NOTICE", + "./assets/autd3.glb", + "./TwinCATAUTDServer/LICENSE", + "./TwinCATAUTDServer/README.md", + "./TwinCATAUTDServer/AUTD.xml", + "./TwinCATAUTDServer/TwinCATAUTDServer.exe", + "./TwinCATAUTDServer/System.Buffers.dll", + "./TwinCATAUTDServer/System.CommandLine.dll", + "./TwinCATAUTDServer/System.Memory.dll", + "./TwinCATAUTDServer/System.Numerics.Vectors.dll", + "./TwinCATAUTDServer/System.Runtime.CompilerServices.Unsafe.dll", + "./TwinCATAUTDServer/TwinCAT.Ads.dll" + ], + "copyright": "Copyright (c) 2023 Shun Suzuki. All rights reserved.", + "category": "DeveloperTool", + "shortDescription": "AUTD Server application", + "longDescription": "", + "deb": { + "depends": [], + "files": { + "LICENSE": "LICENSE", + "NOTICE": "NOTICE" + } + }, + "macOS": { + "entitlements": null, + "exceptionDomain": "", + "frameworks": [], + "providerShortName": null, + "signingIdentity": null, + "license": "LICENSE.txt" + }, + "externalBin": [ + "simulator", + "SOEMAUTDServer" + ], + "windows": { + "certificateThumbprint": null, + "digestAlgorithm": "sha256", + "timestampUrl": "", + "wix": { + "license": "LICENSE.rtf" + } + } + }, + "security": { + "csp": null + }, + "updater": { + "active": false + }, + "windows": [ + { + "fullscreen": false, + "height": 600, + "resizable": true, + "title": "AUTD Server v19.0.0", + "width": 800 + } + ] + } +} \ No newline at end of file diff --git a/src/App.svelte b/src/App.svelte new file mode 100644 index 0000000..25b47ce --- /dev/null +++ b/src/App.svelte @@ -0,0 +1,114 @@ + + + + +
+
+ {#if options} + + {/if} + +
+ +
+ + + +
+
+ + diff --git a/src/lib/LeftPanel.svelte b/src/lib/LeftPanel.svelte new file mode 100644 index 0000000..ae6bc98 --- /dev/null +++ b/src/lib/LeftPanel.svelte @@ -0,0 +1,123 @@ + + + + +
+ {#await promise then { twincatAvailable, soemAvailable }} + + + {#if twincatAvailable} + TwinCAT + {/if} + {#if soemAvailable} + SOEM + {/if} + Simulator + + + {#if twincatAvailable} + + + + {/if} + {#if soemAvailable} + + + + {/if} + + + + + {/await} +
+ + diff --git a/src/lib/License.svelte b/src/lib/License.svelte new file mode 100644 index 0000000..7f5bd44 --- /dev/null +++ b/src/lib/License.svelte @@ -0,0 +1,48 @@ + + +
+

AUTD Server

+

Copyright (c) 2023 Shun Suzuki. All rights reserved.

+

+ AUTD Server is MIT licensed. For the licenses of the programs used by + AUTD Server, please see NOTICE file. +

+

+ AUTD Server is distributed at https://github.com/shinolab/autd3. For + details, please refer to this repository. +

+
+ + diff --git a/src/lib/RightPanel.svelte b/src/lib/RightPanel.svelte new file mode 100644 index 0000000..391a578 --- /dev/null +++ b/src/lib/RightPanel.svelte @@ -0,0 +1,74 @@ + + + + +
+ +
+ + diff --git a/src/lib/UI/SOEM.svelte b/src/lib/UI/SOEM.svelte new file mode 100644 index 0000000..86ad5a8 --- /dev/null +++ b/src/lib/UI/SOEM.svelte @@ -0,0 +1,211 @@ + + + + +
+ + + + + + + + + + + + +
+ + diff --git a/src/lib/UI/TwinCAT.svelte b/src/lib/UI/TwinCAT.svelte new file mode 100644 index 0000000..dfe4662 --- /dev/null +++ b/src/lib/UI/TwinCAT.svelte @@ -0,0 +1,114 @@ + + + + +
+ + + + + + + + + + + + + + +