From 58a84164ef6389220ea4c5578e1cacc821b9e486 Mon Sep 17 00:00:00 2001 From: Chrystian Huot Date: Fri, 25 Mar 2022 12:30:56 -0400 Subject: [PATCH] Version 6.2.0 --- CHANGELOG.md | 7 + COMPILING.md | 16 +- Makefile | 6 +- README.md | 6 +- client/package-lock.json | 875 +++++++++--------- client/package.json | 36 +- .../rdio-scanner/admin/admin.service.ts | 4 + .../config/options/options.component.html | 24 + .../rdio-scanner/main/main.component.html | 3 + .../rdio-scanner/main/main.component.ts | 10 + .../rdio-scanner/rdio-scanner.service.ts | 10 +- .../components/rdio-scanner/rdio-scanner.ts | 2 + docs/images/twitter-badge.png | Bin 0 -> 3505 bytes docs/platforms/darwin.md | 48 +- docs/platforms/freebsd.md | 48 +- docs/platforms/linux.md | 48 +- docs/platforms/windows.md | 46 +- server/client.go | 44 +- server/controller.go | 18 +- server/defaults.go | 4 + server/go.mod | 10 +- server/go.sum | 18 +- server/message.go | 23 +- server/options.go | 30 + server/parsers.go | 14 +- server/version.go | 2 +- 26 files changed, 761 insertions(+), 591 deletions(-) create mode 100644 docs/images/twitter-badge.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 0de74a6..8dda8c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Change log +## Version 6.2 + +- New max clients options which is 200 by default. +- New show listeners count options which is disabled by default (issue #125). +- Fix panic: concurrent write to websocket connection on goroutine. +- Fix units import from SDR Trunk (issue #150). + ## Version 6.1 - Calls now support patched talkgroups. diff --git a/COMPILING.md b/COMPILING.md index 1dbd3c3..09bfce7 100644 --- a/COMPILING.md +++ b/COMPILING.md @@ -26,13 +26,13 @@ Clone the official repository on your computer and start the build process. When finished, you will find the precompiled versions for various platforms in the `dist` folder. - rdio-scanner-darwin-amd64-v6.1.16.zip - rdio-scanner-darwin-arm64-v6.1.16.zip - rdio-scanner-freebsd-amd64-v6.1.16.zip - rdio-scanner-linux-386-v6.1.16.zip - rdio-scanner-linux-amd64-v6.1.16.zip - rdio-scanner-linux-arm64-v6.1.16.zip - rdio-scanner-linux-arm-v6.1.16.zip - rdio-scanner-windows-amd64-v6.1.16.zip + rdio-scanner-darwin-amd64-v6.2.0.zip + rdio-scanner-darwin-arm64-v6.2.0.zip + rdio-scanner-freebsd-amd64-v6.2.0.zip + rdio-scanner-linux-386-v6.2.0.zip + rdio-scanner-linux-amd64-v6.2.0.zip + rdio-scanner-linux-arm64-v6.2.0.zip + rdio-scanner-linux-arm-v6.2.0.zip + rdio-scanner-windows-amd64-v6.2.0.zip **Happy Rdio scanning !** \ No newline at end of file diff --git a/Makefile b/Makefile index 95704d3..33e0491 100644 --- a/Makefile +++ b/Makefile @@ -16,8 +16,8 @@ ################################################################################ app := rdio-scanner -date := 2022/03/17 -ver := 6.1.16 +date := 2022/03/25 +ver := 6.2.0 client := $(wildcard client/*.json client/*.ts) server := $(wildcard server/*.go) @@ -40,7 +40,7 @@ clean: container: webapp linux-amd64 @podman login docker.io @podman manifest rm localhost/rdio-scanner:latest || true - @podman build --platform linux/amd64,linux/arm,linux/arm64 --manifest rdio-scanner:latest . + @podman build --platform linux/amd64,linux/arm,linux/arm64 --pull --manifest rdio-scanner:latest . @podman manifest push --format v2s2 localhost/rdio-scanner:latest docker://docker.io/chuot/rdio-scanner:latest dist: darwin freebsd linux windows diff --git a/README.md b/README.md index fc10e38..1ab1f70 100644 --- a/README.md +++ b/README.md @@ -39,9 +39,11 @@ You can ask your questions or post your comments on the [Rdio Scanner Discussion # Show your appreciation, support the author -If you like [Rdio Scanner](https://github.com/chuot/rdio-scanner), **[consider starring the GitHub repository](https://github.com/chuot/rdio-scanner)** to show you appreciation to the author for his hard work. It cost nothing but is really appreciated. +If you like [Rdio Scanner](https://github.com/chuot/rdio-scanner), **[consider starring the GitHub repository](https://github.com/chuot/rdio-scanner/stargazers)** to show you appreciation to the author for his hard work. It cost nothing but is really appreciated. -If you use [Rdio Scanner](https://github.com/chuot/rdio-scanner) for commercial purposes or derive income from it, **[consider sponsoring the project](https://github.com/sponsors/chuot)** to help support continued development. +If you use [Rdio Scanner](https://github.com/chuot/rdio-scanner) for commercial purposes or derive income from it, **[sponsor the project](https://github.com/sponsors/chuot)** to help support continued development. + +[![Follow us on Twitter](./docs/images/twitter-badge.png?raw=true)](https://twitter.com/RdioScanner) # Improve your experience on the go diff --git a/client/package-lock.json b/client/package-lock.json index 9113301..ebd20eb 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1,36 +1,36 @@ { "name": "rdio-scanner", - "version": "6.1.16", + "version": "6.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "rdio-scanner", - "version": "6.1.16", + "version": "6.2.0", "license": "LICENSE", "dependencies": { - "@angular/animations": "^13.2.6", - "@angular/cdk": "^13.2.6", - "@angular/common": "~13.2.6", - "@angular/compiler": "~13.2.6", - "@angular/core": "~13.2.6", - "@angular/forms": "~13.2.6", - "@angular/material": "^13.2.6", - "@angular/platform-browser": "~13.2.6", - "@angular/platform-browser-dynamic": "~13.2.6", - "@angular/router": "^13.2.6", - "@angular/service-worker": "^13.2.6", + "@angular/animations": "^13.3.0", + "@angular/cdk": "^13.3.1", + "@angular/common": "~13.3.0", + "@angular/compiler": "~13.3.0", + "@angular/core": "~13.3.0", + "@angular/forms": "~13.3.0", + "@angular/material": "^13.3.1", + "@angular/platform-browser": "~13.3.0", + "@angular/platform-browser-dynamic": "~13.3.0", + "@angular/router": "^13.3.0", + "@angular/service-worker": "^13.3.0", "rxjs": "~7.4.0", "tslib": "^2.3.1", "zone.js": "~0.11.5" }, "devDependencies": { - "@angular-devkit/build-angular": "^13.2.6", - "@angular/cli": "^13.2.6", - "@angular/compiler-cli": "~13.2.6", - "@types/node": "^17.0.21", - "@typescript-eslint/eslint-plugin": "^5.15.0", - "@typescript-eslint/parser": "^5.15.0", + "@angular-devkit/build-angular": "^13.3.0", + "@angular/cli": "^13.3.0", + "@angular/compiler-cli": "~13.3.0", + "@types/node": "^17.0.23", + "@typescript-eslint/eslint-plugin": "^5.16.0", + "@typescript-eslint/parser": "^5.16.0", "ajv-keywords": "^5.1.0", "eslint": "^8.11.0", "ts-node": "~10.7.0", @@ -54,12 +54,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1302.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1302.6.tgz", - "integrity": "sha512-NztzorUMfwJeRaT7SY00Y8WSqc2lQYuF11yNoyEm7Dae3V7VZ28rW2Z9RwibP27rYQL0RjSMaz2wKITHX2vOAw==", + "version": "0.1303.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.0.tgz", + "integrity": "sha512-kTcKB917ICA8j53SGo4gn+qAlzx8si+iHnOTbp5QlMr7qt/Iz07SVVI8mRlMD6c6lr7eE/fVlCLzEZ1+WCQpTA==", "dev": true, "dependencies": { - "@angular-devkit/core": "13.2.6", + "@angular-devkit/core": "13.3.0", "rxjs": "6.6.7" }, "engines": { @@ -87,15 +87,15 @@ "dev": true }, "node_modules/@angular-devkit/build-angular": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.2.6.tgz", - "integrity": "sha512-Y2ojy6xbZ0kwScppcutLHBP8eW0qNOjburTISSBU/L5l/9FOeZ1E7yAreKuVu/qibZiLbSJfAhk+SLwhRHFSSQ==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.3.0.tgz", + "integrity": "sha512-3Ji7EeqGHj7i1Jgmeo3aIEXsnfKyFeQPpl65gcYmHwj5dP4lZzLSU4rMaWWUKksccgqCUXgPI2vKePTPazmikg==", "dev": true, "dependencies": { "@ampproject/remapping": "1.1.1", - "@angular-devkit/architect": "0.1302.6", - "@angular-devkit/build-webpack": "0.1302.6", - "@angular-devkit/core": "13.2.6", + "@angular-devkit/architect": "0.1303.0", + "@angular-devkit/build-webpack": "0.1303.0", + "@angular-devkit/core": "13.3.0", "@babel/core": "7.16.12", "@babel/generator": "7.16.8", "@babel/helper-annotate-as-pure": "7.16.7", @@ -106,7 +106,7 @@ "@babel/runtime": "7.16.7", "@babel/template": "7.16.7", "@discoveryjs/json-ext": "0.5.6", - "@ngtools/webpack": "13.2.6", + "@ngtools/webpack": "13.3.0", "ansi-colors": "4.1.1", "babel-loader": "8.2.3", "babel-plugin-istanbul": "6.1.1", @@ -151,7 +151,7 @@ "text-table": "0.2.0", "tree-kill": "1.2.2", "tslib": "2.3.1", - "webpack": "5.67.0", + "webpack": "5.70.0", "webpack-dev-middleware": "5.3.0", "webpack-dev-server": "4.7.3", "webpack-merge": "5.8.0", @@ -166,14 +166,14 @@ "esbuild": "0.14.22" }, "peerDependencies": { - "@angular/compiler-cli": "^13.0.0", - "@angular/localize": "^13.0.0", - "@angular/service-worker": "^13.0.0", + "@angular/compiler-cli": "^13.0.0 || ^13.3.0-rc.0", + "@angular/localize": "^13.0.0 || ^13.3.0-rc.0", + "@angular/service-worker": "^13.0.0 || ^13.3.0-rc.0", "karma": "^6.3.0", "ng-packagr": "^13.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.4.3 <4.6" + "typescript": ">=4.4.3 <4.7" }, "peerDependenciesMeta": { "@angular/localize": { @@ -215,12 +215,12 @@ "dev": true }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1302.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1302.6.tgz", - "integrity": "sha512-TYEh2n9tPe932rEIgdiSpojOqtDppW2jzb/empVqCkLF7WUZsXKvTanttZC34L6R2VD6SAGWhb6JDg75ghUVYA==", + "version": "0.1303.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.0.tgz", + "integrity": "sha512-a+Veg2oYn3RM2Kl148BReuONmD1kjbbYBnMUVi8nD6rvJPStFZkqN5s5ZkYybKeWnzMGaB3VasKR88z5XeH22A==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1302.6", + "@angular-devkit/architect": "0.1303.0", "rxjs": "6.6.7" }, "engines": { @@ -252,9 +252,9 @@ "dev": true }, "node_modules/@angular-devkit/core": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.2.6.tgz", - "integrity": "sha512-8h2mWdBTN/dYwZuzKMg2IODlOWMdbJcpQG4XVrkk9ejCPP+3aX5Aa3glCe/voN6eBNiRfs8YDM0jxmpN2aWVtg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", + "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", "dev": true, "dependencies": { "ajv": "8.9.0", @@ -313,12 +313,12 @@ "dev": true }, "node_modules/@angular-devkit/schematics": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.2.6.tgz", - "integrity": "sha512-mPgSqdnZRuPSMeUA+T+mwVCrq2yhXpcYm1/Rjbhy09CyHs4wSrFv21WHCrE6shlvXpcmwr0n+I0DIeagAPmjUA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.0.tgz", + "integrity": "sha512-hq7tqnB3uVT/iDgqWWZ4kvnijeAcgd4cfLzZiCPaYn1nuhZf0tWsho6exhJ/odMZHvVp7w8OibqWiUKxNY9zHA==", "dev": true, "dependencies": { - "@angular-devkit/core": "13.2.6", + "@angular-devkit/core": "13.3.0", "jsonc-parser": "3.0.0", "magic-string": "0.25.7", "ora": "5.4.1", @@ -349,9 +349,9 @@ "dev": true }, "node_modules/@angular/animations": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.2.6.tgz", - "integrity": "sha512-DrjpKo68uR3lSLQQXosoTCbjKQS6IKRCpR14E2t8fo0AX8i2hkB8je4SrhdCyB7FgFN7l2kgUYo4Qa8+BOB+aA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.3.0.tgz", + "integrity": "sha512-q7hkImhHCv0QdriR8HOFhsAW05QDmvapcHrBv3y862LUTR5e90/+81RYuwFuKX1lk/sa7LiHlHHWC7oCspzr2Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -359,13 +359,13 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/core": "13.2.6" + "@angular/core": "13.3.0" } }, "node_modules/@angular/cdk": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.2.6.tgz", - "integrity": "sha512-epuXmaHqfukwPsYvIksbuHLXDtb6GALV2Vgv6W2asj4TorD584CeQTs0EcdPGmCzhGUYI8U8QV63WOxu9YFcNA==", + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.1.tgz", + "integrity": "sha512-JUCvhN6XomY5JOMH7Qyj/JodAuAtKgLlJYKs0tPmjCkGcBdR/T3/hOJ9gSRhz8PCOoiEORj+3xCh547oJRyesA==", "dependencies": { "tslib": "^2.3.0" }, @@ -379,16 +379,16 @@ } }, "node_modules/@angular/cli": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.2.6.tgz", - "integrity": "sha512-xIjEaQI5sWemXXc7GXLm4u9UL5sjtrQL/y1PJvvk/Jsa8+kIT+MutOfZfC7zcdAh9fqHd8mokH3guFV8BJdFxA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.3.0.tgz", + "integrity": "sha512-2qCKP/QsyxrJnpd3g4P/iTQ4TjI04N8r+bG5YLLfudoMDsQ/Ti4ogdI7PBeG2IMbRylZW9XLjHraWG42+Y9tWw==", "dev": true, "hasInstallScript": true, "dependencies": { - "@angular-devkit/architect": "0.1302.6", - "@angular-devkit/core": "13.2.6", - "@angular-devkit/schematics": "13.2.6", - "@schematics/angular": "13.2.6", + "@angular-devkit/architect": "0.1303.0", + "@angular-devkit/core": "13.3.0", + "@angular-devkit/schematics": "13.3.0", + "@schematics/angular": "13.3.0", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.3.3", @@ -415,9 +415,9 @@ } }, "node_modules/@angular/common": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.2.6.tgz", - "integrity": "sha512-t4XRb9db4UeRcPs5aHNtGuXRKSvGBlTEr0zzSeoKzHD9TCaO4dSDISh9obS9hThaPuBmPKRUHN5KE1HFmqnSHg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.3.0.tgz", + "integrity": "sha512-yl09TWBmz++Z3MKjzZIwU2wZHiedCn1DjGILjjNXegHFOfINRHiqLhHca4kGWFcTsdvcuEhd9Hk9JATqi45rjg==", "dependencies": { "tslib": "^2.3.0" }, @@ -425,14 +425,14 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/core": "13.2.6", + "@angular/core": "13.3.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.2.6.tgz", - "integrity": "sha512-LHU29J2/c/03WHkwtzUSElTBsXbzkKdYARodnNfsFdLPsWhyvzO3cqlcZYteFJxEy3dVH+ZrYDjqQ9Sp17aIgA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.3.0.tgz", + "integrity": "sha512-oeUvaBOVpey2G1I5fWZa3JcyRuBQ3dAeRay5UtQhu1Xw2L8jd2tYkbZb1XOgP9J1/Ma4LO62pjSaOpR2EtO5ww==", "dependencies": { "tslib": "^2.3.0" }, @@ -441,9 +441,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.6.tgz", - "integrity": "sha512-QtlLKj3m6a2nkewFxhg+a3tQ2gEIBzMfI2c1laWUfAfJJ56phj79k8Z/kf2HQxypphWixyTK+ugpTlMdvvOquA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.3.0.tgz", + "integrity": "sha512-f9m55YejHJNIDTwHyGwf3wn5AvZepDfdAgeJP0Re4XmO1mf/Z9Ob5mJP5Q1yLNhqk0DlURWsZ1CbJqufPXMTbQ==", "dev": true, "dependencies": { "@babel/core": "^7.17.2", @@ -466,8 +466,8 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/compiler": "13.2.6", - "typescript": ">=4.4.2 <4.6" + "@angular/compiler": "13.3.0", + "typescript": ">=4.4.2 <4.7" } }, "node_modules/@angular/compiler-cli/node_modules/@ampproject/remapping": { @@ -483,9 +483,9 @@ } }, "node_modules/@angular/compiler-cli/node_modules/@babel/core": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.7.tgz", - "integrity": "sha512-djHlEfFHnSnTAcPb7dATbiM5HxGOP98+3JLBZtjRb5I7RXrw7kFRoG2dXM8cm3H+o11A8IFH/uprmJpwFynRNQ==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", @@ -493,8 +493,8 @@ "@babel/generator": "^7.17.7", "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.7", - "@babel/parser": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0", @@ -557,9 +557,9 @@ } }, "node_modules/@angular/core": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.2.6.tgz", - "integrity": "sha512-ctWsxuaSO3d3afLW+wkJSyiEIA2uhaTKNps9x5wz/oZJDaUDYVa4PM4x7/UHn2bXzBjXjN9LSW8h9F31iwmcTg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.3.0.tgz", + "integrity": "sha512-ZnuIMEK8YFBtthNqrxapYolMp6qRy4Yp/VG+M11YNiuBp/BoYYDjTaknwO8vu36Cn6372zWjcibsknkZMjdBkg==", "dependencies": { "tslib": "^2.3.0" }, @@ -572,9 +572,9 @@ } }, "node_modules/@angular/forms": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.2.6.tgz", - "integrity": "sha512-3IikvNtO0RBiGb2AWl8aYcE3ivXHPIJz+JOn9Wz9XXSkYx75D3GjuJlz+fVIgz+7Q7tJuS6Q2E5qat/ldeDmoA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.3.0.tgz", + "integrity": "sha512-eBySo+B3/AV+p3SmD15Tg41N+SoxYPyqGnlCTR+jSrFis5ZZNWf0kKpIKhJhW2taRq6K+1o3KcA0W9bnphrZDQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -582,22 +582,22 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/common": "13.2.6", - "@angular/core": "13.2.6", - "@angular/platform-browser": "13.2.6", + "@angular/common": "13.3.0", + "@angular/core": "13.3.0", + "@angular/platform-browser": "13.3.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.2.6.tgz", - "integrity": "sha512-/h5wa/tXE0DMIIEQX+rozFkUWHYUWg1Xf1R2tXUFLslLQ0KRCGyNo225Sv/1wrxXHxfrML787lA9ex4p90Feqw==", + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.1.tgz", + "integrity": "sha512-c9BYNxvZvxuCA5QticqfEhn3nuspUnwxIVejjO5ZTqKlkK+vQGKN3QhshHLrMHeFYyjao/E8jVnJX7ahitPM9w==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/animations": "^13.0.0 || ^14.0.0-0", - "@angular/cdk": "13.2.6", + "@angular/cdk": "13.3.1", "@angular/common": "^13.0.0 || ^14.0.0-0", "@angular/core": "^13.0.0 || ^14.0.0-0", "@angular/forms": "^13.0.0 || ^14.0.0-0", @@ -606,9 +606,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.2.6.tgz", - "integrity": "sha512-Gc/1TqysW+P+K3NeQihmHWs4KF1mjJT20s06r+YcETnPP11uPk+UxQl7gJNsDV587DYO/wT3oISXVpRw4UJhdQ==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.3.0.tgz", + "integrity": "sha512-OgNVgRtqTPxzItZbJVe4NmSYKDLEKQYjGulStWl4ycQTsOKteF+sJi8gU5BvEU/KQNZItYnIQxMqTsFyS7xlRQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -616,9 +616,9 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/animations": "13.2.6", - "@angular/common": "13.2.6", - "@angular/core": "13.2.6" + "@angular/animations": "13.3.0", + "@angular/common": "13.3.0", + "@angular/core": "13.3.0" }, "peerDependenciesMeta": { "@angular/animations": { @@ -627,9 +627,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.2.6.tgz", - "integrity": "sha512-m77+pzwZw+4kiRhxzrj1kE3N1K82I8Xt+vEBKSL2Xv42hCX0T37erC6KlztFEDj4A68s5+/0C5vfwhEiDcr/Cw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.3.0.tgz", + "integrity": "sha512-7/r79Yn8SDH8t0/fJ26PmScm/S1JZ9hxjC8IoROdyC5xBrSGrp946mIKE/4/813zmF8uPj2lveV9p/XiKTbxSw==", "dependencies": { "tslib": "^2.3.0" }, @@ -637,16 +637,16 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/common": "13.2.6", - "@angular/compiler": "13.2.6", - "@angular/core": "13.2.6", - "@angular/platform-browser": "13.2.6" + "@angular/common": "13.3.0", + "@angular/compiler": "13.3.0", + "@angular/core": "13.3.0", + "@angular/platform-browser": "13.3.0" } }, "node_modules/@angular/router": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.2.6.tgz", - "integrity": "sha512-dA9vL4mPLp+iNegzuvm9FaEWirFI2ZK3WQgbdoxoIpneym+BxRTkNDzPcvEaqfUf7eDGRBqlWakFDrd+H2QEbg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.3.0.tgz", + "integrity": "sha512-Kz657mtycup+s9emRH66etkBobAF26h3UDXE9pnjUM6MuVTA38P31WyTWKyWJVk8Oruxm/hTHZZBfI88o9/1sA==", "dependencies": { "tslib": "^2.3.0" }, @@ -654,16 +654,16 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/common": "13.2.6", - "@angular/core": "13.2.6", - "@angular/platform-browser": "13.2.6", + "@angular/common": "13.3.0", + "@angular/core": "13.3.0", + "@angular/platform-browser": "13.3.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-13.2.6.tgz", - "integrity": "sha512-RVzIw+HOt57+4Ns1zlyNK60vbogH1Ns1ZRxIElpbgh96YlDgJHB2H2t7GcXlJzVRRl63G0kptqspUo5nr5ucZA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-13.3.0.tgz", + "integrity": "sha512-776tmgsQ09pLWWMhp1dMpN2t8wDn/H0gXH9AtFbJPcqBxAbkwFvNYZ72uJQq1pZLvPJfickC/LnLIDCo5JFrCQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -674,8 +674,8 @@ "node": "^12.20.0 || ^14.15.0 || >=16.10.0" }, "peerDependencies": { - "@angular/common": "13.2.6", - "@angular/core": "13.2.6" + "@angular/common": "13.3.0", + "@angular/core": "13.3.0" } }, "node_modules/@assemblyscript/loader": { @@ -1119,9 +1119,9 @@ } }, "node_modules/@babel/helpers": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.7.tgz", - "integrity": "sha512-TKsj9NkjJfTBxM7Phfy7kv6yYc4ZcOo+AaWGqQOKTPDOmcGkIFb5xNA746eKisQkm4yavUYh4InYM9S+VnO01w==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "dev": true, "dependencies": { "@babel/template": "^7.16.7", @@ -1147,9 +1147,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.7.tgz", - "integrity": "sha512-bm3AQf45vR4gKggRfvJdYJ0gFLoCbsPxiFLSH6hTVYABptNHY6l9NrhnucVjQ/X+SPtLANT9lc0fFhikj+VBRA==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1874,13 +1874,13 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", - "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" @@ -2555,9 +2555,9 @@ } }, "node_modules/@ngtools/webpack": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.6.tgz", - "integrity": "sha512-N8SvRV91+/57TcAfbghc0k0tKCukw/7KqbDaLPAQTGFekJ4xMGT3elMzOyBXTH3Hvp5HL8/hiBt2tG04qiMf+w==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.0.tgz", + "integrity": "sha512-QbTQWXK2WzYU+aKKVDG0ya7WYT+6rNAUXVt5ov9Nz1SGgDeozpiOx8ZqPWUvnToTY8EoodwWFGCVtkLHXUR+wA==", "dev": true, "engines": { "node": "^12.20.0 || ^14.15.0 || >=16.10.0", @@ -2566,7 +2566,7 @@ }, "peerDependencies": { "@angular/compiler-cli": "^13.0.0", - "typescript": ">=4.4.3 <4.6", + "typescript": ">=4.4.3 <4.7", "webpack": "^5.30.0" } }, @@ -2688,13 +2688,13 @@ } }, "node_modules/@schematics/angular": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.2.6.tgz", - "integrity": "sha512-8NzHMX9+FSgaB0lJYxlTJv9OcBuolwZJqo9M/yX3RPSqSHghA33jWwgVbV551hBJOpbVEePerG1DQkIC99DXKA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.3.0.tgz", + "integrity": "sha512-WND6DXWf0ZFefqlC2hUm1FzHDonRfGpDEPWVhVulhYkB7IUUaXuCz8K41HAScyJ3bxUngs2Lx9+4omikc05fxA==", "dev": true, "dependencies": { - "@angular-devkit/core": "13.2.6", - "@angular-devkit/schematics": "13.2.6", + "@angular-devkit/core": "13.3.0", + "@angular-devkit/schematics": "13.3.0", "jsonc-parser": "3.0.0" }, "engines": { @@ -2795,9 +2795,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, "node_modules/@types/express": { @@ -2833,9 +2833,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz", + "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==", "dev": true }, "node_modules/@types/mime": { @@ -2845,9 +2845,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", "dev": true }, "node_modules/@types/parse-json": { @@ -2912,14 +2912,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.15.0.tgz", - "integrity": "sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.16.0.tgz", + "integrity": "sha512-SJoba1edXvQRMmNI505Uo4XmGbxCK9ARQpkvOd00anxzri9RNQk0DDCxD+LIl+jYhkzOJiOMMKYEHnHEODjdCw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.15.0", - "@typescript-eslint/type-utils": "5.15.0", - "@typescript-eslint/utils": "5.15.0", + "@typescript-eslint/scope-manager": "5.16.0", + "@typescript-eslint/type-utils": "5.16.0", + "@typescript-eslint/utils": "5.16.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -2945,14 +2945,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.15.0.tgz", - "integrity": "sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.16.0.tgz", + "integrity": "sha512-fkDq86F0zl8FicnJtdXakFs4lnuebH6ZADDw6CYQv0UZeIjHvmEw87m9/29nk2Dv5Lmdp0zQ3zDQhiMWQf/GbA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.15.0", - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/typescript-estree": "5.15.0", + "@typescript-eslint/scope-manager": "5.16.0", + "@typescript-eslint/types": "5.16.0", + "@typescript-eslint/typescript-estree": "5.16.0", "debug": "^4.3.2" }, "engines": { @@ -2972,13 +2972,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.15.0.tgz", - "integrity": "sha512-EFiZcSKrHh4kWk0pZaa+YNJosvKE50EnmN4IfgjkA3bTHElPtYcd2U37QQkNTqwMCS7LXeDeZzEqnsOH8chjSg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.16.0.tgz", + "integrity": "sha512-P+Yab2Hovg8NekLIR/mOElCDPyGgFZKhGoZA901Yax6WR6HVeGLbsqJkZ+Cvk5nts/dAlFKm8PfL43UZnWdpIQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/visitor-keys": "5.15.0" + "@typescript-eslint/types": "5.16.0", + "@typescript-eslint/visitor-keys": "5.16.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2989,12 +2989,12 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.15.0.tgz", - "integrity": "sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.16.0.tgz", + "integrity": "sha512-SKygICv54CCRl1Vq5ewwQUJV/8padIWvPgCxlWPGO/OgQLCijY9G7lDu6H+mqfQtbzDNlVjzVWQmeqbLMBLEwQ==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.15.0", + "@typescript-eslint/utils": "5.16.0", "debug": "^4.3.2", "tsutils": "^3.21.0" }, @@ -3015,9 +3015,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.15.0.tgz", - "integrity": "sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.16.0.tgz", + "integrity": "sha512-oUorOwLj/3/3p/HFwrp6m/J2VfbLC8gjW5X3awpQJ/bSG+YRGFS4dpsvtQ8T2VNveV+LflQHjlLvB6v0R87z4g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3028,13 +3028,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.15.0.tgz", - "integrity": "sha512-Hb0e3dGc35b75xLzixM3cSbG1sSbrTBQDfIScqdyvrfJZVEi4XWAT+UL/HMxEdrJNB8Yk28SKxPLtAhfCbBInA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.16.0.tgz", + "integrity": "sha512-SE4VfbLWUZl9MR+ngLSARptUv2E8brY0luCdgmUevU6arZRY/KxYoLI/3V/yxaURR8tLRN7bmZtJdgmzLHI6pQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/visitor-keys": "5.15.0", + "@typescript-eslint/types": "5.16.0", + "@typescript-eslint/visitor-keys": "5.16.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -3055,15 +3055,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.15.0.tgz", - "integrity": "sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.16.0.tgz", + "integrity": "sha512-iYej2ER6AwmejLWMWzJIHy3nPJeGDuCqf8Jnb+jAQVoPpmWzwQOfa9hWVB8GIQE5gsCv/rfN4T+AYb/V06WseQ==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.15.0", - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/typescript-estree": "5.15.0", + "@typescript-eslint/scope-manager": "5.16.0", + "@typescript-eslint/types": "5.16.0", + "@typescript-eslint/typescript-estree": "5.16.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, @@ -3079,12 +3079,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.15.0.tgz", - "integrity": "sha512-+vX5FKtgvyHbmIJdxMJ2jKm9z2BIlXJiuewI8dsDYMp5LzPUcuTT78Ya5iwvQg3VqSVdmxyM8Anj1Jeq7733ZQ==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.16.0.tgz", + "integrity": "sha512-jqxO8msp5vZDhikTwq9ubyMHqZ67UIvawohr4qF3KhlpL7gzSjOd+8471H3nh5LyABkaI85laEKKU8SnGUK5/g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/types": "5.16.0", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -3390,9 +3390,9 @@ } }, "node_modules/ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -4014,14 +4014,20 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001317", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001317.tgz", - "integrity": "sha512-xIZLh8gBm4dqNX0gkzrBeyI86J2eCjWzYAs40q88smG844YIrN4tVQl/RhquHvKEKImWWFIVh1Lxe5n1G/N+GQ==", + "version": "1.0.30001320", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001320.tgz", + "integrity": "sha512-MWPzG54AGdo3nWx7zHZTefseM5Y1ccM7hlQKHRqJkPozUaw3hNbBTMmLn16GG2FUzjR13Cr3NPfhIieX5PzXDA==", "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] }, "node_modules/chalk": { "version": "2.4.2", @@ -5003,9 +5009,9 @@ ] }, "node_modules/domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "dependencies": { "domelementtype": "^2.2.0" @@ -5038,9 +5044,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.85", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.85.tgz", - "integrity": "sha512-K9AsQ41WS2bjZUFpRWfvaS4RjEcRCamEkBJN1Z1TQILBfP1H8QnJ9ti0wiLiMv0sRjX3EHKzgs9jDnmGFx2jXg==", + "version": "1.4.92", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.92.tgz", + "integrity": "sha512-YAVbvQIcDE/IJ/vzDMjD484/hsRbFPW2qXJPaYTfOhtligmfYEYOep+5QojpaEU9kq6bMvNeC2aG7arYvTHYsA==", "dev": true }, "node_modules/emoji-regex": { @@ -7367,13 +7373,10 @@ "dev": true }, "node_modules/json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, "bin": { "json5": "lib/cli.js" }, @@ -7924,9 +7927,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "node_modules/minipass": { @@ -8156,9 +8159,9 @@ "optional": true }, "node_modules/node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", + "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", "dev": true, "engines": { "node": ">= 6.13.0" @@ -8327,6 +8330,19 @@ "node": "^12.13.0 || ^14.15.0 || >=16" } }, + "node_modules/npm-registry-fetch/node_modules/@npmcli/fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.0.tgz", + "integrity": "sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -8337,18 +8353,18 @@ } }, "node_modules/npm-registry-fetch/node_modules/cacache": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.1.tgz", - "integrity": "sha512-tHPtfdZDqQpZ15eaEZeLspIqS5mK5fOBDZi6AjuqaIi53QNVXH3dQv6uKT3YuUu6uxV/8pjU9in0CoJ8fgaHqw==", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.3.tgz", + "integrity": "sha512-eC7wYodNCVb97kuHGk5P+xZsvUJHkhSEOyNwkenqQPAsOtrTjvWOE5vSPNBpz9d8X3acIf6w2Ub5s4rvOCTs4g==", "dev": true, "dependencies": { - "@npmcli/fs": "^1.0.0", + "@npmcli/fs": "^2.1.0", "@npmcli/move-file": "^1.1.2", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "glob": "^7.2.0", "infer-owner": "^1.0.4", - "lru-cache": "^7.5.1", + "lru-cache": "^7.7.1", "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", @@ -8362,7 +8378,7 @@ "unique-filename": "^1.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { @@ -8380,9 +8396,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/lru-cache": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.5.1.tgz", - "integrity": "sha512-q1TS8IqKvcg3aScamKCHpepSrHF537Ww7nHahBOxhDu9D2YoBXAsj/7uFdZFj1xJr9LmyeJ62AdyofCHafUbIA==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.7.1.tgz", + "integrity": "sha512-cRffBiTW8s73eH4aTXqBcTLU0xQnwGV3/imttRHGWCrbergmnK4D6JXQd8qin5z43HnDwRI+o7mVW0LEB+tpAw==", "dev": true, "engines": { "node": ">=12" @@ -9038,12 +9054,12 @@ } }, "node_modules/portfinder/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "dependencies": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" @@ -9137,9 +9153,9 @@ } }, "node_modules/postcss-custom-properties": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.4.tgz", - "integrity": "sha512-i6AytuTCoDLJkWN/MtAIGriJz3j7UX6bV7Z5t+KgFz+dwZS15/mlTJY1S0kRizlk6ba0V8u8hN50Fz5Nm7tdZw==", + "version": "12.1.5", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.5.tgz", + "integrity": "sha512-FHbbB/hRo/7cxLGkc2NS7cDRIDN1oFqQnUKBiyh4b/gwk8DD8udvmRDpUhEK836kB8ggUCieHVOvZDnF9XhI3g==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -9198,9 +9214,9 @@ } }, "node_modules/postcss-env-function": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.5.tgz", - "integrity": "sha512-gPUJc71ji9XKyl0WSzAalBeEA/89kU+XpffpPxSaaaZ1c48OL36r1Ep5R6+9XAPkIiDlSvVAwP4io12q/vTcvA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -11272,13 +11288,13 @@ } }, "node_modules/webpack": { - "version": "5.67.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", - "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", @@ -11286,7 +11302,7 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", + "enhanced-resolve": "^5.9.2", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -11713,9 +11729,9 @@ } }, "node_modules/yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.0.tgz", + "integrity": "sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA==", "dev": true, "dependencies": { "cliui": "^7.0.2", @@ -11769,12 +11785,12 @@ } }, "@angular-devkit/architect": { - "version": "0.1302.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1302.6.tgz", - "integrity": "sha512-NztzorUMfwJeRaT7SY00Y8WSqc2lQYuF11yNoyEm7Dae3V7VZ28rW2Z9RwibP27rYQL0RjSMaz2wKITHX2vOAw==", + "version": "0.1303.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.0.tgz", + "integrity": "sha512-kTcKB917ICA8j53SGo4gn+qAlzx8si+iHnOTbp5QlMr7qt/Iz07SVVI8mRlMD6c6lr7eE/fVlCLzEZ1+WCQpTA==", "dev": true, "requires": { - "@angular-devkit/core": "13.2.6", + "@angular-devkit/core": "13.3.0", "rxjs": "6.6.7" }, "dependencies": { @@ -11796,15 +11812,15 @@ } }, "@angular-devkit/build-angular": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.2.6.tgz", - "integrity": "sha512-Y2ojy6xbZ0kwScppcutLHBP8eW0qNOjburTISSBU/L5l/9FOeZ1E7yAreKuVu/qibZiLbSJfAhk+SLwhRHFSSQ==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.3.0.tgz", + "integrity": "sha512-3Ji7EeqGHj7i1Jgmeo3aIEXsnfKyFeQPpl65gcYmHwj5dP4lZzLSU4rMaWWUKksccgqCUXgPI2vKePTPazmikg==", "dev": true, "requires": { "@ampproject/remapping": "1.1.1", - "@angular-devkit/architect": "0.1302.6", - "@angular-devkit/build-webpack": "0.1302.6", - "@angular-devkit/core": "13.2.6", + "@angular-devkit/architect": "0.1303.0", + "@angular-devkit/build-webpack": "0.1303.0", + "@angular-devkit/core": "13.3.0", "@babel/core": "7.16.12", "@babel/generator": "7.16.8", "@babel/helper-annotate-as-pure": "7.16.7", @@ -11815,7 +11831,7 @@ "@babel/runtime": "7.16.7", "@babel/template": "7.16.7", "@discoveryjs/json-ext": "0.5.6", - "@ngtools/webpack": "13.2.6", + "@ngtools/webpack": "13.3.0", "ansi-colors": "4.1.1", "babel-loader": "8.2.3", "babel-plugin-istanbul": "6.1.1", @@ -11861,7 +11877,7 @@ "text-table": "0.2.0", "tree-kill": "1.2.2", "tslib": "2.3.1", - "webpack": "5.67.0", + "webpack": "5.70.0", "webpack-dev-middleware": "5.3.0", "webpack-dev-server": "4.7.3", "webpack-merge": "5.8.0", @@ -11888,12 +11904,12 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1302.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1302.6.tgz", - "integrity": "sha512-TYEh2n9tPe932rEIgdiSpojOqtDppW2jzb/empVqCkLF7WUZsXKvTanttZC34L6R2VD6SAGWhb6JDg75ghUVYA==", + "version": "0.1303.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.0.tgz", + "integrity": "sha512-a+Veg2oYn3RM2Kl148BReuONmD1kjbbYBnMUVi8nD6rvJPStFZkqN5s5ZkYybKeWnzMGaB3VasKR88z5XeH22A==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1302.6", + "@angular-devkit/architect": "0.1303.0", "rxjs": "6.6.7" }, "dependencies": { @@ -11915,9 +11931,9 @@ } }, "@angular-devkit/core": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.2.6.tgz", - "integrity": "sha512-8h2mWdBTN/dYwZuzKMg2IODlOWMdbJcpQG4XVrkk9ejCPP+3aX5Aa3glCe/voN6eBNiRfs8YDM0jxmpN2aWVtg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.0.tgz", + "integrity": "sha512-8YrreVbWlJVZnk5zs4vfkRItrPEtWhUcxWOBfYT/Kwu4FwJVAnNuhJAxxXOAQ2Ckd7cv30Idh/RFVLbTZ5Gs9w==", "dev": true, "requires": { "ajv": "8.9.0", @@ -11958,12 +11974,12 @@ } }, "@angular-devkit/schematics": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.2.6.tgz", - "integrity": "sha512-mPgSqdnZRuPSMeUA+T+mwVCrq2yhXpcYm1/Rjbhy09CyHs4wSrFv21WHCrE6shlvXpcmwr0n+I0DIeagAPmjUA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.0.tgz", + "integrity": "sha512-hq7tqnB3uVT/iDgqWWZ4kvnijeAcgd4cfLzZiCPaYn1nuhZf0tWsho6exhJ/odMZHvVp7w8OibqWiUKxNY9zHA==", "dev": true, "requires": { - "@angular-devkit/core": "13.2.6", + "@angular-devkit/core": "13.3.0", "jsonc-parser": "3.0.0", "magic-string": "0.25.7", "ora": "5.4.1", @@ -11988,32 +12004,32 @@ } }, "@angular/animations": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.2.6.tgz", - "integrity": "sha512-DrjpKo68uR3lSLQQXosoTCbjKQS6IKRCpR14E2t8fo0AX8i2hkB8je4SrhdCyB7FgFN7l2kgUYo4Qa8+BOB+aA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.3.0.tgz", + "integrity": "sha512-q7hkImhHCv0QdriR8HOFhsAW05QDmvapcHrBv3y862LUTR5e90/+81RYuwFuKX1lk/sa7LiHlHHWC7oCspzr2Q==", "requires": { "tslib": "^2.3.0" } }, "@angular/cdk": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.2.6.tgz", - "integrity": "sha512-epuXmaHqfukwPsYvIksbuHLXDtb6GALV2Vgv6W2asj4TorD584CeQTs0EcdPGmCzhGUYI8U8QV63WOxu9YFcNA==", + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-13.3.1.tgz", + "integrity": "sha512-JUCvhN6XomY5JOMH7Qyj/JodAuAtKgLlJYKs0tPmjCkGcBdR/T3/hOJ9gSRhz8PCOoiEORj+3xCh547oJRyesA==", "requires": { "parse5": "^5.0.0", "tslib": "^2.3.0" } }, "@angular/cli": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.2.6.tgz", - "integrity": "sha512-xIjEaQI5sWemXXc7GXLm4u9UL5sjtrQL/y1PJvvk/Jsa8+kIT+MutOfZfC7zcdAh9fqHd8mokH3guFV8BJdFxA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.3.0.tgz", + "integrity": "sha512-2qCKP/QsyxrJnpd3g4P/iTQ4TjI04N8r+bG5YLLfudoMDsQ/Ti4ogdI7PBeG2IMbRylZW9XLjHraWG42+Y9tWw==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1302.6", - "@angular-devkit/core": "13.2.6", - "@angular-devkit/schematics": "13.2.6", - "@schematics/angular": "13.2.6", + "@angular-devkit/architect": "0.1303.0", + "@angular-devkit/core": "13.3.0", + "@angular-devkit/schematics": "13.3.0", + "@schematics/angular": "13.3.0", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.3.3", @@ -12032,25 +12048,25 @@ } }, "@angular/common": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.2.6.tgz", - "integrity": "sha512-t4XRb9db4UeRcPs5aHNtGuXRKSvGBlTEr0zzSeoKzHD9TCaO4dSDISh9obS9hThaPuBmPKRUHN5KE1HFmqnSHg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.3.0.tgz", + "integrity": "sha512-yl09TWBmz++Z3MKjzZIwU2wZHiedCn1DjGILjjNXegHFOfINRHiqLhHca4kGWFcTsdvcuEhd9Hk9JATqi45rjg==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.2.6.tgz", - "integrity": "sha512-LHU29J2/c/03WHkwtzUSElTBsXbzkKdYARodnNfsFdLPsWhyvzO3cqlcZYteFJxEy3dVH+ZrYDjqQ9Sp17aIgA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.3.0.tgz", + "integrity": "sha512-oeUvaBOVpey2G1I5fWZa3JcyRuBQ3dAeRay5UtQhu1Xw2L8jd2tYkbZb1XOgP9J1/Ma4LO62pjSaOpR2EtO5ww==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.6.tgz", - "integrity": "sha512-QtlLKj3m6a2nkewFxhg+a3tQ2gEIBzMfI2c1laWUfAfJJ56phj79k8Z/kf2HQxypphWixyTK+ugpTlMdvvOquA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.3.0.tgz", + "integrity": "sha512-f9m55YejHJNIDTwHyGwf3wn5AvZepDfdAgeJP0Re4XmO1mf/Z9Ob5mJP5Q1yLNhqk0DlURWsZ1CbJqufPXMTbQ==", "dev": true, "requires": { "@babel/core": "^7.17.2", @@ -12075,9 +12091,9 @@ } }, "@babel/core": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.7.tgz", - "integrity": "sha512-djHlEfFHnSnTAcPb7dATbiM5HxGOP98+3JLBZtjRb5I7RXrw7kFRoG2dXM8cm3H+o11A8IFH/uprmJpwFynRNQ==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", @@ -12085,8 +12101,8 @@ "@babel/generator": "^7.17.7", "@babel/helper-compilation-targets": "^7.17.7", "@babel/helper-module-transforms": "^7.17.7", - "@babel/helpers": "^7.17.7", - "@babel/parser": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", "@babel/template": "^7.16.7", "@babel/traverse": "^7.17.3", "@babel/types": "^7.17.0", @@ -12134,57 +12150,57 @@ } }, "@angular/core": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.2.6.tgz", - "integrity": "sha512-ctWsxuaSO3d3afLW+wkJSyiEIA2uhaTKNps9x5wz/oZJDaUDYVa4PM4x7/UHn2bXzBjXjN9LSW8h9F31iwmcTg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.3.0.tgz", + "integrity": "sha512-ZnuIMEK8YFBtthNqrxapYolMp6qRy4Yp/VG+M11YNiuBp/BoYYDjTaknwO8vu36Cn6372zWjcibsknkZMjdBkg==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.2.6.tgz", - "integrity": "sha512-3IikvNtO0RBiGb2AWl8aYcE3ivXHPIJz+JOn9Wz9XXSkYx75D3GjuJlz+fVIgz+7Q7tJuS6Q2E5qat/ldeDmoA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.3.0.tgz", + "integrity": "sha512-eBySo+B3/AV+p3SmD15Tg41N+SoxYPyqGnlCTR+jSrFis5ZZNWf0kKpIKhJhW2taRq6K+1o3KcA0W9bnphrZDQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/material": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.2.6.tgz", - "integrity": "sha512-/h5wa/tXE0DMIIEQX+rozFkUWHYUWg1Xf1R2tXUFLslLQ0KRCGyNo225Sv/1wrxXHxfrML787lA9ex4p90Feqw==", + "version": "13.3.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-13.3.1.tgz", + "integrity": "sha512-c9BYNxvZvxuCA5QticqfEhn3nuspUnwxIVejjO5ZTqKlkK+vQGKN3QhshHLrMHeFYyjao/E8jVnJX7ahitPM9w==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.2.6.tgz", - "integrity": "sha512-Gc/1TqysW+P+K3NeQihmHWs4KF1mjJT20s06r+YcETnPP11uPk+UxQl7gJNsDV587DYO/wT3oISXVpRw4UJhdQ==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.3.0.tgz", + "integrity": "sha512-OgNVgRtqTPxzItZbJVe4NmSYKDLEKQYjGulStWl4ycQTsOKteF+sJi8gU5BvEU/KQNZItYnIQxMqTsFyS7xlRQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.2.6.tgz", - "integrity": "sha512-m77+pzwZw+4kiRhxzrj1kE3N1K82I8Xt+vEBKSL2Xv42hCX0T37erC6KlztFEDj4A68s5+/0C5vfwhEiDcr/Cw==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.3.0.tgz", + "integrity": "sha512-7/r79Yn8SDH8t0/fJ26PmScm/S1JZ9hxjC8IoROdyC5xBrSGrp946mIKE/4/813zmF8uPj2lveV9p/XiKTbxSw==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.2.6.tgz", - "integrity": "sha512-dA9vL4mPLp+iNegzuvm9FaEWirFI2ZK3WQgbdoxoIpneym+BxRTkNDzPcvEaqfUf7eDGRBqlWakFDrd+H2QEbg==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.3.0.tgz", + "integrity": "sha512-Kz657mtycup+s9emRH66etkBobAF26h3UDXE9pnjUM6MuVTA38P31WyTWKyWJVk8Oruxm/hTHZZBfI88o9/1sA==", "requires": { "tslib": "^2.3.0" } }, "@angular/service-worker": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-13.2.6.tgz", - "integrity": "sha512-RVzIw+HOt57+4Ns1zlyNK60vbogH1Ns1ZRxIElpbgh96YlDgJHB2H2t7GcXlJzVRRl63G0kptqspUo5nr5ucZA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-13.3.0.tgz", + "integrity": "sha512-776tmgsQ09pLWWMhp1dMpN2t8wDn/H0gXH9AtFbJPcqBxAbkwFvNYZ72uJQq1pZLvPJfickC/LnLIDCo5JFrCQ==", "requires": { "tslib": "^2.3.0" } @@ -12526,9 +12542,9 @@ } }, "@babel/helpers": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.7.tgz", - "integrity": "sha512-TKsj9NkjJfTBxM7Phfy7kv6yYc4ZcOo+AaWGqQOKTPDOmcGkIFb5xNA746eKisQkm4yavUYh4InYM9S+VnO01w==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz", + "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==", "dev": true, "requires": { "@babel/template": "^7.16.7", @@ -12548,9 +12564,9 @@ } }, "@babel/parser": { - "version": "7.17.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.7.tgz", - "integrity": "sha512-bm3AQf45vR4gKggRfvJdYJ0gFLoCbsPxiFLSH6hTVYABptNHY6l9NrhnucVjQ/X+SPtLANT9lc0fFhikj+VBRA==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz", + "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -13020,13 +13036,13 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", - "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.16.7", - "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", "@babel/helper-plugin-utils": "^7.16.7", "@babel/helper-validator-identifier": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" @@ -13525,9 +13541,9 @@ } }, "@ngtools/webpack": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.6.tgz", - "integrity": "sha512-N8SvRV91+/57TcAfbghc0k0tKCukw/7KqbDaLPAQTGFekJ4xMGT3elMzOyBXTH3Hvp5HL8/hiBt2tG04qiMf+w==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.0.tgz", + "integrity": "sha512-QbTQWXK2WzYU+aKKVDG0ya7WYT+6rNAUXVt5ov9Nz1SGgDeozpiOx8ZqPWUvnToTY8EoodwWFGCVtkLHXUR+wA==", "dev": true, "requires": {} }, @@ -13631,13 +13647,13 @@ } }, "@schematics/angular": { - "version": "13.2.6", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.2.6.tgz", - "integrity": "sha512-8NzHMX9+FSgaB0lJYxlTJv9OcBuolwZJqo9M/yX3RPSqSHghA33jWwgVbV551hBJOpbVEePerG1DQkIC99DXKA==", + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.3.0.tgz", + "integrity": "sha512-WND6DXWf0ZFefqlC2hUm1FzHDonRfGpDEPWVhVulhYkB7IUUaXuCz8K41HAScyJ3bxUngs2Lx9+4omikc05fxA==", "dev": true, "requires": { - "@angular-devkit/core": "13.2.6", - "@angular-devkit/schematics": "13.2.6", + "@angular-devkit/core": "13.3.0", + "@angular-devkit/schematics": "13.3.0", "jsonc-parser": "3.0.0" } }, @@ -13730,9 +13746,9 @@ } }, "@types/estree": { - "version": "0.0.50", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", - "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", "dev": true }, "@types/express": { @@ -13768,9 +13784,9 @@ } }, "@types/json-schema": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", - "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz", + "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==", "dev": true }, "@types/mime": { @@ -13780,9 +13796,9 @@ "dev": true }, "@types/node": { - "version": "17.0.21", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", - "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", + "version": "17.0.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", "dev": true }, "@types/parse-json": { @@ -13847,14 +13863,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.15.0.tgz", - "integrity": "sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.16.0.tgz", + "integrity": "sha512-SJoba1edXvQRMmNI505Uo4XmGbxCK9ARQpkvOd00anxzri9RNQk0DDCxD+LIl+jYhkzOJiOMMKYEHnHEODjdCw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.15.0", - "@typescript-eslint/type-utils": "5.15.0", - "@typescript-eslint/utils": "5.15.0", + "@typescript-eslint/scope-manager": "5.16.0", + "@typescript-eslint/type-utils": "5.16.0", + "@typescript-eslint/utils": "5.16.0", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -13864,52 +13880,52 @@ } }, "@typescript-eslint/parser": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.15.0.tgz", - "integrity": "sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.16.0.tgz", + "integrity": "sha512-fkDq86F0zl8FicnJtdXakFs4lnuebH6ZADDw6CYQv0UZeIjHvmEw87m9/29nk2Dv5Lmdp0zQ3zDQhiMWQf/GbA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.15.0", - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/typescript-estree": "5.15.0", + "@typescript-eslint/scope-manager": "5.16.0", + "@typescript-eslint/types": "5.16.0", + "@typescript-eslint/typescript-estree": "5.16.0", "debug": "^4.3.2" } }, "@typescript-eslint/scope-manager": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.15.0.tgz", - "integrity": "sha512-EFiZcSKrHh4kWk0pZaa+YNJosvKE50EnmN4IfgjkA3bTHElPtYcd2U37QQkNTqwMCS7LXeDeZzEqnsOH8chjSg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.16.0.tgz", + "integrity": "sha512-P+Yab2Hovg8NekLIR/mOElCDPyGgFZKhGoZA901Yax6WR6HVeGLbsqJkZ+Cvk5nts/dAlFKm8PfL43UZnWdpIQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/visitor-keys": "5.15.0" + "@typescript-eslint/types": "5.16.0", + "@typescript-eslint/visitor-keys": "5.16.0" } }, "@typescript-eslint/type-utils": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.15.0.tgz", - "integrity": "sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.16.0.tgz", + "integrity": "sha512-SKygICv54CCRl1Vq5ewwQUJV/8padIWvPgCxlWPGO/OgQLCijY9G7lDu6H+mqfQtbzDNlVjzVWQmeqbLMBLEwQ==", "dev": true, "requires": { - "@typescript-eslint/utils": "5.15.0", + "@typescript-eslint/utils": "5.16.0", "debug": "^4.3.2", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.15.0.tgz", - "integrity": "sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.16.0.tgz", + "integrity": "sha512-oUorOwLj/3/3p/HFwrp6m/J2VfbLC8gjW5X3awpQJ/bSG+YRGFS4dpsvtQ8T2VNveV+LflQHjlLvB6v0R87z4g==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.15.0.tgz", - "integrity": "sha512-Hb0e3dGc35b75xLzixM3cSbG1sSbrTBQDfIScqdyvrfJZVEi4XWAT+UL/HMxEdrJNB8Yk28SKxPLtAhfCbBInA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.16.0.tgz", + "integrity": "sha512-SE4VfbLWUZl9MR+ngLSARptUv2E8brY0luCdgmUevU6arZRY/KxYoLI/3V/yxaURR8tLRN7bmZtJdgmzLHI6pQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/visitor-keys": "5.15.0", + "@typescript-eslint/types": "5.16.0", + "@typescript-eslint/visitor-keys": "5.16.0", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -13918,26 +13934,26 @@ } }, "@typescript-eslint/utils": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.15.0.tgz", - "integrity": "sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.16.0.tgz", + "integrity": "sha512-iYej2ER6AwmejLWMWzJIHy3nPJeGDuCqf8Jnb+jAQVoPpmWzwQOfa9hWVB8GIQE5gsCv/rfN4T+AYb/V06WseQ==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.15.0", - "@typescript-eslint/types": "5.15.0", - "@typescript-eslint/typescript-estree": "5.15.0", + "@typescript-eslint/scope-manager": "5.16.0", + "@typescript-eslint/types": "5.16.0", + "@typescript-eslint/typescript-estree": "5.16.0", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/visitor-keys": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.15.0.tgz", - "integrity": "sha512-+vX5FKtgvyHbmIJdxMJ2jKm9z2BIlXJiuewI8dsDYMp5LzPUcuTT78Ya5iwvQg3VqSVdmxyM8Anj1Jeq7733ZQ==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.16.0.tgz", + "integrity": "sha512-jqxO8msp5vZDhikTwq9ubyMHqZ67UIvawohr4qF3KhlpL7gzSjOd+8471H3nh5LyABkaI85laEKKU8SnGUK5/g==", "dev": true, "requires": { - "@typescript-eslint/types": "5.15.0", + "@typescript-eslint/types": "5.16.0", "eslint-visitor-keys": "^3.0.0" } }, @@ -14207,9 +14223,9 @@ } }, "ajv": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz", - "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -14665,9 +14681,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001317", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001317.tgz", - "integrity": "sha512-xIZLh8gBm4dqNX0gkzrBeyI86J2eCjWzYAs40q88smG844YIrN4tVQl/RhquHvKEKImWWFIVh1Lxe5n1G/N+GQ==", + "version": "1.0.30001320", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001320.tgz", + "integrity": "sha512-MWPzG54AGdo3nWx7zHZTefseM5Y1ccM7hlQKHRqJkPozUaw3hNbBTMmLn16GG2FUzjR13Cr3NPfhIieX5PzXDA==", "dev": true }, "chalk": { @@ -15394,9 +15410,9 @@ "dev": true }, "domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", "dev": true, "requires": { "domelementtype": "^2.2.0" @@ -15420,9 +15436,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.85", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.85.tgz", - "integrity": "sha512-K9AsQ41WS2bjZUFpRWfvaS4RjEcRCamEkBJN1Z1TQILBfP1H8QnJ9ti0wiLiMv0sRjX3EHKzgs9jDnmGFx2jXg==", + "version": "1.4.92", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.92.tgz", + "integrity": "sha512-YAVbvQIcDE/IJ/vzDMjD484/hsRbFPW2qXJPaYTfOhtligmfYEYOep+5QojpaEU9kq6bMvNeC2aG7arYvTHYsA==", "dev": true }, "emoji-regex": { @@ -17074,13 +17090,10 @@ "dev": true }, "json5": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", - "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true }, "jsonc-parser": { "version": "3.0.0", @@ -17481,9 +17494,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", "dev": true }, "minipass": { @@ -17664,9 +17677,9 @@ "optional": true }, "node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz", + "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==", "dev": true }, "node-gyp": { @@ -17794,6 +17807,16 @@ "npm-package-arg": "^8.1.5" }, "dependencies": { + "@npmcli/fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.0.tgz", + "integrity": "sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, "@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -17801,18 +17824,18 @@ "dev": true }, "cacache": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.1.tgz", - "integrity": "sha512-tHPtfdZDqQpZ15eaEZeLspIqS5mK5fOBDZi6AjuqaIi53QNVXH3dQv6uKT3YuUu6uxV/8pjU9in0CoJ8fgaHqw==", + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.3.tgz", + "integrity": "sha512-eC7wYodNCVb97kuHGk5P+xZsvUJHkhSEOyNwkenqQPAsOtrTjvWOE5vSPNBpz9d8X3acIf6w2Ub5s4rvOCTs4g==", "dev": true, "requires": { - "@npmcli/fs": "^1.0.0", + "@npmcli/fs": "^2.1.0", "@npmcli/move-file": "^1.1.2", "chownr": "^2.0.0", "fs-minipass": "^2.1.0", "glob": "^7.2.0", "infer-owner": "^1.0.4", - "lru-cache": "^7.5.1", + "lru-cache": "^7.7.1", "minipass": "^3.1.6", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", @@ -17838,9 +17861,9 @@ } }, "lru-cache": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.5.1.tgz", - "integrity": "sha512-q1TS8IqKvcg3aScamKCHpepSrHF537Ww7nHahBOxhDu9D2YoBXAsj/7uFdZFj1xJr9LmyeJ62AdyofCHafUbIA==", + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.7.1.tgz", + "integrity": "sha512-cRffBiTW8s73eH4aTXqBcTLU0xQnwGV3/imttRHGWCrbergmnK4D6JXQd8qin5z43HnDwRI+o7mVW0LEB+tpAw==", "dev": true }, "make-fetch-happen": { @@ -18350,12 +18373,12 @@ } }, "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "requires": { - "minimist": "^1.2.5" + "minimist": "^1.2.6" } } } @@ -18415,9 +18438,9 @@ "requires": {} }, "postcss-custom-properties": { - "version": "12.1.4", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.4.tgz", - "integrity": "sha512-i6AytuTCoDLJkWN/MtAIGriJz3j7UX6bV7Z5t+KgFz+dwZS15/mlTJY1S0kRizlk6ba0V8u8hN50Fz5Nm7tdZw==", + "version": "12.1.5", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.5.tgz", + "integrity": "sha512-FHbbB/hRo/7cxLGkc2NS7cDRIDN1oFqQnUKBiyh4b/gwk8DD8udvmRDpUhEK836kB8ggUCieHVOvZDnF9XhI3g==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" @@ -18452,9 +18475,9 @@ } }, "postcss-env-function": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.5.tgz", - "integrity": "sha512-gPUJc71ji9XKyl0WSzAalBeEA/89kU+XpffpPxSaaaZ1c48OL36r1Ep5R6+9XAPkIiDlSvVAwP4io12q/vTcvA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", "dev": true, "requires": { "postcss-value-parser": "^4.2.0" @@ -19968,13 +19991,13 @@ } }, "webpack": { - "version": "5.67.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.67.0.tgz", - "integrity": "sha512-LjFbfMh89xBDpUMgA1W9Ur6Rn/gnr2Cq1jjHFPo4v6a79/ypznSYbAyPgGhwsxBtMIaEmDD1oJoA7BEYw/Fbrw==", + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.50", + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/wasm-edit": "1.11.1", "@webassemblyjs/wasm-parser": "1.11.1", @@ -19982,7 +20005,7 @@ "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.8.3", + "enhanced-resolve": "^5.9.2", "es-module-lexer": "^0.9.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -20271,9 +20294,9 @@ "dev": true }, "yargs": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", - "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.0.tgz", + "integrity": "sha512-WJudfrk81yWFSOkZYpAZx4Nt7V4xp7S/uJkX0CnxovMCt1wCE8LNftPpNuF9X/u9gN5nsD7ycYtRcDf2pL3UiA==", "dev": true, "requires": { "cliui": "^7.0.2", diff --git a/client/package.json b/client/package.json index 66a626b..2a6aae3 100644 --- a/client/package.json +++ b/client/package.json @@ -1,28 +1,28 @@ { "author": "Chrystian Huot ", "dependencies": { - "@angular/animations": "^13.2.6", - "@angular/cdk": "^13.2.6", - "@angular/common": "~13.2.6", - "@angular/compiler": "~13.2.6", - "@angular/core": "~13.2.6", - "@angular/forms": "~13.2.6", - "@angular/material": "^13.2.6", - "@angular/platform-browser": "~13.2.6", - "@angular/platform-browser-dynamic": "~13.2.6", - "@angular/router": "^13.2.6", - "@angular/service-worker": "^13.2.6", + "@angular/animations": "^13.3.0", + "@angular/cdk": "^13.3.1", + "@angular/common": "~13.3.0", + "@angular/compiler": "~13.3.0", + "@angular/core": "~13.3.0", + "@angular/forms": "~13.3.0", + "@angular/material": "^13.3.1", + "@angular/platform-browser": "~13.3.0", + "@angular/platform-browser-dynamic": "~13.3.0", + "@angular/router": "^13.3.0", + "@angular/service-worker": "^13.3.0", "rxjs": "~7.4.0", "tslib": "^2.3.1", "zone.js": "~0.11.5" }, "devDependencies": { - "@angular-devkit/build-angular": "^13.2.6", - "@angular/cli": "^13.2.6", - "@angular/compiler-cli": "~13.2.6", - "@types/node": "^17.0.21", - "@typescript-eslint/eslint-plugin": "^5.15.0", - "@typescript-eslint/parser": "^5.15.0", + "@angular-devkit/build-angular": "^13.3.0", + "@angular/cli": "^13.3.0", + "@angular/compiler-cli": "~13.3.0", + "@types/node": "^17.0.23", + "@typescript-eslint/eslint-plugin": "^5.16.0", + "@typescript-eslint/parser": "^5.16.0", "ajv-keywords": "^5.1.0", "eslint": "^8.11.0", "ts-node": "~10.7.0", @@ -38,5 +38,5 @@ "build": "ng build --base-href ./ --configuration production", "start": "ng serve" }, - "version": "6.1.16" + "version": "6.2.0" } diff --git a/client/src/app/components/rdio-scanner/admin/admin.service.ts b/client/src/app/components/rdio-scanner/admin/admin.service.ts index 20098fe..11f92a0 100644 --- a/client/src/app/components/rdio-scanner/admin/admin.service.ts +++ b/client/src/app/components/rdio-scanner/admin/admin.service.ts @@ -135,8 +135,10 @@ export interface Options { disableDuplicateDetection?: boolean; duplicateDetectionTimeFrame?: number; keypadBeeps?: string; + maxClients?: number; pruneDays?: number; searchPatchedTalkgroups?: boolean; + showListenersCount?: boolean; sortTalkgroups?: boolean; tagsToggle?: boolean; } @@ -495,8 +497,10 @@ export class RdioScannerAdminService implements OnDestroy { disableDuplicateDetection: [options?.disableDuplicateDetection], duplicateDetectionTimeFrame: [options?.duplicateDetectionTimeFrame, [Validators.required, Validators.min(0)]], keypadBeeps: [options?.keypadBeeps, Validators.required], + maxClients: [options?.maxClients, [Validators.required, Validators.min(1)]], pruneDays: [options?.pruneDays, [Validators.required, Validators.min(0)]], searchPatchedTalkgroups: [options?.searchPatchedTalkgroups], + showListenersCount: [options?.showListenersCount], sortTalkgroups: [options?.sortTalkgroups], tagsToggle: [options?.tagsToggle], }); diff --git a/client/src/app/components/rdio-scanner/admin/config/options/options.component.html b/client/src/app/components/rdio-scanner/admin/config/options/options.component.html index 1f00b2a..85671ac 100644 --- a/client/src/app/components/rdio-scanner/admin/config/options/options.component.html +++ b/client/src/app/components/rdio-scanner/admin/config/options/options.component.html @@ -72,6 +72,21 @@ +
+

+ Max Clients
+ Max number of simultaneous clients. +

+ + + + Max clients is required + + + Max clients is invalid + + +

Prune Days
@@ -97,6 +112,15 @@

+
+

+ Show Listeners Count
+ Show listeners count on main screen. +

+
+ +
+

Sort Talkgroups
diff --git a/client/src/app/components/rdio-scanner/main/main.component.html b/client/src/app/components/rdio-scanner/main/main.component.html index 6c2897e..fa727e9 100644 --- a/client/src/app/components/rdio-scanner/main/main.component.html +++ b/client/src/app/components/rdio-scanner/main/main.component.html @@ -9,6 +9,9 @@

NO LINK
+
+ L: {{ listeners }} +
Q: {{ callQueue }}
diff --git a/client/src/app/components/rdio-scanner/main/main.component.ts b/client/src/app/components/rdio-scanner/main/main.component.ts index 2ff6b32..e0005ab 100644 --- a/client/src/app/components/rdio-scanner/main/main.component.ts +++ b/client/src/app/components/rdio-scanner/main/main.component.ts @@ -88,6 +88,8 @@ export class RdioScannerMainComponent implements OnDestroy, OnInit { linked = false; + listeners = 0; + livefeedOffline = true; livefeedOnline = false; livefeedPaused = false; @@ -98,6 +100,10 @@ export class RdioScannerMainComponent implements OnDestroy, OnInit { playbackMode = false; + get showListenersCount(): boolean { + return this.config?.showListenersCount || false; + } + @Output() openSearchPanel = new EventEmitter(); @Output() openSelectPanel = new EventEmitter(); @@ -381,6 +387,10 @@ export class RdioScannerMainComponent implements OnDestroy, OnInit { this.linked = event.linked || false; } + if ('listeners' in event) { + this.listeners = event.listeners || 0; + } + if ('map' in event) { this.map = event.map || {}; } diff --git a/client/src/app/components/rdio-scanner/rdio-scanner.service.ts b/client/src/app/components/rdio-scanner/rdio-scanner.service.ts index 4fc7400..6f33f02 100644 --- a/client/src/app/components/rdio-scanner/rdio-scanner.service.ts +++ b/client/src/app/components/rdio-scanner/rdio-scanner.service.ts @@ -51,6 +51,7 @@ enum WebsocketCommand { Config = 'CFG', Expired = 'XPR', ListCall = 'LCL', + ListenersCount = 'LSC', LivefeedMap = 'LFM', Max = 'MAX', Pin = 'PIN', @@ -79,6 +80,7 @@ export class RdioScannerService implements OnDestroy { dimmerDelay: false, groups: {}, keypadBeeps: false, + showListenersCount: false, systems: [], tags: {}, tagsToggle: false, @@ -828,9 +830,10 @@ export class RdioScannerService implements OnDestroy { dimmerDelay: typeof config.dimmerDelay === 'number' ? config.dimmerDelay : 5000, groups: typeof config.groups !== null && typeof config.groups === 'object' ? config.groups : {}, keypadBeeps: config.keypadBeeps !== null && typeof config.keypadBeeps === 'object' ? config.keypadBeeps : {}, + showListenersCount: typeof config.showListenersCount === 'boolean' ? config.showListenersCount : false, systems: Array.isArray(config.systems) ? config.systems.slice() : [], tags: typeof config.tags !== null && typeof config.tags === 'object' ? config.tags : {}, - tagsToggle: typeof config.tagsToggle !== null && typeof config.tagsToggle === 'boolean' ? config.tagsToggle : false, + tagsToggle: typeof config.tagsToggle === 'boolean' ? config.tagsToggle : false, }; this.rebuildLivefeedMap(); @@ -871,6 +874,11 @@ export class RdioScannerService implements OnDestroy { break; + case WebsocketCommand.ListenersCount: + this.event.emit({ listeners: message[1] }); + + break; + case WebsocketCommand.Max: this.event.emit({ auth: true, tooMany: true }); diff --git a/client/src/app/components/rdio-scanner/rdio-scanner.ts b/client/src/app/components/rdio-scanner/rdio-scanner.ts index a25b8a4..89a75a7 100644 --- a/client/src/app/components/rdio-scanner/rdio-scanner.ts +++ b/client/src/app/components/rdio-scanner/rdio-scanner.ts @@ -92,6 +92,7 @@ export interface RdioScannerConfig { dimmerDelay: number | false; groups: { [key: string]: { [key: number]: number[] } }; keypadBeeps: RdioScannerKeypadBeeps | false; + showListenersCount: boolean; systems: RdioScannerSystem[]; tags: { [key: string]: { [key: number]: number[] } }; tagsToggle: boolean; @@ -106,6 +107,7 @@ export interface RdioScannerEvent { holdSys?: boolean; holdTg?: boolean; linked?: boolean; + listeners?: number; livefeedMode?: RdioScannerLivefeedMode; map?: RdioScannerLivefeedMap; pause?: boolean; diff --git a/docs/images/twitter-badge.png b/docs/images/twitter-badge.png new file mode 100644 index 0000000000000000000000000000000000000000..4adf2dc06f0f5e286396c594986a9207d4e1050c GIT binary patch literal 3505 zcmV;i4NmfjP)pF8FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H14L(Uk zK~#90?VM?FRM(Y&zx&?nMQXKL2rycZ2xc__5*D)vfeo>lI2juc4goWhnwhYaC#f*; z%w!?Np0VSKlgVaJ>?9R1j^o5}2um=Scw@jp!YpR9StX%;K|*M4_4bxKKVBoXkXj37 zjLX$um8#V5-gEoBbI(2Z-1F+Spg*J(Ih$K&U~xZ?FCat0NWjytY=Q&>r$a!sgi8o{ z03mi(ec5*mA!J`dB5sS6B4=aUa)kUIF!n}kn;=2I2#S$BQnlK*C7vVq>cAs^)jCe7 z@(;j_|5pVQBp4V+r4TEtSNlq?ZRp{^Ih&dnAjMW-_=loef&>GjNl2Dgu1$L@_F^{& z&i!@ET~e?IaD1q$B}gzZbRoE>a&_9?s~0*Qc+|$0(H0y5hTRm^5+oQHP0|!|svq(d z11JDUDJF+R_?~uWdJHt3g3y)Hel#r zM#%IigiVRnOL4=k3BEJS&Cl*gX7v;&KBq!`(Bhs?I5=~~Bwk@JKU*U=Rq6Iu?YH9g z2lzy)!j~tzc&E+)VErsNB`p?yz0dODhsJ21!sKBpxv2_XryyuR#Ohn-Kj*kPeZ?eb z!1D1<(p-Y7_I`w-OiEYD&(;{7sshjy`e@kUhNJN5ww+HtqvdRDn~7lDVCDb$lTL2+ zDSY*R1BA`)ZI91&vtoiX`bn^Env1V|%EfQbhRO6O)cAW&h5%l=$HVaklR%8~9jY^W zT_jf-o~&^1Xa_$%76M@DSO=HE*%}2k z22NFQdxo3G-U;!Sa{U9}??(>FxZF*x(=~)#ay{}cRj_!JgV&aN*-#kdV67biH3c3R z=j_p6Qy^^7tMkUPz97iCCbQSJ>=Xq{LS4teqETORDGou%lo*!1cv4*ge?($RP=wvy z7U_NEEXvXN&MY^-I2GoHM?(Y*iPtH3V61~}_j*|KW`N3=h*?l;@b&!xz>cVo&2_W2 zIMQulj!0H;s`QAozc~}Zklpo2a|zPjf{Hc^GukvMUFH5UPG-H-MswJ{s0c{bx;wwe zAsCsW&=9aX`vDAb32sSNxD>Exjk)erK@+yE#-^z>1T0!&+OOI%NfTsx6v|pn^lPTa zsY0$-q1G=67(Hc^HCv~%appZ961hYJ@&_dq<<&BsfBK}8F+PQtKj)#O#p3k}ow8O7 zhtjjZVZoC}Lf7+EWTz->yek<^0f!=J3R$e(8{kT?@9i&tYCJN>&1bj!dyJXuRaigE&GJ_}xDt}w z>Qiv43MDNje1^3V8a?WM+&|xzr)4@>?h| zKKK3nB;Ic{dG2%=O@SXTNG2~+rM5$o;SqdwZ-8SBc67I{adb=4xf`eg9-WiKePbLH zH=AUqC_Hi4j?RzgC6S+{(Gaj0KSbq^MG<~@)Sjy^-R9!1Tn%@0A&gH`_}<|VFJG{C zkU!t&;b^_dtPBm^l6W10FYNB<3>K>E=pTXZuP1B{A7q1&f2oOmZWf`-e7K~ zM#zvX?#14HA*9IHfb2m@MH!u{@P4Do)M0k6H8xFQY?>=>|Hk0JqUMI#ZrY=f@5m*C z=g&lVWVV}AjV9|0f+zx>U6jl>X1MuwL9oxUzB}8^`;8{wE(jukpD#@2n={>f^FWZo zT7&u78rzB^%*)a^-DomDTVqd|PJXsVVU5x2m}{rF`0=}8u7o82Hp9(lM`@gGvKXEu zNYVsLcloLETTCCJa;)BtC?1FH_~~vtojO!!bl&5VF%HHLQCPIqPtcJ3<0L2dkLkS( z|Hbi6CZ#Lf`6oXCL$Y$Blb_y^%%ZLB9B(jquhHb~FM4^q+Tdut!RzG)^#R-N4^DKF zm!)#YmUh}A5`i6!0iHS@;?aY)K3=Ebtp`%rQKD1SZ0kRDn9Abqero&{^RhIazB9Sg zfdNvTg1fi1V@Z2%R!(&ClVc%fj8IuU*~#MV?KFiX!;%DVEcLR#+MuG%)+^mDShTer zV{n_QjUY<_GOk0Euqiv8cOaZ<9N6}7pxR(}sm|_Fos*YsnfcioFGg3bCE<7HA}q+( z`Wz|9M#&KROm7FH`IMTv*$?1JBA(*;}RKa|u?A zcW~b;9ejO%fbAt+dFJUxlksV4jEu%FKaih+b%N2Y^^Zk* z+(YYvY>jQjdgnI0r6|HkuYK4xELibs2miW1KtsS{MqP)+j9a>F^QR*H`kdFkhXHs&99}8axjiGo-%oUQ+w$V^dU@{- zaV>wXF}mfzs(>U-&>nLzYLD1CXJ077jxezYs)(1fP-E~$g-&x=G9g{WkZEp#LxtSbuFkv5bc$QL zJhnHT28_hg5Y!m})pp|-O(tTp(LnJ(VDY|s&>3>VPB z7cFaLrU*u*Dpa&td~US8?T<}Un4O{V)bVhyIz4tMMB#ETd6^mq>kLX;EhY`^ib&&z zs5s+nY!_Q?J6vT{s)ENMC~vd#=4-1pWo;JYhS>d!noVYm(7Npu02#>&qr3`tAF^{^ zhXUE2fmJ>F<3h8=D6hgVPxZ9LjX(-&H6*n#cn1bJRA*8ju=;dh34H57u*b=CF#O_F zm`CThQ3W_v!M_h6{{?vVs+!NA`&M8KYu37EBB>P)@o7OYO!vbix?zZ!_De>2 z6}~dn#goy)*t4g?>{^mSQ%G{;l0lAFp|sWFSiON?hjr6joNO?8aH11!AY1AHc=>#U zFWu(k2l+|7R<7ex1$kK-&z}iX-u3|;B8noZQ+-RmH3r0j>lr||U|X@ym5^jXwxdTX zA%Vvah1gNje;rZ)ZdFiFYY@05+cP>HgT|QZh(m#DzeQ1V*MyyGG8vhoaOR3hLqM{x+F(Jp#)Nd0 zXHMA%#KUz4A=8$>*lJPhx64;=RN7UNsl!!XD>r!dq`lZ0gOUziGHIyB%n>S@B6#{l zm_22-?b{-fU8OpozC|T3Q$rDOpvIsjEZHCZ{wc#Xc9cYTx8CGJvq^nGqA7yQL5mAf z{YBKq1+@mIv;)e?Mzb>&P=&3_`DP2z@ntZ;%ti2@*JW6N^j z<(sTff&>Fbz_Q9UXLHy0tKT|Th?Sq?PbT+I?B z=$9sm_=l@6d3M&nD%PZx3Bd~B<9F&x@Nq%66#0eNmpi)^aP4=Etj_?KKXla+BATX2e00000NkvXXu0mjfaQngZ literal 0 HcmV?d00001 diff --git a/docs/platforms/darwin.md b/docs/platforms/darwin.md index fb86d47..5d4e7f7 100644 --- a/docs/platforms/darwin.md +++ b/docs/platforms/darwin.md @@ -42,8 +42,8 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd rdio@macos ~ % mkdir rdio-scanner rdio@macos ~ % cd rdio-scanner rdio@macos rdio-scanner % unzip \ - > ~/Downloads/rdio-scanner-darwin-arm64-v6.1.16.zip - Archive: /Users/rdio/Downloads/rdio-scanner-darwin-arm64-v6.1.16.zip + > ~/Downloads/rdio-scanner-darwin-arm64-v6.2.0.zip + Archive: /Users/rdio/Downloads/rdio-scanner-darwin-arm64-v6.2.0.zip inflating: rdio-scanner inflating: rdio-scanner.pdf @@ -51,11 +51,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd rdio@macos rdio-scanner % ./rdio-scanner - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 08:38:06 server started - 2022/03/17 08:38:06 main interface at http://macos.local:3000 - 2022/03/17 08:38:06 admin interface at http://macos.local:3000/admin + 2022/03/25 08:38:06 server started + 2022/03/25 08:38:06 main interface at http://macos.local:3000 + 2022/03/25 08:38:06 admin interface at http://macos.local:3000/admin 4. Access the administrative dashboard to finalize the configuration. @@ -77,11 +77,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance rdio@macos rdio-scanner % ./rdio-scanner --listen :80 - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 08:48:03 server started - 2022/03/17 08:48:03 main interface at http://macos.local - 2022/03/17 08:48:03 admin interface at http://macos.local/admin + 2022/03/25 08:48:03 server started + 2022/03/25 08:48:03 main interface at http://macos.local + 2022/03/25 08:48:03 admin interface at http://macos.local/admin ## Listening on a SSL port @@ -95,12 +95,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer > -ssl_key_file mykey.key \ > -ssl_listen :443 - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 08:50:58 server started - 2022/03/17 08:50:58 main interface at http://macos.local - 2022/03/17 08:50:58 main interface at https://macos.local - 2022/03/17 08:50:58 admin interface at https://macos.local/admin + 2022/03/25 08:50:58 server started + 2022/03/25 08:50:58 main interface at http://macos.local + 2022/03/25 08:50:58 main interface at https://macos.local + 2022/03/25 08:50:58 admin interface at https://macos.local/admin If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal. @@ -118,7 +118,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y > -ssl_auto_cert mydomain.com \ > -ssl_listen :443 \ > -config_save - 2022/03/17 08:52:24 rdio-scanner.ini file created + 2022/03/25 08:52:24 rdio-scanner.ini file created All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list. @@ -132,12 +132,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an rdio@macos rdio-scanner % ./rdio-scanner - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 08:54:08 server started - 2022/03/17 08:54:08 main interface at http://macos.local - 2022/03/17 08:54:08 main interface at https://macos.local - 2022/03/17 08:54:08 admin interface at https://macos.local/admin + 2022/03/25 08:54:08 server started + 2022/03/25 08:54:08 main interface at http://macos.local + 2022/03/25 08:54:08 main interface at https://macos.local + 2022/03/25 08:54:08 admin interface at https://macos.local/admin ## Install Rdio Scanner as a service @@ -206,9 +206,11 @@ You can ask your questions or post your comments on the [Rdio Scanner Discussion # Show your appreciation, support the author -If you like [Rdio Scanner](https://github.com/chuot/rdio-scanner), **[consider starring the GitHub repository](https://github.com/chuot/rdio-scanner)** to show you appreciation to the author for his hard work. It cost nothing but is really appreciated. +If you like [Rdio Scanner](https://github.com/chuot/rdio-scanner), **[consider starring the GitHub repository](https://github.com/chuot/rdio-scanner/stargazers)** to show you appreciation to the author for his hard work. It cost nothing but is really appreciated. -If you use [Rdio Scanner](https://github.com/chuot/rdio-scanner) for commercial purposes or derive income from it, **[consider sponsoring the project](https://github.com/sponsors/chuot)** to help support continued development. +If you use [Rdio Scanner](https://github.com/chuot/rdio-scanner) for commercial purposes or derive income from it, **[sponsor the project](https://github.com/sponsors/chuot)** to help support continued development. + +[![Follow us on Twitter](../images/twitter-badge.png?raw=true)](https://twitter.com/RdioScanner) # Commercial support diff --git a/docs/platforms/freebsd.md b/docs/platforms/freebsd.md index c87b9af..94f74cb 100644 --- a/docs/platforms/freebsd.md +++ b/docs/platforms/freebsd.md @@ -42,8 +42,8 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd rdio@pc-freebsd:~ $ mkdir rdio-scanner rdio@pc-freebsd:~ $ cd rdio-scanner rdio@pc-freebsd:~/rdio-scanner $ unzip \ - > ~/rdio-scanner-freebsd-amd64-v6.1.16.zip - Archive: ../rdio-scanner-freebsd-amd64-v6.1.16.zip + > ~/rdio-scanner-freebsd-amd64-v6.2.0.zip + Archive: ../rdio-scanner-freebsd-amd64-v6.2.0.zip extracting: rdio-scanner extracting: rdio-scanner.pdf @@ -51,11 +51,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd rdio@pc-freebsd:~/rdio-scanner $ ./rdio-scanner - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 08:16:36 server started - 2022/03/17 08:16:36 main interface at http://pc-freebsd:3000 - 2022/03/17 08:16:36 admin interface at http://pc-freebsd:3000/admin + 2022/03/25 08:16:36 server started + 2022/03/25 08:16:36 main interface at http://pc-freebsd:3000 + 2022/03/25 08:16:36 admin interface at http://pc-freebsd:3000/admin 4. Access the administrative dashboard to finalize the configuration. @@ -81,11 +81,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance Password: root@pc-freebsd:/home/rdio/rdio-scanner # ./rdio-scanner -listen :80 - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 08:19:38 server started - 2022/03/17 08:19:38 main interface at http://pc-freebsd - 2022/03/17 08:19:38 admin interface at http://pc-freebsd/admin + 2022/03/25 08:19:38 server started + 2022/03/25 08:19:38 main interface at http://pc-freebsd + 2022/03/25 08:19:38 admin interface at http://pc-freebsd/admin ## Listening on a SSL port @@ -101,12 +101,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer > -ssl_key_file mykey.key \ > -ssl_listen :443 - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 10:34:29 server started - 2022/03/17 10:34:29 main interface at http://pc-freebsd - 2022/03/17 10:34:29 main interface at https://pc-freebsd - 2022/03/17 10:34:29 admin interface at https://pc-freebsd/admin + 2022/03/25 10:34:29 server started + 2022/03/25 10:34:29 main interface at http://pc-freebsd + 2022/03/25 10:34:29 main interface at https://pc-freebsd + 2022/03/25 10:34:29 admin interface at https://pc-freebsd/admin If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal. @@ -126,7 +126,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y > -ssl_auto_cert mydomain.com \ > -ssl_listen :443 \ > -config_save - 2022/03/17 10:37:00 rdio-scanner.ini file created + 2022/03/25 10:37:00 rdio-scanner.ini file created All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list. @@ -142,12 +142,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an Password: root@pc-freebsd:/home/rdio/rdio-scanner # ./rdio-scanner - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 10:38:28 server started - 2022/03/17 10:38:29 main interface at http://pc-freebsd - 2022/03/17 10:38:29 main interface at https://pc-freebsd - 2022/03/17 10:38:29 admin interface at https://pc-freebsd/admin + 2022/03/25 10:38:28 server started + 2022/03/25 10:38:29 main interface at http://pc-freebsd + 2022/03/25 10:38:29 main interface at https://pc-freebsd + 2022/03/25 10:38:29 admin interface at https://pc-freebsd/admin ## Install Rdio Scanner as a service @@ -219,9 +219,11 @@ You can ask your questions or post your comments on the [Rdio Scanner Discussion # Show your appreciation, support the author -If you like [Rdio Scanner](https://github.com/chuot/rdio-scanner), **[consider starring the GitHub repository](https://github.com/chuot/rdio-scanner)** to show you appreciation to the author for his hard work. It cost nothing but is really appreciated. +If you like [Rdio Scanner](https://github.com/chuot/rdio-scanner), **[consider starring the GitHub repository](https://github.com/chuot/rdio-scanner/stargazers)** to show you appreciation to the author for his hard work. It cost nothing but is really appreciated. -If you use [Rdio Scanner](https://github.com/chuot/rdio-scanner) for commercial purposes or derive income from it, **[consider sponsoring the project](https://github.com/sponsors/chuot)** to help support continued development. +If you use [Rdio Scanner](https://github.com/chuot/rdio-scanner) for commercial purposes or derive income from it, **[sponsor the project](https://github.com/sponsors/chuot)** to help support continued development. + +[![Follow us on Twitter](../images/twitter-badge.png?raw=true)](https://twitter.com/RdioScanner) # Commercial support diff --git a/docs/platforms/linux.md b/docs/platforms/linux.md index f99ce87..49ffb85 100644 --- a/docs/platforms/linux.md +++ b/docs/platforms/linux.md @@ -42,8 +42,8 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd [rdio@pc-linux ~]$ mkdir rdio-scanner [rdio@pc-linux ~]$ cd rdio-scanner [rdio@pc-linux rdio-scanner]$ unzip \ - > ~/Downloads/rdio-scanner-linux-amd64-v6.1.16.zip - Archive: /home/rdio/Downloads/rdio-scanner-linux-amd64-v6.1.16.zip + > ~/Downloads/rdio-scanner-linux-amd64-v6.2.0.zip + Archive: /home/rdio/Downloads/rdio-scanner-linux-amd64-v6.2.0.zip inflating: rdio-scanner inflating: rdio-scanner.pdf @@ -51,11 +51,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd [rdio@pc-linux rdio-scanner]$ ./rdio-scanner - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 09:11:48 server started - 2022/03/17 09:11:48 main interface at http://pc-linux:3000 - 2022/03/17 09:11:48 admin interface at http://pc-linux:3000/admin + 2022/03/25 09:11:48 server started + 2022/03/25 09:11:48 main interface at http://pc-linux:3000 + 2022/03/25 09:11:48 admin interface at http://pc-linux:3000/admin 4. Access the administrative dashboard to finalize the configuration. @@ -78,11 +78,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance [rdio@pc-linux rdio-scanner]$ sudo ./rdio-scanner -listen :80 [sudo] password for rdio: - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 09:14:00 server started - 2022/03/17 09:14:00 main interface at http://pc-linux - 2022/03/17 09:14:00 admin interface at http://pc-linux/admin + 2022/03/25 09:14:00 server started + 2022/03/25 09:14:00 main interface at http://pc-linux + 2022/03/25 09:14:00 admin interface at http://pc-linux/admin ## Listening on a SSL port @@ -97,12 +97,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer > -ssl_listen :443 [sudo] password for rdio: - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 09:16:47 server started - 2022/03/17 09:16:47 main interface at http://pc-linux - 2022/03/17 09:16:47 main interface at https://pc-linux - 2022/03/17 09:16:47 admin interface at https://pc-linux/admin + 2022/03/25 09:16:47 server started + 2022/03/25 09:16:47 main interface at http://pc-linux + 2022/03/25 09:16:47 main interface at https://pc-linux + 2022/03/25 09:16:47 admin interface at https://pc-linux/admin If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal. @@ -120,7 +120,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y > -ssl_auto_cert mydomain.com \ > -ssl_listen :443 \ > -config_save - 2022/03/17 09:19:29 rdio-scanner.ini file created + 2022/03/25 09:19:29 rdio-scanner.ini file created All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list. @@ -135,12 +135,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an [rdio@pc-linux rdio-scanner]$ sudo ./rdio-scanner [sudo] Mot de passe de rdio : - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 09:20:40 server started - 2022/03/17 09:20:40 main interface at http://pc-linux - 2022/03/17 09:20:40 main interface at https://pc-linux - 2022/03/17 09:20:40 admin interface at https://pc-linux/admin + 2022/03/25 09:20:40 server started + 2022/03/25 09:20:40 main interface at http://pc-linux + 2022/03/25 09:20:40 main interface at https://pc-linux + 2022/03/25 09:20:40 admin interface at https://pc-linux/admin ## Install Rdio Scanner as a service @@ -209,9 +209,11 @@ You can ask your questions or post your comments on the [Rdio Scanner Discussion # Show your appreciation, support the author -If you like [Rdio Scanner](https://github.com/chuot/rdio-scanner), **[consider starring the GitHub repository](https://github.com/chuot/rdio-scanner)** to show you appreciation to the author for his hard work. It cost nothing but is really appreciated. +If you like [Rdio Scanner](https://github.com/chuot/rdio-scanner), **[consider starring the GitHub repository](https://github.com/chuot/rdio-scanner/stargazers)** to show you appreciation to the author for his hard work. It cost nothing but is really appreciated. -If you use [Rdio Scanner](https://github.com/chuot/rdio-scanner) for commercial purposes or derive income from it, **[consider sponsoring the project](https://github.com/sponsors/chuot)** to help support continued development. +If you use [Rdio Scanner](https://github.com/chuot/rdio-scanner) for commercial purposes or derive income from it, **[sponsor the project](https://github.com/sponsors/chuot)** to help support continued development. + +[![Follow us on Twitter](../images/twitter-badge.png?raw=true)](https://twitter.com/RdioScanner) # Commercial support diff --git a/docs/platforms/windows.md b/docs/platforms/windows.md index 2ef3ab5..64ba2b4 100644 --- a/docs/platforms/windows.md +++ b/docs/platforms/windows.md @@ -44,7 +44,7 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd C:\Users\rdio> cd rdio-scanner C:\Users\rdio\rdio-scanner> tar -xvf ^ - ..\downloads\rdio-scanner-windows-amd64-v6.1.16.zip + ..\downloads\rdio-scanner-windows-amd64-v6.2.0.zip x rdio-scanner.exe x rdio-scanner.pdf @@ -52,11 +52,11 @@ ALWAYS DOWNLOAD THE LATEST VERSION OF [RDIO SCANNER](https://github.com/chuot/rd C:\Users\rdio\rdio-scanner>rdio-scanner - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 13:48:48 server started - 2022/03/17 13:48:48 main interface at http://pc-windows:3000 - 2022/03/17 13:48:48 admin interface at http://pc-windows:3000/admin + 2022/03/25 13:48:48 server started + 2022/03/25 13:48:48 main interface at http://pc-windows:3000 + 2022/03/25 13:48:48 admin interface at http://pc-windows:3000/admin 4. Access the administrative dashboard to finalize the configuration. @@ -78,11 +78,11 @@ Here we want our [Rdio Scanner](https://guthub.com/chuot/rdio-scanner) instance C:\Users\rdio\rdio-scanner>rdio-scanner -listen :80 - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 10:53:31 server started - 2022/03/17 10:53:31 main interface at http://pc-windows - 2022/03/17 10:53:31 admin interface at http://pc-windows/admin + 2022/03/25 10:53:31 server started + 2022/03/25 10:53:31 main interface at http://pc-windows + 2022/03/25 10:53:31 admin interface at http://pc-windows/admin ## Listening on a SSL port @@ -96,12 +96,12 @@ You can use your own SSL certificates that match your domain name with `-ssl_cer -ssl_key_file meykey.key ^ -ssl_listen :443 - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 11:05:43 server started - 2022/03/17 11:05:43 main interface at http://pc-windows - 2022/03/17 11:05:43 main interface at https://pc-windows - 2022/03/17 11:05:43 admin interface at https://pc-windows/admin + 2022/03/25 11:05:43 server started + 2022/03/25 11:05:43 main interface at http://pc-windows + 2022/03/25 11:05:43 main interface at https://pc-windows + 2022/03/25 11:05:43 admin interface at https://pc-windows/admin If you don't want to worry about SSL certificates, you can use the built-in Let's Encrypt auto-cert feature. This requires that you have both port 80 (HTTP) and port 443 (HTTPS) open to the world. Also, your domain name should point to your IP address where [Rdio Scanner](https://github.com/chuot/rdio-scanner/) is running. The advantage of this approach is that everything is done automatically, no certificate request, no certificate renewal. @@ -119,7 +119,7 @@ You don't want to have to type everytime a long list of arguments. No problem, y -ssl_auto_cert mydomain.com ^ -ssl_listen :443 ^ -config_save - 2022/03/17 11:08:28 rdio-scanner.ini file created + 2022/03/25 11:08:28 rdio-scanner.ini file created All of your parameters passed as arguments to [Rdio Scanner](https://github.com/chuot/rdio-scanner) have been saved to an INI file which has the same arguments/values list. @@ -133,12 +133,12 @@ Then simply run [Rdio Scanner](https://github.com/chuot/rdio-scanner) without an C:\Users\rdio\rdio-scanner>rdio-scanner - Rdio Scanner v6.1.16 + Rdio Scanner v6.2.0 ---------------------------------- - 2022/03/17 11:11:28 server started - 2022/03/17 11:11:28 main interface at http://pc-windows - 2022/03/17 11:11:28 main interface at https://pc-windows - 2022/03/17 11:11:28 admin interface at https://pc-windows/admin + 2022/03/25 11:11:28 server started + 2022/03/25 11:11:28 main interface at http://pc-windows + 2022/03/25 11:11:28 main interface at https://pc-windows + 2022/03/25 11:11:28 admin interface at https://pc-windows/admin \pagebreak{} @@ -207,9 +207,11 @@ You can ask your questions or post your comments on the [Rdio Scanner Discussion # Show your appreciation, support the author -If you like [Rdio Scanner](https://github.com/chuot/rdio-scanner), **[consider starring the GitHub repository](https://github.com/chuot/rdio-scanner)** to show you appreciation to the author for his hard work. It cost nothing but is really appreciated. +If you like [Rdio Scanner](https://github.com/chuot/rdio-scanner), **[consider starring the GitHub repository](https://github.com/chuot/rdio-scanner/stargazers)** to show you appreciation to the author for his hard work. It cost nothing but is really appreciated. -If you use [Rdio Scanner](https://github.com/chuot/rdio-scanner) for commercial purposes or derive income from it, **[consider sponsoring the project](https://github.com/sponsors/chuot)** to help support continued development. +If you use [Rdio Scanner](https://github.com/chuot/rdio-scanner) for commercial purposes or derive income from it, **[sponsor the project](https://github.com/sponsors/chuot)** to help support continued development. + +[![Follow us on Twitter](../images/twitter-badge.png?raw=true)](https://twitter.com/RdioScanner) # Commercial support diff --git a/server/client.go b/server/client.go index c1ea9e2..c8bb4a9 100644 --- a/server/client.go +++ b/server/client.go @@ -49,6 +49,11 @@ func (client *Client) Init(controller *Controller, conn *websocket.Conn) error { return errors.New("client.init: no websocket connection") } + if controller.Clients.Count() >= int(controller.Options.MaxClients) { + conn.Close() + return nil + } + client.Access = &Access{} client.Controller = controller client.Conn = conn @@ -98,6 +103,9 @@ func (client *Client) Init(controller *Controller, conn *websocket.Conn) error { defer func() { ticker.Stop() timer.Stop() + + client.Conn.WriteMessage(websocket.CloseMessage, []byte{}) + client.Conn.Close() }() for { @@ -148,16 +156,24 @@ func (client *Client) SendConfig(groups *Groups, options *Options, systems *Syst client.Send <- &Message{ Command: MessageCommandConfig, Payload: map[string]interface{}{ - "dimmerDelay": options.DimmerDelay, - "groups": client.GroupsMap, - "keypadBeeps": GetKeypadBeeps(options), - "systems": client.SystemsMap, - "tags": client.TagsMap, - "tagsToggle": options.TagsToggle, + "dimmerDelay": options.DimmerDelay, + "groups": client.GroupsMap, + "keypadBeeps": GetKeypadBeeps(options), + "showListenersCount": options.ShowListenersCount, + "systems": client.SystemsMap, + "tags": client.TagsMap, + "tagsToggle": options.TagsToggle, }, } } +func (client *Client) SendListenersCount(count int) { + client.Send <- &Message{ + Command: MessagecommandListenersCount, + Payload: count, + } +} + type Clients struct { Map map[*Client]bool mutex sync.Mutex @@ -220,6 +236,19 @@ func (clients *Clients) EmitConfig(groups *Groups, options *Options, systems *Sy } else { c.SendConfig(groups, options, systems, tags) } + + if options.ShowListenersCount { + c.SendListenersCount(len(clients.Map)) + } + } +} + +func (clients *Clients) EmitListenersCount() { + clients.mutex.Lock() + defer clients.mutex.Unlock() + + for c := range clients.Map { + c.SendListenersCount(len(clients.Map)) } } @@ -230,7 +259,4 @@ func (clients *Clients) Remove(client *Client) { delete(clients.Map, client) close(client.Send) - - client.Conn.WriteMessage(websocket.CloseMessage, []byte{}) - client.Conn.Close() } diff --git a/server/controller.go b/server/controller.go index 659cf41..65d0b42 100644 --- a/server/controller.go +++ b/server/controller.go @@ -312,12 +312,12 @@ func (controller *Controller) IngestCall(call *Call) { } switch v := call.units.(type) { - case Units: + case *Units: populated = true if system.Units == nil { system.Units = NewUnits() } - system.Units.Merge(&v) + system.Units.Merge(v) } } @@ -619,22 +619,28 @@ func (controller *Controller) Start() error { go func() { var timer *time.Timer - logClientsCount := func() { + doClientsCount := func() { if timer != nil { timer.Stop() } - timer = time.AfterFunc(time.Second, controller.LogClientsCount) + timer = time.AfterFunc(time.Second, func() { + controller.LogClientsCount() + + if controller.Options.ShowListenersCount { + controller.Clients.EmitListenersCount() + } + }) } for { select { case client := <-controller.Register: controller.Clients.Add(client) - logClientsCount() + doClientsCount() case client := <-controller.Unregister: controller.Clients.Remove(client) - logClientsCount() + doClientsCount() } } }() diff --git a/server/defaults.go b/server/defaults.go index 1e1d39c..0e472af 100644 --- a/server/defaults.go +++ b/server/defaults.go @@ -56,8 +56,10 @@ type DefaultOptions struct { disableDuplicateDetection bool duplicateDetectionTimeFrame uint keypadBeeps string + maxClients uint pruneDays uint searchPatchedTalkgroups bool + showListenersCount bool sortTalkgroups bool tagsToggle bool } @@ -96,8 +98,10 @@ var defaults Defaults = Defaults{ disableDuplicateDetection: false, duplicateDetectionTimeFrame: 500, keypadBeeps: "uniden", + maxClients: 200, pruneDays: 7, searchPatchedTalkgroups: false, + showListenersCount: false, sortTalkgroups: false, tagsToggle: false, }, diff --git a/server/go.mod b/server/go.mod index 17686b6..68f1a92 100644 --- a/server/go.mod +++ b/server/go.mod @@ -10,9 +10,9 @@ require ( github.com/google/uuid v1.3.0 github.com/gorilla/websocket v1.5.0 github.com/kardianos/service v1.2.1 - golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd + golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 gopkg.in/ini.v1 v1.66.4 - modernc.org/sqlite v1.15.2 + modernc.org/sqlite v1.15.3 ) require ( @@ -22,16 +22,16 @@ require ( github.com/stretchr/testify v1.7.0 // indirect golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect - golang.org/x/sys v0.0.0-20220317061510-51cd9980dadf // indirect + golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/tools v0.1.10 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect lukechampine.com/uint128 v1.2.0 // indirect modernc.org/cc/v3 v3.35.24 // indirect modernc.org/ccgo/v3 v3.15.17 // indirect - modernc.org/libc v1.14.11 // indirect + modernc.org/libc v1.14.12 // indirect modernc.org/mathutil v1.4.1 // indirect - modernc.org/memory v1.0.6 // indirect + modernc.org/memory v1.0.7 // indirect modernc.org/opt v0.1.1 // indirect modernc.org/strutil v1.1.1 // indirect modernc.org/token v1.0.0 // indirect diff --git a/server/go.sum b/server/go.sum index 798f3e8..2520b58 100644 --- a/server/go.sum +++ b/server/go.sum @@ -38,8 +38,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd h1:XcWmESyNjXJMLahc3mqVQJcgSTDxFxhETVlfk9uGc38= -golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 h1:S25/rfnfsMVgORT4/J61MJ7rdyseOZOyvLIrZEZ7s6s= +golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 h1:kQgndtyPBW/JIYERgdxfwMYh3AVStj88WQTlNDi2a+o= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= @@ -68,8 +68,8 @@ golang.org/x/sys v0.0.0-20210902050250-f475640dd07b/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220317061510-51cd9980dadf h1:Fm4IcnUL803i92qDlmB0obyHmosDrxZWxJL3gIeNqOw= -golang.org/x/sys v0.0.0-20220317061510-51cd9980dadf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8 h1:OH54vjqzRWmbJ62fjuhxy7AxFFgoHN0/DPc/UrL8cAs= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -209,8 +209,9 @@ modernc.org/libc v1.14.6/go.mod h1:2PJHINagVxO4QW/5OQdRrvMYo+bm5ClpUFfyXCYl9ak= modernc.org/libc v1.14.7/go.mod h1:f8xfWXW8LW41qb4X5+huVQo5dcfPlq7Cbny2TDheMv0= modernc.org/libc v1.14.8/go.mod h1:9+JCLb1MWSY23smyOpIPbd5ED+rSS/ieiDWUpdyO3mo= modernc.org/libc v1.14.10/go.mod h1:y1MtIWhwpJFpLYm6grAThtuXJKEsY6xkdZmXbRngIdo= -modernc.org/libc v1.14.11 h1:ivxNmUkfp5iSGAGMIjylvx5R53s6QTJW9qUru1yrnk4= modernc.org/libc v1.14.11/go.mod h1:l5/Mz/GrZwOqzwRHA3abgSCnSeJzzTl+Ify0bAwKbAw= +modernc.org/libc v1.14.12 h1:pUBZTYoISfbb4pCf4PECENpbvwDBxeKc+/dS9LyOWFM= +modernc.org/libc v1.14.12/go.mod h1:fJdoe23MHu2ruPQkFPPqCpToDi5cckzsbmkI6Ez0LqQ= modernc.org/mathutil v1.1.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.4.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= @@ -218,12 +219,13 @@ modernc.org/mathutil v1.4.1 h1:ij3fYGe8zBF4Vu+g0oT7mB06r8sqGWKuJu1yXeR4by8= modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/memory v1.0.4/go.mod h1:nV2OApxradM3/OVbs2/0OsP6nPfakXpi50C7dcoHXlc= modernc.org/memory v1.0.5/go.mod h1:B7OYswTRnfGg+4tDH1t1OeUNnsy2viGTdME4tzd+IjM= -modernc.org/memory v1.0.6 h1:5IaT/LChMrMdxLCy/a4qmb+7SzGiU8/ozPgkEOrfvFw= modernc.org/memory v1.0.6/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.0.7 h1:UE3cxTRFa5tfUibAV7Jqq8P7zRY0OlJg+yWVIIaluEE= +modernc.org/memory v1.0.7/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= modernc.org/opt v0.1.1 h1:/0RX92k9vwVeDXj+Xn23DKp2VJubL7k8qNffND6qn3A= modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.15.2 h1:Es0SrEJUQHH7rt6uC/Zh2gHQ0AUhgB+F2RQqpXf3MNs= -modernc.org/sqlite v1.15.2/go.mod h1:2P9bWfawhYMpYsBELqKREE+LFZo4uPApOuqszlZ7QX8= +modernc.org/sqlite v1.15.3 h1:3C4AWicF7S5vUUFJuBi7Ws8eWlPjqyo/c4Z1UGYBbyg= +modernc.org/sqlite v1.15.3/go.mod h1:J7GAPbk8Txp0DJnT8TGwpUqJW0Z1cK2YpzjoXaZRU8k= modernc.org/strutil v1.1.1 h1:xv+J1BXY3Opl2ALrBwyfEikFAj8pmqcpnfmuwUwcozs= modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= modernc.org/tcl v1.11.2 h1:mXpsx3AZqJt83uDiFu9UYQVBjNjaWKGCF1YDSlpCL6Y= diff --git a/server/message.go b/server/message.go index 0aca82e..e97bb33 100644 --- a/server/message.go +++ b/server/message.go @@ -20,17 +20,18 @@ import ( ) const ( - MessageCommandCall = "CAL" - MessageCommandConfig = "CFG" - MessageCommandExpired = "XPR" - MessageCommandIOS = "IOS" - MessageCommandListCall = "LCL" - MessageCommandLivefeedMap = "LFM" - MessageCommandMax = "MAX" - MessageCommandPin = "PIN" - MessageCommandPushId = "PID" - MessageCommandServer = "SRV" - MessageCommandVersion = "VER" + MessageCommandCall = "CAL" + MessageCommandConfig = "CFG" + MessageCommandExpired = "XPR" + MessageCommandIOS = "IOS" + MessageCommandListCall = "LCL" + MessagecommandListenersCount = "LSC" + MessageCommandLivefeedMap = "LFM" + MessageCommandMax = "MAX" + MessageCommandPin = "PIN" + MessageCommandPushId = "PID" + MessageCommandServer = "SRV" + MessageCommandVersion = "VER" ) type Message struct { diff --git a/server/options.go b/server/options.go index a604dae..5db39a8 100644 --- a/server/options.go +++ b/server/options.go @@ -31,8 +31,10 @@ type Options struct { DisableDuplicateDetection bool `json:"disableDuplicateDetection"` DuplicateDetectionTimeFrame uint `json:"duplicateDetectionTimeFrame"` KeypadBeeps string `json:"keypadBeeps"` + MaxClients uint `json:"maxClients"` PruneDays uint `json:"pruneDays"` SearchPatchedTalkgroups bool `json:"searchPatchedTalkgroups"` + ShowListenersCount bool `json:"showListenersCount"` SortTalkgroups bool `json:"sortTalkgroups"` TagsToggle bool `json:"tagsToggle"` adminPassword string @@ -93,6 +95,13 @@ func (options *Options) FromMap(m map[string]interface{}) { options.KeypadBeeps = defaults.options.keypadBeeps } + switch v := m["maxClients"].(type) { + case float64: + options.MaxClients = uint(v) + default: + options.MaxClients = defaults.options.maxClients + } + switch v := m["pruneDays"].(type) { case float64: options.PruneDays = uint(v) @@ -107,6 +116,13 @@ func (options *Options) FromMap(m map[string]interface{}) { options.SearchPatchedTalkgroups = defaults.options.searchPatchedTalkgroups } + switch v := m["showListenersCount"].(type) { + case bool: + options.ShowListenersCount = v + default: + options.ShowListenersCount = defaults.options.showListenersCount + } + switch v := m["sortTalkgroups"].(type) { case bool: options.SortTalkgroups = v @@ -142,8 +158,10 @@ func (options *Options) Read(db *Database) error { options.DisableDuplicateDetection = defaults.options.disableDuplicateDetection options.DuplicateDetectionTimeFrame = defaults.options.duplicateDetectionTimeFrame options.KeypadBeeps = defaults.options.keypadBeeps + options.MaxClients = defaults.options.maxClients options.PruneDays = defaults.options.pruneDays options.SearchPatchedTalkgroups = defaults.options.searchPatchedTalkgroups + options.ShowListenersCount = defaults.options.showListenersCount options.SortTalkgroups = defaults.options.sortTalkgroups options.TagsToggle = defaults.options.tagsToggle @@ -216,6 +234,11 @@ func (options *Options) Read(db *Database) error { options.KeypadBeeps = v } + switch v := v["maxClients"].(type) { + case float64: + options.MaxClients = uint(v) + } + switch v := v["pruneDays"].(type) { case float64: options.PruneDays = uint(v) @@ -226,6 +249,11 @@ func (options *Options) Read(db *Database) error { options.SearchPatchedTalkgroups = v } + switch v := v["showListenersCount"].(type) { + case bool: + options.ShowListenersCount = v + } + switch v := v["sortTalkgroups"].(type) { case bool: options.SortTalkgroups = v @@ -300,8 +328,10 @@ func (options *Options) Write(db *Database) error { "disableDuplicateDetection": options.DisableDuplicateDetection, "duplicateDetectionTimeFrame": options.DuplicateDetectionTimeFrame, "keypadBeeps": options.KeypadBeeps, + "maxClients": options.MaxClients, "pruneDays": options.PruneDays, "searchPatchedTalkgroups": options.SearchPatchedTalkgroups, + "showListenersCount": options.ShowListenersCount, "sortTalkgroups": options.SortTalkgroups, "tagsToggle": options.TagsToggle, }); err != nil { diff --git a/server/parsers.go b/server/parsers.go index c6361ea..c931470 100644 --- a/server/parsers.go +++ b/server/parsers.go @@ -41,13 +41,23 @@ func ParseSdrTrunkMeta(call *Call, controller *Controller) error { return err } - s = regexp.MustCompile(`^([0-9]+)$`).FindStringSubmatch(m.Artist()) - if len(s) == 2 { + s = regexp.MustCompile(`^([0-9]+) ?(.+)$`).FindStringSubmatch(m.Artist()) + if len(s) >= 2 { if i, err = strconv.Atoi(s[1]); err != nil { return err } if i > 0 { call.Source = uint(i) + + if len(s) == 3 { + if call.units == nil { + call.units = NewUnits() + } + switch units := call.units.(type) { + case *Units: + units.Add(uint(i), s[2]) + } + } } } diff --git a/server/version.go b/server/version.go index e647fef..35071b1 100644 --- a/server/version.go +++ b/server/version.go @@ -15,4 +15,4 @@ package main -const Version = "6.1.16" +const Version = "6.2.0"