diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 9924ce884..a53a2e5bc 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1 +1,2 @@
-* @tokio-rs/console
\ No newline at end of file
+* @tokio-rs/console
+/console-subscriber/examples/grpc_web @hi-rustin
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 3f7c3a7ce..8c56fdc58 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -101,3 +101,34 @@ jobs:
- name: Run cargo clippy
run: cargo clippy -- -D warnings
+
+ grpc_web:
+ name: gRPC-web Example
+ runs-on: ubuntu-latest
+ defaults:
+ run:
+ working-directory: console-subscriber/examples/grpc_web/app
+ steps:
+ - name: Checkout sources
+ uses: actions/checkout@v4
+
+ - name: Use Node.js
+ uses: actions/setup-node@v4
+
+ - name: Install dependencies
+ run: npm install
+
+ - name: Lint
+ run: npm run lint
+
+ - name: Format
+ run: npm run fmt
+
+ - name: Generate
+ run: npm run gen
+
+ - name: Check no changes
+ run: git diff --exit-code
+
+ - name: Build
+ run: npm run build
diff --git a/console-subscriber/examples/grpc_web/README.md b/console-subscriber/examples/grpc_web/README.md
new file mode 100644
index 000000000..c3c3802ff
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/README.md
@@ -0,0 +1,50 @@
+# gRPC-web Example
+
+This app provides an example of using the gRPC-web library to facilitate communication between a web browser and a gRPC server.
+
+## Prerequisites
+
+Ensure you have the following installed on your system:
+
+- [Node.js](https://nodejs.org/en/download/) (version 20.10.0 or higher)
+- [npm](https://www.npmjs.com/get-npm) (version 10.2.3 or higher)
+
+## Getting Started
+
+Follow these steps to get the application up and running:
+
+1. **Install Dependencies:** Navigate to the `console-subscriber/examples/grpc_web/app` directory and install all necessary dependencies:
+
+ ```sh
+ npm install
+ ```
+
+2. **Start the gRPC-web Server:** In the console-subscriber directory, start the server:
+
+ ```sh
+ cargo run --example grpc_web --features grpc-web
+ ```
+
+3. **Start the Web Application:** In the `console-subscriber/examples/grpc_web/app` directory, start the web application:
+
+ ```sh
+ npm run dev
+ ```
+
+4. **View the Application:** Open a web browser and navigate to `http://localhost:5173`. You can view the output in the developer console.
+
+## Understanding the Code
+
+This example leverages the [connect-es] library to enable communication with the gRPC server from a web browser. The client code can be found in the `console-subscriber/examples/grpc_web/app/src/app.tsx` file.
+
+The [buf] tool is used to generate the gRPC code. You can generate the code using the following command:
+
+```sh
+npm run gen
+```
+
+For more information about the connect-es library, refer to the [connect-es documentation].
+
+[connect-es]: https://github.com/connectrpc/connect-es
+[buf]: https://buf.build/
+[connect-es documentation]: https://connectrpc.com/docs/web/getting-started
diff --git a/console-subscriber/examples/grpc_web/app/.eslintrc.cjs b/console-subscriber/examples/grpc_web/app/.eslintrc.cjs
new file mode 100644
index 000000000..6e8698b72
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/.eslintrc.cjs
@@ -0,0 +1,18 @@
+module.exports = {
+ root: true,
+ env: { browser: true, es2020: true },
+ extends: [
+ "eslint:recommended",
+ "plugin:@typescript-eslint/recommended",
+ "plugin:react-hooks/recommended",
+ ],
+ ignorePatterns: ["dist", ".eslintrc.cjs"],
+ parser: "@typescript-eslint/parser",
+ plugins: ["react-refresh"],
+ rules: {
+ "react-refresh/only-export-components": [
+ "warn",
+ { allowConstantExport: true },
+ ],
+ },
+};
diff --git a/console-subscriber/examples/grpc_web/app/.gitignore b/console-subscriber/examples/grpc_web/app/.gitignore
new file mode 100644
index 000000000..a547bf36d
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/.gitignore
@@ -0,0 +1,24 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
diff --git a/console-subscriber/examples/grpc_web/app/.prettierignore b/console-subscriber/examples/grpc_web/app/.prettierignore
new file mode 100644
index 000000000..ad9ce2816
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/.prettierignore
@@ -0,0 +1 @@
+src/gen/**/*
diff --git a/console-subscriber/examples/grpc_web/app/README.md b/console-subscriber/examples/grpc_web/app/README.md
new file mode 120000
index 000000000..32d46ee88
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/README.md
@@ -0,0 +1 @@
+../README.md
\ No newline at end of file
diff --git a/console-subscriber/examples/grpc_web/app/buf.gen.yaml b/console-subscriber/examples/grpc_web/app/buf.gen.yaml
new file mode 100644
index 000000000..af41edfab
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/buf.gen.yaml
@@ -0,0 +1,8 @@
+version: v1
+plugins:
+ - plugin: es
+ opt: target=ts
+ out: src/gen
+ - plugin: connect-es
+ opt: target=ts
+ out: src/gen
diff --git a/console-subscriber/examples/grpc_web/app/index.html b/console-subscriber/examples/grpc_web/app/index.html
new file mode 100644
index 000000000..7badf9861
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+ gRPC-Web Example
+
+
+
+
+
+
diff --git a/console-subscriber/examples/grpc_web/app/package-lock.json b/console-subscriber/examples/grpc_web/app/package-lock.json
new file mode 100644
index 000000000..0fc728ef1
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/package-lock.json
@@ -0,0 +1,3496 @@
+{
+ "name": "app",
+ "version": "0.0.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "app",
+ "version": "0.0.0",
+ "dependencies": {
+ "@bufbuild/protobuf": "^1.7.2",
+ "@connectrpc/connect": "^1.3.0",
+ "@connectrpc/connect-web": "^1.3.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@bufbuild/buf": "^1.29.0",
+ "@bufbuild/protoc-gen-es": "^1.7.2",
+ "@connectrpc/protoc-gen-connect-es": "^1.3.0",
+ "@types/react": "^18.2.55",
+ "@types/react-dom": "^18.2.19",
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
+ "@typescript-eslint/parser": "^6.21.0",
+ "@vitejs/plugin-react": "^4.2.1",
+ "eslint": "^8.56.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.5",
+ "prettier": "^3.2.5",
+ "typescript": "^5.2.2",
+ "vite": "^5.1.0"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
+ "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.23.4",
+ "chalk": "^2.4.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz",
+ "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz",
+ "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@babel/helper-compilation-targets": "^7.23.6",
+ "@babel/helper-module-transforms": "^7.23.3",
+ "@babel/helpers": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@babel/template": "^7.23.9",
+ "@babel/traverse": "^7.23.9",
+ "@babel/types": "^7.23.9",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
+ "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.23.6",
+ "@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.23.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
+ "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.23.5",
+ "@babel/helper-validator-option": "^7.23.5",
+ "browserslist": "^4.22.2",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+ "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.23.0"
+ },
+ "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,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+ "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
+ "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-module-imports": "^7.22.15",
+ "@babel/helper-simple-access": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/helper-validator-identifier": "^7.22.20"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
+ "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
+ "dev": true,
+ "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,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
+ "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.23.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
+ "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz",
+ "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.23.9",
+ "@babel/traverse": "^7.23.9",
+ "@babel/types": "^7.23.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.23.4",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
+ "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz",
+ "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==",
+ "dev": true,
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz",
+ "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.23.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz",
+ "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz",
+ "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.23.5",
+ "@babel/parser": "^7.23.9",
+ "@babel/types": "^7.23.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz",
+ "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.23.5",
+ "@babel/generator": "^7.23.6",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.23.9",
+ "@babel/types": "^7.23.9",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.23.9",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz",
+ "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.23.4",
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@bufbuild/buf": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf/-/buf-1.29.0.tgz",
+ "integrity": "sha512-euksXeFtvlvAV5j94LqXb69qQcJvFfo8vN1d3cx+IzhOKoipykuQQTq7mOWVo2R0kdk6yIMBLBofOYOsh0Df8g==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "buf": "bin/buf",
+ "protoc-gen-buf-breaking": "bin/protoc-gen-buf-breaking",
+ "protoc-gen-buf-lint": "bin/protoc-gen-buf-lint"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@bufbuild/buf-darwin-arm64": "1.29.0",
+ "@bufbuild/buf-darwin-x64": "1.29.0",
+ "@bufbuild/buf-linux-aarch64": "1.29.0",
+ "@bufbuild/buf-linux-x64": "1.29.0",
+ "@bufbuild/buf-win32-arm64": "1.29.0",
+ "@bufbuild/buf-win32-x64": "1.29.0"
+ }
+ },
+ "node_modules/@bufbuild/buf-darwin-arm64": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf-darwin-arm64/-/buf-darwin-arm64-1.29.0.tgz",
+ "integrity": "sha512-5hKxsARoY2WpWq1n5ONFqqGuauHb4yILKXCy37KRYCKiRLWmIP5yI3gWvWHKoH7sUJWTQmBqdJoCvYQr6ahQnw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@bufbuild/buf-darwin-x64": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf-darwin-x64/-/buf-darwin-x64-1.29.0.tgz",
+ "integrity": "sha512-wOAPxbPLBns4AHiComWtdO1sx1J1p6mDYTbqmloHuI+B5U2rDbMsoHoe4nBcoMF8+RHxoqjypha29wVo6yzbZg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@bufbuild/buf-linux-aarch64": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf-linux-aarch64/-/buf-linux-aarch64-1.29.0.tgz",
+ "integrity": "sha512-jLk2J/wyyM7KNJ/DkLfhy3eS2/Bdb70e/56adMkapSoLJmghnpgxW+oFznMxxQUX5I9BU5hTn1UhDFxgLwhP7g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@bufbuild/buf-linux-x64": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf-linux-x64/-/buf-linux-x64-1.29.0.tgz",
+ "integrity": "sha512-heLOywj3Oaoh69RnTx7tHsuz6rEnvz77bghLEOghsrjBR6Jcpcwc137EZR4kRTIWJNrE8Kmo3RVeXlv144qQIQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@bufbuild/buf-win32-arm64": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf-win32-arm64/-/buf-win32-arm64-1.29.0.tgz",
+ "integrity": "sha512-Eglyvr3PLqVucuHBcQ61conyBgH9BRaoLpKWcce1gYBVlxMQM1NxjVjGOWihxQ1dXXw5qZXmYfVODf3gSwPMuQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@bufbuild/buf-win32-x64": {
+ "version": "1.29.0",
+ "resolved": "https://registry.npmjs.org/@bufbuild/buf-win32-x64/-/buf-win32-x64-1.29.0.tgz",
+ "integrity": "sha512-wRk6co+nqHqEq4iLolXgej0jUVlWlTtGHjKaq54lTbKZrwxrBgql6qS06abgNPRASX0++XT9m3QRZ97qEIC/HQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@bufbuild/protobuf": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-1.7.2.tgz",
+ "integrity": "sha512-i5GE2Dk5ekdlK1TR7SugY4LWRrKSfb5T1Qn4unpIMbfxoeGKERKQ59HG3iYewacGD10SR7UzevfPnh6my4tNmQ=="
+ },
+ "node_modules/@bufbuild/protoc-gen-es": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@bufbuild/protoc-gen-es/-/protoc-gen-es-1.7.2.tgz",
+ "integrity": "sha512-yiRk/T+YGmpSVvIkybCjPt+QyM/pLWMO+MAiz6auvCsiAgfXfc5nFFosD4yBYXID55M6eIkgBcity1AoJ6I30A==",
+ "dev": true,
+ "dependencies": {
+ "@bufbuild/protobuf": "^1.7.2",
+ "@bufbuild/protoplugin": "1.7.2"
+ },
+ "bin": {
+ "protoc-gen-es": "bin/protoc-gen-es"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "@bufbuild/protobuf": "1.7.2"
+ },
+ "peerDependenciesMeta": {
+ "@bufbuild/protobuf": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@bufbuild/protoplugin": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/@bufbuild/protoplugin/-/protoplugin-1.7.2.tgz",
+ "integrity": "sha512-N3QtO8XWD4F4alMtASWtxBw6BWXp4aLz7rPBXH4KTULdjpUHnq46g15TsrG0/8szZw6pIklTO3lFe14dl6ZYdA==",
+ "dev": true,
+ "dependencies": {
+ "@bufbuild/protobuf": "1.7.2",
+ "@typescript/vfs": "^1.4.0",
+ "typescript": "4.5.2"
+ }
+ },
+ "node_modules/@bufbuild/protoplugin/node_modules/typescript": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz",
+ "integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/@connectrpc/connect": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@connectrpc/connect/-/connect-1.3.0.tgz",
+ "integrity": "sha512-kTeWxJnLLtxKc2ZSDN0rIBgwfP8RwcLknthX4AKlIAmN9ZC4gGnCbwp+3BKcP/WH5c8zGBAWqSY3zeqCM+ah7w==",
+ "peerDependencies": {
+ "@bufbuild/protobuf": "^1.4.2"
+ }
+ },
+ "node_modules/@connectrpc/connect-web": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@connectrpc/connect-web/-/connect-web-1.3.0.tgz",
+ "integrity": "sha512-8HSY8x6douX1LcSFsGEUdjs9jwBe9X+LxkCI8hCtH7vKUCZieQqkRWstoApeIJchHYTaQYqwy2ImKnvwyWwruA==",
+ "peerDependencies": {
+ "@bufbuild/protobuf": "^1.4.2",
+ "@connectrpc/connect": "1.3.0"
+ }
+ },
+ "node_modules/@connectrpc/protoc-gen-connect-es": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@connectrpc/protoc-gen-connect-es/-/protoc-gen-connect-es-1.3.0.tgz",
+ "integrity": "sha512-UbQN48c0zafo5EFSsh3POIJP6ofYiAgKE1aFOZ2Er4W3flUYihydZdM6TQauPkn7jDj4w9jjLSTTZ9//ecUbPA==",
+ "dev": true,
+ "dependencies": {
+ "@bufbuild/protobuf": "^1.6.0",
+ "@bufbuild/protoplugin": "^1.6.0"
+ },
+ "bin": {
+ "protoc-gen-connect-es": "bin/protoc-gen-connect-es"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ },
+ "peerDependencies": {
+ "@bufbuild/protoc-gen-es": "^1.6.0",
+ "@connectrpc/connect": "1.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@bufbuild/protoc-gen-es": {
+ "optional": true
+ },
+ "@connectrpc/connect": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
+ "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz",
+ "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz",
+ "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz",
+ "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz",
+ "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz",
+ "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz",
+ "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz",
+ "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz",
+ "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz",
+ "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz",
+ "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz",
+ "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz",
+ "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz",
+ "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz",
+ "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz",
+ "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz",
+ "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz",
+ "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz",
+ "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz",
+ "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz",
+ "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz",
+ "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz",
+ "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.10.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
+ "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/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/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/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/@eslint/js": {
+ "version": "8.56.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz",
+ "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.14",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+ "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.2",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/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/@humanwhocodes/config-array/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/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
+ "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
+ "dev": true
+ },
+ "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==",
+ "dev": true,
+ "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.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.22",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz",
+ "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "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/@rollup/rollup-android-arm-eabi": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz",
+ "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz",
+ "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz",
+ "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz",
+ "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz",
+ "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz",
+ "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz",
+ "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz",
+ "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz",
+ "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz",
+ "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz",
+ "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz",
+ "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz",
+ "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz",
+ "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+ "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+ "dev": true
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.11",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz",
+ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==",
+ "dev": true
+ },
+ "node_modules/@types/react": {
+ "version": "18.2.56",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.56.tgz",
+ "integrity": "sha512-NpwHDMkS/EFZF2dONFQHgkPRwhvgq/OAvIaGQzxGSBmaeR++kTg6njr15Vatz0/2VcCEwJQFi6Jf4Q0qBu0rLA==",
+ "dev": true,
+ "dependencies": {
+ "@types/prop-types": "*",
+ "@types/scheduler": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.2.19",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz",
+ "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==",
+ "dev": true,
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/scheduler": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz",
+ "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==",
+ "dev": true
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.7",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz",
+ "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
+ "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/type-utils": "6.21.0",
+ "@typescript-eslint/utils": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.4",
+ "natural-compare": "^1.4.0",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
+ "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
+ "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz",
+ "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "@typescript-eslint/utils": "6.21.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
+ "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
+ "dev": true,
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
+ "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "9.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
+ "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
+ "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript/vfs": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@typescript/vfs/-/vfs-1.5.0.tgz",
+ "integrity": "sha512-AJS307bPgbsZZ9ggCT3wwpg3VbTKMFNHfaY/uF0ahSkYYrPF2dSSKDNIDIQAHm9qJqbLvCsSJH7yN4Vs/CsMMg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+ "dev": true
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz",
+ "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.23.5",
+ "@babel/plugin-transform-react-jsx-self": "^7.23.3",
+ "@babel/plugin-transform-react-jsx-source": "^7.23.3",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.14.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.11.3",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
+ "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "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.23.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
+ "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
+ "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"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001587",
+ "electron-to-chromium": "^1.4.668",
+ "node-releases": "^2.0.14",
+ "update-browserslist-db": "^1.0.13"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "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.30001587",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001587.tgz",
+ "integrity": "sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==",
+ "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"
+ }
+ ]
+ },
+ "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,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "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,
+ "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
+ },
+ "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": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "dev": true
+ },
+ "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/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.673",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.673.tgz",
+ "integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==",
+ "dev": true
+ },
+ "node_modules/esbuild": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz",
+ "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.19.12",
+ "@esbuild/android-arm": "0.19.12",
+ "@esbuild/android-arm64": "0.19.12",
+ "@esbuild/android-x64": "0.19.12",
+ "@esbuild/darwin-arm64": "0.19.12",
+ "@esbuild/darwin-x64": "0.19.12",
+ "@esbuild/freebsd-arm64": "0.19.12",
+ "@esbuild/freebsd-x64": "0.19.12",
+ "@esbuild/linux-arm": "0.19.12",
+ "@esbuild/linux-arm64": "0.19.12",
+ "@esbuild/linux-ia32": "0.19.12",
+ "@esbuild/linux-loong64": "0.19.12",
+ "@esbuild/linux-mips64el": "0.19.12",
+ "@esbuild/linux-ppc64": "0.19.12",
+ "@esbuild/linux-riscv64": "0.19.12",
+ "@esbuild/linux-s390x": "0.19.12",
+ "@esbuild/linux-x64": "0.19.12",
+ "@esbuild/netbsd-x64": "0.19.12",
+ "@esbuild/openbsd-x64": "0.19.12",
+ "@esbuild/sunos-x64": "0.19.12",
+ "@esbuild/win32-arm64": "0.19.12",
+ "@esbuild/win32-ia32": "0.19.12",
+ "@esbuild/win32-x64": "0.19.12"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
+ "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
+ "dev": 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,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.56.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz",
+ "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.56.0",
+ "@humanwhocodes/config-array": "^0.11.13",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz",
+ "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react-refresh": {
+ "version": "0.4.5",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz",
+ "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==",
+ "dev": true,
+ "peerDependencies": {
+ "eslint": ">=7"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/eslint/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/eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/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/eslint/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "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/fast-glob/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/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "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/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
+ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+ "dev": true
+ },
+ "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.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "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,
+ "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": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob/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/glob/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/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,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "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,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
+ "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
+ "dev": 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/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "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-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-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "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=="
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "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,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "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,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "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/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "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.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "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/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
+ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
+ "dev": true
+ },
+ "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/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz",
+ "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==",
+ "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.7",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
+ "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "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/react": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
+ "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.2.0",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
+ "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.0"
+ },
+ "peerDependencies": {
+ "react": "^18.2.0"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
+ "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.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": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.12.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz",
+ "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "1.0.5"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.12.0",
+ "@rollup/rollup-android-arm64": "4.12.0",
+ "@rollup/rollup-darwin-arm64": "4.12.0",
+ "@rollup/rollup-darwin-x64": "4.12.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.12.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.12.0",
+ "@rollup/rollup-linux-arm64-musl": "4.12.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.12.0",
+ "@rollup/rollup-linux-x64-gnu": "4.12.0",
+ "@rollup/rollup-linux-x64-musl": "4.12.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.12.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.12.0",
+ "@rollup/rollup-win32-x64-msvc": "4.12.0",
+ "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/scheduler": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
+ "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
+ "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "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==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "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,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "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,
+ "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/ts-api-utils": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz",
+ "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.3.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz",
+ "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+ "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+ "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"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.3.tgz",
+ "integrity": "sha512-UfmUD36DKkqhi/F75RrxvPpry+9+tTkrXfMNZD+SboZqBCMsxKtO52XeGzzuh7ioz+Eo/SYDBbdb0Z7vgcDJew==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.19.3",
+ "postcss": "^8.4.35",
+ "rollup": "^4.2.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "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/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "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
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/console-subscriber/examples/grpc_web/app/package.json b/console-subscriber/examples/grpc_web/app/package.json
new file mode 100644
index 000000000..2aa08e0ad
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/package.json
@@ -0,0 +1,39 @@
+{
+ "name": "app",
+ "private": true,
+ "version": "0.0.0",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "tsc && vite build",
+ "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0",
+ "lint:fix": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0 --fix",
+ "fmt": "prettier --check .",
+ "fmt:fix": "prettier --write .",
+ "gen": "buf generate ../../../../console-api/proto",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "@bufbuild/protobuf": "^1.7.2",
+ "@connectrpc/connect": "^1.3.0",
+ "@connectrpc/connect-web": "^1.3.0",
+ "react": "^18.2.0",
+ "react-dom": "^18.2.0"
+ },
+ "devDependencies": {
+ "@bufbuild/buf": "^1.29.0",
+ "@bufbuild/protoc-gen-es": "^1.7.2",
+ "@connectrpc/protoc-gen-connect-es": "^1.3.0",
+ "@types/react": "^18.2.55",
+ "@types/react-dom": "^18.2.19",
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
+ "@typescript-eslint/parser": "^6.21.0",
+ "@vitejs/plugin-react": "^4.2.1",
+ "eslint": "^8.56.0",
+ "eslint-plugin-react-hooks": "^4.6.0",
+ "eslint-plugin-react-refresh": "^0.4.5",
+ "prettier": "^3.2.5",
+ "typescript": "^5.2.2",
+ "vite": "^5.1.0"
+ }
+}
diff --git a/console-subscriber/examples/grpc_web/app/src/App.css b/console-subscriber/examples/grpc_web/app/src/App.css
new file mode 100644
index 000000000..902778b76
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/src/App.css
@@ -0,0 +1,6 @@
+#root {
+ max-width: 1280px;
+ margin: 0 auto;
+ padding: 2rem;
+ text-align: center;
+}
diff --git a/console-subscriber/examples/grpc_web/app/src/App.tsx b/console-subscriber/examples/grpc_web/app/src/App.tsx
new file mode 100644
index 000000000..28b670f94
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/src/App.tsx
@@ -0,0 +1,34 @@
+import "./App.css";
+import { createGrpcWebTransport } from "@connectrpc/connect-web";
+import { createPromiseClient } from "@connectrpc/connect";
+import { Instrument } from "./gen/instrument_connect";
+import { InstrumentRequest } from "./gen/instrument_pb";
+
+function App() {
+ const transport = createGrpcWebTransport({
+ baseUrl: "http://localhost:9999",
+ });
+
+ const client = createPromiseClient(Instrument, transport);
+
+ (async () => {
+ try {
+ const updateStream = client.watchUpdates(new InstrumentRequest());
+
+ for await (const value of updateStream) {
+ console.log(value);
+ }
+ } catch (err) {
+ console.error(err);
+ }
+ })();
+
+ return (
+ <>
+ gRPC-Web Example
+ Open the console to see the updates
+ >
+ );
+}
+
+export default App;
diff --git a/console-subscriber/examples/grpc_web/app/src/gen/async_ops_pb.ts b/console-subscriber/examples/grpc_web/app/src/gen/async_ops_pb.ts
new file mode 100644
index 000000000..3e91a3f5b
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/src/gen/async_ops_pb.ts
@@ -0,0 +1,246 @@
+// @generated by protoc-gen-es v1.7.2 with parameter "target=ts"
+// @generated from file async_ops.proto (package rs.tokio.console.async_ops, syntax proto3)
+/* eslint-disable */
+// @ts-nocheck
+
+import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
+import { Message, proto3, protoInt64, Timestamp } from "@bufbuild/protobuf";
+import { Attribute, Id, MetaId, PollStats } from "./common_pb.js";
+
+/**
+ * An `AsyncOp` state update.
+ *
+ * This includes a list of any new async ops, and updates to the associated statistics
+ * for any async ops that have changed since the last update.
+ *
+ * @generated from message rs.tokio.console.async_ops.AsyncOpUpdate
+ */
+export class AsyncOpUpdate extends Message {
+ /**
+ * A list of new async operations that were created since the last `AsyncOpUpdate`
+ * was sent. Note that the fact that an async operation has been created
+ * does not mean that is has been polled or is being polled. This information
+ * is reflected in the `Stats` of the operation.
+ *
+ * @generated from field: repeated rs.tokio.console.async_ops.AsyncOp new_async_ops = 1;
+ */
+ newAsyncOps: AsyncOp[] = [];
+
+ /**
+ * Any async op stats that have changed since the last update.
+ *
+ * @generated from field: map stats_update = 2;
+ */
+ statsUpdate: { [key: string]: Stats } = {};
+
+ /**
+ * A count of how many async op events (e.g. polls, creation, etc) were not
+ * recorded because the application's event buffer was at capacity.
+ *
+ * If everything is working normally, this should be 0. If it is greater
+ * than 0, that may indicate that some data is missing from this update, and
+ * it may be necessary to increase the number of events buffered by the
+ * application to ensure that data loss is avoided.
+ *
+ * If the application's instrumentation ensures reliable delivery of events,
+ * this will always be 0.
+ *
+ * @generated from field: uint64 dropped_events = 3;
+ */
+ droppedEvents = protoInt64.zero;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.async_ops.AsyncOpUpdate";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "new_async_ops", kind: "message", T: AsyncOp, repeated: true },
+ { no: 2, name: "stats_update", kind: "map", K: 4 /* ScalarType.UINT64 */, V: {kind: "message", T: Stats} },
+ { no: 3, name: "dropped_events", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): AsyncOpUpdate {
+ return new AsyncOpUpdate().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): AsyncOpUpdate {
+ return new AsyncOpUpdate().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): AsyncOpUpdate {
+ return new AsyncOpUpdate().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: AsyncOpUpdate | PlainMessage | undefined, b: AsyncOpUpdate | PlainMessage | undefined): boolean {
+ return proto3.util.equals(AsyncOpUpdate, a, b);
+ }
+}
+
+/**
+ * An async operation.
+ *
+ * An async operation is an operation that is associated with a resource
+ * This could, for example, be a read or write on a TCP stream, or a receive operation on
+ * a channel.
+ *
+ * @generated from message rs.tokio.console.async_ops.AsyncOp
+ */
+export class AsyncOp extends Message {
+ /**
+ * The async op's ID.
+ *
+ * This uniquely identifies this op across all *currently live*
+ * ones.
+ *
+ * @generated from field: rs.tokio.console.common.Id id = 1;
+ */
+ id?: Id;
+
+ /**
+ * The numeric ID of the op's `Metadata`.
+ *
+ * This identifies the `Metadata` that describes the `tracing` span
+ * corresponding to this async op. The metadata for this ID will have been sent
+ * in a prior `RegisterMetadata` message.
+ *
+ * @generated from field: rs.tokio.console.common.MetaId metadata = 2;
+ */
+ metadata?: MetaId;
+
+ /**
+ * The source of this async operation. Most commonly this should be the name
+ * of the method where the instantiation of this op has happened.
+ *
+ * @generated from field: string source = 3;
+ */
+ source = "";
+
+ /**
+ * The ID of the parent async op.
+ *
+ * This field is only set if this async op was created while inside of another
+ * async op. For example, `tokio::sync`'s `Mutex::lock` internally calls
+ * `Semaphore::acquire`.
+ *
+ * This field can be empty; if it is empty, this async op is not a child of another
+ * async op.
+ *
+ * @generated from field: rs.tokio.console.common.Id parent_async_op_id = 4;
+ */
+ parentAsyncOpId?: Id;
+
+ /**
+ * The resources's ID.
+ *
+ * @generated from field: rs.tokio.console.common.Id resource_id = 5;
+ */
+ resourceId?: Id;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.async_ops.AsyncOp";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "id", kind: "message", T: Id },
+ { no: 2, name: "metadata", kind: "message", T: MetaId },
+ { no: 3, name: "source", kind: "scalar", T: 9 /* ScalarType.STRING */ },
+ { no: 4, name: "parent_async_op_id", kind: "message", T: Id },
+ { no: 5, name: "resource_id", kind: "message", T: Id },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): AsyncOp {
+ return new AsyncOp().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): AsyncOp {
+ return new AsyncOp().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): AsyncOp {
+ return new AsyncOp().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: AsyncOp | PlainMessage | undefined, b: AsyncOp | PlainMessage | undefined): boolean {
+ return proto3.util.equals(AsyncOp, a, b);
+ }
+}
+
+/**
+ * Statistics associated with a given async operation.
+ *
+ * @generated from message rs.tokio.console.async_ops.Stats
+ */
+export class Stats extends Message {
+ /**
+ * Timestamp of when the async op has been created.
+ *
+ * @generated from field: google.protobuf.Timestamp created_at = 1;
+ */
+ createdAt?: Timestamp;
+
+ /**
+ * Timestamp of when the async op was dropped.
+ *
+ * @generated from field: google.protobuf.Timestamp dropped_at = 2;
+ */
+ droppedAt?: Timestamp;
+
+ /**
+ * The Id of the task that is awaiting on this op.
+ *
+ * @generated from field: rs.tokio.console.common.Id task_id = 4;
+ */
+ taskId?: Id;
+
+ /**
+ * Contains the operation poll stats.
+ *
+ * @generated from field: rs.tokio.console.common.PollStats poll_stats = 5;
+ */
+ pollStats?: PollStats;
+
+ /**
+ * State attributes of the async op.
+ *
+ * @generated from field: repeated rs.tokio.console.common.Attribute attributes = 6;
+ */
+ attributes: Attribute[] = [];
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.async_ops.Stats";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "created_at", kind: "message", T: Timestamp },
+ { no: 2, name: "dropped_at", kind: "message", T: Timestamp },
+ { no: 4, name: "task_id", kind: "message", T: Id },
+ { no: 5, name: "poll_stats", kind: "message", T: PollStats },
+ { no: 6, name: "attributes", kind: "message", T: Attribute, repeated: true },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Stats {
+ return new Stats().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Stats {
+ return new Stats().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Stats {
+ return new Stats().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Stats | PlainMessage | undefined, b: Stats | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Stats, a, b);
+ }
+}
+
diff --git a/console-subscriber/examples/grpc_web/app/src/gen/common_pb.ts b/console-subscriber/examples/grpc_web/app/src/gen/common_pb.ts
new file mode 100644
index 000000000..41ed77bb7
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/src/gen/common_pb.ts
@@ -0,0 +1,809 @@
+// @generated by protoc-gen-es v1.7.2 with parameter "target=ts"
+// @generated from file common.proto (package rs.tokio.console.common, syntax proto3)
+/* eslint-disable */
+// @ts-nocheck
+
+import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
+import { Duration, Message, proto3, protoInt64, Timestamp } from "@bufbuild/protobuf";
+
+/**
+ * Unique identifier for each task.
+ *
+ * @generated from message rs.tokio.console.common.Id
+ */
+export class Id extends Message {
+ /**
+ * The unique identifier's concrete value.
+ *
+ * @generated from field: uint64 id = 1;
+ */
+ id = protoInt64.zero;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.common.Id";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "id", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Id {
+ return new Id().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Id {
+ return new Id().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Id {
+ return new Id().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Id | PlainMessage | undefined, b: Id | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Id, a, b);
+ }
+}
+
+/**
+ * A Rust source code location.
+ *
+ * @generated from message rs.tokio.console.common.Location
+ */
+export class Location extends Message {
+ /**
+ * The file path
+ *
+ * @generated from field: optional string file = 1;
+ */
+ file?: string;
+
+ /**
+ * The Rust module path
+ *
+ * @generated from field: optional string module_path = 2;
+ */
+ modulePath?: string;
+
+ /**
+ * The line number in the source code file.
+ *
+ * @generated from field: optional uint32 line = 3;
+ */
+ line?: number;
+
+ /**
+ * The character in `line`.
+ *
+ * @generated from field: optional uint32 column = 4;
+ */
+ column?: number;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.common.Location";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "file", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true },
+ { no: 2, name: "module_path", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true },
+ { no: 3, name: "line", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true },
+ { no: 4, name: "column", kind: "scalar", T: 13 /* ScalarType.UINT32 */, opt: true },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Location {
+ return new Location().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Location {
+ return new Location().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Location {
+ return new Location().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Location | PlainMessage | undefined, b: Location | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Location, a, b);
+ }
+}
+
+/**
+ * Unique identifier for metadata.
+ *
+ * @generated from message rs.tokio.console.common.MetaId
+ */
+export class MetaId extends Message {
+ /**
+ * The unique identifier's concrete value.
+ *
+ * @generated from field: uint64 id = 1;
+ */
+ id = protoInt64.zero;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.common.MetaId";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "id", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): MetaId {
+ return new MetaId().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): MetaId {
+ return new MetaId().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): MetaId {
+ return new MetaId().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: MetaId | PlainMessage | undefined, b: MetaId | PlainMessage | undefined): boolean {
+ return proto3.util.equals(MetaId, a, b);
+ }
+}
+
+/**
+ * Unique identifier for spans.
+ *
+ * @generated from message rs.tokio.console.common.SpanId
+ */
+export class SpanId extends Message {
+ /**
+ * The unique identifier's concrete value.
+ *
+ * @generated from field: uint64 id = 1;
+ */
+ id = protoInt64.zero;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.common.SpanId";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "id", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): SpanId {
+ return new SpanId().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): SpanId {
+ return new SpanId().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): SpanId {
+ return new SpanId().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: SpanId | PlainMessage | undefined, b: SpanId | PlainMessage | undefined): boolean {
+ return proto3.util.equals(SpanId, a, b);
+ }
+}
+
+/**
+ * A message representing a key-value pair of data associated with a `Span`
+ *
+ * @generated from message rs.tokio.console.common.Field
+ */
+export class Field extends Message {
+ /**
+ * The key of the key-value pair.
+ *
+ * This is either represented as a string, or as an index into a `Metadata`'s
+ * array of field name strings.
+ *
+ * @generated from oneof rs.tokio.console.common.Field.name
+ */
+ name: {
+ /**
+ * The string representation of the name.
+ *
+ * @generated from field: string str_name = 1;
+ */
+ value: string;
+ case: "strName";
+ } | {
+ /**
+ * An index position into the `Metadata.field_names` of the metadata
+ * for the task span that the field came from.
+ *
+ * @generated from field: uint64 name_idx = 2;
+ */
+ value: bigint;
+ case: "nameIdx";
+ } | { case: undefined; value?: undefined } = { case: undefined };
+
+ /**
+ * The value of the key-value pair.
+ *
+ * @generated from oneof rs.tokio.console.common.Field.value
+ */
+ value: {
+ /**
+ * A value serialized to a string using `fmt::Debug`.
+ *
+ * @generated from field: string debug_val = 3;
+ */
+ value: string;
+ case: "debugVal";
+ } | {
+ /**
+ * A string value.
+ *
+ * @generated from field: string str_val = 4;
+ */
+ value: string;
+ case: "strVal";
+ } | {
+ /**
+ * An unsigned integer value.
+ *
+ * @generated from field: uint64 u64_val = 5;
+ */
+ value: bigint;
+ case: "u64Val";
+ } | {
+ /**
+ * A signed integer value.
+ *
+ * @generated from field: sint64 i64_val = 6;
+ */
+ value: bigint;
+ case: "i64Val";
+ } | {
+ /**
+ * A boolean value.
+ *
+ * @generated from field: bool bool_val = 7;
+ */
+ value: boolean;
+ case: "boolVal";
+ } | { case: undefined; value?: undefined } = { case: undefined };
+
+ /**
+ * Metadata for the task span that the field came from.
+ *
+ * @generated from field: rs.tokio.console.common.MetaId metadata_id = 8;
+ */
+ metadataId?: MetaId;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.common.Field";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "str_name", kind: "scalar", T: 9 /* ScalarType.STRING */, oneof: "name" },
+ { no: 2, name: "name_idx", kind: "scalar", T: 4 /* ScalarType.UINT64 */, oneof: "name" },
+ { no: 3, name: "debug_val", kind: "scalar", T: 9 /* ScalarType.STRING */, oneof: "value" },
+ { no: 4, name: "str_val", kind: "scalar", T: 9 /* ScalarType.STRING */, oneof: "value" },
+ { no: 5, name: "u64_val", kind: "scalar", T: 4 /* ScalarType.UINT64 */, oneof: "value" },
+ { no: 6, name: "i64_val", kind: "scalar", T: 18 /* ScalarType.SINT64 */, oneof: "value" },
+ { no: 7, name: "bool_val", kind: "scalar", T: 8 /* ScalarType.BOOL */, oneof: "value" },
+ { no: 8, name: "metadata_id", kind: "message", T: MetaId },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Field {
+ return new Field().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Field {
+ return new Field().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Field {
+ return new Field().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Field | PlainMessage | undefined, b: Field | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Field, a, b);
+ }
+}
+
+/**
+ * Represents a period of time in which a program was executing in a particular context.
+ *
+ * Corresponds to `Span` in the `tracing` crate.
+ *
+ * @generated from message rs.tokio.console.common.Span
+ */
+export class Span extends Message {
+ /**
+ * An Id that uniquely identifies it in relation to other spans.
+ *
+ * @generated from field: rs.tokio.console.common.SpanId id = 1;
+ */
+ id?: SpanId;
+
+ /**
+ * Identifier for metadata describing static characteristics of all spans originating
+ * from that callsite, such as its name, source code location, verbosity level, and
+ * the names of its fields.
+ *
+ * @generated from field: rs.tokio.console.common.MetaId metadata_id = 2;
+ */
+ metadataId?: MetaId;
+
+ /**
+ * User-defined key-value pairs of arbitrary data that describe the context the span represents,
+ *
+ * @generated from field: repeated rs.tokio.console.common.Field fields = 3;
+ */
+ fields: Field[] = [];
+
+ /**
+ * Timestamp for the span.
+ *
+ * @generated from field: google.protobuf.Timestamp at = 4;
+ */
+ at?: Timestamp;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.common.Span";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "id", kind: "message", T: SpanId },
+ { no: 2, name: "metadata_id", kind: "message", T: MetaId },
+ { no: 3, name: "fields", kind: "message", T: Field, repeated: true },
+ { no: 4, name: "at", kind: "message", T: Timestamp },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Span {
+ return new Span().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Span {
+ return new Span().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Span {
+ return new Span().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Span | PlainMessage | undefined, b: Span | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Span, a, b);
+ }
+}
+
+/**
+ * Any new metadata that was registered since the last update.
+ *
+ * @generated from message rs.tokio.console.common.RegisterMetadata
+ */
+export class RegisterMetadata extends Message {
+ /**
+ * The new metadata that was registered since the last update.
+ *
+ * @generated from field: repeated rs.tokio.console.common.RegisterMetadata.NewMetadata metadata = 1;
+ */
+ metadata: RegisterMetadata_NewMetadata[] = [];
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.common.RegisterMetadata";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "metadata", kind: "message", T: RegisterMetadata_NewMetadata, repeated: true },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): RegisterMetadata {
+ return new RegisterMetadata().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): RegisterMetadata {
+ return new RegisterMetadata().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): RegisterMetadata {
+ return new RegisterMetadata().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: RegisterMetadata | PlainMessage | undefined, b: RegisterMetadata | PlainMessage | undefined): boolean {
+ return proto3.util.equals(RegisterMetadata, a, b);
+ }
+}
+
+/**
+ * One metadata element registered since the last update.
+ *
+ * @generated from message rs.tokio.console.common.RegisterMetadata.NewMetadata
+ */
+export class RegisterMetadata_NewMetadata extends Message {
+ /**
+ * Unique identifier for `metadata`.
+ *
+ * @generated from field: rs.tokio.console.common.MetaId id = 1;
+ */
+ id?: MetaId;
+
+ /**
+ * The metadata payload.
+ *
+ * @generated from field: rs.tokio.console.common.Metadata metadata = 2;
+ */
+ metadata?: Metadata;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.common.RegisterMetadata.NewMetadata";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "id", kind: "message", T: MetaId },
+ { no: 2, name: "metadata", kind: "message", T: Metadata },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): RegisterMetadata_NewMetadata {
+ return new RegisterMetadata_NewMetadata().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): RegisterMetadata_NewMetadata {
+ return new RegisterMetadata_NewMetadata().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): RegisterMetadata_NewMetadata {
+ return new RegisterMetadata_NewMetadata().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: RegisterMetadata_NewMetadata | PlainMessage | undefined, b: RegisterMetadata_NewMetadata | PlainMessage | undefined): boolean {
+ return proto3.util.equals(RegisterMetadata_NewMetadata, a, b);
+ }
+}
+
+/**
+ * Metadata associated with a span or event.
+ *
+ * @generated from message rs.tokio.console.common.Metadata
+ */
+export class Metadata extends Message {
+ /**
+ * The name of the span or event.
+ *
+ * @generated from field: string name = 1;
+ */
+ name = "";
+
+ /**
+ * Describes the part of the system where the span or event that this
+ * metadata describes occurred.
+ *
+ * @generated from field: string target = 2;
+ */
+ target = "";
+
+ /**
+ * The path to the Rust module where the span occurred.
+ *
+ * @generated from field: string module_path = 3;
+ */
+ modulePath = "";
+
+ /**
+ * The Rust source location associated with the span or event.
+ *
+ * @generated from field: rs.tokio.console.common.Location location = 4;
+ */
+ location?: Location;
+
+ /**
+ * Indicates whether metadata is associated with a span or with an event.
+ *
+ * @generated from field: rs.tokio.console.common.Metadata.Kind kind = 5;
+ */
+ kind = Metadata_Kind.SPAN;
+
+ /**
+ * Describes the level of verbosity of a span or event.
+ *
+ * @generated from field: rs.tokio.console.common.Metadata.Level level = 6;
+ */
+ level = Metadata_Level.ERROR;
+
+ /**
+ * The names of the key-value fields attached to the
+ * span or event this metadata is associated with.
+ *
+ * @generated from field: repeated string field_names = 7;
+ */
+ fieldNames: string[] = [];
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.common.Metadata";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ },
+ { no: 2, name: "target", kind: "scalar", T: 9 /* ScalarType.STRING */ },
+ { no: 3, name: "module_path", kind: "scalar", T: 9 /* ScalarType.STRING */ },
+ { no: 4, name: "location", kind: "message", T: Location },
+ { no: 5, name: "kind", kind: "enum", T: proto3.getEnumType(Metadata_Kind) },
+ { no: 6, name: "level", kind: "enum", T: proto3.getEnumType(Metadata_Level) },
+ { no: 7, name: "field_names", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Metadata {
+ return new Metadata().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Metadata {
+ return new Metadata().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Metadata {
+ return new Metadata().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Metadata | PlainMessage | undefined, b: Metadata | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Metadata, a, b);
+ }
+}
+
+/**
+ * Indicates whether metadata is associated with a span or with an event.
+ *
+ * @generated from enum rs.tokio.console.common.Metadata.Kind
+ */
+export enum Metadata_Kind {
+ /**
+ * Indicates metadata is associated with a span.
+ *
+ * @generated from enum value: SPAN = 0;
+ */
+ SPAN = 0,
+
+ /**
+ * Indicates metadata is associated with an event.
+ *
+ * @generated from enum value: EVENT = 1;
+ */
+ EVENT = 1,
+}
+// Retrieve enum metadata with: proto3.getEnumType(Metadata_Kind)
+proto3.util.setEnumType(Metadata_Kind, "rs.tokio.console.common.Metadata.Kind", [
+ { no: 0, name: "SPAN" },
+ { no: 1, name: "EVENT" },
+]);
+
+/**
+ * Describes the level of verbosity of a span or event.
+ *
+ * Corresponds to `Level` in the `tracing` crate.
+ *
+ * @generated from enum rs.tokio.console.common.Metadata.Level
+ */
+export enum Metadata_Level {
+ /**
+ * The "error" level.
+ *
+ * Designates very serious errors.
+ *
+ * @generated from enum value: ERROR = 0;
+ */
+ ERROR = 0,
+
+ /**
+ * The "warn" level.
+ *
+ * Designates hazardous situations.
+ *
+ * @generated from enum value: WARN = 1;
+ */
+ WARN = 1,
+
+ /**
+ * The "info" level.
+ * Designates useful information.
+ *
+ * @generated from enum value: INFO = 2;
+ */
+ INFO = 2,
+
+ /**
+ * The "debug" level.
+ *
+ * Designates lower priority information.
+ *
+ * @generated from enum value: DEBUG = 3;
+ */
+ DEBUG = 3,
+
+ /**
+ * The "trace" level.
+ *
+ * Designates very low priority, often extremely verbose, information.
+ *
+ * @generated from enum value: TRACE = 4;
+ */
+ TRACE = 4,
+}
+// Retrieve enum metadata with: proto3.getEnumType(Metadata_Level)
+proto3.util.setEnumType(Metadata_Level, "rs.tokio.console.common.Metadata.Level", [
+ { no: 0, name: "ERROR" },
+ { no: 1, name: "WARN" },
+ { no: 2, name: "INFO" },
+ { no: 3, name: "DEBUG" },
+ { no: 4, name: "TRACE" },
+]);
+
+/**
+ * Contains stats about objects that can be polled. Currently these can be:
+ * - tasks that have been spawned
+ * - async operations on resources that are performed within the context of a task
+ *
+ * @generated from message rs.tokio.console.common.PollStats
+ */
+export class PollStats extends Message {
+ /**
+ * The total number of times this object has been polled.
+ *
+ * @generated from field: uint64 polls = 1;
+ */
+ polls = protoInt64.zero;
+
+ /**
+ * The timestamp of the first time this object was polled.
+ *
+ * If this is `None`, the object has not yet been polled.
+ *
+ * Subtracting this timestamp from `created_at` can be used to calculate the
+ * time to first poll for this object, a measurement of executor latency.
+ *
+ * @generated from field: optional google.protobuf.Timestamp first_poll = 3;
+ */
+ firstPoll?: Timestamp;
+
+ /**
+ * The timestamp of the most recent time this objects's poll method was invoked.
+ *
+ * If this is `None`, the object has not yet been polled.
+ *
+ * If the object has only been polled a single time, then this value may be
+ * equal to the `first_poll` timestamp.
+ *
+ *
+ * @generated from field: optional google.protobuf.Timestamp last_poll_started = 4;
+ */
+ lastPollStarted?: Timestamp;
+
+ /**
+ * The timestamp of the most recent time this objects's poll method finished execution.
+ *
+ * If this is `None`, the object has not yet been polled or is currently being polled.
+ *
+ * If the object does not exist anymore, then this is the time the final invocation of
+ * its poll method has completed.
+ *
+ * @generated from field: optional google.protobuf.Timestamp last_poll_ended = 5;
+ */
+ lastPollEnded?: Timestamp;
+
+ /**
+ * The total duration this object was being *actively polled*, summed across
+ * all polls.
+ *
+ * Note that this includes only polls that have completed, and does not
+ * reflect any in-progress polls. Subtracting `busy_time` from the
+ * total lifetime of the polled object results in the amount of time it
+ * has spent *waiting* to be polled (including the `scheduled_time` value
+ * from `TaskStats`, if this is a task).
+ *
+ * @generated from field: google.protobuf.Duration busy_time = 6;
+ */
+ busyTime?: Duration;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.common.PollStats";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "polls", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
+ { no: 3, name: "first_poll", kind: "message", T: Timestamp, opt: true },
+ { no: 4, name: "last_poll_started", kind: "message", T: Timestamp, opt: true },
+ { no: 5, name: "last_poll_ended", kind: "message", T: Timestamp, opt: true },
+ { no: 6, name: "busy_time", kind: "message", T: Duration },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): PollStats {
+ return new PollStats().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): PollStats {
+ return new PollStats().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): PollStats {
+ return new PollStats().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: PollStats | PlainMessage | undefined, b: PollStats | PlainMessage | undefined): boolean {
+ return proto3.util.equals(PollStats, a, b);
+ }
+}
+
+/**
+ * State attributes of an entity. These are dependent on the type of the entity.
+ *
+ * For example, a timer resource will have a duration, while a semaphore resource may
+ * have a permit count. Likewise, the async ops of a semaphore may have attributes
+ * indicating how many permits they are trying to acquire vs how many are acquired.
+ * These values may change over time. Therefore, they live in the runtime stats rather
+ * than the static data describing the entity.
+ *
+ * @generated from message rs.tokio.console.common.Attribute
+ */
+export class Attribute extends Message {
+ /**
+ * The key-value pair for the attribute
+ *
+ * @generated from field: rs.tokio.console.common.Field field = 1;
+ */
+ field?: Field;
+
+ /**
+ * Some values carry a unit of measurement. For example, a duration
+ * carries an associated unit of time, such as "ms" for milliseconds.
+ *
+ * @generated from field: optional string unit = 2;
+ */
+ unit?: string;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.common.Attribute";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "field", kind: "message", T: Field },
+ { no: 2, name: "unit", kind: "scalar", T: 9 /* ScalarType.STRING */, opt: true },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Attribute {
+ return new Attribute().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Attribute {
+ return new Attribute().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Attribute {
+ return new Attribute().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Attribute | PlainMessage | undefined, b: Attribute | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Attribute, a, b);
+ }
+}
+
diff --git a/console-subscriber/examples/grpc_web/app/src/gen/google/protobuf/duration_pb.ts b/console-subscriber/examples/grpc_web/app/src/gen/google/protobuf/duration_pb.ts
new file mode 100644
index 000000000..a2e52534a
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/src/gen/google/protobuf/duration_pb.ts
@@ -0,0 +1,197 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * 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.
+// * Neither the name of Google Inc. 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
+// OWNER 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.
+
+// @generated by protoc-gen-es v1.7.2 with parameter "target=ts"
+// @generated from file google/protobuf/duration.proto (package google.protobuf, syntax proto3)
+/* eslint-disable */
+// @ts-nocheck
+
+import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, JsonWriteOptions, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
+import { Message, proto3, protoInt64 } from "@bufbuild/protobuf";
+
+/**
+ * A Duration represents a signed, fixed-length span of time represented
+ * as a count of seconds and fractions of seconds at nanosecond
+ * resolution. It is independent of any calendar and concepts like "day"
+ * or "month". It is related to Timestamp in that the difference between
+ * two Timestamp values is a Duration and it can be added or subtracted
+ * from a Timestamp. Range is approximately +-10,000 years.
+ *
+ * # Examples
+ *
+ * Example 1: Compute Duration from two Timestamps in pseudo code.
+ *
+ * Timestamp start = ...;
+ * Timestamp end = ...;
+ * Duration duration = ...;
+ *
+ * duration.seconds = end.seconds - start.seconds;
+ * duration.nanos = end.nanos - start.nanos;
+ *
+ * if (duration.seconds < 0 && duration.nanos > 0) {
+ * duration.seconds += 1;
+ * duration.nanos -= 1000000000;
+ * } else if (durations.seconds > 0 && duration.nanos < 0) {
+ * duration.seconds -= 1;
+ * duration.nanos += 1000000000;
+ * }
+ *
+ * Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
+ *
+ * Timestamp start = ...;
+ * Duration duration = ...;
+ * Timestamp end = ...;
+ *
+ * end.seconds = start.seconds + duration.seconds;
+ * end.nanos = start.nanos + duration.nanos;
+ *
+ * if (end.nanos < 0) {
+ * end.seconds -= 1;
+ * end.nanos += 1000000000;
+ * } else if (end.nanos >= 1000000000) {
+ * end.seconds += 1;
+ * end.nanos -= 1000000000;
+ * }
+ *
+ * Example 3: Compute Duration from datetime.timedelta in Python.
+ *
+ * td = datetime.timedelta(days=3, minutes=10)
+ * duration = Duration()
+ * duration.FromTimedelta(td)
+ *
+ * # JSON Mapping
+ *
+ * In JSON format, the Duration type is encoded as a string rather than an
+ * object, where the string ends in the suffix "s" (indicating seconds) and
+ * is preceded by the number of seconds, with nanoseconds expressed as
+ * fractional seconds. For example, 3 seconds with 0 nanoseconds should be
+ * encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
+ * be expressed in JSON format as "3.000000001s", and 3 seconds and 1
+ * microsecond should be expressed in JSON format as "3.000001s".
+ *
+ *
+ *
+ * @generated from message google.protobuf.Duration
+ */
+export class Duration extends Message {
+ /**
+ * Signed seconds of the span of time. Must be from -315,576,000,000
+ * to +315,576,000,000 inclusive. Note: these bounds are computed from:
+ * 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+ *
+ * @generated from field: int64 seconds = 1;
+ */
+ seconds = protoInt64.zero;
+
+ /**
+ * Signed fractions of a second at nanosecond resolution of the span
+ * of time. Durations less than one second are represented with a 0
+ * `seconds` field and a positive or negative `nanos` field. For durations
+ * of one second or more, a non-zero value for the `nanos` field must be
+ * of the same sign as the `seconds` field. Must be from -999,999,999
+ * to +999,999,999 inclusive.
+ *
+ * @generated from field: int32 nanos = 2;
+ */
+ nanos = 0;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ override fromJson(json: JsonValue, options?: Partial): this {
+ if (typeof json !== "string") {
+ throw new Error(`cannot decode google.protobuf.Duration from JSON: ${proto3.json.debug(json)}`);
+ }
+ const match = json.match(/^(-?[0-9]+)(?:\.([0-9]+))?s/);
+ if (match === null) {
+ throw new Error(`cannot decode google.protobuf.Duration from JSON: ${proto3.json.debug(json)}`);
+ }
+ const longSeconds = Number(match[1]);
+ if (longSeconds > 315576000000 || longSeconds < -315576000000) {
+ throw new Error(`cannot decode google.protobuf.Duration from JSON: ${proto3.json.debug(json)}`);
+ }
+ this.seconds = protoInt64.parse(longSeconds);
+ if (typeof match[2] == "string") {
+ const nanosStr = match[2] + "0".repeat(9 - match[2].length);
+ this.nanos = parseInt(nanosStr);
+ if (longSeconds < 0 || Object.is(longSeconds, -0)) {
+ this.nanos = -this.nanos;
+ }
+ }
+ return this;
+ }
+
+ override toJson(options?: Partial): JsonValue {
+ if (Number(this.seconds) > 315576000000 || Number(this.seconds) < -315576000000) {
+ throw new Error(`cannot encode google.protobuf.Duration to JSON: value out of range`);
+ }
+ let text = this.seconds.toString();
+ if (this.nanos !== 0) {
+ let nanosStr = Math.abs(this.nanos).toString();
+ nanosStr = "0".repeat(9 - nanosStr.length) + nanosStr;
+ if (nanosStr.substring(3) === "000000") {
+ nanosStr = nanosStr.substring(0, 3);
+ } else if (nanosStr.substring(6) === "000") {
+ nanosStr = nanosStr.substring(0, 6);
+ }
+ text += "." + nanosStr;
+ if (this.nanos < 0 && Number(this.seconds) == 0) {
+ text = "-" + text;
+ }
+ }
+ return text + "s";
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "google.protobuf.Duration";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "seconds", kind: "scalar", T: 3 /* ScalarType.INT64 */ },
+ { no: 2, name: "nanos", kind: "scalar", T: 5 /* ScalarType.INT32 */ },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Duration {
+ return new Duration().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Duration {
+ return new Duration().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Duration {
+ return new Duration().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Duration | PlainMessage | undefined, b: Duration | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Duration, a, b);
+ }
+}
+
diff --git a/console-subscriber/examples/grpc_web/app/src/gen/google/protobuf/timestamp_pb.ts b/console-subscriber/examples/grpc_web/app/src/gen/google/protobuf/timestamp_pb.ts
new file mode 100644
index 000000000..fecdb6394
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/src/gen/google/protobuf/timestamp_pb.ts
@@ -0,0 +1,230 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * 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.
+// * Neither the name of Google Inc. 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
+// OWNER 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.
+
+// @generated by protoc-gen-es v1.7.2 with parameter "target=ts"
+// @generated from file google/protobuf/timestamp.proto (package google.protobuf, syntax proto3)
+/* eslint-disable */
+// @ts-nocheck
+
+import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, JsonWriteOptions, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
+import { Message, proto3, protoInt64 } from "@bufbuild/protobuf";
+
+/**
+ * A Timestamp represents a point in time independent of any time zone
+ * or calendar, represented as seconds and fractions of seconds at
+ * nanosecond resolution in UTC Epoch time. It is encoded using the
+ * Proleptic Gregorian Calendar which extends the Gregorian calendar
+ * backwards to year one. It is encoded assuming all minutes are 60
+ * seconds long, i.e. leap seconds are "smeared" so that no leap second
+ * table is needed for interpretation. Range is from
+ * 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z.
+ * By restricting to that range, we ensure that we can convert to
+ * and from RFC 3339 date strings.
+ * See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt).
+ *
+ * # Examples
+ *
+ * Example 1: Compute Timestamp from POSIX `time()`.
+ *
+ * Timestamp timestamp;
+ * timestamp.set_seconds(time(NULL));
+ * timestamp.set_nanos(0);
+ *
+ * Example 2: Compute Timestamp from POSIX `gettimeofday()`.
+ *
+ * struct timeval tv;
+ * gettimeofday(&tv, NULL);
+ *
+ * Timestamp timestamp;
+ * timestamp.set_seconds(tv.tv_sec);
+ * timestamp.set_nanos(tv.tv_usec * 1000);
+ *
+ * Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.
+ *
+ * FILETIME ft;
+ * GetSystemTimeAsFileTime(&ft);
+ * UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;
+ *
+ * // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z
+ * // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.
+ * Timestamp timestamp;
+ * timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));
+ * timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));
+ *
+ * Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.
+ *
+ * long millis = System.currentTimeMillis();
+ *
+ * Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)
+ * .setNanos((int) ((millis % 1000) * 1000000)).build();
+ *
+ *
+ * Example 5: Compute Timestamp from current time in Python.
+ *
+ * timestamp = Timestamp()
+ * timestamp.GetCurrentTime()
+ *
+ * # JSON Mapping
+ *
+ * In JSON format, the Timestamp type is encoded as a string in the
+ * [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the
+ * format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z"
+ * where {year} is always expressed using four digits while {month}, {day},
+ * {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional
+ * seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),
+ * are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone
+ * is required, though only UTC (as indicated by "Z") is presently supported.
+ *
+ * For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past
+ * 01:30 UTC on January 15, 2017.
+ *
+ * In JavaScript, one can convert a Date object to this format using the
+ * standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString]
+ * method. In Python, a standard `datetime.datetime` object can be converted
+ * to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime)
+ * with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one
+ * can use the Joda Time's [`ISODateTimeFormat.dateTime()`](
+ * http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--)
+ * to obtain a formatter capable of generating timestamps in this format.
+ *
+ *
+ *
+ * @generated from message google.protobuf.Timestamp
+ */
+export class Timestamp extends Message {
+ /**
+ * Represents seconds of UTC time since Unix epoch
+ * 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to
+ * 9999-12-31T23:59:59Z inclusive.
+ *
+ * @generated from field: int64 seconds = 1;
+ */
+ seconds = protoInt64.zero;
+
+ /**
+ * Non-negative fractions of a second at nanosecond resolution. Negative
+ * second values with fractions must still have non-negative nanos values
+ * that count forward in time. Must be from 0 to 999,999,999
+ * inclusive.
+ *
+ * @generated from field: int32 nanos = 2;
+ */
+ nanos = 0;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ override fromJson(json: JsonValue, options?: Partial): this {
+ if (typeof json !== "string") {
+ throw new Error(`cannot decode google.protobuf.Timestamp from JSON: ${proto3.json.debug(json)}`);
+ }
+ const matches = json.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:Z|\.([0-9]{3,9})Z|([+-][0-9][0-9]:[0-9][0-9]))$/);
+ if (!matches) {
+ throw new Error(`cannot decode google.protobuf.Timestamp from JSON: invalid RFC 3339 string`);
+ }
+ const ms = Date.parse(matches[1] + "-" + matches[2] + "-" + matches[3] + "T" + matches[4] + ":" + matches[5] + ":" + matches[6] + (matches[8] ? matches[8] : "Z"));
+ if (Number.isNaN(ms)) {
+ throw new Error(`cannot decode google.protobuf.Timestamp from JSON: invalid RFC 3339 string`);
+ }
+ if (ms < Date.parse("0001-01-01T00:00:00Z") || ms > Date.parse("9999-12-31T23:59:59Z")) {
+ throw new Error(`cannot decode message google.protobuf.Timestamp from JSON: must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive`);
+ }
+ this.seconds = protoInt64.parse(ms / 1000);
+ this.nanos = 0;
+ if (matches[7]) {
+ this.nanos = (parseInt("1" + matches[7] + "0".repeat(9 - matches[7].length)) - 1000000000);
+ }
+ return this;
+ }
+
+ override toJson(options?: Partial): JsonValue {
+ const ms = Number(this.seconds) * 1000;
+ if (ms < Date.parse("0001-01-01T00:00:00Z") || ms > Date.parse("9999-12-31T23:59:59Z")) {
+ throw new Error(`cannot encode google.protobuf.Timestamp to JSON: must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive`);
+ }
+ if (this.nanos < 0) {
+ throw new Error(`cannot encode google.protobuf.Timestamp to JSON: nanos must not be negative`);
+ }
+ let z = "Z";
+ if (this.nanos > 0) {
+ const nanosStr = (this.nanos + 1000000000).toString().substring(1);
+ if (nanosStr.substring(3) === "000000") {
+ z = "." + nanosStr.substring(0, 3) + "Z";
+ } else if (nanosStr.substring(6) === "000") {
+ z = "." + nanosStr.substring(0, 6) + "Z";
+ } else {
+ z = "." + nanosStr + "Z";
+ }
+ }
+ return new Date(ms).toISOString().replace(".000Z", z);
+ }
+
+ toDate(): Date {
+ return new Date(Number(this.seconds) * 1000 + Math.ceil(this.nanos / 1000000));
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "google.protobuf.Timestamp";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "seconds", kind: "scalar", T: 3 /* ScalarType.INT64 */ },
+ { no: 2, name: "nanos", kind: "scalar", T: 5 /* ScalarType.INT32 */ },
+ ]);
+
+ static now(): Timestamp {
+ return Timestamp.fromDate(new Date())
+ }
+
+ static fromDate(date: Date): Timestamp {
+ const ms = date.getTime();
+ return new Timestamp({
+ seconds: protoInt64.parse(Math.floor(ms / 1000)),
+ nanos: (ms % 1000) * 1000000,
+ });
+ }
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Timestamp {
+ return new Timestamp().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Timestamp {
+ return new Timestamp().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Timestamp {
+ return new Timestamp().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Timestamp | PlainMessage | undefined, b: Timestamp | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Timestamp, a, b);
+ }
+}
+
diff --git a/console-subscriber/examples/grpc_web/app/src/gen/instrument_connect.ts b/console-subscriber/examples/grpc_web/app/src/gen/instrument_connect.ts
new file mode 100644
index 000000000..fdc38b673
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/src/gen/instrument_connect.ts
@@ -0,0 +1,64 @@
+// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts"
+// @generated from file instrument.proto (package rs.tokio.console.instrument, syntax proto3)
+/* eslint-disable */
+// @ts-nocheck
+
+import { InstrumentRequest, PauseRequest, PauseResponse, ResumeRequest, ResumeResponse, TaskDetailsRequest, Update } from "./instrument_pb.js";
+import { MethodKind } from "@bufbuild/protobuf";
+import { TaskDetails } from "./tasks_pb.js";
+
+/**
+ * `InstrumentServer` implements `Instrument` as a service.
+ *
+ * @generated from service rs.tokio.console.instrument.Instrument
+ */
+export const Instrument = {
+ typeName: "rs.tokio.console.instrument.Instrument",
+ methods: {
+ /**
+ * Produces a stream of updates representing the behavior of the instrumented async runtime.
+ *
+ * @generated from rpc rs.tokio.console.instrument.Instrument.WatchUpdates
+ */
+ watchUpdates: {
+ name: "WatchUpdates",
+ I: InstrumentRequest,
+ O: Update,
+ kind: MethodKind.ServerStreaming,
+ },
+ /**
+ * Produces a stream of updates describing the activity of a specific task.
+ *
+ * @generated from rpc rs.tokio.console.instrument.Instrument.WatchTaskDetails
+ */
+ watchTaskDetails: {
+ name: "WatchTaskDetails",
+ I: TaskDetailsRequest,
+ O: TaskDetails,
+ kind: MethodKind.ServerStreaming,
+ },
+ /**
+ * Registers that the console observer wants to pause the stream.
+ *
+ * @generated from rpc rs.tokio.console.instrument.Instrument.Pause
+ */
+ pause: {
+ name: "Pause",
+ I: PauseRequest,
+ O: PauseResponse,
+ kind: MethodKind.Unary,
+ },
+ /**
+ * Registers that the console observer wants to resume the stream.
+ *
+ * @generated from rpc rs.tokio.console.instrument.Instrument.Resume
+ */
+ resume: {
+ name: "Resume",
+ I: ResumeRequest,
+ O: ResumeResponse,
+ kind: MethodKind.Unary,
+ },
+ }
+} as const;
+
diff --git a/console-subscriber/examples/grpc_web/app/src/gen/instrument_pb.ts b/console-subscriber/examples/grpc_web/app/src/gen/instrument_pb.ts
new file mode 100644
index 000000000..09ec3b34d
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/src/gen/instrument_pb.ts
@@ -0,0 +1,307 @@
+// @generated by protoc-gen-es v1.7.2 with parameter "target=ts"
+// @generated from file instrument.proto (package rs.tokio.console.instrument, syntax proto3)
+/* eslint-disable */
+// @ts-nocheck
+
+import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
+import { Message, proto3, Timestamp } from "@bufbuild/protobuf";
+import { Id, RegisterMetadata } from "./common_pb.js";
+import { TaskUpdate } from "./tasks_pb.js";
+import { ResourceUpdate } from "./resources_pb.js";
+import { AsyncOpUpdate } from "./async_ops_pb.js";
+
+/**
+ * InstrumentRequest requests the stream of updates
+ * to observe the async runtime state over time.
+ *
+ * TODO: In the future allow for the request to specify
+ * only the data that the caller cares about (i.e. only
+ * tasks but no resources)
+ *
+ * @generated from message rs.tokio.console.instrument.InstrumentRequest
+ */
+export class InstrumentRequest extends Message {
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.instrument.InstrumentRequest";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): InstrumentRequest {
+ return new InstrumentRequest().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): InstrumentRequest {
+ return new InstrumentRequest().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): InstrumentRequest {
+ return new InstrumentRequest().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: InstrumentRequest | PlainMessage | undefined, b: InstrumentRequest | PlainMessage | undefined): boolean {
+ return proto3.util.equals(InstrumentRequest, a, b);
+ }
+}
+
+/**
+ * TaskDetailsRequest requests the stream of updates about
+ * the specific task identified in the request.
+ *
+ * @generated from message rs.tokio.console.instrument.TaskDetailsRequest
+ */
+export class TaskDetailsRequest extends Message {
+ /**
+ * Identifies the task for which details were requested.
+ *
+ * @generated from field: rs.tokio.console.common.Id id = 1;
+ */
+ id?: Id;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.instrument.TaskDetailsRequest";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "id", kind: "message", T: Id },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): TaskDetailsRequest {
+ return new TaskDetailsRequest().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): TaskDetailsRequest {
+ return new TaskDetailsRequest().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): TaskDetailsRequest {
+ return new TaskDetailsRequest().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: TaskDetailsRequest | PlainMessage | undefined, b: TaskDetailsRequest | PlainMessage | undefined): boolean {
+ return proto3.util.equals(TaskDetailsRequest, a, b);
+ }
+}
+
+/**
+ * PauseRequest requests the stream of updates to pause.
+ *
+ * @generated from message rs.tokio.console.instrument.PauseRequest
+ */
+export class PauseRequest extends Message {
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.instrument.PauseRequest";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): PauseRequest {
+ return new PauseRequest().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): PauseRequest {
+ return new PauseRequest().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): PauseRequest {
+ return new PauseRequest().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: PauseRequest | PlainMessage | undefined, b: PauseRequest | PlainMessage | undefined): boolean {
+ return proto3.util.equals(PauseRequest, a, b);
+ }
+}
+
+/**
+ * ResumeRequest requests the stream of updates to resume after a pause.
+ *
+ * @generated from message rs.tokio.console.instrument.ResumeRequest
+ */
+export class ResumeRequest extends Message {
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.instrument.ResumeRequest";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): ResumeRequest {
+ return new ResumeRequest().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): ResumeRequest {
+ return new ResumeRequest().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): ResumeRequest {
+ return new ResumeRequest().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: ResumeRequest | PlainMessage | undefined, b: ResumeRequest | PlainMessage | undefined): boolean {
+ return proto3.util.equals(ResumeRequest, a, b);
+ }
+}
+
+/**
+ * Update carries all information regarding tasks, resources, async operations
+ * and resource operations in one message. There are a couple of reasons to combine all
+ * of these into a single message:
+ *
+ * - we can use one single timestamp for all the data
+ * - we can have all the new_metadata in one place
+ * - things such as async ops and resource ops do not make sense
+ * on their own as they have relations to tasks and resources
+ *
+ * @generated from message rs.tokio.console.instrument.Update
+ */
+export class Update extends Message {
+ /**
+ * The system time when this update was recorded.
+ *
+ * This is the timestamp any durations in the included `Stats` were
+ * calculated relative to.
+ *
+ * @generated from field: google.protobuf.Timestamp now = 1;
+ */
+ now?: Timestamp;
+
+ /**
+ * Task state update.
+ *
+ * @generated from field: rs.tokio.console.tasks.TaskUpdate task_update = 2;
+ */
+ taskUpdate?: TaskUpdate;
+
+ /**
+ * Resource state update.
+ *
+ * @generated from field: rs.tokio.console.resources.ResourceUpdate resource_update = 3;
+ */
+ resourceUpdate?: ResourceUpdate;
+
+ /**
+ * Async operations state update
+ *
+ * @generated from field: rs.tokio.console.async_ops.AsyncOpUpdate async_op_update = 4;
+ */
+ asyncOpUpdate?: AsyncOpUpdate;
+
+ /**
+ * Any new span metadata that was registered since the last update.
+ *
+ * @generated from field: rs.tokio.console.common.RegisterMetadata new_metadata = 5;
+ */
+ newMetadata?: RegisterMetadata;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.instrument.Update";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "now", kind: "message", T: Timestamp },
+ { no: 2, name: "task_update", kind: "message", T: TaskUpdate },
+ { no: 3, name: "resource_update", kind: "message", T: ResourceUpdate },
+ { no: 4, name: "async_op_update", kind: "message", T: AsyncOpUpdate },
+ { no: 5, name: "new_metadata", kind: "message", T: RegisterMetadata },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Update {
+ return new Update().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Update {
+ return new Update().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Update {
+ return new Update().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Update | PlainMessage | undefined, b: Update | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Update, a, b);
+ }
+}
+
+/**
+ * `PauseResponse` is the value returned after a pause request.
+ *
+ * @generated from message rs.tokio.console.instrument.PauseResponse
+ */
+export class PauseResponse extends Message {
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.instrument.PauseResponse";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): PauseResponse {
+ return new PauseResponse().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): PauseResponse {
+ return new PauseResponse().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): PauseResponse {
+ return new PauseResponse().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: PauseResponse | PlainMessage | undefined, b: PauseResponse | PlainMessage | undefined): boolean {
+ return proto3.util.equals(PauseResponse, a, b);
+ }
+}
+
+/**
+ * `ResumeResponse` is the value returned after a resume request.
+ *
+ * @generated from message rs.tokio.console.instrument.ResumeResponse
+ */
+export class ResumeResponse extends Message {
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.instrument.ResumeResponse";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): ResumeResponse {
+ return new ResumeResponse().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): ResumeResponse {
+ return new ResumeResponse().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): ResumeResponse {
+ return new ResumeResponse().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: ResumeResponse | PlainMessage | undefined, b: ResumeResponse | PlainMessage | undefined): boolean {
+ return proto3.util.equals(ResumeResponse, a, b);
+ }
+}
+
diff --git a/console-subscriber/examples/grpc_web/app/src/gen/resources_pb.ts b/console-subscriber/examples/grpc_web/app/src/gen/resources_pb.ts
new file mode 100644
index 000000000..d63b4951b
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/src/gen/resources_pb.ts
@@ -0,0 +1,409 @@
+// @generated by protoc-gen-es v1.7.2 with parameter "target=ts"
+// @generated from file resources.proto (package rs.tokio.console.resources, syntax proto3)
+/* eslint-disable */
+// @ts-nocheck
+
+import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
+import { Message, proto3, protoInt64, Timestamp } from "@bufbuild/protobuf";
+import { Attribute, Id, Location, MetaId } from "./common_pb.js";
+
+/**
+ * A resource state update.
+ *
+ * Each `ResourceUpdate` contains any resource data that has changed since the last
+ * update. This includes:
+ * - any new resources that were created since the last update
+ * - the current stats for any resource whose stats changed since the last update
+ * - any new poll ops that have been invoked on a resource
+ *
+ * @generated from message rs.tokio.console.resources.ResourceUpdate
+ */
+export class ResourceUpdate extends Message {
+ /**
+ * A list of new resources that were created since the last `ResourceUpdate` was
+ * sent.
+ *
+ * @generated from field: repeated rs.tokio.console.resources.Resource new_resources = 1;
+ */
+ newResources: Resource[] = [];
+
+ /**
+ * Any resource stats that have changed since the last update.
+ *
+ * @generated from field: map stats_update = 2;
+ */
+ statsUpdate: { [key: string]: Stats } = {};
+
+ /**
+ * A list of all new poll ops that have been invoked on resources since the last update.
+ *
+ * @generated from field: repeated rs.tokio.console.resources.PollOp new_poll_ops = 3;
+ */
+ newPollOps: PollOp[] = [];
+
+ /**
+ * A count of how many resource events (e.g. polls, creation, etc) were not
+ * recorded because the application's event buffer was at capacity.
+ *
+ * If everything is working normally, this should be 0. If it is greater
+ * than 0, that may indicate that some data is missing from this update, and
+ * it may be necessary to increase the number of events buffered by the
+ * application to ensure that data loss is avoided.
+ *
+ * If the application's instrumentation ensures reliable delivery of events,
+ * this will always be 0.
+ *
+ * @generated from field: uint64 dropped_events = 4;
+ */
+ droppedEvents = protoInt64.zero;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.resources.ResourceUpdate";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "new_resources", kind: "message", T: Resource, repeated: true },
+ { no: 2, name: "stats_update", kind: "map", K: 4 /* ScalarType.UINT64 */, V: {kind: "message", T: Stats} },
+ { no: 3, name: "new_poll_ops", kind: "message", T: PollOp, repeated: true },
+ { no: 4, name: "dropped_events", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): ResourceUpdate {
+ return new ResourceUpdate().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): ResourceUpdate {
+ return new ResourceUpdate().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): ResourceUpdate {
+ return new ResourceUpdate().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: ResourceUpdate | PlainMessage | undefined, b: ResourceUpdate | PlainMessage | undefined): boolean {
+ return proto3.util.equals(ResourceUpdate, a, b);
+ }
+}
+
+/**
+ * Static data recorded when a new resource is created.
+ *
+ * @generated from message rs.tokio.console.resources.Resource
+ */
+export class Resource extends Message {
+ /**
+ * The resources's ID.
+ *
+ * This uniquely identifies this resource across all *currently live*
+ * resources. This is also the primary way any operations on a resource
+ * are associated with it
+ *
+ * @generated from field: rs.tokio.console.common.Id id = 1;
+ */
+ id?: Id;
+
+ /**
+ * The numeric ID of the resources's `Metadata`.
+ *
+ * @generated from field: rs.tokio.console.common.MetaId metadata = 2;
+ */
+ metadata?: MetaId;
+
+ /**
+ * The resources's concrete rust type.
+ *
+ * @generated from field: string concrete_type = 3;
+ */
+ concreteType = "";
+
+ /**
+ * The kind of resource (e.g timer, mutex)
+ *
+ * @generated from field: rs.tokio.console.resources.Resource.Kind kind = 4;
+ */
+ kind?: Resource_Kind;
+
+ /**
+ * The location in code where the resource was created.
+ *
+ * @generated from field: rs.tokio.console.common.Location location = 5;
+ */
+ location?: Location;
+
+ /**
+ * The ID of the parent resource.
+ *
+ * @generated from field: rs.tokio.console.common.Id parent_resource_id = 6;
+ */
+ parentResourceId?: Id;
+
+ /**
+ * Is the resource an internal component of another resource?
+ *
+ * For example, a `tokio::time::Interval` resource might contain a
+ * `tokio::time::Sleep` resource internally.
+ *
+ * @generated from field: bool is_internal = 7;
+ */
+ isInternal = false;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.resources.Resource";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "id", kind: "message", T: Id },
+ { no: 2, name: "metadata", kind: "message", T: MetaId },
+ { no: 3, name: "concrete_type", kind: "scalar", T: 9 /* ScalarType.STRING */ },
+ { no: 4, name: "kind", kind: "message", T: Resource_Kind },
+ { no: 5, name: "location", kind: "message", T: Location },
+ { no: 6, name: "parent_resource_id", kind: "message", T: Id },
+ { no: 7, name: "is_internal", kind: "scalar", T: 8 /* ScalarType.BOOL */ },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Resource {
+ return new Resource().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Resource {
+ return new Resource().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Resource {
+ return new Resource().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Resource | PlainMessage | undefined, b: Resource | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Resource, a, b);
+ }
+}
+
+/**
+ * The kind of resource (e.g. timer, mutex).
+ *
+ * @generated from message rs.tokio.console.resources.Resource.Kind
+ */
+export class Resource_Kind extends Message {
+ /**
+ * Every resource is either a known kind or an other (unknown) kind.
+ *
+ * @generated from oneof rs.tokio.console.resources.Resource.Kind.kind
+ */
+ kind: {
+ /**
+ * `known` signals that this kind of resource is known to the console API.
+ *
+ * @generated from field: rs.tokio.console.resources.Resource.Kind.Known known = 1;
+ */
+ value: Resource_Kind_Known;
+ case: "known";
+ } | {
+ /**
+ * `other` signals that this kind of resource is unknown to the console API.
+ *
+ * @generated from field: string other = 2;
+ */
+ value: string;
+ case: "other";
+ } | { case: undefined; value?: undefined } = { case: undefined };
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.resources.Resource.Kind";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "known", kind: "enum", T: proto3.getEnumType(Resource_Kind_Known), oneof: "kind" },
+ { no: 2, name: "other", kind: "scalar", T: 9 /* ScalarType.STRING */, oneof: "kind" },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Resource_Kind {
+ return new Resource_Kind().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Resource_Kind {
+ return new Resource_Kind().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Resource_Kind {
+ return new Resource_Kind().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Resource_Kind | PlainMessage | undefined, b: Resource_Kind | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Resource_Kind, a, b);
+ }
+}
+
+/**
+ * `Known` collects the kinds of resources that are known in this version of the API.
+ *
+ * @generated from enum rs.tokio.console.resources.Resource.Kind.Known
+ */
+export enum Resource_Kind_Known {
+ /**
+ * `TIMER` signals that this is a timer resource, e.g. waiting for a sleep to finish.
+ *
+ * @generated from enum value: TIMER = 0;
+ */
+ TIMER = 0,
+}
+// Retrieve enum metadata with: proto3.getEnumType(Resource_Kind_Known)
+proto3.util.setEnumType(Resource_Kind_Known, "rs.tokio.console.resources.Resource.Kind.Known", [
+ { no: 0, name: "TIMER" },
+]);
+
+/**
+ * Task runtime stats of a resource.
+ *
+ * @generated from message rs.tokio.console.resources.Stats
+ */
+export class Stats extends Message {
+ /**
+ * Timestamp of when the resource was created.
+ *
+ * @generated from field: google.protobuf.Timestamp created_at = 1;
+ */
+ createdAt?: Timestamp;
+
+ /**
+ * Timestamp of when the resource was dropped.
+ *
+ * @generated from field: google.protobuf.Timestamp dropped_at = 2;
+ */
+ droppedAt?: Timestamp;
+
+ /**
+ * State attributes of the resource. These are dependent on the type of the resource.
+ * For example, a timer resource will have a duration while a semaphore resource may
+ * have permits as an attribute. These values may change over time as the state of
+ * the resource changes. Therefore, they live in the runtime stats rather than the
+ * static data describing the resource.
+ *
+ * @generated from field: repeated rs.tokio.console.common.Attribute attributes = 3;
+ */
+ attributes: Attribute[] = [];
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.resources.Stats";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "created_at", kind: "message", T: Timestamp },
+ { no: 2, name: "dropped_at", kind: "message", T: Timestamp },
+ { no: 3, name: "attributes", kind: "message", T: Attribute, repeated: true },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Stats {
+ return new Stats().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Stats {
+ return new Stats().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Stats {
+ return new Stats().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Stats | PlainMessage | undefined, b: Stats | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Stats, a, b);
+ }
+}
+
+/**
+ * A `PollOp` describes each poll operation that completes within the async
+ * application.
+ *
+ * @generated from message rs.tokio.console.resources.PollOp
+ */
+export class PollOp extends Message {
+ /**
+ * The numeric ID of the op's `Metadata`.
+ *
+ * This identifies the `Metadata` that describes the `tracing` span
+ * corresponding to this op. The metadata for this ID will have been sent
+ * in a prior `RegisterMetadata` message.
+ *
+ * @generated from field: rs.tokio.console.common.MetaId metadata = 2;
+ */
+ metadata?: MetaId;
+
+ /**
+ * The resources's ID.
+ *
+ * @generated from field: rs.tokio.console.common.Id resource_id = 3;
+ */
+ resourceId?: Id;
+
+ /**
+ * the name of this op (e.g. poll_elapsed, new_timeout, reset, etc.)
+ *
+ * @generated from field: string name = 4;
+ */
+ name = "";
+
+ /**
+ * Identifies the task context that this poll op has been called from.
+ *
+ * @generated from field: rs.tokio.console.common.Id task_id = 5;
+ */
+ taskId?: Id;
+
+ /**
+ * Identifies the async op ID that this poll op is part of.
+ *
+ * @generated from field: rs.tokio.console.common.Id async_op_id = 6;
+ */
+ asyncOpId?: Id;
+
+ /**
+ * Whether this poll op has returned with ready or pending.
+ *
+ * @generated from field: bool is_ready = 7;
+ */
+ isReady = false;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.resources.PollOp";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 2, name: "metadata", kind: "message", T: MetaId },
+ { no: 3, name: "resource_id", kind: "message", T: Id },
+ { no: 4, name: "name", kind: "scalar", T: 9 /* ScalarType.STRING */ },
+ { no: 5, name: "task_id", kind: "message", T: Id },
+ { no: 6, name: "async_op_id", kind: "message", T: Id },
+ { no: 7, name: "is_ready", kind: "scalar", T: 8 /* ScalarType.BOOL */ },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): PollOp {
+ return new PollOp().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): PollOp {
+ return new PollOp().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): PollOp {
+ return new PollOp().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: PollOp | PlainMessage | undefined, b: PollOp | PlainMessage | undefined): boolean {
+ return proto3.util.equals(PollOp, a, b);
+ }
+}
+
diff --git a/console-subscriber/examples/grpc_web/app/src/gen/tasks_pb.ts b/console-subscriber/examples/grpc_web/app/src/gen/tasks_pb.ts
new file mode 100644
index 000000000..30e7789d1
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/src/gen/tasks_pb.ts
@@ -0,0 +1,487 @@
+// @generated by protoc-gen-es v1.7.2 with parameter "target=ts"
+// @generated from file tasks.proto (package rs.tokio.console.tasks, syntax proto3)
+/* eslint-disable */
+// @ts-nocheck
+
+import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
+import { Duration, Message, proto3, protoInt64, Timestamp } from "@bufbuild/protobuf";
+import { Field, Id, Location, MetaId, PollStats, SpanId } from "./common_pb.js";
+
+/**
+ * A task state update.
+ *
+ * Each `TaskUpdate` contains any task data that has changed since the last
+ * update. This includes:
+ * - any new tasks that were spawned since the last update
+ * - the current stats for any task whose stats changed since the last update
+ *
+ * @generated from message rs.tokio.console.tasks.TaskUpdate
+ */
+export class TaskUpdate extends Message {
+ /**
+ * A list of new tasks that were spawned since the last `TaskUpdate` was
+ * sent.
+ *
+ * If this is empty, no new tasks were spawned.
+ *
+ * @generated from field: repeated rs.tokio.console.tasks.Task new_tasks = 1;
+ */
+ newTasks: Task[] = [];
+
+ /**
+ * Any task stats that have changed since the last update.
+ *
+ * This is a map of task IDs (64-bit unsigned integers) to task stats. If a
+ * task's ID is not included in this map, then its stats have *not* changed
+ * since the last `TaskUpdate` in which they were present. If a task's ID
+ * *is* included in this map, the corresponding value represents a complete
+ * snapshot of that task's stats at in the current time window.
+ *
+ * @generated from field: map stats_update = 3;
+ */
+ statsUpdate: { [key: string]: Stats } = {};
+
+ /**
+ * A count of how many task events (e.g. polls, spawns, etc) were not
+ * recorded because the application's event buffer was at capacity.
+ *
+ * If everything is working normally, this should be 0. If it is greater
+ * than 0, that may indicate that some data is missing from this update, and
+ * it may be necessary to increase the number of events buffered by the
+ * application to ensure that data loss is avoided.
+ *
+ * If the application's instrumentation ensures reliable delivery of events,
+ * this will always be 0.
+ *
+ * @generated from field: uint64 dropped_events = 4;
+ */
+ droppedEvents = protoInt64.zero;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.tasks.TaskUpdate";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "new_tasks", kind: "message", T: Task, repeated: true },
+ { no: 3, name: "stats_update", kind: "map", K: 4 /* ScalarType.UINT64 */, V: {kind: "message", T: Stats} },
+ { no: 4, name: "dropped_events", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): TaskUpdate {
+ return new TaskUpdate().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): TaskUpdate {
+ return new TaskUpdate().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): TaskUpdate {
+ return new TaskUpdate().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: TaskUpdate | PlainMessage | undefined, b: TaskUpdate | PlainMessage | undefined): boolean {
+ return proto3.util.equals(TaskUpdate, a, b);
+ }
+}
+
+/**
+ * A task details update
+ *
+ * @generated from message rs.tokio.console.tasks.TaskDetails
+ */
+export class TaskDetails extends Message {
+ /**
+ * The task's ID which the details belong to.
+ *
+ * @generated from field: rs.tokio.console.common.Id task_id = 1;
+ */
+ taskId?: Id;
+
+ /**
+ * The timestamp for when the update to the task took place.
+ *
+ * @generated from field: google.protobuf.Timestamp now = 2;
+ */
+ now?: Timestamp;
+
+ /**
+ * A histogram of task poll durations.
+ *
+ * This is either:
+ * - the raw binary representation of a HdrHistogram.rs `Histogram`
+ * serialized to binary in the V2 format (legacy)
+ * - a binary histogram plus details on outliers (current)
+ *
+ * @generated from oneof rs.tokio.console.tasks.TaskDetails.poll_times_histogram
+ */
+ pollTimesHistogram: {
+ /**
+ * HdrHistogram.rs `Histogram` serialized to binary in the V2 format
+ *
+ * @generated from field: bytes legacy_histogram = 3;
+ */
+ value: Uint8Array;
+ case: "legacyHistogram";
+ } | {
+ /**
+ * A histogram plus additional data.
+ *
+ * @generated from field: rs.tokio.console.tasks.DurationHistogram histogram = 4;
+ */
+ value: DurationHistogram;
+ case: "histogram";
+ } | { case: undefined; value?: undefined } = { case: undefined };
+
+ /**
+ * A histogram of task scheduled durations.
+ *
+ * The scheduled duration is the time a task spends between being
+ * woken and when it is next polled.
+ *
+ * @generated from field: rs.tokio.console.tasks.DurationHistogram scheduled_times_histogram = 5;
+ */
+ scheduledTimesHistogram?: DurationHistogram;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.tasks.TaskDetails";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "task_id", kind: "message", T: Id },
+ { no: 2, name: "now", kind: "message", T: Timestamp },
+ { no: 3, name: "legacy_histogram", kind: "scalar", T: 12 /* ScalarType.BYTES */, oneof: "poll_times_histogram" },
+ { no: 4, name: "histogram", kind: "message", T: DurationHistogram, oneof: "poll_times_histogram" },
+ { no: 5, name: "scheduled_times_histogram", kind: "message", T: DurationHistogram },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): TaskDetails {
+ return new TaskDetails().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): TaskDetails {
+ return new TaskDetails().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): TaskDetails {
+ return new TaskDetails().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: TaskDetails | PlainMessage | undefined, b: TaskDetails | PlainMessage | undefined): boolean {
+ return proto3.util.equals(TaskDetails, a, b);
+ }
+}
+
+/**
+ * Data recorded when a new task is spawned.
+ *
+ * @generated from message rs.tokio.console.tasks.Task
+ */
+export class Task extends Message {
+ /**
+ * The task's ID.
+ *
+ * This uniquely identifies this task across all *currently live* tasks.
+ * When the task's stats change, or when the task completes, it will be
+ * identified by this ID; if the client requires additional information
+ * included in the `Task` message, it should store that data and access it
+ * by ID.
+ *
+ * @generated from field: rs.tokio.console.common.Id id = 1;
+ */
+ id?: Id;
+
+ /**
+ * The numeric ID of the task's `Metadata`.
+ *
+ * This identifies the `Metadata` that describes the `tracing` span
+ * corresponding to this task. The metadata for this ID will have been sent
+ * in a prior `RegisterMetadata` message.
+ *
+ * @generated from field: rs.tokio.console.common.MetaId metadata = 2;
+ */
+ metadata?: MetaId;
+
+ /**
+ * The category of task this task belongs to.
+ *
+ * @generated from field: rs.tokio.console.tasks.Task.Kind kind = 3;
+ */
+ kind = Task_Kind.SPAWN;
+
+ /**
+ * A list of `Field` objects attached to this task.
+ *
+ * @generated from field: repeated rs.tokio.console.common.Field fields = 4;
+ */
+ fields: Field[] = [];
+
+ /**
+ * An ordered list of span IDs corresponding to the `tracing` span context
+ * in which this task was spawned.
+ *
+ * The first span ID in this list is the immediate parent, followed by that
+ * span's parent, and so on. The final ID is the root span of the current
+ * trace.
+ *
+ * If this is empty, there were *no* active spans when the task was spawned.
+ *
+ * These IDs may correspond to `tracing` spans which are *not* tasks, if
+ * additional trace data is being collected.
+ *
+ * @generated from field: repeated rs.tokio.console.common.SpanId parents = 5;
+ */
+ parents: SpanId[] = [];
+
+ /**
+ * The location in code where the task was spawned.
+ *
+ * @generated from field: rs.tokio.console.common.Location location = 6;
+ */
+ location?: Location;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.tasks.Task";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "id", kind: "message", T: Id },
+ { no: 2, name: "metadata", kind: "message", T: MetaId },
+ { no: 3, name: "kind", kind: "enum", T: proto3.getEnumType(Task_Kind) },
+ { no: 4, name: "fields", kind: "message", T: Field, repeated: true },
+ { no: 5, name: "parents", kind: "message", T: SpanId, repeated: true },
+ { no: 6, name: "location", kind: "message", T: Location },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Task {
+ return new Task().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Task {
+ return new Task().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Task {
+ return new Task().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Task | PlainMessage | undefined, b: Task | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Task, a, b);
+ }
+}
+
+/**
+ * The category of task this task belongs to.
+ *
+ * @generated from enum rs.tokio.console.tasks.Task.Kind
+ */
+export enum Task_Kind {
+ /**
+ * A task spawned using a runtime's standard asynchronous task spawning
+ * operation (such as `tokio::task::spawn`).
+ *
+ * @generated from enum value: SPAWN = 0;
+ */
+ SPAWN = 0,
+
+ /**
+ * A task spawned via a runtime's blocking task spawning operation
+ * (such as `tokio::task::spawn_blocking`).
+ *
+ * @generated from enum value: BLOCKING = 1;
+ */
+ BLOCKING = 1,
+}
+// Retrieve enum metadata with: proto3.getEnumType(Task_Kind)
+proto3.util.setEnumType(Task_Kind, "rs.tokio.console.tasks.Task.Kind", [
+ { no: 0, name: "SPAWN" },
+ { no: 1, name: "BLOCKING" },
+]);
+
+/**
+ * Task performance statistics.
+ *
+ * @generated from message rs.tokio.console.tasks.Stats
+ */
+export class Stats extends Message {
+ /**
+ * Timestamp of when the task was spawned.
+ *
+ * @generated from field: google.protobuf.Timestamp created_at = 1;
+ */
+ createdAt?: Timestamp;
+
+ /**
+ * Timestamp of when the task was dropped.
+ *
+ * @generated from field: google.protobuf.Timestamp dropped_at = 2;
+ */
+ droppedAt?: Timestamp;
+
+ /**
+ * The total number of times this task has been woken over its lifetime.
+ *
+ * @generated from field: uint64 wakes = 3;
+ */
+ wakes = protoInt64.zero;
+
+ /**
+ * The total number of times this task's waker has been cloned.
+ *
+ * @generated from field: uint64 waker_clones = 4;
+ */
+ wakerClones = protoInt64.zero;
+
+ /**
+ * The total number of times this task's waker has been dropped.
+ *
+ * @generated from field: uint64 waker_drops = 5;
+ */
+ wakerDrops = protoInt64.zero;
+
+ /**
+ * The timestamp of the most recent time this task has been woken.
+ *
+ * If this is `None`, the task has not yet been woken.
+ *
+ * @generated from field: optional google.protobuf.Timestamp last_wake = 6;
+ */
+ lastWake?: Timestamp;
+
+ /**
+ * Contains task poll statistics.
+ *
+ * @generated from field: rs.tokio.console.common.PollStats poll_stats = 7;
+ */
+ pollStats?: PollStats;
+
+ /**
+ * The total number of times this task has woken itself.
+ *
+ * @generated from field: uint64 self_wakes = 8;
+ */
+ selfWakes = protoInt64.zero;
+
+ /**
+ * The total duration this task was scheduled prior to being polled, summed
+ * across all poll cycles.
+ *
+ * Note that this includes only polls that have started, and does not
+ * reflect any scheduled state where the task hasn't yet been polled.
+ * Subtracting both `busy_time` (from the task's `PollStats`) and
+ * `scheduled_time` from the total lifetime of the task results in the
+ * amount of time it spent unable to progress because it was waiting on
+ * some resource.
+ *
+ * @generated from field: google.protobuf.Duration scheduled_time = 9;
+ */
+ scheduledTime?: Duration;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.tasks.Stats";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "created_at", kind: "message", T: Timestamp },
+ { no: 2, name: "dropped_at", kind: "message", T: Timestamp },
+ { no: 3, name: "wakes", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
+ { no: 4, name: "waker_clones", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
+ { no: 5, name: "waker_drops", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
+ { no: 6, name: "last_wake", kind: "message", T: Timestamp, opt: true },
+ { no: 7, name: "poll_stats", kind: "message", T: PollStats },
+ { no: 8, name: "self_wakes", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
+ { no: 9, name: "scheduled_time", kind: "message", T: Duration },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): Stats {
+ return new Stats().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): Stats {
+ return new Stats().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): Stats {
+ return new Stats().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: Stats | PlainMessage | undefined, b: Stats | PlainMessage | undefined): boolean {
+ return proto3.util.equals(Stats, a, b);
+ }
+}
+
+/**
+ * @generated from message rs.tokio.console.tasks.DurationHistogram
+ */
+export class DurationHistogram extends Message {
+ /**
+ * HdrHistogram.rs `Histogram` serialized to binary in the V2 format
+ *
+ * @generated from field: bytes raw_histogram = 1;
+ */
+ rawHistogram = new Uint8Array(0);
+
+ /**
+ * The histogram's maximum value.
+ *
+ * @generated from field: uint64 max_value = 2;
+ */
+ maxValue = protoInt64.zero;
+
+ /**
+ * The number of outliers which have exceeded the histogram's maximum value.
+ *
+ * @generated from field: uint64 high_outliers = 3;
+ */
+ highOutliers = protoInt64.zero;
+
+ /**
+ * The highest recorded outlier. This is only present if `high_outliers` is
+ * greater than zero.
+ *
+ * @generated from field: optional uint64 highest_outlier = 4;
+ */
+ highestOutlier?: bigint;
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.tasks.DurationHistogram";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "raw_histogram", kind: "scalar", T: 12 /* ScalarType.BYTES */ },
+ { no: 2, name: "max_value", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
+ { no: 3, name: "high_outliers", kind: "scalar", T: 4 /* ScalarType.UINT64 */ },
+ { no: 4, name: "highest_outlier", kind: "scalar", T: 4 /* ScalarType.UINT64 */, opt: true },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): DurationHistogram {
+ return new DurationHistogram().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): DurationHistogram {
+ return new DurationHistogram().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): DurationHistogram {
+ return new DurationHistogram().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: DurationHistogram | PlainMessage | undefined, b: DurationHistogram | PlainMessage | undefined): boolean {
+ return proto3.util.equals(DurationHistogram, a, b);
+ }
+}
+
diff --git a/console-subscriber/examples/grpc_web/app/src/gen/trace_connect.ts b/console-subscriber/examples/grpc_web/app/src/gen/trace_connect.ts
new file mode 100644
index 000000000..bc00651d8
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/src/gen/trace_connect.ts
@@ -0,0 +1,30 @@
+// @generated by protoc-gen-connect-es v1.3.0 with parameter "target=ts"
+// @generated from file trace.proto (package rs.tokio.console.trace, syntax proto3)
+/* eslint-disable */
+// @ts-nocheck
+
+import { TraceEvent, WatchRequest } from "./trace_pb.js";
+import { MethodKind } from "@bufbuild/protobuf";
+
+/**
+ * Allows observers to stream trace events for a given `WatchRequest` filter.
+ *
+ * @generated from service rs.tokio.console.trace.Trace
+ */
+export const Trace = {
+ typeName: "rs.tokio.console.trace.Trace",
+ methods: {
+ /**
+ * Produces a stream of trace events for the given filter.
+ *
+ * @generated from rpc rs.tokio.console.trace.Trace.Watch
+ */
+ watch: {
+ name: "Watch",
+ I: WatchRequest,
+ O: TraceEvent,
+ kind: MethodKind.ServerStreaming,
+ },
+ }
+} as const;
+
diff --git a/console-subscriber/examples/grpc_web/app/src/gen/trace_pb.ts b/console-subscriber/examples/grpc_web/app/src/gen/trace_pb.ts
new file mode 100644
index 000000000..3db89447c
--- /dev/null
+++ b/console-subscriber/examples/grpc_web/app/src/gen/trace_pb.ts
@@ -0,0 +1,348 @@
+// @generated by protoc-gen-es v1.7.2 with parameter "target=ts"
+// @generated from file trace.proto (package rs.tokio.console.trace, syntax proto3)
+/* eslint-disable */
+// @ts-nocheck
+
+import type { BinaryReadOptions, FieldList, JsonReadOptions, JsonValue, PartialMessage, PlainMessage } from "@bufbuild/protobuf";
+import { Message, proto3, protoInt64, Timestamp } from "@bufbuild/protobuf";
+import { RegisterMetadata, Span, SpanId } from "./common_pb.js";
+
+/**
+ * Start watching trace events with the provided filter.
+ *
+ * @generated from message rs.tokio.console.trace.WatchRequest
+ */
+export class WatchRequest extends Message {
+ /**
+ * Specifies which trace events should be streamed.
+ *
+ * @generated from field: string filter = 1;
+ */
+ filter = "";
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.trace.WatchRequest";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "filter", kind: "scalar", T: 9 /* ScalarType.STRING */ },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): WatchRequest {
+ return new WatchRequest().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): WatchRequest {
+ return new WatchRequest().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): WatchRequest {
+ return new WatchRequest().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: WatchRequest | PlainMessage | undefined, b: WatchRequest | PlainMessage | undefined): boolean {
+ return proto3.util.equals(WatchRequest, a, b);
+ }
+}
+
+/**
+ * A trace event
+ *
+ * @generated from message rs.tokio.console.trace.TraceEvent
+ */
+export class TraceEvent extends Message {
+ /**
+ * A trace event
+ *
+ * @generated from oneof rs.tokio.console.trace.TraceEvent.event
+ */
+ event: {
+ /**
+ * A new thread was registered.
+ *
+ * @generated from field: rs.tokio.console.trace.TraceEvent.RegisterThreads register_thread = 1;
+ */
+ value: TraceEvent_RegisterThreads;
+ case: "registerThread";
+ } | {
+ /**
+ * A new span metadata was registered.
+ *
+ * @generated from field: rs.tokio.console.common.RegisterMetadata register_metadata = 2;
+ */
+ value: RegisterMetadata;
+ case: "registerMetadata";
+ } | {
+ /**
+ * A span was created.
+ *
+ * @generated from field: rs.tokio.console.common.Span new_span = 3;
+ */
+ value: Span;
+ case: "newSpan";
+ } | {
+ /**
+ * A span was entered.
+ *
+ * @generated from field: rs.tokio.console.trace.TraceEvent.Enter enter_span = 4;
+ */
+ value: TraceEvent_Enter;
+ case: "enterSpan";
+ } | {
+ /**
+ * A span was exited.
+ *
+ * @generated from field: rs.tokio.console.trace.TraceEvent.Exit exit_span = 5;
+ */
+ value: TraceEvent_Exit;
+ case: "exitSpan";
+ } | {
+ /**
+ * A span was closed.
+ *
+ * @generated from field: rs.tokio.console.trace.TraceEvent.Close close_span = 6;
+ */
+ value: TraceEvent_Close;
+ case: "closeSpan";
+ } | { case: undefined; value?: undefined } = { case: undefined };
+
+ constructor(data?: PartialMessage) {
+ super();
+ proto3.util.initPartial(data, this);
+ }
+
+ static readonly runtime: typeof proto3 = proto3;
+ static readonly typeName = "rs.tokio.console.trace.TraceEvent";
+ static readonly fields: FieldList = proto3.util.newFieldList(() => [
+ { no: 1, name: "register_thread", kind: "message", T: TraceEvent_RegisterThreads, oneof: "event" },
+ { no: 2, name: "register_metadata", kind: "message", T: RegisterMetadata, oneof: "event" },
+ { no: 3, name: "new_span", kind: "message", T: Span, oneof: "event" },
+ { no: 4, name: "enter_span", kind: "message", T: TraceEvent_Enter, oneof: "event" },
+ { no: 5, name: "exit_span", kind: "message", T: TraceEvent_Exit, oneof: "event" },
+ { no: 6, name: "close_span", kind: "message", T: TraceEvent_Close, oneof: "event" },
+ ]);
+
+ static fromBinary(bytes: Uint8Array, options?: Partial): TraceEvent {
+ return new TraceEvent().fromBinary(bytes, options);
+ }
+
+ static fromJson(jsonValue: JsonValue, options?: Partial): TraceEvent {
+ return new TraceEvent().fromJson(jsonValue, options);
+ }
+
+ static fromJsonString(jsonString: string, options?: Partial): TraceEvent {
+ return new TraceEvent().fromJsonString(jsonString, options);
+ }
+
+ static equals(a: TraceEvent | PlainMessage | undefined, b: TraceEvent | PlainMessage | undefined): boolean {
+ return proto3.util.equals(TraceEvent, a, b);
+ }
+}
+
+/**
+ * `RegisterThreads` signals that a new thread was registered.
+ *
+ * @generated from message rs.tokio.console.trace.TraceEvent.RegisterThreads
+ */
+export class TraceEvent_RegisterThreads extends Message